Merge branch 'da/t7800-cleanup'
authorJunio C Hamano <gitster@pobox.com>
Fri, 10 Feb 2017 20:52:26 +0000 (12:52 -0800)
committerJunio C Hamano <gitster@pobox.com>
Fri, 10 Feb 2017 20:52:26 +0000 (12:52 -0800)
Test updates.

* da/t7800-cleanup:
t7800: replace "wc -l" with test_line_count

357 files changed:
.gitignore
.mailmap
.travis.yml
Documentation/CodingGuidelines
Documentation/Makefile
Documentation/RelNotes/2.10.3.txt [new file with mode: 0644]
Documentation/RelNotes/2.11.0.txt
Documentation/RelNotes/2.11.1.txt [new file with mode: 0644]
Documentation/RelNotes/2.12.0.txt [new file with mode: 0644]
Documentation/SubmittingPatches
Documentation/asciidoctor-extensions.rb [new file with mode: 0644]
Documentation/cat-texi.perl
Documentation/config.txt
Documentation/date-formats.txt
Documentation/diff-config.txt
Documentation/diff-heuristic-options.txt
Documentation/diff-options.txt
Documentation/git-bisect.txt
Documentation/git-branch.txt
Documentation/git-commit.txt
Documentation/git-difftool.txt
Documentation/git-fetch-pack.txt
Documentation/git-fetch.txt
Documentation/git-for-each-ref.txt
Documentation/git-gc.txt
Documentation/git-grep.txt
Documentation/git-gui.txt
Documentation/git-merge.txt
Documentation/git-p4.txt
Documentation/git-pull.txt
Documentation/git-push.txt
Documentation/git-rebase.txt
Documentation/git-relink.txt [deleted file]
Documentation/git-reset.txt
Documentation/git-rev-parse.txt
Documentation/git-shortlog.txt
Documentation/git-submodule.txt
Documentation/git-svn.txt
Documentation/git-tag.txt
Documentation/git-verify-tag.txt
Documentation/git.txt
Documentation/gitattributes.txt
Documentation/gitcore-tutorial.txt
Documentation/giteveryday.txt
Documentation/gitk.txt
Documentation/gitnamespaces.txt
Documentation/pretty-formats.txt
Documentation/technical/api-hashmap.txt
Documentation/technical/api-in-core-index.txt [deleted file]
Documentation/technical/api-setup.txt
Documentation/technical/api-submodule-config.txt
Documentation/texi.xsl [new file with mode: 0644]
Documentation/transfer-data-leaks.txt [new file with mode: 0644]
Documentation/user-manual.txt
GIT-VERSION-GEN
Makefile
README.md
RelNotes
abspath.c
apply.c
archive-zip.c
bisect.c
branch.c
builtin/add.c
builtin/am.c
builtin/blame.c
builtin/branch.c
builtin/checkout-index.c
builtin/checkout.c
builtin/clean.c
builtin/clone.c
builtin/commit.c
builtin/fetch.c
builtin/for-each-ref.c
builtin/fsck.c
builtin/gc.c
builtin/grep.c
builtin/index-pack.c
builtin/init-db.c
builtin/ls-tree.c
builtin/merge-index.c
builtin/merge.c
builtin/mv.c
builtin/pack-objects.c
builtin/pull.c
builtin/push.c
builtin/read-tree.c
builtin/receive-pack.c
builtin/remote.c
builtin/repack.c
builtin/reset.c
builtin/rev-list.c
builtin/rev-parse.c
builtin/rm.c
builtin/shortlog.c
builtin/show-ref.c
builtin/submodule--helper.c
builtin/tag.c
builtin/update-index.c
builtin/verify-tag.c
builtin/worktree.c
bulk-checkin.c
cache.h
color.c
command-list.txt
commit.c
commit.h
common-main.c
compat/mingw.h
compat/qsort_s.c [new file with mode: 0644]
compat/winansi.c
config.c
config.mak.uname
contrib/coccinelle/xstrdup_or_null.cocci
contrib/completion/git-completion.bash
contrib/convert-objects/convert-objects.c [deleted file]
contrib/convert-objects/git-convert-objects.txt [deleted file]
contrib/examples/git-difftool.perl
contrib/gitview/gitview [deleted file]
contrib/gitview/gitview.txt [deleted file]
contrib/long-running-filter/example.pl
contrib/update-unicode/.gitignore [new file with mode: 0644]
contrib/update-unicode/README [new file with mode: 0644]
contrib/update-unicode/update_unicode.sh [new file with mode: 0755]
convert.c
diff.c
dir.c
dir.h
environment.c
exec_cmd.c
exec_cmd.h
fast-import.c
fsck.c
git-add--interactive.perl
git-compat-util.h
git-mergetool--lib.sh
git-mergetool.sh
git-p4.py
git-rebase--interactive.sh
git-rebase.sh
git-relink.perl [deleted file]
git-request-pull.sh
git-send-email.perl
git-sh-setup.sh
git-stash.sh
git-submodule.sh
git.c
gitk-git/Makefile
gitk-git/gitk
gitk-git/po/bg.po
gitk-git/po/ca.po
gitk-git/po/de.po
gitk-git/po/es.po
gitk-git/po/fr.po
gitk-git/po/hu.po
gitk-git/po/it.po
gitk-git/po/ja.po
gitk-git/po/pt_br.po
gitk-git/po/pt_pt.po [new file with mode: 0644]
gitk-git/po/ru.po
gitk-git/po/sv.po
gitk-git/po/vi.po
gpg-interface.h
graph.c
grep.c
grep.h
help.c
http-walker.c
http.c
http.h
lockfile.c
lockfile.h
mailinfo.c
merge-recursive.c
merge.c
mergetools/araxis
mergetools/bc
mergetools/codecompare
mergetools/deltawalker
mergetools/diffmerge
mergetools/diffuse
mergetools/ecmerge
mergetools/emerge
mergetools/examdiff
mergetools/kdiff3
mergetools/kompare
mergetools/meld
mergetools/opendiff
mergetools/p4merge
mergetools/tkdiff
mergetools/tortoisemerge
mergetools/vimdiff
mergetools/winmerge
mergetools/xxdiff
parse-options.c
path.c
pathspec.c
pathspec.h
perl/Git.pm
perl/Git/I18N.pm
perl/Git/SVN/Ra.pm
po/ca.po
po/de.po
po/fr.po
po/git.pot
po/ko.po
po/pt_PT.po
po/ru.po
po/sv.po
po/vi.po
po/zh_CN.po
pretty.c
read-cache.c
ref-filter.c
ref-filter.h
refs.c
refs.h
refs/files-backend.c
refs/refs-internal.h
remote-curl.c
remote.c
remote.h
rerere.c
run-command.c
run-command.h
sequencer.c
sequencer.h
setup.c
sha1_file.c
shallow.c
shortlog.h
string-list.c
submodule-config.c
submodule-config.h
submodule.c
submodule.h
t/Makefile
t/helper/test-scrap-cache-tree.c
t/helper/test-string-list.c
t/lib-httpd/apache.conf
t/lib-proto-disable.sh
t/lib-submodule-update.sh
t/perf/p0071-sort.sh [new file with mode: 0755]
t/perf/p5302-pack-index.sh
t/t0001-init.sh
t/t0021-conversion.sh
t/t0021/rot13-filter.pl
t/t0202/test.pl
t/t1000-read-tree-m-3way.sh
t/t1001-read-tree-m-2way.sh
t/t1050-large.sh
t/t1308-config-set.sh
t/t1400-update-ref.sh
t/t1403-show-ref.sh
t/t1450-fsck.sh
t/t1514-rev-parse-push.sh
t/t2027-worktree-list.sh
t/t3030-merge-recursive.sh
t/t3203-branch-output.sh
t/t3404-rebase-interactive.sh
t/t3407-rebase-abort.sh
t/t3426-rebase-submodule.sh
t/t3501-revert-cherry-pick.sh
t/t3510-cherry-pick-sequence.sh
t/t3511-cherry-pick-x.sh
t/t3600-rm.sh
t/t3701-add-interactive.sh
t/t3903-stash.sh
t/t4013-diff-various.sh
t/t4013/diff.diff_--no-index_--raw_--abbrev=4_dir2_dir [new file with mode: 0644]
t/t4013/diff.diff_--no-index_--raw_--no-abbrev_dir2_dir [new file with mode: 0644]
t/t4013/diff.diff_--no-index_--raw_dir2_dir [new file with mode: 0644]
t/t4013/diff.diff_--raw_--abbrev=4_initial [new file with mode: 0644]
t/t4013/diff.diff_--raw_--no-abbrev_initial [new file with mode: 0644]
t/t4013/diff.diff_--raw_initial [new file with mode: 0644]
t/t4014-format-patch.sh
t/t4026-color.sh
t/t4032-diff-inter-hunk-context.sh
t/t4201-shortlog.sh
t/t4202-log.sh
t/t4205-log-pretty-formats.sh
t/t5000-tar-tree.sh
t/t5003-archive-zip.sh
t/t5300-pack-object.sh
t/t5310-pack-bitmaps.sh
t/t5315-pack-objects-compression.sh [new file with mode: 0755]
t/t5504-fetch-receive-strict.sh
t/t5505-remote.sh
t/t5509-fetch-push-namespaces.sh
t/t5516-fetch-push.sh
t/t5520-pull.sh
t/t5528-push-default.sh
t/t5531-deep-submodule-push.sh
t/t5547-push-quarantine.sh
t/t5550-http-fetch-dumb.sh
t/t5551-http-fetch-smart.sh
t/t5580-clone-push-unc.sh [new file with mode: 0755]
t/t5601-clone.sh
t/t5615-alternate-env.sh
t/t5802-connect-helper.sh
t/t5812-proto-disable-http.sh
t/t6030-bisect-porcelain.sh
t/t6101-rev-parse-parents.sh
t/t6134-pathspec-in-submodule.sh [new file with mode: 0755]
t/t6300-for-each-ref.sh
t/t6500-gc.sh
t/t7004-tag.sh
t/t7030-verify-tag.sh
t/t7400-submodule-basic.sh
t/t7406-submodule-update.sh
t/t7408-submodule-reference.sh
t/t7411-submodule-config.sh
t/t7412-submodule-absorbgitdirs.sh [new file with mode: 0755]
t/t7501-commit.sh
t/t7512-status-help.sh
t/t7600-merge.sh
t/t7609-merge-co-error-msgs.sh
t/t7610-mergetool.sh
t/t7810-grep.sh
t/t7814-grep-recurse-submodules.sh [new file with mode: 0755]
t/t8002-blame.sh
t/t8011-blame-split-file.sh [new file with mode: 0755]
t/t9001-send-email.sh
t/t9100-git-svn-basic.sh
t/t9117-git-svn-init-clone.sh
t/t9301-fast-import-notes.sh
t/t9303-fast-import-compression.sh [new file with mode: 0755]
t/t9800-git-p4-basic.sh
t/t9806-git-p4-options.sh
t/t9807-git-p4-submit.sh
t/t9813-git-p4-preserve-users.sh
t/t9814-git-p4-rename.sh
t/t9824-git-p4-git-lfs.sh
t/t9830-git-p4-symlink-dir.sh [new file with mode: 0755]
t/t9902-completion.sh
t/test-lib-functions.sh
t/test-lib.sh
tag.c
tmp-objdir.c
trailer.c
trailer.h
transport.c
transport.h
tree-walk.c
unicode_width.h
unpack-trees.c
update_unicode.sh [deleted file]
upload-pack.c
usage.c
utf8.c
versioncmp.c
worktree.c
worktree.h
wt-status.c
xdiff/xdiff.h
xdiff/xdiffi.c
xdiff/xutils.c
index 05cb58a3d4ef47295fa8ef02add44a0f0dd90d1f..b1020b875fc006c81ed92ffb93e73876487c7c57 100644 (file)
 /git-rebase--merge
 /git-receive-pack
 /git-reflog
-/git-relink
 /git-remote
 /git-remote-http
 /git-remote-https
 /config.mak.autogen
 /config.mak.append
 /configure
-/unicode
 /tags
 /TAGS
 /cscope*
index 9cc33e925de8adc562daf9b176135aba7b5e4d9b..ab59b2fac613013ffcf5e041fc2c942f3f97cb1f 100644 (file)
--- a/.mailmap
+++ b/.mailmap
@@ -192,6 +192,8 @@ Philippe Bruhat <book@cpan.org>
 Ralf Thielow <ralf.thielow@gmail.com> <ralf.thielow@googlemail.com>
 Ramsay Jones <ramsay@ramsayjones.plus.com> <ramsay@ramsay1.demon.co.uk>
 René Scharfe <l.s.r@web.de> <rene.scharfe@lsrfire.ath.cx>
+Richard Hansen <rhansen@rhansen.org> <hansenr@google.com>
+Richard Hansen <rhansen@rhansen.org> <rhansen@bbn.com>
 Robert Fitzsimons <robfitz@273k.net>
 Robert Shearman <robertshearman@gmail.com> <rob@codeweavers.com>
 Robert Zeh <robert.a.zeh@gmail.com>
@@ -223,6 +225,7 @@ Steven Walter <stevenrwalter@gmail.com> <swalter@lexmark.com>
 Steven Walter <stevenrwalter@gmail.com> <swalter@lpdev.prtdev.lexmark.com>
 Sven Verdoolaege <skimo@kotnet.org> <Sven.Verdoolaege@cs.kuleuven.ac.be>
 Sven Verdoolaege <skimo@kotnet.org> <skimo@liacs.nl>
+SZEDER Gábor <szeder.dev@gmail.com> <szeder@ira.uka.de>
 Tay Ray Chuan <rctay89@gmail.com>
 Ted Percival <ted@midg3t.net> <ted.percival@quest.com>
 Theodore Ts'o <tytso@mit.edu>
index 0b2ea5c3e2daa057cb88763f1943f6a250d019d9..9c63c8c3f6807841df13161f76d476deca0d94fd 100644 (file)
@@ -27,8 +27,8 @@ env:
     # The Linux build installs the defined dependency versions below.
     # The OS X build installs the latest available versions. Keep that
     # in mind when you encounter a broken OS X build!
-    - LINUX_P4_VERSION="16.1"
-    - LINUX_GIT_LFS_VERSION="1.2.0"
+    - LINUX_P4_VERSION="16.2"
+    - LINUX_GIT_LFS_VERSION="1.5.2"
     - DEFAULT_TEST_TARGET=prove
     - GIT_PROVE_OPTS="--timer --jobs 3 --state=failed,slow,save"
     - GIT_TEST_OPTS="--verbose-log"
@@ -75,20 +75,12 @@ before_install:
       popd
       ;;
     osx)
-      brew_force_set_latest_binary_hash () {
-        FORMULA=$1
-        SHA=$(brew fetch --force $FORMULA 2>&1 | grep ^SHA256: | cut -d ' ' -f 2)
-        sed -E -i.bak "s/sha256 \"[0-9a-f]{64}\"/sha256 \"$SHA\"/g" \
-          "$(brew --repository homebrew/homebrew-binary)/$FORMULA.rb"
-      }
       brew update --quiet
-      brew tap homebrew/binary --quiet
-      brew_force_set_latest_binary_hash perforce
-      brew_force_set_latest_binary_hash perforce-server
       # Uncomment this if you want to run perf tests:
       # brew install gnu-time
-      brew install git-lfs perforce-server perforce gettext
+      brew install git-lfs gettext
       brew link --force gettext
+      brew install caskroom/cask/perforce
       ;;
     esac;
     echo "$(tput setaf 6)Perforce Server Version$(tput sgr0)";
index 4cd95da6b1e436c8764d51f17ea0446ca3bad73d..a4191aa3889000ed844678331e5fd7f9fc628ba4 100644 (file)
@@ -206,11 +206,38 @@ For C programs:
                x = 1;
        }
 
-   is frowned upon.  A gray area is when the statement extends
-   over a few lines, and/or you have a lengthy comment atop of
-   it.  Also, like in the Linux kernel, if there is a long list
-   of "else if" statements, it can make sense to add braces to
-   single line blocks.
+   is frowned upon. But there are a few exceptions:
+
+       - When the statement extends over a few lines (e.g., a while loop
+         with an embedded conditional, or a comment). E.g.:
+
+               while (foo) {
+                       if (x)
+                               one();
+                       else
+                               two();
+               }
+
+               if (foo) {
+                       /*
+                        * This one requires some explanation,
+                        * so we're better off with braces to make
+                        * it obvious that the indentation is correct.
+                        */
+                       doit();
+               }
+
+       - When there are multiple arms to a conditional and some of them
+         require braces, enclose even a single line block in braces for
+         consistency. E.g.:
+
+               if (foo) {
+                       doit();
+               } else {
+                       one();
+                       two();
+                       three();
+               }
 
  - We try to avoid assignments in the condition of an "if" statement.
 
index b43d66eae6e154b229aa1477b8454ce2918ba8b9..b5be2e2d3f5c8ade04fa81ddb5b24a8747838cdc 100644 (file)
@@ -120,6 +120,7 @@ INSTALL_INFO = install-info
 DOCBOOK2X_TEXI = docbook2x-texi
 DBLATEX = dblatex
 ASCIIDOC_DBLATEX_DIR = /etc/asciidoc/dblatex
+DBLATEX_COMMON = -p $(ASCIIDOC_DBLATEX_DIR)/asciidoc-dblatex.xsl -s $(ASCIIDOC_DBLATEX_DIR)/asciidoc-dblatex.sty
 ifndef PERL_PATH
        PERL_PATH = /usr/bin/perl
 endif
@@ -173,6 +174,16 @@ ifdef GNU_ROFF
 XMLTO_EXTRA += -m manpage-quote-apos.xsl
 endif
 
+ifdef USE_ASCIIDOCTOR
+ASCIIDOC = asciidoctor
+ASCIIDOC_CONF =
+ASCIIDOC_HTML = xhtml5
+ASCIIDOC_DOCBOOK = docbook45
+ASCIIDOC_EXTRA += -I. -rasciidoctor-extensions
+ASCIIDOC_EXTRA += -alitdd='&\#x2d;&\#x2d;'
+DBLATEX_COMMON =
+endif
+
 SHELL_PATH ?= $(SHELL)
 # Shell quote;
 SHELL_PATH_SQ = $(subst ','\'',$(SHELL_PATH))
@@ -337,7 +348,7 @@ manpage-base-url.xsl: manpage-base-url.xsl.in
 
 user-manual.xml: user-manual.txt user-manual.conf
        $(QUIET_ASCIIDOC)$(RM) $@+ $@ && \
-       $(TXT_TO_XML) -d article -o $@+ $< && \
+       $(TXT_TO_XML) -d book -o $@+ $< && \
        mv $@+ $@
 
 technical/api-index.txt: technical/api-index-skel.txt \
@@ -368,13 +379,14 @@ user-manual.texi: user-manual.xml
 
 user-manual.pdf: user-manual.xml
        $(QUIET_DBLATEX)$(RM) $@+ $@ && \
-       $(DBLATEX) -o $@+ -p $(ASCIIDOC_DBLATEX_DIR)/asciidoc-dblatex.xsl -s $(ASCIIDOC_DBLATEX_DIR)/asciidoc-dblatex.sty $< && \
+       $(DBLATEX) -o $@+ $(DBLATEX_COMMON) $< && \
        mv $@+ $@
 
-gitman.texi: $(MAN_XML) cat-texi.perl
+gitman.texi: $(MAN_XML) cat-texi.perl texi.xsl
        $(QUIET_DB2TEXI)$(RM) $@+ $@ && \
-       ($(foreach xml,$(MAN_XML),$(DOCBOOK2X_TEXI) --encoding=UTF-8 \
-               --to-stdout $(xml) &&) true) > $@++ && \
+       ($(foreach xml,$(sort $(MAN_XML)),xsltproc -o $(xml)+ texi.xsl $(xml) && \
+               $(DOCBOOK2X_TEXI) --encoding=UTF-8 --to-stdout $(xml)+ && \
+               rm $(xml)+ &&) true) > $@++ && \
        $(PERL_PATH) cat-texi.perl $@ <$@++ >$@+ && \
        rm $@++ && \
        mv $@+ $@
diff --git a/Documentation/RelNotes/2.10.3.txt b/Documentation/RelNotes/2.10.3.txt
new file mode 100644 (file)
index 0000000..277a2a1
--- /dev/null
@@ -0,0 +1,48 @@
+Git v2.10.3 Release Notes
+=========================
+
+Fixes since v2.10.2
+-------------------
+
+ * Extract a small helper out of the function that reads the authors
+   script file "git am" internally uses.
+   This by itself is not useful until a second caller appears in the
+   future for "rebase -i" helper.
+
+ * The command-line completion script (in contrib/) learned to
+   complete "git cmd ^mas<HT>" to complete the negative end of
+   reference to "git cmd ^master".
+
+ * "git send-email" attempts to pick up valid e-mails from the
+   trailers, but people in real world write non-addresses there, like
+   "Cc: Stable <add@re.ss> # 4.8+", which broke the output depending
+   on the availability and vintage of Mail::Address perl module.
+
+ * The code that we have used for the past 10+ years to cycle
+   4-element ring buffers turns out to be not quite portable in
+   theoretical world.
+
+ * "git daemon" used fixed-length buffers to turn URL to the
+   repository the client asked for into the server side directory
+   path, using snprintf() to avoid overflowing these buffers, but
+   allowed possibly truncated paths to the directory.  This has been
+   tightened to reject such a request that causes overlong path to be
+   required to serve.
+
+ * Recent update to git-sh-setup (a library of shell functions that
+   are used by our in-tree scripted Porcelain commands) included
+   another shell library git-sh-i18n without specifying where it is,
+   relying on the $PATH.  This has been fixed to be more explicit by
+   prefixing $(git --exec-path) output in front.
+
+ * Fix for a racy false-positive test failure.
+
+ * Portability update and workaround for builds on recent Mac OS X.
+
+ * Update to the test framework made in 2.9 timeframe broke running
+   the tests under valgrind, which has been fixed.
+
+ * Improve the rule to convert "unsigned char [20]" into "struct
+   object_id *" in contrib/coccinelle/
+
+Also contains minor documentation updates and code clean-ups.
index cea2a502deb96601ba0b71a831c5c05537d07160..b7b7dd361ef0bceef61f1ad8bdd948c47665b28b 100644 (file)
@@ -57,39 +57,40 @@ UI, Workflows & Features
 
  * Even though "git hash-objects", which is a tool to take an
    on-filesystem data stream and put it into the Git object store,
-   allowed to perform the "outside-world-to-Git" conversions (e.g.
+   can perform "outside-world-to-Git" conversions (e.g.
    end-of-line conversions and application of the clean-filter), and
-   it had the feature on by default from very early days, its reverse
+   it has had this feature on by default from very early days, its reverse
    operation "git cat-file", which takes an object from the Git object
-   store and externalize for the consumption by the outside world,
+   store and externalizes it for consumption by the outside world,
    lacked an equivalent mechanism to run the "Git-to-outside-world"
    conversion.  The command learned the "--filters" option to do so.
 
- * Output from "git diff" can be made easier to read by selecting
+ * Output from "git diff" can be made easier to read by intelligently selecting
    which lines are common and which lines are added/deleted
-   intelligently when the lines before and after the changed section
-   are the same.  A command line option is added to help with the
-   experiment to find a good heuristics.
+   when the lines before and after the changed section
+   are the same.  A command line option (--indent-heuristic) and a
+   configuration variable (diff.indentHeuristic) are added to help with the
+   experiment to find good heuristics.
 
  * In some projects, it is common to use "[RFC PATCH]" as the subject
    prefix for a patch meant for discussion rather than application.  A
-   new option "--rfc" is a short-hand for "--subject-prefix=RFC PATCH"
+   new format-patch option "--rfc" is a short-hand for "--subject-prefix=RFC PATCH"
    to help the participants of such projects.
 
- * "git add --chmod=+x <pathspec>" added recently only toggled the
+ * "git add --chmod={+,-}x <pathspec>" only changed the
    executable bit for paths that are either new or modified. This has
-   been corrected to flip the executable bit for all paths that match
+   been corrected to change the executable bit for all paths that match
    the given pathspec.
 
  * When "git format-patch --stdout" output is placed as an in-body
-   header and it uses the RFC2822 header folding, "git am" failed to
+   header and it uses RFC2822 header folding, "git am" fails to
    put the header line back into a single logical line.  The
    underlying "git mailinfo" was taught to handle this properly.
 
  * "gitweb" can spawn "highlight" to show blob contents with
    (programming) language-specific syntax highlighting, but only
    when the language is known.  "highlight" can however be told
-   to make the guess itself by giving it "--force" option, which
+   to guess the language itself by giving it "--force" option, which
    has been enabled.
 
  * "git gui" l10n to Portuguese.
@@ -109,19 +110,19 @@ UI, Workflows & Features
    history leading to nth parent was looking the other way.
 
  * In recent versions of cURL, GSSAPI credential delegation is
-   disabled by default due to CVE-2011-2192; introduce a configuration
-   to selectively allow enabling this.
+   disabled by default due to CVE-2011-2192; introduce a http.delegation
+   configuration variable to selectively allow enabling this.
    (merge 26a7b23429 ps/http-gssapi-cred-delegation later to maint).
 
  * "git mergetool" learned to honor "-O<orderfile>" to control the
    order of paths to present to the end user.
 
  * "git diff/log --ws-error-highlight=<kind>" lacked the corresponding
-   configuration variable to set it by default.
+   configuration variable (diff.wsErrorHighlight) to set it by default.
 
- * "git ls-files" learned "--recurse-submodules" option that can be
-   used to get a listing of tracked files across submodules (i.e. this
-   only works with "--cached" option, not for listing untracked or
+ * "git ls-files" learned the "--recurse-submodules" option
+   to get a listing of tracked files across submodules (i.e. this
+   only works with the "--cached" option, not for listing untracked or
    ignored files).  This would be a useful tool to sit on the upstream
    side of a pipe that is read with xargs to work on all working tree
    files from the top-level superproject.
@@ -130,7 +131,7 @@ UI, Workflows & Features
    implementations of XDG Secret Service API has been added to
    contrib/credential/.
 
- * The GPG verification status shown in "%G?" pretty format specifier
+ * The GPG verification status shown by the "%G?" pretty format specifier
    was not rich enough to differentiate a signature made by an expired
    key, a signature made by a revoked key, etc.  New output letters
    have been assigned to express them.
@@ -139,17 +140,17 @@ UI, Workflows & Features
    learned to turn "git describe" output (e.g. v2.9.3-599-g2376d31787)
    into clickable links in its output.
 
- * When new paths were added by "git add -N" to the index, it was
-   enough to circumvent the check by "git commit" to refrain from
-   making an empty commit without "--allow-empty".  The same logic
-   prevented "git status" to show such a path as "new file" in the
+ * "git commit" created an empty commit when invoked with an index
+   consisting solely of intend-to-add paths (added with "git add -N").
+   It now requires the "--allow-empty" option to create such a commit.
+   The same logic prevented "git status" from showing such paths as "new files" in the
    "Changes not staged for commit" section.
 
- * The smudge/clean filter API expect an external process is spawned
-   to filter the contents for each path that has a filter defined.  A
+ * The smudge/clean filter API spawns an external process
+   to filter the contents of each path that has a filter defined.  A
    new type of "process" filter API has been added to allow the first
    request to run the filter for a path to spawn a single process, and
-   all filtering need is served by this single process for multiple
+   all filtering is served by this single process for multiple
    paths, reducing the process creation overhead.
 
  * The user always has to say "stash@{$N}" when naming a single
@@ -173,7 +174,7 @@ Performance, Internal Implementation, Development Support etc.
    script file "git am" internally uses.
    (merge a77598e jc/am-read-author-file later to maint).
 
- * Lifts calls to exit(2) and die() higher in the callchain in
+ * Lift calls to exit(2) and die() higher in the callchain in
    sequencer.c files so that more helper functions in it can be used
    by callers that want to handle error conditions themselves.
 
@@ -192,13 +193,13 @@ Performance, Internal Implementation, Development Support etc.
    does not advertise any refs, but "git fetch" was not prepared to
    see such an advertisement.  When the other side disconnects without
    giving any ref advertisement, we used to say "there may not be a
-   repository at that URL", but we may have seen other advertisement
+   repository at that URL", but we may have seen other advertisements
    like "shallow" and ".have" in which case we definitely know that a
    repository is there.  The code to detect this case has also been
    updated.
 
  * Some codepaths in "git pack-objects" were not ready to use an
-   existing pack bitmap; now they are and as the result they have
+   existing pack bitmap; now they are and as a result they have
    become faster.
 
  * The codepath in "git fsck" to detect malformed tree objects has
@@ -214,7 +215,7 @@ Performance, Internal Implementation, Development Support etc.
    packfile first.
    (merge c9af708b1a jk/pack-objects-optim-mru later to maint).
 
- * Codepaths involved in interacting alternate object store have
+ * Codepaths involved in interacting alternate object stores have
    been cleaned up.
 
  * In order for the receiving end of "git push" to inspect the
@@ -222,7 +223,7 @@ Performance, Internal Implementation, Development Support etc.
    from the sending end need to be made available to the hook and
    the mechanism for the connectivity check, and this was done
    traditionally by storing the objects in the receiving repository
-   and letting "git gc" to expire it.  Instead, store the newly
+   and letting "git gc" expire them.  Instead, store the newly
    received objects in a temporary area, and make them available by
    reusing the alternate object store mechanism to them only while we
    decide if we accept the check, and once we decide, either migrate
@@ -237,7 +238,7 @@ Performance, Internal Implementation, Development Support etc.
    replaced with a priority queue.
 
  * "git diff --no-index" codepath has been updated not to try to peek
-   into .git/ directory that happens to be under the current
+   into .git/ directory that happens to be under the current
    directory, when we know we are operating outside any repository.
 
  * Update of the sequencer codebase to make it reusable to reimplement
@@ -251,8 +252,8 @@ Performance, Internal Implementation, Development Support etc.
    holding onto them.  Use O_CLOEXEC flag to open files in various
    codepaths.
 
- * Update "interpret-trailers" machinery and teaches it that people in
-   real world write all sorts of crufts in the "trailer" that was
+ * Update "interpret-trailers" machinery and teach it that people in
+   the real world write all sorts of cruft in the "trailer" that was
    originally designed to have the neat-o "Mail-Header: like thing"
    and nothing else.
 
@@ -280,7 +281,7 @@ notes for details).
    has been removed.
 
  * Having a submodule whose ".git" repository is somehow corrupt
-   caused a few commands that recurse into submodules loop forever.
+   caused a few commands that recurse into submodules to loop forever.
 
  * "git symbolic-ref -d HEAD" happily removes the symbolic ref, but
    the resulting repository becomes an invalid one.  Teach the command
@@ -308,12 +309,12 @@ notes for details).
    forgot to update "git gui" to look at the configuration to match
    this change.
 
- * "git add --chmod=+x" added recently lacked documentation, which has
+ * "git add --chmod={+,-}x" added recently lacked documentation, which has
    been corrected.
 
  * "git log --cherry-pick" used to include merge commits as candidates
    to be matched up with other commits, resulting a lot of wasted time.
-   The patch-id generation logic has been updated to ignore merges to
+   The patch-id generation logic has been updated to ignore merges and
    avoid the wastage.
 
  * The http transport (with curl-multi option, which is the default
@@ -333,20 +334,20 @@ notes for details).
    line of the next one.  This process may have to merge two adjacent
    hunks, but the code forgot to do so in some cases.
 
- * Performance tests done via "t/perf" did not use the same set of
+ * Performance tests done via "t/perf" did not use the right
    build configuration if the user relied on autoconf generated
    configuration.
 
  * "git format-patch --base=..." feature that was recently added
-   showed the base commit information after "-- " e-mail signature
+   showed the base commit information after the "-- " e-mail signature
    line, which turned out to be inconvenient.  The base information
    has been moved above the signature line.
 
  * More i18n.
 
  * Even when "git pull --rebase=preserve" (and the underlying "git
-   rebase --preserve") can complete without creating any new commit
-   (i.e. fast-forwards), it still insisted on having usable ident
+   rebase --preserve") can complete without creating any new commits
+   (i.e. fast-forwards), it still insisted on having usable ident
    information (read: user.email is set correctly), which was less
    than nice.  As the underlying commands used inside "git rebase"
    would fail with a more meaningful error message and advice text
@@ -396,7 +397,7 @@ notes for details).
  * Documentation around tools to import from CVS was fairly outdated.
 
  * "git clone --recurse-submodules" lost the progress eye-candy in
-   recent update, which has been corrected.
+   recent update, which has been corrected.
 
  * A low-level function verify_packfile() was meant to show errors
    that were detected without dying itself, but under some conditions
@@ -409,23 +410,23 @@ notes for details).
    to a design bug, which has been fixed.
 
  * In the codepath that comes up with the hostname to be used in an
-   e-mail when the user didn't tell us, we looked at ai_canonname
+   e-mail when the user didn't tell us, we looked at the ai_canonname
    field in struct addrinfo without making sure it is not NULL first.
 
  * "git worktree", even though it used the default_abbrev setting that
-   ought to be affected by core.abbrev configuration variable, ignored
+   ought to be affected by the core.abbrev configuration variable, ignored
    the variable setting.  The command has been taught to read the
    default set of configuration variables to correct this.
 
  * "git init" tried to record core.worktree in the repository's
-   'config' file when GIT_WORK_TREE environment variable was set and
+   'config' file when the GIT_WORK_TREE environment variable was set and
    it was different from where GIT_DIR appears as ".git" at its top,
    but the logic was faulty when .git is a "gitdir:" file that points
    at the real place, causing trouble in working trees that are
    managed by "git worktree".  This has been corrected.
 
  * Codepaths that read from an on-disk loose object were too loose in
-   validating what they are reading is a proper object file and
+   validating that they are reading a proper object file and
    sometimes read past the data they read from the disk, which has
    been corrected.  H/t to Gustavo Grieco for reporting.
 
@@ -434,8 +435,8 @@ notes for details).
    time, and "git gui" was the last in-tree user of the syntax.  This
    is finally fixed, so that we can move forward with the deprecation.
 
- * An author name, that spelled a backslash-quoted double quote in the
-   human readable part "My \"double quoted\" name", was not unquoted
+ * An author name that has a backslash-quoted double quote in the
+   human readable part ("My \"double quoted\" name"), was not unquoted
    correctly while applying a patch from a piece of e-mail.
 
  * Doc update to clarify what "log -3 --reverse" does.
@@ -449,11 +450,10 @@ notes for details).
    has been fixed; this did not affect any existing code as nobody
    tried to write anything after the padding on such a line, though.
 
- * The code that parses the format parameter of for-each-ref command
+ * The code that parses the format parameter of the for-each-ref command
    has seen a micro-optimization.
 
- * When we started cURL to talk to imap server when a new enough
-   version of cURL library is available, we forgot to explicitly add
+ * When we started to use cURL to talk to an imap server, we forgot to explicitly add
    imap(s):// before the destination.  To some folks, that didn't work
    and the library tried to make HTTP(s) requests instead.
 
@@ -474,13 +474,12 @@ notes for details).
    "Give me only the history since that version".
    (merge cccf74e2da nd/shallow-deepen later to maint).
 
- * It is a common mistake to say "git blame --reverse OLD path",
-   expecting that the command line is dwimmed as if asking how lines
+ * "git blame --reverse OLD path" is now DWIMmed to show how lines
    in path in an old revision OLD have survived up to the current
    commit.
    (merge e1d09701a4 jc/blame-reverse later to maint).
 
- * http.emptyauth configuration is a way to allow an empty username to
+ * The http.emptyauth configuration variable is a way to allow an empty username to
    pass when attempting to authenticate using mechanisms like
    Kerberos.  We took an unspecified (NULL) username and sent ":"
    (i.e. no username, no password) to CURLOPT_USERPWD, but did not do
@@ -494,20 +493,20 @@ notes for details).
    -p <paths>" adds to the current contents of the index to come up
    with what to commit.
 
- * A stray symbolic link in $GIT_DIR/refs/ directory could make name
+ * A stray symbolic link in the $GIT_DIR/refs/ directory could make name
    resolution loop forever, which has been corrected.
 
  * The "submodule.<name>.path" stored in .gitmodules is never copied
    to .git/config and such a key in .git/config has no meaning, but
-   the documentation described it and submodule.<name>.url next to
-   each other as if both belong to .git/config.  This has been fixed.
+   the documentation described it next to submodule.<name>.url
+   as if both belong to .git/config.  This has been fixed.
 
- * In a worktree connected to a repository elsewhere, created via "git
+ * In a worktree created via "git
    worktree", "git checkout" attempts to protect users from confusion
    by refusing to check out a branch that is already checked out in
    another worktree.  However, this also prevented checking out a
-   branch, which is designated as the primary branch of a bare
-   reopsitory, in a worktree that is connected to the bare
+   branch which is designated as the primary branch of a bare
+   repository, in a worktree that is connected to the bare
    repository.  The check has been corrected to allow it.
 
  * "git rebase" immediately after "git clone" failed to find the fork
@@ -515,7 +514,7 @@ notes for details).
 
  * When fetching from a remote that has many tags that are irrelevant
    to branches we are following, we used to waste way too many cycles
-   when checking if the object pointed at by a tag (that we are not
+   checking if the object pointed at by a tag (that we are not
    going to fetch!) exists in our repository too carefully.
 
  * Protect our code from over-eager compilers.
@@ -524,27 +523,24 @@ notes for details).
    "." instead of the branch name; the documentation has been updated
    to describe it.
 
- * A hot-fix for a test added by a recent topic that went to both
-   'master' and 'maint' already.
-
  * "git send-email" attempts to pick up valid e-mails from the
-   trailers, but people in real world write non-addresses there, like
+   trailers, but people in the real world write non-addresses there, like
    "Cc: Stable <add@re.ss> # 4.8+", which broke the output depending
-   on the availability and vintage of Mail::Address perl module.
+   on the availability and vintage of the Mail::Address perl module.
    (merge dcfafc5214 mm/send-email-cc-cruft-after-address later to maint).
 
- * The Travis CI configuration we ship ran the tests with --verbose
+ * The Travis CI configuration we ship ran the tests with the --verbose
    option but this risks non-TAP output that happens to be "ok" to be
    misinterpreted as TAP signalling a test that passed.  This resulted
-   in unnecessary failure.  This has been corrected by introducing a
+   in unnecessary failures.  This has been corrected by introducing a
    new mode to run our tests in the test harness to send the verbose
    output separately to the log file.
 
- * Some AsciiDoc formatter mishandles a displayed illustration with
+ * Some AsciiDoc formatters mishandle a displayed illustration with
    tabs in it.  Adjust a few of them in merge-base documentation to
    work around them.
 
- * A minor regression fix for "git submodule" that was introduced
+ * Fixed a minor regression in "git submodule" that was introduced
    when more helper functions were reimplemented in C.
    (merge 77b63ac31e sb/submodule-ignore-trailing-slash later to maint).
 
@@ -553,19 +549,19 @@ notes for details).
    theoretical world.
    (merge bb84735c80 rs/ring-buffer-wraparound later to maint).
 
- * "git daemon" used fixed-length buffers to turn URL to the
+ * "git daemon" used fixed-length buffers to turn URLs to the
    repository the client asked for into the server side directory
-   path, using snprintf() to avoid overflowing these buffers, but
+   paths, using snprintf() to avoid overflowing these buffers, but
    allowed possibly truncated paths to the directory.  This has been
-   tightened to reject such a request that causes overlong path to be
-   required to serve.
+   tightened to reject such a request that causes an overlong path to be
+   served.
    (merge 6bdb0083be jk/daemon-path-ok-check-truncation later to maint).
 
  * Recent update to git-sh-setup (a library of shell functions that
    are used by our in-tree scripted Porcelain commands) included
    another shell library git-sh-i18n without specifying where it is,
    relying on the $PATH.  This has been fixed to be more explicit by
-   prefixing $(git --exec-path) output in front.
+   prefixing with $(git --exec-path) output.
    (merge 1073094f30 ak/sh-setup-dot-source-i18n-fix later to maint).
 
  * Fix for a racy false-positive test failure.
@@ -578,7 +574,7 @@ notes for details).
    caused the command to segfault when on an unborn branch.
    (merge 84679d470d jc/for-each-ref-head-segfault-fix later to maint).
 
- * "git rebase -i" did not work well with core.commentchar
+ * "git rebase -i" did not work well with the core.commentchar
    configuration variable for two reasons, both of which have been
    fixed.
    (merge 882cd23777 js/rebase-i-commentchar-fix later to maint).
diff --git a/Documentation/RelNotes/2.11.1.txt b/Documentation/RelNotes/2.11.1.txt
new file mode 100644 (file)
index 0000000..9cd14c8
--- /dev/null
@@ -0,0 +1,168 @@
+Git v2.11.1 Release Notes
+=========================
+
+Fixes since v2.11
+-----------------
+
+ * The default Travis-CI configuration specifies newer P4 and GitLFS.
+
+ * The character width table has been updated to match Unicode 9.0
+
+ * Update the isatty() emulation for Windows by updating the previous
+   hack that depended on internals of (older) MSVC runtime.
+
+ * "git rev-parse --symbolic" failed with a more recent notation like
+   "HEAD^-1" and "HEAD^!".
+
+ * An empty directory in a working tree that can simply be nuked used
+   to interfere while merging or cherry-picking a change to create a
+   submodule directory there, which has been fixed..
+
+ * The code in "git push" to compute if any commit being pushed in the
+   superproject binds a commit in a submodule that hasn't been pushed
+   out was overly inefficient, making it unusable even for a small
+   project that does not have any submodule but have a reasonable
+   number of refs.
+
+ * "git push --dry-run --recurse-submodule=on-demand" wasn't
+   "--dry-run" in the submodules.
+
+ * The output from "git worktree list" was made in readdir() order,
+   and was unstable.
+
+ * mergetool.<tool>.trustExitCode configuration variable did not apply
+   to built-in tools, but now it does.
+
+ * "git p4" LFS support was broken when LFS stores an empty blob.
+
+ * Fix a corner case in merge-recursive regression that crept in
+   during 2.10 development cycle.
+
+ * Update the error messages from the dumb-http client when it fails
+   to obtain loose objects; we used to give sensible error message
+   only upon 404 but we now forbid unexpected redirects that needs to
+   be reported with something sensible.
+
+ * When diff.renames configuration is on (and with Git 2.9 and later,
+   it is enabled by default, which made it worse), "git stash"
+   misbehaved if a file is removed and another file with a very
+   similar content is added.
+
+ * "git diff --no-index" did not take "--no-abbrev" option.
+
+ * "git difftool --dir-diff" had a minor regression when started from
+   a subdirectory, which has been fixed.
+
+ * "git commit --allow-empty --only" (no pathspec) with dirty index
+   ought to be an acceptable way to create a new commit that does not
+   change any paths, but it was forbidden, perhaps because nobody
+   needed it so far.
+
+ * A pathname that begins with "//" or "\\" on Windows is special but
+   path normalization logic was unaware of it.
+
+ * "git pull --rebase", when there is no new commits on our side since
+   we forked from the upstream, should be able to fast-forward without
+   invoking "git rebase", but it didn't.
+
+ * The way to specify hotkeys to "xxdiff" that is used by "git
+   mergetool" has been modernized to match recent versions of xxdiff.
+
+ * Unlike "git am --abort", "git cherry-pick --abort" moved HEAD back
+   to where cherry-pick started while picking multiple changes, when
+   the cherry-pick stopped to ask for help from the user, and the user
+   did "git reset --hard" to a different commit in order to re-attempt
+   the operation.
+
+ * Code cleanup in shallow boundary computation.
+
+ * A recent update to receive-pack to make it easier to drop garbage
+   objects made it clear that GIT_ALTERNATE_OBJECT_DIRECTORIES cannot
+   have a pathname with a colon in it (no surprise!), and this in turn
+   made it impossible to push into a repository at such a path.  This
+   has been fixed by introducing a quoting mechanism used when
+   appending such a path to the colon-separated list.
+
+ * The function usage_msg_opt() has been updated to say "fatal:"
+   before the custom message programs give, when they want to die
+   with a message about wrong command line options followed by the
+   standard usage string.
+
+ * "git index-pack --stdin" needs an access to an existing repository,
+   but "git index-pack file.pack" to generate an .idx file that
+   corresponds to a packfile does not.
+
+ * Fix for NDEBUG builds.
+
+ * A lazy "git push" without refspec did not internally use a fully
+   specified refspec to perform 'current', 'simple', or 'upstream'
+   push, causing unnecessary "ambiguous ref" errors.
+
+ * "git p4" misbehaved when swapping a directory and a symbolic link.
+
+ * Even though an fix was attempted in Git 2.9.3 days, but running
+   "git difftool --dir-diff" from a subdirectory never worked. This
+   has been fixed.
+
+ * "git p4" that tracks multile p4 paths imported a single changelist
+   that touches files in these multiple paths as one commit, followed
+   by many empty commits.  This has been fixed.
+
+ * A potential but unlikely buffer overflow in Windows port has been
+   fixed.
+
+ * When the http server gives an incomplete response to a smart-http
+   rpc call, it could lead to client waiting for a full response that
+   will never come.  Teach the client side to notice this condition
+   and abort the transfer.
+
+ * Some platforms no longer understand "latin-1" that is still seen in
+   the wild in e-mail headers; replace them with "iso-8859-1" that is
+   more widely known when conversion fails from/to it.
+
+ * Update the procedure to generate "tags" for developer support.
+
+ * Update the definition of the MacOSX test environment used by
+   TravisCI.
+
+ * A few git-svn updates.
+
+ * Compression setting for producing packfiles were spread across
+   three codepaths, one of which did not honor any configuration.
+   Unify these so that all of them honor core.compression and
+   pack.compression variables the same way.
+
+ * "git fast-import" sometimes mishandled while rebalancing notes
+   tree, which has been fixed.
+
+ * Recent update to the default abbreviation length that auto-scales
+   lacked documentation update, which has been corrected.
+
+ * Leakage of lockfiles in the config subsystem has been fixed.
+
+ * It is natural that "git gc --auto" may not attempt to pack
+   everything into a single pack, and there is no point in warning
+   when the user has configured the system to use the pack bitmap,
+   leading to disabling further "gc".
+
+ * "git archive" did not read the standard configuration files, and
+   failed to notice a file that is marked as binary via the userdiff
+   driver configuration.
+
+ * "git blame --porcelain" misidentified the "previous" <commit, path>
+   pair (aka "source") when contents came from two or more files.
+
+ * "git rebase -i" with a recent update started showing an incorrect
+   count when squashing more than 10 commits.
+
+ * "git <cmd> @{push}" on a detached HEAD used to segfault; it has
+   been corrected to error out with a message.
+
+ * Tighten a test to avoid mistaking an extended ERE regexp engine as
+   a PRE regexp engine.
+
+ * Typing ^C to pager, which usually does not kill it, killed Git and
+   took the pager down as a collateral damage in certain process-tree
+   structure.  This has been fixed.
+
+Also contains various documentation updates and code clean-ups.
diff --git a/Documentation/RelNotes/2.12.0.txt b/Documentation/RelNotes/2.12.0.txt
new file mode 100644 (file)
index 0000000..0c6eed2
--- /dev/null
@@ -0,0 +1,446 @@
+Git 2.12 Release Notes
+======================
+
+Backward compatibility notes.
+
+ * Use of an empty string that is used for 'everything matches' is
+   still warned and Git asks users to use a more explicit '.' for that
+   instead.  The hope is that existing users will not mind this
+   change, and eventually the warning can be turned into a hard error,
+   upgrading the deprecation into removal of this (mis)feature.  That
+   is not scheduled to happen in the upcoming release (yet).
+
+ * The historical argument order "git merge <msg> HEAD <commit>..."
+   has been deprecated for quite some time, and will be removed in a
+   future release.
+
+ * An ancient script "git relink" has been removed.
+
+
+Updates since v2.11
+-------------------
+
+UI, Workflows & Features
+
+ * Various updates to "git p4".
+
+ * "git p4" didn't interact with the internal of .git directory
+   correctly in the modern "git-worktree"-enabled world.
+
+ * "git branch --list" and friends learned "--ignore-case" option to
+   optionally sort branches and tags case insensitively.
+
+ * In addition to %(subject), %(body), "log --pretty=format:..."
+   learned a new placeholder %(trailers).
+
+ * "git rebase" learned "--quit" option, which allows a user to
+   remove the metadata left by an earlier "git rebase" that was
+   manually aborted without using "git rebase --abort".
+
+ * "git clone --reference $there --recurse-submodules $super" has been
+   taught to guess repositories usable as references for submodules of
+   $super that are embedded in $there while making a clone of the
+   superproject borrow objects from $there; extend the mechanism to
+   also allow submodules of these submodules to borrow repositories
+   embedded in these clones of the submodules embedded in the clone of
+   the superproject.
+
+ * Porcelain scripts written in Perl are getting internationalized.
+
+ * "git merge --continue" has been added as a synonym to "git commit"
+   to conclude a merge that has stopped due to conflicts.
+
+ * Finer-grained control of what protocols are allowed for transports
+   during clone/fetch/push have been enabled via a new configuration
+   mechanism.
+
+ * "git shortlog" learned "--committer" option to group commits by
+   committer, instead of author.
+
+ * GitLFS integration with "git p4" has been updated.
+
+ * The isatty() emulation for Windows has been updated to eradicate
+   the previous hack that depended on internals of (older) MSVC
+   runtime.
+
+ * Some platforms no longer understand "latin-1" that is still seen in
+   the wild in e-mail headers; replace them with "iso-8859-1" that is
+   more widely known when conversion fails from/to it.
+
+ * "git grep" has been taught to optionally recurse into submodules.
+
+ * "git rm" used to refuse to remove a submodule when it has its own
+   git repository embedded in its working tree.  It learned to move
+   the repository away to $GIT_DIR/modules/ of the superproject
+   instead, and allow the submodule to be deleted (as long as there
+   will be no loss of local modifications, that is).
+
+ * A recent updates to "git p4" was not usable for older p4 but it
+   could be made to work with minimum changes.  Do so.
+
+ * "git diff" learned diff.interHunkContext configuration variable
+   that gives the default value for its --inter-hunk-context option.
+
+ * The prereleaseSuffix feature of version comparison that is used in
+   "git tag -l" did not correctly when two or more prereleases for the
+   same release were present (e.g. when 2.0, 2.0-beta1, and 2.0-beta2
+   are there and the code needs to compare 2.0-beta1 and 2.0-beta2).
+
+ * "git submodule push" learned "--recurse-submodules=only option to
+   push submodules out without pushing the top-level superproject.
+
+ * "git tag" and "git verify-tag" learned to put GPG verification
+   status in their "--format=<placeholders>" output format.
+
+ * An ancient repository conversion tool left in contrib/ has been
+   removed.
+
+ * "git show-ref HEAD" used with "--verify" because the user is not
+   interested in seeing refs/remotes/origin/HEAD, and used with
+   "--head" because the user does not want HEAD to be filtered out,
+   i.e. "git show-ref --head --verify HEAD", did not work as expected.
+
+ * "git submodule add" used to be confused and refused to add a
+   locally created repository; users can now use "--force" option
+   to add them.
+   (merge 619acfc78c sb/submodule-add-force later to maint).
+
+ * Some people feel the default set of colors used by "git log --graph"
+   rather limiting.  A mechanism to customize the set of colors has
+   been introduced.
+
+ * "git read-tree" and its underlying unpack_trees() machinery learned
+   to report problematic paths prefixed with the --super-prefix option.
+
+ * When a submodule "A", which has another submodule "B" nested within
+   it, is "absorbed" into the top-level superproject, the inner
+   submodule "B" used to be left in a strange state.  The logic to
+   adjust the .git pointers in these submodules has been corrected.
+
+ * The user can specify a custom update method that is run when
+   "submodule update" updates an already checked out submodule.  This
+   was ignored when checking the submodule out for the first time and
+   we instead always just checked out the commit that is bound to the
+   path in the superproject's index.
+
+ * The command line completion (in contrib/) learned that
+   "git diff --submodule=" can take "diff" as a recently added option.
+
+ * The "core.logAllRefUpdates" that used to be boolean has been
+   enhanced to take 'always' as well, to record ref updates to refs
+   other than the ones that are expected to be updated (i.e. branches,
+   remote-tracking branches and notes).
+
+
+Performance, Internal Implementation, Development Support etc.
+
+ * Commands that operate on a log message and add lines to the trailer
+   blocks, such as "format-patch -s", "cherry-pick (-x|-s)", and
+   "commit -s", have been taught to use the logic of and share the
+   code with "git interpret-trailer".
+
+ * The default Travis-CI configuration specifies newer P4 and GitLFS.
+
+ * The "fast hash" that had disastrous performance issues in some
+   corner cases has been retired from the internal diff.
+
+ * The character width table has been updated to match Unicode 9.0
+
+ * Update the procedure to generate "tags" for developer support.
+
+ * The codeflow of setting NOATIME and CLOEXEC on file descriptors Git
+   opens has been simplified.
+
+ * "git diff" and its family had two experimental heuristics to shift
+   the contents of a hunk to make the patch easier to read.  One of
+   them turns out to be better than the other, so leave only the
+   "--indent-heuristic" option and remove the other one.
+
+ * A new submodule helper "git submodule embedgitdirs" to make it
+   easier to move embedded .git/ directory for submodules in a
+   superproject to .git/modules/ (and point the latter with the former
+   that is turned into a "gitdir:" file) has been added.
+
+ * "git push \\server\share\dir" has recently regressed and then
+   fixed.  A test has retroactively been added for this breakage.
+
+ * Build updates for Cygwin.
+
+ * The implementation of "real_path()" was to go there with chdir(2)
+   and call getcwd(3), but this obviously wouldn't be usable in a
+   threaded environment.  Rewrite it to manually resolve relative
+   paths including symbolic links in path components.
+
+ * Adjust documentation to help AsciiDoctor render better while not
+   breaking the rendering done by AsciiDoc.
+
+ * The sequencer machinery has been further enhanced so that a later
+   set of patches can start using it to reimplement "rebase -i".
+
+ * Update the definition of the MacOSX test environment used by
+   TravisCI.
+
+ * Rewrite a scripted porcelain "git difftool" in C.
+
+ * "make -C t failed" will now run only the tests that failed in the
+   previous run.  This is usable only when prove is not use, and gives
+   a useless error message when run after "make clean", but otherwise
+   is serviceable.
+
+ * "uchar [40]" to "struct object_id" conversion continues.
+
+
+Also contains various documentation updates and code clean-ups.
+
+Fixes since v2.10
+-----------------
+
+Unless otherwise noted, all the fixes since v2.9 in the maintenance
+track are contained in this release (see the maintenance releases'
+notes for details).
+
+ * We often decide if a session is interactive by checking if the
+   standard I/O streams are connected to a TTY, but isatty() that
+   comes with Windows incorrectly returned true if it is used on NUL
+   (i.e. an equivalent to /dev/null).  This has been fixed.
+
+ * "git svn" did not work well with path components that are "0", and
+   some configuration variable it uses were not documented.
+
+ * "git rev-parse --symbolic" failed with a more recent notation like
+   "HEAD^-1" and "HEAD^!".
+
+ * An empty directory in a working tree that can simply be nuked used
+   to interfere while merging or cherry-picking a change to create a
+   submodule directory there, which has been fixed..
+
+ * The code in "git push" to compute if any commit being pushed in the
+   superproject binds a commit in a submodule that hasn't been pushed
+   out was overly inefficient, making it unusable even for a small
+   project that does not have any submodule but have a reasonable
+   number of refs.
+
+ * "git push --dry-run --recurse-submodule=on-demand" wasn't
+   "--dry-run" in the submodules.
+
+ * The output from "git worktree list" was made in readdir() order,
+   and was unstable.
+
+ * mergetool.<tool>.trustExitCode configuration variable did not apply
+   to built-in tools, but now it does.
+
+ * "git p4" LFS support was broken when LFS stores an empty blob.
+
+ * A corner case in merge-recursive regression that crept in
+   during 2.10 development cycle has been fixed.
+
+ * Transport with dumb http can be fooled into following foreign URLs
+   that the end user does not intend to, especially with the server
+   side redirects and http-alternates mechanism, which can lead to
+   security issues.  Tighten the redirection and make it more obvious
+   to the end user when it happens.
+
+ * Update the error messages from the dumb-http client when it fails
+   to obtain loose objects; we used to give sensible error message
+   only upon 404 but we now forbid unexpected redirects that needs to
+   be reported with something sensible.
+
+ * When diff.renames configuration is on (and with Git 2.9 and later,
+   it is enabled by default, which made it worse), "git stash"
+   misbehaved if a file is removed and another file with a very
+   similar content is added.
+
+ * "git diff --no-index" did not take "--no-abbrev" option.
+
+ * "git difftool --dir-diff" had a minor regression when started from
+   a subdirectory, which has been fixed.
+
+ * "git commit --allow-empty --only" (no pathspec) with dirty index
+   ought to be an acceptable way to create a new commit that does not
+   change any paths, but it was forbidden, perhaps because nobody
+   needed it so far.
+
+ * Git 2.11 had a minor regression in "merge --ff-only" that competed
+   with another process that simultanously attempted to update the
+   index. We used to explain what went wrong with an error message,
+   but the new code silently failed.  The error message has been
+   resurrected.
+
+ * A pathname that begins with "//" or "\\" on Windows is special but
+   path normalization logic was unaware of it.
+
+ * "git pull --rebase", when there is no new commits on our side since
+   we forked from the upstream, should be able to fast-forward without
+   invoking "git rebase", but it didn't.
+
+ * The way to specify hotkeys to "xxdiff" that is used by "git
+   mergetool" has been modernized to match recent versions of xxdiff.
+
+ * Unlike "git am --abort", "git cherry-pick --abort" moved HEAD back
+   to where cherry-pick started while picking multiple changes, when
+   the cherry-pick stopped to ask for help from the user, and the user
+   did "git reset --hard" to a different commit in order to re-attempt
+   the operation.
+
+ * Code cleanup in shallow boundary computation.
+
+ * A recent update to receive-pack to make it easier to drop garbage
+   objects made it clear that GIT_ALTERNATE_OBJECT_DIRECTORIES cannot
+   have a pathname with a colon in it (no surprise!), and this in turn
+   made it impossible to push into a repository at such a path.  This
+   has been fixed by introducing a quoting mechanism used when
+   appending such a path to the colon-separated list.
+
+ * The function usage_msg_opt() has been updated to say "fatal:"
+   before the custom message programs give, when they want to die
+   with a message about wrong command line options followed by the
+   standard usage string.
+
+ * "git index-pack --stdin" needs an access to an existing repository,
+   but "git index-pack file.pack" to generate an .idx file that
+   corresponds to a packfile does not.
+
+ * Fix for NDEBUG builds.
+
+ * A lazy "git push" without refspec did not internally use a fully
+   specified refspec to perform 'current', 'simple', or 'upstream'
+   push, causing unnecessary "ambiguous ref" errors.
+
+ * "git p4" misbehaved when swapping a directory and a symbolic link.
+
+ * Even though an fix was attempted in Git 2.9.3 days, but running
+   "git difftool --dir-diff" from a subdirectory never worked. This
+   has been fixed.
+
+ * "git p4" that tracks multile p4 paths imported a single changelist
+   that touches files in these multiple paths as one commit, followed
+   by many empty commits.  This has been fixed.
+
+ * A potential but unlikely buffer overflow in Windows port has been
+   fixed.
+
+ * When the http server gives an incomplete response to a smart-http
+   rpc call, it could lead to client waiting for a full response that
+   will never come.  Teach the client side to notice this condition
+   and abort the transfer.
+
+ * Compression setting for producing packfiles were spread across
+   three codepaths, one of which did not honor any configuration.
+   Unify these so that all of them honor core.compression and
+   pack.compression variables the same way.
+
+ * "git fast-import" sometimes mishandled while rebalancing notes
+   tree, which has been fixed.
+
+ * Recent update to the default abbreviation length that auto-scales
+   lacked documentation update, which has been corrected.
+
+ * Leakage of lockfiles in the config subsystem has been fixed.
+
+ * It is natural that "git gc --auto" may not attempt to pack
+   everything into a single pack, and there is no point in warning
+   when the user has configured the system to use the pack bitmap,
+   leading to disabling further "gc".
+
+ * "git archive" did not read the standard configuration files, and
+   failed to notice a file that is marked as binary via the userdiff
+   driver configuration.
+
+ * "git blame --porcelain" misidentified the "previous" <commit, path>
+   pair (aka "source") when contents came from two or more files.
+
+ * "git rebase -i" with a recent update started showing an incorrect
+   count when squashing more than 10 commits.
+
+ * "git <cmd> @{push}" on a detached HEAD used to segfault; it has
+   been corrected to error out with a message.
+
+ * Running "git add a/b" when "a" is a submodule correctly errored
+   out, but without a meaningful error message.
+   (merge 2d81c48fa7 sb/pathspec-errors later to maint).
+
+ * Typing ^C to pager, which usually does not kill it, killed Git and
+   took the pager down as a collateral damage in certain process-tree
+   structure.  This has been fixed.
+
+ * "git mergetool" without any pathspec on the command line that is
+   run from a subdirectory became no-op in Git v2.11 by mistake, which
+   has been fixed.
+
+ * Retire long unused/unmaintained gitview from the contrib/ area.
+   (merge 3120925c25 sb/remove-gitview later to maint).
+
+ * Tighten a test to avoid mistaking an extended ERE regexp engine as
+   a PRE regexp engine.
+
+ * An error message with an ASCII control character like '\r' in it
+   can alter the message to hide its early part, which is problematic
+   when a remote side gives such an error message that the local side
+   will relay with a "remote: " prefix.
+   (merge f290089879 jk/vreport-sanitize later to maint).
+
+ * "git fsck" inspects loose objects more carefully now.
+   (merge cce044df7f jk/loose-object-fsck later to maint).
+
+ * A crashing bug introduced in v2.11 timeframe has been found (it is
+   triggerable only in fast-import) and fixed.
+   (merge abd5a00268 jk/clear-delta-base-cache-fix later to maint).
+
+ * With an anticipatory tweak for remotes defined in ~/.gitconfig
+   (e.g. "remote.origin.prune" set to true, even though there may or
+   may not actually be "origin" remote defined in a particular Git
+   repository), "git remote rename" and other commands misinterpreted
+   and behaved as if such a non-existing remote actually existed.
+   (merge e459b073fb js/remote-rename-with-half-configured-remote later to maint).
+
+ * A few codepaths had to rely on a global variable when sorting
+   elements of an array because sort(3) API does not allow extra data
+   to be passed to the comparison function.  Use qsort_s() when
+   natively available, and a fallback implementation of it when not,
+   to eliminate the need, which is a prerequisite for making the
+   codepath reentrant.
+
+ * "git fsck --connectivity-check" was not working at all.
+   (merge a2b22854bd jk/fsck-connectivity-check-fix later to maint).
+
+ * After starting "git rebase -i", which first opens the user's editor
+   to edit the series of patches to apply, but before saving the
+   contents of that file, "git status" failed to show the current
+   state (i.e. you are in an interactive rebase session, but you have
+   applied no steps yet) correctly.
+   (merge df9ded4984 js/status-pre-rebase-i later to maint).
+
+ * Test tweak for FreeBSD where /usr/bin/unzip is unsuitable to run
+   our tests but /usr/local/bin/unzip is usable.
+   (merge d98b2c5fce js/unzip-in-usr-bin-workaround later to maint).
+
+ * "git p4" did not work well with multiple git-p4.mapUser entries on
+   Windows.
+   (merge c3c2b05776 gv/mingw-p4-mapuser later to maint).
+
+ * "git help" enumerates executable files in $PATH; the implementation
+   of "is this file executable?" on Windows has been optimized.
+   (merge c755015f79 hv/mingw-help-is-executable later to maint).
+
+ * Test tweaks for those who have default ACL in their git source tree
+   that interfere with the umask test.
+   (merge d549d21307 mm/reset-facl-before-umask-test later to maint).
+
+ * Names of the various hook scripts must be spelled exactly, but on
+   Windows, an .exe binary must be named with .exe suffix; notice
+   $GIT_DIR/hooks/<hookname>.exe as a valid <hookname> hook.
+   (merge 235be51fbe js/mingw-hooks-with-exe-suffix later to maint).
+
+ * Asciidoctor, an alternative reimplementation of AsciiDoc, still
+   needs some changes to work with documents meant to be formatted
+   with AsciiDoc.  "make USE_ASCIIDOCTOR=YesPlease" to use it out of
+   the box to document our pages is getting closer to reality.
+
+ * Other minor doc, test and build updates and code cleanups.
+   (merge f2627d9b19 sb/submodule-config-cleanup later to maint).
+   (merge 384f1a167b sb/unpack-trees-cleanup later to maint).
+   (merge 874444b704 rh/diff-orderfile-doc later to maint).
+   (merge eafd5d9483 cw/doc-sign-off later to maint).
+   (merge 0aaad415bc rs/absolute-pathdup later to maint).
+   (merge 4432dd6b5b rs/receive-pack-cleanup later to maint).
+   (merge 540a398e9c sg/mailmap-self later to maint).
index 08352deaae4763791b70bd172682c1fe5380f7b4..3faf7eb884bc497e0823fda39734d5f5d47824ba 100644 (file)
@@ -216,12 +216,11 @@ that it will be postponed.
 Exception:  If your mailer is mangling patches then someone may ask
 you to re-send them using MIME, that is OK.
 
-Do not PGP sign your patch, at least for now.  Most likely, your
-maintainer or other people on the list would not have your PGP
-key and would not bother obtaining it anyway.  Your patch is not
-judged by who you are; a good patch from an unknown origin has a
-far better chance of being accepted than a patch from a known,
-respected origin that is done poorly or does incorrect things.
+Do not PGP sign your patch. Most likely, your maintainer or other people on the
+list would not have your PGP key and would not bother obtaining it anyway.
+Your patch is not judged by who you are; a good patch from an unknown origin
+has a far better chance of being accepted than a patch from a known, respected
+origin that is done poorly or does incorrect things.
 
 If you really really really really want to do a PGP signed
 patch, format it as "multipart/signed", not a text/plain message
@@ -246,7 +245,7 @@ patch.
      *2* The mailing list: git@vger.kernel.org
 
 
-(5) Sign your work
+(5) Certify your work by adding your "Signed-off-by: " line
 
 To improve tracking of who did what, we've borrowed the
 "sign-off" procedure from the Linux kernel project on patches
diff --git a/Documentation/asciidoctor-extensions.rb b/Documentation/asciidoctor-extensions.rb
new file mode 100644 (file)
index 0000000..ec83b49
--- /dev/null
@@ -0,0 +1,28 @@
+require 'asciidoctor'
+require 'asciidoctor/extensions'
+
+module Git
+  module Documentation
+    class LinkGitProcessor < Asciidoctor::Extensions::InlineMacroProcessor
+      use_dsl
+
+      named :chrome
+
+      def process(parent, target, attrs)
+        if parent.document.basebackend? 'html'
+          prefix = parent.document.attr('git-relative-html-prefix')
+          %(<a href="#{prefix}#{target}.html">#{target}(#{attrs[1]})</a>\n)
+        elsif parent.document.basebackend? 'docbook'
+          "<citerefentry>\n" \
+            "<refentrytitle>#{target}</refentrytitle>" \
+            "<manvolnum>#{attrs[1]}</manvolnum>\n" \
+          "</citerefentry>\n"
+        end
+      end
+    end
+  end
+end
+
+Asciidoctor::Extensions.register do
+  inline_macro Git::Documentation::LinkGitProcessor, :linkgit
+end
index 87437f8a95768595e040b8c4c1d48e5c29ada087..14d2f834151712fa84e13209a65f0f7121b49dd7 100755 (executable)
@@ -1,9 +1,12 @@
 #!/usr/bin/perl -w
 
+use strict;
+use warnings;
+
 my @menu = ();
 my $output = $ARGV[0];
 
-open TMP, '>', "$output.tmp";
+open my $tmp, '>', "$output.tmp";
 
 while (<STDIN>) {
        next if (/^\\input texinfo/../\@node Top/);
        if (s/^\@top (.*)/\@node $1,,,Top/) {
                push @menu, $1;
        }
-       s/\(\@pxref{\[(URLS|REMOTES)\]}\)//;
+       s/\(\@pxref\{\[(URLS|REMOTES)\]}\)//;
        s/\@anchor\{[^{}]*\}//g;
-       print TMP;
+       print $tmp $_;
 }
-close TMP;
+close $tmp;
 
-printf '\input texinfo
+print '\input texinfo
 @setfilename gitman.info
 @documentencoding UTF-8
 @dircategory Development
 @top Git Manual Pages
 @documentlanguage en
 @menu
-', $menu[0];
+';
 
 for (@menu) {
        print "* ${_}::\n";
 }
 print "\@end menu\n";
-open TMP, '<', "$output.tmp";
-while (<TMP>) {
+open $tmp, '<', "$output.tmp";
+while (<$tmp>) {
        print;
 }
-close TMP;
+close $tmp;
 print "\@bye\n";
 unlink "$output.tmp";
index a0ab66aae70db90bd18e14ec5bc5c95007b118f7..fc5a28a3204b5c3d23cbce43679d5b04f3ff957b 100644 (file)
@@ -170,6 +170,9 @@ The position of any attributes with respect to the colors
 be turned off by prefixing them with `no` or `no-` (e.g., `noreverse`,
 `no-ul`, etc).
 +
+An empty color string produces no color effect at all. This can be used
+to avoid coloring specific elements without disabling color entirely.
++
 For git's pre-defined color slots, the attributes are meant to be reset
 at the beginning of each item in the colored output. So setting
 `color.decorate.branch` to `black` will paint that branch name in a
@@ -517,10 +520,12 @@ core.logAllRefUpdates::
        "`$GIT_DIR/logs/<ref>`", by appending the new and old
        SHA-1, the date/time and the reason of the update, but
        only when the file exists.  If this configuration
-       variable is set to true, missing "`$GIT_DIR/logs/<ref>`"
+       variable is set to `true`, missing "`$GIT_DIR/logs/<ref>`"
        file is automatically created for branch heads (i.e. under
-       refs/heads/), remote refs (i.e. under refs/remotes/),
-       note refs (i.e. under refs/notes/), and the symbolic ref HEAD.
+       `refs/heads/`), remote refs (i.e. under `refs/remotes/`),
+       note refs (i.e. under `refs/notes/`), and the symbolic ref `HEAD`.
+       If it is set to `always`, then a missing reflog is automatically
+       created for any ref under `refs/`.
 +
 This information can be used to determine what commit
 was the tip of a branch "2 days ago".
@@ -783,10 +788,11 @@ core.sparseCheckout::
        linkgit:git-read-tree[1] for more information.
 
 core.abbrev::
-       Set the length object names are abbreviated to.  If unspecified,
-       many commands abbreviate to 7 hexdigits, which may not be enough
-       for abbreviated object names to stay unique for sufficiently long
-       time.
+       Set the length object names are abbreviated to.  If
+       unspecified or set to "auto", an appropriate value is
+       computed based on the approximate number of packed objects
+       in your repository, which hopefully is enough for
+       abbreviated object names to stay unique for some time.
 
 add.ignoreErrors::
 add.ignore-errors (deprecated)::
@@ -1409,7 +1415,9 @@ gc.pruneExpire::
        Override the grace period with this config variable.  The value
        "now" may be used to disable this grace period and always prune
        unreachable objects immediately, or "never" may be used to
-       suppress pruning.
+       suppress pruning.  This feature helps prevent corruption when
+       'git gc' runs concurrently with another process writing to the
+       repository; see the "NOTES" section of linkgit:git-gc[1].
 
 gc.worktreePruneExpire::
        When 'git gc' is run, it calls
@@ -1891,6 +1899,16 @@ http.userAgent::
        of common USER_AGENT strings (but not including those like git/1.7.1).
        Can be overridden by the `GIT_HTTP_USER_AGENT` environment variable.
 
+http.followRedirects::
+       Whether git should follow HTTP redirects. If set to `true`, git
+       will transparently follow any redirect issued by a server it
+       encounters. If set to `false`, git will treat all redirects as
+       errors. If set to `initial`, git will follow redirects only for
+       the initial request to a remote, but not for subsequent
+       follow-up HTTP requests. Since git uses the redirected URL as
+       the base for the follow-up requests, this is generally
+       sufficient. The default is `initial`.
+
 http.<url>.*::
        Any of the http.* options above can be applied selectively to some URLs.
        For a config key to match a URL, each element of the config key is
@@ -2023,6 +2041,10 @@ log.follow::
        i.e. it cannot be used to follow multiple files and does not work well
        on non-linear history.
 
+log.graphColors::
+       A list of colors, separated by commas, that can be used to draw
+       history lines in `git log --graph`.
+
 log.showRoot::
        If true, the initial commit will be shown as a big creation event.
        This is equivalent to a diff against an empty tree.
@@ -2308,6 +2330,52 @@ pretty.<name>::
        Note that an alias with the same name as a built-in format
        will be silently ignored.
 
+protocol.allow::
+       If set, provide a user defined default policy for all protocols which
+       don't explicitly have a policy (`protocol.<name>.allow`).  By default,
+       if unset, known-safe protocols (http, https, git, ssh, file) have a
+       default policy of `always`, known-dangerous protocols (ext) have a
+       default policy of `never`, and all other protocols have a default
+       policy of `user`.  Supported policies:
++
+--
+
+* `always` - protocol is always able to be used.
+
+* `never` - protocol is never able to be used.
+
+* `user` - protocol is only able to be used when `GIT_PROTOCOL_FROM_USER` is
+  either unset or has a value of 1.  This policy should be used when you want a
+  protocol to be directly usable by the user but don't want it used by commands which
+  execute clone/fetch/push commands without user input, e.g. recursive
+  submodule initialization.
+
+--
+
+protocol.<name>.allow::
+       Set a policy to be used by protocol `<name>` with clone/fetch/push
+       commands. See `protocol.allow` above for the available policies.
++
+The protocol names currently used by git are:
++
+--
+  - `file`: any local file-based path (including `file://` URLs,
+    or local paths)
+
+  - `git`: the anonymous git protocol over a direct TCP
+    connection (or proxy, if configured)
+
+  - `ssh`: git over ssh (including `host:path` syntax,
+    `ssh://`, etc).
+
+  - `http`: git over http, both "smart http" and "dumb http".
+    Note that this does _not_ include `https`; if you want to configure
+    both, you must do so individually.
+
+  - any external helpers are named by their protocol (e.g., use
+    `hg` to allow the `git-remote-hg` helper)
+--
+
 pull.ff::
        By default, Git does not create an extra merge commit when merging
        a commit that is a descendant of the current commit. Instead, the
@@ -2930,6 +2998,11 @@ is omitted from the advertisements but `refs/heads/master` and
 `refs/namespaces/bar/refs/heads/master` are still advertised as so-called
 "have" lines. In order to match refs before stripping, add a `^` in front of
 the ref name. If you combine `!` and `^`, `!` must be specified first.
++
+Even if you hide refs, a client may still be able to steal the target
+objects via the techniques described in the "SECURITY" section of the
+linkgit:gitnamespaces[7] man page; it's best to keep private data in a
+separate repository.
 
 transfer.unpackLimit::
        When `fetch.unpackLimit` or `receive.unpackLimit` are
@@ -2939,7 +3012,7 @@ transfer.unpackLimit::
 uploadarchive.allowUnreachable::
        If true, allow clients to use `git archive --remote` to request
        any tree, whether reachable from the ref tips or not. See the
-       discussion in the `SECURITY` section of
+       discussion in the "SECURITY" section of
        linkgit:git-upload-archive[1] for more details. Defaults to
        `false`.
 
@@ -2953,12 +3026,23 @@ uploadpack.allowTipSHA1InWant::
        When `uploadpack.hideRefs` is in effect, allow `upload-pack`
        to accept a fetch request that asks for an object at the tip
        of a hidden ref (by default, such a request is rejected).
-       see also `uploadpack.hideRefs`.
+       See also `uploadpack.hideRefs`.  Even if this is false, a client
+       may be able to steal objects via the techniques described in the
+       "SECURITY" section of the linkgit:gitnamespaces[7] man page; it's
+       best to keep private data in a separate repository.
 
 uploadpack.allowReachableSHA1InWant::
        Allow `upload-pack` to accept a fetch request that asks for an
        object that is reachable from any ref tip. However, note that
        calculating object reachability is computationally expensive.
+       Defaults to `false`.  Even if this is false, a client may be able
+       to steal objects via the techniques described in the "SECURITY"
+       section of the linkgit:gitnamespaces[7] man page; it's best to
+       keep private data in a separate repository.
+
+uploadpack.allowAnySHA1InWant::
+       Allow `upload-pack` to accept a fetch request that asks for any
+       object at all.
        Defaults to `false`.
 
 uploadpack.keepAlive::
@@ -3038,17 +3122,39 @@ user.signingKey::
        This option is passed unchanged to gpg's --local-user parameter,
        so you may specify a key using any method that gpg supports.
 
-versionsort.prereleaseSuffix::
-       When version sort is used in linkgit:git-tag[1], prerelease
-       tags (e.g. "1.0-rc1") may appear after the main release
-       "1.0". By specifying the suffix "-rc" in this variable,
-       "1.0-rc1" will appear before "1.0".
-+
-This variable can be specified multiple times, once per suffix. The
-order of suffixes in the config file determines the sorting order
-(e.g. if "-pre" appears before "-rc" in the config file then 1.0-preXX
-is sorted before 1.0-rcXX). The sorting order between different
-suffixes is undefined if they are in multiple config files.
+versionsort.prereleaseSuffix (deprecated)::
+       Deprecated alias for `versionsort.suffix`.  Ignored if
+       `versionsort.suffix` is set.
+
+versionsort.suffix::
+       Even when version sort is used in linkgit:git-tag[1], tagnames
+       with the same base version but different suffixes are still sorted
+       lexicographically, resulting e.g. in prerelease tags appearing
+       after the main release (e.g. "1.0-rc1" after "1.0").  This
+       variable can be specified to determine the sorting order of tags
+       with different suffixes.
++
+By specifying a single suffix in this variable, any tagname containing
+that suffix will appear before the corresponding main release.  E.g. if
+the variable is set to "-rc", then all "1.0-rcX" tags will appear before
+"1.0".  If specified multiple times, once per suffix, then the order of
+suffixes in the configuration will determine the sorting order of tagnames
+with those suffixes.  E.g. if "-pre" appears before "-rc" in the
+configuration, then all "1.0-preX" tags will be listed before any
+"1.0-rcX" tags.  The placement of the main release tag relative to tags
+with various suffixes can be determined by specifying the empty suffix
+among those other suffixes.  E.g. if the suffixes "-rc", "", "-ck" and
+"-bfs" appear in the configuration in this order, then all "v4.8-rcX" tags
+are listed first, followed by "v4.8", then "v4.8-ckX" and finally
+"v4.8-bfsX".
++
+If more than one suffixes match the same tagname, then that tagname will
+be sorted according to the suffix which starts at the earliest position in
+the tagname.  If more than one different matching suffixes start at
+that earliest position, then that tagname will be sorted according to the
+longest of those suffixes.
+The sorting order between different suffixes is undefined if they are
+in multiple config files.
 
 web.browser::
        Specify a web browser that may be used by some commands.
index 35e8da201005dee34b75c87aebf720a8f7300a9c..6926e0a4c86a0c8396d9cca4942a81bbb8e7dc85 100644 (file)
@@ -11,7 +11,7 @@ Git internal format::
        It is `<unix timestamp> <time zone offset>`, where `<unix
        timestamp>` is the number of seconds since the UNIX epoch.
        `<time zone offset>` is a positive or negative offset from UTC.
-       For example CET (which is 2 hours ahead UTC) is `+0200`.
+       For example CET (which is 1 hour ahead of UTC) is `+0100`.
 
 RFC 2822::
        The standard email format as described by RFC 2822, for example
index 58f4bd6afa12240f9e416860ac12d82776815ee9..cbce8ec63841e8631f7122dae6e084b15e16832d 100644 (file)
@@ -60,6 +60,12 @@ diff.context::
        Generate diffs with <n> lines of context instead of the default
        of 3. This value is overridden by the -U option.
 
+diff.interHunkContext::
+       Show the context between diff hunks, up to the specified number
+       of lines, thereby fusing the hunks that are close to each other.
+       This value serves as the default for the `--inter-hunk-context`
+       command line option.
+
 diff.external::
        If this config variable is set, diff generation is not
        performed using the internal diff machinery, but using the
@@ -99,9 +105,10 @@ diff.noprefix::
        If set, 'git diff' does not show any source or destination prefix.
 
 diff.orderFile::
-       File indicating how to order files within a diff, using
-       one shell glob pattern per line.
-       Can be overridden by the '-O' option to linkgit:git-diff[1].
+       File indicating how to order files within a diff.
+       See the '-O' option to linkgit:git-diff[1] for details.
+       If `diff.orderFile` is a relative pathname, it is treated as
+       relative to the top of the working tree.
 
 diff.renameLimit::
        The number of files to consider when performing the copy/rename
@@ -172,10 +179,8 @@ diff.tool::
 include::mergetools-diff.txt[]
 
 diff.indentHeuristic::
-diff.compactionHeuristic::
-       Set one of these options to `true` to enable one of two
-       experimental heuristics that shift diff hunk boundaries to
-       make patches easier to read.
+       Set this option to `true` to enable experimental heuristics
+       that shift diff hunk boundaries to make patches easier to read.
 
 diff.algorithm::
        Choose a diff algorithm.  The variants are as follows:
index 36cb549df97cef182d590683cf262ccc9690e3ff..d4f3d9550555cd0aaa7a35c27ee926b71bf01b41 100644 (file)
@@ -1,7 +1,5 @@
 --indent-heuristic::
 --no-indent-heuristic::
---compaction-heuristic::
---no-compaction-heuristic::
        These are to help debugging and tuning experimental heuristics
        (which are off by default) that shift diff hunk boundaries to
        make patches easier to read.
index e6215c372c3c3c876125c8ac363a446fd840e112..d91ddbd5fe490527bd3032789d0bf3f2eef93f93 100644 (file)
@@ -466,11 +466,41 @@ information.
 endif::git-format-patch[]
 
 -O<orderfile>::
-       Output the patch in the order specified in the
-       <orderfile>, which has one shell glob pattern per line.
+       Control the order in which files appear in the output.
        This overrides the `diff.orderFile` configuration variable
        (see linkgit:git-config[1]).  To cancel `diff.orderFile`,
        use `-O/dev/null`.
++
+The output order is determined by the order of glob patterns in
+<orderfile>.
+All files with pathnames that match the first pattern are output
+first, all files with pathnames that match the second pattern (but not
+the first) are output next, and so on.
+All files with pathnames that do not match any pattern are output
+last, as if there was an implicit match-all pattern at the end of the
+file.
+If multiple pathnames have the same rank (they match the same pattern
+but no earlier patterns), their output order relative to each other is
+the normal order.
++
+<orderfile> is parsed as follows:
++
+--
+ - Blank lines are ignored, so they can be used as separators for
+   readability.
+
+ - Lines starting with a hash ("`#`") are ignored, so they can be used
+   for comments.  Add a backslash ("`\`") to the beginning of the
+   pattern if it starts with a hash.
+
+ - Each other line contains a single pattern.
+--
++
+Patterns have the same syntax and semantics as patterns used for
+fnmantch(3) without the FNM_PATHNAME flag, except a pathname also
+matches a pattern if removing any number of the final pathname
+components matches the pattern.  For example, the pattern "`foo*bar`"
+matches "`fooasdfbar`" and "`foo/bar/baz/asdf`" but not "`foobarx`".
 
 ifndef::git-format-patch[]
 -R::
@@ -511,6 +541,8 @@ endif::git-format-patch[]
 --inter-hunk-context=<lines>::
        Show the context between diff hunks, up to the specified number
        of lines, thereby fusing hunks that are close to each other.
+       Defaults to `diff.interHunkContext` or 0 if the config option
+       is unset.
 
 -W::
 --function-context::
index 2bb9a577a2b4a4e95dcf950239c2ead8d424319f..bdd915a66b481dccf9ae6d601b5497ceb6b3b3d7 100644 (file)
@@ -18,8 +18,8 @@ on the subcommand:
 
  git bisect start [--term-{old,good}=<term> --term-{new,bad}=<term>]
                  [--no-checkout] [<bad> [<good>...]] [--] [<paths>...]
- git bisect (bad|new) [<rev>]
- git bisect (good|old) [<rev>...]
+ git bisect (bad|new|<term-new>) [<rev>]
+ git bisect (good|old|<term-old>) [<rev>...]
  git bisect terms [--term-good | --term-bad]
  git bisect skip [(<rev>|<range>)...]
  git bisect reset [<commit>]
index 1fe73448f3f5a3ff48f939924156771cabfc1f77..28d46cc03b217c156769f6123c7b3e3351eabce4 100644 (file)
@@ -91,6 +91,9 @@ OPTIONS
        based sha1 expressions such as "<branchname>@\{yesterday}".
        Note that in non-bare repositories, reflogs are usually
        enabled by default by the `core.logallrefupdates` config option.
+       The negated form `--no-create-reflog` only overrides an earlier
+       `--create-reflog`, but currently does not negate the setting of
+       `core.logallrefupdates`.
 
 -f::
 --force::
@@ -118,6 +121,10 @@ OPTIONS
        default to color output.
        Same as `--color=never`.
 
+-i::
+--ignore-case::
+       Sorting and filtering branches are case insensitive.
+
 --column[=<options>]::
 --no-column::
        Display branch listing in columns. See configuration variable
index f2ab0ee2e7d1ff0f79c09cbd27e745f5f08d139d..4f8f20a3606201b1835affc523ff2828549d0285 100644 (file)
@@ -265,7 +265,8 @@ FROM UPSTREAM REBASE" section in linkgit:git-rebase[1].)
        If this option is specified together with `--amend`, then
        no paths need to be specified, which can be used to amend
        the last commit without committing changes that have
-       already been staged.
+       already been staged. If used together with `--allow-empty`
+       paths are also not required, and an empty commit will be created.
 
 -u[<mode>]::
 --untracked-files[=<mode>]::
index 224fb3090bba3f9dfd98448019a2ff6303b268f7..96c26e6aa82c98da1652023f0d04b4b63c8a4944 100644 (file)
@@ -86,10 +86,11 @@ instead.  `--no-symlinks` is the default on Windows.
        Additionally, `$BASE` is set in the environment.
 
 -g::
---gui::
+--[no-]gui::
        When 'git-difftool' is invoked with the `-g` or `--gui` option
        the default diff tool will be read from the configured
-       `diff.guitool` variable instead of `diff.tool`.
+       `diff.guitool` variable instead of `diff.tool`. The `--no-gui`
+       option can be used to override this setting.
 
 --[no-]trust-exit-code::
        'git-difftool' invokes a diff tool individually on each file.
index d45f6adc69fef8d99d9297c04bba532cd79a1c71..f7ebe36a7b2c203e0b2f320309a5ce6250b12471 100644 (file)
@@ -119,9 +119,9 @@ be in a separate packet, and the list must end with a flush packet.
        $GIT_DIR (e.g. "HEAD", "refs/heads/master").  When
        unspecified, update from all heads the remote side has.
 +
-If the remote has enabled the options `uploadpack.allowTipSHA1InWant` or
-`uploadpack.allowReachableSHA1InWant`, they may alternatively be 40-hex
-sha1s present on the remote.
+If the remote has enabled the options `uploadpack.allowTipSHA1InWant`,
+`uploadpack.allowReachableSHA1InWant`, or `uploadpack.allowAnySHA1InWant`,
+they may alternatively be 40-hex sha1s present on the remote.
 
 SEE ALSO
 --------
index 9e4216999d69f448b50d238d22e09289c6780661..b153aefa68c8dcaa5f3600d67c5ff0010ee899af 100644 (file)
@@ -192,6 +192,8 @@ The first command fetches the `maint` branch from the repository at
 objects will eventually be removed by git's built-in housekeeping (see
 linkgit:git-gc[1]).
 
+include::transfer-data-leaks.txt[]
+
 BUGS
 ----
 Using --recurse-submodules can only fetch new commits in already checked
index f57e69bc83e33e3de3d02e339fd71066b93e7d4d..abe13f3bedaf55dbefc03d26b934351107ff50af 100644 (file)
@@ -79,6 +79,9 @@ OPTIONS
        Only list refs which contain the specified commit (HEAD if not
        specified).
 
+--ignore-case::
+       Sorting and filtering refs are case insensitive.
+
 FIELD NAMES
 -----------
 
@@ -165,6 +168,8 @@ of all lines of the commit message up to the first blank line.  The next
 line is 'contents:body', where body is all of the lines after the first
 blank line.  The optional GPG signature is `contents:signature`.  The
 first `N` lines of the message is obtained using `contents:lines=N`.
+Additionally, the trailers as interpreted by linkgit:git-interpret-trailers[1]
+are obtained as 'contents:trailers'.
 
 For sorting purposes, fields with numeric values sort in numeric order
 (`objectsize`, `authordate`, `committerdate`, `creatordate`, `taggerdate`).
index bed60f471cd5736b173a2c636717cd566c1e4511..852b72c679e4193d5fed46b926a6456ef49cc4b1 100644 (file)
@@ -63,11 +63,10 @@ automatic consolidation of packs.
 --prune=<date>::
        Prune loose objects older than date (default is 2 weeks ago,
        overridable by the config variable `gc.pruneExpire`).
-       --prune=all prunes loose objects regardless of their age (do
-       not use --prune=all unless you know exactly what you are doing.
-       Unless the repository is quiescent, you will lose newly created
-       objects that haven't been anchored with the refs and end up
-       corrupting your repository).  --prune is on by default.
+       --prune=all prunes loose objects regardless of their age and
+       increases the risk of corruption if another process is writing to
+       the repository concurrently; see "NOTES" below. --prune is on by
+       default.
 
 --no-prune::
        Do not prune any loose objects.
@@ -138,17 +137,36 @@ default is "2 weeks ago".
 Notes
 -----
 
-'git gc' tries very hard to be safe about the garbage it collects. In
+'git gc' tries very hard not to delete objects that are referenced
+anywhere in your repository. In
 particular, it will keep not only objects referenced by your current set
 of branches and tags, but also objects referenced by the index,
 remote-tracking branches, refs saved by 'git filter-branch' in
 refs/original/, or reflogs (which may reference commits in branches
 that were later amended or rewound).
-
-If you are expecting some objects to be collected and they aren't, check
+If you are expecting some objects to be deleted and they aren't, check
 all of those locations and decide whether it makes sense in your case to
 remove those references.
 
+On the other hand, when 'git gc' runs concurrently with another process,
+there is a risk of it deleting an object that the other process is using
+but hasn't created a reference to. This may just cause the other process
+to fail or may corrupt the repository if the other process later adds a
+reference to the deleted object. Git has two features that significantly
+mitigate this problem:
+
+. Any object with modification time newer than the `--prune` date is kept,
+  along with everything reachable from it.
+
+. Most operations that add an object to the database update the
+  modification time of the object if it is already present so that #1
+  applies.
+
+However, these features fall short of a complete solution, so users who
+run commands concurrently have to live with some risk of corruption (which
+seems to be low in practice) unless they turn off automatic garbage
+collection with 'git config gc.auto 0'.
+
 HOOKS
 -----
 
index 0ecea6e4912f635e2825e8c02a14aef191cd91f1..71f32f35089241bc452cfdccdc6b3e9a30f95366 100644 (file)
@@ -26,6 +26,7 @@ SYNOPSIS
           [--threads <num>]
           [-f <file>] [-e] <pattern>
           [--and|--or|--not|(|)|-e <pattern>...]
+          [--recurse-submodules] [--parent-basename <basename>]
           [ [--[no-]exclude-standard] [--cached | --no-index | --untracked] | <tree>...]
           [--] [<pathspec>...]
 
@@ -88,6 +89,19 @@ OPTIONS
        mechanism.  Only useful when searching files in the current directory
        with `--no-index`.
 
+--recurse-submodules::
+       Recursively search in each submodule that has been initialized and
+       checked out in the repository.  When used in combination with the
+       <tree> option the prefix of all submodule output will be the name of
+       the parent project's <tree> object.
+
+--parent-basename <basename>::
+       For internal use only.  In order to produce uniform output with the
+       --recurse-submodules option, this option can be used to provide the
+       basename of a parent's <tree> object to a submodule so the submodule
+       can prefix its output with the parent's name rather than the SHA1 of
+       the submodule.
+
 -a::
 --text::
        Process binary files as if they were text.
index c1a3e8bf073f7aef89989356e985861644530a86..5f93f8003d1dfa43b6fab00253a206e47839efda 100644 (file)
@@ -35,7 +35,7 @@ blame::
 
 browser::
        Start a tree browser showing all files in the specified
-       commit (or `HEAD` by default).  Files selected through the
+       commit.  Files selected through the
        browser are opened in the blame viewer.
 
 citool::
index b758d5556caaeeb0a439d67c46100e5fa0d34cd4..ca3c27b88a4ea0dde17ed2e7f260ca6158a50073 100644 (file)
@@ -15,6 +15,7 @@ SYNOPSIS
        [--[no-]rerere-autoupdate] [-m <msg>] [<commit>...]
 'git merge' <msg> HEAD <commit>...
 'git merge' --abort
+'git merge' --continue
 
 DESCRIPTION
 -----------
@@ -61,6 +62,8 @@ reconstruct the original (pre-merge) changes. Therefore:
 discouraged: while possible, it may leave you in a state that is hard to
 back out of in the case of a conflict.
 
+The fourth syntax ("`git merge --continue`") can only be run after the
+merge has resulted in conflicts.
 
 OPTIONS
 -------
@@ -99,6 +102,11 @@ commit or stash your changes before running 'git merge'.
 'git merge --abort' is equivalent to 'git reset --merge' when
 `MERGE_HEAD` is present.
 
+--continue::
+       After a 'git merge' stops due to conflicts you can conclude the
+       merge by running 'git merge --continue' (see "HOW TO RESOLVE
+       CONFLICTS" section below).
+
 <commit>...::
        Commits, usually other branch heads, to merge into our branch.
        Specifying more than one commit will create a merge with
index c83aaf39c33505ead72d523f278620fcc6f8f757..7436c64a95616d84af9922958e4ccacd0c28519a 100644 (file)
@@ -303,6 +303,15 @@ These options can be used to modify 'git p4 submit' behavior.
        submit manually or revert.  This option always stops after the
        first (oldest) commit.  Git tags are not exported to p4.
 
+--shelve::
+       Instead of submitting create a series of shelved changelists.
+       After creating each shelve, the relevant files are reverted/deleted.
+       If you have multiple commits pending multiple shelves will be created.
+
+--update-shelve CHANGELIST::
+       Update an existing shelved changelist with this commit. Implies
+       --shelve.
+
 --conflict=(ask|skip|quit)::
        Conflicts can occur when applying a commit to p4.  When this
        happens, the default behavior ("ask") is to prompt whether to
@@ -467,6 +476,12 @@ git-p4.client::
        Client specified as an option to all p4 commands, with
        '-c <client>', including the client spec.
 
+git-p4.retries::
+       Specifies the number of times to retry a p4 command (notably,
+       'p4 sync') if the network times out. The default value is 3.
+       Set the value to 0 to disable retries or if your p4 version
+       does not support retries (pre 2012.2).
+
 Clone and sync variables
 ~~~~~~~~~~~~~~~~~~~~~~~~
 git-p4.syncFromOrigin::
index d033b258e5ee7c6e16c7d96c6339282a849b1b02..4470e4b5747f2474868fc0322823fff6aa25b841 100644 (file)
@@ -237,6 +237,8 @@ If you tried a pull which resulted in complex conflicts and
 would want to start over, you can recover with 'git reset'.
 
 
+include::transfer-data-leaks.txt[]
+
 BUGS
 ----
 Using --recurse-submodules can only fetch new commits in already checked
index 47b77e693bca1675a4887bddb5147077d60805a0..1624a35888c2e39f70b925a2f176d53dd02b809e 100644 (file)
@@ -272,7 +272,7 @@ origin +master` to force a push to the `master` branch). See the
        standard error stream is not directed to a terminal.
 
 --no-recurse-submodules::
---recurse-submodules=check|on-demand|no::
+--recurse-submodules=check|on-demand|only|no::
        May be used to make sure all submodule commits used by the
        revisions to be pushed are available on a remote-tracking branch.
        If 'check' is used Git will verify that all submodule commits that
@@ -280,11 +280,12 @@ origin +master` to force a push to the `master` branch). See the
        remote of the submodule. If any commits are missing the push will
        be aborted and exit with non-zero status. If 'on-demand' is used
        all submodules that changed in the revisions to be pushed will be
-       pushed. If on-demand was not able to push all necessary revisions
-       it will also be aborted and exit with non-zero status. A value of
-       'no' or using `--no-recurse-submodules` can be used to override the
-       push.recurseSubmodules configuration variable when no submodule
-       recursion is required.
+       pushed. If on-demand was not able to push all necessary revisions it will
+       also be aborted and exit with non-zero status. If 'only' is used all
+       submodules will be recursively pushed while the superproject is left
+       unpushed. A value of 'no' or using `--no-recurse-submodules` can be used
+       to override the push.recurseSubmodules configuration variable when no
+       submodule recursion is required.
 
 --[no-]verify::
        Toggle the pre-push hook (see linkgit:githooks[5]).  The
@@ -559,6 +560,8 @@ Commits A and B would no longer belong to a branch with a symbolic name,
 and so would be unreachable.  As such, these commits would be removed by
 a `git gc` command on the origin repository.
 
+include::transfer-data-leaks.txt[]
+
 GIT
 ---
 Part of the linkgit:git[1] suite
index de222c81af98c96678841f258342fe2cc3c426a8..67d48e68831561303c4f39f46bf105371ed0d916 100644 (file)
@@ -12,7 +12,7 @@ SYNOPSIS
        [<upstream> [<branch>]]
 'git rebase' [-i | --interactive] [options] [--exec <cmd>] [--onto <newbase>]
        --root [<branch>]
-'git rebase' --continue | --skip | --abort | --edit-todo
+'git rebase' --continue | --skip | --abort | --quit | --edit-todo
 
 DESCRIPTION
 -----------
@@ -252,6 +252,11 @@ leave out at most one of A and B, in which case it defaults to HEAD.
        will be reset to where it was when the rebase operation was
        started.
 
+--quit::
+       Abort the rebase operation but HEAD is not reset back to the
+       original branch. The index and working tree are also left
+       unchanged as a result.
+
 --keep-empty::
        Keep the commits that do not change anything from its
        parents in the result.
diff --git a/Documentation/git-relink.txt b/Documentation/git-relink.txt
deleted file mode 100644 (file)
index 3b33c99..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-git-relink(1)
-=============
-
-NAME
-----
-git-relink - Hardlink common objects in local repositories
-
-SYNOPSIS
---------
-[verse]
-'git relink' [--safe] <dir>... <master_dir>
-
-DESCRIPTION
------------
-This will scan 1 or more object repositories and look for objects in common
-with a master repository. Objects not already hardlinked to the master
-repository will be replaced with a hardlink to the master repository.
-
-OPTIONS
--------
---safe::
-       Stops if two objects with the same hash exist but have different sizes.
-       Default is to warn and continue.
-
-<dir>::
-       Directories containing a .git/objects/ subdirectory.
-
-GIT
----
-Part of the linkgit:git[1] suite
index 25432d9257f9c06773edc8ca3d24ddae16bddf99..add6220fce774d80ba25f50b99a721b2947e4f5d 100644 (file)
@@ -292,6 +292,44 @@ $ git reset --keep start                    <3>
 <3> But you can use "reset --keep" to remove the unwanted commit after
     you switched to "branch2".
 
+Split a commit into two::
++
+Suppose that you have created a commit, but later decide that you want to break
+apart the changes into two logical chunks and commit each separately. You want
+to include part of the original commit into the first commit, while including
+the remainder in a second commit. You can use git reset to rewind the history
+without changing the index, and then use git add -p to interactively select
+which hunks to put into the first commit.
++
+------------
+$ git reset HEAD^                           <1>
+$ git add -p                                <2>
+$ git diff --cached                         <3>
+$ git commit -c HEAD@{1}                    <4>
+...
+$ git add ...                               <5>
+$ git diff --cached                         <6>
+$ git commit ...                            <7>
+------------
++
+<1> First, reset the history back one commit so that we remove the original
+    commit, but leave the working tree with all the changes.
+<2> Now, interactively select hunks to add to a new commit using git add -p.
+    This will ask for each hunk separately and you can use simple commands like
+    "yes, include", "no don't include" or even "edit".
+<3> Once satisfied with the hunks, you should verify that it is what you
+    expected by using git diff --cached to show all changes in the index.
+<4> Next, commit the changes stored in the index. "-c" specifies to load the
+    editor with a commit message from a previous commit so that you can re-use the
+    original commit message. HEAD@{1} is special notation to reference what
+    HEAD used to be prior to the reset command. See linkgit:git-reflog[1] for
+    more details.
+<5> Now you've created the first commit, and can repeat steps 2-4 as often as
+    you like to break the work into any number of commits. Here we show a second
+    step which simply adds the remaining changes.
+<6> Then check again that the changes are what you expected to add.
+<7> And finally commit the remaining changes.
+
 
 DISCUSSION
 ----------
index b6c6326cdc7bb42993cf16fcae0d492944720e51..7241e968935505cdb9d507ab910b35178fcbf3bd 100644 (file)
@@ -91,7 +91,8 @@ repository.  For example:
 ----
 prefix=$(git rev-parse --show-prefix)
 cd "$(git rev-parse --show-toplevel)"
-eval "set -- $(git rev-parse --sq --prefix "$prefix" "$@")"
+# rev-parse provides the -- needed for 'set'
+eval "set $(git rev-parse --sq --prefix "$prefix" -- "$@")"
 ----
 
 --verify::
index 31af7f27360d277ccdc3e5bd59b4788c83934b8e..ee6c5476c1d2bf3b2a708e6152ebaba5882cc4f7 100644 (file)
@@ -47,6 +47,10 @@ OPTIONS
 
        Each pretty-printed commit will be rewrapped before it is shown.
 
+-c::
+--committer::
+       Collect and show committer identities instead of authors.
+
 -w[<width>[,<indent1>[,<indent2>]]]::
        Linewrap the output by wrapping each line at `width`.  The first
        line of each entry is indented by `indent1` spaces, and the second
index d8415734753e0d03f3f6d37bd4b76369d37f5fb0..918bd1d1bd062ae16c00509a1ac1051714f9ca51 100644 (file)
@@ -22,6 +22,7 @@ SYNOPSIS
              [commit] [--] [<path>...]
 'git submodule' [--quiet] foreach [--recursive] <command>
 'git submodule' [--quiet] sync [--recursive] [--] [<path>...]
+'git submodule' [--quiet] absorbgitdirs [--] [<path>...]
 
 
 DESCRIPTION
@@ -245,6 +246,20 @@ sync::
 If `--recursive` is specified, this command will recurse into the
 registered submodules, and sync any nested submodules within.
 
+absorbgitdirs::
+       If a git directory of a submodule is inside the submodule,
+       move the git directory of the submodule into its superprojects
+       `$GIT_DIR/modules` path and then connect the git directory and
+       its working directory by setting the `core.worktree` and adding
+       a .git file pointing to the git directory embedded in the
+       superprojects git directory.
++
+A repository that was cloned independently and later added as a submodule or
+old setups have the submodules git directory inside the submodule instead of
+embedded into the superprojects git directory.
++
+This command is recursive by default.
+
 OPTIONS
 -------
 -q::
index 5f9e65b0c4de117942babf0a14d255922d02b4ad..9bee9b0c4c53692bab569577d584797c0bd9e217 100644 (file)
@@ -664,13 +664,19 @@ creating the branch or tag.
        When retrieving svn commits into Git (as part of 'fetch', 'rebase', or
        'dcommit' operations), look for the first `From:` or `Signed-off-by:` line
        in the log message and use that as the author string.
++
+[verse]
+config key: svn.useLogAuthor
+
 --add-author-from::
        When committing to svn from Git (as part of 'commit-diff', 'set-tree' or 'dcommit'
        operations), if the existing log message doesn't already have a
        `From:` or `Signed-off-by:` line, append a `From:` line based on the
        Git commit's author string.  If you use this, then `--use-log-author`
        will retrieve a valid author string for all commits.
-
++
+[verse]
+config key: svn.addAuthorFrom
 
 ADVANCED OPTIONS
 ----------------
index 80019c584b11b35b2b14da83a31f326634bc6708..525737a5d891bb4a8b4df92c26a20550a927a0b9 100644 (file)
@@ -15,7 +15,7 @@ SYNOPSIS
 'git tag' [-n[<num>]] -l [--contains <commit>] [--points-at <object>]
        [--column[=<options>] | --no-column] [--create-reflog] [--sort=<key>]
        [--format=<format>] [--[no-]merged [<commit>]] [<pattern>...]
-'git tag' -v <tagname>...
+'git tag' -v [--format=<format>] <tagname>...
 
 DESCRIPTION
 -----------
@@ -101,13 +101,17 @@ OPTIONS
        multiple times, in which case the last key becomes the primary
        key. Also supports "version:refname" or "v:refname" (tag
        names are treated as versions). The "version:refname" sort
-       order can also be affected by the
-       "versionsort.prereleaseSuffix" configuration variable.
+       order can also be affected by the "versionsort.suffix"
+       configuration variable.
        The keys supported are the same as those in `git for-each-ref`.
        Sort order defaults to the value configured for the `tag.sort`
        variable if it exists, or lexicographic order otherwise. See
        linkgit:git-config[1].
 
+-i::
+--ignore-case::
+       Sorting and filtering tags are case insensitive.
+
 --column[=<options>]::
 --no-column::
        Display tag listing in columns. See configuration variable
@@ -146,7 +150,11 @@ This option is only applicable when listing tags without annotation lines.
        'strip' removes both whitespace and commentary.
 
 --create-reflog::
-       Create a reflog for the tag.
+       Create a reflog for the tag. To globally enable reflogs for tags, see
+       `core.logAllRefUpdates` in linkgit:git-config[1].
+       The negated form `--no-create-reflog` only overrides an earlier
+       `--create-reflog`, but currently does not negate the setting of
+       `core.logallrefupdates`.
 
 <tagname>::
        The name of the tag to create, delete, or describe.
index d590edcebd99a3c9321cfdc00499aa6996b78a5b..0b8075dad965f58b159bbe45f18d94bcc9f5ae60 100644 (file)
@@ -8,7 +8,7 @@ git-verify-tag - Check the GPG signature of tags
 SYNOPSIS
 --------
 [verse]
-'git verify-tag' <tag>...
+'git verify-tag' [--format=<format>] <tag>...
 
 DESCRIPTION
 -----------
index ab7215eee2b3e098ab505170f7850548fb8f3f27..4f208fab925cc00535c23c40d38ad6e3d56eeaab 100644 (file)
@@ -44,6 +44,12 @@ unreleased) version of Git, that is available from the 'master'
 branch of the `git.git` repository.
 Documentation for older releases are available here:
 
+* link:v2.11.1/git.html[documentation for release 2.11.1]
+
+* release notes for
+  link:RelNotes/2.11.1.txt[2.11.1],
+  link:RelNotes/2.11.0.txt[2.11].
+
 * link:v2.10.2/git.html[documentation for release 2.10.2]
 
 * release notes for
@@ -866,6 +872,12 @@ Git so take care if using a foreign front-end.
        specifies a ":" separated (on Windows ";" separated) list
        of Git object directories which can be used to search for Git
        objects. New objects will not be written to these directories.
++
+       Entries that begin with `"` (double-quote) will be interpreted
+       as C-style quoted paths, removing leading and trailing
+       double-quotes and respecting backslash escapes. E.g., the value
+       `"path-with-\"-and-:-in-it":vanilla-path` has two paths:
+       `path-with-"-and-:-in-it` and `vanilla-path`.
 
 `GIT_DIR`::
        If the `GIT_DIR` environment variable is set then it
@@ -1150,30 +1162,20 @@ of clones and fetches.
        cloning a repository to make a backup).
 
 `GIT_ALLOW_PROTOCOL`::
-       If set, provide a colon-separated list of protocols which are
-       allowed to be used with fetch/push/clone. This is useful to
-       restrict recursive submodule initialization from an untrusted
-       repository. Any protocol not mentioned will be disallowed (i.e.,
-       this is a whitelist, not a blacklist). If the variable is not
-       set at all, all protocols are enabled.  The protocol names
-       currently used by git are:
-
-         - `file`: any local file-based path (including `file://` URLs,
-           or local paths)
-
-         - `git`: the anonymous git protocol over a direct TCP
-           connection (or proxy, if configured)
-
-         - `ssh`: git over ssh (including `host:path` syntax,
-           `ssh://`, etc).
-
-         - `http`: git over http, both "smart http" and "dumb http".
-           Note that this does _not_ include `https`; if you want both,
-           you should specify both as `http:https`.
-
-         - any external helpers are named by their protocol (e.g., use
-           `hg` to allow the `git-remote-hg` helper)
-
+       If set to a colon-separated list of protocols, behave as if
+       `protocol.allow` is set to `never`, and each of the listed
+       protocols has `protocol.<name>.allow` set to `always`
+       (overriding any existing configuration). In other words, any
+       protocol not mentioned will be disallowed (i.e., this is a
+       whitelist, not a blacklist). See the description of
+       `protocol.allow` in linkgit:git-config[1] for more details.
+
+`GIT_PROTOCOL_FROM_USER`::
+       Set to 0 to prevent protocols used by fetch/push/clone which are
+       configured to the `user` state.  This is useful to restrict recursive
+       submodule initialization from an untrusted repository or for programs
+       which feed potentially-untrusted URLS to git commands.  See
+       linkgit:git-config[1] for more details.
 
 Discussion[[Discussion]]
 ------------------------
index 976243a63e6ee4c4627a8a0db77bab2846d17f40..e0b66c1220a7d22ef5b8eb960a4e2e389a71f884 100644 (file)
@@ -435,7 +435,9 @@ to filter relative to the repository root. Right after the flush packet
 Git sends the content split in zero or more pkt-line packets and a
 flush packet to terminate content. Please note, that the filter
 must not send any response before it received the content and the
-final flush packet.
+final flush packet. Also note that the "value" of a "key=value" pair
+can contain the "=" character whereas the key would never contain
+that character.
 ------------------------
 packet:          git> command=smudge
 packet:          git> pathname=path/testfile.dat
index 4546fa0d751705c27c88448ec3e7beb954233280..22309cfb48a6754d6bb4831cafc2981a8da7310b 100644 (file)
@@ -25,7 +25,7 @@ you want to understand Git's internals.
 The core Git is often called "plumbing", with the prettier user
 interfaces on top of it called "porcelain". You may not want to use the
 plumbing directly very often, but it can be good to know what the
-plumbing does for when the porcelain isn't flushing.
+plumbing does when the porcelain isn't flushing.
 
 Back when this document was originally written, many porcelain
 commands were shell scripts. For simplicity, it still uses them as
@@ -1368,7 +1368,7 @@ $ git repack
 will do it for you. If you followed the tutorial examples, you
 would have accumulated about 17 objects in `.git/objects/??/`
 directories by now. 'git repack' tells you how many objects it
-packed, and stores the packed file in `.git/objects/pack`
+packed, and stores the packed file in the `.git/objects/pack`
 directory.
 
 [NOTE]
@@ -1478,7 +1478,7 @@ You can repack this private repository whenever you feel like.
 A recommended work cycle for a "subsystem maintainer" who works
 on that project and has an own "public repository" goes like this:
 
-1. Prepare your work repository, by 'git clone' the public
+1. Prepare your work repository, by running 'git clone' on the public
    repository of the "project lead". The URL used for the
    initial cloning is stored in the remote.origin.url
    configuration variable.
@@ -1543,9 +1543,9 @@ like this:
 Working with Others, Shared Repository Style
 --------------------------------------------
 
-If you are coming from CVS background, the style of cooperation
+If you are coming from CVS background, the style of cooperation
 suggested in the previous section may be new to you. You do not
-have to worry. Git supports "shared public repository" style of
+have to worry. Git supports the "shared public repository" style of
 cooperation you are probably more familiar with as well.
 
 See linkgit:gitcvs-migration[7] for the details.
@@ -1635,7 +1635,7 @@ $ git show-branch
 ++* [master~2] Pretty-print messages.
 ------------
 
-Note that you should not do Octopus because you can.  An octopus
+Note that you should not do Octopus just because you can.  An octopus
 is a valid thing to do and often makes it easier to view the
 commit history if you are merging more than two independent
 changes at the same time.  However, if you have merge conflicts
index 35473ad02fb1dcce2e03bca30bdace4dea0232d4..10c8ff93c0b9f55ff19a8b54cdeed2fdad93b92b 100644 (file)
@@ -307,9 +307,16 @@ master or exposed as a part of a stable branch.
 <9> backport a critical fix.
 <10> create a signed tag.
 <11> make sure master was not accidentally rewound beyond that
-already pushed out.  `ko` shorthand points at the Git maintainer's
+already pushed out.
+<12> In the output from `git show-branch`, `master` should have
+everything `ko/master` has, and `next` should have
+everything `ko/next` has, etc.
+<13> push out the bleeding edge, together with new tags that point
+into the pushed history.
+
+In this example, the `ko` shorthand points at the Git maintainer's
 repository at kernel.org, and looks like this:
-+
+
 ------------
 (in .git/config)
 [remote "ko"]
@@ -320,12 +327,6 @@ repository at kernel.org, and looks like this:
        push = +refs/heads/pu
        push = refs/heads/maint
 ------------
-+
-<12> In the output from `git show-branch`, `master` should have
-everything `ko/master` has, and `next` should have
-everything `ko/next` has, etc.
-<13> push out the bleeding edge, together with new tags that point
-into the pushed history.
 
 
 Repository Administration[[ADMINISTRATION]]
index e382dd96dfded769a27c2295ebc096c15214713b..ca96c281d1f3abbf71cdac112a019d2849e7ad0b 100644 (file)
@@ -178,19 +178,21 @@ used by default. If '$XDG_CONFIG_HOME' is not set it defaults to
 History
 -------
 Gitk was the first graphical repository browser. It's written in
-tcl/tk and started off in a separate repository but was later merged
-into the main Git repository.
+tcl/tk.
 
+'gitk' is actually maintained as an independent project, but stable
+versions are distributed as part of the Git suite for the convenience
+of end users.
+
+gitk-git/ comes from Paul Mackerras's gitk project:
+
+       git://ozlabs.org/~paulus/gitk
 
 SEE ALSO
 --------
 'qgit(1)'::
        A repository browser written in C++ using Qt.
 
-'gitview(1)'::
-       A repository browser written in Python using Gtk. It's based on
-       'bzrk(1)' and distributed in the contrib area of the Git repository.
-
 'tig(1)'::
        A minimal repository browser and Git tool output highlighter written
        in C using Ncurses.
index 7685e3651ae0c63c9fe00f43957ef60648419db3..b614969ad2c12b5c4ed337617d7f4dd559a4d278 100644 (file)
@@ -61,22 +61,4 @@ For a simple local test, you can use linkgit:git-remote-ext[1]:
 git clone ext::'git --namespace=foo %s /tmp/prefixed.git'
 ----------
 
-SECURITY
---------
-
-Anyone with access to any namespace within a repository can potentially
-access objects from any other namespace stored in the same repository.
-You can't directly say "give me object ABCD" if you don't have a ref to
-it, but you can do some other sneaky things like:
-
-. Claiming to push ABCD, at which point the server will optimize out the
-  need for you to actually send it. Now you have a ref to ABCD and can
-  fetch it (claiming not to have it, of course).
-
-. Requesting other refs, claiming that you have ABCD, at which point the
-  server may generate deltas against ABCD.
-
-None of this causes a problem if you only host public repositories, or
-if everyone who may read one namespace may also read everything in every
-other namespace (for instance, if everyone in an organization has read
-permission to every repository).
+include::transfer-data-leaks.txt[]
index 3bcee2ddb1244c7ef52888d1de2654a688f6702f..47b286b33e4edd937fe6f7cbe727713e0e61e324 100644 (file)
@@ -199,6 +199,8 @@ endif::git-rev-list[]
   than given and there are spaces on its left, use those spaces
 - '%><(<N>)', '%><|(<N>)': similar to '% <(<N>)', '%<|(<N>)'
   respectively, but padding both sides (i.e. the text is centered)
+-%(trailers): display the trailers of the body as interpreted by
+  linkgit:git-interpret-trailers[1]
 
 NOTE: Some placeholders may depend on other options given to the
 revision traversal engine. For example, the `%g*` reflog options will
index 28f5a8b71574916820cdb1f1a023e27cb45ed6e6..a3f020cd9ef6a5110a1ca439403e525377975b72 100644 (file)
@@ -188,7 +188,9 @@ Returns the removed entry, or NULL if not found.
 `void *hashmap_iter_next(struct hashmap_iter *iter)`::
 `void *hashmap_iter_first(struct hashmap *map, struct hashmap_iter *iter)`::
 
-       Used to iterate over all entries of a hashmap.
+       Used to iterate over all entries of a hashmap. Note that it is
+       not safe to add or remove entries to the hashmap while
+       iterating.
 +
 `hashmap_iter_init` initializes a `hashmap_iter` structure.
 +
diff --git a/Documentation/technical/api-in-core-index.txt b/Documentation/technical/api-in-core-index.txt
deleted file mode 100644 (file)
index adbdbf5..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-in-core index API
-=================
-
-Talk about <read-cache.c> and <cache-tree.c>, things like:
-
-* cache -> the_index macros
-* read_index()
-* write_index()
-* ie_match_stat() and ie_modified(); how they are different and when to
-  use which.
-* index_name_pos()
-* remove_index_entry_at()
-* remove_file_from_index()
-* add_file_to_index()
-* add_index_entry()
-* refresh_index()
-* discard_index()
-* cache_tree_invalidate_path()
-* cache_tree_update()
-
-(JC, Linus)
index 540e45568990f89fceb50ad619ca8402e9925983..eb1fa9853ef6fd3ba9ab29342cf55747efaa2a69 100644 (file)
@@ -27,8 +27,6 @@ parse_pathspec(). This function takes several arguments:
 
 - prefix and args come from cmd_* functions
 
-get_pathspec() is obsolete and should never be used in new code.
-
 parse_pathspec() helps catch unsupported features and reject them
 politely. At a lower level, different pathspec-related functions may
 not support the same set of features. Such pathspec-sensitive
index 941fa178dd866162b4d3e8cb0c23a17f03016bb5..3dce003fda008e61c7a91c85554f9a1cafe6106f 100644 (file)
@@ -47,16 +47,20 @@ Functions
        Can be passed to the config parsing infrastructure to parse
        local (worktree) submodule configurations.
 
-`const struct submodule *submodule_from_path(const unsigned char *commit_sha1, const char *path)`::
+`const struct submodule *submodule_from_path(const unsigned char *treeish_name, const char *path)`::
 
-       Lookup values for one submodule by its commit_sha1 and path.
+       Given a tree-ish in the superproject and a path, return the
+       submodule that is bound at the path in the named tree.
 
-`const struct submodule *submodule_from_name(const unsigned char *commit_sha1, const char *name)`::
+`const struct submodule *submodule_from_name(const unsigned char *treeish_name, const char *name)`::
 
        The same as above but lookup by name.
 
-If given the null_sha1 as commit_sha1 the local configuration of a
-submodule will be returned (e.g. consolidated values from local git
+Whenever a submodule configuration is parsed in `parse_submodule_config_option`
+via e.g. `gitmodules_config()`, it will overwrite the null_sha1 entry.
+So in the normal case, when HEAD:.gitmodules is parsed first and then overlayed
+with the repository configuration, the null_sha1 entry contains the local
+configuration of a submodule (e.g. consolidated values from local git
 configuration and the .gitmodules file in the worktree).
 
 For an example usage see test-submodule-config.c.
diff --git a/Documentation/texi.xsl b/Documentation/texi.xsl
new file mode 100644 (file)
index 0000000..0f8ff07
--- /dev/null
@@ -0,0 +1,26 @@
+<!-- texi.xsl:
+     convert refsection elements into refsect elements that docbook2texi can
+     understand -->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+               version="1.0">
+
+<xsl:output method="xml"
+           encoding="UTF-8"
+           doctype-public="-//OASIS//DTD DocBook XML V4.5//EN"
+           doctype-system="http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" />
+
+<xsl:template match="//refsection">
+       <xsl:variable name="element">refsect<xsl:value-of select="count(ancestor-or-self::refsection)" /></xsl:variable>
+       <xsl:element name="{$element}">
+               <xsl:apply-templates select="@*|node()" />
+       </xsl:element>
+</xsl:template>
+
+<!-- Copy all other nodes through. -->
+<xsl:template match="node()|@*">
+       <xsl:copy>
+               <xsl:apply-templates select="@*|node()" />
+       </xsl:copy>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/Documentation/transfer-data-leaks.txt b/Documentation/transfer-data-leaks.txt
new file mode 100644 (file)
index 0000000..914bacc
--- /dev/null
@@ -0,0 +1,30 @@
+SECURITY
+--------
+The fetch and push protocols are not designed to prevent one side from
+stealing data from the other repository that was not intended to be
+shared. If you have private data that you need to protect from a malicious
+peer, your best option is to store it in another repository. This applies
+to both clients and servers. In particular, namespaces on a server are not
+effective for read access control; you should only grant read access to a
+namespace to clients that you would trust with read access to the entire
+repository.
+
+The known attack vectors are as follows:
+
+. The victim sends "have" lines advertising the IDs of objects it has that
+  are not explicitly intended to be shared but can be used to optimize the
+  transfer if the peer also has them. The attacker chooses an object ID X
+  to steal and sends a ref to X, but isn't required to send the content of
+  X because the victim already has it. Now the victim believes that the
+  attacker has X, and it sends the content of X back to the attacker
+  later. (This attack is most straightforward for a client to perform on a
+  server, by creating a ref to X in the namespace the client has access
+  to and then fetching it. The most likely way for a server to perform it
+  on a client is to "merge" X into a public branch and hope that the user
+  does additional work on this branch and pushes it back to the server
+  without noticing the merge.)
+
+. As in #1, the attacker chooses an object ID X to steal. The victim sends
+  an object Y that the attacker already has, and the attacker falsely
+  claims to have X and not Y, so the victim sends Y as a delta against X.
+  The delta reveals regions of X that are similar to Y to the attacker.
index 5e074545729fbd938efaa65311f8437b2ca1bcdf..bc29298678a6d2d9f6b2927f97c40ba8978bd93b 100644 (file)
@@ -4395,6 +4395,10 @@ itself!
 Git Glossary
 ============
 
+[[git-explained]]
+Git explained
+-------------
+
 include::glossary-content.txt[]
 
 [[git-quick-start]]
@@ -4636,6 +4640,10 @@ $ git gc
 Appendix B: Notes and todo list for this manual
 ===============================================
 
+[[todo-list]]
+Todo list
+---------
+
 This is a work in progress.
 
 The basic requirements:
index 092bd838b51ee1963d9350c885e464cb4b2fcce3..4bed33d2aee963ed3f46104afff4bd6788e612c8 100755 (executable)
@@ -1,7 +1,7 @@
 #!/bin/sh
 
 GVF=GIT-VERSION-FILE
-DEF_VER=v2.11.0-rc3
+DEF_VER=v2.12.0-rc0
 
 LF='
 '
@@ -12,7 +12,7 @@ if test -f version
 then
        VN=$(cat version) || VN="$DEF_VER"
 elif test -d ${GIT_DIR:-.git} -o -f .git &&
-       VN=$(git describe --match "v[0-9]*" --abbrev=7 HEAD 2>/dev/null) &&
+       VN=$(git describe --match "v[0-9]*" HEAD 2>/dev/null) &&
        case "$VN" in
        *$LF*) (exit 1) ;;
        v[0-9]*)
index 28b6440b3c2600f232233093c599d4c6dae9fb77..8e4081e0619f8a9927a3a4c544048f576a194fd0 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -250,6 +250,12 @@ all::
 # apostrophes to be ASCII so that cut&pasting examples to the shell
 # will work.
 #
+# Define USE_ASCIIDOCTOR to use Asciidoctor instead of AsciiDoc to build the
+# documentation.
+#
+# Define ASCIIDOCTOR_EXTENSIONS_LAB to point to the location of the Asciidoctor
+# Extensions Lab if you have it available.
+#
 # Define PERL_PATH to the path of your Perl binary (usually /usr/bin/perl).
 #
 # Define NO_PERL_MAKEMAKER if you cannot use Makefiles generated by perl's
@@ -279,6 +285,9 @@ all::
 # is a simplified version of the merge sort used in glibc. This is
 # recommended if Git triggers O(n^2) behavior in your platform's qsort().
 #
+# Define HAVE_ISO_QSORT_S if your platform provides a qsort_s() that's
+# compatible with the one described in C11 Annex K.
+#
 # Define UNRELIABLE_FSTAT if your system's fstat does not return the same
 # information on a not yet closed file that lstat would return for the same
 # file after it was closed.
@@ -338,11 +347,6 @@ all::
 #
 # Define NATIVE_CRLF if your platform uses CRLF for line endings.
 #
-# Define XDL_FAST_HASH to use an alternative line-hashing method in
-# the diff algorithm.  It gives a nice speedup if your processor has
-# fast unaligned word loads.  Does NOT work on big-endian systems!
-# Enabled by default on x86_64.
-#
 # Define GIT_USER_AGENT if you want to change how git identifies itself during
 # network interactions.  The default is "git/$(GIT_VERSION)".
 #
@@ -531,7 +535,6 @@ SCRIPT_PERL += git-archimport.perl
 SCRIPT_PERL += git-cvsexportcommit.perl
 SCRIPT_PERL += git-cvsimport.perl
 SCRIPT_PERL += git-cvsserver.perl
-SCRIPT_PERL += git-relink.perl
 SCRIPT_PERL += git-send-email.perl
 SCRIPT_PERL += git-svn.perl
 
@@ -1423,6 +1426,11 @@ ifdef INTERNAL_QSORT
        COMPAT_CFLAGS += -DINTERNAL_QSORT
        COMPAT_OBJS += compat/qsort.o
 endif
+ifdef HAVE_ISO_QSORT_S
+       COMPAT_CFLAGS += -DHAVE_ISO_QSORT_S
+else
+       COMPAT_OBJS += compat/qsort_s.o
+endif
 ifdef RUNTIME_PREFIX
        COMPAT_CFLAGS += -DRUNTIME_PREFIX
 endif
@@ -1485,10 +1493,6 @@ ifndef NO_MSGFMT_EXTENDED_OPTIONS
        MSGFMT += --check --statistics
 endif
 
-ifneq (,$(XDL_FAST_HASH))
-       BASIC_CFLAGS += -DXDL_FAST_HASH
-endif
-
 ifdef GMTIME_UNRELIABLE_ERRORS
        COMPAT_OBJS += compat/gmtime.o
        BASIC_CFLAGS += -DGMTIME_UNRELIABLE_ERRORS
@@ -1825,7 +1829,7 @@ $(SCRIPT_LIB) : % : %.sh GIT-SCRIPT-DEFINES
 git.res: git.rc GIT-VERSION-FILE
        $(QUIET_RC)$(RC) \
          $(join -DMAJOR= -DMINOR=, $(wordlist 1,2,$(subst -, ,$(subst ., ,$(GIT_VERSION))))) \
-         -DGIT_VERSION="\\\"$(GIT_VERSION)\\\"" $< -o $@
+         -DGIT_VERSION="\\\"$(GIT_VERSION)\\\"" -i $< -o $@
 
 # This makes sure we depend on the NO_PERL setting itself.
 $(SCRIPT_PERL_GEN): GIT-BUILD-OPTIONS
@@ -2055,7 +2059,7 @@ git-%$X: %.o GIT-LDFLAGS $(GITLIBS)
 
 git-imap-send$X: imap-send.o $(IMAP_SEND_BUILDDEPS) GIT-LDFLAGS $(GITLIBS)
        $(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \
-               $(LIBS) $(IMAP_SEND_LDFLAGS)
+               $(IMAP_SEND_LDFLAGS) $(LIBS)
 
 git-http-fetch$X: http.o http-walker.o http-fetch.o GIT-LDFLAGS $(GITLIBS)
        $(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \
@@ -2114,7 +2118,8 @@ XGETTEXT_FLAGS_C = $(XGETTEXT_FLAGS) --language=C \
        --keyword=_ --keyword=N_ --keyword="Q_:1,2"
 XGETTEXT_FLAGS_SH = $(XGETTEXT_FLAGS) --language=Shell \
        --keyword=gettextln --keyword=eval_gettextln
-XGETTEXT_FLAGS_PERL = $(XGETTEXT_FLAGS) --keyword=__ --language=Perl
+XGETTEXT_FLAGS_PERL = $(XGETTEXT_FLAGS) --language=Perl \
+       --keyword=__ --keyword=N__ --keyword="__n:1,2"
 LOCALIZED_C = $(C_OBJ:o=c) $(LIB_H) $(GENERATED_H)
 LOCALIZED_SH = $(SCRIPT_SH)
 LOCALIZED_SH += git-parse-remote.sh
@@ -2149,9 +2154,22 @@ endif
 po/build/locale/%/LC_MESSAGES/git.mo: po/%.po
        $(QUIET_MSGFMT)mkdir -p $(dir $@) && $(MSGFMT) -o $@ $<
 
-FIND_SOURCE_FILES = ( git ls-files '*.[hcS]' 2>/dev/null || \
-                       $(FIND) . \( -name .git -type d -prune \) \
-                               -o \( -name '*.[hcS]' -type f -print \) )
+FIND_SOURCE_FILES = ( \
+       git ls-files \
+               '*.[hcS]' \
+               '*.sh' \
+               ':!*[tp][0-9][0-9][0-9][0-9]*' \
+               ':!contrib' \
+               2>/dev/null || \
+       $(FIND) . \
+               \( -name .git -type d -prune \) \
+               -o \( -name '[tp][0-9][0-9][0-9][0-9]*' -prune \) \
+               -o \( -name contrib -type d -prune \) \
+               -o \( -name build -type d -prune \) \
+               -o \( -name 'trash*' -type d -prune \) \
+               -o \( -name '*.[hcS]' -type f -print \) \
+               -o \( -name '*.sh' -type f -print \) \
+       )
 
 $(ETAGS_TARGET): FORCE
        $(RM) $(ETAGS_TARGET)
index bd8a918a9bcbd46590078d98a66f3d7e939df3fb..c0cd5580ea48cf4818781bb8d4d7c2d9d5d63ae6 100644 (file)
--- a/README.md
+++ b/README.md
@@ -33,7 +33,7 @@ requests, comments and patches to git@vger.kernel.org (read
 [Documentation/SubmittingPatches][] for instructions on patch submission).
 To subscribe to the list, send an email with just "subscribe git" in
 the body to majordomo@vger.kernel.org. The mailing list archives are
-available at http://news.gmane.org/gmane.comp.version-control.git/,
+available at https://public-inbox.org/git,
 http://marc.info/?l=git and other archival sites.
 
 The maintainer frequently sends the "What's cooking" reports that
index b54330f7cdb37630dc47d6bdb71e847b8a947c17..d09c3d51093ac9e4da65e8a127b17ac9023520b5 120000 (symlink)
--- a/RelNotes
+++ b/RelNotes
@@ -1 +1 @@
-Documentation/RelNotes/2.11.0.txt
\ No newline at end of file
+Documentation/RelNotes/2.12.0.txt
\ No newline at end of file
index 2825de85912fc730d9a40fa66f4f83b6250a4171..2f0c26e0e2cbee88aa671f3960d21720e4307aba 100644 (file)
--- a/abspath.c
+++ b/abspath.c
@@ -11,46 +11,83 @@ int is_directory(const char *path)
        return (!stat(path, &st) && S_ISDIR(st.st_mode));
 }
 
+/* removes the last path component from 'path' except if 'path' is root */
+static void strip_last_component(struct strbuf *path)
+{
+       size_t offset = offset_1st_component(path->buf);
+       size_t len = path->len;
+
+       /* Find start of the last component */
+       while (offset < len && !is_dir_sep(path->buf[len - 1]))
+               len--;
+       /* Skip sequences of multiple path-separators */
+       while (offset < len && is_dir_sep(path->buf[len - 1]))
+               len--;
+
+       strbuf_setlen(path, len);
+}
+
+/* get (and remove) the next component in 'remaining' and place it in 'next' */
+static void get_next_component(struct strbuf *next, struct strbuf *remaining)
+{
+       char *start = NULL;
+       char *end = NULL;
+
+       strbuf_reset(next);
+
+       /* look for the next component */
+       /* Skip sequences of multiple path-separators */
+       for (start = remaining->buf; is_dir_sep(*start); start++)
+               ; /* nothing */
+       /* Find end of the path component */
+       for (end = start; *end && !is_dir_sep(*end); end++)
+               ; /* nothing */
+
+       strbuf_add(next, start, end - start);
+       /* remove the component from 'remaining' */
+       strbuf_remove(remaining, 0, end - remaining->buf);
+}
+
+/* copies root part from remaining to resolved, canonicalizing it on the way */
+static void get_root_part(struct strbuf *resolved, struct strbuf *remaining)
+{
+       int offset = offset_1st_component(remaining->buf);
+
+       strbuf_reset(resolved);
+       strbuf_add(resolved, remaining->buf, offset);
+#ifdef GIT_WINDOWS_NATIVE
+       convert_slashes(resolved->buf);
+#endif
+       strbuf_remove(remaining, 0, offset);
+}
+
 /* We allow "recursive" symbolic links. Only within reason, though. */
-#define MAXDEPTH 5
+#ifndef MAXSYMLINKS
+#define MAXSYMLINKS 32
+#endif
 
 /*
  * Return the real path (i.e., absolute path, with symlinks resolved
  * and extra slashes removed) equivalent to the specified path.  (If
  * you want an absolute path but don't mind links, use
- * absolute_path().)  The return value is a pointer to a static
- * buffer.
+ * absolute_path().)  Places the resolved realpath in the provided strbuf.
  *
- * The input and all intermediate paths must be shorter than MAX_PATH.
  * The directory part of path (i.e., everything up to the last
  * dir_sep) must denote a valid, existing directory, but the last
  * component need not exist.  If die_on_error is set, then die with an
  * informative error message if there is a problem.  Otherwise, return
  * NULL on errors (without generating any output).
- *
- * If path is our buffer, then return path, as it's already what the
- * user wants.
  */
-static const char *real_path_internal(const char *path, int die_on_error)
+char *strbuf_realpath(struct strbuf *resolved, const char *path,
+                     int die_on_error)
 {
-       static struct strbuf sb = STRBUF_INIT;
+       struct strbuf remaining = STRBUF_INIT;
+       struct strbuf next = STRBUF_INIT;
+       struct strbuf symlink = STRBUF_INIT;
        char *retval = NULL;
-
-       /*
-        * If we have to temporarily chdir(), store the original CWD
-        * here so that we can chdir() back to it at the end of the
-        * function:
-        */
-       struct strbuf cwd = STRBUF_INIT;
-
-       int depth = MAXDEPTH;
-       char *last_elem = NULL;
+       int num_symlinks = 0;
        struct stat st;
 
-       /* We've already done it */
-       if (path == sb.buf)
-               return path;
-
        if (!*path) {
                if (die_on_error)
                        die("The empty string is not a valid path");
@@ -58,86 +95,136 @@ static const char *real_path_internal(const char *path, int die_on_error)
                        goto error_out;
        }
 
-       strbuf_reset(&sb);
-       strbuf_addstr(&sb, path);
-
-       while (depth--) {
-               if (!is_directory(sb.buf)) {
-                       char *last_slash = find_last_dir_sep(sb.buf);
-                       if (last_slash) {
-                               last_elem = xstrdup(last_slash + 1);
-                               strbuf_setlen(&sb, last_slash - sb.buf + 1);
-                       } else {
-                               last_elem = xmemdupz(sb.buf, sb.len);
-                               strbuf_reset(&sb);
-                       }
+       strbuf_addstr(&remaining, path);
+       get_root_part(resolved, &remaining);
+
+       if (!resolved->len) {
+               /* relative path; can use CWD as the initial resolved path */
+               if (strbuf_getcwd(resolved)) {
+                       if (die_on_error)
+                               die_errno("unable to get current working directory");
+                       else
+                               goto error_out;
                }
+       }
 
-               if (sb.len) {
-                       if (!cwd.len && strbuf_getcwd(&cwd)) {
+       /* Iterate over the remaining path components */
+       while (remaining.len > 0) {
+               get_next_component(&next, &remaining);
+
+               if (next.len == 0) {
+                       continue; /* empty component */
+               } else if (next.len == 1 && !strcmp(next.buf, ".")) {
+                       continue; /* '.' component */
+               } else if (next.len == 2 && !strcmp(next.buf, "..")) {
+                       /* '..' component; strip the last path component */
+                       strip_last_component(resolved);
+                       continue;
+               }
+
+               /* append the next component and resolve resultant path */
+               if (!is_dir_sep(resolved->buf[resolved->len - 1]))
+                       strbuf_addch(resolved, '/');
+               strbuf_addbuf(resolved, &next);
+
+               if (lstat(resolved->buf, &st)) {
+                       /* error out unless this was the last component */
+                       if (errno != ENOENT || remaining.len) {
                                if (die_on_error)
-                                       die_errno("Could not get current working directory");
+                                       die_errno("Invalid path '%s'",
+                                                 resolved->buf);
                                else
                                        goto error_out;
                        }
+               } else if (S_ISLNK(st.st_mode)) {
+                       ssize_t len;
+                       strbuf_reset(&symlink);
+
+                       if (num_symlinks++ > MAXSYMLINKS) {
+                               errno = ELOOP;
 
-                       if (chdir(sb.buf)) {
                                if (die_on_error)
-                                       die_errno("Could not switch to '%s'",
-                                                 sb.buf);
+                                       die("More than %d nested symlinks "
+                                           "on path '%s'", MAXSYMLINKS, path);
                                else
                                        goto error_out;
                        }
-               }
-               if (strbuf_getcwd(&sb)) {
-                       if (die_on_error)
-                               die_errno("Could not get current working directory");
-                       else
-                               goto error_out;
-               }
 
-               if (last_elem) {
-                       if (sb.len && !is_dir_sep(sb.buf[sb.len - 1]))
-                               strbuf_addch(&sb, '/');
-                       strbuf_addstr(&sb, last_elem);
-                       free(last_elem);
-                       last_elem = NULL;
-               }
-
-               if (!lstat(sb.buf, &st) && S_ISLNK(st.st_mode)) {
-                       struct strbuf next_sb = STRBUF_INIT;
-                       ssize_t len = strbuf_readlink(&next_sb, sb.buf, 0);
+                       len = strbuf_readlink(&symlink, resolved->buf,
+                                             st.st_size);
                        if (len < 0) {
                                if (die_on_error)
                                        die_errno("Invalid symlink '%s'",
-                                                 sb.buf);
+                                                 resolved->buf);
                                else
                                        goto error_out;
                        }
-                       strbuf_swap(&sb, &next_sb);
-                       strbuf_release(&next_sb);
-               } else
-                       break;
+
+                       if (is_absolute_path(symlink.buf)) {
+                               /* absolute symlink; set resolved to root */
+                               get_root_part(resolved, &symlink);
+                       } else {
+                               /*
+                                * relative symlink
+                                * strip off the last component since it will
+                                * be replaced with the contents of the symlink
+                                */
+                               strip_last_component(resolved);
+                       }
+
+                       /*
+                        * if there are still remaining components to resolve
+                        * then append them to symlink
+                        */
+                       if (remaining.len) {
+                               strbuf_addch(&symlink, '/');
+                               strbuf_addbuf(&symlink, &remaining);
+                       }
+
+                       /*
+                        * use the symlink as the remaining components that
+                        * need to be resloved
+                        */
+                       strbuf_swap(&symlink, &remaining);
+               }
        }
 
-       retval = sb.buf;
+       retval = resolved->buf;
+
 error_out:
-       free(last_elem);
-       if (cwd.len && chdir(cwd.buf))
-               die_errno("Could not change back to '%s'", cwd.buf);
-       strbuf_release(&cwd);
+       strbuf_release(&remaining);
+       strbuf_release(&next);
+       strbuf_release(&symlink);
+
+       if (!retval)
+               strbuf_reset(resolved);
 
        return retval;
 }
 
 const char *real_path(const char *path)
 {
-       return real_path_internal(path, 1);
+       static struct strbuf realpath = STRBUF_INIT;
+       return strbuf_realpath(&realpath, path, 1);
 }
 
 const char *real_path_if_valid(const char *path)
 {
-       return real_path_internal(path, 0);
+       static struct strbuf realpath = STRBUF_INIT;
+       return strbuf_realpath(&realpath, path, 0);
+}
+
+char *real_pathdup(const char *path)
+{
+       struct strbuf realpath = STRBUF_INIT;
+       char *retval = NULL;
+
+       if (strbuf_realpath(&realpath, path, 0))
+               retval = strbuf_detach(&realpath, NULL);
+
+       strbuf_release(&realpath);
+
+       return retval;
 }
 
 /*
@@ -152,6 +239,13 @@ const char *absolute_path(const char *path)
        return sb.buf;
 }
 
+char *absolute_pathdup(const char *path)
+{
+       struct strbuf sb = STRBUF_INIT;
+       strbuf_add_absolute_path(&sb, path);
+       return strbuf_detach(&sb, NULL);
+}
+
 /*
  * Unlike prefix_path, this should be used if the named file does
  * not have to interact with index entry; i.e. name of a random file
diff --git a/apply.c b/apply.c
index 705cf562f07098aafcd9f6e27105d2105714751f..2ed808d429969ff9516ba1bf166c3fdfa6d63ed5 100644 (file)
--- a/apply.c
+++ b/apply.c
@@ -4688,7 +4688,7 @@ static int apply_patch(struct apply_state *state,
                                                                 state->index_file,
                                                                 LOCK_DIE_ON_ERROR);
                else
-                       state->newfd = hold_locked_index(state->lock_file, 1);
+                       state->newfd = hold_locked_index(state->lock_file, LOCK_DIE_ON_ERROR);
        }
 
        if (state->check_index && read_apply_cache(state) < 0) {
index 9db47357b02d4c33fc4e2d1edb8d948b2b3a496f..b429a8d974a02b06c9c6bc46850f4c9fae4a6d01 100644 (file)
@@ -554,11 +554,18 @@ static void dos_time(time_t *time, int *dos_date, int *dos_time)
        *dos_time = t->tm_sec / 2 + t->tm_min * 32 + t->tm_hour * 2048;
 }
 
+static int archive_zip_config(const char *var, const char *value, void *data)
+{
+       return userdiff_config(var, value);
+}
+
 static int write_zip_archive(const struct archiver *ar,
                             struct archiver_args *args)
 {
        int err;
 
+       git_config(archive_zip_config, NULL);
+
        dos_time(&args->time, &zip_date, &zip_time);
 
        zip_dir = xmalloc(ZIP_DIRECTORY_MIN_SIZE);
index 21bc6daa4393cb33994ba2eb305354e56d166cc0..8e63c40d274d7693b0c41e702cbe9ed03b1d12ae 100644 (file)
--- a/bisect.c
+++ b/bisect.c
@@ -747,7 +747,7 @@ static void handle_bad_merge_base(void)
                exit(3);
        }
 
-       fprintf(stderr, _("Some %s revs are not ancestor of the %s rev.\n"
+       fprintf(stderr, _("Some %s revs are not ancestors of the %s rev.\n"
                "git bisect cannot work properly in this case.\n"
                "Maybe you mistook %s and %s revs?\n"),
                term_good, term_bad, term_good, term_bad);
index 0d459b3cfe507b3906760fbea7f35e6191366057..b955d4f316c799f7788896806302bfd4dbcf3ec4 100644 (file)
--- a/branch.c
+++ b/branch.c
@@ -298,7 +298,7 @@ void create_branch(const char *name, const char *start_name,
                         start_name);
 
        if (reflog)
-               log_all_ref_updates = 1;
+               log_all_ref_updates = LOG_REFS_NORMAL;
 
        if (!dont_change_ref) {
                struct ref_transaction *transaction;
@@ -348,7 +348,7 @@ void die_if_checked_out(const char *branch, int ignore_current_worktree)
 int replace_each_worktree_head_symref(const char *oldref, const char *newref)
 {
        int ret = 0;
-       struct worktree **worktrees = get_worktrees();
+       struct worktree **worktrees = get_worktrees(0);
        int i;
 
        for (i = 0; worktrees[i]; i++) {
index e8fb80b36e7386fa9a9da91a61893c14ec696be4..9f53f020d0fc7184ac803a4346bdf426a814ed72 100644 (file)
@@ -361,7 +361,7 @@ int cmd_add(int argc, const char **argv, const char *prefix)
        add_new_files = !take_worktree_changes && !refresh_only;
        require_pathspec = !(take_worktree_changes || (0 < addremove_explicit));
 
-       hold_locked_index(&lock_file, 1);
+       hold_locked_index(&lock_file, LOCK_DIE_ON_ERROR);
 
        flags = ((verbose ? ADD_CACHE_VERBOSE : 0) |
                 (show_only ? ADD_CACHE_PRETEND : 0) |
index 6981f42ce986dc5a9fa76bed8364cee7c6c642aa..31fb60578f6caacfb376fe84938dda9432dcfc5a 100644 (file)
@@ -1119,7 +1119,7 @@ static void refresh_and_write_cache(void)
 {
        struct lock_file *lock_file = xcalloc(1, sizeof(struct lock_file));
 
-       hold_locked_index(lock_file, 1);
+       hold_locked_index(lock_file, LOCK_DIE_ON_ERROR);
        refresh_cache(REFRESH_QUIET);
        if (write_locked_index(&the_index, lock_file, COMMIT_LOCK))
                die(_("unable to write index file"));
@@ -1976,7 +1976,7 @@ static int fast_forward_to(struct tree *head, struct tree *remote, int reset)
                return -1;
 
        lock_file = xcalloc(1, sizeof(struct lock_file));
-       hold_locked_index(lock_file, 1);
+       hold_locked_index(lock_file, LOCK_DIE_ON_ERROR);
 
        refresh_cache(REFRESH_QUIET);
 
@@ -2016,7 +2016,7 @@ static int merge_tree(struct tree *tree)
                return -1;
 
        lock_file = xcalloc(1, sizeof(struct lock_file));
-       hold_locked_index(lock_file, 1);
+       hold_locked_index(lock_file, LOCK_DIE_ON_ERROR);
 
        memset(&opts, 0, sizeof(opts));
        opts.head_idx = 1;
@@ -2124,7 +2124,7 @@ static int safe_to_abort(const struct am_state *state)
 
        if (read_state_file(&sb, state, "abort-safety", 1) > 0) {
                if (get_oid_hex(sb.buf, &abort_safety))
-                       die(_("could not parse %s"), am_path(state, "abort_safety"));
+                       die(_("could not parse %s"), am_path(state, "abort-safety"));
        } else
                oidclr(&abort_safety);
 
@@ -2134,7 +2134,7 @@ static int safe_to_abort(const struct am_state *state)
        if (!oidcmp(&head, &abort_safety))
                return 1;
 
-       error(_("You seem to have moved HEAD since the last 'am' failure.\n"
+       warning(_("You seem to have moved HEAD since the last 'am' failure.\n"
                "Not rewinding to ORIG_HEAD"));
 
        return 0;
index 4ddfadb71f7ef93958e2f236e166212e8b6bda2b..cffc62654084b025ffbdb947448fa86c81dc6442 100644 (file)
@@ -1700,13 +1700,23 @@ static void get_commit_info(struct commit *commit,
 }
 
 /*
+ * Write out any suspect information which depends on the path. This must be
+ * handled separately from emit_one_suspect_detail(), because a given commit
+ * may have changes in multiple paths. So this needs to appear each time
+ * we mention a new group.
+ *
  * To allow LF and other nonportable characters in pathnames,
  * they are c-style quoted as needed.
  */
-static void write_filename_info(const char *path)
+static void write_filename_info(struct origin *suspect)
 {
+       if (suspect->previous) {
+               struct origin *prev = suspect->previous;
+               printf("previous %s ", oid_to_hex(&prev->commit->object.oid));
+               write_name_quoted(prev->path, stdout, '\n');
+       }
        printf("filename ");
-       write_name_quoted(path, stdout, '\n');
+       write_name_quoted(suspect->path, stdout, '\n');
 }
 
 /*
@@ -1735,11 +1745,6 @@ static int emit_one_suspect_detail(struct origin *suspect, int repeat)
        printf("summary %s\n", ci.summary.buf);
        if (suspect->commit->object.flags & UNINTERESTING)
                printf("boundary\n");
-       if (suspect->previous) {
-               struct origin *prev = suspect->previous;
-               printf("previous %s ", oid_to_hex(&prev->commit->object.oid));
-               write_name_quoted(prev->path, stdout, '\n');
-       }
 
        commit_info_destroy(&ci);
 
@@ -1760,7 +1765,7 @@ static void found_guilty_entry(struct blame_entry *ent,
                       oid_to_hex(&suspect->commit->object.oid),
                       ent->s_lno + 1, ent->lno + 1, ent->num_lines);
                emit_one_suspect_detail(suspect, 0);
-               write_filename_info(suspect->path);
+               write_filename_info(suspect);
                maybe_flush_or_die(stdout, "stdout");
        }
        pi->blamed_lines += ent->num_lines;
@@ -1884,7 +1889,7 @@ static void emit_porcelain_details(struct origin *suspect, int repeat)
 {
        if (emit_one_suspect_detail(suspect, repeat) ||
            (suspect->commit->object.flags & MORE_THAN_ONE_PATH))
-               write_filename_info(suspect->path);
+               write_filename_info(suspect);
 }
 
 static void emit_porcelain(struct scoreboard *sb, struct blame_entry *ent,
@@ -1896,7 +1901,7 @@ static void emit_porcelain(struct scoreboard *sb, struct blame_entry *ent,
        struct origin *suspect = ent->suspect;
        char hex[GIT_SHA1_HEXSZ + 1];
 
-       sha1_to_hex_r(hex, suspect->commit->object.oid.hash);
+       oid_to_hex_r(hex, &suspect->commit->object.oid);
        printf("%s %d %d %d\n",
               hex,
               ent->s_lno + 1,
@@ -1936,7 +1941,7 @@ static void emit_other(struct scoreboard *sb, struct blame_entry *ent, int opt)
        int show_raw_time = !!(opt & OUTPUT_RAW_TIMESTAMP);
 
        get_commit_info(suspect->commit, &ci, 1);
-       sha1_to_hex_r(hex, suspect->commit->object.oid.hash);
+       oid_to_hex_r(hex, &suspect->commit->object.oid);
 
        cp = nth_line(sb, ent->lno);
        for (cnt = 0; cnt < ent->num_lines; cnt++) {
@@ -2596,8 +2601,7 @@ int cmd_blame(int argc, const char **argv, const char *prefix)
                 * and are only included here to get included in the "-h"
                 * output:
                 */
-               { OPTION_LOWLEVEL_CALLBACK, 0, "indent-heuristic", NULL, NULL, N_("Use an experimental indent-based heuristic to improve diffs"), PARSE_OPT_NOARG, parse_opt_unknown_cb },
-               { OPTION_LOWLEVEL_CALLBACK, 0, "compaction-heuristic", NULL, NULL, N_("Use an experimental blank-line-based heuristic to improve diffs"), PARSE_OPT_NOARG, parse_opt_unknown_cb },
+               { OPTION_LOWLEVEL_CALLBACK, 0, "indent-heuristic", NULL, NULL, N_("Use an experimental heuristic to improve diffs"), PARSE_OPT_NOARG, parse_opt_unknown_cb },
 
                OPT_BIT(0, "minimal", &xdl_opts, N_("Spend extra cycles to find better match"), XDF_NEED_MINIMAL),
                OPT_STRING('S', NULL, &revs_file, N_("file"), N_("Use revisions from <file> instead of calling git-rev-list")),
@@ -2645,7 +2649,7 @@ int cmd_blame(int argc, const char **argv, const char *prefix)
        }
 parse_done:
        no_whole_file_rename = !DIFF_OPT_TST(&revs.diffopt, FOLLOW_RENAMES);
-       xdl_opts |= revs.diffopt.xdl_opts & (XDF_COMPACTION_HEURISTIC | XDF_INDENT_HEURISTIC);
+       xdl_opts |= revs.diffopt.xdl_opts & XDF_INDENT_HEURISTIC;
        DIFF_OPT_CLR(&revs.diffopt, FOLLOW_RENAMES);
        argc = parse_options_end(&ctx);
 
@@ -2656,9 +2660,11 @@ int cmd_blame(int argc, const char **argv, const char *prefix)
        } else if (show_progress < 0)
                show_progress = isatty(2);
 
-       if (0 < abbrev)
+       if (0 < abbrev && abbrev < GIT_SHA1_HEXSZ)
                /* one more abbrev length is needed for the boundary commit */
                abbrev++;
+       else if (!abbrev)
+               abbrev = GIT_SHA1_HEXSZ;
 
        if (revs_file && read_ancestry(revs_file))
                die_errno("reading graft file '%s' failed", revs_file);
index 60cc5c8e8da08e628d05f245003bc558657f6237..9d30f55b0b83cfc09294e2cb7cabdc9aa72e2508 100644 (file)
@@ -512,15 +512,6 @@ static void print_ref_list(struct ref_filter *filter, struct ref_sorting *sortin
        if (filter->verbose)
                maxwidth = calc_maxwidth(&array, strlen(remote_prefix));
 
-       /*
-        * If no sorting parameter is given then we default to sorting
-        * by 'refname'. This would give us an alphabetically sorted
-        * array with the 'HEAD' ref at the beginning followed by
-        * local branches 'refs/heads/...' and finally remote-tacking
-        * branches 'refs/remotes/...'.
-        */
-       if (!sorting)
-               sorting = ref_default_sorting();
        ref_array_sort(sorting, &array);
 
        for (i = 0; i < array.nr; i++)
@@ -531,7 +522,7 @@ static void print_ref_list(struct ref_filter *filter, struct ref_sorting *sortin
 
 static void reject_rebase_or_bisect_branch(const char *target)
 {
-       struct worktree **worktrees = get_worktrees();
+       struct worktree **worktrees = get_worktrees(0);
        int i;
 
        for (i = 0; worktrees[i]; i++) {
@@ -645,6 +636,7 @@ int cmd_branch(int argc, const char **argv, const char *prefix)
        const char *new_upstream = NULL;
        enum branch_track track;
        struct ref_filter filter;
+       int icase = 0;
        static struct ref_sorting *sorting = NULL, **sorting_tail = &sorting;
 
        struct option options[] = {
@@ -686,6 +678,7 @@ int cmd_branch(int argc, const char **argv, const char *prefix)
                        OPTION_CALLBACK, 0, "points-at", &filter.points_at, N_("object"),
                        N_("print only branches of the object"), 0, parse_opt_object_name
                },
+               OPT_BOOL('i', "ignore-case", &icase, N_("sorting and filtering are case insensitive")),
                OPT_END(),
        };
 
@@ -723,6 +716,8 @@ int cmd_branch(int argc, const char **argv, const char *prefix)
 
        if (filter.abbrev == -1)
                filter.abbrev = DEFAULT_ABBREV;
+       filter.ignore_case = icase;
+
        finalize_colopts(&colopts, -1);
        if (filter.verbose) {
                if (explicitly_enable_column(colopts))
@@ -744,6 +739,16 @@ int cmd_branch(int argc, const char **argv, const char *prefix)
                if ((filter.kind & FILTER_REFS_BRANCHES) && filter.detached)
                        filter.kind |= FILTER_REFS_DETACHED_HEAD;
                filter.name_patterns = argv;
+               /*
+                * If no sorting parameter is given then we default to sorting
+                * by 'refname'. This would give us an alphabetically sorted
+                * array with the 'HEAD' ref at the beginning followed by
+                * local branches 'refs/heads/...' and finally remote-tacking
+                * branches 'refs/remotes/...'.
+                */
+               if (!sorting)
+                       sorting = ref_default_sorting();
+               sorting->ignore_case = icase;
                print_ref_list(&filter, sorting);
                print_columns(&output, colopts, NULL);
                string_list_clear(&output, 0);
index 30a49d9f424c0a1e04b321b5eb0a5e25462a53af..07631d0c9c59f6ba03f288294797e08cdfe22b7c 100644 (file)
@@ -205,7 +205,7 @@ int cmd_checkout_index(int argc, const char **argv, const char *prefix)
        if (index_opt && !state.base_dir_len && !to_tempfile) {
                state.refresh_cache = 1;
                state.istate = &the_index;
-               newfd = hold_locked_index(&lock_file, 1);
+               newfd = hold_locked_index(&lock_file, LOCK_DIE_ON_ERROR);
        }
 
        /* Check out named files first */
index 512492aad9099dd2a7aa85391b5c9a8e321c3bfe..f174f503033ea7f1274fc8f09c49c0ae378c9eee 100644 (file)
@@ -56,8 +56,8 @@ static int post_checkout_hook(struct commit *old, struct commit *new,
                              int changed)
 {
        return run_hook_le(NULL, "post-checkout",
-                          sha1_to_hex(old ? old->object.oid.hash : null_sha1),
-                          sha1_to_hex(new ? new->object.oid.hash : null_sha1),
+                          oid_to_hex(old ? &old->object.oid : &null_oid),
+                          oid_to_hex(new ? &new->object.oid : &null_oid),
                           changed ? "1" : "0", NULL);
        /* "new" can be NULL when checking out from the index before
           a commit exists. */
@@ -274,7 +274,7 @@ static int checkout_paths(const struct checkout_opts *opts,
 
        lock_file = xcalloc(1, sizeof(struct lock_file));
 
-       hold_locked_index(lock_file, 1);
+       hold_locked_index(lock_file, LOCK_DIE_ON_ERROR);
        if (read_cache_preload(&opts->pathspec) < 0)
                return error(_("index file corrupt"));
 
@@ -467,7 +467,7 @@ static int merge_working_tree(const struct checkout_opts *opts,
        int ret;
        struct lock_file *lock_file = xcalloc(1, sizeof(struct lock_file));
 
-       hold_locked_index(lock_file, 1);
+       hold_locked_index(lock_file, LOCK_DIE_ON_ERROR);
        if (read_cache_preload(NULL) < 0)
                return error(_("index file corrupt"));
 
@@ -612,22 +612,25 @@ static void update_refs_for_switch(const struct checkout_opts *opts,
        const char *old_desc, *reflog_msg;
        if (opts->new_branch) {
                if (opts->new_orphan_branch) {
-                       if (opts->new_branch_log && !log_all_ref_updates) {
+                       char *refname;
+
+                       refname = mkpathdup("refs/heads/%s", opts->new_orphan_branch);
+                       if (opts->new_branch_log &&
+                           !should_autocreate_reflog(refname)) {
                                int ret;
-                               char *refname;
                                struct strbuf err = STRBUF_INIT;
 
-                               refname = mkpathdup("refs/heads/%s", opts->new_orphan_branch);
                                ret = safe_create_reflog(refname, 1, &err);
-                               free(refname);
                                if (ret) {
                                        fprintf(stderr, _("Can not do reflog for '%s': %s\n"),
                                                opts->new_orphan_branch, err.buf);
                                        strbuf_release(&err);
+                                       free(refname);
                                        return;
                                }
                                strbuf_release(&err);
                        }
+                       free(refname);
                }
                else
                        create_branch(opts->new_branch, new->name,
index 0371010afbad54283ceca9883f2a9fbe6da4686b..d6bc3aaaea0dfdbac2386d54f4ff2d25dbccf7e6 100644 (file)
@@ -287,11 +287,11 @@ static void pretty_print_menus(struct string_list *menu_list)
 static void prompt_help_cmd(int singleton)
 {
        clean_print_color(CLEAN_COLOR_HELP);
-       printf_ln(singleton ?
+       printf(singleton ?
                  _("Prompt help:\n"
                    "1          - select a numbered item\n"
                    "foo        - select item based on unique prefix\n"
-                   "           - (empty) select nothing") :
+                   "           - (empty) select nothing\n") :
                  _("Prompt help:\n"
                    "1          - select a single item\n"
                    "3-5        - select a range of items\n"
@@ -299,7 +299,7 @@ static void prompt_help_cmd(int singleton)
                    "foo        - select item based on unique prefix\n"
                    "-...       - unselect specified items\n"
                    "*          - choose all items\n"
-                   "           - (empty) finish selecting"));
+                   "           - (empty) finish selecting\n"));
        clean_print_color(CLEAN_COLOR_RESET);
 }
 
@@ -508,7 +508,7 @@ static int parse_choice(struct menu_stuff *menu_stuff,
                if (top <= 0 || bottom <= 0 || top > menu_stuff->nr || bottom > top ||
                    (is_single && bottom != top)) {
                        clean_print_color(CLEAN_COLOR_ERROR);
-                       printf_ln(_("Huh (%s)?"), (*ptr)->buf);
+                       printf(_("Huh (%s)?\n"), (*ptr)->buf);
                        clean_print_color(CLEAN_COLOR_RESET);
                        continue;
                }
@@ -774,7 +774,7 @@ static int ask_each_cmd(void)
 static int quit_cmd(void)
 {
        string_list_clear(&del_list, 0);
-       printf_ln(_("Bye."));
+       printf(_("Bye.\n"));
        return MENU_RETURN_NO_LOOP;
 }
 
index 6c76a6ed66fef567ca06e3e864b37fc3bed151d5..3f63edbbf94fdf83307621ed822722e5c9f89321 100644 (file)
@@ -99,7 +99,7 @@ static struct option builtin_clone_options[] = {
        OPT_STRING(0, "shallow-since", &option_since, N_("time"),
                    N_("create a shallow clone since a specific time")),
        OPT_STRING_LIST(0, "shallow-exclude", &option_not, N_("revision"),
-                       N_("deepen history of shallow clone by excluding rev")),
+                       N_("deepen history of shallow clone, excluding rev")),
        OPT_BOOL(0, "single-branch", &option_single_branch,
                    N_("clone only one branch, HEAD or --branch")),
        OPT_BOOL(0, "shallow-submodules", &option_shallow_submodules,
@@ -170,7 +170,7 @@ static char *get_repo_path(const char *repo, int *is_bundle)
 
        strbuf_addstr(&path, repo);
        raw = get_repo_path_1(&path, is_bundle);
-       canon = raw ? xstrdup(absolute_path(raw)) : NULL;
+       canon = raw ? absolute_pathdup(raw) : NULL;
        strbuf_release(&path);
        return canon;
 }
@@ -711,7 +711,7 @@ static int checkout(int submodule_progress)
        setup_work_tree();
 
        lock_file = xcalloc(1, sizeof(struct lock_file));
-       hold_locked_index(lock_file, 1);
+       hold_locked_index(lock_file, LOCK_DIE_ON_ERROR);
 
        memset(&opts, 0, sizeof opts);
        opts.update = 1;
@@ -894,7 +894,7 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
 
        path = get_repo_path(repo_name, &is_bundle);
        if (path)
-               repo = xstrdup(absolute_path(repo_name));
+               repo = absolute_pathdup(repo_name);
        else if (!strchr(repo_name, ':'))
                die(_("repository '%s' does not exist"), repo_name);
        else
index 8976c3d29bf817be789f983697f7052fe5769f39..2de5f6cc6401b48852d8174edcbf4e149cbe51cf 100644 (file)
@@ -351,7 +351,7 @@ static const char *prepare_index(int argc, const char **argv, const char *prefix
 
        if (interactive) {
                char *old_index_env = NULL;
-               hold_locked_index(&index_lock, 1);
+               hold_locked_index(&index_lock, LOCK_DIE_ON_ERROR);
 
                refresh_cache_or_die(refresh_flags);
 
@@ -396,7 +396,7 @@ static const char *prepare_index(int argc, const char **argv, const char *prefix
         * (B) on failure, rollback the real index.
         */
        if (all || (also && pathspec.nr)) {
-               hold_locked_index(&index_lock, 1);
+               hold_locked_index(&index_lock, LOCK_DIE_ON_ERROR);
                add_files_to_cache(also ? prefix : NULL, &pathspec, 0);
                refresh_cache_or_die(refresh_flags);
                update_main_cache_tree(WRITE_TREE_SILENT);
@@ -416,7 +416,7 @@ static const char *prepare_index(int argc, const char **argv, const char *prefix
         * We still need to refresh the index here.
         */
        if (!only && !pathspec.nr) {
-               hold_locked_index(&index_lock, 1);
+               hold_locked_index(&index_lock, LOCK_DIE_ON_ERROR);
                refresh_cache_or_die(refresh_flags);
                if (active_cache_changed
                    || !cache_tree_fully_valid(active_cache_tree))
@@ -468,7 +468,7 @@ static const char *prepare_index(int argc, const char **argv, const char *prefix
        if (read_cache() < 0)
                die(_("cannot read the index"));
 
-       hold_locked_index(&index_lock, 1);
+       hold_locked_index(&index_lock, LOCK_DIE_ON_ERROR);
        add_remove_files(&partial);
        refresh_cache(REFRESH_QUIET);
        update_main_cache_tree(WRITE_TREE_SILENT);
@@ -790,7 +790,7 @@ static int prepare_to_commit(const char *index_file, const char *prefix,
                strbuf_stripspace(&sb, 0);
 
        if (signoff)
-               append_signoff(&sb, ignore_non_trailer(&sb), 0);
+               append_signoff(&sb, ignore_non_trailer(sb.buf, sb.len), 0);
 
        if (fwrite(sb.buf, 1, sb.len, s->fp) < sb.len)
                die_errno(_("could not write commit template"));
@@ -960,15 +960,15 @@ static int prepare_to_commit(const char *index_file, const char *prefix,
                return 0;
 
        if (use_editor) {
-               char index[PATH_MAX];
-               const char *env[2] = { NULL };
-               env[0] =  index;
-               snprintf(index, sizeof(index), "GIT_INDEX_FILE=%s", index_file);
-               if (launch_editor(git_path_commit_editmsg(), NULL, env)) {
+               struct argv_array env = ARGV_ARRAY_INIT;
+
+               argv_array_pushf(&env, "GIT_INDEX_FILE=%s", index_file);
+               if (launch_editor(git_path_commit_editmsg(), NULL, env.argv)) {
                        fprintf(stderr,
                        _("Please supply the message using either -m or -F option.\n"));
                        exit(1);
                }
+               argv_array_clear(&env);
        }
 
        if (!no_verify &&
@@ -1206,10 +1206,8 @@ static int parse_and_validate_options(int argc, const char *argv[],
 
        if (also + only + all + interactive > 1)
                die(_("Only one of --include/--only/--all/--interactive/--patch can be used."));
-       if (argc == 0 && (also || (only && !amend)))
+       if (argc == 0 && (also || (only && !amend && !allow_empty)))
                die(_("No paths with --include/--only does not make sense."));
-       if (argc == 0 && only && amend)
-               only_include_assumed = _("Clever... amending the last one with dirty index.");
        if (argc > 0 && !also && !only)
                only_include_assumed = _("Explicit paths specified without -i or -o; assuming --only paths...");
        if (!cleanup_arg || !strcmp(cleanup_arg, "default"))
@@ -1527,12 +1525,10 @@ static int git_commit_config(const char *k, const char *v, void *cb)
 static int run_rewrite_hook(const unsigned char *oldsha1,
                            const unsigned char *newsha1)
 {
-       /* oldsha1 SP newsha1 LF NUL */
-       static char buf[2*40 + 3];
        struct child_process proc = CHILD_PROCESS_INIT;
        const char *argv[3];
        int code;
-       size_t n;
+       struct strbuf sb = STRBUF_INIT;
 
        argv[0] = find_hook("post-rewrite");
        if (!argv[0])
@@ -1548,34 +1544,33 @@ static int run_rewrite_hook(const unsigned char *oldsha1,
        code = start_command(&proc);
        if (code)
                return code;
-       n = snprintf(buf, sizeof(buf), "%s %s\n",
-                    sha1_to_hex(oldsha1), sha1_to_hex(newsha1));
+       strbuf_addf(&sb, "%s %s\n", sha1_to_hex(oldsha1), sha1_to_hex(newsha1));
        sigchain_push(SIGPIPE, SIG_IGN);
-       write_in_full(proc.in, buf, n);
+       write_in_full(proc.in, sb.buf, sb.len);
        close(proc.in);
+       strbuf_release(&sb);
        sigchain_pop(SIGPIPE);
        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];
+       struct argv_array hook_env = ARGV_ARRAY_INIT;
        va_list args;
        int ret;
 
-       snprintf(index, sizeof(index), "GIT_INDEX_FILE=%s", index_file);
-       hook_env[0] = index;
+       argv_array_pushf(&hook_env, "GIT_INDEX_FILE=%s", index_file);
 
        /*
         * Let the hook know that no editor will be launched.
         */
        if (!editor_is_used)
-               hook_env[1] = "GIT_EDITOR=:";
+               argv_array_push(&hook_env, "GIT_EDITOR=:");
 
        va_start(args, name);
-       ret = run_hook_ve(hook_envname, args);
+       ret = run_hook_ve(hook_env.argv,name, args);
        va_end(args);
+       argv_array_clear(&hook_env);
 
        return ret;
 }
index b6a5597cbf332fc56b5feabfd29d03c98d4d6686..b5ad09d0460cc7a51f35a56a4304e6a1fb26d26e 100644 (file)
@@ -122,7 +122,7 @@ static struct option builtin_fetch_options[] = {
        OPT_STRING(0, "shallow-since", &deepen_since, N_("time"),
                   N_("deepen history of shallow repository based on time")),
        OPT_STRING_LIST(0, "shallow-exclude", &deepen_not, N_("revision"),
-                       N_("deepen history of shallow clone by excluding rev")),
+                       N_("deepen history of shallow clone, excluding rev")),
        OPT_INTEGER(0, "deepen", &deepen_relative,
                    N_("deepen history of shallow clone")),
        { OPTION_SET_INT, 0, "unshallow", &unshallow, NULL,
@@ -359,9 +359,6 @@ static struct ref *get_ref_map(struct transport *transport,
 
                for (i = 0; i < fetch_refspec_nr; i++)
                        get_fetch_map(ref_map, &fetch_refspec[i], &oref_tail, 1);
-
-               if (tags == TAGS_SET)
-                       get_fetch_map(remote_refs, tag_refspec, &tail, 0);
        } else if (refmap_array) {
                die("--refmap option is only meaningful with command-line refspec(s).");
        } else {
@@ -1180,7 +1177,7 @@ static int add_remote_or_group(const char *name, struct string_list *list)
        git_config(get_remote_group, &g);
        if (list->nr == prev_nr) {
                struct remote *remote = remote_get(name);
-               if (!remote_is_configured(remote))
+               if (!remote_is_configured(remote, 0))
                        return 0;
                string_list_append(list, remote->name);
        }
index 4e9f6c29bf1e0c1cc7b44548f49077c2e4a81ec8..df41fa035004e1cf8a0c7c9ff09081a47b944f38 100644 (file)
@@ -18,7 +18,7 @@ int cmd_for_each_ref(int argc, const char **argv, const char *prefix)
        int i;
        const char *format = "%(objectname) %(objecttype)\t%(refname)";
        struct ref_sorting *sorting = NULL, **sorting_tail = &sorting;
-       int maxcount = 0, quote_style = 0;
+       int maxcount = 0, quote_style = 0, icase = 0;
        struct ref_array array;
        struct ref_filter filter;
 
@@ -43,6 +43,7 @@ int cmd_for_each_ref(int argc, const char **argv, const char *prefix)
                OPT_MERGED(&filter, N_("print only refs that are merged")),
                OPT_NO_MERGED(&filter, N_("print only refs that are not merged")),
                OPT_CONTAINS(&filter.with_commit, N_("print only refs which contain the commit")),
+               OPT_BOOL(0, "ignore-case", &icase, N_("sorting and filtering are case insensitive")),
                OPT_END(),
        };
 
@@ -63,6 +64,8 @@ int cmd_for_each_ref(int argc, const char **argv, const char *prefix)
 
        if (!sorting)
                sorting = ref_default_sorting();
+       sorting->ignore_case = icase;
+       filter.ignore_case = icase;
 
        /* for warn_ambiguous_refs */
        git_config(git_default_config, NULL);
index f01b81eebfebc1c221e81c44e3f14a4e2781f0a7..1a5caccd0f5ee3fa56af06e8f536271f58312665 100644 (file)
@@ -56,6 +56,23 @@ static const char *describe_object(struct object *obj)
        return buf.buf;
 }
 
+static const char *printable_type(struct object *obj)
+{
+       const char *ret;
+
+       if (obj->type == OBJ_NONE) {
+               enum object_type type = sha1_object_info(obj->oid.hash, NULL);
+               if (type > 0)
+                       object_as_type(obj, type, 0);
+       }
+
+       ret = typename(obj->type);
+       if (!ret)
+               ret = "unknown";
+
+       return ret;
+}
+
 static int fsck_config(const char *var, const char *value, void *cb)
 {
        if (strcmp(var, "fsck.skiplist") == 0) {
@@ -83,7 +100,7 @@ static void objreport(struct object *obj, const char *msg_type,
                        const char *err)
 {
        fprintf(stderr, "%s in %s %s: %s\n",
-               msg_type, typename(obj->type), describe_object(obj), err);
+               msg_type, printable_type(obj), describe_object(obj), err);
 }
 
 static int objerror(struct object *obj, const char *err)
@@ -114,7 +131,7 @@ static int mark_object(struct object *obj, int type, void *data, struct fsck_opt
        if (!obj) {
                /* ... these references to parent->fld are safe here */
                printf("broken link from %7s %s\n",
-                          typename(parent->type), describe_object(parent));
+                          printable_type(parent), describe_object(parent));
                printf("broken link from %7s %s\n",
                           (type == OBJ_ANY ? "unknown" : typename(type)), "unknown");
                errors_found |= ERROR_REACHABLE;
@@ -131,9 +148,9 @@ static int mark_object(struct object *obj, int type, void *data, struct fsck_opt
        if (!(obj->flags & HAS_OBJ)) {
                if (parent && !has_object_file(&obj->oid)) {
                        printf("broken link from %7s %s\n",
-                                typename(parent->type), describe_object(parent));
+                                printable_type(parent), describe_object(parent));
                        printf("              to %7s %s\n",
-                                typename(obj->type), describe_object(obj));
+                                printable_type(obj), describe_object(obj));
                        errors_found |= ERROR_REACHABLE;
                }
                return 1;
@@ -205,9 +222,7 @@ static void check_reachable_object(struct object *obj)
        if (!(obj->flags & HAS_OBJ)) {
                if (has_sha1_pack(obj->oid.hash))
                        return; /* it is in pack - forget about it */
-               if (connectivity_only && has_object_file(&obj->oid))
-                       return;
-               printf("missing %s %s\n", typename(obj->type),
+               printf("missing %s %s\n", printable_type(obj),
                        describe_object(obj));
                errors_found |= ERROR_REACHABLE;
                return;
@@ -225,7 +240,7 @@ static void check_unreachable_object(struct object *obj)
         * to complain about it being unreachable (since it does
         * not exist).
         */
-       if (!obj->parsed)
+       if (!(obj->flags & HAS_OBJ))
                return;
 
        /*
@@ -233,7 +248,7 @@ static void check_unreachable_object(struct object *obj)
         * since this is something that is prunable.
         */
        if (show_unreachable) {
-               printf("unreachable %s %s\n", typename(obj->type),
+               printf("unreachable %s %s\n", printable_type(obj),
                        describe_object(obj));
                return;
        }
@@ -252,7 +267,7 @@ static void check_unreachable_object(struct object *obj)
         */
        if (!obj->used) {
                if (show_dangling)
-                       printf("dangling %s %s\n", typename(obj->type),
+                       printf("dangling %s %s\n", printable_type(obj),
                               describe_object(obj));
                if (write_lost_and_found) {
                        char *filename = git_pathdup("lost-found/%s/%s",
@@ -326,7 +341,7 @@ static int fsck_obj(struct object *obj)
 
        if (verbose)
                fprintf(stderr, "Checking %s %s\n",
-                       typename(obj->type), describe_object(obj));
+                       printable_type(obj), describe_object(obj));
 
        if (fsck_walk(obj, NULL, &fsck_obj_options))
                objerror(obj, "broken links");
@@ -352,7 +367,7 @@ static int fsck_obj(struct object *obj)
                struct tag *tag = (struct tag *) obj;
 
                if (show_tags && tag->tagged) {
-                       printf("tagged %s %s", typename(tag->tagged->type),
+                       printf("tagged %s %s", printable_type(tag->tagged),
                                describe_object(tag->tagged));
                        printf(" (%s) in %s\n", tag->tag,
                                describe_object(&tag->object));
@@ -362,18 +377,6 @@ static int fsck_obj(struct object *obj)
        return 0;
 }
 
-static int fsck_sha1(const unsigned char *sha1)
-{
-       struct object *obj = parse_object(sha1);
-       if (!obj) {
-               errors_found |= ERROR_OBJECT;
-               return error("%s: object corrupt or missing",
-                            sha1_to_hex(sha1));
-       }
-       obj->flags |= HAS_OBJ;
-       return fsck_obj(obj);
-}
-
 static int fsck_obj_buffer(const unsigned char *sha1, enum object_type type,
                           unsigned long size, void *buffer, int *eaten)
 {
@@ -400,7 +403,7 @@ static void fsck_handle_reflog_sha1(const char *refname, unsigned char *sha1,
 
        if (!is_null_sha1(sha1)) {
                obj = lookup_object(sha1);
-               if (obj) {
+               if (obj && (obj->flags & HAS_OBJ)) {
                        if (timestamp && name_objects)
                                add_decoration(fsck_walk_options.object_names,
                                        obj,
@@ -488,9 +491,41 @@ static void get_default_heads(void)
        }
 }
 
+static struct object *parse_loose_object(const unsigned char *sha1,
+                                        const char *path)
+{
+       struct object *obj;
+       void *contents;
+       enum object_type type;
+       unsigned long size;
+       int eaten;
+
+       if (read_loose_object(path, sha1, &type, &size, &contents) < 0)
+               return NULL;
+
+       if (!contents && type != OBJ_BLOB)
+               die("BUG: read_loose_object streamed a non-blob");
+
+       obj = parse_object_buffer(sha1, type, size, contents, &eaten);
+
+       if (!eaten)
+               free(contents);
+       return obj;
+}
+
 static int fsck_loose(const unsigned char *sha1, const char *path, void *data)
 {
-       if (fsck_sha1(sha1))
+       struct object *obj = parse_loose_object(sha1, path);
+
+       if (!obj) {
+               errors_found |= ERROR_OBJECT;
+               error("%s: object corrupt or missing: %s",
+                     sha1_to_hex(sha1), path);
+               return 0; /* keep checking other objects */
+       }
+
+       obj->flags = HAS_OBJ;
+       if (fsck_obj(obj))
                errors_found |= ERROR_OBJECT;
        return 0;
 }
@@ -584,6 +619,29 @@ static int fsck_cache_tree(struct cache_tree *it)
        return err;
 }
 
+static void mark_object_for_connectivity(const unsigned char *sha1)
+{
+       struct object *obj = lookup_unknown_object(sha1);
+       obj->flags |= HAS_OBJ;
+}
+
+static int mark_loose_for_connectivity(const unsigned char *sha1,
+                                      const char *path,
+                                      void *data)
+{
+       mark_object_for_connectivity(sha1);
+       return 0;
+}
+
+static int mark_packed_for_connectivity(const unsigned char *sha1,
+                                       struct packed_git *pack,
+                                       uint32_t pos,
+                                       void *data)
+{
+       mark_object_for_connectivity(sha1);
+       return 0;
+}
+
 static char const * const fsck_usage[] = {
        N_("git fsck [<options>] [<object>...]"),
        NULL
@@ -640,38 +698,41 @@ int cmd_fsck(int argc, const char **argv, const char *prefix)
        git_config(fsck_config, NULL);
 
        fsck_head_link();
-       if (!connectivity_only) {
+       if (connectivity_only) {
+               for_each_loose_object(mark_loose_for_connectivity, NULL, 0);
+               for_each_packed_object(mark_packed_for_connectivity, NULL, 0);
+       } else {
                fsck_object_dir(get_object_directory());
 
                prepare_alt_odb();
                for (alt = alt_odb_list; alt; alt = alt->next)
                        fsck_object_dir(alt->path);
-       }
 
-       if (check_full) {
-               struct packed_git *p;
-               uint32_t total = 0, count = 0;
-               struct progress *progress = NULL;
+               if (check_full) {
+                       struct packed_git *p;
+                       uint32_t total = 0, count = 0;
+                       struct progress *progress = NULL;
 
-               prepare_packed_git();
+                       prepare_packed_git();
 
-               if (show_progress) {
+                       if (show_progress) {
+                               for (p = packed_git; p; p = p->next) {
+                                       if (open_pack_index(p))
+                                               continue;
+                                       total += p->num_objects;
+                               }
+
+                               progress = start_progress(_("Checking objects"), total);
+                       }
                        for (p = packed_git; p; p = p->next) {
-                               if (open_pack_index(p))
-                                       continue;
-                               total += p->num_objects;
+                               /* verify gives error messages itself */
+                               if (verify_pack(p, fsck_obj_buffer,
+                                               progress, count))
+                                       errors_found |= ERROR_PACK;
+                               count += p->num_objects;
                        }
-
-                       progress = start_progress(_("Checking objects"), total);
+                       stop_progress(&progress);
                }
-               for (p = packed_git; p; p = p->next) {
-                       /* verify gives error messages itself */
-                       if (verify_pack(p, fsck_obj_buffer,
-                                       progress, count))
-                               errors_found |= ERROR_PACK;
-                       count += p->num_objects;
-               }
-               stop_progress(&progress);
        }
 
        heads = 0;
@@ -681,9 +742,11 @@ int cmd_fsck(int argc, const char **argv, const char *prefix)
                if (!get_sha1(arg, sha1)) {
                        struct object *obj = lookup_object(sha1);
 
-                       /* Error is printed by lookup_object(). */
-                       if (!obj)
+                       if (!obj || !(obj->flags & HAS_OBJ)) {
+                               error("%s: object missing", sha1_to_hex(sha1));
+                               errors_found |= ERROR_OBJECT;
                                continue;
+                       }
 
                        obj->used = 1;
                        if (name_objects)
@@ -694,6 +757,7 @@ int cmd_fsck(int argc, const char **argv, const char *prefix)
                        continue;
                }
                error("invalid parameter: expected sha1, got '%s'", arg);
+               errors_found |= ERROR_OBJECT;
        }
 
        /*
@@ -701,7 +765,7 @@ int cmd_fsck(int argc, const char **argv, const char *prefix)
         * default ones from .git/refs. We also consider the index file
         * in this case (ie this implies --cache).
         */
-       if (!heads) {
+       if (!argc) {
                get_default_heads();
                keep_cache_objects = 1;
        }
index 069950d0b417f5eb97cd756ae32df7a2fb13abce..331f2192607a4f7657750f4592193e6c0b8cea55 100644 (file)
@@ -191,6 +191,11 @@ static void add_repack_all_option(void)
        }
 }
 
+static void add_repack_incremental_option(void)
+{
+       argv_array_push(&repack, "--no-write-bitmap-index");
+}
+
 static int need_to_gc(void)
 {
        /*
@@ -208,7 +213,9 @@ static int need_to_gc(void)
         */
        if (too_many_packs())
                add_repack_all_option();
-       else if (!too_many_loose_objects())
+       else if (too_many_loose_objects())
+               add_repack_incremental_option();
+       else
                return 0;
 
        if (run_hook_le(NULL, "pre-auto-gc", NULL))
index 8887b6addb5f9085dd9ed46a9e5ad81768c551cb..2c727ef499c0fa7b44c0cf1890cc44427dc8921f 100644 (file)
 #include "quote.h"
 #include "dir.h"
 #include "pathspec.h"
+#include "submodule.h"
+#include "submodule-config.h"
 
 static char const * const grep_usage[] = {
        N_("git grep [<options>] [-e] <pattern> [<rev>...] [[--] <path>...]"),
        NULL
 };
 
+static const char *super_prefix;
+static int recurse_submodules;
+static struct argv_array submodule_options = ARGV_ARRAY_INIT;
+static const char *parent_basename;
+
+static int grep_submodule_launch(struct grep_opt *opt,
+                                const struct grep_source *gs);
+
 #define GREP_NUM_THREADS_DEFAULT 8
 static int num_threads;
 
@@ -174,7 +184,10 @@ static void *run(void *arg)
                        break;
 
                opt->output_priv = w;
-               hit |= grep_source(opt, &w->source);
+               if (w->source.type == GREP_SOURCE_SUBMODULE)
+                       hit |= grep_submodule_launch(opt, &w->source);
+               else
+                       hit |= grep_source(opt, &w->source);
                grep_source_clear_data(&w->source);
                work_done(w);
        }
@@ -300,6 +313,10 @@ static int grep_sha1(struct grep_opt *opt, const unsigned char *sha1,
        if (opt->relative && opt->prefix_length) {
                quote_path_relative(filename + tree_name_len, opt->prefix, &pathbuf);
                strbuf_insert(&pathbuf, 0, filename, tree_name_len);
+       } else if (super_prefix) {
+               strbuf_add(&pathbuf, filename, tree_name_len);
+               strbuf_addstr(&pathbuf, super_prefix);
+               strbuf_addstr(&pathbuf, filename + tree_name_len);
        } else {
                strbuf_addstr(&pathbuf, filename);
        }
@@ -328,10 +345,13 @@ static int grep_file(struct grep_opt *opt, const char *filename)
 {
        struct strbuf buf = STRBUF_INIT;
 
-       if (opt->relative && opt->prefix_length)
+       if (opt->relative && opt->prefix_length) {
                quote_path_relative(filename, opt->prefix, &buf);
-       else
+       } else {
+               if (super_prefix)
+                       strbuf_addstr(&buf, super_prefix);
                strbuf_addstr(&buf, filename);
+       }
 
 #ifndef NO_PTHREADS
        if (num_threads) {
@@ -378,31 +398,310 @@ static void run_pager(struct grep_opt *opt, const char *prefix)
                exit(status);
 }
 
-static int grep_cache(struct grep_opt *opt, const struct pathspec *pathspec, int cached)
+static void compile_submodule_options(const struct grep_opt *opt,
+                                     const struct pathspec *pathspec,
+                                     int cached, int untracked,
+                                     int opt_exclude, int use_index,
+                                     int pattern_type_arg)
+{
+       struct grep_pat *pattern;
+       int i;
+
+       if (recurse_submodules)
+               argv_array_push(&submodule_options, "--recurse-submodules");
+
+       if (cached)
+               argv_array_push(&submodule_options, "--cached");
+       if (!use_index)
+               argv_array_push(&submodule_options, "--no-index");
+       if (untracked)
+               argv_array_push(&submodule_options, "--untracked");
+       if (opt_exclude > 0)
+               argv_array_push(&submodule_options, "--exclude-standard");
+
+       if (opt->invert)
+               argv_array_push(&submodule_options, "-v");
+       if (opt->ignore_case)
+               argv_array_push(&submodule_options, "-i");
+       if (opt->word_regexp)
+               argv_array_push(&submodule_options, "-w");
+       switch (opt->binary) {
+       case GREP_BINARY_NOMATCH:
+               argv_array_push(&submodule_options, "-I");
+               break;
+       case GREP_BINARY_TEXT:
+               argv_array_push(&submodule_options, "-a");
+               break;
+       default:
+               break;
+       }
+       if (opt->allow_textconv)
+               argv_array_push(&submodule_options, "--textconv");
+       if (opt->max_depth != -1)
+               argv_array_pushf(&submodule_options, "--max-depth=%d",
+                                opt->max_depth);
+       if (opt->linenum)
+               argv_array_push(&submodule_options, "-n");
+       if (!opt->pathname)
+               argv_array_push(&submodule_options, "-h");
+       if (!opt->relative)
+               argv_array_push(&submodule_options, "--full-name");
+       if (opt->name_only)
+               argv_array_push(&submodule_options, "-l");
+       if (opt->unmatch_name_only)
+               argv_array_push(&submodule_options, "-L");
+       if (opt->null_following_name)
+               argv_array_push(&submodule_options, "-z");
+       if (opt->count)
+               argv_array_push(&submodule_options, "-c");
+       if (opt->file_break)
+               argv_array_push(&submodule_options, "--break");
+       if (opt->heading)
+               argv_array_push(&submodule_options, "--heading");
+       if (opt->pre_context)
+               argv_array_pushf(&submodule_options, "--before-context=%d",
+                                opt->pre_context);
+       if (opt->post_context)
+               argv_array_pushf(&submodule_options, "--after-context=%d",
+                                opt->post_context);
+       if (opt->funcname)
+               argv_array_push(&submodule_options, "-p");
+       if (opt->funcbody)
+               argv_array_push(&submodule_options, "-W");
+       if (opt->all_match)
+               argv_array_push(&submodule_options, "--all-match");
+       if (opt->debug)
+               argv_array_push(&submodule_options, "--debug");
+       if (opt->status_only)
+               argv_array_push(&submodule_options, "-q");
+
+       switch (pattern_type_arg) {
+       case GREP_PATTERN_TYPE_BRE:
+               argv_array_push(&submodule_options, "-G");
+               break;
+       case GREP_PATTERN_TYPE_ERE:
+               argv_array_push(&submodule_options, "-E");
+               break;
+       case GREP_PATTERN_TYPE_FIXED:
+               argv_array_push(&submodule_options, "-F");
+               break;
+       case GREP_PATTERN_TYPE_PCRE:
+               argv_array_push(&submodule_options, "-P");
+               break;
+       case GREP_PATTERN_TYPE_UNSPECIFIED:
+               break;
+       }
+
+       for (pattern = opt->pattern_list; pattern != NULL;
+            pattern = pattern->next) {
+               switch (pattern->token) {
+               case GREP_PATTERN:
+                       argv_array_pushf(&submodule_options, "-e%s",
+                                        pattern->pattern);
+                       break;
+               case GREP_AND:
+               case GREP_OPEN_PAREN:
+               case GREP_CLOSE_PAREN:
+               case GREP_NOT:
+               case GREP_OR:
+                       argv_array_push(&submodule_options, pattern->pattern);
+                       break;
+               /* BODY and HEAD are not used by git-grep */
+               case GREP_PATTERN_BODY:
+               case GREP_PATTERN_HEAD:
+                       break;
+               }
+       }
+
+       /*
+        * Limit number of threads for child process to use.
+        * This is to prevent potential fork-bomb behavior of git-grep as each
+        * submodule process has its own thread pool.
+        */
+       argv_array_pushf(&submodule_options, "--threads=%d",
+                        (num_threads + 1) / 2);
+
+       /* Add Pathspecs */
+       argv_array_push(&submodule_options, "--");
+       for (i = 0; i < pathspec->nr; i++)
+               argv_array_push(&submodule_options,
+                               pathspec->items[i].original);
+}
+
+/*
+ * Launch child process to grep contents of a submodule
+ */
+static int grep_submodule_launch(struct grep_opt *opt,
+                                const struct grep_source *gs)
+{
+       struct child_process cp = CHILD_PROCESS_INIT;
+       int status, i;
+       const char *end_of_base;
+       const char *name;
+       struct work_item *w = opt->output_priv;
+
+       end_of_base = strchr(gs->name, ':');
+       if (gs->identifier && end_of_base)
+               name = end_of_base + 1;
+       else
+               name = gs->name;
+
+       prepare_submodule_repo_env(&cp.env_array);
+       argv_array_push(&cp.env_array, GIT_DIR_ENVIRONMENT);
+
+       /* Add super prefix */
+       argv_array_pushf(&cp.args, "--super-prefix=%s%s/",
+                        super_prefix ? super_prefix : "",
+                        name);
+       argv_array_push(&cp.args, "grep");
+
+       /*
+        * Add basename of parent project
+        * When performing grep on a tree object the filename is prefixed
+        * with the object's name: 'tree-name:filename'.  In order to
+        * provide uniformity of output we want to pass the name of the
+        * parent project's object name to the submodule so the submodule can
+        * prefix its output with the parent's name and not its own SHA1.
+        */
+       if (gs->identifier && end_of_base)
+               argv_array_pushf(&cp.args, "--parent-basename=%.*s",
+                                (int) (end_of_base - gs->name),
+                                gs->name);
+
+       /* Add options */
+       for (i = 0; i < submodule_options.argc; i++) {
+               /*
+                * If there is a tree identifier for the submodule, add the
+                * rev after adding the submodule options but before the
+                * pathspecs.  To do this we listen for the '--' and insert the
+                * sha1 before pushing the '--' onto the child process argv
+                * array.
+                */
+               if (gs->identifier &&
+                   !strcmp("--", submodule_options.argv[i])) {
+                       argv_array_push(&cp.args, sha1_to_hex(gs->identifier));
+               }
+
+               argv_array_push(&cp.args, submodule_options.argv[i]);
+       }
+
+       cp.git_cmd = 1;
+       cp.dir = gs->path;
+
+       /*
+        * Capture output to output buffer and check the return code from the
+        * child process.  A '0' indicates a hit, a '1' indicates no hit and
+        * anything else is an error.
+        */
+       status = capture_command(&cp, &w->out, 0);
+       if (status && (status != 1)) {
+               /* flush the buffer */
+               write_or_die(1, w->out.buf, w->out.len);
+               die("process for submodule '%s' failed with exit code: %d",
+                   gs->name, status);
+       }
+
+       /* invert the return code to make a hit equal to 1 */
+       return !status;
+}
+
+/*
+ * Prep grep structures for a submodule grep
+ * sha1: the sha1 of the submodule or NULL if using the working tree
+ * filename: name of the submodule including tree name of parent
+ * path: location of the submodule
+ */
+static int grep_submodule(struct grep_opt *opt, const unsigned char *sha1,
+                         const char *filename, const char *path)
+{
+       if (!is_submodule_initialized(path))
+               return 0;
+       if (!is_submodule_populated(path)) {
+               /*
+                * If searching history, check for the presense of the
+                * submodule's gitdir before skipping the submodule.
+                */
+               if (sha1) {
+                       const struct submodule *sub =
+                                       submodule_from_path(null_sha1, path);
+                       if (sub)
+                               path = git_path("modules/%s", sub->name);
+
+                       if (!(is_directory(path) && is_git_directory(path)))
+                               return 0;
+               } else {
+                       return 0;
+               }
+       }
+
+#ifndef NO_PTHREADS
+       if (num_threads) {
+               add_work(opt, GREP_SOURCE_SUBMODULE, filename, path, sha1);
+               return 0;
+       } else
+#endif
+       {
+               struct work_item w;
+               int hit;
+
+               grep_source_init(&w.source, GREP_SOURCE_SUBMODULE,
+                                filename, path, sha1);
+               strbuf_init(&w.out, 0);
+               opt->output_priv = &w;
+               hit = grep_submodule_launch(opt, &w.source);
+
+               write_or_die(1, w.out.buf, w.out.len);
+
+               grep_source_clear(&w.source);
+               strbuf_release(&w.out);
+               return hit;
+       }
+}
+
+static int grep_cache(struct grep_opt *opt, const struct pathspec *pathspec,
+                     int cached)
 {
        int hit = 0;
        int nr;
+       struct strbuf name = STRBUF_INIT;
+       int name_base_len = 0;
+       if (super_prefix) {
+               name_base_len = strlen(super_prefix);
+               strbuf_addstr(&name, super_prefix);
+       }
+
        read_cache();
 
        for (nr = 0; nr < active_nr; nr++) {
                const struct cache_entry *ce = active_cache[nr];
-               if (!S_ISREG(ce->ce_mode))
-                       continue;
-               if (!ce_path_match(ce, pathspec, NULL))
+               strbuf_setlen(&name, name_base_len);
+               strbuf_addstr(&name, ce->name);
+
+               if (S_ISREG(ce->ce_mode) &&
+                   match_pathspec(pathspec, name.buf, name.len, 0, NULL,
+                                  S_ISDIR(ce->ce_mode) ||
+                                  S_ISGITLINK(ce->ce_mode))) {
+                       /*
+                        * If CE_VALID is on, we assume worktree file and its
+                        * cache entry are identical, even if worktree file has
+                        * been modified, so use cache version instead
+                        */
+                       if (cached || (ce->ce_flags & CE_VALID) ||
+                           ce_skip_worktree(ce)) {
+                               if (ce_stage(ce) || ce_intent_to_add(ce))
+                                       continue;
+                               hit |= grep_sha1(opt, ce->oid.hash, ce->name,
+                                                0, ce->name);
+                       } else {
+                               hit |= grep_file(opt, ce->name);
+                       }
+               } else if (recurse_submodules && S_ISGITLINK(ce->ce_mode) &&
+                          submodule_path_match(pathspec, name.buf, NULL)) {
+                       hit |= grep_submodule(opt, NULL, ce->name, ce->name);
+               } else {
                        continue;
-               /*
-                * If CE_VALID is on, we assume worktree file and its cache entry
-                * are identical, even if worktree file has been modified, so use
-                * cache version instead
-                */
-               if (cached || (ce->ce_flags & CE_VALID) || ce_skip_worktree(ce)) {
-                       if (ce_stage(ce) || ce_intent_to_add(ce))
-                               continue;
-                       hit |= grep_sha1(opt, ce->oid.hash, ce->name, 0,
-                                        ce->name);
                }
-               else
-                       hit |= grep_file(opt, ce->name);
+
                if (ce_stage(ce)) {
                        do {
                                nr++;
@@ -413,6 +712,8 @@ static int grep_cache(struct grep_opt *opt, const struct pathspec *pathspec, int
                if (hit && opt->status_only)
                        break;
        }
+
+       strbuf_release(&name);
        return hit;
 }
 
@@ -424,12 +725,22 @@ static int grep_tree(struct grep_opt *opt, const struct pathspec *pathspec,
        enum interesting match = entry_not_interesting;
        struct name_entry entry;
        int old_baselen = base->len;
+       struct strbuf name = STRBUF_INIT;
+       int name_base_len = 0;
+       if (super_prefix) {
+               strbuf_addstr(&name, super_prefix);
+               name_base_len = name.len;
+       }
 
        while (tree_entry(tree, &entry)) {
                int te_len = tree_entry_len(&entry);
 
                if (match != all_entries_interesting) {
-                       match = tree_entry_interesting(&entry, base, tn_len, pathspec);
+                       strbuf_addstr(&name, base->buf + tn_len);
+                       match = tree_entry_interesting(&entry, &name,
+                                                      0, pathspec);
+                       strbuf_setlen(&name, name_base_len);
+
                        if (match == all_entries_not_interesting)
                                break;
                        if (match == entry_not_interesting)
@@ -441,8 +752,7 @@ static int grep_tree(struct grep_opt *opt, const struct pathspec *pathspec,
                if (S_ISREG(entry.mode)) {
                        hit |= grep_sha1(opt, entry.oid->hash, base->buf, tn_len,
                                         check_attr ? base->buf + tn_len : NULL);
-               }
-               else if (S_ISDIR(entry.mode)) {
+               } else if (S_ISDIR(entry.mode)) {
                        enum object_type type;
                        struct tree_desc sub;
                        void *data;
@@ -458,12 +768,18 @@ static int grep_tree(struct grep_opt *opt, const struct pathspec *pathspec,
                        hit |= grep_tree(opt, pathspec, &sub, base, tn_len,
                                         check_attr);
                        free(data);
+               } else if (recurse_submodules && S_ISGITLINK(entry.mode)) {
+                       hit |= grep_submodule(opt, entry.oid->hash, base->buf,
+                                             base->buf + tn_len);
                }
+
                strbuf_setlen(base, old_baselen);
 
                if (hit && opt->status_only)
                        break;
        }
+
+       strbuf_release(&name);
        return hit;
 }
 
@@ -487,6 +803,10 @@ static int grep_object(struct grep_opt *opt, const struct pathspec *pathspec,
                if (!data)
                        die(_("unable to read tree (%s)"), oid_to_hex(&obj->oid));
 
+               /* Use parent's name as base when recursing submodules */
+               if (recurse_submodules && parent_basename)
+                       name = parent_basename;
+
                len = name ? strlen(name) : 0;
                strbuf_init(&base, PATH_MAX + len + 1);
                if (len) {
@@ -513,6 +833,12 @@ static int grep_objects(struct grep_opt *opt, const struct pathspec *pathspec,
        for (i = 0; i < nr; i++) {
                struct object *real_obj;
                real_obj = deref_tag(list->objects[i].item, NULL, 0);
+
+               /* load the gitmodules file for this rev */
+               if (recurse_submodules) {
+                       submodule_free();
+                       gitmodules_config_sha1(real_obj->oid.hash);
+               }
                if (grep_object(opt, pathspec, real_obj, list->objects[i].name, list->objects[i].path)) {
                        hit = 1;
                        if (opt->status_only)
@@ -651,6 +977,11 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
                        N_("search in both tracked and untracked files")),
                OPT_SET_INT(0, "exclude-standard", &opt_exclude,
                            N_("ignore files specified via '.gitignore'"), 1),
+               OPT_BOOL(0, "recurse-submodules", &recurse_submodules,
+                        N_("recursivley search in each submodule")),
+               OPT_STRING(0, "parent-basename", &parent_basename,
+                          N_("basename"),
+                          N_("prepend parent project's basename to output")),
                OPT_GROUP(""),
                OPT_BOOL('v', "invert-match", &opt.invert,
                        N_("show non-matching lines")),
@@ -755,6 +1086,7 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
        init_grep_defaults();
        git_config(grep_cmd_config, NULL);
        grep_init(&opt, prefix);
+       super_prefix = get_super_prefix();
 
        /*
         * If there is no -- then the paths must exist in the working
@@ -872,6 +1204,13 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
        pathspec.max_depth = opt.max_depth;
        pathspec.recursive = 1;
 
+       if (recurse_submodules) {
+               gitmodules_config();
+               compile_submodule_options(&opt, &pathspec, cached, untracked,
+                                         opt_exclude, use_index,
+                                         pattern_type_arg);
+       }
+
        if (show_in_pager && (cached || list.nr))
                die(_("--open-files-in-pager only works on the worktree"));
 
@@ -895,6 +1234,9 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
                }
        }
 
+       if (recurse_submodules && (!use_index || untracked))
+               die(_("option not supported with --recurse-submodules."));
+
        if (!show_in_pager && !opt.status_only)
                setup_pager();
 
index 0a27bab11b6b5a1b162c4dfef34c645c7d5f14ad..f4b87c6c9f901e5834ce9e50db089fb487c6eafc 100644 (file)
@@ -787,13 +787,15 @@ static void sha1_object(const void *data, struct object_entry *obj_entry,
                        const unsigned char *sha1)
 {
        void *new_data = NULL;
-       int collision_test_needed;
+       int collision_test_needed = 0;
 
        assert(data || obj_entry);
 
-       read_lock();
-       collision_test_needed = has_sha1_file_with_flags(sha1, HAS_SHA1_QUICK);
-       read_unlock();
+       if (startup_info->have_repository) {
+               read_lock();
+               collision_test_needed = has_sha1_file_with_flags(sha1, HAS_SHA1_QUICK);
+               read_unlock();
+       }
 
        if (collision_test_needed && !data) {
                read_lock();
@@ -1730,6 +1732,8 @@ int cmd_index_pack(int argc, const char **argv, const char *prefix)
                usage(index_pack_usage);
        if (fix_thin_pack && !from_stdin)
                die(_("--fix-thin cannot be used without --stdin"));
+       if (from_stdin && !startup_info->have_repository)
+               die(_("--stdin requires a git repository"));
        if (!index_name && pack_name)
                index_name = derive_filename(pack_name, ".idx", &index_name_buf);
        if (keep_msg && !keep_name && pack_name)
index 2399b97d902668a08c3c881d544f4d6a88f4e263..1d4d6a0078919636dfc0ffefa2aec1699a9827f1 100644 (file)
@@ -262,7 +262,7 @@ static int create_default_files(const char *template_path,
                const char *work_tree = get_git_work_tree();
                git_config_set("core.bare", "false");
                /* allow template config file to override the default */
-               if (log_all_ref_updates == -1)
+               if (log_all_ref_updates == LOG_REFS_UNSET)
                        git_config_set("core.logallrefupdates", "true");
                if (needs_work_tree_config(original_git_dir, work_tree))
                        git_config_set("core.worktree", work_tree);
@@ -338,7 +338,7 @@ int init_db(const char *git_dir, const char *real_git_dir,
 {
        int reinit;
        int exist_ok = flags & INIT_DB_EXIST_OK;
-       char *original_git_dir = xstrdup(real_path(git_dir));
+       char *original_git_dir = real_pathdup(git_dir);
 
        if (real_git_dir) {
                struct stat st;
@@ -489,7 +489,7 @@ int cmd_init_db(int argc, const char **argv, const char *prefix)
        argc = parse_options(argc, argv, prefix, init_db_options, init_db_usage, 0);
 
        if (real_git_dir && !is_absolute_path(real_git_dir))
-               real_git_dir = xstrdup(real_path(real_git_dir));
+               real_git_dir = real_pathdup(real_git_dir);
 
        if (argc == 1) {
                int mkdir_tried = 0;
@@ -560,7 +560,7 @@ int cmd_init_db(int argc, const char **argv, const char *prefix)
                const char *git_dir_parent = strrchr(git_dir, '/');
                if (git_dir_parent) {
                        char *rel = xstrndup(git_dir, git_dir_parent - git_dir);
-                       git_work_tree_cfg = xstrdup(real_path(rel));
+                       git_work_tree_cfg = real_pathdup(rel);
                        free(rel);
                }
                if (!git_work_tree_cfg)
index 0e30d862303b67ace2c7accf2e7c9346d8f63264..d7ebeb4ce6b1f1a0491f8db8a66001968a41b641 100644 (file)
@@ -31,21 +31,18 @@ static const  char * const ls_tree_usage[] = {
 
 static int show_recursive(const char *base, int baselen, const char *pathname)
 {
-       const char **s;
+       int i;
 
        if (ls_options & LS_RECURSIVE)
                return 1;
 
-       s = pathspec._raw;
-       if (!s)
+       if (!pathspec.nr)
                return 0;
 
-       for (;;) {
-               const char *spec = *s++;
+       for (i = 0; i < pathspec.nr; i++) {
+               const char *spec = pathspec.items[i].match;
                int len, speclen;
 
-               if (!spec)
-                       return 0;
                if (strncmp(base, spec, baselen))
                        continue;
                len = strlen(pathname);
@@ -59,6 +56,7 @@ static int show_recursive(const char *base, int baselen, const char *pathname)
                        continue;
                return 1;
        }
+       return 0;
 }
 
 static int show_tree(const unsigned char *sha1, struct strbuf *base,
@@ -175,8 +173,8 @@ int cmd_ls_tree(int argc, const char **argv, const char *prefix)
         * cannot be lifted until it is converted to use
         * match_pathspec() or tree_entry_interesting()
         */
-       parse_pathspec(&pathspec, PATHSPEC_GLOB | PATHSPEC_ICASE |
-                                 PATHSPEC_EXCLUDE,
+       parse_pathspec(&pathspec, PATHSPEC_ALL_MAGIC &
+                                 ~(PATHSPEC_FROMTOP | PATHSPEC_LITERAL),
                       PATHSPEC_PREFER_CWD,
                       prefix, argv + 1);
        for (i = 0; i < pathspec.nr; i++)
index ce356b1da126e31b4ef78b29dcc49246881b6a59..2d1b6db6bd7a33f838a50deceb108ee1ad468db1 100644 (file)
@@ -22,7 +22,7 @@ static int merge_entry(int pos, const char *path)
                if (strcmp(ce->name, path))
                        break;
                found++;
-               sha1_to_hex_r(hexbuf[stage], ce->oid.hash);
+               oid_to_hex_r(hexbuf[stage], &ce->oid);
                xsnprintf(ownbuf[stage], sizeof(ownbuf[stage]), "%o", ce->ce_mode);
                arguments[stage] = hexbuf[stage];
                arguments[stage + 4] = ownbuf[stage];
index b65eeaa87d303b027230bf2479f78c15a02ca08a..a96d4fb501bf1441b52a313313b8c04f3187e4d9 100644 (file)
@@ -46,6 +46,7 @@ static const char * const builtin_merge_usage[] = {
        N_("git merge [<options>] [<commit>...]"),
        N_("git merge [<options>] <msg> HEAD <commit>"),
        N_("git merge --abort"),
+       N_("git merge --continue"),
        NULL
 };
 
@@ -65,6 +66,7 @@ static int option_renormalize;
 static int verbosity;
 static int allow_rerere_auto;
 static int abort_current_merge;
+static int continue_current_merge;
 static int allow_unrelated_histories;
 static int show_progress = -1;
 static int default_to_upstream = 1;
@@ -223,6 +225,8 @@ static struct option builtin_merge_options[] = {
        OPT__VERBOSITY(&verbosity),
        OPT_BOOL(0, "abort", &abort_current_merge,
                N_("abort the current in-progress merge")),
+       OPT_BOOL(0, "continue", &continue_current_merge,
+               N_("continue the current in-progress merge")),
        OPT_BOOL(0, "allow-unrelated-histories", &allow_unrelated_histories,
                 N_("allow merging unrelated histories")),
        OPT_SET_INT(0, "progress", &show_progress, N_("force progress reporting"), 1),
@@ -634,7 +638,7 @@ static int try_merge_strategy(const char *strategy, struct commit_list *common,
 {
        static struct lock_file lock;
 
-       hold_locked_index(&lock, 1);
+       hold_locked_index(&lock, LOCK_DIE_ON_ERROR);
        refresh_cache(REFRESH_QUIET);
        if (active_cache_changed &&
            write_locked_index(&the_index, &lock, COMMIT_LOCK))
@@ -671,7 +675,7 @@ static int try_merge_strategy(const char *strategy, struct commit_list *common,
                for (j = common; j; j = j->next)
                        commit_list_insert(j->item, &reversed);
 
-               hold_locked_index(&lock, 1);
+               hold_locked_index(&lock, LOCK_DIE_ON_ERROR);
                clean = merge_recursive(&o, head,
                                remoteheads->item, reversed, &result);
                if (clean < 0)
@@ -781,7 +785,7 @@ static int merge_trivial(struct commit *head, struct commit_list *remoteheads)
        struct commit_list *parents, **pptr = &parents;
        static struct lock_file lock;
 
-       hold_locked_index(&lock, 1);
+       hold_locked_index(&lock, LOCK_DIE_ON_ERROR);
        refresh_cache(REFRESH_QUIET);
        if (active_cache_changed &&
            write_locked_index(&the_index, &lock, COMMIT_LOCK))
@@ -1125,6 +1129,7 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
        const char *best_strategy = NULL, *wt_strategy = NULL;
        struct commit_list *remoteheads, *p;
        void *branch_to_free;
+       int orig_argc = argc;
 
        if (argc == 2 && !strcmp(argv[1], "-h"))
                usage_with_options(builtin_merge_usage, builtin_merge_options);
@@ -1158,6 +1163,10 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
                int nargc = 2;
                const char *nargv[] = {"reset", "--merge", NULL};
 
+               if (orig_argc != 2)
+                       usage_msg_opt(_("--abort expects no arguments"),
+                             builtin_merge_usage, builtin_merge_options);
+
                if (!file_exists(git_path_merge_head()))
                        die(_("There is no merge to abort (MERGE_HEAD missing)."));
 
@@ -1166,6 +1175,22 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
                goto done;
        }
 
+       if (continue_current_merge) {
+               int nargc = 1;
+               const char *nargv[] = {"commit", NULL};
+
+               if (orig_argc != 2)
+                       usage_msg_opt(_("--continue expects no arguments"),
+                             builtin_merge_usage, builtin_merge_options);
+
+               if (!file_exists(git_path_merge_head()))
+                       die(_("There is no merge in progress (MERGE_HEAD missing)."));
+
+               /* Invoke 'git commit' */
+               ret = cmd_commit(nargc, nargv, prefix);
+               goto done;
+       }
+
        if (read_cache_unmerged())
                die_resolve_conflict("merge");
 
index 2f43877bc9a17c5bef2906a383cc8cdd6f4f5b82..61d20037add7cf56df721f8d69612b50412f94e9 100644 (file)
@@ -4,6 +4,7 @@
  * Copyright (C) 2006 Johannes Schindelin
  */
 #include "builtin.h"
+#include "pathspec.h"
 #include "lockfile.h"
 #include "dir.h"
 #include "cache-tree.h"
@@ -19,31 +20,42 @@ static const char * const builtin_mv_usage[] = {
 #define DUP_BASENAME 1
 #define KEEP_TRAILING_SLASH 2
 
-static const char **internal_copy_pathspec(const char *prefix,
-                                          const char **pathspec,
-                                          int count, unsigned flags)
+static const char **internal_prefix_pathspec(const char *prefix,
+                                            const char **pathspec,
+                                            int count, unsigned flags)
 {
        int i;
        const char **result;
+       int prefixlen = prefix ? strlen(prefix) : 0;
        ALLOC_ARRAY(result, count + 1);
-       COPY_ARRAY(result, pathspec, count);
-       result[count] = NULL;
+
+       /* Create an intermediate copy of the pathspec based on the flags */
        for (i = 0; i < count; i++) {
-               int length = strlen(result[i]);
+               int length = strlen(pathspec[i]);
                int to_copy = length;
+               char *it;
                while (!(flags & KEEP_TRAILING_SLASH) &&
-                      to_copy > 0 && is_dir_sep(result[i][to_copy - 1]))
+                      to_copy > 0 && is_dir_sep(pathspec[i][to_copy - 1]))
                        to_copy--;
-               if (to_copy != length || flags & DUP_BASENAME) {
-                       char *it = xmemdupz(result[i], to_copy);
-                       if (flags & DUP_BASENAME) {
-                               result[i] = xstrdup(basename(it));
-                               free(it);
-                       } else
-                               result[i] = it;
+
+               it = xmemdupz(pathspec[i], to_copy);
+               if (flags & DUP_BASENAME) {
+                       result[i] = xstrdup(basename(it));
+                       free(it);
+               } else {
+                       result[i] = it;
                }
        }
-       return get_pathspec(prefix, result);
+       result[count] = NULL;
+
+       /* Prefix the pathspec and free the old intermediate strings */
+       for (i = 0; i < count; i++) {
+               const char *match = prefix_path(prefix, prefixlen, result[i]);
+               free((char *) result[i]);
+               result[i] = match;
+       }
+
+       return result;
 }
 
 static const char *add_slash(const char *path)
@@ -126,11 +138,11 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
        if (--argc < 1)
                usage_with_options(builtin_mv_usage, builtin_mv_options);
 
-       hold_locked_index(&lock_file, 1);
+       hold_locked_index(&lock_file, LOCK_DIE_ON_ERROR);
        if (read_cache() < 0)
                die(_("index file corrupt"));
 
-       source = internal_copy_pathspec(prefix, argv, argc, 0);
+       source = internal_prefix_pathspec(prefix, argv, argc, 0);
        modes = xcalloc(argc, sizeof(enum update_mode));
        /*
         * Keep trailing slash, needed to let
@@ -140,16 +152,16 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
        flags = KEEP_TRAILING_SLASH;
        if (argc == 1 && is_directory(argv[0]) && !is_directory(argv[1]))
                flags = 0;
-       dest_path = internal_copy_pathspec(prefix, argv + argc, 1, flags);
+       dest_path = internal_prefix_pathspec(prefix, argv + argc, 1, flags);
        submodule_gitfile = xcalloc(argc, sizeof(char *));
 
        if (dest_path[0][0] == '\0')
                /* special case: "." was normalized to "" */
-               destination = internal_copy_pathspec(dest_path[0], argv, argc, DUP_BASENAME);
+               destination = internal_prefix_pathspec(dest_path[0], argv, argc, DUP_BASENAME);
        else if (!lstat(dest_path[0], &st) &&
                        S_ISDIR(st.st_mode)) {
                dest_path[0] = add_slash(dest_path[0]);
-               destination = internal_copy_pathspec(dest_path[0], argv, argc, DUP_BASENAME);
+               destination = internal_prefix_pathspec(dest_path[0], argv, argc, DUP_BASENAME);
        } else {
                if (argc != 1)
                        die(_("destination '%s' is not a directory"), dest_path[0]);
index 0fd52bd6b4b985b24d93ab7fb9887f57305b49fd..8841f8b366b4cee57d13a9086071351f849ddbba 100644 (file)
@@ -61,8 +61,6 @@ static int delta_search_threads;
 static int pack_to_stdout;
 static int num_preferred_base;
 static struct progress *progress_state;
-static int pack_compression_level = Z_DEFAULT_COMPRESSION;
-static int pack_compression_seen;
 
 static struct packed_git *reuse_packfile;
 static uint32_t reuse_packfile_objects;
@@ -2368,16 +2366,6 @@ static int git_pack_config(const char *k, const char *v, void *cb)
                depth = git_config_int(k, v);
                return 0;
        }
-       if (!strcmp(k, "pack.compression")) {
-               int level = git_config_int(k, v);
-               if (level == -1)
-                       level = Z_DEFAULT_COMPRESSION;
-               else if (level < 0 || level > Z_BEST_COMPRESSION)
-                       die("bad pack compression level %d", level);
-               pack_compression_level = level;
-               pack_compression_seen = 1;
-               return 0;
-       }
        if (!strcmp(k, "pack.deltacachesize")) {
                max_delta_cache_size = git_config_int(k, v);
                return 0;
@@ -2869,8 +2857,6 @@ int cmd_pack_objects(int argc, const char **argv, const char *prefix)
 
        reset_pack_idx_option(&pack_idx_opts);
        git_config(git_pack_config, NULL);
-       if (!pack_compression_seen && core_compression_seen)
-               pack_compression_level = core_compression_level;
 
        progress = isatty(2);
        argc = parse_options(argc, argv, prefix, pack_objects_options,
index d6e46ee6d0054c152d721e92e354795c6f6002f8..3ecb881b0bcacbf1a453bf9a6cb95ae00cdecb1d 100644 (file)
@@ -857,10 +857,24 @@ int cmd_pull(int argc, const char **argv, const char *prefix)
                if (merge_heads.nr > 1)
                        die(_("Cannot merge multiple branches into empty head."));
                return pull_into_void(*merge_heads.sha1, curr_head);
-       } else if (opt_rebase) {
-               if (merge_heads.nr > 1)
-                       die(_("Cannot rebase onto multiple branches."));
+       }
+       if (opt_rebase && merge_heads.nr > 1)
+               die(_("Cannot rebase onto multiple branches."));
+
+       if (opt_rebase) {
+               struct commit_list *list = NULL;
+               struct commit *merge_head, *head;
+
+               head = lookup_commit_reference(orig_head);
+               commit_list_insert(head, &list);
+               merge_head = lookup_commit_reference(merge_heads.sha1[0]);
+               if (is_descendant_of(merge_head, list)) {
+                       /* we can fast-forward this without invoking rebase */
+                       opt_ff = "--ff-only";
+                       return run_merge();
+               }
                return run_rebase(curr_head, *merge_heads.sha1, rebase_fork_point);
-       } else
+       } else {
                return run_merge();
+       }
 }
index 3bb9d6b7e63b3e3082023c3d333c11757df6fbda..5c22e9f2e56b7d8049890e44f4c6fb63b16f8357 100644 (file)
@@ -194,15 +194,18 @@ static void setup_push_upstream(struct remote *remote, struct branch *branch,
                        die_push_simple(branch, remote);
        }
 
-       strbuf_addf(&refspec, "%s:%s", branch->name, branch->merge[0]->src);
+       strbuf_addf(&refspec, "%s:%s", branch->refname, branch->merge[0]->src);
        add_refspec(refspec.buf);
 }
 
 static void setup_push_current(struct remote *remote, struct branch *branch)
 {
+       struct strbuf refspec = STRBUF_INIT;
+
        if (!branch)
                die(_(message_detached_head_die), remote->name);
-       add_refspec(branch->name);
+       strbuf_addf(&refspec, "%s:%s", branch->refname, branch->refname);
+       add_refspec(refspec.buf);
 }
 
 static int is_workflow_triangular(struct remote *remote)
@@ -565,6 +568,8 @@ int cmd_push(int argc, const char **argv, const char *prefix)
                flags |= TRANSPORT_RECURSE_SUBMODULES_CHECK;
        else if (recurse_submodules == RECURSE_SUBMODULES_ON_DEMAND)
                flags |= TRANSPORT_RECURSE_SUBMODULES_ON_DEMAND;
+       else if (recurse_submodules == RECURSE_SUBMODULES_ONLY)
+               flags |= TRANSPORT_RECURSE_SUBMODULES_ONLY;
 
        if (tags)
                add_refspec("refs/tags/*");
index 9bd1fd755ef03824442f6c751a9603b95bfe66ee..8ba64bc785670590897638c8e58172c74556189d 100644 (file)
@@ -109,34 +109,34 @@ int cmd_read_tree(int argc, const char **argv, const char *unused_prefix)
                { OPTION_CALLBACK, 0, "index-output", NULL, N_("file"),
                  N_("write resulting index to <file>"),
                  PARSE_OPT_NONEG, index_output_cb },
-               OPT_SET_INT(0, "empty", &read_empty,
-                           N_("only empty the index"), 1),
+               OPT_BOOL(0, "empty", &read_empty,
+                           N_("only empty the index")),
                OPT__VERBOSE(&opts.verbose_update, N_("be verbose")),
                OPT_GROUP(N_("Merging")),
-               OPT_SET_INT('m', NULL, &opts.merge,
-                           N_("perform a merge in addition to a read"), 1),
-               OPT_SET_INT(0, "trivial", &opts.trivial_merges_only,
-                           N_("3-way merge if no file level merging required"), 1),
-               OPT_SET_INT(0, "aggressive", &opts.aggressive,
-                           N_("3-way merge in presence of adds and removes"), 1),
-               OPT_SET_INT(0, "reset", &opts.reset,
-                           N_("same as -m, but discard unmerged entries"), 1),
+               OPT_BOOL('m', NULL, &opts.merge,
+                        N_("perform a merge in addition to a read")),
+               OPT_BOOL(0, "trivial", &opts.trivial_merges_only,
+                        N_("3-way merge if no file level merging required")),
+               OPT_BOOL(0, "aggressive", &opts.aggressive,
+                        N_("3-way merge in presence of adds and removes")),
+               OPT_BOOL(0, "reset", &opts.reset,
+                        N_("same as -m, but discard unmerged entries")),
                { OPTION_STRING, 0, "prefix", &opts.prefix, N_("<subdirectory>/"),
                  N_("read the tree into the index under <subdirectory>/"),
                  PARSE_OPT_NONEG | PARSE_OPT_LITERAL_ARGHELP },
-               OPT_SET_INT('u', NULL, &opts.update,
-                           N_("update working tree with merge result"), 1),
+               OPT_BOOL('u', NULL, &opts.update,
+                        N_("update working tree with merge result")),
                { OPTION_CALLBACK, 0, "exclude-per-directory", &opts,
                  N_("gitignore"),
                  N_("allow explicitly ignored files to be overwritten"),
                  PARSE_OPT_NONEG, exclude_per_directory_cb },
-               OPT_SET_INT('i', NULL, &opts.index_only,
-                           N_("don't check the working tree after merging"), 1),
+               OPT_BOOL('i', NULL, &opts.index_only,
+                        N_("don't check the working tree after merging")),
                OPT__DRY_RUN(&opts.dry_run, N_("don't update the index or the work tree")),
-               OPT_SET_INT(0, "no-sparse-checkout", &opts.skip_sparse_checkout,
-                           N_("skip applying sparse checkout filter"), 1),
-               OPT_SET_INT(0, "debug-unpack", &opts.debug_unpack,
-                           N_("debug unpack-trees"), 1),
+               OPT_BOOL(0, "no-sparse-checkout", &opts.skip_sparse_checkout,
+                        N_("skip applying sparse checkout filter")),
+               OPT_BOOL(0, "debug-unpack", &opts.debug_unpack,
+                        N_("debug unpack-trees")),
                OPT_END()
        };
 
@@ -150,7 +150,7 @@ int cmd_read_tree(int argc, const char **argv, const char *unused_prefix)
        argc = parse_options(argc, argv, unused_prefix, read_tree_options,
                             read_tree_usage, 0);
 
-       hold_locked_index(&lock_file, 1);
+       hold_locked_index(&lock_file, LOCK_DIE_ON_ERROR);
 
        prefix_set = opts.prefix ? 1 : 0;
        if (1 < opts.merge + opts.reset + prefix_set)
index e6b3879a5b90034937dfb8eee32f8d2981f6bb53..1dbb8a069225be1e9d9fe27ad4b83a8bd66ca511 100644 (file)
@@ -795,8 +795,8 @@ static char *refuse_unconfigured_deny_msg =
           "with what you pushed, and will require 'git reset --hard' to match\n"
           "the work tree to HEAD.\n"
           "\n"
-          "You can set 'receive.denyCurrentBranch' configuration variable to\n"
-          "'ignore' or 'warn' in the remote repository to allow pushing into\n"
+          "You can set the 'receive.denyCurrentBranch' configuration variable\n"
+          "to 'ignore' or 'warn' in the remote repository to allow pushing into\n"
           "its current branch; however, this is not recommended unless you\n"
           "arranged to update its work tree to match what you pushed in some\n"
           "other way.\n"
@@ -1942,8 +1942,7 @@ int cmd_receive_pack(int argc, const char **argv, const char *prefix)
                run_receive_hook(commands, "post-receive", 1,
                                 &push_options);
                run_update_post_hook(commands);
-               if (push_options.nr)
-                       string_list_clear(&push_options, 0);
+               string_list_clear(&push_options, 0);
                if (auto_gc) {
                        const char *argv_gc_auto[] = {
                                "gc", "--auto", "--quiet", NULL,
index e52cf3925b2388008221de6f7cbedeecd6cdd010..5339ed6ad17bb0c83e05d3e60d654c4f0632ee50 100644 (file)
@@ -186,7 +186,7 @@ static int add(int argc, const char **argv)
        url = argv[1];
 
        remote = remote_get(name);
-       if (remote_is_configured(remote))
+       if (remote_is_configured(remote, 1))
                die(_("remote %s already exists."), name);
 
        strbuf_addf(&buf2, "refs/heads/test:refs/remotes/%s/test", name);
@@ -618,14 +618,14 @@ static int mv(int argc, const char **argv)
        rename.remote_branches = &remote_branches;
 
        oldremote = remote_get(rename.old);
-       if (!remote_is_configured(oldremote))
+       if (!remote_is_configured(oldremote, 1))
                die(_("No such remote: %s"), rename.old);
 
        if (!strcmp(rename.old, rename.new) && oldremote->origin != REMOTE_CONFIG)
                return migrate_file(oldremote);
 
        newremote = remote_get(rename.new);
-       if (remote_is_configured(newremote))
+       if (remote_is_configured(newremote, 1))
                die(_("remote %s already exists."), rename.new);
 
        strbuf_addf(&buf, "refs/heads/test:refs/remotes/%s/test", rename.new);
@@ -753,7 +753,7 @@ static int rm(int argc, const char **argv)
                usage_with_options(builtin_remote_rm_usage, options);
 
        remote = remote_get(argv[1]);
-       if (!remote_is_configured(remote))
+       if (!remote_is_configured(remote, 1))
                die(_("No such remote: %s"), argv[1]);
 
        known_remotes.to_delete = remote;
@@ -1415,7 +1415,7 @@ static int set_remote_branches(const char *remotename, const char **branches,
        strbuf_addf(&key, "remote.%s.fetch", remotename);
 
        remote = remote_get(remotename);
-       if (!remote_is_configured(remote))
+       if (!remote_is_configured(remote, 1))
                die(_("No such remote '%s'"), remotename);
 
        if (!add_mode && remove_all_fetch_refspecs(remotename, key.buf)) {
@@ -1469,7 +1469,7 @@ static int get_url(int argc, const char **argv)
        remotename = argv[0];
 
        remote = remote_get(remotename);
-       if (!remote_is_configured(remote))
+       if (!remote_is_configured(remote, 1))
                die(_("No such remote '%s'"), remotename);
 
        url_nr = 0;
@@ -1537,7 +1537,7 @@ static int set_url(int argc, const char **argv)
                oldurl = newurl;
 
        remote = remote_get(remotename);
-       if (!remote_is_configured(remote))
+       if (!remote_is_configured(remote, 1))
                die(_("No such remote '%s'"), remotename);
 
        if (push_mode) {
index 80dd06b4a2a8b784ab96899cb150b13006d7e402..677bc7c81a2be11b287f3b05f91742216fbe1d51 100644 (file)
@@ -18,6 +18,12 @@ static const char *const git_repack_usage[] = {
        NULL
 };
 
+static const char incremental_bitmap_conflict_error[] = N_(
+"Incremental repacks are incompatible with bitmap indexes.  Use\n"
+"--no-write-bitmap-index or disable the pack.writebitmaps configuration."
+);
+
+
 static int repack_config(const char *var, const char *value, void *cb)
 {
        if (!strcmp(var, "repack.usedeltabaseoffset")) {
@@ -206,6 +212,9 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
        if (pack_kept_objects < 0)
                pack_kept_objects = write_bitmaps;
 
+       if (write_bitmaps && !(pack_everything & ALL_INTO_ONE))
+               die(_(incremental_bitmap_conflict_error));
+
        packdir = mkpathdup("%s/pack", get_object_directory());
        packtmp = mkpathdup("%s/.tmp-%d-pack", packdir, (int)getpid());
 
index c04ac076dc53b99039768dcdcbf2861e285896c2..8ab915bfcb71ae5d5f4bd1bebe7fd3c8725780b2 100644 (file)
@@ -354,7 +354,7 @@ int cmd_reset(int argc, const char **argv, const char *prefix)
 
        if (reset_type != SOFT) {
                struct lock_file *lock = xcalloc(1, sizeof(*lock));
-               hold_locked_index(lock, 1);
+               hold_locked_index(lock, LOCK_DIE_ON_ERROR);
                if (reset_type == MIXED) {
                        int flags = quiet ? REFRESH_QUIET : REFRESH_IN_PORCELAIN;
                        if (read_from_tree(&pathspec, &oid, intent_to_add))
index c43decda70112a9cdb7789dc81394286459aa3af..0aa93d58919742852b05b952e8e35b5270f74ba8 100644 (file)
@@ -237,7 +237,7 @@ static int show_bisect_vars(struct rev_list_info *info, int reaches, int all)
                cnt = reaches;
 
        if (revs->commits)
-               sha1_to_hex_r(hex, revs->commits->item->object.oid.hash);
+               oid_to_hex_r(hex, &revs->commits->item->object.oid);
 
        if (flags & BISECT_SHOW_ALL) {
                traverse_commit_list(revs, show_commit, show_object, info);
index cfb0f1510c59674abe68fb67ff45142b5c92ac89..ff13e59e1dbd200b6e7cf7d1c508b620b19e8cc7 100644 (file)
@@ -342,11 +342,16 @@ static int try_parent_shorthands(const char *arg)
        for (parents = commit->parents, parent_number = 1;
             parents;
             parents = parents->next, parent_number++) {
+               char *name = NULL;
+
                if (exclude_parent && parent_number != exclude_parent)
                        continue;
 
+               if (symbolic)
+                       name = xstrfmt("%s^%d", arg, parent_number);
                show_rev(include_parents ? NORMAL : REVERSED,
-                        parents->item->object.oid.hash, arg);
+                        parents->item->object.oid.hash, name);
+               free(name);
        }
 
        *dotdot = '^';
index 3f3e24eb36af03481f4e7b3f4d22d8e4b5904593..452170a3ab45d24e03ab11965448572a411c349f 100644 (file)
@@ -59,27 +59,9 @@ static void print_error_files(struct string_list *files_list,
        }
 }
 
-static void error_removing_concrete_submodules(struct string_list *files, int *errs)
-{
-       print_error_files(files,
-                         Q_("the following submodule (or one of its nested "
-                            "submodules)\n"
-                            "uses a .git directory:",
-                            "the following submodules (or one of their nested "
-                            "submodules)\n"
-                            "use a .git directory:", files->nr),
-                         _("\n(use 'rm -rf' if you really want to remove "
-                           "it including all of its history)"),
-                         errs);
-       string_list_clear(files, 0);
-}
-
-static int check_submodules_use_gitfiles(void)
+static void submodules_absorb_gitdir_if_needed(const char *prefix)
 {
        int i;
-       int errs = 0;
-       struct string_list files = STRING_LIST_INIT_NODUP;
-
        for (i = 0; i < list.nr; i++) {
                const char *name = list.entry[i].name;
                int pos;
@@ -99,12 +81,9 @@ static int check_submodules_use_gitfiles(void)
                        continue;
 
                if (!submodule_uses_gitfile(name))
-                       string_list_append(&files, name);
+                       absorb_git_dir_into_superproject(prefix, name,
+                               ABSORB_GITDIR_RECURSE_SUBMODULES);
        }
-
-       error_removing_concrete_submodules(&files, &errs);
-
-       return errs;
 }
 
 static int check_local_mod(struct object_id *head, int index_only)
@@ -120,7 +99,6 @@ static int check_local_mod(struct object_id *head, int index_only)
        int errs = 0;
        struct string_list files_staged = STRING_LIST_INIT_NODUP;
        struct string_list files_cached = STRING_LIST_INIT_NODUP;
-       struct string_list files_submodule = STRING_LIST_INIT_NODUP;
        struct string_list files_local = STRING_LIST_INIT_NODUP;
 
        no_head = is_null_oid(head);
@@ -187,7 +165,9 @@ static int check_local_mod(struct object_id *head, int index_only)
                 */
                if (ce_match_stat(ce, &st, 0) ||
                    (S_ISGITLINK(ce->ce_mode) &&
-                    !ok_to_remove_submodule(ce->name)))
+                    bad_to_remove_submodule(ce->name,
+                               SUBMODULE_REMOVAL_DIE_ON_ERROR |
+                               SUBMODULE_REMOVAL_IGNORE_IGNORED_UNTRACKED)))
                        local_changes = 1;
 
                /*
@@ -217,13 +197,8 @@ static int check_local_mod(struct object_id *head, int index_only)
                else if (!index_only) {
                        if (staged_changes)
                                string_list_append(&files_cached, name);
-                       if (local_changes) {
-                               if (S_ISGITLINK(ce->ce_mode) &&
-                                   !submodule_uses_gitfile(name))
-                                       string_list_append(&files_submodule, name);
-                               else
-                                       string_list_append(&files_local, name);
-                       }
+                       if (local_changes)
+                               string_list_append(&files_local, name);
                }
        }
        print_error_files(&files_staged,
@@ -245,8 +220,6 @@ static int check_local_mod(struct object_id *head, int index_only)
                          &errs);
        string_list_clear(&files_cached, 0);
 
-       error_removing_concrete_submodules(&files_submodule, &errs);
-
        print_error_files(&files_local,
                          Q_("the following file has local modifications:",
                             "the following files have local modifications:",
@@ -292,7 +265,7 @@ int cmd_rm(int argc, const char **argv, const char *prefix)
        if (!index_only)
                setup_work_tree();
 
-       hold_locked_index(&lock_file, 1);
+       hold_locked_index(&lock_file, LOCK_DIE_ON_ERROR);
 
        if (read_cache() < 0)
                die(_("index file corrupt"));
@@ -340,6 +313,9 @@ int cmd_rm(int argc, const char **argv, const char *prefix)
                        exit(0);
        }
 
+       if (!index_only)
+               submodules_absorb_gitdir_if_needed(prefix);
+
        /*
         * If not forced, the file, the index and the HEAD (if exists)
         * must match; but the file can already been removed, since
@@ -356,9 +332,6 @@ int cmd_rm(int argc, const char **argv, const char *prefix)
                        oidclr(&oid);
                if (check_local_mod(&oid, index_only))
                        exit(1);
-       } else if (!index_only) {
-               if (check_submodules_use_gitfiles())
-                       exit(1);
        }
 
        /*
@@ -387,32 +360,20 @@ int cmd_rm(int argc, const char **argv, const char *prefix)
         */
        if (!index_only) {
                int removed = 0, gitmodules_modified = 0;
-               struct strbuf buf = STRBUF_INIT;
                for (i = 0; i < list.nr; i++) {
                        const char *path = list.entry[i].name;
                        if (list.entry[i].is_submodule) {
-                               if (is_empty_dir(path)) {
-                                       if (!rmdir(path)) {
-                                               removed = 1;
-                                               if (!remove_path_from_gitmodules(path))
-                                                       gitmodules_modified = 1;
-                                               continue;
-                                       }
-                               } else {
-                                       strbuf_reset(&buf);
-                                       strbuf_addstr(&buf, path);
-                                       if (!remove_dir_recursively(&buf, 0)) {
-                                               removed = 1;
-                                               if (!remove_path_from_gitmodules(path))
-                                                       gitmodules_modified = 1;
-                                               strbuf_release(&buf);
-                                               continue;
-                                       } else if (!file_exists(path))
-                                               /* Submodule was removed by user */
-                                               if (!remove_path_from_gitmodules(path))
-                                                       gitmodules_modified = 1;
-                                       /* Fallthrough and let remove_path() fail. */
-                               }
+                               struct strbuf buf = STRBUF_INIT;
+
+                               strbuf_addstr(&buf, path);
+                               if (remove_dir_recursively(&buf, 0))
+                                       die(_("could not remove '%s'"), path);
+                               strbuf_release(&buf);
+
+                               removed = 1;
+                               if (!remove_path_from_gitmodules(path))
+                                       gitmodules_modified = 1;
+                               continue;
                        }
                        if (!remove_path(path)) {
                                removed = 1;
@@ -421,7 +382,6 @@ int cmd_rm(int argc, const char **argv, const char *prefix)
                        if (!removed)
                                die_errno("git rm: '%s'", path);
                }
-               strbuf_release(&buf);
                if (gitmodules_modified)
                        stage_updated_gitmodules();
        }
index ba0e1154a9f0b95f60e5bcb6cdb716bf0f6ef366..c9585d475d90c41554465f870e530c16ab93199f 100644 (file)
@@ -117,11 +117,15 @@ static void read_from_stdin(struct shortlog *log)
 {
        struct strbuf author = STRBUF_INIT;
        struct strbuf oneline = STRBUF_INIT;
+       static const char *author_match[2] = { "Author: ", "author " };
+       static const char *committer_match[2] = { "Commit: ", "committer " };
+       const char **match;
 
+       match = log->committer ? committer_match : author_match;
        while (strbuf_getline_lf(&author, stdin) != EOF) {
                const char *v;
-               if (!skip_prefix(author.buf, "Author: ", &v) &&
-                   !skip_prefix(author.buf, "author ", &v))
+               if (!skip_prefix(author.buf, match[0], &v) &&
+                   !skip_prefix(author.buf, match[1], &v))
                        continue;
                while (strbuf_getline_lf(&oneline, stdin) != EOF &&
                       oneline.len)
@@ -140,6 +144,7 @@ void shortlog_add_commit(struct shortlog *log, struct commit *commit)
        struct strbuf author = STRBUF_INIT;
        struct strbuf oneline = STRBUF_INIT;
        struct pretty_print_context ctx = {0};
+       const char *fmt;
 
        ctx.fmt = CMIT_FMT_USERFORMAT;
        ctx.abbrev = log->abbrev;
@@ -148,7 +153,9 @@ void shortlog_add_commit(struct shortlog *log, struct commit *commit)
        ctx.date_mode.type = DATE_NORMAL;
        ctx.output_encoding = get_log_output_encoding();
 
-       format_commit_message(commit, "%an <%ae>", &author, &ctx);
+       fmt = log->committer ? "%cn <%ce>" : "%an <%ae>";
+
+       format_commit_message(commit, fmt, &author, &ctx);
        if (!log->summary) {
                if (log->user_format)
                        pretty_print_commit(&ctx, commit, &oneline);
@@ -238,6 +245,8 @@ int cmd_shortlog(int argc, const char **argv, const char *prefix)
        int nongit = !startup_info->have_repository;
 
        const struct option options[] = {
+               OPT_BOOL('c', "committer", &log.committer,
+                        N_("Group by committer rather than author")),
                OPT_BOOL('n', "numbered", &log.sort_by_number,
                         N_("sort output according to the number of commits per author")),
                OPT_BOOL('s', "summary", &log.summary,
index 6d4e669002b1e58ebf40af5543221d809ffd0427..013d241abc09be76c318dbc25d5fb3b40ade7b3a 100644 (file)
@@ -19,19 +19,34 @@ static const char *exclude_existing_arg;
 
 static void show_one(const char *refname, const struct object_id *oid)
 {
-       const char *hex = find_unique_abbrev(oid->hash, abbrev);
+       const char *hex;
+       struct object_id peeled;
+
+       if (!has_sha1_file(oid->hash))
+               die("git show-ref: bad ref %s (%s)", refname,
+                   oid_to_hex(oid));
+
+       if (quiet)
+               return;
+
+       hex = find_unique_abbrev(oid->hash, abbrev);
        if (hash_only)
                printf("%s\n", hex);
        else
                printf("%s %s\n", hex, refname);
+
+       if (!deref_tags)
+               return;
+
+       if (!peel_ref(refname, peeled.hash)) {
+               hex = find_unique_abbrev(peeled.hash, abbrev);
+               printf("%s %s^{}\n", hex, refname);
+       }
 }
 
 static int show_ref(const char *refname, const struct object_id *oid,
                    int flag, void *cbdata)
 {
-       const char *hex;
-       struct object_id peeled;
-
        if (show_head && !strcmp(refname, "HEAD"))
                goto match;
 
@@ -54,9 +69,6 @@ static int show_ref(const char *refname, const struct object_id *oid,
                                continue;
                        if (len == reflen)
                                goto match;
-                       /* "--verify" requires an exact match */
-                       if (verify)
-                               continue;
                        if (refname[reflen - len - 1] == '/')
                                goto match;
                }
@@ -66,26 +78,8 @@ static int show_ref(const char *refname, const struct object_id *oid,
 match:
        found_match++;
 
-       /* This changes the semantics slightly that even under quiet we
-        * detect and return error if the repository is corrupt and
-        * ref points at a nonexistent object.
-        */
-       if (!has_sha1_file(oid->hash))
-               die("git show-ref: bad ref %s (%s)", refname,
-                   oid_to_hex(oid));
-
-       if (quiet)
-               return 0;
-
        show_one(refname, oid);
 
-       if (!deref_tags)
-               return 0;
-
-       if (!peel_ref(refname, peeled.hash)) {
-               hex = find_unique_abbrev(peeled.hash, abbrev);
-               printf("%s %s^{}\n", hex, refname);
-       }
        return 0;
 }
 
@@ -202,10 +196,9 @@ int cmd_show_ref(int argc, const char **argv, const char *prefix)
                while (*pattern) {
                        struct object_id oid;
 
-                       if (starts_with(*pattern, "refs/") &&
+                       if ((starts_with(*pattern, "refs/") || !strcmp(*pattern, "HEAD")) &&
                            !read_ref(*pattern, oid.hash)) {
-                               if (!quiet)
-                                       show_one(*pattern, &oid);
+                               show_one(*pattern, &oid);
                        }
                        else if (!quiet)
                                die("'%s' - not a valid ref", *pattern);
index 4beeda5f9f49d6c2e2f552308b50bacf70ebd421..899dc334e323a53f3e8a2981a1f8140f55f136a9 100644 (file)
@@ -317,8 +317,12 @@ static void init_submodule(const char *path, const char *prefix, int quiet)
        /* Only loads from .gitmodules, no overlay with .git/config */
        gitmodules_config();
 
-       if (prefix) {
-               strbuf_addf(&sb, "%s%s", prefix, path);
+       if (prefix && get_super_prefix())
+               die("BUG: cannot have prefix and superprefix");
+       else if (prefix)
+               displaypath = xstrdup(relative_path(path, prefix, &sb));
+       else if (get_super_prefix()) {
+               strbuf_addf(&sb, "%s%s", get_super_prefix(), path);
                displaypath = strbuf_detach(&sb, NULL);
        } else
                displaypath = xstrdup(path);
@@ -403,9 +407,6 @@ static int module_init(int argc, const char **argv, const char *prefix)
        int i;
 
        struct option module_init_options[] = {
-               OPT_STRING(0, "prefix", &prefix,
-                          N_("path"),
-                          N_("alternative anchor for relative paths")),
                OPT__QUIET(&quiet, N_("Suppress output for initializing a submodule")),
                OPT_END()
        };
@@ -498,9 +499,9 @@ static int add_possible_reference_from_superproject(
 
        /*
         * If the alternate object store is another repository, try the
-        * standard layout with .git/modules/<name>/objects
+        * standard layout with .git/(modules/<name>)+/objects
         */
-       if (ends_with(alt->path, ".git/objects")) {
+       if (ends_with(alt->path, "/objects")) {
                char *sm_alternate;
                struct strbuf sb = STRBUF_INIT;
                struct strbuf err = STRBUF_INIT;
@@ -583,6 +584,7 @@ static int module_clone(int argc, const char **argv, const char *prefix)
        struct strbuf rel_path = STRBUF_INIT;
        struct strbuf sb = STRBUF_INIT;
        struct string_list reference = STRING_LIST_INIT_NODUP;
+       char *sm_alternate = NULL, *error_strategy = NULL;
 
        struct option module_clone_options[] = {
                OPT_STRING(0, "prefix", &prefix,
@@ -624,7 +626,7 @@ static int module_clone(int argc, const char **argv, const char *prefix)
                                   module_clone_options);
 
        strbuf_addf(&sb, "%s/modules/%s", get_git_dir(), name);
-       sm_gitdir = xstrdup(absolute_path(sb.buf));
+       sm_gitdir = absolute_pathdup(sb.buf);
        strbuf_reset(&sb);
 
        if (!is_absolute_path(path)) {
@@ -672,6 +674,20 @@ static int module_clone(int argc, const char **argv, const char *prefix)
                die(_("could not get submodule directory for '%s'"), path);
        git_config_set_in_file(p, "core.worktree",
                               relative_path(path, sm_gitdir, &rel_path));
+
+       /* setup alternateLocation and alternateErrorStrategy in the cloned submodule if needed */
+       git_config_get_string("submodule.alternateLocation", &sm_alternate);
+       if (sm_alternate)
+               git_config_set_in_file(p, "submodule.alternateLocation",
+                                          sm_alternate);
+       git_config_get_string("submodule.alternateErrorStrategy", &error_strategy);
+       if (error_strategy)
+               git_config_set_in_file(p, "submodule.alternateErrorStrategy",
+                                          error_strategy);
+
+       free(sm_alternate);
+       free(error_strategy);
+
        strbuf_release(&sb);
        strbuf_release(&rel_path);
        free(sm_gitdir);
@@ -1076,21 +1092,62 @@ static int resolve_remote_submodule_branch(int argc, const char **argv,
        return 0;
 }
 
+static int absorb_git_dirs(int argc, const char **argv, const char *prefix)
+{
+       int i;
+       struct pathspec pathspec;
+       struct module_list list = MODULE_LIST_INIT;
+       unsigned flags = ABSORB_GITDIR_RECURSE_SUBMODULES;
+
+       struct option embed_gitdir_options[] = {
+               OPT_STRING(0, "prefix", &prefix,
+                          N_("path"),
+                          N_("path into the working tree")),
+               OPT_BIT(0, "--recursive", &flags, N_("recurse into submodules"),
+                       ABSORB_GITDIR_RECURSE_SUBMODULES),
+               OPT_END()
+       };
+
+       const char *const git_submodule_helper_usage[] = {
+               N_("git submodule--helper embed-git-dir [<path>...]"),
+               NULL
+       };
+
+       argc = parse_options(argc, argv, prefix, embed_gitdir_options,
+                            git_submodule_helper_usage, 0);
+
+       gitmodules_config();
+       git_config(submodule_config, NULL);
+
+       if (module_list_compute(argc, argv, prefix, &pathspec, &list) < 0)
+               return 1;
+
+       for (i = 0; i < list.nr; i++)
+               absorb_git_dir_into_superproject(prefix,
+                               list.entries[i]->name, flags);
+
+       return 0;
+}
+
+#define SUPPORT_SUPER_PREFIX (1<<0)
+
 struct cmd_struct {
        const char *cmd;
        int (*fn)(int, const char **, const char *);
+       unsigned option;
 };
 
 static struct cmd_struct commands[] = {
-       {"list", module_list},
-       {"name", module_name},
-       {"clone", module_clone},
-       {"update-clone", update_clone},
-       {"relative-path", resolve_relative_path},
-       {"resolve-relative-url", resolve_relative_url},
-       {"resolve-relative-url-test", resolve_relative_url_test},
-       {"init", module_init},
-       {"remote-branch", resolve_remote_submodule_branch}
+       {"list", module_list, 0},
+       {"name", module_name, 0},
+       {"clone", module_clone, 0},
+       {"update-clone", update_clone, 0},
+       {"relative-path", resolve_relative_path, 0},
+       {"resolve-relative-url", resolve_relative_url, 0},
+       {"resolve-relative-url-test", resolve_relative_url_test, 0},
+       {"init", module_init, SUPPORT_SUPER_PREFIX},
+       {"remote-branch", resolve_remote_submodule_branch, 0},
+       {"absorb-git-dirs", absorb_git_dirs, SUPPORT_SUPER_PREFIX},
 };
 
 int cmd_submodule__helper(int argc, const char **argv, const char *prefix)
@@ -1100,9 +1157,15 @@ int cmd_submodule__helper(int argc, const char **argv, const char *prefix)
                die(_("submodule--helper subcommand must be "
                      "called with a subcommand"));
 
-       for (i = 0; i < ARRAY_SIZE(commands); i++)
-               if (!strcmp(argv[1], commands[i].cmd))
+       for (i = 0; i < ARRAY_SIZE(commands); i++) {
+               if (!strcmp(argv[1], commands[i].cmd)) {
+                       if (get_super_prefix() &&
+                           !(commands[i].option & SUPPORT_SUPER_PREFIX))
+                               die(_("%s doesn't support --super-prefix"),
+                                   commands[i].cmd);
                        return commands[i].fn(argc - 1, argv + 1, prefix);
+               }
+       }
 
        die(_("'%s' is not a valid submodule--helper "
              "subcommand"), argv[1]);
index 50e4ae5678c21f348c3ce0e0d0662c9d5f995847..e40c4a96763a371b104a5bf47e6d839ed93e8ef5 100644 (file)
@@ -24,7 +24,7 @@ static const char * const git_tag_usage[] = {
        N_("git tag -d <tagname>..."),
        N_("git tag -l [-n[<num>]] [--contains <commit>] [--points-at <object>]"
                "\n\t\t[--format=<format>] [--[no-]merged [<commit>]] [<pattern>...]"),
-       N_("git tag -v <tagname>..."),
+       N_("git tag -v [--format=<format>] <tagname>..."),
        NULL
 };
 
@@ -66,9 +66,10 @@ static int list_tags(struct ref_filter *filter, struct ref_sorting *sorting, con
 }
 
 typedef int (*each_tag_name_fn)(const char *name, const char *ref,
-                               const unsigned char *sha1);
+                               const unsigned char *sha1, const void *cb_data);
 
-static int for_each_tag_name(const char **argv, each_tag_name_fn fn)
+static int for_each_tag_name(const char **argv, each_tag_name_fn fn,
+                            const void *cb_data)
 {
        const char **p;
        char ref[PATH_MAX];
@@ -87,14 +88,14 @@ static int for_each_tag_name(const char **argv, each_tag_name_fn fn)
                        had_error = 1;
                        continue;
                }
-               if (fn(*p, ref, sha1))
+               if (fn(*p, ref, sha1, cb_data))
                        had_error = 1;
        }
        return had_error;
 }
 
 static int delete_tag(const char *name, const char *ref,
-                               const unsigned char *sha1)
+                     const unsigned char *sha1, const void *cb_data)
 {
        if (delete_ref(ref, sha1, 0))
                return 1;
@@ -103,9 +104,22 @@ static int delete_tag(const char *name, const char *ref,
 }
 
 static int verify_tag(const char *name, const char *ref,
-                               const unsigned char *sha1)
+                     const unsigned char *sha1, const void *cb_data)
 {
-       return gpg_verify_tag(sha1, name, GPG_VERIFY_VERBOSE);
+       int flags;
+       const char *fmt_pretty = cb_data;
+       flags = GPG_VERIFY_VERBOSE;
+
+       if (fmt_pretty)
+               flags = GPG_VERIFY_OMIT_STATUS;
+
+       if (gpg_verify_tag(sha1, name, flags))
+               return -1;
+
+       if (fmt_pretty)
+               pretty_print_ref(name, sha1, fmt_pretty);
+
+       return 0;
 }
 
 static int do_sign(struct strbuf *buffer)
@@ -335,6 +349,7 @@ int cmd_tag(int argc, const char **argv, const char *prefix)
        struct ref_filter filter;
        static struct ref_sorting *sorting = NULL, **sorting_tail = &sorting;
        const char *format = NULL;
+       int icase = 0;
        struct option options[] = {
                OPT_CMDMODE('l', "list", &cmdmode, N_("list tag names"), 'l'),
                { OPTION_INTEGER, 'n', NULL, &filter.lines, N_("n"),
@@ -370,6 +385,7 @@ int cmd_tag(int argc, const char **argv, const char *prefix)
                        N_("print only tags of the object"), 0, parse_opt_object_name
                },
                OPT_STRING(  0 , "format", &format, N_("format"), N_("format to use for the output")),
+               OPT_BOOL('i', "ignore-case", &icase, N_("sorting and filtering are case insensitive")),
                OPT_END()
        };
 
@@ -401,6 +417,8 @@ int cmd_tag(int argc, const char **argv, const char *prefix)
        }
        if (!sorting)
                sorting = ref_default_sorting();
+       sorting->ignore_case = icase;
+       filter.ignore_case = icase;
        if (cmdmode == 'l') {
                int ret;
                if (column_active(colopts)) {
@@ -424,9 +442,12 @@ int cmd_tag(int argc, const char **argv, const char *prefix)
        if (filter.merge_commit)
                die(_("--merged and --no-merged option are only allowed with -l"));
        if (cmdmode == 'd')
-               return for_each_tag_name(argv, delete_tag);
-       if (cmdmode == 'v')
-               return for_each_tag_name(argv, verify_tag);
+               return for_each_tag_name(argv, delete_tag, NULL);
+       if (cmdmode == 'v') {
+               if (format)
+                       verify_ref_format(format);
+               return for_each_tag_name(argv, verify_tag, format);
+       }
 
        if (msg.given || msgfile) {
                if (msg.given && msgfile)
index f3f07e7f1cb2d952144bf98969b481dc331155bf..d530e89368b42bf1465784b80163b9158a06585a 100644 (file)
@@ -1012,6 +1012,7 @@ int cmd_update_index(int argc, const char **argv, const char *prefix)
        /* We can't free this memory, it becomes part of a linked list parsed atexit() */
        lock_file = xcalloc(1, sizeof(struct lock_file));
 
+       /* we will diagnose later if it turns out that we need to update it */
        newfd = hold_locked_index(lock_file, 0);
        if (newfd < 0)
                lock_error = errno;
index 99f8148cf79bac1d636bfe35a93282f3da2ebfd7..5199553d914f266315ffc3f170ef95a2a7f621ff 100644 (file)
 #include <signal.h>
 #include "parse-options.h"
 #include "gpg-interface.h"
+#include "ref-filter.h"
 
 static const char * const verify_tag_usage[] = {
-               N_("git verify-tag [-v | --verbose] <tag>..."),
+               N_("git verify-tag [-v | --verbose] [--format=<format>] <tag>..."),
                NULL
 };
 
@@ -30,9 +31,11 @@ int cmd_verify_tag(int argc, const char **argv, const char *prefix)
 {
        int i = 1, verbose = 0, had_error = 0;
        unsigned flags = 0;
+       char *fmt_pretty = NULL;
        const struct option verify_tag_options[] = {
                OPT__VERBOSE(&verbose, N_("print tag contents")),
                OPT_BIT(0, "raw", &flags, N_("print raw gpg status output"), GPG_VERIFY_RAW),
+               OPT_STRING(  0 , "format", &fmt_pretty, N_("format"), N_("format to use for the output")),
                OPT_END()
        };
 
@@ -46,13 +49,26 @@ int cmd_verify_tag(int argc, const char **argv, const char *prefix)
        if (verbose)
                flags |= GPG_VERIFY_VERBOSE;
 
+       if (fmt_pretty) {
+               verify_ref_format(fmt_pretty);
+               flags |= GPG_VERIFY_OMIT_STATUS;
+       }
+
        while (i < argc) {
                unsigned char sha1[20];
                const char *name = argv[i++];
-               if (get_sha1(name, sha1))
+               if (get_sha1(name, sha1)) {
                        had_error = !!error("tag '%s' not found.", name);
-               else if (gpg_verify_tag(sha1, name, flags))
+                       continue;
+               }
+
+               if (gpg_verify_tag(sha1, name, flags)) {
                        had_error = 1;
+                       continue;
+               }
+
+               if (fmt_pretty)
+                       pretty_print_ref(name, sha1, fmt_pretty);
        }
        return had_error;
 }
index 5c4854d3e4a679f59f4a7db7cb3f37bd0e210622..831fe058a53da95643b1a93038f576d5bffea7ef 100644 (file)
@@ -125,9 +125,9 @@ static int prune(int ac, const char **av, const char *prefix)
 {
        struct option options[] = {
                OPT__DRY_RUN(&show_only, N_("do not remove, show only")),
-               OPT__VERBOSE(&verbose, N_("report pruned objects")),
+               OPT__VERBOSE(&verbose, N_("report pruned working trees")),
                OPT_EXPIRY_DATE(0, "expire", &expire,
-                               N_("expire objects older than <time>")),
+                               N_("expire working trees older than <time>")),
                OPT_END()
        };
 
@@ -388,7 +388,7 @@ static void show_worktree_porcelain(struct worktree *wt)
                printf("HEAD %s\n", sha1_to_hex(wt->head_sha1));
                if (wt->is_detached)
                        printf("detached\n");
-               else
+               else if (wt->head_ref)
                        printf("branch %s\n", wt->head_ref);
        }
        printf("\n");
@@ -406,10 +406,12 @@ static void show_worktree(struct worktree *wt, int path_maxlen, int abbrev_len)
        else {
                strbuf_addf(&sb, "%-*s ", abbrev_len,
                                find_unique_abbrev(wt->head_sha1, DEFAULT_ABBREV));
-               if (!wt->is_detached)
+               if (wt->is_detached)
+                       strbuf_addstr(&sb, "(detached HEAD)");
+               else if (wt->head_ref)
                        strbuf_addf(&sb, "[%s]", shorten_unambiguous_ref(wt->head_ref, 0));
                else
-                       strbuf_addstr(&sb, "(detached HEAD)");
+                       strbuf_addstr(&sb, "(error)");
        }
        printf("%s\n", sb.buf);
 
@@ -445,7 +447,7 @@ static int list(int ac, const char **av, const char *prefix)
        if (ac)
                usage_with_options(worktree_usage, options);
        else {
-               struct worktree **worktrees = get_worktrees();
+               struct worktree **worktrees = get_worktrees(GWT_SORT_LINKED);
                int path_maxlen = 0, abbrev = DEFAULT_ABBREV, i;
 
                if (!porcelain)
@@ -476,7 +478,7 @@ static int lock_worktree(int ac, const char **av, const char *prefix)
        if (ac != 1)
                usage_with_options(worktree_usage, options);
 
-       worktrees = get_worktrees();
+       worktrees = get_worktrees(0);
        wt = find_worktree(worktrees, prefix, av[0]);
        if (!wt)
                die(_("'%s' is not a working tree"), av[0]);
@@ -509,7 +511,7 @@ static int unlock_worktree(int ac, const char **av, const char *prefix)
        if (ac != 1)
                usage_with_options(worktree_usage, options);
 
-       worktrees = get_worktrees();
+       worktrees = get_worktrees(0);
        wt = find_worktree(worktrees, prefix, av[0]);
        if (!wt)
                die(_("'%s' is not a working tree"), av[0]);
index 4347f5c76aa72873eb5ccb090584428399f3159c..991b4a13e2491093ed9e9942ac116843973f65ff 100644 (file)
@@ -7,8 +7,6 @@
 #include "pack.h"
 #include "strbuf.h"
 
-static int pack_compression_level = Z_DEFAULT_COMPRESSION;
-
 static struct bulk_checkin_state {
        unsigned plugged:1;
 
diff --git a/cache.h b/cache.h
index a50a61a19787de94daa9d66caa9fcccca58081fe..61fc86e6d7199518555632a0b0b584471b9083a8 100644 (file)
--- a/cache.h
+++ b/cache.h
@@ -507,14 +507,16 @@ extern int is_nonbare_repository_dir(struct strbuf *path);
 #define READ_GITFILE_ERR_NO_PATH 6
 #define READ_GITFILE_ERR_NOT_A_REPO 7
 #define READ_GITFILE_ERR_TOO_LARGE 8
+extern void read_gitfile_error_die(int error_code, const char *path, const char *dir);
 extern const char *read_gitfile_gently(const char *path, int *return_error_code);
 #define read_gitfile(path) read_gitfile_gently((path), NULL)
-extern const char *resolve_gitdir(const char *suspect);
+extern const char *resolve_gitdir_gently(const char *suspect, int *return_error_code);
+#define resolve_gitdir(path) resolve_gitdir_gently((path), NULL)
+
 extern void set_git_work_tree(const char *tree);
 
 #define ALTERNATE_DB_ENVIRONMENT "GIT_ALTERNATE_OBJECT_DIRECTORIES"
 
-extern const char **get_pathspec(const char *prefix, const char **pathspec);
 extern void setup_work_tree(void);
 extern const char *setup_git_directory_gently(int *);
 extern const char *setup_git_directory(void);
@@ -575,7 +577,26 @@ extern int verify_path(const char *path);
 extern int index_dir_exists(struct index_state *istate, const char *name, int namelen);
 extern void adjust_dirname_case(struct index_state *istate, char *name);
 extern struct cache_entry *index_file_exists(struct index_state *istate, const char *name, int namelen, int igncase);
+
+/*
+ * Searches for an entry defined by name and namelen in the given index.
+ * If the return value is positive (including 0) it is the position of an
+ * exact match. If the return value is negative, the negated value minus 1
+ * is the position where the entry would be inserted.
+ * Example: The current index consists of these files and its stages:
+ *
+ *   b#0, d#0, f#1, f#3
+ *
+ * index_name_pos(&index, "a", 1) -> -1
+ * index_name_pos(&index, "b", 1) ->  0
+ * index_name_pos(&index, "c", 1) -> -2
+ * index_name_pos(&index, "d", 1) ->  1
+ * index_name_pos(&index, "e", 1) -> -3
+ * index_name_pos(&index, "f", 1) -> -3
+ * index_name_pos(&index, "g", 1) -> -5
+ */
 extern int index_name_pos(const struct index_state *, const char *name, int namelen);
+
 #define ADD_CACHE_OK_TO_ADD 1          /* Ok to add */
 #define ADD_CACHE_OK_TO_REPLACE 2      /* Ok to replace file/directory */
 #define ADD_CACHE_SKIP_DFCHECK 4       /* Ok to skip DF conflict checks */
@@ -584,7 +605,10 @@ extern int index_name_pos(const struct index_state *, const char *name, int name
 #define ADD_CACHE_KEEP_CACHE_TREE 32   /* Do not invalidate cache-tree */
 extern int add_index_entry(struct index_state *, struct cache_entry *ce, int option);
 extern void rename_index_entry_at(struct index_state *, int pos, const char *new_name);
+
+/* Remove entry, return true if there are more entries to go. */
 extern int remove_index_entry_at(struct index_state *, int pos);
+
 extern void remove_marked_cache_entries(struct index_state *istate);
 extern int remove_file_from_index(struct index_state *, const char *path);
 #define ADD_CACHE_VERBOSE 1
@@ -592,14 +616,24 @@ extern int remove_file_from_index(struct index_state *, const char *path);
 #define ADD_CACHE_IGNORE_ERRORS        4
 #define ADD_CACHE_IGNORE_REMOVAL 8
 #define ADD_CACHE_INTENT 16
+/*
+ * These two are used to add the contents of the file at path
+ * to the index, marking the working tree up-to-date by storing
+ * the cached stat info in the resulting cache entry.  A caller
+ * that has already run lstat(2) on the path can call
+ * add_to_index(), and all others can call add_file_to_index();
+ * the latter will do necessary lstat(2) internally before
+ * calling the former.
+ */
 extern int add_to_index(struct index_state *, const char *path, struct stat *, int flags);
 extern int add_file_to_index(struct index_state *, const char *path, int flags);
+
 extern struct cache_entry *make_cache_entry(unsigned int mode, const unsigned char *sha1, const char *path, int stage, unsigned int refresh_options);
 extern int chmod_index_entry(struct index_state *, struct cache_entry *ce, char flip);
 extern int ce_same_name(const struct cache_entry *a, const struct cache_entry *b);
 extern void set_object_name_for_intent_to_add_entry(struct cache_entry *ce);
 extern int index_name_is_other(const struct index_state *, const char *, int);
-extern void *read_blob_data_from_index(struct index_state *, const char *, unsigned long *);
+extern void *read_blob_data_from_index(const struct index_state *, const char *, unsigned long *);
 
 /* do stat comparison even if CE_VALID is true */
 #define CE_MATCH_IGNORE_VALID          01
@@ -661,7 +695,6 @@ extern int minimum_abbrev, default_abbrev;
 extern int ignore_case;
 extern int assume_unchanged;
 extern int prefer_symlink_refs;
-extern int log_all_ref_updates;
 extern int warn_ambiguous_refs;
 extern int warn_on_object_refname_ambiguity;
 extern const char *apply_default_whitespace;
@@ -670,7 +703,7 @@ extern const char *git_attributes_file;
 extern const char *git_hooks_path;
 extern int zlib_compression_level;
 extern int core_compression_level;
-extern int core_compression_seen;
+extern int pack_compression_level;
 extern size_t packed_git_window_size;
 extern size_t packed_git_limit;
 extern size_t delta_base_cache_limit;
@@ -729,6 +762,14 @@ enum hide_dotfiles_type {
 };
 extern enum hide_dotfiles_type hide_dotfiles;
 
+enum log_refs_config {
+       LOG_REFS_UNSET = -1,
+       LOG_REFS_NONE = 0,
+       LOG_REFS_NORMAL,
+       LOG_REFS_ALWAYS
+};
+extern enum log_refs_config log_all_ref_updates;
+
 enum branch_track {
        BRANCH_TRACK_UNSPECIFIED = -1,
        BRANCH_TRACK_NEVER = 0,
@@ -1064,9 +1105,13 @@ static inline int is_absolute_path(const char *path)
        return is_dir_sep(path[0]) || has_dos_drive_prefix(path);
 }
 int is_directory(const char *);
+char *strbuf_realpath(struct strbuf *resolved, const char *path,
+                     int die_on_error);
 const char *real_path(const char *path);
 const char *real_path_if_valid(const char *path);
+char *real_pathdup(const char *path);
 const char *absolute_path(const char *path);
+char *absolute_pathdup(const char *path);
 const char *remove_leading_path(const char *in, const char *prefix);
 const char *relative_path(const char *in, const char *prefix, struct strbuf *sb);
 int normalize_path_copy_len(char *dst, const char *src, int *prefix_len);
@@ -1125,7 +1170,8 @@ extern int write_sha1_file(const void *buf, unsigned long len, const char *type,
 extern int hash_sha1_file_literally(const void *buf, unsigned long len, const char *type, unsigned char *sha1, unsigned flags);
 extern int pretend_sha1_file(void *, unsigned long, enum object_type, unsigned char *);
 extern int force_object_loose(const unsigned char *sha1, time_t mtime);
-extern int git_open(const char *name);
+extern int git_open_cloexec(const char *name, int flags);
+#define git_open(name) git_open_cloexec(name, O_RDONLY)
 extern void *map_sha1_file(const unsigned char *sha1, unsigned long *size);
 extern int unpack_sha1_header(git_zstream *stream, unsigned char *map, unsigned long mapsize, void *buffer, unsigned long bufsiz);
 extern int parse_sha1_header(const char *hdr, unsigned long *sizep);
@@ -1139,6 +1185,19 @@ extern int finalize_object_file(const char *tmpfile, const char *filename);
 
 extern int has_sha1_pack(const unsigned char *sha1);
 
+/*
+ * Open the loose object at path, check its sha1, and return the contents,
+ * type, and size. If the object is a blob, then "contents" may return NULL,
+ * to allow streaming of large blobs.
+ *
+ * Returns 0 on success, negative on error (details may be written to stderr).
+ */
+int read_loose_object(const char *path,
+                     const unsigned char *expected_sha1,
+                     enum object_type *type,
+                     unsigned long *size,
+                     void **contents);
+
 /*
  * Return true iff we have an object named sha1, whether local or in
  * an alternate object database, and whether packed or loose.  This
@@ -1690,6 +1749,8 @@ extern int git_default_config(const char *, const char *, void *);
 extern int git_config_from_file(config_fn_t fn, const char *, void *);
 extern int git_config_from_mem(config_fn_t fn, const enum config_origin_type,
                                        const char *name, const char *buf, size_t len, void *data);
+extern int git_config_from_blob_sha1(config_fn_t fn, const char *name,
+                                    const unsigned char *sha1, void *data);
 extern void git_config_push_parameter(const char *text);
 extern int git_config_from_parameters(config_fn_t fn, void *data);
 extern void git_config(config_fn_t fn, void *);
diff --git a/color.c b/color.c
index 1b95e6b2a7bb1601fa5862de8989775e197c7b41..dee61557e03f452f1e20ce6c8c467203aa8aed60 100644 (file)
--- a/color.c
+++ b/color.c
@@ -207,7 +207,17 @@ int color_parse_mem(const char *value, int value_len, char *dst)
        struct color fg = { COLOR_UNSPECIFIED };
        struct color bg = { COLOR_UNSPECIFIED };
 
-       if (!strncasecmp(value, "reset", len)) {
+       while (len > 0 && isspace(*ptr)) {
+               ptr++;
+               len--;
+       }
+
+       if (!len) {
+               dst[0] = '\0';
+               return 0;
+       }
+
+       if (!strncasecmp(ptr, "reset", len)) {
                xsnprintf(dst, end - dst, GIT_COLOR_RESET);
                return 0;
        }
index 2a94137bbb383fda655b481446d0891062d73cb9..a1fad28fd82da18cc2b8f43e8eb26fed9864411b 100644 (file)
@@ -107,7 +107,6 @@ git-read-tree                           plumbingmanipulators
 git-rebase                              mainporcelain           history
 git-receive-pack                        synchelpers
 git-reflog                              ancillarymanipulators
-git-relink                              ancillarymanipulators
 git-remote                              ancillarymanipulators
 git-repack                              ancillarymanipulators
 git-replace                             ancillarymanipulators
index 856fd4aeeff654c45ba0a6149f9db2c22806e0cb..2cf85158b4899b664a3cbae8d0777f5a9e473318 100644 (file)
--- a/commit.c
+++ b/commit.c
@@ -1649,7 +1649,7 @@ const char *find_commit_header(const char *msg, const char *key, size_t *out_len
 }
 
 /*
- * Inspect sb and determine the true "end" of the log message, in
+ * Inspect the given string and determine the true "end" of the log message, in
  * order to find where to put a new Signed-off-by: line.  Ignored are
  * trailing comment lines and blank lines, and also the traditional
  * "Conflicts:" block that is not commented out, so that we can use
@@ -1659,37 +1659,37 @@ const char *find_commit_header(const char *msg, const char *key, size_t *out_len
  * Returns the number of bytes from the tail to ignore, to be fed as
  * the second parameter to append_signoff().
  */
-int ignore_non_trailer(struct strbuf *sb)
+int ignore_non_trailer(const char *buf, size_t len)
 {
        int boc = 0;
        int bol = 0;
        int in_old_conflicts_block = 0;
 
-       while (bol < sb->len) {
-               char *next_line;
+       while (bol < len) {
+               const char *next_line = memchr(buf + bol, '\n', len - bol);
 
-               if (!(next_line = memchr(sb->buf + bol, '\n', sb->len - bol)))
-                       next_line = sb->buf + sb->len;
+               if (!next_line)
+                       next_line = buf + len;
                else
                        next_line++;
 
-               if (sb->buf[bol] == comment_line_char || sb->buf[bol] == '\n') {
+               if (buf[bol] == comment_line_char || buf[bol] == '\n') {
                        /* is this the first of the run of comments? */
                        if (!boc)
                                boc = bol;
                        /* otherwise, it is just continuing */
-               } else if (starts_with(sb->buf + bol, "Conflicts:\n")) {
+               } else if (starts_with(buf + bol, "Conflicts:\n")) {
                        in_old_conflicts_block = 1;
                        if (!boc)
                                boc = bol;
-               } else if (in_old_conflicts_block && sb->buf[bol] == '\t') {
+               } else if (in_old_conflicts_block && buf[bol] == '\t') {
                        ; /* a pathname in the conflicts block */
                } else if (boc) {
                        /* the previous was not trailing comment */
                        boc = 0;
                        in_old_conflicts_block = 0;
                }
-               bol = next_line - sb->buf;
+               bol = next_line - buf;
        }
-       return boc ? sb->len - boc : 0;
+       return boc ? len - boc : 0;
 }
index afd14f318c0c4d18f3a03781d3229f2fdc0f64c6..9c12abb91110151e3a982c4d8baf8753d0382441 100644 (file)
--- a/commit.h
+++ b/commit.h
@@ -355,7 +355,7 @@ extern const char *find_commit_header(const char *msg, const char *key,
                                      size_t *out_len);
 
 /* Find the end of the log message, the right place for a new trailer. */
-extern int ignore_non_trailer(struct strbuf *sb);
+extern int ignore_non_trailer(const char *buf, size_t len);
 
 typedef void (*each_mergetag_fn)(struct commit *commit, struct commit_extra_header *extra,
                                 void *cb_data);
index 44a29e8b13cb5203e2d35c99b8e2b5fec49f6981..c654f95551c33d6b346ae7fe43a6cac987dd6b75 100644 (file)
@@ -33,7 +33,7 @@ int main(int argc, const char **argv)
 
        git_setup_gettext();
 
-       argv[0] = git_extract_argv0_path(argv[0]);
+       git_extract_argv0_path(argv[0]);
 
        restore_sigpipe_to_default();
 
index 034fff9479d03d2a2e3c7017a4fe4131461f0ec6..33501695550accdb08368aa867b9addb25c90d5f 100644 (file)
@@ -384,6 +384,9 @@ int mingw_raise(int sig);
  * ANSI emulation wrappers
  */
 
+int winansi_isatty(int fd);
+#define isatty winansi_isatty
+
 void winansi_init(void);
 HANDLE winansi_get_osfhandle(int fd);
 
diff --git a/compat/qsort_s.c b/compat/qsort_s.c
new file mode 100644 (file)
index 0000000..52d1f0a
--- /dev/null
@@ -0,0 +1,69 @@
+#include "../git-compat-util.h"
+
+/*
+ * A merge sort implementation, simplified from the qsort implementation
+ * by Mike Haertel, which is a part of the GNU C Library.
+ * Added context pointer, safety checks and return value.
+ */
+
+static void msort_with_tmp(void *b, size_t n, size_t s,
+                          int (*cmp)(const void *, const void *, void *),
+                          char *t, void *ctx)
+{
+       char *tmp;
+       char *b1, *b2;
+       size_t n1, n2;
+
+       if (n <= 1)
+               return;
+
+       n1 = n / 2;
+       n2 = n - n1;
+       b1 = b;
+       b2 = (char *)b + (n1 * s);
+
+       msort_with_tmp(b1, n1, s, cmp, t, ctx);
+       msort_with_tmp(b2, n2, s, cmp, t, ctx);
+
+       tmp = t;
+
+       while (n1 > 0 && n2 > 0) {
+               if (cmp(b1, b2, ctx) <= 0) {
+                       memcpy(tmp, b1, s);
+                       tmp += s;
+                       b1 += s;
+                       --n1;
+               } else {
+                       memcpy(tmp, b2, s);
+                       tmp += s;
+                       b2 += s;
+                       --n2;
+               }
+       }
+       if (n1 > 0)
+               memcpy(tmp, b1, n1 * s);
+       memcpy(b, t, (n - n2) * s);
+}
+
+int git_qsort_s(void *b, size_t n, size_t s,
+               int (*cmp)(const void *, const void *, void *), void *ctx)
+{
+       const size_t size = st_mult(n, s);
+       char buf[1024];
+
+       if (!n)
+               return 0;
+       if (!b || !cmp)
+               return -1;
+
+       if (size < sizeof(buf)) {
+               /* The temporary array fits on the small on-stack buffer. */
+               msort_with_tmp(b, n, s, cmp, buf, ctx);
+       } else {
+               /* It's somewhat large, so malloc it.  */
+               char *tmp = xmalloc(size);
+               msort_with_tmp(b, n, s, cmp, tmp, ctx);
+               free(tmp);
+       }
+       return 0;
+}
index db4a5b0a37d687218ab085f22b57eb35e28893b8..82b89ab13767a5e562d4f41826d98bce0d704e1c 100644 (file)
@@ -6,6 +6,12 @@
 #include "../git-compat-util.h"
 #include <wingdi.h>
 #include <winreg.h>
+#include "win32.h"
+
+static int fd_is_interactive[3] = { 0, 0, 0 };
+#define FD_CONSOLE 0x1
+#define FD_SWAPPED 0x2
+#define FD_MSYS    0x4
 
 /*
  ANSI codes used by git: m, K
@@ -81,6 +87,7 @@ static void warn_if_raster_font(void)
 static int is_console(int fd)
 {
        CONSOLE_SCREEN_BUFFER_INFO sbi;
+       DWORD mode;
        HANDLE hcon;
 
        static int initialized = 0;
@@ -95,9 +102,15 @@ static int is_console(int fd)
                return 0;
 
        /* check if its a handle to a console output screen buffer */
-       if (!GetConsoleScreenBufferInfo(hcon, &sbi))
+       if (!fd) {
+               if (!GetConsoleMode(hcon, &mode))
+                       return 0;
+       } else if (!GetConsoleScreenBufferInfo(hcon, &sbi))
                return 0;
 
+       if (fd >= 0 && fd <= 2)
+               fd_is_interactive[fd] |= FD_CONSOLE;
+
        /* initialize attributes */
        if (!initialized) {
                console = hcon;
@@ -459,76 +472,47 @@ static HANDLE duplicate_handle(HANDLE hnd)
        return hresult;
 }
 
-
-/*
- * Make MSVCRT's internal file descriptor control structure accessible
- * so that we can tweak OS handles and flags directly (we need MSVCRT
- * to treat our pipe handle as if it were a console).
- *
- * We assume that the ioinfo structure (exposed by MSVCRT.dll via
- * __pioinfo) starts with the OS handle and the flags. The exact size
- * varies between MSVCRT versions, so we try different sizes until
- * toggling the FDEV bit of _pioinfo(1)->osflags is reflected in
- * isatty(1).
- */
-typedef struct {
-       HANDLE osfhnd;
-       char osflags;
-} ioinfo;
-
-extern __declspec(dllimport) ioinfo *__pioinfo[];
-
-static size_t sizeof_ioinfo = 0;
-
-#define IOINFO_L2E 5
-#define IOINFO_ARRAY_ELTS (1 << IOINFO_L2E)
-
-#define FPIPE 0x08
-#define FDEV  0x40
-
-static inline ioinfo* _pioinfo(int fd)
-{
-       return (ioinfo*)((char*)__pioinfo[fd >> IOINFO_L2E] +
-                       (fd & (IOINFO_ARRAY_ELTS - 1)) * sizeof_ioinfo);
-}
-
-static int init_sizeof_ioinfo(void)
-{
-       int istty, wastty;
-       /* don't init twice */
-       if (sizeof_ioinfo)
-               return sizeof_ioinfo >= 256;
-
-       sizeof_ioinfo = sizeof(ioinfo);
-       wastty = isatty(1);
-       while (sizeof_ioinfo < 256) {
-               /* toggle FDEV flag, check isatty, then toggle back */
-               _pioinfo(1)->osflags ^= FDEV;
-               istty = isatty(1);
-               _pioinfo(1)->osflags ^= FDEV;
-               /* return if we found the correct size */
-               if (istty != wastty)
-                       return 0;
-               sizeof_ioinfo += sizeof(void*);
-       }
-       error("Tweaking file descriptors doesn't work with this MSVCRT.dll");
-       return 1;
-}
-
 static HANDLE swap_osfhnd(int fd, HANDLE new_handle)
 {
-       ioinfo *pioinfo;
-       HANDLE old_handle;
-
-       /* init ioinfo size if we haven't done so */
-       if (init_sizeof_ioinfo())
-               return INVALID_HANDLE_VALUE;
-
-       /* get ioinfo pointer and change the handles */
-       pioinfo = _pioinfo(fd);
-       old_handle = pioinfo->osfhnd;
-       pioinfo->osfhnd = new_handle;
-       return old_handle;
+       /*
+        * Create a copy of the original handle associated with fd
+        * because the original will get closed when we dup2().
+        */
+       HANDLE handle = (HANDLE)_get_osfhandle(fd);
+       HANDLE duplicate = duplicate_handle(handle);
+
+       /* Create a temp fd associated with the already open "new_handle". */
+       int new_fd = _open_osfhandle((intptr_t)new_handle, O_BINARY);
+
+       assert((fd == 1) || (fd == 2));
+
+       /*
+        * Use stock dup2() to re-bind fd to the new handle.  Note that
+        * this will implicitly close(1) and close both fd=1 and the
+        * originally associated handle.  It will open a new fd=1 and
+        * call DuplicateHandle() on the handle associated with new_fd.
+        * It is because of this implicit close() that we created the
+        * copy of the original.
+        *
+        * Note that we need to update the cached console handle to the
+        * duplicated one because the dup2() call will implicitly close
+        * the original one.
+        *
+        * Note that dup2() when given target := {0,1,2} will also
+        * call SetStdHandle(), so we don't need to worry about that.
+        */
+       if (console == handle)
+               console = duplicate;
+       dup2(new_fd, fd);
+
+       /* Close the temp fd.  This explicitly closes "new_handle"
+        * (because it has been associated with it).
+        */
+       close(new_fd);
+
+       fd_is_interactive[fd] |= FD_SWAPPED;
+
+       return duplicate;
 }
 
 #ifdef DETECT_MSYS_TTY
@@ -553,23 +537,37 @@ static void detect_msys_tty(int fd)
                        buffer, sizeof(buffer) - 2, &result)))
                return;
        name = nameinfo->Name.Buffer;
-       name[nameinfo->Name.Length] = 0;
-
-       /* check if this could be a MSYS2 pty pipe ('msys-XXXX-ptyN-XX') */
-       if (!wcsstr(name, L"msys-") || !wcsstr(name, L"-pty"))
-               return;
-
-       /* init ioinfo size if we haven't done so */
-       if (init_sizeof_ioinfo())
+       name[nameinfo->Name.Length / sizeof(*name)] = 0;
+
+       /*
+        * Check if this could be a MSYS2 pty pipe ('msys-XXXX-ptyN-XX')
+        * or a cygwin pty pipe ('cygwin-XXXX-ptyN-XX')
+        */
+       if ((!wcsstr(name, L"msys-") && !wcsstr(name, L"cygwin-")) ||
+                       !wcsstr(name, L"-pty"))
                return;
 
-       /* set FDEV flag, reset FPIPE flag */
-       _pioinfo(fd)->osflags &= ~FPIPE;
-       _pioinfo(fd)->osflags |= FDEV;
+       fd_is_interactive[fd] |= FD_MSYS;
 }
 
 #endif
 
+/*
+ * Wrapper for isatty().  Most calls in the main git code
+ * call isatty(1 or 2) to see if the instance is interactive
+ * and should: be colored, show progress, paginate output.
+ * We lie and give results for what the descriptor WAS at
+ * startup (and ignore any pipe redirection we internally
+ * do).
+ */
+#undef isatty
+int winansi_isatty(int fd)
+{
+       if (fd >= 0 && fd <= 2)
+               return fd_is_interactive[fd] != 0;
+       return isatty(fd);
+}
+
 void winansi_init(void)
 {
        int con1, con2;
@@ -578,6 +576,10 @@ void winansi_init(void)
        /* check if either stdout or stderr is a console output screen buffer */
        con1 = is_console(1);
        con2 = is_console(2);
+
+       /* Also compute console bit for fd 0 even though we don't need the result here. */
+       is_console(0);
+
        if (!con1 && !con2) {
 #ifdef DETECT_MSYS_TTY
                /* check if stdin / stdout / stderr are MSYS2 pty pipes */
@@ -621,12 +623,10 @@ void winansi_init(void)
  */
 HANDLE winansi_get_osfhandle(int fd)
 {
-       HANDLE hnd = (HANDLE) _get_osfhandle(fd);
-       if (isatty(fd) && GetFileType(hnd) == FILE_TYPE_PIPE) {
-               if (fd == 1 && hconsole1)
-                       return hconsole1;
-               else if (fd == 2 && hconsole2)
-                       return hconsole2;
-       }
-       return hnd;
+       if (fd == 1 && (fd_is_interactive[1] & FD_SWAPPED))
+               return hconsole1;
+       if (fd == 2 && (fd_is_interactive[2] & FD_SWAPPED))
+               return hconsole2;
+
+       return (HANDLE)_get_osfhandle(fd);
 }
index 83fdecb1bc9f6f31bc625c79c1d3c12ba5b27f77..c6b874a7bf763851b425d526f704966aaad129b2 100644 (file)
--- a/config.c
+++ b/config.c
@@ -66,6 +66,8 @@ static struct key_value_info *current_config_kvi;
  */
 static enum config_scope current_parsing_scope;
 
+static int core_compression_seen;
+static int pack_compression_seen;
 static int zlib_compression_seen;
 
 /*
@@ -824,7 +826,12 @@ static int git_default_core_config(const char *var, const char *value)
        }
 
        if (!strcmp(var, "core.logallrefupdates")) {
-               log_all_ref_updates = git_config_bool(var, value);
+               if (value && !strcasecmp(value, "always"))
+                       log_all_ref_updates = LOG_REFS_ALWAYS;
+               else if (git_config_bool(var, value))
+                       log_all_ref_updates = LOG_REFS_NORMAL;
+               else
+                       log_all_ref_updates = LOG_REFS_NONE;
                return 0;
        }
 
@@ -834,10 +841,16 @@ static int git_default_core_config(const char *var, const char *value)
        }
 
        if (!strcmp(var, "core.abbrev")) {
-               int abbrev = git_config_int(var, value);
-               if (abbrev < minimum_abbrev || abbrev > 40)
-                       return -1;
-               default_abbrev = abbrev;
+               if (!value)
+                       return config_error_nonbool(var);
+               if (!strcasecmp(value, "auto"))
+                       default_abbrev = -1;
+               else {
+                       int abbrev = git_config_int(var, value);
+                       if (abbrev < minimum_abbrev || abbrev > 40)
+                               return error("abbrev length out of range: %d", abbrev);
+                       default_abbrev = abbrev;
+               }
                return 0;
        }
 
@@ -865,6 +878,8 @@ static int git_default_core_config(const char *var, const char *value)
                core_compression_seen = 1;
                if (!zlib_compression_seen)
                        zlib_compression_level = level;
+               if (!pack_compression_seen)
+                       pack_compression_level = level;
                return 0;
        }
 
@@ -1125,6 +1140,18 @@ int git_default_config(const char *var, const char *value, void *dummy)
                pack_size_limit_cfg = git_config_ulong(var, value);
                return 0;
        }
+
+       if (!strcmp(var, "pack.compression")) {
+               int level = git_config_int(var, value);
+               if (level == -1)
+                       level = Z_DEFAULT_COMPRESSION;
+               else if (level < 0 || level > Z_BEST_COMPRESSION)
+                       die(_("bad pack compression level %d"), level);
+               pack_compression_level = level;
+               pack_compression_seen = 1;
+               return 0;
+       }
+
        /* Add other config variables here and to Documentation/config.txt. */
        return 0;
 }
@@ -1214,10 +1241,10 @@ int git_config_from_mem(config_fn_t fn, const enum config_origin_type origin_typ
        return do_config_from(&top, fn, data);
 }
 
-static int git_config_from_blob_sha1(config_fn_t fn,
-                                    const char *name,
-                                    const unsigned char *sha1,
-                                    void *data)
+int git_config_from_blob_sha1(config_fn_t fn,
+                             const char *name,
+                             const unsigned char *sha1,
+                             void *data)
 {
        enum object_type type;
        char *buf;
@@ -2194,7 +2221,12 @@ int git_config_set_multivar_in_file_gently(const char *config_filename,
                        goto out_free;
                }
 
-               fstat(in_fd, &st);
+               if (fstat(in_fd, &st) == -1) {
+                       error_errno(_("fstat on %s failed"), config_filename);
+                       ret = CONFIG_INVALID_FILE;
+                       goto out_free;
+               }
+
                contents_sz = xsize_t(st.st_size);
                contents = xmmap_gently(NULL, contents_sz, PROT_READ,
                                        MAP_PRIVATE, in_fd, 0);
@@ -2396,7 +2428,7 @@ int git_config_rename_section_in_file(const char *config_filename,
 
        if (new_name && !section_name_is_ok(new_name)) {
                ret = error("invalid section name: %s", new_name);
-               goto out;
+               goto out_no_rollback;
        }
 
        if (!config_filename)
@@ -2411,10 +2443,13 @@ int git_config_rename_section_in_file(const char *config_filename,
 
        if (!(config_file = fopen(config_filename, "rb"))) {
                /* no config file means nothing to rename, no error */
-               goto unlock_and_out;
+               goto commit_and_out;
        }
 
-       fstat(fileno(config_file), &st);
+       if (fstat(fileno(config_file), &st) == -1) {
+               ret = error_errno(_("fstat on %s failed"), config_filename);
+               goto out;
+       }
 
        if (chmod(get_lock_file_path(lock), st.st_mode & 07777) < 0) {
                ret = error_errno("chmod on %s failed",
@@ -2470,11 +2505,13 @@ int git_config_rename_section_in_file(const char *config_filename,
                }
        }
        fclose(config_file);
-unlock_and_out:
+commit_and_out:
        if (commit_lock_file(lock) < 0)
                ret = error_errno("could not write config file %s",
                                  config_filename);
 out:
+       rollback_lock_file(lock);
+out_no_rollback:
        free(filename_buf);
        return ret;
 }
index b232908f8c8c2eae84bd6ef8ab2a96ac45bf94a3..447f36ac2e31dd4d11e90f326b114a78fdba8df0 100644 (file)
@@ -17,9 +17,6 @@ endif
 # because maintaining the nesting to match is a pain.  If
 # we had "elif" things would have been much nicer...
 
-ifeq ($(uname_M),x86_64)
-       XDL_FAST_HASH = YesPlease
-endif
 ifeq ($(uname_S),OSF1)
        # Need this for u_short definitions et al
        BASIC_CFLAGS += -D_OSF_SOURCE
index 3fceef132bf57623e04a080d03da9aff951f1c11..8e05d1ca4b61b9792a6f7cc4e7d322efeab02e01 100644 (file)
@@ -5,3 +5,9 @@ expression V;
 - if (E)
 -    V = xstrdup(E);
 + V = xstrdup_or_null(E);
+
+@@
+expression E;
+@@
+- xstrdup(absolute_path(E))
++ absolute_pathdup(E)
index 21016bf8dfe87572fb53a05488ba05bb3c08ed97..6c6e1c774d3f1524e11c1b4eb7544c8245a1affb 100644 (file)
@@ -1206,7 +1206,7 @@ _git_describe ()
 
 __git_diff_algorithms="myers minimal patience histogram"
 
-__git_diff_submodule_formats="log short"
+__git_diff_submodule_formats="diff log short"
 
 __git_diff_common_options="--stat --numstat --shortstat --summary
                        --patch-with-stat --name-only --name-status --color
@@ -1552,7 +1552,7 @@ _git_merge ()
        case "$cur" in
        --*)
                __gitcomp "$__git_merge_options
-                       --rerere-autoupdate --no-rerere-autoupdate --abort"
+                       --rerere-autoupdate --no-rerere-autoupdate --abort --continue"
                return
        esac
        __gitcomp_nl "$(__git_refs)"
@@ -1674,7 +1674,7 @@ _git_pull ()
        __git_complete_remote_or_refspec
 }
 
-__git_push_recurse_submodules="check on-demand"
+__git_push_recurse_submodules="check on-demand only"
 
 __git_complete_force_with_lease ()
 {
@@ -1734,10 +1734,10 @@ _git_rebase ()
 {
        local dir="$(__gitdir)"
        if [ -f "$dir"/rebase-merge/interactive ]; then
-               __gitcomp "--continue --skip --abort --edit-todo"
+               __gitcomp "--continue --skip --abort --quit --edit-todo"
                return
        elif [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
-               __gitcomp "--continue --skip --abort"
+               __gitcomp "--continue --skip --abort --quit"
                return
        fi
        __git_complete_strategy && return
@@ -2587,14 +2587,14 @@ _git_svn ()
                        --no-metadata --use-svm-props --use-svnsync-props
                        --log-window-size= --no-checkout --quiet
                        --repack-flags --use-log-author --localtime
+                       --add-author-from
                        --ignore-paths= --include-paths= $remote_opts
                        "
                local init_opts="
                        --template= --shared= --trunk= --tags=
                        --branches= --stdlayout --minimize-url
                        --no-metadata --use-svm-props --use-svnsync-props
-                       --rewrite-root= --prefix= --use-log-author
-                       --add-author-from $remote_opts
+                       --rewrite-root= --prefix= $remote_opts
                        "
                local cmt_opts="
                        --edit --rmdir --find-copies-harder --copy-similarity=
diff --git a/contrib/convert-objects/convert-objects.c b/contrib/convert-objects/convert-objects.c
deleted file mode 100644 (file)
index f3b57bf..0000000
+++ /dev/null
@@ -1,329 +0,0 @@
-#include "cache.h"
-#include "blob.h"
-#include "commit.h"
-#include "tree.h"
-
-struct entry {
-       unsigned char old_sha1[20];
-       unsigned char new_sha1[20];
-       int converted;
-};
-
-#define MAXOBJECTS (1000000)
-
-static struct entry *convert[MAXOBJECTS];
-static int nr_convert;
-
-static struct entry * convert_entry(unsigned char *sha1);
-
-static struct entry *insert_new(unsigned char *sha1, int pos)
-{
-       struct entry *new = xcalloc(1, sizeof(struct entry));
-       hashcpy(new->old_sha1, sha1);
-       memmove(convert + pos + 1, convert + pos, (nr_convert - pos) * sizeof(struct entry *));
-       convert[pos] = new;
-       nr_convert++;
-       if (nr_convert == MAXOBJECTS)
-               die("you're kidding me - hit maximum object limit");
-       return new;
-}
-
-static struct entry *lookup_entry(unsigned char *sha1)
-{
-       int low = 0, high = nr_convert;
-
-       while (low < high) {
-               int next = (low + high) / 2;
-               struct entry *n = convert[next];
-               int cmp = hashcmp(sha1, n->old_sha1);
-               if (!cmp)
-                       return n;
-               if (cmp < 0) {
-                       high = next;
-                       continue;
-               }
-               low = next+1;
-       }
-       return insert_new(sha1, low);
-}
-
-static void convert_binary_sha1(void *buffer)
-{
-       struct entry *entry = convert_entry(buffer);
-       hashcpy(buffer, entry->new_sha1);
-}
-
-static void convert_ascii_sha1(void *buffer)
-{
-       unsigned char sha1[20];
-       struct entry *entry;
-
-       if (get_sha1_hex(buffer, sha1))
-               die("expected sha1, got '%s'", (char *) buffer);
-       entry = convert_entry(sha1);
-       memcpy(buffer, sha1_to_hex(entry->new_sha1), 40);
-}
-
-static unsigned int convert_mode(unsigned int mode)
-{
-       unsigned int newmode;
-
-       newmode = mode & S_IFMT;
-       if (S_ISREG(mode))
-               newmode |= (mode & 0100) ? 0755 : 0644;
-       return newmode;
-}
-
-static int write_subdirectory(void *buffer, unsigned long size, const char *base, int baselen, unsigned char *result_sha1)
-{
-       char *new = xmalloc(size);
-       unsigned long newlen = 0;
-       unsigned long used;
-
-       used = 0;
-       while (size) {
-               int len = 21 + strlen(buffer);
-               char *path = strchr(buffer, ' ');
-               unsigned char *sha1;
-               unsigned int mode;
-               char *slash, *origpath;
-
-               if (!path || strtoul_ui(buffer, 8, &mode))
-                       die("bad tree conversion");
-               mode = convert_mode(mode);
-               path++;
-               if (memcmp(path, base, baselen))
-                       break;
-               origpath = path;
-               path += baselen;
-               slash = strchr(path, '/');
-               if (!slash) {
-                       newlen += sprintf(new + newlen, "%o %s", mode, path);
-                       new[newlen++] = '\0';
-                       hashcpy((unsigned char *)new + newlen, (unsigned char *) buffer + len - 20);
-                       newlen += 20;
-
-                       used += len;
-                       size -= len;
-                       buffer = (char *) buffer + len;
-                       continue;
-               }
-
-               newlen += sprintf(new + newlen, "%o %.*s", S_IFDIR, (int)(slash - path), path);
-               new[newlen++] = 0;
-               sha1 = (unsigned char *)(new + newlen);
-               newlen += 20;
-
-               len = write_subdirectory(buffer, size, origpath, slash-origpath+1, sha1);
-
-               used += len;
-               size -= len;
-               buffer = (char *) buffer + len;
-       }
-
-       write_sha1_file(new, newlen, tree_type, result_sha1);
-       free(new);
-       return used;
-}
-
-static void convert_tree(void *buffer, unsigned long size, unsigned char *result_sha1)
-{
-       void *orig_buffer = buffer;
-       unsigned long orig_size = size;
-
-       while (size) {
-               size_t len = 1+strlen(buffer);
-
-               convert_binary_sha1((char *) buffer + len);
-
-               len += 20;
-               if (len > size)
-                       die("corrupt tree object");
-               size -= len;
-               buffer = (char *) buffer + len;
-       }
-
-       write_subdirectory(orig_buffer, orig_size, "", 0, result_sha1);
-}
-
-static unsigned long parse_oldstyle_date(const char *buf)
-{
-       char c, *p;
-       char buffer[100];
-       struct tm tm;
-       const char *formats[] = {
-               "%c",
-               "%a %b %d %T",
-               "%Z",
-               "%Y",
-               " %Y",
-               NULL
-       };
-       /* We only ever did two timezones in the bad old format .. */
-       const char *timezones[] = {
-               "PDT", "PST", "CEST", NULL
-       };
-       const char **fmt = formats;
-
-       p = buffer;
-       while (isspace(c = *buf))
-               buf++;
-       while ((c = *buf++) != '\n')
-               *p++ = c;
-       *p++ = 0;
-       buf = buffer;
-       memset(&tm, 0, sizeof(tm));
-       do {
-               const char *next = strptime(buf, *fmt, &tm);
-               if (next) {
-                       if (!*next)
-                               return mktime(&tm);
-                       buf = next;
-               } else {
-                       const char **p = timezones;
-                       while (isspace(*buf))
-                               buf++;
-                       while (*p) {
-                               if (!memcmp(buf, *p, strlen(*p))) {
-                                       buf += strlen(*p);
-                                       break;
-                               }
-                               p++;
-                       }
-               }
-               fmt++;
-       } while (*buf && *fmt);
-       printf("left: %s\n", buf);
-       return mktime(&tm);
-}
-
-static int convert_date_line(char *dst, void **buf, unsigned long *sp)
-{
-       unsigned long size = *sp;
-       char *line = *buf;
-       char *next = strchr(line, '\n');
-       char *date = strchr(line, '>');
-       int len;
-
-       if (!next || !date)
-               die("missing or bad author/committer line %s", line);
-       next++; date += 2;
-
-       *buf = next;
-       *sp = size - (next - line);
-
-       len = date - line;
-       memcpy(dst, line, len);
-       dst += len;
-
-       /* Is it already in new format? */
-       if (isdigit(*date)) {
-               int datelen = next - date;
-               memcpy(dst, date, datelen);
-               return len + datelen;
-       }
-
-       /*
-        * Hacky hacky: one of the sparse old-style commits does not have
-        * any date at all, but we can fake it by using the committer date.
-        */
-       if (*date == '\n' && strchr(next, '>'))
-               date = strchr(next, '>')+2;
-
-       return len + sprintf(dst, "%lu -0700\n", parse_oldstyle_date(date));
-}
-
-static void convert_date(void *buffer, unsigned long size, unsigned char *result_sha1)
-{
-       char *new = xmalloc(size + 100);
-       unsigned long newlen = 0;
-
-       /* "tree <sha1>\n" */
-       memcpy(new + newlen, buffer, 46);
-       newlen += 46;
-       buffer = (char *) buffer + 46;
-       size -= 46;
-
-       /* "parent <sha1>\n" */
-       while (!memcmp(buffer, "parent ", 7)) {
-               memcpy(new + newlen, buffer, 48);
-               newlen += 48;
-               buffer = (char *) buffer + 48;
-               size -= 48;
-       }
-
-       /* "author xyz <xyz> date" */
-       newlen += convert_date_line(new + newlen, &buffer, &size);
-       /* "committer xyz <xyz> date" */
-       newlen += convert_date_line(new + newlen, &buffer, &size);
-
-       /* Rest */
-       memcpy(new + newlen, buffer, size);
-       newlen += size;
-
-       write_sha1_file(new, newlen, commit_type, result_sha1);
-       free(new);
-}
-
-static void convert_commit(void *buffer, unsigned long size, unsigned char *result_sha1)
-{
-       void *orig_buffer = buffer;
-       unsigned long orig_size = size;
-
-       if (memcmp(buffer, "tree ", 5))
-               die("Bad commit '%s'", (char *) buffer);
-       convert_ascii_sha1((char *) buffer + 5);
-       buffer = (char *) buffer + 46;    /* "tree " + "hex sha1" + "\n" */
-       while (!memcmp(buffer, "parent ", 7)) {
-               convert_ascii_sha1((char *) buffer + 7);
-               buffer = (char *) buffer + 48;
-       }
-       convert_date(orig_buffer, orig_size, result_sha1);
-}
-
-static struct entry * convert_entry(unsigned char *sha1)
-{
-       struct entry *entry = lookup_entry(sha1);
-       enum object_type type;
-       void *buffer, *data;
-       unsigned long size;
-
-       if (entry->converted)
-               return entry;
-       data = read_sha1_file(sha1, &type, &size);
-       if (!data)
-               die("unable to read object %s", sha1_to_hex(sha1));
-
-       buffer = xmalloc(size);
-       memcpy(buffer, data, size);
-
-       if (type == OBJ_BLOB) {
-               write_sha1_file(buffer, size, blob_type, entry->new_sha1);
-       } else if (type == OBJ_TREE)
-               convert_tree(buffer, size, entry->new_sha1);
-       else if (type == OBJ_COMMIT)
-               convert_commit(buffer, size, entry->new_sha1);
-       else
-               die("unknown object type %d in %s", type, sha1_to_hex(sha1));
-       entry->converted = 1;
-       free(buffer);
-       free(data);
-       return entry;
-}
-
-int main(int argc, char **argv)
-{
-       unsigned char sha1[20];
-       struct entry *entry;
-
-       setup_git_directory();
-
-       if (argc != 2)
-               usage("git-convert-objects <sha1>");
-       if (get_sha1(argv[1], sha1))
-               die("Not a valid object name %s", argv[1]);
-
-       entry = convert_entry(sha1);
-       printf("new sha1: %s\n", sha1_to_hex(entry->new_sha1));
-       return 0;
-}
diff --git a/contrib/convert-objects/git-convert-objects.txt b/contrib/convert-objects/git-convert-objects.txt
deleted file mode 100644 (file)
index f871880..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-git-convert-objects(1)
-======================
-
-NAME
-----
-git-convert-objects - Converts old-style git repository
-
-
-SYNOPSIS
---------
-[verse]
-'git-convert-objects'
-
-DESCRIPTION
------------
-Converts old-style git repository to the latest format
-
-
-Author
-------
-Written by Linus Torvalds <torvalds@osdl.org>
-
-Documentation
---------------
-Documentation by David Greaves, Junio C Hamano and the git-list <git@vger.kernel.org>.
-
-GIT
----
-Part of the linkgit:git[7] suite
index 959822d5f31f60c3b3366292c973e26f0948c45a..df59bdfe97786b5d9f48777cfad80545ff6bbdc2 100755 (executable)
@@ -22,6 +22,7 @@
 use File::Temp qw(tempdir);
 use Getopt::Long qw(:config pass_through);
 use Git;
+use Git::I18N;
 
 sub usage
 {
@@ -59,14 +60,14 @@ sub exit_cleanup
 
 sub use_wt_file
 {
-       my ($workdir, $file, $sha1) = @_;
+       my ($file, $sha1) = @_;
        my $null_sha1 = '0' x 40;
 
-       if (-l "$workdir/$file" || ! -e _) {
+       if (-l $file || ! -e _) {
                return (0, $null_sha1);
        }
 
-       my $wt_sha1 = Git::command_oneline('hash-object', "$workdir/$file");
+       my $wt_sha1 = Git::command_oneline('hash-object', $file);
        my $use = ($sha1 eq $null_sha1) || ($sha1 eq $wt_sha1);
        return ($use, $wt_sha1);
 }
@@ -100,11 +101,17 @@ sub changed_files
 
 sub setup_dir_diff
 {
-       my ($workdir, $symlinks) = @_;
+       my ($worktree, $symlinks) = @_;
        my @gitargs = ('diff', '--raw', '--no-abbrev', '-z', @ARGV);
        my $diffrtn = Git::command_oneline(@gitargs);
        exit(0) unless defined($diffrtn);
 
+       # Go to the root of the worktree now that we've captured the list of
+       # changed files.  The paths returned by diff --raw are relative to the
+       # top-level of the repository, but we defer changing directories so
+       # that @ARGV can perform pathspec limiting in the current directory.
+       chdir($worktree);
+
        # Build index info for left and right sides of the diff
        my $submodule_mode = '160000';
        my $symlink_mode = '120000';
@@ -115,14 +122,14 @@ sub setup_dir_diff
        my $wtindex = '';
        my %submodule;
        my %symlink;
-       my @working_tree = ();
+       my @files = ();
        my %working_tree_dups = ();
        my @rawdiff = split('\0', $diffrtn);
 
        my $i = 0;
        while ($i < $#rawdiff) {
                if ($rawdiff[$i] =~ /^::/) {
-                       warn << 'EOF';
+                       warn __ <<'EOF';
 Combined diff formats ('-c' and '--cc') are not supported in
 directory diff mode ('-d' and '--dir-diff').
 EOF
@@ -167,14 +174,14 @@ sub setup_dir_diff
                }
 
                if ($rmode ne $null_mode) {
-                       # Avoid duplicate working_tree entries
+                       # Avoid duplicate entries
                        if ($working_tree_dups{$dst_path}++) {
                                next;
                        }
                        my ($use, $wt_sha1) =
-                               use_wt_file($workdir, $dst_path, $rsha1);
+                               use_wt_file($dst_path, $rsha1);
                        if ($use) {
-                               push @working_tree, $dst_path;
+                               push @files, $dst_path;
                                $wtindex .= "$rmode $wt_sha1\t$dst_path\0";
                        } else {
                                $rindex .= "$rmode $rsha1\t$dst_path\0";
@@ -184,7 +191,7 @@ sub setup_dir_diff
 
        # Go to the root of the worktree so that the left index files
        # are properly setup -- the index is toplevel-relative.
-       chdir($workdir);
+       chdir($worktree);
 
        # Setup temp directories
        my $tmpdir = tempdir('git-difftool.XXXXX', CLEANUP => 0, TMPDIR => 1);
@@ -224,23 +231,21 @@ sub setup_dir_diff
        delete($ENV{GIT_INDEX_FILE});
 
        # Changes in the working tree need special treatment since they are
-       # not part of the index. Remove any trailing slash from $workdir
-       # before starting to avoid double slashes in symlink targets.
-       $workdir =~ s|/$||;
-       for my $file (@working_tree) {
+       # not part of the index.
+       for my $file (@files) {
                my $dir = dirname($file);
                unless (-d "$rdir/$dir") {
                        mkpath("$rdir/$dir") or
                        exit_cleanup($tmpdir, 1);
                }
                if ($symlinks) {
-                       symlink("$workdir/$file", "$rdir/$file") or
+                       symlink("$worktree/$file", "$rdir/$file") or
                        exit_cleanup($tmpdir, 1);
                } else {
-                       copy("$workdir/$file", "$rdir/$file") or
+                       copy($file, "$rdir/$file") or
                        exit_cleanup($tmpdir, 1);
 
-                       my $mode = stat("$workdir/$file")->mode;
+                       my $mode = stat($file)->mode;
                        chmod($mode, "$rdir/$file") or
                        exit_cleanup($tmpdir, 1);
                }
@@ -278,7 +283,7 @@ sub setup_dir_diff
                exit_cleanup($tmpdir, 1) if not $ok;
        }
 
-       return ($ldir, $rdir, $tmpdir, @working_tree);
+       return ($ldir, $rdir, $tmpdir, @files);
 }
 
 sub write_to_file
@@ -342,7 +347,7 @@ sub main
                if (length($opts{difftool_cmd}) > 0) {
                        $ENV{GIT_DIFF_TOOL} = $opts{difftool_cmd};
                } else {
-                       print "No <tool> given for --tool=<tool>\n";
+                       print __("No <tool> given for --tool=<tool>\n");
                        usage(1);
                }
        }
@@ -350,7 +355,7 @@ sub main
                if (length($opts{extcmd}) > 0) {
                        $ENV{GIT_DIFFTOOL_EXTCMD} = $opts{extcmd};
                } else {
-                       print "No <cmd> given for --extcmd=<cmd>\n";
+                       print __("No <cmd> given for --extcmd=<cmd>\n");
                        usage(1);
                }
        }
@@ -388,8 +393,9 @@ sub dir_diff
        my $error = 0;
        my $repo = Git->repository();
        my $repo_path = $repo->repo_path();
-       my $workdir = $repo->wc_path();
-       my ($a, $b, $tmpdir, @worktree) = setup_dir_diff($workdir, $symlinks);
+       my $worktree = $repo->wc_path();
+       $worktree =~ s|/$||; # Avoid double slashes in symlink targets
+       my ($a, $b, $tmpdir, @files) = setup_dir_diff($worktree, $symlinks);
 
        if (defined($extcmd)) {
                $rc = system($extcmd, $a, $b);
@@ -410,37 +416,38 @@ sub dir_diff
        my %tmp_modified;
        my $indices_loaded = 0;
 
-       for my $file (@worktree) {
+       for my $file (@files) {
                next if $symlinks && -l "$b/$file";
                next if ! -f "$b/$file";
 
                if (!$indices_loaded) {
                        %wt_modified = changed_files(
-                               $repo_path, "$tmpdir/wtindex", $workdir);
+                               $repo_path, "$tmpdir/wtindex", $worktree);
                        %tmp_modified = changed_files(
                                $repo_path, "$tmpdir/wtindex", $b);
                        $indices_loaded = 1;
                }
 
                if (exists $wt_modified{$file} and exists $tmp_modified{$file}) {
-                       my $errmsg = "warning: Both files modified: ";
-                       $errmsg .= "'$workdir/$file' and '$b/$file'.\n";
-                       $errmsg .= "warning: Working tree file has been left.\n";
-                       $errmsg .= "warning:\n";
-                       warn $errmsg;
+                       warn sprintf(__(
+                               "warning: Both files modified:\n" .
+                               "'%s/%s' and '%s/%s'.\n" .
+                               "warning: Working tree file has been left.\n" .
+                               "warning:\n"), $worktree, $file, $b, $file);
                        $error = 1;
                } elsif (exists $tmp_modified{$file}) {
                        my $mode = stat("$b/$file")->mode;
-                       copy("$b/$file", "$workdir/$file") or
+                       copy("$b/$file", $file) or
                        exit_cleanup($tmpdir, 1);
 
-                       chmod($mode, "$workdir/$file") or
+                       chmod($mode, $file) or
                        exit_cleanup($tmpdir, 1);
                }
        }
        if ($error) {
-               warn "warning: Temporary files exist in '$tmpdir'.\n";
-               warn "warning: You may want to cleanup or recover these.\n";
+               warn sprintf(__(
+                       "warning: Temporary files exist in '%s'.\n" .
+                       "warning: You may want to cleanup or recover these.\n"), $tmpdir);
                exit(1);
        } else {
                exit_cleanup($tmpdir, $rc);
diff --git a/contrib/gitview/gitview b/contrib/gitview/gitview
deleted file mode 100755 (executable)
index 4e23c65..0000000
+++ /dev/null
@@ -1,1305 +0,0 @@
-#! /usr/bin/env python
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-
-""" gitview
-GUI browser for git repository
-This program is based on bzrk by Scott James Remnant <scott@ubuntu.com>
-"""
-__copyright__ = "Copyright (C) 2006 Hewlett-Packard Development Company, L.P."
-__copyright__ = "Copyright (C) 2007 Aneesh Kumar K.V <aneesh.kumar@gmail.com"
-__author__    = "Aneesh Kumar K.V <aneesh.kumar@gmail.com>"
-
-
-import sys
-import os
-import gtk
-import pygtk
-import pango
-import re
-import time
-import gobject
-import cairo
-import math
-import string
-import fcntl
-
-have_gtksourceview2 = False
-have_gtksourceview = False
-try:
-    import gtksourceview2
-    have_gtksourceview2 = True
-except ImportError:
-    try:
-        import gtksourceview
-        have_gtksourceview = True
-    except ImportError:
-        print "Running without gtksourceview2 or gtksourceview module"
-
-re_ident = re.compile('(author|committer) (?P<ident>.*) (?P<epoch>\d+) (?P<tz>[+-]\d{4})')
-
-def list_to_string(args, skip):
-       count = len(args)
-       i = skip
-       str_arg=" "
-       while (i < count ):
-               str_arg = str_arg + args[i]
-               str_arg = str_arg + " "
-               i = i+1
-
-       return str_arg
-
-def show_date(epoch, tz):
-       secs = float(epoch)
-       tzsecs = float(tz[1:3]) * 3600
-       tzsecs += float(tz[3:5]) * 60
-       if (tz[0] == "+"):
-               secs += tzsecs
-       else:
-               secs -= tzsecs
-
-       return time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime(secs))
-
-def get_source_buffer_and_view():
-       if have_gtksourceview2:
-               buffer = gtksourceview2.Buffer()
-               slm = gtksourceview2.LanguageManager()
-               gsl = slm.get_language("diff")
-               buffer.set_highlight_syntax(True)
-               buffer.set_language(gsl)
-               view = gtksourceview2.View(buffer)
-       elif have_gtksourceview:
-               buffer = gtksourceview.SourceBuffer()
-               slm = gtksourceview.SourceLanguagesManager()
-               gsl = slm.get_language_from_mime_type("text/x-patch")
-               buffer.set_highlight(True)
-               buffer.set_language(gsl)
-               view = gtksourceview.SourceView(buffer)
-       else:
-               buffer = gtk.TextBuffer()
-               view = gtk.TextView(buffer)
-       return (buffer, view)
-
-
-class CellRendererGraph(gtk.GenericCellRenderer):
-       """Cell renderer for directed graph.
-
-       This module contains the implementation of a custom GtkCellRenderer that
-       draws part of the directed graph based on the lines suggested by the code
-       in graph.py.
-
-       Because we're shiny, we use Cairo to do this, and because we're naughty
-       we cheat and draw over the bits of the TreeViewColumn that are supposed to
-       just be for the background.
-
-       Properties:
-       node              (column, colour, [ names ]) tuple to draw revision node,
-       in_lines          (start, end, colour) tuple list to draw inward lines,
-       out_lines         (start, end, colour) tuple list to draw outward lines.
-       """
-
-       __gproperties__ = {
-       "node":         ( gobject.TYPE_PYOBJECT, "node",
-                         "revision node instruction",
-                         gobject.PARAM_WRITABLE
-                       ),
-       "in-lines":     ( gobject.TYPE_PYOBJECT, "in-lines",
-                         "instructions to draw lines into the cell",
-                         gobject.PARAM_WRITABLE
-                       ),
-       "out-lines":    ( gobject.TYPE_PYOBJECT, "out-lines",
-                         "instructions to draw lines out of the cell",
-                         gobject.PARAM_WRITABLE
-                       ),
-       }
-
-       def do_set_property(self, property, value):
-               """Set properties from GObject properties."""
-               if property.name == "node":
-                       self.node = value
-               elif property.name == "in-lines":
-                       self.in_lines = value
-               elif property.name == "out-lines":
-                       self.out_lines = value
-               else:
-                       raise AttributeError, "no such property: '%s'" % property.name
-
-       def box_size(self, widget):
-               """Calculate box size based on widget's font.
-
-               Cache this as it's probably expensive to get.  It ensures that we
-               draw the graph at least as large as the text.
-               """
-               try:
-                       return self._box_size
-               except AttributeError:
-                       pango_ctx = widget.get_pango_context()
-                       font_desc = widget.get_style().font_desc
-                       metrics = pango_ctx.get_metrics(font_desc)
-
-                       ascent = pango.PIXELS(metrics.get_ascent())
-                       descent = pango.PIXELS(metrics.get_descent())
-
-                       self._box_size = ascent + descent + 6
-                       return self._box_size
-
-       def set_colour(self, ctx, colour, bg, fg):
-               """Set the context source colour.
-
-               Picks a distinct colour based on an internal wheel; the bg
-               parameter provides the value that should be assigned to the 'zero'
-               colours and the fg parameter provides the multiplier that should be
-               applied to the foreground colours.
-               """
-               colours = [
-                   ( 1.0, 0.0, 0.0 ),
-                   ( 1.0, 1.0, 0.0 ),
-                   ( 0.0, 1.0, 0.0 ),
-                   ( 0.0, 1.0, 1.0 ),
-                   ( 0.0, 0.0, 1.0 ),
-                   ( 1.0, 0.0, 1.0 ),
-                   ]
-
-               colour %= len(colours)
-               red   = (colours[colour][0] * fg) or bg
-               green = (colours[colour][1] * fg) or bg
-               blue  = (colours[colour][2] * fg) or bg
-
-               ctx.set_source_rgb(red, green, blue)
-
-       def on_get_size(self, widget, cell_area):
-               """Return the size we need for this cell.
-
-               Each cell is drawn individually and is only as wide as it needs
-               to be, we let the TreeViewColumn take care of making them all
-               line up.
-               """
-               box_size = self.box_size(widget)
-
-               cols = self.node[0]
-               for start, end, colour in self.in_lines + self.out_lines:
-                       cols = int(max(cols, start, end))
-
-               (column, colour, names) = self.node
-               names_len = 0
-               if (len(names) != 0):
-                       for item in names:
-                               names_len += len(item)
-
-               width = box_size * (cols + 1 ) + names_len
-               height = box_size
-
-               # FIXME I have no idea how to use cell_area properly
-               return (0, 0, width, height)
-
-       def on_render(self, window, widget, bg_area, cell_area, exp_area, flags):
-               """Render an individual cell.
-
-               Draws the cell contents using cairo, taking care to clip what we
-               do to within the background area so we don't draw over other cells.
-               Note that we're a bit naughty there and should really be drawing
-               in the cell_area (or even the exposed area), but we explicitly don't
-               want any gutter.
-
-               We try and be a little clever, if the line we need to draw is going
-               to cross other columns we actually draw it as in the .---' style
-               instead of a pure diagonal ... this reduces confusion by an
-               incredible amount.
-               """
-               ctx = window.cairo_create()
-               ctx.rectangle(bg_area.x, bg_area.y, bg_area.width, bg_area.height)
-               ctx.clip()
-
-               box_size = self.box_size(widget)
-
-               ctx.set_line_width(box_size / 8)
-               ctx.set_line_cap(cairo.LINE_CAP_SQUARE)
-
-               # Draw lines into the cell
-               for start, end, colour in self.in_lines:
-                       ctx.move_to(cell_area.x + box_size * start + box_size / 2,
-                                       bg_area.y - bg_area.height / 2)
-
-                       if start - end > 1:
-                               ctx.line_to(cell_area.x + box_size * start, bg_area.y)
-                               ctx.line_to(cell_area.x + box_size * end + box_size, bg_area.y)
-                       elif start - end < -1:
-                               ctx.line_to(cell_area.x + box_size * start + box_size,
-                                               bg_area.y)
-                               ctx.line_to(cell_area.x + box_size * end, bg_area.y)
-
-                       ctx.line_to(cell_area.x + box_size * end + box_size / 2,
-                                       bg_area.y + bg_area.height / 2)
-
-                       self.set_colour(ctx, colour, 0.0, 0.65)
-                       ctx.stroke()
-
-               # Draw lines out of the cell
-               for start, end, colour in self.out_lines:
-                       ctx.move_to(cell_area.x + box_size * start + box_size / 2,
-                                       bg_area.y + bg_area.height / 2)
-
-                       if start - end > 1:
-                               ctx.line_to(cell_area.x + box_size * start,
-                                               bg_area.y + bg_area.height)
-                               ctx.line_to(cell_area.x + box_size * end + box_size,
-                                               bg_area.y + bg_area.height)
-                       elif start - end < -1:
-                               ctx.line_to(cell_area.x + box_size * start + box_size,
-                                               bg_area.y + bg_area.height)
-                               ctx.line_to(cell_area.x + box_size * end,
-                                               bg_area.y + bg_area.height)
-
-                       ctx.line_to(cell_area.x + box_size * end + box_size / 2,
-                                       bg_area.y + bg_area.height / 2 + bg_area.height)
-
-                       self.set_colour(ctx, colour, 0.0, 0.65)
-                       ctx.stroke()
-
-               # Draw the revision node in the right column
-               (column, colour, names) = self.node
-               ctx.arc(cell_area.x + box_size * column + box_size / 2,
-                               cell_area.y + cell_area.height / 2,
-                               box_size / 4, 0, 2 * math.pi)
-
-
-               self.set_colour(ctx, colour, 0.0, 0.5)
-               ctx.stroke_preserve()
-
-               self.set_colour(ctx, colour, 0.5, 1.0)
-               ctx.fill_preserve()
-
-               if (len(names) != 0):
-                       name = " "
-                       for item in names:
-                               name = name + item + " "
-
-                       ctx.set_font_size(13)
-                       if (flags & 1):
-                               self.set_colour(ctx, colour, 0.5, 1.0)
-                       else:
-                               self.set_colour(ctx, colour, 0.0, 0.5)
-                       ctx.show_text(name)
-
-class Commit(object):
-       """ This represent a commit object obtained after parsing the git-rev-list
-       output """
-
-       __slots__ = ['children_sha1', 'message', 'author', 'date', 'committer',
-                                'commit_date', 'commit_sha1', 'parent_sha1']
-
-       children_sha1 = {}
-
-       def __init__(self, commit_lines):
-               self.message            = ""
-               self.author             = ""
-               self.date               = ""
-               self.committer          = ""
-               self.commit_date        = ""
-               self.commit_sha1        = ""
-               self.parent_sha1        = [ ]
-               self.parse_commit(commit_lines)
-
-
-       def parse_commit(self, commit_lines):
-
-               # First line is the sha1 lines
-               line = string.strip(commit_lines[0])
-               sha1 = re.split(" ", line)
-               self.commit_sha1 = sha1[0]
-               self.parent_sha1 = sha1[1:]
-
-               #build the child list
-               for parent_id in self.parent_sha1:
-                       try:
-                               Commit.children_sha1[parent_id].append(self.commit_sha1)
-                       except KeyError:
-                               Commit.children_sha1[parent_id] = [self.commit_sha1]
-
-               # IF we don't have parent
-               if (len(self.parent_sha1) == 0):
-                       self.parent_sha1 = [0]
-
-               for line in commit_lines[1:]:
-                       m = re.match("^ ", line)
-                       if (m != None):
-                               # First line of the commit message used for short log
-                               if self.message == "":
-                                       self.message = string.strip(line)
-                               continue
-
-                       m = re.match("tree", line)
-                       if (m != None):
-                               continue
-
-                       m = re.match("parent", line)
-                       if (m != None):
-                               continue
-
-                       m = re_ident.match(line)
-                       if (m != None):
-                               date = show_date(m.group('epoch'), m.group('tz'))
-                               if m.group(1) == "author":
-                                       self.author = m.group('ident')
-                                       self.date = date
-                               elif m.group(1) == "committer":
-                                       self.committer = m.group('ident')
-                                       self.commit_date = date
-
-                               continue
-
-       def get_message(self, with_diff=0):
-               if (with_diff == 1):
-                       message = self.diff_tree()
-               else:
-                       fp = os.popen("git cat-file commit " + self.commit_sha1)
-                       message = fp.read()
-                       fp.close()
-
-               return message
-
-       def diff_tree(self):
-               fp = os.popen("git diff-tree --pretty --cc  -v -p --always " +  self.commit_sha1)
-               diff = fp.read()
-               fp.close()
-               return diff
-
-class AnnotateWindow(object):
-       """Annotate window.
-       This object represents and manages a single window containing the
-       annotate information of the file
-       """
-
-       def __init__(self):
-               self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
-               self.window.set_border_width(0)
-               self.window.set_title("Git repository browser annotation window")
-               self.prev_read = ""
-
-               # Use two thirds of the screen by default
-               screen = self.window.get_screen()
-               monitor = screen.get_monitor_geometry(0)
-               width = int(monitor.width * 0.66)
-               height = int(monitor.height * 0.66)
-               self.window.set_default_size(width, height)
-
-       def add_file_data(self, filename, commit_sha1, line_num):
-               fp = os.popen("git cat-file blob " + commit_sha1 +":"+filename)
-               i = 1;
-               for line in fp.readlines():
-                       line = string.rstrip(line)
-                       self.model.append(None, ["HEAD", filename, line, i])
-                       i = i+1
-               fp.close()
-
-               # now set the cursor position
-               self.treeview.set_cursor(line_num-1)
-               self.treeview.grab_focus()
-
-       def _treeview_cursor_cb(self, *args):
-               """Callback for when the treeview cursor changes."""
-               (path, col) = self.treeview.get_cursor()
-               commit_sha1 = self.model[path][0]
-               commit_msg = ""
-               fp = os.popen("git cat-file commit " + commit_sha1)
-               for line in fp.readlines():
-                       commit_msg =  commit_msg + line
-               fp.close()
-
-               self.commit_buffer.set_text(commit_msg)
-
-       def _treeview_row_activated(self, *args):
-               """Callback for when the treeview row gets selected."""
-               (path, col) = self.treeview.get_cursor()
-               commit_sha1 = self.model[path][0]
-               filename    = self.model[path][1]
-               line_num    = self.model[path][3]
-
-               window = AnnotateWindow();
-               fp = os.popen("git rev-parse "+ commit_sha1 + "~1")
-               commit_sha1 = string.strip(fp.readline())
-               fp.close()
-               window.annotate(filename, commit_sha1, line_num)
-
-       def data_ready(self, source, condition):
-               while (1):
-                       try :
-                               # A simple readline doesn't work
-                               # a readline bug ??
-                               buffer = source.read(100)
-
-                       except:
-                               # resource temporary not available
-                               return True
-
-                       if (len(buffer) == 0):
-                               gobject.source_remove(self.io_watch_tag)
-                               source.close()
-                               return False
-
-                       if (self.prev_read != ""):
-                               buffer = self.prev_read + buffer
-                               self.prev_read = ""
-
-                       if (buffer[len(buffer) -1] != '\n'):
-                               try:
-                                       newline_index = buffer.rindex("\n")
-                               except ValueError:
-                                       newline_index = 0
-
-                               self.prev_read = buffer[newline_index:(len(buffer))]
-                               buffer = buffer[0:newline_index]
-
-                       for buff in buffer.split("\n"):
-                               annotate_line = re.compile('^([0-9a-f]{40}) (.+) (.+) (.+)$')
-                               m = annotate_line.match(buff)
-                               if not m:
-                                       annotate_line = re.compile('^(filename) (.+)$')
-                                       m = annotate_line.match(buff)
-                                       if not m:
-                                               continue
-                                       filename = m.group(2)
-                               else:
-                                       self.commit_sha1 = m.group(1)
-                                       self.source_line = int(m.group(2))
-                                       self.result_line = int(m.group(3))
-                                       self.count          = int(m.group(4))
-                                       #set the details only when we have the file name
-                                       continue
-
-                               while (self.count > 0):
-                                       # set at result_line + count-1 the sha1 as commit_sha1
-                                       self.count = self.count - 1
-                                       iter = self.model.iter_nth_child(None, self.result_line + self.count-1)
-                                       self.model.set(iter, 0, self.commit_sha1, 1, filename, 3, self.source_line)
-
-
-       def annotate(self, filename, commit_sha1, line_num):
-               # verify the commit_sha1 specified has this filename
-
-               fp = os.popen("git ls-tree "+ commit_sha1 + " -- " + filename)
-               line = string.strip(fp.readline())
-               if line == '':
-                       # pop up the message the file is not there as a part of the commit
-                       fp.close()
-                       dialog = gtk.MessageDialog(parent=None, flags=0,
-                                       type=gtk.MESSAGE_WARNING, buttons=gtk.BUTTONS_CLOSE,
-                                       message_format=None)
-                       dialog.set_markup("The file %s is not present in the parent commit %s" % (filename, commit_sha1))
-                       dialog.run()
-                       dialog.destroy()
-                       return
-
-               fp.close()
-
-               vpan = gtk.VPaned();
-               self.window.add(vpan);
-               vpan.show()
-
-               scrollwin = gtk.ScrolledWindow()
-               scrollwin.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
-               scrollwin.set_shadow_type(gtk.SHADOW_IN)
-               vpan.pack1(scrollwin, True, True);
-               scrollwin.show()
-
-               self.model = gtk.TreeStore(str, str, str, int)
-               self.treeview = gtk.TreeView(self.model)
-               self.treeview.set_rules_hint(True)
-               self.treeview.set_search_column(0)
-               self.treeview.connect("cursor-changed", self._treeview_cursor_cb)
-               self.treeview.connect("row-activated", self._treeview_row_activated)
-               scrollwin.add(self.treeview)
-               self.treeview.show()
-
-               cell = gtk.CellRendererText()
-               cell.set_property("width-chars", 10)
-               cell.set_property("ellipsize", pango.ELLIPSIZE_END)
-               column = gtk.TreeViewColumn("Commit")
-               column.set_resizable(True)
-               column.pack_start(cell, expand=True)
-               column.add_attribute(cell, "text", 0)
-               self.treeview.append_column(column)
-
-               cell = gtk.CellRendererText()
-               cell.set_property("width-chars", 20)
-               cell.set_property("ellipsize", pango.ELLIPSIZE_END)
-               column = gtk.TreeViewColumn("File Name")
-               column.set_resizable(True)
-               column.pack_start(cell, expand=True)
-               column.add_attribute(cell, "text", 1)
-               self.treeview.append_column(column)
-
-               cell = gtk.CellRendererText()
-               cell.set_property("width-chars", 20)
-               cell.set_property("ellipsize", pango.ELLIPSIZE_END)
-               column = gtk.TreeViewColumn("Data")
-               column.set_resizable(True)
-               column.pack_start(cell, expand=True)
-               column.add_attribute(cell, "text", 2)
-               self.treeview.append_column(column)
-
-               # The commit message window
-               scrollwin = gtk.ScrolledWindow()
-               scrollwin.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
-               scrollwin.set_shadow_type(gtk.SHADOW_IN)
-               vpan.pack2(scrollwin, True, True);
-               scrollwin.show()
-
-               commit_text = gtk.TextView()
-               self.commit_buffer = gtk.TextBuffer()
-               commit_text.set_buffer(self.commit_buffer)
-               scrollwin.add(commit_text)
-               commit_text.show()
-
-               self.window.show()
-
-               self.add_file_data(filename, commit_sha1, line_num)
-
-               fp = os.popen("git blame --incremental -C -C -- " + filename + " " + commit_sha1)
-               flags = fcntl.fcntl(fp.fileno(), fcntl.F_GETFL)
-               fcntl.fcntl(fp.fileno(), fcntl.F_SETFL, flags | os.O_NONBLOCK)
-               self.io_watch_tag = gobject.io_add_watch(fp, gobject.IO_IN, self.data_ready)
-
-
-class DiffWindow(object):
-       """Diff window.
-       This object represents and manages a single window containing the
-       differences between two revisions on a branch.
-       """
-
-       def __init__(self):
-               self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
-               self.window.set_border_width(0)
-               self.window.set_title("Git repository browser diff window")
-
-               # Use two thirds of the screen by default
-               screen = self.window.get_screen()
-               monitor = screen.get_monitor_geometry(0)
-               width = int(monitor.width * 0.66)
-               height = int(monitor.height * 0.66)
-               self.window.set_default_size(width, height)
-
-
-               self.construct()
-
-       def construct(self):
-               """Construct the window contents."""
-               vbox = gtk.VBox()
-               self.window.add(vbox)
-               vbox.show()
-
-               menu_bar = gtk.MenuBar()
-               save_menu = gtk.ImageMenuItem(gtk.STOCK_SAVE)
-               save_menu.connect("activate", self.save_menu_response, "save")
-               save_menu.show()
-               menu_bar.append(save_menu)
-               vbox.pack_start(menu_bar, expand=False, fill=True)
-               menu_bar.show()
-
-               hpan = gtk.HPaned()
-
-               scrollwin = gtk.ScrolledWindow()
-               scrollwin.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
-               scrollwin.set_shadow_type(gtk.SHADOW_IN)
-               hpan.pack1(scrollwin, True, True)
-               scrollwin.show()
-
-               (self.buffer, sourceview) = get_source_buffer_and_view()
-
-               sourceview.set_editable(False)
-               sourceview.modify_font(pango.FontDescription("Monospace"))
-               scrollwin.add(sourceview)
-               sourceview.show()
-
-               # The file hierarchy: a scrollable treeview
-               scrollwin = gtk.ScrolledWindow()
-               scrollwin.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
-               scrollwin.set_shadow_type(gtk.SHADOW_IN)
-               scrollwin.set_size_request(20, -1)
-               hpan.pack2(scrollwin, True, True)
-               scrollwin.show()
-
-               self.model = gtk.TreeStore(str, str, str)
-               self.treeview = gtk.TreeView(self.model)
-               self.treeview.set_search_column(1)
-               self.treeview.connect("cursor-changed", self._treeview_clicked)
-               scrollwin.add(self.treeview)
-               self.treeview.show()
-
-               cell = gtk.CellRendererText()
-               cell.set_property("width-chars", 20)
-               column = gtk.TreeViewColumn("Select to annotate")
-               column.pack_start(cell, expand=True)
-               column.add_attribute(cell, "text", 0)
-               self.treeview.append_column(column)
-
-               vbox.pack_start(hpan, expand=True, fill=True)
-               hpan.show()
-
-       def _treeview_clicked(self, *args):
-               """Callback for when the treeview cursor changes."""
-               (path, col) = self.treeview.get_cursor()
-               specific_file = self.model[path][1]
-               commit_sha1 =  self.model[path][2]
-               if specific_file ==  None :
-                       return
-               elif specific_file ==  "" :
-                       specific_file =  None
-
-               window = AnnotateWindow();
-               window.annotate(specific_file, commit_sha1, 1)
-
-
-       def commit_files(self, commit_sha1, parent_sha1):
-               self.model.clear()
-               add  = self.model.append(None, [ "Added", None, None])
-               dele = self.model.append(None, [ "Deleted", None, None])
-               mod  = self.model.append(None, [ "Modified", None, None])
-               diff_tree = re.compile('^(:.{6}) (.{6}) (.{40}) (.{40}) (A|D|M)\s(.+)$')
-               fp = os.popen("git diff-tree -r --no-commit-id " + parent_sha1 + " " + commit_sha1)
-               while 1:
-                       line = string.strip(fp.readline())
-                       if line == '':
-                               break
-                       m = diff_tree.match(line)
-                       if not m:
-                               continue
-
-                       attr = m.group(5)
-                       filename = m.group(6)
-                       if attr == "A":
-                               self.model.append(add,  [filename, filename, commit_sha1])
-                       elif attr == "D":
-                               self.model.append(dele, [filename, filename, commit_sha1])
-                       elif attr == "M":
-                               self.model.append(mod,  [filename, filename, commit_sha1])
-               fp.close()
-
-               self.treeview.expand_all()
-
-       def set_diff(self, commit_sha1, parent_sha1, encoding):
-               """Set the differences showed by this window.
-               Compares the two trees and populates the window with the
-               differences.
-               """
-               # Diff with the first commit or the last commit shows nothing
-               if (commit_sha1 == 0 or parent_sha1 == 0 ):
-                       return
-
-               fp = os.popen("git diff-tree -p " + parent_sha1 + " " + commit_sha1)
-               self.buffer.set_text(unicode(fp.read(), encoding).encode('utf-8'))
-               fp.close()
-               self.commit_files(commit_sha1, parent_sha1)
-               self.window.show()
-
-       def save_menu_response(self, widget, string):
-               dialog = gtk.FileChooserDialog("Save..", None, gtk.FILE_CHOOSER_ACTION_SAVE,
-                               (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
-                                       gtk.STOCK_SAVE, gtk.RESPONSE_OK))
-               dialog.set_default_response(gtk.RESPONSE_OK)
-               response = dialog.run()
-               if response == gtk.RESPONSE_OK:
-                       patch_buffer = self.buffer.get_text(self.buffer.get_start_iter(),
-                                       self.buffer.get_end_iter())
-                       fp = open(dialog.get_filename(), "w")
-                       fp.write(patch_buffer)
-                       fp.close()
-               dialog.destroy()
-
-class GitView(object):
-       """ This is the main class
-       """
-       version = "0.9"
-
-       def __init__(self, with_diff=0):
-               self.with_diff = with_diff
-               self.window =   gtk.Window(gtk.WINDOW_TOPLEVEL)
-               self.window.set_border_width(0)
-               self.window.set_title("Git repository browser")
-
-               self.get_encoding()
-               self.get_bt_sha1()
-
-               # Use three-quarters of the screen by default
-               screen = self.window.get_screen()
-               monitor = screen.get_monitor_geometry(0)
-               width = int(monitor.width * 0.75)
-               height = int(monitor.height * 0.75)
-               self.window.set_default_size(width, height)
-
-               # FIXME AndyFitz!
-               icon = self.window.render_icon(gtk.STOCK_INDEX, gtk.ICON_SIZE_BUTTON)
-               self.window.set_icon(icon)
-
-               self.accel_group = gtk.AccelGroup()
-               self.window.add_accel_group(self.accel_group)
-               self.accel_group.connect_group(0xffc2, 0, gtk.ACCEL_LOCKED, self.refresh);
-               self.accel_group.connect_group(0xffc1, 0, gtk.ACCEL_LOCKED, self.maximize);
-               self.accel_group.connect_group(0xffc8, 0, gtk.ACCEL_LOCKED, self.fullscreen);
-               self.accel_group.connect_group(0xffc9, 0, gtk.ACCEL_LOCKED, self.unfullscreen);
-
-               self.window.add(self.construct())
-
-       def refresh(self, widget, event=None, *arguments, **keywords):
-               self.get_encoding()
-               self.get_bt_sha1()
-               Commit.children_sha1 = {}
-               self.set_branch(sys.argv[without_diff:])
-               self.window.show()
-               return True
-
-       def maximize(self, widget, event=None, *arguments, **keywords):
-               self.window.maximize()
-               return True
-
-       def fullscreen(self, widget, event=None, *arguments, **keywords):
-               self.window.fullscreen()
-               return True
-
-       def unfullscreen(self, widget, event=None, *arguments, **keywords):
-               self.window.unfullscreen()
-               return True
-
-       def get_bt_sha1(self):
-               """ Update the bt_sha1 dictionary with the
-               respective sha1 details """
-
-               self.bt_sha1 = { }
-               ls_remote = re.compile('^(.{40})\trefs/([^^]+)(?:\\^(..))?$');
-               fp = os.popen('git ls-remote "${GIT_DIR-.git}"')
-               while 1:
-                       line = string.strip(fp.readline())
-                       if line == '':
-                               break
-                       m = ls_remote.match(line)
-                       if not m:
-                               continue
-                       (sha1, name) = (m.group(1), m.group(2))
-                       if not self.bt_sha1.has_key(sha1):
-                               self.bt_sha1[sha1] = []
-                       self.bt_sha1[sha1].append(name)
-               fp.close()
-
-       def get_encoding(self):
-               fp = os.popen("git config --get i18n.commitencoding")
-               self.encoding=string.strip(fp.readline())
-               fp.close()
-               if (self.encoding == ""):
-                       self.encoding = "utf-8"
-
-
-       def construct(self):
-               """Construct the window contents."""
-               vbox = gtk.VBox()
-               paned = gtk.VPaned()
-               paned.pack1(self.construct_top(), resize=False, shrink=True)
-               paned.pack2(self.construct_bottom(), resize=False, shrink=True)
-               menu_bar = gtk.MenuBar()
-               menu_bar.set_pack_direction(gtk.PACK_DIRECTION_RTL)
-               help_menu = gtk.MenuItem("Help")
-               menu = gtk.Menu()
-               about_menu = gtk.MenuItem("About")
-               menu.append(about_menu)
-               about_menu.connect("activate", self.about_menu_response, "about")
-               about_menu.show()
-               help_menu.set_submenu(menu)
-               help_menu.show()
-               menu_bar.append(help_menu)
-               menu_bar.show()
-               vbox.pack_start(menu_bar, expand=False, fill=True)
-               vbox.pack_start(paned, expand=True, fill=True)
-               paned.show()
-               vbox.show()
-               return vbox
-
-
-       def construct_top(self):
-               """Construct the top-half of the window."""
-               vbox = gtk.VBox(spacing=6)
-               vbox.set_border_width(12)
-               vbox.show()
-
-
-               scrollwin = gtk.ScrolledWindow()
-               scrollwin.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
-               scrollwin.set_shadow_type(gtk.SHADOW_IN)
-               vbox.pack_start(scrollwin, expand=True, fill=True)
-               scrollwin.show()
-
-               self.treeview = gtk.TreeView()
-               self.treeview.set_rules_hint(True)
-               self.treeview.set_search_column(4)
-               self.treeview.connect("cursor-changed", self._treeview_cursor_cb)
-               scrollwin.add(self.treeview)
-               self.treeview.show()
-
-               cell = CellRendererGraph()
-               column = gtk.TreeViewColumn()
-               column.set_resizable(True)
-               column.pack_start(cell, expand=True)
-               column.add_attribute(cell, "node", 1)
-               column.add_attribute(cell, "in-lines", 2)
-               column.add_attribute(cell, "out-lines", 3)
-               self.treeview.append_column(column)
-
-               cell = gtk.CellRendererText()
-               cell.set_property("width-chars", 65)
-               cell.set_property("ellipsize", pango.ELLIPSIZE_END)
-               column = gtk.TreeViewColumn("Message")
-               column.set_resizable(True)
-               column.pack_start(cell, expand=True)
-               column.add_attribute(cell, "text", 4)
-               self.treeview.append_column(column)
-
-               cell = gtk.CellRendererText()
-               cell.set_property("width-chars", 40)
-               cell.set_property("ellipsize", pango.ELLIPSIZE_END)
-               column = gtk.TreeViewColumn("Author")
-               column.set_resizable(True)
-               column.pack_start(cell, expand=True)
-               column.add_attribute(cell, "text", 5)
-               self.treeview.append_column(column)
-
-               cell = gtk.CellRendererText()
-               cell.set_property("ellipsize", pango.ELLIPSIZE_END)
-               column = gtk.TreeViewColumn("Date")
-               column.set_resizable(True)
-               column.pack_start(cell, expand=True)
-               column.add_attribute(cell, "text", 6)
-               self.treeview.append_column(column)
-
-               return vbox
-
-       def about_menu_response(self, widget, string):
-               dialog = gtk.AboutDialog()
-               dialog.set_name("Gitview")
-               dialog.set_version(GitView.version)
-               dialog.set_authors(["Aneesh Kumar K.V <aneesh.kumar@gmail.com>"])
-               dialog.set_website("http://www.kernel.org/pub/software/scm/git/")
-               dialog.set_copyright("Use and distribute under the terms of the GNU General Public License")
-               dialog.set_wrap_license(True)
-               dialog.run()
-               dialog.destroy()
-
-
-       def construct_bottom(self):
-               """Construct the bottom half of the window."""
-               vbox = gtk.VBox(False, spacing=6)
-               vbox.set_border_width(12)
-               (width, height) = self.window.get_size()
-               vbox.set_size_request(width, int(height / 2.5))
-               vbox.show()
-
-               self.table = gtk.Table(rows=4, columns=4)
-               self.table.set_row_spacings(6)
-               self.table.set_col_spacings(6)
-               vbox.pack_start(self.table, expand=False, fill=True)
-               self.table.show()
-
-               align = gtk.Alignment(0.0, 0.5)
-               label = gtk.Label()
-               label.set_markup("<b>Revision:</b>")
-               align.add(label)
-               self.table.attach(align, 0, 1, 0, 1, gtk.FILL, gtk.FILL)
-               label.show()
-               align.show()
-
-               align = gtk.Alignment(0.0, 0.5)
-               self.revid_label = gtk.Label()
-               self.revid_label.set_selectable(True)
-               align.add(self.revid_label)
-               self.table.attach(align, 1, 2, 0, 1, gtk.EXPAND | gtk.FILL, gtk.FILL)
-               self.revid_label.show()
-               align.show()
-
-               align = gtk.Alignment(0.0, 0.5)
-               label = gtk.Label()
-               label.set_markup("<b>Committer:</b>")
-               align.add(label)
-               self.table.attach(align, 0, 1, 1, 2, gtk.FILL, gtk.FILL)
-               label.show()
-               align.show()
-
-               align = gtk.Alignment(0.0, 0.5)
-               self.committer_label = gtk.Label()
-               self.committer_label.set_selectable(True)
-               align.add(self.committer_label)
-               self.table.attach(align, 1, 2, 1, 2, gtk.EXPAND | gtk.FILL, gtk.FILL)
-               self.committer_label.show()
-               align.show()
-
-               align = gtk.Alignment(0.0, 0.5)
-               label = gtk.Label()
-               label.set_markup("<b>Timestamp:</b>")
-               align.add(label)
-               self.table.attach(align, 0, 1, 2, 3, gtk.FILL, gtk.FILL)
-               label.show()
-               align.show()
-
-               align = gtk.Alignment(0.0, 0.5)
-               self.timestamp_label = gtk.Label()
-               self.timestamp_label.set_selectable(True)
-               align.add(self.timestamp_label)
-               self.table.attach(align, 1, 2, 2, 3, gtk.EXPAND | gtk.FILL, gtk.FILL)
-               self.timestamp_label.show()
-               align.show()
-
-               align = gtk.Alignment(0.0, 0.5)
-               label = gtk.Label()
-               label.set_markup("<b>Parents:</b>")
-               align.add(label)
-               self.table.attach(align, 0, 1, 3, 4, gtk.FILL, gtk.FILL)
-               label.show()
-               align.show()
-               self.parents_widgets = []
-
-               align = gtk.Alignment(0.0, 0.5)
-               label = gtk.Label()
-               label.set_markup("<b>Children:</b>")
-               align.add(label)
-               self.table.attach(align, 2, 3, 3, 4, gtk.FILL, gtk.FILL)
-               label.show()
-               align.show()
-               self.children_widgets = []
-
-               scrollwin = gtk.ScrolledWindow()
-               scrollwin.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
-               scrollwin.set_shadow_type(gtk.SHADOW_IN)
-               vbox.pack_start(scrollwin, expand=True, fill=True)
-               scrollwin.show()
-
-               (self.message_buffer, sourceview) = get_source_buffer_and_view()
-
-               sourceview.set_editable(False)
-               sourceview.modify_font(pango.FontDescription("Monospace"))
-               scrollwin.add(sourceview)
-               sourceview.show()
-
-               return vbox
-
-       def _treeview_cursor_cb(self, *args):
-               """Callback for when the treeview cursor changes."""
-               (path, col) = self.treeview.get_cursor()
-               commit = self.model[path][0]
-
-               if commit.committer is not None:
-                       committer = commit.committer
-                       timestamp = commit.commit_date
-                       message   =  commit.get_message(self.with_diff)
-                       revid_label = commit.commit_sha1
-               else:
-                       committer = ""
-                       timestamp = ""
-                       message = ""
-                       revid_label = ""
-
-               self.revid_label.set_text(revid_label)
-               self.committer_label.set_text(committer)
-               self.timestamp_label.set_text(timestamp)
-               self.message_buffer.set_text(unicode(message, self.encoding).encode('utf-8'))
-
-               for widget in self.parents_widgets:
-                       self.table.remove(widget)
-
-               self.parents_widgets = []
-               self.table.resize(4 + len(commit.parent_sha1) - 1, 4)
-               for idx, parent_id in enumerate(commit.parent_sha1):
-                       self.table.set_row_spacing(idx + 3, 0)
-
-                       align = gtk.Alignment(0.0, 0.0)
-                       self.parents_widgets.append(align)
-                       self.table.attach(align, 1, 2, idx + 3, idx + 4,
-                                       gtk.EXPAND | gtk.FILL, gtk.FILL)
-                       align.show()
-
-                       hbox = gtk.HBox(False, 0)
-                       align.add(hbox)
-                       hbox.show()
-
-                       label = gtk.Label(parent_id)
-                       label.set_selectable(True)
-                       hbox.pack_start(label, expand=False, fill=True)
-                       label.show()
-
-                       image = gtk.Image()
-                       image.set_from_stock(gtk.STOCK_JUMP_TO, gtk.ICON_SIZE_MENU)
-                       image.show()
-
-                       button = gtk.Button()
-                       button.add(image)
-                       button.set_relief(gtk.RELIEF_NONE)
-                       button.connect("clicked", self._go_clicked_cb, parent_id)
-                       hbox.pack_start(button, expand=False, fill=True)
-                       button.show()
-
-                       image = gtk.Image()
-                       image.set_from_stock(gtk.STOCK_FIND, gtk.ICON_SIZE_MENU)
-                       image.show()
-
-                       button = gtk.Button()
-                       button.add(image)
-                       button.set_relief(gtk.RELIEF_NONE)
-                       button.set_sensitive(True)
-                       button.connect("clicked", self._show_clicked_cb,
-                                       commit.commit_sha1, parent_id, self.encoding)
-                       hbox.pack_start(button, expand=False, fill=True)
-                       button.show()
-
-               # Populate with child details
-               for widget in self.children_widgets:
-                       self.table.remove(widget)
-
-               self.children_widgets = []
-               try:
-                       child_sha1 = Commit.children_sha1[commit.commit_sha1]
-               except KeyError:
-                       # We don't have child
-                       child_sha1 = [ 0 ]
-
-               if ( len(child_sha1) > len(commit.parent_sha1)):
-                       self.table.resize(4 + len(child_sha1) - 1, 4)
-
-               for idx, child_id in enumerate(child_sha1):
-                       self.table.set_row_spacing(idx + 3, 0)
-
-                       align = gtk.Alignment(0.0, 0.0)
-                       self.children_widgets.append(align)
-                       self.table.attach(align, 3, 4, idx + 3, idx + 4,
-                                       gtk.EXPAND | gtk.FILL, gtk.FILL)
-                       align.show()
-
-                       hbox = gtk.HBox(False, 0)
-                       align.add(hbox)
-                       hbox.show()
-
-                       label = gtk.Label(child_id)
-                       label.set_selectable(True)
-                       hbox.pack_start(label, expand=False, fill=True)
-                       label.show()
-
-                       image = gtk.Image()
-                       image.set_from_stock(gtk.STOCK_JUMP_TO, gtk.ICON_SIZE_MENU)
-                       image.show()
-
-                       button = gtk.Button()
-                       button.add(image)
-                       button.set_relief(gtk.RELIEF_NONE)
-                       button.connect("clicked", self._go_clicked_cb, child_id)
-                       hbox.pack_start(button, expand=False, fill=True)
-                       button.show()
-
-                       image = gtk.Image()
-                       image.set_from_stock(gtk.STOCK_FIND, gtk.ICON_SIZE_MENU)
-                       image.show()
-
-                       button = gtk.Button()
-                       button.add(image)
-                       button.set_relief(gtk.RELIEF_NONE)
-                       button.set_sensitive(True)
-                       button.connect("clicked", self._show_clicked_cb,
-                                       child_id, commit.commit_sha1, self.encoding)
-                       hbox.pack_start(button, expand=False, fill=True)
-                       button.show()
-
-       def _destroy_cb(self, widget):
-               """Callback for when a window we manage is destroyed."""
-               self.quit()
-
-
-       def quit(self):
-               """Stop the GTK+ main loop."""
-               gtk.main_quit()
-
-       def run(self, args):
-               self.set_branch(args)
-               self.window.connect("destroy", self._destroy_cb)
-               self.window.show()
-               gtk.main()
-
-       def set_branch(self, args):
-               """Fill in different windows with info from the reposiroty"""
-               fp = os.popen("git rev-parse --sq --default HEAD " + list_to_string(args, 1))
-               git_rev_list_cmd = fp.read()
-               fp.close()
-               fp = os.popen("git rev-list  --header --topo-order --parents " + git_rev_list_cmd)
-               self.update_window(fp)
-
-       def update_window(self, fp):
-               commit_lines = []
-
-               self.model = gtk.ListStore(gobject.TYPE_PYOBJECT, gobject.TYPE_PYOBJECT,
-                               gobject.TYPE_PYOBJECT, gobject.TYPE_PYOBJECT, str, str, str)
-
-               # used for cursor positioning
-               self.index = {}
-
-               self.colours = {}
-               self.nodepos = {}
-               self.incomplete_line = {}
-               self.commits = []
-
-               index = 0
-               last_colour = 0
-               last_nodepos = -1
-               out_line = []
-               input_line = fp.readline()
-               while (input_line != ""):
-                       # The commit header ends with '\0'
-                       # This NULL is immediately followed by the sha1 of the
-                       # next commit
-                       if (input_line[0] != '\0'):
-                               commit_lines.append(input_line)
-                               input_line = fp.readline()
-                               continue;
-
-                       commit = Commit(commit_lines)
-                       if (commit != None ):
-                               self.commits.append(commit)
-
-                       # Skip the '\0
-                       commit_lines = []
-                       commit_lines.append(input_line[1:])
-                       input_line = fp.readline()
-
-               fp.close()
-
-               for commit in self.commits:
-                       (out_line, last_colour, last_nodepos) = self.draw_graph(commit,
-                                                                               index, out_line,
-                                                                               last_colour,
-                                                                               last_nodepos)
-                       self.index[commit.commit_sha1] = index
-                       index += 1
-
-               self.treeview.set_model(self.model)
-               self.treeview.show()
-
-       def draw_graph(self, commit, index, out_line, last_colour, last_nodepos):
-               in_line=[]
-
-               #   |   -> outline
-               #   X
-               #   |\  <- inline
-
-               # Reset nodepostion
-               if (last_nodepos > 5):
-                       last_nodepos = -1
-
-               # Add the incomplete lines of the last cell in this
-               try:
-                       colour = self.colours[commit.commit_sha1]
-               except KeyError:
-                       self.colours[commit.commit_sha1] = last_colour+1
-                       last_colour = self.colours[commit.commit_sha1]
-                       colour =   self.colours[commit.commit_sha1]
-
-               try:
-                       node_pos = self.nodepos[commit.commit_sha1]
-               except KeyError:
-                       self.nodepos[commit.commit_sha1] = last_nodepos+1
-                       last_nodepos = self.nodepos[commit.commit_sha1]
-                       node_pos =  self.nodepos[commit.commit_sha1]
-
-               #The first parent always continue on the same line
-               try:
-                       # check we already have the value
-                       tmp_node_pos = self.nodepos[commit.parent_sha1[0]]
-               except KeyError:
-                       self.colours[commit.parent_sha1[0]] = colour
-                       self.nodepos[commit.parent_sha1[0]] = node_pos
-
-               for sha1 in self.incomplete_line.keys():
-                       if (sha1 != commit.commit_sha1):
-                               self.draw_incomplete_line(sha1, node_pos,
-                                               out_line, in_line, index)
-                       else:
-                               del self.incomplete_line[sha1]
-
-
-               for parent_id in commit.parent_sha1:
-                       try:
-                               tmp_node_pos = self.nodepos[parent_id]
-                       except KeyError:
-                               self.colours[parent_id] = last_colour+1
-                               last_colour = self.colours[parent_id]
-                               self.nodepos[parent_id] = last_nodepos+1
-                               last_nodepos = self.nodepos[parent_id]
-
-                       in_line.append((node_pos, self.nodepos[parent_id],
-                                               self.colours[parent_id]))
-                       self.add_incomplete_line(parent_id)
-
-               try:
-                       branch_tag = self.bt_sha1[commit.commit_sha1]
-               except KeyError:
-                       branch_tag = [ ]
-
-
-               node = (node_pos, colour, branch_tag)
-
-               self.model.append([commit, node, out_line, in_line,
-                               commit.message, commit.author, commit.date])
-
-               return (in_line, last_colour, last_nodepos)
-
-       def add_incomplete_line(self, sha1):
-               try:
-                       self.incomplete_line[sha1].append(self.nodepos[sha1])
-               except KeyError:
-                       self.incomplete_line[sha1] = [self.nodepos[sha1]]
-
-       def draw_incomplete_line(self, sha1, node_pos, out_line, in_line, index):
-               for idx, pos in enumerate(self.incomplete_line[sha1]):
-                       if(pos == node_pos):
-                               #remove the straight line and add a slash
-                               if ((pos, pos, self.colours[sha1]) in out_line):
-                                       out_line.remove((pos, pos, self.colours[sha1]))
-                               out_line.append((pos, pos+0.5, self.colours[sha1]))
-                               self.incomplete_line[sha1][idx] = pos = pos+0.5
-                       try:
-                               next_commit = self.commits[index+1]
-                               if (next_commit.commit_sha1 == sha1 and pos != int(pos)):
-                               # join the line back to the node point
-                               # This need to be done only if we modified it
-                                       in_line.append((pos, pos-0.5, self.colours[sha1]))
-                                       continue;
-                       except IndexError:
-                               pass
-                       in_line.append((pos, pos, self.colours[sha1]))
-
-
-       def _go_clicked_cb(self, widget, revid):
-               """Callback for when the go button for a parent is clicked."""
-               try:
-                       self.treeview.set_cursor(self.index[revid])
-               except KeyError:
-                       dialog = gtk.MessageDialog(parent=None, flags=0,
-                                       type=gtk.MESSAGE_WARNING, buttons=gtk.BUTTONS_CLOSE,
-                                       message_format=None)
-                       dialog.set_markup("Revision <b>%s</b> not present in the list" % revid)
-                       # revid == 0 is the parent of the first commit
-                       if (revid != 0 ):
-                               dialog.format_secondary_text("Try running gitview without any options")
-                       dialog.run()
-                       dialog.destroy()
-
-               self.treeview.grab_focus()
-
-       def _show_clicked_cb(self, widget,  commit_sha1, parent_sha1, encoding):
-               """Callback for when the show button for a parent is clicked."""
-               window = DiffWindow()
-               window.set_diff(commit_sha1, parent_sha1, encoding)
-               self.treeview.grab_focus()
-
-without_diff = 0
-if __name__ == "__main__":
-
-       if (len(sys.argv) > 1 ):
-               if (sys.argv[1] == "--without-diff"):
-                       without_diff = 1
-
-       view = GitView( without_diff != 1)
-       view.run(sys.argv[without_diff:])
diff --git a/contrib/gitview/gitview.txt b/contrib/gitview/gitview.txt
deleted file mode 100644 (file)
index 7b5f900..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-gitview(1)
-==========
-
-NAME
-----
-gitview - A GTK based repository browser for git
-
-SYNOPSIS
---------
-[verse]
-'gitview' [options] [args]
-
-DESCRIPTION
----------
-
-Dependencies:
-
-* Python 2.4
-* PyGTK 2.8 or later
-* PyCairo 1.0 or later
-
-OPTIONS
--------
---without-diff::
-
-       If the user doesn't want to list the commit diffs in the main window.
-       This may speed up the repository browsing.
-
-<args>::
-
-       All the valid option for linkgit:git-rev-list[1].
-
-Key Bindings
-------------
-F4::
-       To maximize the window
-
-F5::
-       To reread references.
-
-F11::
-       Full screen
-
-F12::
-       Leave full screen
-
-EXAMPLES
---------
-
-gitview v2.6.12.. include/scsi drivers/scsi::
-
-       Show as the changes since version v2.6.12 that changed any file in the
-       include/scsi or drivers/scsi subdirectories
-
-gitview --since=2.weeks.ago::
-
-       Show the changes during the last two weeks
index 39457055a59261c6af9ce72616fa5f74079c672d..a677569ddd95f4ce567570ad68111e37a5ed8508 100755 (executable)
@@ -81,8 +81,12 @@ sub packet_flush {
 packet_flush();
 
 while (1) {
-       my ($command)  = packet_txt_read() =~ /^command=([^=]+)$/;
-       my ($pathname) = packet_txt_read() =~ /^pathname=([^=]+)$/;
+       my ($command)  = packet_txt_read() =~ /^command=(.+)$/;
+       my ($pathname) = packet_txt_read() =~ /^pathname=(.+)$/;
+
+       if ( $pathname eq "" ) {
+               die "bad pathname '$pathname'";
+       }
 
        packet_bin_read();
 
diff --git a/contrib/update-unicode/.gitignore b/contrib/update-unicode/.gitignore
new file mode 100644 (file)
index 0000000..b0ebc6a
--- /dev/null
@@ -0,0 +1,3 @@
+uniset/
+UnicodeData.txt
+EastAsianWidth.txt
diff --git a/contrib/update-unicode/README b/contrib/update-unicode/README
new file mode 100644 (file)
index 0000000..b9e2fc8
--- /dev/null
@@ -0,0 +1,20 @@
+TL;DR: Run update_unicode.sh after the publication of a new Unicode
+standard and commit the resulting unicode_widths.h file.
+
+The long version
+================
+
+The Git source code ships the file unicode_widths.h which contains
+tables of zero and double width Unicode code points, respectively.
+These tables are generated using update_unicode.sh in this directory.
+update_unicode.sh itself uses a third-party tool, uniset, to query two
+Unicode data files for the interesting code points.
+
+On first run, update_unicode.sh clones uniset from Github and builds it.
+This requires a current-ish version of autoconf (2.69 works per December
+2016).
+
+On each run, update_unicode.sh checks whether more recent Unicode data
+files are available from the Unicode consortium, and rebuilds the header
+unicode_widths.h with the new data. The new header can then be
+committed.
diff --git a/contrib/update-unicode/update_unicode.sh b/contrib/update-unicode/update_unicode.sh
new file mode 100755 (executable)
index 0000000..e05db92
--- /dev/null
@@ -0,0 +1,33 @@
+#!/bin/sh
+#See http://www.unicode.org/reports/tr44/
+#
+#Me Enclosing_Mark  an enclosing combining mark
+#Mn Nonspacing_Mark a nonspacing combining mark (zero advance width)
+#Cf Format          a format control character
+#
+cd "$(dirname "$0")"
+UNICODEWIDTH_H=$(git rev-parse --show-toplevel)/unicode_width.h
+
+wget -N http://www.unicode.org/Public/UCD/latest/ucd/UnicodeData.txt \
+       http://www.unicode.org/Public/UCD/latest/ucd/EastAsianWidth.txt &&
+if ! test -d uniset; then
+       git clone https://github.com/depp/uniset.git &&
+       ( cd uniset && git checkout 4b186196dd )
+fi &&
+(
+       cd uniset &&
+       if ! test -x uniset; then
+               autoreconf -i &&
+               ./configure --enable-warnings=-Werror CFLAGS='-O0 -ggdb'
+       fi &&
+       make
+) &&
+UNICODE_DIR=. && export UNICODE_DIR &&
+cat >$UNICODEWIDTH_H <<-EOF
+static const struct interval zero_width[] = {
+       $(uniset/uniset --32 cat:Me,Mn,Cf + U+1160..U+11FF - U+00AD)
+};
+static const struct interval double_width[] = {
+       $(uniset/uniset --32 eaw:F,W)
+};
+EOF
index be91358462a72c9d5a6c02f2b0e44585a76d4783..4e17e45ed265b3f4861d1b7a1e86edaa4df3b1ac 100644 (file)
--- a/convert.c
+++ b/convert.c
@@ -279,15 +279,16 @@ static int crlf_to_git(const char *path, const char *src, size_t len,
                if (convert_is_binary(len, &stats))
                        return 0;
                /*
-                * If the file in the index has any CR in it, do not convert.
-                * This is the new safer autocrlf handling.
+                * If the file in the index has any CR in it, do not
+                * convert.  This is the new safer autocrlf handling,
+                * unless we want to renormalize in a merge or
+                * cherry-pick.
                 */
-               if (checksafe == SAFE_CRLF_RENORMALIZE)
-                       checksafe = SAFE_CRLF_FALSE;
-               else if (has_cr_in_index(path))
+               if ((checksafe != SAFE_CRLF_RENORMALIZE) && has_cr_in_index(path))
                        convert_crlf_into_lf = 0;
        }
-       if (checksafe && len) {
+       if ((checksafe == SAFE_CRLF_WARN ||
+           (checksafe == SAFE_CRLF_FAIL)) && len) {
                struct text_stat new_stats;
                memcpy(&new_stats, &stats, sizeof(new_stats));
                /* simulate "git add" */
diff --git a/diff.c b/diff.c
index ec8728362dae5a3bf404f6782f9091d6a1c9a6c2..d91a344908abe7335eaffef4157fc59fefdf3815 100644 (file)
--- a/diff.c
+++ b/diff.c
 
 static int diff_detect_rename_default;
 static int diff_indent_heuristic; /* experimental */
-static int diff_compaction_heuristic; /* experimental */
 static int diff_rename_limit_default = 400;
 static int diff_suppress_blank_empty;
 static int diff_use_color_default = -1;
 static int diff_context_default = 3;
+static int diff_interhunk_context_default;
 static const char *diff_word_regex_cfg;
 static const char *external_diff_cmd_cfg;
 static const char *diff_order_file_cfg;
@@ -223,16 +223,8 @@ void init_diff_ui_defaults(void)
 
 int git_diff_heuristic_config(const char *var, const char *value, void *cb)
 {
-       if (!strcmp(var, "diff.indentheuristic")) {
+       if (!strcmp(var, "diff.indentheuristic"))
                diff_indent_heuristic = git_config_bool(var, value);
-               if (diff_indent_heuristic)
-                       diff_compaction_heuristic = 0;
-       }
-       if (!strcmp(var, "diff.compactionheuristic")) {
-               diff_compaction_heuristic = git_config_bool(var, value);
-               if (diff_compaction_heuristic)
-                       diff_indent_heuristic = 0;
-       }
        return 0;
 }
 
@@ -248,6 +240,12 @@ int git_diff_ui_config(const char *var, const char *value, void *cb)
                        return -1;
                return 0;
        }
+       if (!strcmp(var, "diff.interhunkcontext")) {
+               diff_interhunk_context_default = git_config_int(var, value);
+               if (diff_interhunk_context_default < 0)
+                       return -1;
+               return 0;
+       }
        if (!strcmp(var, "diff.renames")) {
                diff_detect_rename_default = git_config_rename(var, value);
                return 0;
@@ -3017,7 +3015,7 @@ static struct diff_tempfile *prepare_temp_file(const char *name,
                        if (!one->oid_valid)
                                sha1_to_hex_r(temp->hex, null_sha1);
                        else
-                               sha1_to_hex_r(temp->hex, one->oid.hash);
+                               oid_to_hex_r(temp->hex, &one->oid);
                        /* Even though we may sometimes borrow the
                         * contents from the work tree, we always want
                         * one->mode.  mode is trustworthy even when
@@ -3106,7 +3104,8 @@ static const char *diff_abbrev_oid(const struct object_id *oid, int abbrev)
                        abbrev = FALLBACK_DEFAULT_ABBREV;
                if (abbrev > GIT_SHA1_HEXSZ)
                        die("BUG: oid abbreviation out of range: %d", abbrev);
-               hex[abbrev] = '\0';
+               if (abbrev)
+                       hex[abbrev] = '\0';
                return hex;
        }
 }
@@ -3364,11 +3363,13 @@ void diff_setup(struct diff_options *options)
 
        options->file = stdout;
 
+       options->abbrev = DEFAULT_ABBREV;
        options->line_termination = '\n';
        options->break_opt = -1;
        options->rename_limit = -1;
        options->dirstat_permille = diff_dirstat_permille_default;
        options->context = diff_context_default;
+       options->interhunkcontext = diff_interhunk_context_default;
        options->ws_error_highlight = ws_error_highlight_default;
        DIFF_OPT_SET(options, RENAME_EMPTY);
 
@@ -3380,8 +3381,6 @@ void diff_setup(struct diff_options *options)
        options->xdl_opts |= diff_algorithm;
        if (diff_indent_heuristic)
                DIFF_XDL_SET(options, INDENT_HEURISTIC);
-       else if (diff_compaction_heuristic)
-               DIFF_XDL_SET(options, COMPACTION_HEURISTIC);
 
        options->orderfile = diff_order_file_cfg;
 
@@ -3876,16 +3875,10 @@ int diff_opt_parse(struct diff_options *options,
                DIFF_XDL_SET(options, IGNORE_WHITESPACE_AT_EOL);
        else if (!strcmp(arg, "--ignore-blank-lines"))
                DIFF_XDL_SET(options, IGNORE_BLANK_LINES);
-       else if (!strcmp(arg, "--indent-heuristic")) {
+       else if (!strcmp(arg, "--indent-heuristic"))
                DIFF_XDL_SET(options, INDENT_HEURISTIC);
-               DIFF_XDL_CLR(options, COMPACTION_HEURISTIC);
-       } else if (!strcmp(arg, "--no-indent-heuristic"))
-               DIFF_XDL_CLR(options, INDENT_HEURISTIC);
-       else if (!strcmp(arg, "--compaction-heuristic")) {
-               DIFF_XDL_SET(options, COMPACTION_HEURISTIC);
+       else if (!strcmp(arg, "--no-indent-heuristic"))
                DIFF_XDL_CLR(options, INDENT_HEURISTIC);
-       } else if (!strcmp(arg, "--no-compaction-heuristic"))
-               DIFF_XDL_CLR(options, COMPACTION_HEURISTIC);
        else if (!strcmp(arg, "--patience"))
                options->xdl_opts = DIFF_WITH_ALG(options, PATIENCE_DIFF);
        else if (!strcmp(arg, "--histogram"))
@@ -4024,6 +4017,8 @@ int diff_opt_parse(struct diff_options *options,
                            offending, optarg);
                return argcount;
        }
+       else if (!strcmp(arg, "--no-abbrev"))
+               options->abbrev = 0;
        else if (!strcmp(arg, "--abbrev"))
                options->abbrev = DEFAULT_ABBREV;
        else if (skip_prefix(arg, "--abbrev=", &arg)) {
diff --git a/dir.c b/dir.c
index bfa8c8a9a51297c3a969c8706467504cb11ce51b..65c3e681b8e04aa47b6cf41faca0822ead59fb6a 100644 (file)
--- a/dir.c
+++ b/dir.c
 #include "varint.h"
 #include "ewah/ewok.h"
 
-struct path_simplify {
-       int len;
-       const char *path;
-};
-
 /*
  * Tells read_directory_recursive how a file or directory should be treated.
  * Values are ordered by significance, e.g. if a directory contains both
@@ -50,7 +45,7 @@ struct cached_dir {
 
 static enum path_treatment read_directory_recursive(struct dir_struct *dir,
        const char *path, int len, struct untracked_cache_dir *untracked,
-       int check_only, const struct path_simplify *simplify);
+       int check_only, const struct pathspec *pathspec);
 static int get_dtype(struct dirent *de, const char *path, int len);
 
 int fspathcmp(const char *a, const char *b)
@@ -179,17 +174,21 @@ char *common_prefix(const struct pathspec *pathspec)
 
 int fill_directory(struct dir_struct *dir, const struct pathspec *pathspec)
 {
-       size_t len;
+       char *prefix;
+       size_t prefix_len;
 
        /*
         * Calculate common prefix for the pathspec, and
         * use that to optimize the directory walk
         */
-       len = common_prefix_len(pathspec);
+       prefix = common_prefix(pathspec);
+       prefix_len = prefix ? strlen(prefix) : 0;
 
        /* Read the directory and prune it */
-       read_directory(dir, pathspec->nr ? pathspec->_raw[0] : "", len, pathspec);
-       return len;
+       read_directory(dir, prefix, prefix_len, pathspec);
+
+       free(prefix);
+       return prefix_len;
 }
 
 int within_depth(const char *name, int namelen,
@@ -1312,7 +1311,7 @@ static enum exist_status directory_exists_in_index(const char *dirname, int len)
 static enum path_treatment treat_directory(struct dir_struct *dir,
        struct untracked_cache_dir *untracked,
        const char *dirname, int len, int baselen, int exclude,
-       const struct path_simplify *simplify)
+       const struct pathspec *pathspec)
 {
        /* The "len-1" is to strip the final '/' */
        switch (directory_exists_in_index(dirname, len-1)) {
@@ -1341,7 +1340,7 @@ static enum path_treatment treat_directory(struct dir_struct *dir,
        untracked = lookup_untracked(dir->untracked, untracked,
                                     dirname + baselen, len - baselen);
        return read_directory_recursive(dir, dirname, len,
-                                       untracked, 1, simplify);
+                                       untracked, 1, pathspec);
 }
 
 /*
@@ -1349,24 +1348,33 @@ static enum path_treatment treat_directory(struct dir_struct *dir,
  * reading - if the path cannot possibly be in the pathspec,
  * return true, and we'll skip it early.
  */
-static int simplify_away(const char *path, int pathlen, const struct path_simplify *simplify)
+static int simplify_away(const char *path, int pathlen,
+                        const struct pathspec *pathspec)
 {
-       if (simplify) {
-               for (;;) {
-                       const char *match = simplify->path;
-                       int len = simplify->len;
+       int i;
 
-                       if (!match)
-                               break;
-                       if (len > pathlen)
-                               len = pathlen;
-                       if (!memcmp(path, match, len))
-                               return 0;
-                       simplify++;
-               }
-               return 1;
+       if (!pathspec || !pathspec->nr)
+               return 0;
+
+       GUARD_PATHSPEC(pathspec,
+                      PATHSPEC_FROMTOP |
+                      PATHSPEC_MAXDEPTH |
+                      PATHSPEC_LITERAL |
+                      PATHSPEC_GLOB |
+                      PATHSPEC_ICASE |
+                      PATHSPEC_EXCLUDE);
+
+       for (i = 0; i < pathspec->nr; i++) {
+               const struct pathspec_item *item = &pathspec->items[i];
+               int len = item->nowildcard_len;
+
+               if (len > pathlen)
+                       len = pathlen;
+               if (!ps_strncmp(item, item->match, path, len))
+                       return 0;
        }
-       return 0;
+
+       return 1;
 }
 
 /*
@@ -1380,19 +1388,33 @@ static int simplify_away(const char *path, int pathlen, const struct path_simpli
  *   2. the path is a directory prefix of some element in the
  *      pathspec
  */
-static int exclude_matches_pathspec(const char *path, int len,
-               const struct path_simplify *simplify)
-{
-       if (simplify) {
-               for (; simplify->path; simplify++) {
-                       if (len == simplify->len
-                           && !memcmp(path, simplify->path, len))
-                               return 1;
-                       if (len < simplify->len
-                           && simplify->path[len] == '/'
-                           && !memcmp(path, simplify->path, len))
-                               return 1;
-               }
+static int exclude_matches_pathspec(const char *path, int pathlen,
+                                   const struct pathspec *pathspec)
+{
+       int i;
+
+       if (!pathspec || !pathspec->nr)
+               return 0;
+
+       GUARD_PATHSPEC(pathspec,
+                      PATHSPEC_FROMTOP |
+                      PATHSPEC_MAXDEPTH |
+                      PATHSPEC_LITERAL |
+                      PATHSPEC_GLOB |
+                      PATHSPEC_ICASE |
+                      PATHSPEC_EXCLUDE);
+
+       for (i = 0; i < pathspec->nr; i++) {
+               const struct pathspec_item *item = &pathspec->items[i];
+               int len = item->nowildcard_len;
+
+               if (len == pathlen &&
+                   !ps_strncmp(item, item->match, path, pathlen))
+                       return 1;
+               if (len > pathlen &&
+                   item->match[pathlen] == '/' &&
+                   !ps_strncmp(item, item->match, path, pathlen))
+                       return 1;
        }
        return 0;
 }
@@ -1460,7 +1482,7 @@ static enum path_treatment treat_one_path(struct dir_struct *dir,
                                          struct untracked_cache_dir *untracked,
                                          struct strbuf *path,
                                          int baselen,
-                                         const struct path_simplify *simplify,
+                                         const struct pathspec *pathspec,
                                          int dtype, struct dirent *de)
 {
        int exclude;
@@ -1512,7 +1534,7 @@ static enum path_treatment treat_one_path(struct dir_struct *dir,
        case DT_DIR:
                strbuf_addch(path, '/');
                return treat_directory(dir, untracked, path->buf, path->len,
-                                      baselen, exclude, simplify);
+                                      baselen, exclude, pathspec);
        case DT_REG:
        case DT_LNK:
                return exclude ? path_excluded : path_untracked;
@@ -1524,7 +1546,7 @@ static enum path_treatment treat_path_fast(struct dir_struct *dir,
                                           struct cached_dir *cdir,
                                           struct strbuf *path,
                                           int baselen,
-                                          const struct path_simplify *simplify)
+                                          const struct pathspec *pathspec)
 {
        strbuf_setlen(path, baselen);
        if (!cdir->ucd) {
@@ -1541,7 +1563,7 @@ static enum path_treatment treat_path_fast(struct dir_struct *dir,
                 * with check_only set.
                 */
                return read_directory_recursive(dir, path->buf, path->len,
-                                               cdir->ucd, 1, simplify);
+                                               cdir->ucd, 1, pathspec);
        /*
         * We get path_recurse in the first run when
         * directory_exists_in_index() returns index_nonexistent. We
@@ -1556,23 +1578,23 @@ static enum path_treatment treat_path(struct dir_struct *dir,
                                      struct cached_dir *cdir,
                                      struct strbuf *path,
                                      int baselen,
-                                     const struct path_simplify *simplify)
+                                     const struct pathspec *pathspec)
 {
        int dtype;
        struct dirent *de = cdir->de;
 
        if (!de)
                return treat_path_fast(dir, untracked, cdir, path,
-                                      baselen, simplify);
+                                      baselen, pathspec);
        if (is_dot_or_dotdot(de->d_name) || !strcmp(de->d_name, ".git"))
                return path_none;
        strbuf_setlen(path, baselen);
        strbuf_addstr(path, de->d_name);
-       if (simplify_away(path->buf, path->len, simplify))
+       if (simplify_away(path->buf, path->len, pathspec))
                return path_none;
 
        dtype = DTYPE(de);
-       return treat_one_path(dir, untracked, path, baselen, simplify, dtype, de);
+       return treat_one_path(dir, untracked, path, baselen, pathspec, dtype, de);
 }
 
 static void add_untracked(struct untracked_cache_dir *dir, const char *name)
@@ -1703,7 +1725,7 @@ static void close_cached_dir(struct cached_dir *cdir)
 static enum path_treatment read_directory_recursive(struct dir_struct *dir,
                                    const char *base, int baselen,
                                    struct untracked_cache_dir *untracked, int check_only,
-                                   const struct path_simplify *simplify)
+                                   const struct pathspec *pathspec)
 {
        struct cached_dir cdir;
        enum path_treatment state, subdir_state, dir_state = path_none;
@@ -1719,7 +1741,8 @@ static enum path_treatment read_directory_recursive(struct dir_struct *dir,
 
        while (!read_cached_dir(&cdir)) {
                /* check how the file or directory should be treated */
-               state = treat_path(dir, untracked, &cdir, &path, baselen, simplify);
+               state = treat_path(dir, untracked, &cdir, &path,
+                                  baselen, pathspec);
 
                if (state > dir_state)
                        dir_state = state;
@@ -1731,8 +1754,9 @@ static enum path_treatment read_directory_recursive(struct dir_struct *dir,
                                              path.buf + baselen,
                                              path.len - baselen);
                        subdir_state =
-                               read_directory_recursive(dir, path.buf, path.len,
-                                                        ud, check_only, simplify);
+                               read_directory_recursive(dir, path.buf,
+                                                        path.len, ud,
+                                                        check_only, pathspec);
                        if (subdir_state > dir_state)
                                dir_state = subdir_state;
                }
@@ -1756,7 +1780,7 @@ static enum path_treatment read_directory_recursive(struct dir_struct *dir,
                        else if ((dir->flags & DIR_SHOW_IGNORED_TOO) ||
                                ((dir->flags & DIR_COLLECT_IGNORED) &&
                                exclude_matches_pathspec(path.buf, path.len,
-                                       simplify)))
+                                                        pathspec)))
                                dir_add_ignored(dir, path.buf, path.len);
                        break;
 
@@ -1787,36 +1811,9 @@ static int cmp_name(const void *p1, const void *p2)
        return name_compare(e1->name, e1->len, e2->name, e2->len);
 }
 
-static struct path_simplify *create_simplify(const char **pathspec)
-{
-       int nr, alloc = 0;
-       struct path_simplify *simplify = NULL;
-
-       if (!pathspec)
-               return NULL;
-
-       for (nr = 0 ; ; nr++) {
-               const char *match;
-               ALLOC_GROW(simplify, nr + 1, alloc);
-               match = *pathspec++;
-               if (!match)
-                       break;
-               simplify[nr].path = match;
-               simplify[nr].len = simple_length(match);
-       }
-       simplify[nr].path = NULL;
-       simplify[nr].len = 0;
-       return simplify;
-}
-
-static void free_simplify(struct path_simplify *simplify)
-{
-       free(simplify);
-}
-
 static int treat_leading_path(struct dir_struct *dir,
                              const char *path, int len,
-                             const struct path_simplify *simplify)
+                             const struct pathspec *pathspec)
 {
        struct strbuf sb = STRBUF_INIT;
        int baselen, rc = 0;
@@ -1840,9 +1837,9 @@ static int treat_leading_path(struct dir_struct *dir,
                strbuf_add(&sb, path, baselen);
                if (!is_directory(sb.buf))
                        break;
-               if (simplify_away(sb.buf, sb.len, simplify))
+               if (simplify_away(sb.buf, sb.len, pathspec))
                        break;
-               if (treat_one_path(dir, NULL, &sb, baselen, simplify,
+               if (treat_one_path(dir, NULL, &sb, baselen, pathspec,
                                   DT_DIR, NULL) == path_none)
                        break; /* do not recurse into it */
                if (len <= baselen) {
@@ -2010,33 +2007,14 @@ static struct untracked_cache_dir *validate_untracked_cache(struct dir_struct *d
        return root;
 }
 
-int read_directory(struct dir_struct *dir, const char *path, int len, const struct pathspec *pathspec)
+int read_directory(struct dir_struct *dir, const char *path,
+                  int len, const struct pathspec *pathspec)
 {
-       struct path_simplify *simplify;
        struct untracked_cache_dir *untracked;
 
-       /*
-        * Check out create_simplify()
-        */
-       if (pathspec)
-               GUARD_PATHSPEC(pathspec,
-                              PATHSPEC_FROMTOP |
-                              PATHSPEC_MAXDEPTH |
-                              PATHSPEC_LITERAL |
-                              PATHSPEC_GLOB |
-                              PATHSPEC_ICASE |
-                              PATHSPEC_EXCLUDE);
-
        if (has_symlink_leading_path(path, len))
                return dir->nr;
 
-       /*
-        * exclude patterns are treated like positive ones in
-        * create_simplify. Usually exclude patterns should be a
-        * subset of positive ones, which has no impacts on
-        * create_simplify().
-        */
-       simplify = create_simplify(pathspec ? pathspec->_raw : NULL);
        untracked = validate_untracked_cache(dir, len, pathspec);
        if (!untracked)
                /*
@@ -2044,9 +2022,8 @@ int read_directory(struct dir_struct *dir, const char *path, int len, const stru
                 * e.g. prep_exclude()
                 */
                dir->untracked = NULL;
-       if (!len || treat_leading_path(dir, path, len, simplify))
-               read_directory_recursive(dir, path, len, untracked, 0, simplify);
-       free_simplify(simplify);
+       if (!len || treat_leading_path(dir, path, len, pathspec))
+               read_directory_recursive(dir, path, len, untracked, 0, pathspec);
        QSORT(dir->entries, dir->nr, cmp_name);
        QSORT(dir->ignored, dir->ignored_nr, cmp_name);
        if (dir->untracked) {
@@ -2748,3 +2725,40 @@ void untracked_cache_add_to_index(struct index_state *istate,
 {
        untracked_cache_invalidate_path(istate, path);
 }
+
+/* Update gitfile and core.worktree setting to connect work tree and git dir */
+void connect_work_tree_and_git_dir(const char *work_tree_, const char *git_dir_)
+{
+       struct strbuf file_name = STRBUF_INIT;
+       struct strbuf rel_path = STRBUF_INIT;
+       char *git_dir = real_pathdup(git_dir_);
+       char *work_tree = real_pathdup(work_tree_);
+
+       /* Update gitfile */
+       strbuf_addf(&file_name, "%s/.git", work_tree);
+       write_file(file_name.buf, "gitdir: %s",
+                  relative_path(git_dir, work_tree, &rel_path));
+
+       /* Update core.worktree setting */
+       strbuf_reset(&file_name);
+       strbuf_addf(&file_name, "%s/config", git_dir);
+       git_config_set_in_file(file_name.buf, "core.worktree",
+                              relative_path(work_tree, git_dir, &rel_path));
+
+       strbuf_release(&file_name);
+       strbuf_release(&rel_path);
+       free(work_tree);
+       free(git_dir);
+}
+
+/*
+ * Migrate the git directory of the given path from old_git_dir to new_git_dir.
+ */
+void relocate_gitdir(const char *path, const char *old_git_dir, const char *new_git_dir)
+{
+       if (rename(old_git_dir, new_git_dir) < 0)
+               die_errno(_("could not migrate git directory from '%s' to '%s'"),
+                       old_git_dir, new_git_dir);
+
+       connect_work_tree_and_git_dir(path, new_git_dir);
+}
diff --git a/dir.h b/dir.h
index 97c83bb383a6b1fb5ce58d5e81dead570b73ac43..bf23a470af57775c8f0099597f7a403995bf3a89 100644 (file)
--- a/dir.h
+++ b/dir.h
@@ -335,4 +335,8 @@ struct untracked_cache *read_untracked_extension(const void *data, unsigned long
 void write_untracked_extension(struct strbuf *out, struct untracked_cache *untracked);
 void add_untracked_cache(struct index_state *istate);
 void remove_untracked_cache(struct index_state *istate);
+extern void connect_work_tree_and_git_dir(const char *work_tree, const char *git_dir);
+extern void relocate_gitdir(const char *path,
+                           const char *old_git_dir,
+                           const char *new_git_dir);
 #endif
index 0935ec696e530e1b610c71eda0a0a7072d1d656f..c07fb17fb70bdb3cdf3ae9ab23196af9a0b7ad1b 100644 (file)
@@ -21,7 +21,6 @@ int ignore_case;
 int assume_unchanged;
 int prefer_symlink_refs;
 int is_bare_repository_cfg = -1; /* unspecified */
-int log_all_ref_updates = -1; /* unspecified */
 int warn_ambiguous_refs = 1;
 int warn_on_object_refname_ambiguity = 1;
 int ref_paranoia = -1;
@@ -34,7 +33,7 @@ const char *git_attributes_file;
 const char *git_hooks_path;
 int zlib_compression_level = Z_BEST_SPEED;
 int core_compression_level;
-int core_compression_seen;
+int pack_compression_level = Z_DEFAULT_COMPRESSION;
 int fsync_object_files;
 size_t packed_git_window_size = DEFAULT_PACKED_GIT_WINDOW_SIZE;
 size_t packed_git_limit = DEFAULT_PACKED_GIT_LIMIT;
@@ -64,6 +63,7 @@ int merge_log_config = -1;
 int precomposed_unicode = -1; /* see probe_utf8_pathname_composition() */
 unsigned long pack_size_limit_cfg;
 enum hide_dotfiles_type hide_dotfiles = HIDE_DOTFILES_DOTGITONLY;
+enum log_refs_config log_all_ref_updates = LOG_REFS_UNSET;
 
 #ifndef PROTECT_HFS_DEFAULT
 #define PROTECT_HFS_DEFAULT 0
@@ -259,7 +259,7 @@ void set_git_work_tree(const char *new_work_tree)
                return;
        }
        git_work_tree_initialized = 1;
-       work_tree = xstrdup(real_path(new_work_tree));
+       work_tree = real_pathdup(new_work_tree);
 }
 
 const char *get_git_work_tree(void)
index 9d5703a157fe8e9d8396e0771798e54dc5eea6eb..fb94aeba9cef2893ea7173e5634640e596659474 100644 (file)
@@ -38,21 +38,17 @@ char *system_path(const char *path)
        return strbuf_detach(&d, NULL);
 }
 
-const char *git_extract_argv0_path(const char *argv0)
+void git_extract_argv0_path(const char *argv0)
 {
        const char *slash;
 
        if (!argv0 || !*argv0)
-               return NULL;
+               return;
 
        slash = find_last_dir_sep(argv0);
 
-       if (slash) {
+       if (slash)
                argv0_path = xstrndup(argv0, slash - argv0);
-               return slash + 1;
-       }
-
-       return argv0;
 }
 
 void git_set_argv_exec_path(const char *exec_path)
@@ -68,17 +64,19 @@ void git_set_argv_exec_path(const char *exec_path)
 /* Returns the highest-priority, location to look for git programs. */
 const char *git_exec_path(void)
 {
-       const char *env;
+       static char *cached_exec_path;
 
        if (argv_exec_path)
                return argv_exec_path;
 
-       env = getenv(EXEC_PATH_ENVIRONMENT);
-       if (env && *env) {
-               return env;
+       if (!cached_exec_path) {
+               const char *env = getenv(EXEC_PATH_ENVIRONMENT);
+               if (env && *env)
+                       cached_exec_path = xstrdup(env);
+               else
+                       cached_exec_path = system_path(GIT_EXEC_PATH);
        }
-
-       return system_path(GIT_EXEC_PATH);
+       return cached_exec_path;
 }
 
 static void add_path(struct strbuf *out, const char *path)
index 1f6b43378ba3866c07578b2222154e3a760440d1..ff0b48048a6ba82827b4d441654c34c21cfb7b9a 100644 (file)
@@ -4,7 +4,7 @@
 struct argv_array;
 
 extern void git_set_argv_exec_path(const char *exec_path);
-extern const char *git_extract_argv0_path(const char *path);
+extern void git_extract_argv0_path(const char *path);
 extern const char *git_exec_path(void);
 extern void setup_path(void);
 extern const char **prepare_git_cmd(struct argv_array *out, const char **argv);
index cb545d7df514b73a5ad9358b614ea9b4751e3c1e..64fe602f0bb62c4848798d1bdb43a7be9ab5f523 100644 (file)
@@ -284,8 +284,6 @@ static unsigned long max_depth = 10;
 static off_t max_packsize;
 static int unpack_limit = 100;
 static int force_update;
-static int pack_compression_level = Z_DEFAULT_COMPRESSION;
-static int pack_compression_seen;
 
 /* Stats and misc. counters */
 static uintmax_t alloc_count;
@@ -2220,13 +2218,17 @@ static uintmax_t do_change_note_fanout(
                char *fullpath, unsigned int fullpath_len,
                unsigned char fanout)
 {
-       struct tree_content *t = root->tree;
+       struct tree_content *t;
        struct tree_entry *e, leaf;
        unsigned int i, tmp_hex_sha1_len, tmp_fullpath_len;
        uintmax_t num_notes = 0;
        unsigned char sha1[20];
        char realpath[60];
 
+       if (!root->tree)
+               load_tree(root);
+       t = root->tree;
+
        for (i = 0; t && i < t->entry_count; i++) {
                e = t->entries[i];
                tmp_hex_sha1_len = hex_sha1_len + e->name->str_len;
@@ -2278,8 +2280,6 @@ static uintmax_t do_change_note_fanout(
                                leaf.tree);
                } else if (S_ISDIR(e->versions[1].mode)) {
                        /* This is a subdir that may contain note entries */
-                       if (!e->tree)
-                               load_tree(e);
                        num_notes += do_change_note_fanout(orig_root, e,
                                hex_sha1, tmp_hex_sha1_len,
                                fullpath, tmp_fullpath_len, fanout);
@@ -3381,15 +3381,6 @@ static void git_pack_config(void)
                if (max_depth > MAX_DEPTH)
                        max_depth = MAX_DEPTH;
        }
-       if (!git_config_get_int("pack.compression", &pack_compression_level)) {
-               if (pack_compression_level == -1)
-                       pack_compression_level = Z_DEFAULT_COMPRESSION;
-               else if (pack_compression_level < 0 ||
-                        pack_compression_level > Z_BEST_COMPRESSION)
-                       git_die_config("pack.compression",
-                                       "bad pack compression level %d", pack_compression_level);
-               pack_compression_seen = 1;
-       }
        if (!git_config_get_int("pack.indexversion", &indexversion_value)) {
                pack_idx_opts.version = indexversion_value;
                if (pack_idx_opts.version > 2)
@@ -3454,8 +3445,6 @@ int cmd_main(int argc, const char **argv)
        setup_git_directory();
        reset_pack_idx_option(&pack_idx_opts);
        git_pack_config();
-       if (!pack_compression_seen && core_compression_seen)
-               pack_compression_level = core_compression_level;
 
        alloc_objects(object_entry_alloc);
        strbuf_init(&command_buf, 0);
diff --git a/fsck.c b/fsck.c
index 4a3069e204ea555bfb6d1ce05a0163860f852437..939792752bf39c72cc536f00c21e2af8ed854c3e 100644 (file)
--- a/fsck.c
+++ b/fsck.c
@@ -458,6 +458,10 @@ int fsck_walk(struct object *obj, void *data, struct fsck_options *options)
 {
        if (!obj)
                return -1;
+
+       if (obj->type == OBJ_NONE)
+               parse_object(obj->oid.hash);
+
        switch (obj->type) {
        case OBJ_BLOB:
                return 0;
index ee3d812695fa232f30682b0e546105ca0eea5d49..cf6fc926ab9325780eca5b6242cc04a656723451 100755 (executable)
@@ -4,6 +4,7 @@
 use strict;
 use warnings;
 use Git;
+use Git::I18N;
 
 binmode(STDOUT, ":raw");
 
@@ -46,7 +47,6 @@
 
 my $diff_algorithm = $repo->config('diff.algorithm');
 my $diff_indent_heuristic = $repo->config_bool('diff.indentheuristic');
-my $diff_compaction_heuristic = $repo->config_bool('diff.compactionheuristic');
 my $diff_filter = $repo->config('interactive.difffilter');
 
 my $use_readkey = 0;
@@ -92,6 +92,7 @@ sub colored {
 }
 
 # command line options
+my $cmd;
 my $patch_mode;
 my $patch_mode_revision;
 
@@ -104,9 +105,6 @@ sub colored {
                DIFF => 'diff-files -p',
                APPLY => sub { apply_patch 'apply --cached', @_; },
                APPLY_CHECK => 'apply --cached',
-               VERB => 'Stage',
-               TARGET => '',
-               PARTICIPLE => 'staging',
                FILTER => 'file-only',
                IS_REVERSE => 0,
        },
@@ -114,9 +112,6 @@ sub colored {
                DIFF => 'diff-index -p HEAD',
                APPLY => sub { apply_patch 'apply --cached', @_; },
                APPLY_CHECK => 'apply --cached',
-               VERB => 'Stash',
-               TARGET => '',
-               PARTICIPLE => 'stashing',
                FILTER => undef,
                IS_REVERSE => 0,
        },
@@ -124,9 +119,6 @@ sub colored {
                DIFF => 'diff-index -p --cached',
                APPLY => sub { apply_patch 'apply -R --cached', @_; },
                APPLY_CHECK => 'apply -R --cached',
-               VERB => 'Unstage',
-               TARGET => '',
-               PARTICIPLE => 'unstaging',
                FILTER => 'index-only',
                IS_REVERSE => 1,
        },
@@ -134,9 +126,6 @@ sub colored {
                DIFF => 'diff-index -R -p --cached',
                APPLY => sub { apply_patch 'apply --cached', @_; },
                APPLY_CHECK => 'apply --cached',
-               VERB => 'Apply',
-               TARGET => ' to index',
-               PARTICIPLE => 'applying',
                FILTER => 'index-only',
                IS_REVERSE => 0,
        },
@@ -144,9 +133,6 @@ sub colored {
                DIFF => 'diff-files -p',
                APPLY => sub { apply_patch 'apply -R', @_; },
                APPLY_CHECK => 'apply -R',
-               VERB => 'Discard',
-               TARGET => ' from worktree',
-               PARTICIPLE => 'discarding',
                FILTER => 'file-only',
                IS_REVERSE => 1,
        },
@@ -154,9 +140,6 @@ sub colored {
                DIFF => 'diff-index -p',
                APPLY => sub { apply_patch_for_checkout_commit '-R', @_ },
                APPLY_CHECK => 'apply -R',
-               VERB => 'Discard',
-               TARGET => ' from index and worktree',
-               PARTICIPLE => 'discarding',
                FILTER => undef,
                IS_REVERSE => 1,
        },
@@ -164,15 +147,13 @@ sub colored {
                DIFF => 'diff-index -R -p',
                APPLY => sub { apply_patch_for_checkout_commit '', @_ },
                APPLY_CHECK => 'apply',
-               VERB => 'Apply',
-               TARGET => ' to index and worktree',
-               PARTICIPLE => 'applying',
                FILTER => undef,
                IS_REVERSE => 0,
        },
 );
 
-my %patch_mode_flavour = %{$patch_modes{stage}};
+$patch_mode = 'stage';
+my %patch_mode_flavour = %{$patch_modes{$patch_mode}};
 
 sub run_cmd_pipe {
        if ($^O eq 'MSWin32') {
@@ -253,8 +234,9 @@ sub list_untracked {
        run_cmd_pipe(qw(git ls-files --others --exclude-standard --), @ARGV);
 }
 
-my $status_fmt = '%12s %12s %s';
-my $status_head = sprintf($status_fmt, 'staged', 'unstaged', 'path');
+# TRANSLATORS: you can adjust this to align "git add -i" status menu
+my $status_fmt = __('%12s %12s %s');
+my $status_head = sprintf($status_fmt, __('staged'), __('unstaged'), __('path'));
 
 {
        my $initial;
@@ -312,7 +294,7 @@ sub list_modified {
                        my ($change, $bin);
                        $file = unquote_path($file);
                        if ($add eq '-' && $del eq '-') {
-                               $change = 'binary';
+                               $change = __('binary');
                                $bin = 1;
                        }
                        else {
@@ -321,7 +303,7 @@ sub list_modified {
                        $data{$file} = {
                                INDEX => $change,
                                BINARY => $bin,
-                               FILE => 'nothing',
+                               FILE => __('nothing'),
                        }
                }
                elsif (($adddel, $file) =
@@ -337,7 +319,7 @@ sub list_modified {
                        $file = unquote_path($file);
                        my ($change, $bin);
                        if ($add eq '-' && $del eq '-') {
-                               $change = 'binary';
+                               $change = __('binary');
                                $bin = 1;
                        }
                        else {
@@ -357,7 +339,7 @@ sub list_modified {
                        $file = unquote_path($2);
                        if (!exists $data{$file}) {
                                $data{$file} = +{
-                                       INDEX => 'unchanged',
+                                       INDEX => __('unchanged'),
                                        BINARY => 0,
                                };
                        }
@@ -372,10 +354,10 @@ sub list_modified {
 
                if ($only) {
                        if ($only eq 'index-only') {
-                               next if ($it->{INDEX} eq 'unchanged');
+                               next if ($it->{INDEX} eq __('unchanged'));
                        }
                        if ($only eq 'file-only') {
-                               next if ($it->{FILE} eq 'nothing');
+                               next if ($it->{FILE} eq __('nothing'));
                        }
                }
                push @return, +{
@@ -613,12 +595,12 @@ sub list_and_choose {
                        else {
                                $bottom = $top = find_unique($choice, @stuff);
                                if (!defined $bottom) {
-                                       error_msg "Huh ($choice)?\n";
+                                       error_msg sprintf(__("Huh (%s)?\n"), $choice);
                                        next TOPLOOP;
                                }
                        }
                        if ($opts->{SINGLETON} && $bottom != $top) {
-                               error_msg "Huh ($choice)?\n";
+                               error_msg sprintf(__("Huh (%s)?\n"), $choice);
                                next TOPLOOP;
                        }
                        for ($i = $bottom-1; $i <= $top-1; $i++) {
@@ -637,7 +619,7 @@ sub list_and_choose {
 }
 
 sub singleton_prompt_help_cmd {
-       print colored $help_color, <<\EOF ;
+       print colored $help_color, __ <<'EOF' ;
 Prompt help:
 1          - select a numbered item
 foo        - select item based on unique prefix
@@ -646,7 +628,7 @@ sub singleton_prompt_help_cmd {
 }
 
 sub prompt_help_cmd {
-       print colored $help_color, <<\EOF ;
+       print colored $help_color, __ <<'EOF' ;
 Prompt help:
 1          - select a single item
 3-5        - select a range of items
@@ -667,12 +649,18 @@ sub status_cmd {
 sub say_n_paths {
        my $did = shift @_;
        my $cnt = scalar @_;
-       print "$did ";
-       if (1 < $cnt) {
-               print "$cnt paths\n";
-       }
-       else {
-               print "one path\n";
+       if ($did eq 'added') {
+               printf(__n("added %d path\n", "added %d paths\n",
+                          $cnt), $cnt);
+       } elsif ($did eq 'updated') {
+               printf(__n("updated %d path\n", "updated %d paths\n",
+                          $cnt), $cnt);
+       } elsif ($did eq 'reverted') {
+               printf(__n("reverted %d path\n", "reverted %d paths\n",
+                          $cnt), $cnt);
+       } else {
+               printf(__n("touched %d path\n", "touched %d paths\n",
+                          $cnt), $cnt);
        }
 }
 
@@ -680,7 +668,7 @@ sub update_cmd {
        my @mods = list_modified('file-only');
        return if (!@mods);
 
-       my @update = list_and_choose({ PROMPT => 'Update',
+       my @update = list_and_choose({ PROMPT => __('Update'),
                                       HEADER => $status_head, },
                                     @mods);
        if (@update) {
@@ -692,7 +680,7 @@ sub update_cmd {
 }
 
 sub revert_cmd {
-       my @update = list_and_choose({ PROMPT => 'Revert',
+       my @update = list_and_choose({ PROMPT => __('Revert'),
                                       HEADER => $status_head, },
                                     list_modified());
        if (@update) {
@@ -715,7 +703,7 @@ sub revert_cmd {
                                    $_->{INDEX_ADDDEL} eq 'create') {
                                        system(qw(git update-index --force-remove --),
                                               $_->{VALUE});
-                                       print "note: $_->{VALUE} is untracked now.\n";
+                                       printf(__("note: %s is untracked now.\n"), $_->{VALUE});
                                }
                        }
                }
@@ -726,13 +714,13 @@ sub revert_cmd {
 }
 
 sub add_untracked_cmd {
-       my @add = list_and_choose({ PROMPT => 'Add untracked' },
+       my @add = list_and_choose({ PROMPT => __('Add untracked') },
                                  list_untracked());
        if (@add) {
                system(qw(git update-index --add --), @add);
                say_n_paths('added', @add);
        } else {
-               print "No untracked files.\n";
+               print __("No untracked files.\n");
        }
        print "\n";
 }
@@ -753,8 +741,6 @@ sub parse_diff {
        }
        if ($diff_indent_heuristic) {
                splice @diff_cmd, 1, 0, "--indent-heuristic";
-       } elsif ($diff_compaction_heuristic) {
-               splice @diff_cmd, 1, 0, "--compaction-heuristic";
        }
        if (defined $patch_mode_revision) {
                push @diff_cmd, get_diff_reference($patch_mode_revision);
@@ -1048,29 +1034,55 @@ sub color_diff {
        } @_;
 }
 
+my %edit_hunk_manually_modes = (
+       stage => N__(
+"If the patch applies cleanly, the edited hunk will immediately be
+marked for staging."),
+       stash => N__(
+"If the patch applies cleanly, the edited hunk will immediately be
+marked for stashing."),
+       reset_head => N__(
+"If the patch applies cleanly, the edited hunk will immediately be
+marked for unstaging."),
+       reset_nothead => N__(
+"If the patch applies cleanly, the edited hunk will immediately be
+marked for applying."),
+       checkout_index => N__(
+"If the patch applies cleanly, the edited hunk will immediately be
+marked for discarding"),
+       checkout_head => N__(
+"If the patch applies cleanly, the edited hunk will immediately be
+marked for discarding."),
+       checkout_nothead => N__(
+"If the patch applies cleanly, the edited hunk will immediately be
+marked for applying."),
+);
+
 sub edit_hunk_manually {
        my ($oldtext) = @_;
 
        my $hunkfile = $repo->repo_path . "/addp-hunk-edit.diff";
        my $fh;
        open $fh, '>', $hunkfile
-               or die "failed to open hunk edit file for writing: " . $!;
-       print $fh "# Manual hunk edit mode -- see bottom for a quick guide\n";
+               or die sprintf(__("failed to open hunk edit file for writing: %s"), $!);
+       print $fh Git::comment_lines __("Manual hunk edit mode -- see bottom for a quick guide.\n");
        print $fh @$oldtext;
-       my $participle = $patch_mode_flavour{PARTICIPLE};
        my $is_reverse = $patch_mode_flavour{IS_REVERSE};
        my ($remove_plus, $remove_minus) = $is_reverse ? ('-', '+') : ('+', '-');
-       print $fh <<EOF;
-# ---
-# To remove '$remove_minus' lines, make them ' ' lines (context).
-# To remove '$remove_plus' lines, delete them.
-# Lines starting with # will be removed.
-#
-# If the patch applies cleanly, the edited hunk will immediately be
-# marked for $participle. If it does not apply cleanly, you will be given
-# an opportunity to edit again. If all lines of the hunk are removed,
-# then the edit is aborted and the hunk is left unchanged.
+       my $comment_line_char = Git::get_comment_line_char;
+       print $fh Git::comment_lines sprintf(__ <<EOF, $remove_minus, $remove_plus, $comment_line_char),
+---
+To remove '%s' lines, make them ' ' lines (context).
+To remove '%s' lines, delete them.
+Lines starting with %s will be removed.
 EOF
+__($edit_hunk_manually_modes{$patch_mode}),
+# TRANSLATORS: 'it' refers to the patch mentioned in the previous messages.
+__ <<EOF2 ;
+If it does not apply cleanly, you will be given an opportunity to
+edit again.  If all lines of the hunk are removed, then the edit is
+aborted and the hunk is left unchanged.
+EOF2
        close $fh;
 
        chomp(my $editor = run_cmd_pipe(qw(git var GIT_EDITOR)));
@@ -1081,8 +1093,8 @@ sub edit_hunk_manually {
        }
 
        open $fh, '<', $hunkfile
-               or die "failed to open hunk edit file for reading: " . $!;
-       my @newtext = grep { !/^#/ } <$fh>;
+               or die sprintf(__("failed to open hunk edit file for reading: %s"), $!);
+       my @newtext = grep { !/^$comment_line_char/ } <$fh>;
        close $fh;
        unlink $hunkfile;
 
@@ -1166,22 +1178,66 @@ sub edit_hunk_loop {
                }
                else {
                        prompt_yesno(
-                               'Your edited hunk does not apply. Edit again '
-                               . '(saying "no" discards!) [y/n]? '
+                               # TRANSLATORS: do not translate [y/n]
+                               # The program will only accept that input
+                               # at this point.
+                               # Consider translating (saying "no" discards!) as
+                               # (saying "n" for "no" discards!) if the translation
+                               # of the word "no" does not start with n.
+                               __('Your edited hunk does not apply. Edit again '
+                                  . '(saying "no" discards!) [y/n]? ')
                                ) or return undef;
                }
        }
 }
 
+my %help_patch_modes = (
+       stage => N__(
+"y - stage this hunk
+n - do not stage this hunk
+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 or any of the later hunks in the file"),
+       stash => N__(
+"y - stash this hunk
+n - do not stash this hunk
+q - quit; do not stash this hunk or any of the remaining ones
+a - stash this hunk and all later hunks in the file
+d - do not stash this hunk or any of the later hunks in the file"),
+       reset_head => N__(
+"y - unstage this hunk
+n - do not unstage this hunk
+q - quit; do not unstage this hunk or any of the remaining ones
+a - unstage this hunk and all later hunks in the file
+d - do not unstage this hunk or any of the later hunks in the file"),
+       reset_nothead => N__(
+"y - apply this hunk to index
+n - do not apply this hunk to index
+q - quit; do not apply this hunk or any of the remaining ones
+a - apply this hunk and all later hunks in the file
+d - do not apply this hunk or any of the later hunks in the file"),
+       checkout_index => N__(
+"y - discard this hunk from worktree
+n - do not discard this hunk from worktree
+q - quit; do not discard this hunk or any of the remaining ones
+a - discard this hunk and all later hunks in the file
+d - do not discard this hunk or any of the later hunks in the file"),
+       checkout_head => N__(
+"y - discard this hunk from index and worktree
+n - do not discard this hunk from index and worktree
+q - quit; do not discard this hunk or any of the remaining ones
+a - discard this hunk and all later hunks in the file
+d - do not discard this hunk or any of the later hunks in the file"),
+       checkout_nothead => N__(
+"y - apply this hunk to index and worktree
+n - do not apply this hunk to index and worktree
+q - quit; do not apply this hunk or any of the remaining ones
+a - apply this hunk and all later hunks in the file
+d - do not apply this hunk or any of the later hunks in the file"),
+);
+
 sub help_patch_cmd {
-       my $verb = lc $patch_mode_flavour{VERB};
-       my $target = $patch_mode_flavour{TARGET};
-       print colored $help_color, <<EOF ;
-y - $verb this hunk$target
-n - do not $verb this hunk$target
-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 or any of the later hunks in the file
+       print colored $help_color, __($help_patch_modes{$patch_mode}), "\n", __ <<EOF ;
 g - select a hunk to go to
 / - search for a hunk matching the given regex
 j - leave this hunk undecided, see next undecided hunk
@@ -1213,11 +1269,11 @@ sub apply_patch_for_checkout_commit {
                run_git_apply 'apply '.$reverse, @_;
                return 1;
        } elsif (!$applies_index) {
-               print colored $error_color, "The selected hunks do not apply to the index!\n";
-               if (prompt_yesno "Apply them to the worktree anyway? ") {
+               print colored $error_color, __("The selected hunks do not apply to the index!\n");
+               if (prompt_yesno __("Apply them to the worktree anyway? ")) {
                        return run_git_apply 'apply '.$reverse, @_;
                } else {
-                       print colored $error_color, "Nothing was applied.\n";
+                       print colored $error_color, __("Nothing was applied.\n");
                        return 0;
                }
        } else {
@@ -1228,7 +1284,7 @@ sub apply_patch_for_checkout_commit {
 
 sub patch_update_cmd {
        my @all_mods = list_modified($patch_mode_flavour{FILTER});
-       error_msg "ignoring unmerged: $_->{VALUE}\n"
+       error_msg sprintf(__("ignoring unmerged: %s\n"), $_->{VALUE})
                for grep { $_->{UNMERGED} } @all_mods;
        @all_mods = grep { !$_->{UNMERGED} } @all_mods;
 
@@ -1237,9 +1293,9 @@ sub patch_update_cmd {
 
        if (!@mods) {
                if (@all_mods) {
-                       print STDERR "Only binary files changed.\n";
+                       print STDERR __("Only binary files changed.\n");
                } else {
-                       print STDERR "No changes.\n";
+                       print STDERR __("No changes.\n");
                }
                return 0;
        }
@@ -1247,7 +1303,7 @@ sub patch_update_cmd {
                @them = @mods;
        }
        else {
-               @them = list_and_choose({ PROMPT => 'Patch update',
+               @them = list_and_choose({ PROMPT => __('Patch update'),
                                          HEADER => $status_head, },
                                        @mods);
        }
@@ -1297,6 +1353,44 @@ sub display_hunks {
        return $i;
 }
 
+my %patch_update_prompt_modes = (
+       stage => {
+               mode => N__("Stage mode change [y,n,q,a,d,/%s,?]? "),
+               deletion => N__("Stage deletion [y,n,q,a,d,/%s,?]? "),
+               hunk => N__("Stage this hunk [y,n,q,a,d,/%s,?]? "),
+       },
+       stash => {
+               mode => N__("Stash mode change [y,n,q,a,d,/%s,?]? "),
+               deletion => N__("Stash deletion [y,n,q,a,d,/%s,?]? "),
+               hunk => N__("Stash this hunk [y,n,q,a,d,/%s,?]? "),
+       },
+       reset_head => {
+               mode => N__("Unstage mode change [y,n,q,a,d,/%s,?]? "),
+               deletion => N__("Unstage deletion [y,n,q,a,d,/%s,?]? "),
+               hunk => N__("Unstage this hunk [y,n,q,a,d,/%s,?]? "),
+       },
+       reset_nothead => {
+               mode => N__("Apply mode change to index [y,n,q,a,d,/%s,?]? "),
+               deletion => N__("Apply deletion to index [y,n,q,a,d,/%s,?]? "),
+               hunk => N__("Apply this hunk to index [y,n,q,a,d,/%s,?]? "),
+       },
+       checkout_index => {
+               mode => N__("Discard mode change from worktree [y,n,q,a,d,/%s,?]? "),
+               deletion => N__("Discard deletion from worktree [y,n,q,a,d,/%s,?]? "),
+               hunk => N__("Discard this hunk from worktree [y,n,q,a,d,/%s,?]? "),
+       },
+       checkout_head => {
+               mode => N__("Discard mode change from index and worktree [y,n,q,a,d,/%s,?]? "),
+               deletion => N__("Discard deletion from index and worktree [y,n,q,a,d,/%s,?]? "),
+               hunk => N__("Discard this hunk from index and worktree [y,n,q,a,d,/%s,?]? "),
+       },
+       checkout_nothead => {
+               mode => N__("Apply mode change to index and worktree [y,n,q,a,d,/%s,?]? "),
+               deletion => N__("Apply deletion to index and worktree [y,n,q,a,d,/%s,?]? "),
+               hunk => N__("Apply this hunk to index and worktree [y,n,q,a,d,/%s,?]? "),
+       },
+);
+
 sub patch_update_file {
        my $quit = 0;
        my ($ix, $num);
@@ -1369,12 +1463,9 @@ sub patch_update_file {
                for (@{$hunk[$ix]{DISPLAY}}) {
                        print;
                }
-               print colored $prompt_color, $patch_mode_flavour{VERB},
-                 ($hunk[$ix]{TYPE} eq 'mode' ? ' mode change' :
-                  $hunk[$ix]{TYPE} eq 'deletion' ? ' deletion' :
-                  ' this hunk'),
-                 $patch_mode_flavour{TARGET},
-                 " [y,n,q,a,d,/$other,?]? ";
+               print colored $prompt_color,
+                       sprintf(__($patch_update_prompt_modes{$patch_mode}{$hunk[$ix]{TYPE}}), $other);
+
                my $line = prompt_single_character;
                last unless defined $line;
                if ($line) {
@@ -1397,12 +1488,12 @@ sub patch_update_file {
                                my $response = $1;
                                my $no = $ix > 10 ? $ix - 10 : 0;
                                while ($response eq '') {
-                                       my $extra = "";
                                        $no = display_hunks(\@hunk, $no);
                                        if ($no < $num) {
-                                               $extra = " (<ret> to see more)";
+                                               print __("go to which hunk (<ret> to see more)? ");
+                                       } else {
+                                               print __("go to which hunk? ");
                                        }
-                                       print "go to which hunk$extra? ";
                                        $response = <STDIN>;
                                        if (!defined $response) {
                                                $response = '';
@@ -1410,11 +1501,13 @@ sub patch_update_file {
                                        chomp $response;
                                }
                                if ($response !~ /^\s*\d+\s*$/) {
-                                       error_msg "Invalid number: '$response'\n";
+                                       error_msg sprintf(__("Invalid number: '%s'\n"),
+                                                            $response);
                                } elsif (0 < $response && $response <= $num) {
                                        $ix = $response - 1;
                                } else {
-                                       error_msg "Sorry, only $num hunks available.\n";
+                                       error_msg sprintf(__n("Sorry, only %d hunk available.\n",
+                                                             "Sorry, only %d hunks available.\n", $num), $num);
                                }
                                next;
                        }
@@ -1439,7 +1532,7 @@ sub patch_update_file {
                        elsif ($line =~ m|^/(.*)|) {
                                my $regex = $1;
                                if ($1 eq "") {
-                                       print colored $prompt_color, "search for regex? ";
+                                       print colored $prompt_color, __("search for regex? ");
                                        $regex = <STDIN>;
                                        if (defined $regex) {
                                                chomp $regex;
@@ -1452,7 +1545,7 @@ sub patch_update_file {
                                if ($@) {
                                        my ($err,$exp) = ($@, $1);
                                        $err =~ s/ at .*git-add--interactive line \d+, <STDIN> line \d+.*$//;
-                                       error_msg "Malformed search regexp $exp: $err\n";
+                                       error_msg sprintf(__("Malformed search regexp %s: %s\n"), $exp, $err);
                                        next;
                                }
                                my $iy = $ix;
@@ -1462,7 +1555,7 @@ sub patch_update_file {
                                        $iy++;
                                        $iy = 0 if ($iy >= $num);
                                        if ($ix == $iy) {
-                                               error_msg "No hunk matches the given pattern\n";
+                                               error_msg __("No hunk matches the given pattern\n");
                                                last;
                                        }
                                }
@@ -1474,7 +1567,7 @@ sub patch_update_file {
                                        $ix--;
                                }
                                else {
-                                       error_msg "No previous hunk\n";
+                                       error_msg __("No previous hunk\n");
                                }
                                next;
                        }
@@ -1483,7 +1576,7 @@ sub patch_update_file {
                                        $ix++;
                                }
                                else {
-                                       error_msg "No next hunk\n";
+                                       error_msg __("No next hunk\n");
                                }
                                next;
                        }
@@ -1496,21 +1589,23 @@ sub patch_update_file {
                                        }
                                }
                                else {
-                                       error_msg "No previous hunk\n";
+                                       error_msg __("No previous hunk\n");
                                }
                                next;
                        }
                        elsif ($line =~ /^j/) {
                                if ($other !~ /j/) {
-                                       error_msg "No next hunk\n";
+                                       error_msg __("No next hunk\n");
                                        next;
                                }
                        }
                        elsif ($other =~ /s/ && $line =~ /^s/) {
                                my @split = split_hunk($hunk[$ix]{TEXT}, $hunk[$ix]{DISPLAY});
                                if (1 < @split) {
-                                       print colored $header_color, "Split into ",
-                                       scalar(@split), " hunks.\n";
+                                       print colored $header_color, sprintf(
+                                               __n("Split into %d hunk.\n",
+                                                   "Split into %d hunks.\n",
+                                                   scalar(@split)), scalar(@split));
                                }
                                splice (@hunk, $ix, 1, @split);
                                $num = scalar @hunk;
@@ -1560,23 +1655,25 @@ sub diff_cmd {
        my @mods = list_modified('index-only');
        @mods = grep { !($_->{BINARY}) } @mods;
        return if (!@mods);
-       my (@them) = list_and_choose({ PROMPT => 'Review diff',
+       my (@them) = list_and_choose({ PROMPT => __('Review diff'),
                                     IMMEDIATE => 1,
                                     HEADER => $status_head, },
                                   @mods);
        return if (!@them);
-       my $reference = is_initial_commit() ? get_empty_tree() : 'HEAD';
+       my $reference = (is_initial_commit()) ? get_empty_tree() : 'HEAD';
        system(qw(git diff -p --cached), $reference, '--',
                map { $_->{VALUE} } @them);
 }
 
 sub quit_cmd {
-       print "Bye.\n";
+       print __("Bye.\n");
        exit(0);
 }
 
 sub help_cmd {
-       print colored $help_color, <<\EOF ;
+# TRANSLATORS: please do not translate the command names
+# 'status', 'update', 'revert', etc.
+       print colored $help_color, __ <<'EOF' ;
 status        - show paths with changes
 update        - add working tree state to the staged set of changes
 revert        - revert staged set of changes back to the HEAD version
@@ -1594,39 +1691,40 @@ sub process_args {
                        if ($1 eq 'reset') {
                                $patch_mode = 'reset_head';
                                $patch_mode_revision = 'HEAD';
-                               $arg = shift @ARGV or die "missing --";
+                               $arg = shift @ARGV or die __("missing --");
                                if ($arg ne '--') {
                                        $patch_mode_revision = $arg;
                                        $patch_mode = ($arg eq 'HEAD' ?
                                                       'reset_head' : 'reset_nothead');
-                                       $arg = shift @ARGV or die "missing --";
+                                       $arg = shift @ARGV or die __("missing --");
                                }
                        } elsif ($1 eq 'checkout') {
-                               $arg = shift @ARGV or die "missing --";
+                               $arg = shift @ARGV or die __("missing --");
                                if ($arg eq '--') {
                                        $patch_mode = 'checkout_index';
                                } else {
                                        $patch_mode_revision = $arg;
                                        $patch_mode = ($arg eq 'HEAD' ?
                                                       'checkout_head' : 'checkout_nothead');
-                                       $arg = shift @ARGV or die "missing --";
+                                       $arg = shift @ARGV or die __("missing --");
                                }
                        } elsif ($1 eq 'stage' or $1 eq 'stash') {
                                $patch_mode = $1;
-                               $arg = shift @ARGV or die "missing --";
+                               $arg = shift @ARGV or die __("missing --");
                        } else {
-                               die "unknown --patch mode: $1";
+                               die sprintf(__("unknown --patch mode: %s"), $1);
                        }
                } else {
                        $patch_mode = 'stage';
-                       $arg = shift @ARGV or die "missing --";
+                       $arg = shift @ARGV or die __("missing --");
                }
-               die "invalid argument $arg, expecting --"
-                   unless $arg eq "--";
+               die sprintf(__("invalid argument %s, expecting --"),
+                              $arg) unless $arg eq "--";
                %patch_mode_flavour = %{$patch_modes{$patch_mode}};
+               $cmd = 1;
        }
        elsif ($arg ne "--") {
-               die "invalid argument $arg, expecting --";
+               die sprintf(__("invalid argument %s, expecting --"), $arg);
        }
 }
 
@@ -1641,10 +1739,10 @@ sub main_loop {
                   [ 'help', \&help_cmd, ],
        );
        while (1) {
-               my ($it) = list_and_choose({ PROMPT => 'What now',
+               my ($it) = list_and_choose({ PROMPT => __('What now'),
                                             SINGLETON => 1,
                                             LIST_FLAT => 4,
-                                            HEADER => '*** Commands ***',
+                                            HEADER => __('*** Commands ***'),
                                             ON_EOF => \&quit_cmd,
                                             IMMEDIATE => 1 }, @cmd);
                if ($it) {
@@ -1660,7 +1758,7 @@ sub main_loop {
 
 process_args();
 refresh();
-if ($patch_mode) {
+if ($cmd) {
        patch_update_cmd();
 }
 else {
index 87237b092b51df6255552f0756359eddf3b12042..f46d40e4a475c9bd35ff02373101e8431e722b7d 100644 (file)
@@ -988,6 +988,17 @@ static inline void sane_qsort(void *base, size_t nmemb, size_t size,
                qsort(base, nmemb, size, compar);
 }
 
+#ifndef HAVE_ISO_QSORT_S
+int git_qsort_s(void *base, size_t nmemb, size_t size,
+               int (*compar)(const void *, const void *, void *), void *ctx);
+#define qsort_s git_qsort_s
+#endif
+
+#define QSORT_S(base, n, compar, ctx) do {                     \
+       if (qsort_s((base), (n), sizeof(*(base)), compar, ctx)) \
+               die("BUG: qsort_s() failed");                   \
+} while (0)
+
 #ifndef REG_STARTEND
 #error "Git requires REG_STARTEND support. Compile with NO_REGEX=NeedsStartEnd"
 #endif
index 9abd00be212b3e55883c0f9fa0487c7b31a6039f..9a8b97a2aba9aa9fabb095558c03cb8f27df3d50 100644 (file)
@@ -125,16 +125,7 @@ setup_user_tool () {
        }
 
        merge_cmd () {
-               trust_exit_code=$(git config --bool \
-                       "mergetool.$1.trustExitCode" || echo false)
-               if test "$trust_exit_code" = "false"
-               then
-                       touch "$BACKUP"
-                       ( eval $merge_tool_cmd )
-                       check_unchanged
-               else
-                       ( eval $merge_tool_cmd )
-               fi
+               ( eval $merge_tool_cmd )
        }
 }
 
@@ -162,6 +153,28 @@ setup_tool () {
                echo "$1"
        }
 
+       # Most tools' exit codes cannot be trusted, so By default we ignore
+       # their exit code and check the merged file's modification time in
+       # check_unchanged() to determine whether or not the merge was
+       # successful.  The return value from run_merge_cmd, by default, is
+       # determined by check_unchanged().
+       #
+       # When a tool's exit code can be trusted then the return value from
+       # run_merge_cmd is simply the tool's exit code, and check_unchanged()
+       # is not called.
+       #
+       # The return value of exit_code_trustable() tells us whether or not we
+       # can trust the tool's exit code.
+       #
+       # User-defined and built-in tools default to false.
+       # Built-in tools advertise that their exit code is trustable by
+       # redefining exit_code_trustable() to true.
+
+       exit_code_trustable () {
+               false
+       }
+
+
        if ! test -f "$MERGE_TOOLS_DIR/$tool"
        then
                setup_user_tool
@@ -197,6 +210,19 @@ get_merge_tool_cmd () {
        fi
 }
 
+trust_exit_code () {
+       if git config --bool "mergetool.$1.trustExitCode"
+       then
+               :; # OK
+       elif exit_code_trustable
+       then
+               echo true
+       else
+               echo false
+       fi
+}
+
+
 # Entry point for running tools
 run_merge_tool () {
        # If GIT_PREFIX is empty then we cannot use it in tools
@@ -225,7 +251,15 @@ run_diff_cmd () {
 
 # Run a either a configured or built-in merge tool
 run_merge_cmd () {
-       merge_cmd "$1"
+       mergetool_trust_exit_code=$(trust_exit_code "$1")
+       if test "$mergetool_trust_exit_code" = "true"
+       then
+               merge_cmd "$1"
+       else
+               touch "$BACKUP"
+               merge_cmd "$1"
+               check_unchanged
+       fi
 }
 
 list_merge_tool_candidates () {
index e52b4e4f24088d7552d88aa5a3c9ffc308f6a4cf..c062e3de3a503bd01203f2a6aef63eea63cae5c5 100755 (executable)
@@ -421,7 +421,7 @@ main () {
                        prompt=true
                        ;;
                -O*)
-                       orderfile="$1"
+                       orderfile="${1#-O}"
                        ;;
                --)
                        shift
@@ -454,6 +454,17 @@ main () {
        merge_keep_backup="$(git config --bool mergetool.keepBackup || echo true)"
        merge_keep_temporaries="$(git config --bool mergetool.keepTemporaries || echo false)"
 
+       prefix=$(git rev-parse --show-prefix) || exit 1
+       cd_to_toplevel
+
+       if test -n "$orderfile"
+       then
+               orderfile=$(
+                       git rev-parse --prefix "$prefix" -- "$orderfile" |
+                       sed -e 1d
+               )
+       fi
+
        if test $# -eq 0 && test -e "$GIT_DIR/MERGE_RR"
        then
                set -- $(git rerere remaining)
@@ -461,13 +472,15 @@ main () {
                then
                        print_noop_and_exit
                fi
+       elif test $# -ge 0
+       then
+               # rev-parse provides the -- needed for 'set'
+               eval "set $(git rev-parse --sq --prefix "$prefix" -- "$@")"
        fi
 
        files=$(git -c core.quotePath=false \
                diff --name-only --diff-filter=U \
-               ${orderfile:+"$orderfile"} -- "$@")
-
-       cd_to_toplevel
+               ${orderfile:+"-O$orderfile"} -- "$@")
 
        if test -z "$files"
        then
index fd5ca524626c40823371422e52a3457fd1d45579..9695d2ed3ec2071ed7a279eac785b7e280b718e4 100755 (executable)
--- a/git-p4.py
+++ b/git-p4.py
@@ -25,6 +25,7 @@
 import zipfile
 import zlib
 import ctypes
+import errno
 
 try:
     from subprocess import CalledProcessError
@@ -78,6 +79,13 @@ def p4_build_cmd(cmd):
     if len(client) > 0:
         real_cmd += ["-c", client]
 
+    retries = gitConfigInt("git-p4.retries")
+    if retries is None:
+        # Perform 3 retries by default
+        retries = 3
+    if retries > 0:
+        # Provide a way to not pass this option by setting git-p4.retries to 0
+        real_cmd += ["-r", str(retries)]
 
     if isinstance(cmd,basestring):
         real_cmd = ' '.join(real_cmd) + ' ' + cmd
@@ -85,6 +93,16 @@ def p4_build_cmd(cmd):
         real_cmd += cmd
     return real_cmd
 
+def git_dir(path):
+    """ Return TRUE if the given path is a git directory (/path/to/dir/.git).
+        This won't automatically add ".git" to a directory.
+    """
+    d = read_pipe(["git", "--git-dir", path, "rev-parse", "--git-dir"], True).strip()
+    if not d or len(d) == 0:
+        return None
+    else:
+        return d
+
 def chdir(path, is_client_path=False):
     """Do chdir to the given path, and set the PWD environment
        variable for use by P4.  It does not look at getcwd() output.
@@ -262,6 +280,10 @@ def p4_revert(f):
 def p4_reopen(type, f):
     p4_system(["reopen", "-t", type, wildcard_encode(f)])
 
+def p4_reopen_in_change(changelist, files):
+    cmd = ["reopen", "-c", str(changelist)] + files
+    p4_system(cmd)
+
 def p4_move(src, dest):
     p4_system(["move", "-k", wildcard_encode(src), wildcard_encode(dest)])
 
@@ -563,10 +585,7 @@ def currentGitBranch():
         return read_pipe(["git", "name-rev", "HEAD"]).split(" ")[1].strip()
 
 def isValidGitDir(path):
-    if (os.path.exists(path + "/HEAD")
-        and os.path.exists(path + "/refs") and os.path.exists(path + "/objects")):
-        return True;
-    return False
+    return git_dir(path) != None
 
 def parseRevision(ref):
     return read_pipe("git rev-parse %s" % ref).strip()
@@ -655,7 +674,7 @@ def gitConfigInt(key):
 def gitConfigList(key):
     if not _gitConfig.has_key(key):
         s = read_pipe(["git", "config", "--get-all", key], ignore_error=True)
-        _gitConfig[key] = s.strip().split(os.linesep)
+        _gitConfig[key] = s.strip().splitlines()
         if _gitConfig[key] == ['']:
             _gitConfig[key] = []
     return _gitConfig[key]
@@ -822,7 +841,7 @@ def p4ChangesForPaths(depotPaths, changeRange, requestedBlockSize):
                 die("cannot use --changes-block-size with non-numeric revisions")
             block_size = None
 
-    changes = []
+    changes = set()
 
     # Retrieve changes a block at a time, to prevent running
     # into a MaxResults/MaxScanRows error from the server.
@@ -841,7 +860,7 @@ def p4ChangesForPaths(depotPaths, changeRange, requestedBlockSize):
 
         # Insert changes in chronological order
         for line in reversed(p4_read_pipe_lines(cmd)):
-            changes.append(int(line.split(" ")[1]))
+            changes.add(int(line.split(" ")[1]))
 
         if not block_size:
             break
@@ -1005,18 +1024,20 @@ def processContent(self, git_mode, relPath, contents):
            steps."""
         if self.exceedsLargeFileThreshold(relPath, contents) or self.hasLargeFileExtension(relPath):
             contentTempFile = self.generateTempFile(contents)
-            (git_mode, contents, localLargeFile) = self.generatePointer(contentTempFile)
-
-            # Move temp file to final location in large file system
-            largeFileDir = os.path.dirname(localLargeFile)
-            if not os.path.isdir(largeFileDir):
-                os.makedirs(largeFileDir)
-            shutil.move(contentTempFile, localLargeFile)
-            self.addLargeFile(relPath)
-            if gitConfigBool('git-p4.largeFilePush'):
-                self.pushFile(localLargeFile)
-            if verbose:
-                sys.stderr.write("%s moved to large file system (%s)\n" % (relPath, localLargeFile))
+            (pointer_git_mode, contents, localLargeFile) = self.generatePointer(contentTempFile)
+            if pointer_git_mode:
+                git_mode = pointer_git_mode
+            if localLargeFile:
+                # Move temp file to final location in large file system
+                largeFileDir = os.path.dirname(localLargeFile)
+                if not os.path.isdir(largeFileDir):
+                    os.makedirs(largeFileDir)
+                shutil.move(contentTempFile, localLargeFile)
+                self.addLargeFile(relPath)
+                if gitConfigBool('git-p4.largeFilePush'):
+                    self.pushFile(localLargeFile)
+                if verbose:
+                    sys.stderr.write("%s moved to large file system (%s)\n" % (relPath, localLargeFile))
         return (git_mode, contents)
 
 class MockLFS(LargeFileSystem):
@@ -1056,6 +1077,9 @@ def generatePointer(self, contentFile):
            the actual content. Return also the new location of the actual
            content.
            """
+        if os.path.getsize(contentFile) == 0:
+            return (None, '', None)
+
         pointerProcess = subprocess.Popen(
             ['git', 'lfs', 'pointer', '--file=' + contentFile],
             stdout=subprocess.PIPE
@@ -1098,10 +1122,10 @@ def generateGitAttributes(self):
                 '# Git LFS (see https://git-lfs.github.com/)\n',
                 '#\n',
             ] +
-            ['*.' + f.replace(' ', '[[:space:]]') + ' filter=lfs -text\n'
+            ['*.' + f.replace(' ', '[[:space:]]') + ' filter=lfs diff=lfs merge=lfs -text\n'
                 for f in sorted(gitConfigList('git-p4.largeFileExtensions'))
             ] +
-            ['/' + f.replace(' ', '[[:space:]]') + ' filter=lfs -text\n'
+            ['/' + f.replace(' ', '[[:space:]]') + ' filter=lfs diff=lfs merge=lfs -text\n'
                 for f in sorted(self.largeFiles) if not self.hasLargeFileExtension(f)
             ]
         )
@@ -1289,6 +1313,12 @@ def __init__(self):
                 optparse.make_option("--conflict", dest="conflict_behavior",
                                      choices=self.conflict_behavior_choices),
                 optparse.make_option("--branch", dest="branch"),
+                optparse.make_option("--shelve", dest="shelve", action="store_true",
+                                     help="Shelve instead of submit. Shelved files are reverted, "
+                                     "restoring the workspace to the state before the shelve"),
+                optparse.make_option("--update-shelve", dest="update_shelve", action="store", type="int",
+                                     metavar="CHANGELIST",
+                                     help="update an existing shelved changelist, implies --shelve")
         ]
         self.description = "Submit changes from git to the perforce depot."
         self.usage += " [name of git branch to submit into perforce depot]"
@@ -1296,6 +1326,8 @@ def __init__(self):
         self.detectRenames = False
         self.preserveUser = gitConfigBool("git-p4.preserveUser")
         self.dry_run = False
+        self.shelve = False
+        self.update_shelve = None
         self.prepare_p4_only = False
         self.conflict_behavior = None
         self.isWindows = (platform.system() == "Windows")
@@ -1464,7 +1496,7 @@ def canChangeChangelists(self):
                     return 1
         return 0
 
-    def prepareSubmitTemplate(self):
+    def prepareSubmitTemplate(self, changelist=None):
         """Run "p4 change -o" to grab a change specification template.
            This does not use "p4 -G", as it is nice to keep the submission
            template in original order, since a human might edit it.
@@ -1476,7 +1508,11 @@ def prepareSubmitTemplate(self):
 
         template = ""
         inFilesSection = False
-        for line in p4_read_pipe_lines(['change', '-o']):
+        args = ['change', '-o']
+        if changelist:
+            args.append(str(changelist))
+
+        for line in p4_read_pipe_lines(args):
             if line.endswith("\r\n"):
                 line = line[:-2] + "\n"
             if inFilesSection:
@@ -1538,7 +1574,7 @@ def edit_template(self, template_file):
             if response == 'n':
                 return False
 
-    def get_diff_description(self, editedFiles, filesToAdd):
+    def get_diff_description(self, editedFiles, filesToAdd, symlinks):
         # diff
         if os.environ.has_key("P4DIFF"):
             del(os.environ["P4DIFF"])
@@ -1553,10 +1589,17 @@ def get_diff_description(self, editedFiles, 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()
+
+            is_link = os.path.islink(newFile)
+            expect_link = newFile in symlinks
+
+            if is_link and expect_link:
+                newdiff += "+%s\n" % os.readlink(newFile)
+            else:
+                f = open(newFile, "r")
+                for line in f.readlines():
+                    newdiff += "+" + line
+                f.close()
 
         return (diff + newdiff).replace('\r\n', '\n')
 
@@ -1574,12 +1617,16 @@ def applyCommit(self, id):
         filesToDelete = set()
         editedFiles = set()
         pureRenameCopy = set()
+        symlinks = set()
         filesToChangeExecBit = {}
+        all_files = list()
 
         for line in diff:
             diff = parseDiffTreeEntry(line)
             modifier = diff['status']
             path = diff['src']
+            all_files.append(path)
+
             if modifier == "M":
                 p4_edit(path)
                 if isModeExecChanged(diff['src_mode'], diff['dst_mode']):
@@ -1590,6 +1637,11 @@ def applyCommit(self, id):
                 filesToChangeExecBit[path] = diff['dst_mode']
                 if path in filesToDelete:
                     filesToDelete.remove(path)
+
+                dst_mode = int(diff['dst_mode'], 8)
+                if dst_mode == 0120000:
+                    symlinks.add(path)
+
             elif modifier == "D":
                 filesToDelete.add(path)
                 if path in filesToAdd:
@@ -1705,6 +1757,10 @@ def applyCommit(self, id):
             mode = filesToChangeExecBit[f]
             setP4ExecBit(f, mode)
 
+        if self.update_shelve:
+            print("all_files = %s" % str(all_files))
+            p4_reopen_in_change(self.update_shelve, all_files)
+
         #
         # Build p4 change description, starting with the contents
         # of the git commit message.
@@ -1713,7 +1769,7 @@ def applyCommit(self, id):
         logMessage = logMessage.strip()
         (logMessage, jobs) = self.separate_jobs_from_description(logMessage)
 
-        template = self.prepareSubmitTemplate()
+        template = self.prepareSubmitTemplate(self.update_shelve)
         submitTemplate = self.prepareLogMessage(template, logMessage, jobs)
 
         if self.preserveUser:
@@ -1727,7 +1783,7 @@ def applyCommit(self, id):
         separatorLine = "######## everything below this line is just the diff #######\n"
         if not self.prepare_p4_only:
             submitTemplate += separatorLine
-            submitTemplate += self.get_diff_description(editedFiles, filesToAdd)
+            submitTemplate += self.get_diff_description(editedFiles, filesToAdd, symlinks)
 
         (handle, fileName) = tempfile.mkstemp()
         tmpFile = os.fdopen(handle, "w+b")
@@ -1785,7 +1841,17 @@ def applyCommit(self, id):
                 if self.isWindows:
                     message = message.replace("\r\n", "\n")
                 submitTemplate = message[:message.index(separatorLine)]
-                p4_write_pipe(['submit', '-i'], submitTemplate)
+
+                if self.update_shelve:
+                    p4_write_pipe(['shelve', '-r', '-i'], submitTemplate)
+                elif self.shelve:
+                    p4_write_pipe(['shelve', '-i'], submitTemplate)
+                else:
+                    p4_write_pipe(['submit', '-i'], submitTemplate)
+                    # The rename/copy happened by applying a patch that created a
+                    # new file.  This leaves it writable, which confuses p4.
+                    for f in pureRenameCopy:
+                        p4_sync(f, "-f")
 
                 if self.preserveUser:
                     if p4User:
@@ -1795,23 +1861,20 @@ def applyCommit(self, id):
                         changelist = self.lastP4Changelist()
                         self.modifyChangelistUser(changelist, p4User)
 
-                # The rename/copy happened by applying a patch that created a
-                # new file.  This leaves it writable, which confuses p4.
-                for f in pureRenameCopy:
-                    p4_sync(f, "-f")
                 submitted = True
 
         finally:
             # skip this patch
-            if not submitted:
-                print "Submission cancelled, undoing p4 changes."
-                for f in editedFiles:
+            if not submitted or self.shelve:
+                if self.shelve:
+                    print ("Reverting shelved files.")
+                else:
+                    print ("Submission cancelled, undoing p4 changes.")
+                for f in editedFiles | filesToDelete:
                     p4_revert(f)
                 for f in filesToAdd:
                     p4_revert(f)
                     os.remove(f)
-                for f in filesToDelete:
-                    p4_revert(f)
 
         os.remove(fileName)
         return submitted
@@ -1907,6 +1970,9 @@ def run(self, args):
         if len(self.origin) == 0:
             self.origin = upstream
 
+        if self.update_shelve:
+            self.shelve = True
+
         if self.preserveUser:
             if not self.canChangeChangelists():
                 die("Cannot preserve user names without p4 super-user or admin permissions")
@@ -2067,13 +2133,13 @@ def run(self, args):
                         break
 
         chdir(self.oldWorkingDirectory)
-
+        shelved_applied = "shelved" if self.shelve else "applied"
         if self.dry_run:
             pass
         elif self.prepare_p4_only:
             pass
         elif len(commits) == len(applied):
-            print "All commits applied!"
+            print ("All commits {0}!".format(shelved_applied))
 
             sync = P4Sync()
             if self.branch:
@@ -2085,9 +2151,9 @@ def run(self, args):
 
         else:
             if len(applied) == 0:
-                print "No commits applied."
+                print ("No commits {0}.".format(shelved_applied))
             else:
-                print "Applied only the commits marked with '*':"
+                print ("{0} only the commits marked with '*':".format(shelved_applied.capitalize()))
                 for c in commits:
                     if c in applied:
                         star = "*"
@@ -3682,6 +3748,7 @@ def main():
         if cmd.gitdir == None:
             cmd.gitdir = os.path.abspath(".git")
             if not isValidGitDir(cmd.gitdir):
+                # "rev-parse --git-dir" without arguments will try $PWD/.git
                 cmd.gitdir = read_pipe("git rev-parse --git-dir").strip()
                 if os.path.exists(cmd.gitdir):
                     cdup = read_pipe("git rev-parse --show-cdup").strip()
@@ -3694,6 +3761,7 @@ def main():
             else:
                 die("fatal: cannot locate git repository at %s" % cmd.gitdir)
 
+        # so git commands invoked from the P4 workspace will succeed
         os.environ["GIT_DIR"] = cmd.gitdir
 
     if not cmd.run(args):
index 41fd374c725de1f42965b829c2bed5c48c92e19c..4734094a3f1aaa7d7c767a0740b46dd6abdd6f7a 100644 (file)
@@ -425,7 +425,7 @@ update_squash_messages () {
        if test -f "$squash_msg"; then
                mv "$squash_msg" "$squash_msg".bak || exit
                count=$(($(sed -n \
-                       -e "1s/^$comment_char.*\([0-9][0-9]*\).*/\1/p" \
+                       -e "1s/^$comment_char[^0-9]*\([0-9][0-9]*\).*/\1/p" \
                        -e "q" < "$squash_msg".bak)+1))
                {
                        printf '%s\n' "$comment_char $(eval_ngettext \
@@ -437,7 +437,8 @@ update_squash_messages () {
                        }' <"$squash_msg".bak
                } >"$squash_msg"
        else
-               commit_message HEAD > "$fixup_msg" || die "$(gettext "Cannot write \$fixup_msg")"
+               commit_message HEAD >"$fixup_msg" ||
+               die "$(eval_gettext "Cannot write \$fixup_msg")"
                count=2
                {
                        printf '%s\n' "$comment_char $(gettext "This is a combination of 2 commits.")"
index 04f6e44bc8c779d7f4c60c19066820533279324a..48d7c5ded40e1801a36a897849e0f32b314e5981 100755 (executable)
@@ -43,6 +43,7 @@ continue!          continue
 abort!             abort and check out the original branch
 skip!              skip current patch and continue
 edit-todo!         edit the todo list during an interactive rebase
+quit!              abort but keep HEAD where it is
 "
 . git-sh-setup
 set_reflog_action rebase
@@ -241,7 +242,7 @@ do
        --verify)
                ok_to_skip_pre_rebase=
                ;;
-       --continue|--skip|--abort|--edit-todo)
+       --continue|--skip|--abort|--quit|--edit-todo)
                test $total_argc -eq 2 || usage
                action=${1##--}
                ;;
@@ -399,6 +400,9 @@ abort)
        finish_rebase
        exit
        ;;
+quit)
+       exec rm -rf "$state_dir"
+       ;;
 edit-todo)
        run_specific_rebase
        ;;
diff --git a/git-relink.perl b/git-relink.perl
deleted file mode 100755 (executable)
index 236a352..0000000
+++ /dev/null
@@ -1,173 +0,0 @@
-#!/usr/bin/perl
-# Copyright 2005, Ryan Anderson <ryan@michonline.com>
-# Distribution permitted under the GPL v2, as distributed
-# by the Free Software Foundation.
-# Later versions of the GPL at the discretion of Linus Torvalds
-#
-# Scan two git object-trees, and hardlink any common objects between them.
-
-use 5.008;
-use strict;
-use warnings;
-use Getopt::Long;
-
-sub get_canonical_form($);
-sub do_scan_directory($$$);
-sub compare_two_files($$);
-sub usage();
-sub link_two_files($$);
-
-# stats
-my $total_linked = 0;
-my $total_already = 0;
-my ($linked,$already);
-
-my $fail_on_different_sizes = 0;
-my $help = 0;
-GetOptions("safe" => \$fail_on_different_sizes,
-          "help" => \$help);
-
-usage() if $help;
-
-my (@dirs) = @ARGV;
-
-usage() if (!defined $dirs[0] || !defined $dirs[1]);
-
-$_ = get_canonical_form($_) foreach (@dirs);
-
-my $master_dir = pop @dirs;
-
-opendir(D,$master_dir . "objects/")
-       or die "Failed to open $master_dir/objects/ : $!";
-
-my @hashdirs = grep { ($_ eq 'pack') || /^[0-9a-f]{2}$/ } readdir(D);
-
-foreach my $repo (@dirs) {
-       $linked = 0;
-       $already = 0;
-       printf("Searching '%s' and '%s' for common objects and hardlinking them...\n",
-               $master_dir,$repo);
-
-       foreach my $hashdir (@hashdirs) {
-               do_scan_directory($master_dir, $hashdir, $repo);
-       }
-
-       printf("Linked %d files, %d were already linked.\n",$linked, $already);
-
-       $total_linked += $linked;
-       $total_already += $already;
-}
-
-printf("Totals: Linked %d files, %d were already linked.\n",
-       $total_linked, $total_already);
-
-
-sub do_scan_directory($$$) {
-       my ($srcdir, $subdir, $dstdir) = @_;
-
-       my $sfulldir = sprintf("%sobjects/%s/",$srcdir,$subdir);
-       my $dfulldir = sprintf("%sobjects/%s/",$dstdir,$subdir);
-
-       opendir(S,$sfulldir)
-               or die "Failed to opendir $sfulldir: $!";
-
-       foreach my $file (grep(!/\.{1,2}$/, readdir(S))) {
-               my $sfilename = $sfulldir . $file;
-               my $dfilename = $dfulldir . $file;
-
-               compare_two_files($sfilename,$dfilename);
-
-       }
-       closedir(S);
-}
-
-sub compare_two_files($$) {
-       my ($sfilename, $dfilename) = @_;
-
-       # Perl's stat returns relevant information as follows:
-       # 0 = dev number
-       # 1 = inode number
-       # 7 = size
-       my @sstatinfo = stat($sfilename);
-       my @dstatinfo = stat($dfilename);
-
-       if (@sstatinfo == 0 && @dstatinfo == 0) {
-               die sprintf("Stat of both %s and %s failed: %s\n",$sfilename, $dfilename, $!);
-
-       } elsif (@dstatinfo == 0) {
-               return;
-       }
-
-       if ( ($sstatinfo[0] == $dstatinfo[0]) &&
-            ($sstatinfo[1] != $dstatinfo[1])) {
-               if ($sstatinfo[7] == $dstatinfo[7]) {
-                       link_two_files($sfilename, $dfilename);
-
-               } else {
-                       my $err = sprintf("ERROR: File sizes are not the same, cannot relink %s to %s.\n",
-                               $sfilename, $dfilename);
-                       if ($fail_on_different_sizes) {
-                               die $err;
-                       } else {
-                               warn $err;
-                       }
-               }
-
-       } elsif ( ($sstatinfo[0] == $dstatinfo[0]) &&
-            ($sstatinfo[1] == $dstatinfo[1])) {
-               $already++;
-       }
-}
-
-sub get_canonical_form($) {
-       my $dir = shift;
-       my $original = $dir;
-
-       die "$dir is not a directory." unless -d $dir;
-
-       $dir .= "/" unless $dir =~ m#/$#;
-       $dir .= ".git/" unless $dir =~ m#\.git/$#;
-
-       die "$original does not have a .git/ subdirectory.\n" unless -d $dir;
-
-       return $dir;
-}
-
-sub link_two_files($$) {
-       my ($sfilename, $dfilename) = @_;
-       my $tmpdname = sprintf("%s.old",$dfilename);
-       rename($dfilename,$tmpdname)
-               or die sprintf("Failure renaming %s to %s: %s",
-                       $dfilename, $tmpdname, $!);
-
-       if (! link($sfilename,$dfilename)) {
-               my $failtxt = "";
-               unless (rename($tmpdname,$dfilename)) {
-                       $failtxt = sprintf(
-                               "Git Repository containing %s is probably corrupted, " .
-                               "please copy '%s' to '%s' to fix.\n",
-                               $tmpdname, $dfilename);
-               }
-
-               die sprintf("Failed to link %s to %s: %s\n%s" .
-                       $sfilename, $dfilename,
-                       $!, $dfilename, $failtxt);
-       }
-
-       unlink($tmpdname)
-               or die sprintf("Unlink of %s failed: %s\n",
-                       $dfilename, $!);
-
-       $linked++;
-}
-
-
-sub usage() {
-       print("usage: git relink [--safe] <dir>... <master_dir> \n");
-       print("All directories should contain a .git/objects/ subdirectory.\n");
-       print("Options\n");
-       print("\t--safe\t" .
-               "Stops if two objects with the same hash exist but " .
-               "have different sizes.  Default is to warn and continue.\n");
-       exit(1);
-}
index d5500fde4658410db477008617730cb5799f310e..eebd33276da9028afa1f2ed3b03e60f037d7e646 100755 (executable)
@@ -4,9 +4,6 @@
 # This file is licensed under the GPL v2, or a later version
 # at the discretion of Linus Torvalds.
 
-USAGE='<start> <url> [<end>]'
-LONG_USAGE='Summarizes the changes between two commits to the standard output,
-and includes the given URL in the generated summary.'
 SUBDIRECTORY_OK='Yes'
 OPTIONS_KEEPDASHDASH=
 OPTIONS_STUCKLONG=
index da81be40cb7f9af1a960be2c22f8e75c9d16822e..068d60b3e698f03f433db33d9e5f085ea57ce0a3 100755 (executable)
@@ -28,6 +28,7 @@
 use File::Spec::Functions qw(catfile);
 use Error qw(:try);
 use Git;
+use Git::I18N;
 
 Getopt::Long::Configure qw/ pass_through /;
 
@@ -117,20 +118,20 @@ sub format_2822_time {
        my $localmin = $localtm[1] + $localtm[2] * 60;
        my $gmtmin = $gmttm[1] + $gmttm[2] * 60;
        if ($localtm[0] != $gmttm[0]) {
-               die "local zone differs from GMT by a non-minute interval\n";
+               die __("local zone differs from GMT by a non-minute interval\n");
        }
        if ((($gmttm[6] + 1) % 7) == $localtm[6]) {
                $localmin += 1440;
        } elsif ((($gmttm[6] - 1) % 7) == $localtm[6]) {
                $localmin -= 1440;
        } elsif ($gmttm[6] != $localtm[6]) {
-               die "local time offset greater than or equal to 24 hours\n";
+               die __("local time offset greater than or equal to 24 hours\n");
        }
        my $offset = $localmin - $gmtmin;
        my $offhour = $offset / 60;
        my $offmin = abs($offset % 60);
        if (abs($offhour) >= 24) {
-               die ("local time offset greater than or equal to 24 hours\n");
+               die __("local time offset greater than or equal to 24 hours\n");
        }
 
        return sprintf("%s, %2d %s %d %02d:%02d:%02d %s%02d%02d",
@@ -198,13 +199,13 @@ sub do_edit {
                map {
                        system('sh', '-c', $editor.' "$@"', $editor, $_);
                        if (($? & 127) || ($? >> 8)) {
-                               die("the editor exited uncleanly, aborting everything");
+                               die(__("the editor exited uncleanly, aborting everything"));
                        }
                } @_;
        } else {
                system('sh', '-c', $editor.' "$@"', $editor, @_);
                if (($? & 127) || ($? >> 8)) {
-                       die("the editor exited uncleanly, aborting everything");
+                       die(__("the editor exited uncleanly, aborting everything"));
                }
        }
 }
@@ -278,10 +279,13 @@ sub signal_handler {
        # tmp files from --compose
        if (defined $compose_filename) {
                if (-e $compose_filename) {
-                       print "'$compose_filename' contains an intermediate version of the email you were composing.\n";
+                       printf __("'%s' contains an intermediate version ".
+                                 "of the email you were composing.\n"),
+                                 $compose_filename;
                }
                if (-e ($compose_filename . ".final")) {
-                       print "'$compose_filename.final' contains the composed email.\n"
+                       printf __("'%s.final' contains the composed email.\n"),
+                                 $compose_filename;
                }
        }
 
@@ -298,7 +302,7 @@ sub signal_handler {
 my $rc = GetOptions("h" => \$help,
                     "dump-aliases" => \$dump_aliases);
 usage() unless $rc;
-die "--dump-aliases incompatible with other options\n"
+die __("--dump-aliases incompatible with other options\n")
     if !$help and $dump_aliases and @ARGV;
 $rc = GetOptions(
                    "sender|from=s" => \$sender,
@@ -361,7 +365,7 @@ sub signal_handler {
     usage();
 }
 
-die "Cannot run git format-patch from outside a repository\n"
+die __("Cannot run git format-patch from outside a repository\n")
        if $format_patch and not $repo;
 
 # Now, let's fill any that aren't set in with defaults:
@@ -430,7 +434,7 @@ sub read_config {
 my(%suppress_cc);
 if (@suppress_cc) {
        foreach my $entry (@suppress_cc) {
-               die "Unknown --suppress-cc field: '$entry'\n"
+               die sprintf(__("Unknown --suppress-cc field: '%s'\n"), $entry)
                        unless $entry =~ /^(?:all|cccmd|cc|author|self|sob|body|bodycc)$/;
                $suppress_cc{$entry} = 1;
        }
@@ -459,7 +463,7 @@ sub read_config {
 if ($confirm_unconfigured) {
        $confirm = scalar %suppress_cc ? 'compose' : 'auto';
 };
-die "Unknown --confirm setting: '$confirm'\n"
+die sprintf(__("Unknown --confirm setting: '%s'\n"), $confirm)
        unless $confirm =~ /^(?:auto|cc|compose|always|never)/;
 
 # Debugging, print out the suppressions.
@@ -491,16 +495,16 @@ sub split_addrs {
 sub parse_sendmail_alias {
        local $_ = shift;
        if (/"/) {
-               print STDERR "warning: sendmail alias with quotes is not supported: $_\n";
+               printf STDERR __("warning: sendmail alias with quotes is not supported: %s\n"), $_;
        } elsif (/:include:/) {
-               print STDERR "warning: `:include:` not supported: $_\n";
+               printf STDERR __("warning: `:include:` not supported: %s\n"), $_;
        } elsif (/[\/|]/) {
-               print STDERR "warning: `/file` or `|pipe` redirection not supported: $_\n";
+               printf STDERR __("warning: `/file` or `|pipe` redirection not supported: %s\n"), $_;
        } elsif (/^(\S+?)\s*:\s*(.+)$/) {
                my ($alias, $addr) = ($1, $2);
                $aliases{$alias} = [ split_addrs($addr) ];
        } else {
-               print STDERR "warning: sendmail line is not recognized: $_\n";
+               printf STDERR __("warning: sendmail line is not recognized: %s\n"), $_;
        }
 }
 
@@ -581,11 +585,11 @@ sub is_format_patch_arg {
                if (defined($format_patch)) {
                        return $format_patch;
                }
-               die(<<EOF);
-File '$f' exists but it could also be the range of commits
+               die sprintf(__ <<EOF, $f, $f);
+File '%s' exists but it could also be the range of commits
 to produce patches for.  Please disambiguate by...
 
-    * Saying "./$f" if you mean a file; or
+    * Saying "./%s" if you mean a file; or
     * Giving --format-patch option if you mean a range.
 EOF
        } catch Git::Error::Command with {
@@ -603,7 +607,7 @@ sub is_format_patch_arg {
                @ARGV = ();
        } elsif (-d $f and !is_format_patch_arg($f)) {
                opendir my $dh, $f
-                       or die "Failed to opendir $f: $!";
+                       or die sprintf(__("Failed to opendir %s: %s"), $f, $!);
 
                push @files, grep { -f $_ } map { catfile($f, $_) }
                                sort readdir $dh;
@@ -616,7 +620,7 @@ sub is_format_patch_arg {
 }
 
 if (@rev_list_opts) {
-       die "Cannot run git format-patch from outside a repository\n"
+       die __("Cannot run git format-patch from outside a repository\n")
                unless $repo;
        push @files, $repo->command('format-patch', '-o', tempdir(CLEANUP => 1), @rev_list_opts);
 }
@@ -627,7 +631,8 @@ sub is_format_patch_arg {
        foreach my $f (@files) {
                unless (-p $f) {
                        my $error = validate_patch($f);
-                       $error and die "fatal: $f: $error\nwarning: no patches were sent\n";
+                       $error and die sprintf(__("fatal: %s: %s\nwarning: no patches were sent\n"),
+                                                 $f, $error);
                }
        }
 }
@@ -637,7 +642,7 @@ sub is_format_patch_arg {
                print $_,"\n" for (@files);
        }
 } else {
-       print STDERR "\nNo patch files specified!\n\n";
+       print STDERR __("\nNo patch files specified!\n\n");
        usage();
 }
 
@@ -650,7 +655,7 @@ sub get_patch_subject {
                return "GIT: $1\n";
        }
        close $fh;
-       die "No subject line in $fn ?";
+       die sprintf(__("No subject line in %s?"), $fn);
 }
 
 if ($compose) {
@@ -660,25 +665,27 @@ sub get_patch_subject {
                tempfile(".gitsendemail.msg.XXXXXX", DIR => $repo->repo_path()) :
                tempfile(".gitsendemail.msg.XXXXXX", DIR => "."))[1];
        open my $c, ">", $compose_filename
-               or die "Failed to open for writing $compose_filename: $!";
+               or die sprintf(__("Failed to open for writing %s: %s"), $compose_filename, $!);
 
 
        my $tpl_sender = $sender || $repoauthor || $repocommitter || '';
        my $tpl_subject = $initial_subject || '';
        my $tpl_reply_to = $initial_reply_to || '';
 
-       print $c <<EOT;
+       print $c <<EOT1, Git::prefix_lines("GIT: ", __ <<EOT2), <<EOT3;
 From $tpl_sender # This line is ignored.
-GIT: Lines beginning in "GIT:" will be removed.
-GIT: Consider including an overall diffstat or table of contents
-GIT: for the patch you are writing.
-GIT:
-GIT: Clear the body content if you don't wish to send a summary.
+EOT1
+Lines beginning in "GIT:" will be removed.
+Consider including an overall diffstat or table of contents
+for the patch you are writing.
+
+Clear the body content if you don't wish to send a summary.
+EOT2
 From: $tpl_sender
 Subject: $tpl_subject
 In-Reply-To: $tpl_reply_to
 
-EOT
+EOT3
        for my $f (@files) {
                print $c get_patch_subject($f);
        }
@@ -691,10 +698,10 @@ sub get_patch_subject {
        }
 
        open my $c2, ">", $compose_filename . ".final"
-               or die "Failed to open $compose_filename.final : " . $!;
+               or die sprintf(__("Failed to open %s.final: %s"), $compose_filename, $!);
 
        open $c, "<", $compose_filename
-               or die "Failed to open $compose_filename : " . $!;
+               or die sprintf(__("Failed to open %s: %s"), $compose_filename, $!);
 
        my $need_8bit_cte = file_has_nonascii($compose_filename);
        my $in_body = 0;
@@ -729,7 +736,7 @@ sub get_patch_subject {
                        $sender = $1;
                        next;
                } elsif (/^(?:To|Cc|Bcc):/i) {
-                       print "To/Cc/Bcc fields are not interpreted yet, they have been ignored\n";
+                       print __("To/Cc/Bcc fields are not interpreted yet, they have been ignored\n");
                        next;
                }
                print $c2 $_;
@@ -738,7 +745,7 @@ sub get_patch_subject {
        close $c2;
 
        if ($summary_empty) {
-               print "Summary email is empty, skipping it\n";
+               print __("Summary email is empty, skipping it\n");
                $compose = -1;
        }
 } elsif ($annotate) {
@@ -768,7 +775,9 @@ sub ask {
                        return $resp;
                }
                if ($confirm_only) {
-                       my $yesno = $term->readline("Are you sure you want to use <$resp> [y/N]? ");
+                       my $yesno = $term->readline(
+                               # TRANSLATORS: please keep [y/N] as is.
+                               sprintf(__("Are you sure you want to use <%s> [y/N]? "), $resp));
                        if (defined $yesno && $yesno =~ /y/i) {
                                return $resp;
                        }
@@ -797,12 +806,12 @@ sub file_declares_8bit_cte {
 }
 
 if (!defined $auto_8bit_encoding && scalar %broken_encoding) {
-       print "The following files are 8bit, but do not declare " .
-               "a Content-Transfer-Encoding.\n";
+       print __("The following files are 8bit, but do not declare " .
+                "a Content-Transfer-Encoding.\n");
        foreach my $f (sort keys %broken_encoding) {
                print "    $f\n";
        }
-       $auto_8bit_encoding = ask("Which 8bit encoding should I declare [UTF-8]? ",
+       $auto_8bit_encoding = ask(__("Which 8bit encoding should I declare [UTF-8]? "),
                                  valid_re => qr/.{4}/, confirm_only => 1,
                                  default => "UTF-8");
 }
@@ -810,9 +819,9 @@ sub file_declares_8bit_cte {
 if (!$force) {
        for my $f (@files) {
                if (get_patch_subject($f) =~ /\Q*** SUBJECT HERE ***\E/) {
-                       die "Refusing to send because the patch\n\t$f\n"
+                       die sprintf(__("Refusing to send because the patch\n\t%s\n"
                                . "has the template subject '*** SUBJECT HERE ***'. "
-                               . "Pass --force if you really want to send.\n";
+                               . "Pass --force if you really want to send.\n"), $f);
                }
        }
 }
@@ -829,7 +838,7 @@ sub file_declares_8bit_cte {
 # But it's a no-op to run sanitize_address on an already sanitized address.
 $sender = sanitize_address($sender);
 
-my $to_whom = "To whom should the emails be sent (if anyone)?";
+my $to_whom = __("To whom should the emails be sent (if anyone)?");
 my $prompting = 0;
 if (!@initial_to && !defined $to_cmd) {
        my $to = ask("$to_whom ",
@@ -847,7 +856,7 @@ sub expand_aliases {
 sub expand_one_alias {
        my $alias = shift;
        if ($EXPANDED_ALIASES{$alias}) {
-               die "fatal: alias '$alias' expands to itself\n";
+               die sprintf(__("fatal: alias '%s' expands to itself\n"), $alias);
        }
        local $EXPANDED_ALIASES{$alias} = 1;
        return $aliases{$alias} ? expand_aliases(@{$aliases{$alias}}) : $alias;
@@ -859,7 +868,7 @@ sub expand_one_alias {
 
 if ($thread && !defined $initial_reply_to && $prompting) {
        $initial_reply_to = ask(
-               "Message-ID to be used as In-Reply-To for the first email (if any)? ",
+               __("Message-ID to be used as In-Reply-To for the first email (if any)? "),
                default => "",
                valid_re => qr/\@.*\./, confirm_only => 1);
 }
@@ -909,7 +918,7 @@ sub extract_valid_address {
 sub extract_valid_address_or_die {
        my $address = shift;
        $address = extract_valid_address($address);
-       die "error: unable to extract a valid address from: $address\n"
+       die sprintf(__("error: unable to extract a valid address from: %s\n"), $address)
                if !$address;
        return $address;
 }
@@ -917,8 +926,11 @@ sub extract_valid_address_or_die {
 sub validate_address {
        my $address = shift;
        while (!extract_valid_address($address)) {
-               print STDERR "error: unable to extract a valid address from: $address\n";
-               $_ = ask("What to do with this address? ([q]uit|[d]rop|[e]dit): ",
+               printf STDERR __("error: unable to extract a valid address from: %s\n"), $address;
+               # TRANSLATORS: Make sure to include [q] [d] [e] in your
+               # translation. The program will only accept English input
+               # at this point.
+               $_ = ask(__("What to do with this address? ([q]uit|[d]rop|[e]dit): "),
                        valid_re => qr/^(?:quit|q|drop|d|edit|e)/i,
                        default => 'q');
                if (/^d/i) {
@@ -1219,7 +1231,7 @@ sub ssl_verify_params {
                return (SSL_verify_mode => SSL_VERIFY_PEER(),
                        SSL_ca_file => $smtp_ssl_cert_path);
        } else {
-               die "CA path \"$smtp_ssl_cert_path\" does not exist";
+               die sprintf(__("CA path \"%s\" does not exist"), $smtp_ssl_cert_path);
        }
 }
 
@@ -1293,20 +1305,26 @@ sub send_message {
                if ($needs_confirm eq "inform") {
                        $confirm_unconfigured = 0; # squelch this message for the rest of this run
                        $ask_default = "y"; # assume yes on EOF since user hasn't explicitly asked for confirmation
-                       print "    The Cc list above has been expanded by additional\n";
-                       print "    addresses found in the patch commit message. By default\n";
-                       print "    send-email prompts before sending whenever this occurs.\n";
-                       print "    This behavior is controlled by the sendemail.confirm\n";
-                       print "    configuration setting.\n";
-                       print "\n";
-                       print "    For additional information, run 'git send-email --help'.\n";
-                       print "    To retain the current behavior, but squelch this message,\n";
-                       print "    run 'git config --global sendemail.confirm auto'.\n\n";
+                       print __ <<EOF ;
+    The Cc list above has been expanded by additional
+    addresses found in the patch commit message. By default
+    send-email prompts before sending whenever this occurs.
+    This behavior is controlled by the sendemail.confirm
+    configuration setting.
+
+    For additional information, run 'git send-email --help'.
+    To retain the current behavior, but squelch this message,
+    run 'git config --global sendemail.confirm auto'.
+
+EOF
                }
-               $_ = ask("Send this email? ([y]es|[n]o|[q]uit|[a]ll): ",
+               # TRANSLATORS: Make sure to include [y] [n] [q] [a] in your
+               # translation. The program will only accept English input
+               # at this point.
+               $_ = ask(__("Send this email? ([y]es|[n]o|[q]uit|[a]ll): "),
                         valid_re => qr/^(?:yes|y|no|n|quit|q|all|a)/i,
                         default => $ask_default);
-               die "Send this email reply required" unless defined $_;
+               die __("Send this email reply required") unless defined $_;
                if (/^n/i) {
                        return 0;
                } elsif (/^q/i) {
@@ -1332,7 +1350,7 @@ sub send_message {
        } else {
 
                if (!defined $smtp_server) {
-                       die "The required SMTP server is not properly defined."
+                       die __("The required SMTP server is not properly defined.")
                }
 
                if ($smtp_encryption eq 'ssl') {
@@ -1376,14 +1394,14 @@ sub send_message {
                                        # supported commands
                                        $smtp->hello($smtp_domain);
                                } else {
-                                       die "Server does not support STARTTLS! ".$smtp->message;
+                                       die sprintf(__("Server does not support STARTTLS! %s"), $smtp->message);
                                }
                        }
                }
 
                if (!$smtp) {
-                       die "Unable to initialize SMTP properly. Check config and use --smtp-debug. ",
-                           "VALUES: server=$smtp_server ",
+                       die __("Unable to initialize SMTP properly. Check config and use --smtp-debug."),
+                           " VALUES: server=$smtp_server ",
                            "encryption=$smtp_encryption ",
                            "hello=$smtp_domain",
                            defined $smtp_server_port ? " port=$smtp_server_port" : "";
@@ -1400,12 +1418,12 @@ sub send_message {
                        $smtp->datasend("$line") or die $smtp->message;
                }
                $smtp->dataend() or die $smtp->message;
-               $smtp->code =~ /250|200/ or die "Failed to send $subject\n".$smtp->message;
+               $smtp->code =~ /250|200/ or die sprintf(__("Failed to send %s\n"), $subject).$smtp->message;
        }
        if ($quiet) {
-               printf (($dry_run ? "Dry-" : "")."Sent %s\n", $subject);
+               printf($dry_run ? __("Dry-Sent %s\n") : __("Sent %s\n"), $subject);
        } else {
-               print (($dry_run ? "Dry-" : "")."OK. Log says:\n");
+               print($dry_run ? __("Dry-OK. Log says:\n") : __("OK. Log says:\n"));
                if (!file_name_is_absolute($smtp_server)) {
                        print "Server: $smtp_server\n";
                        print "MAIL FROM:<$raw_from>\n";
@@ -1417,10 +1435,10 @@ sub send_message {
                }
                print $header, "\n";
                if ($smtp) {
-                       print "Result: ", $smtp->code, ' ',
+                       print __("Result: "), $smtp->code, ' ',
                                ($smtp->message =~ /\n([^\n]+\n)$/s), "\n";
                } else {
-                       print "Result: OK\n";
+                       print __("Result: OK\n");
                }
        }
 
@@ -1433,7 +1451,7 @@ sub send_message {
 $message_num = 0;
 
 foreach my $t (@files) {
-       open my $fh, "<", $t or die "can't open file $t";
+       open my $fh, "<", $t or die sprintf(__("can't open file %s"), $t);
 
        my $author = undef;
        my $sauthor = undef;
@@ -1480,13 +1498,13 @@ sub send_message {
                                $sauthor = sanitize_address($author);
                                next if $suppress_cc{'author'};
                                next if $suppress_cc{'self'} and $sauthor eq $sender;
-                               printf("(mbox) Adding cc: %s from line '%s'\n",
+                               printf(__("(mbox) Adding cc: %s from line '%s'\n"),
                                        $1, $_) unless $quiet;
                                push @cc, $1;
                        }
                        elsif (/^To:\s+(.*)$/i) {
                                foreach my $addr (parse_address_line($1)) {
-                                       printf("(mbox) Adding to: %s from line '%s'\n",
+                                       printf(__("(mbox) Adding to: %s from line '%s'\n"),
                                                $addr, $_) unless $quiet;
                                        push @to, $addr;
                                }
@@ -1500,7 +1518,7 @@ sub send_message {
                                        } else {
                                                next if ($suppress_cc{'cc'});
                                        }
-                                       printf("(mbox) Adding cc: %s from line '%s'\n",
+                                       printf(__("(mbox) Adding cc: %s from line '%s'\n"),
                                                $addr, $_) unless $quiet;
                                        push @cc, $addr;
                                }
@@ -1534,7 +1552,7 @@ sub send_message {
                        # So let's support that, too.
                        $input_format = 'lots';
                        if (@cc == 0 && !$suppress_cc{'cc'}) {
-                               printf("(non-mbox) Adding cc: %s from line '%s'\n",
+                               printf(__("(non-mbox) Adding cc: %s from line '%s'\n"),
                                        $_, $_) unless $quiet;
                                push @cc, $_;
                        } elsif (!defined $subject) {
@@ -1557,7 +1575,7 @@ sub send_message {
                                next if $suppress_cc{'bodycc'} and $what =~ /Cc/i;
                        }
                        push @cc, $c;
-                       printf("(body) Adding cc: %s from line '%s'\n",
+                       printf(__("(body) Adding cc: %s from line '%s'\n"),
                                $c, $_) unless $quiet;
                }
        }
@@ -1655,18 +1673,18 @@ sub recipients_cmd {
 
        my @addresses = ();
        open my $fh, "-|", "$cmd \Q$file\E"
-           or die "($prefix) Could not execute '$cmd'";
+           or die sprintf(__("(%s) Could not execute '%s'"), $prefix, $cmd);
        while (my $address = <$fh>) {
                $address =~ s/^\s*//g;
                $address =~ s/\s*$//g;
                $address = sanitize_address($address);
                next if ($address eq $sender and $suppress_cc{'self'});
                push @addresses, $address;
-               printf("($prefix) Adding %s: %s from: '%s'\n",
-                      $what, $address, $cmd) unless $quiet;
+               printf(__("(%s) Adding %s: %s from: '%s'\n"),
+                      $prefix, $what, $address, $cmd) unless $quiet;
                }
        close $fh
-           or die "($prefix) failed to close pipe to '$cmd'";
+           or die sprintf(__("(%s) failed to close pipe to '%s'"), $prefix, $cmd);
        return @addresses;
 }
 
@@ -1693,7 +1711,7 @@ sub apply_transfer_encoding {
        $message = MIME::Base64::decode($message)
                if ($from eq 'base64');
 
-       die "cannot send message as 7bit"
+       die __("cannot send message as 7bit")
                if ($to eq '7bit' and $message =~ /[^[:ascii:]]/);
        return $message
                if ($to eq '7bit' or $to eq '8bit');
@@ -1701,7 +1719,7 @@ sub apply_transfer_encoding {
                if ($to eq 'quoted-printable');
        return MIME::Base64::encode($message, "\n")
                if ($to eq 'base64');
-       die "invalid transfer encoding";
+       die __("invalid transfer encoding");
 }
 
 sub unique_email_list {
@@ -1720,10 +1738,10 @@ sub unique_email_list {
 sub validate_patch {
        my $fn = shift;
        open(my $fh, '<', $fn)
-               or die "unable to open $fn: $!\n";
+               or die sprintf(__("unable to open %s: %s\n"), $fn, $!);
        while (my $line = <$fh>) {
                if (length($line) > 998) {
-                       return "$.: patch contains a line longer than 998 characters";
+                       return sprintf(__("%s: patch contains a line longer than 998 characters"), $.);
                }
        }
        return;
@@ -1739,10 +1757,11 @@ sub handle_backup {
            (substr($file, 0, $lastlen) eq $last) &&
            ($suffix = substr($file, $lastlen)) !~ /^[a-z0-9]/i) {
                if (defined $known_suffix && $suffix eq $known_suffix) {
-                       print "Skipping $file with backup suffix '$known_suffix'.\n";
+                       printf(__("Skipping %s with backup suffix '%s'.\n"), $file, $known_suffix);
                        $skip = 1;
                } else {
-                       my $answer = ask("Do you really want to send $file? (y|N): ",
+                       # TRANSLATORS: please keep "[y|N]" as is.
+                       my $answer = ask(sprintf(__("Do you really want to send %s? [y|N]: "), $file),
                                         valid_re => qr/^(?:y|n)/i,
                                         default => 'n');
                        $skip = ($answer ne 'y');
@@ -1770,7 +1789,7 @@ sub handle_backup_files {
 sub file_has_nonascii {
        my $fn = shift;
        open(my $fh, '<', $fn)
-               or die "unable to open $fn: $!\n";
+               or die sprintf(__("unable to open %s: %s\n"), $fn, $!);
        while (my $line = <$fh>) {
                return 1 if $line =~ /[^[:ascii:]]/;
        }
@@ -1780,7 +1799,7 @@ sub file_has_nonascii {
 sub body_or_subject_has_nonascii {
        my $fn = shift;
        open(my $fh, '<', $fn)
-               or die "unable to open $fn: $!\n";
+               or die sprintf(__("unable to open %s: %s\n"), $fn, $!);
        while (my $line = <$fh>) {
                last if $line =~ /^$/;
                return 1 if $line =~ /^Subject.*[^[:ascii:]]/;
index 240c7ebcd1449935d359e12b8bae817179f567bf..378928518b2c42ee3adb69b52d3b0eb63fca8ac3 100644 (file)
@@ -196,14 +196,14 @@ require_work_tree_exists () {
        if test "z$(git rev-parse --is-bare-repository)" != zfalse
        then
                program_name=$0
-               die "$(gettext "fatal: \$program_name cannot be used without a working tree.")"
+               die "$(eval_gettext "fatal: \$program_name cannot be used without a working tree.")"
        fi
 }
 
 require_work_tree () {
        test "$(git rev-parse --is-inside-work-tree 2>/dev/null)" = true || {
                program_name=$0
-               die "$(gettext "fatal: \$program_name cannot be used without a working tree.")"
+               die "$(eval_gettext "fatal: \$program_name cannot be used without a working tree.")"
        }
 }
 
index 4546abaaef3dab9e0c4dc719f111682f1cb1dd57..10c284d1aa2273a3dfe5cc39f1d6738830d02462 100755 (executable)
@@ -115,7 +115,7 @@ create_stash () {
                        git read-tree --index-output="$TMPindex" -m $i_tree &&
                        GIT_INDEX_FILE="$TMPindex" &&
                        export GIT_INDEX_FILE &&
-                       git diff --name-only -z HEAD -- >"$TMP-stagenames" &&
+                       git diff-index --name-only -z HEAD -- >"$TMP-stagenames" &&
                        git update-index -z --add --remove --stdin <"$TMP-stagenames" &&
                        git write-tree &&
                        rm -f "$TMPindex"
index a024a135d6663c8a8d5ceb926e3f42df1f577411..136e26a2c8d4ca1e835e2873f3fd994864dc135e 100755 (executable)
@@ -12,7 +12,8 @@ USAGE="[--quiet] add [-b <branch>] [-f|--force] [--name <name>] [--reference <re
    or: $dashless [--quiet] update [--init] [--remote] [-N|--no-fetch] [-f|--force] [--checkout|--merge|--rebase] [--[no-]recommend-shallow] [--reference <repository>] [--recursive] [--] [<path>...]
    or: $dashless [--quiet] summary [--cached|--files] [--summary-limit <n>] [commit] [--] [<path>...]
    or: $dashless [--quiet] foreach [--recursive] <command>
-   or: $dashless [--quiet] sync [--recursive] [--] [<path>...]"
+   or: $dashless [--quiet] sync [--recursive] [--] [<path>...]
+   or: $dashless [--quiet] absorbgitdirs [--] [<path>...]"
 OPTIONS_SPEC=
 SUBDIRECTORY_OK=Yes
 . git-sh-setup
@@ -21,14 +22,10 @@ require_work_tree
 wt_prefix=$(git rev-parse --show-prefix)
 cd_to_toplevel
 
-# Restrict ourselves to a vanilla subset of protocols; the URLs
-# we get are under control of a remote repository, and we do not
-# want them kicking off arbitrary git-remote-* programs.
-#
-# If the user has already specified a set of allowed protocols,
-# we assume they know what they're doing and use that instead.
-: ${GIT_ALLOW_PROTOCOL=file:git:http:https:ssh}
-export GIT_ALLOW_PROTOCOL
+# Tell the rest of git that any URLs we get don't come
+# directly from the user, so it can apply policy as appropriate.
+GIT_PROTOCOL_FROM_USER=0
+export GIT_PROTOCOL_FROM_USER
 
 command=
 branch=
@@ -207,8 +204,14 @@ cmd_add()
                        tstart
                        s|/*$||
                ')
-       git ls-files --error-unmatch "$sm_path" > /dev/null 2>&1 &&
-       die "$(eval_gettext "'\$sm_path' already exists in the index")"
+       if test -z "$force"
+       then
+               git ls-files --error-unmatch "$sm_path" > /dev/null 2>&1 &&
+               die "$(eval_gettext "'\$sm_path' already exists in the index")"
+       else
+               git ls-files -s "$sm_path" | sane_grep -v "^160000" > /dev/null 2>&1 &&
+               die "$(eval_gettext "'\$sm_path' already exists in the index and is not a submodule")"
+       fi
 
        if test -z "$force" && ! git add --dry-run --ignore-missing "$sm_path" > /dev/null 2>&1
        then
@@ -374,7 +377,7 @@ cmd_init()
                shift
        done
 
-       git ${wt_prefix:+-C "$wt_prefix"} submodule--helper init ${GIT_QUIET:+--quiet} ${prefix:+--prefix "$prefix"} "$@"
+       git ${wt_prefix:+-C "$wt_prefix"} ${prefix:+--super-prefix "$prefix"} submodule--helper init ${GIT_QUIET:+--quiet}  "$@"
 }
 
 #
@@ -610,7 +613,10 @@ cmd_update()
                if test $just_cloned -eq 1
                then
                        subsha1=
-                       update_module=checkout
+                       case "$update_module" in
+                       merge | rebase | none)
+                               update_module=checkout ;;
+                       esac
                else
                        subsha1=$(sanitize_submodule_env; cd "$sm_path" &&
                                git rev-parse --verify HEAD) ||
@@ -1131,6 +1137,11 @@ cmd_sync()
        done
 }
 
+cmd_absorbgitdirs()
+{
+       git submodule--helper absorb-git-dirs --prefix "$wt_prefix" "$@"
+}
+
 # This loop parses the command line arguments to find the
 # subcommand name to dispatch.  Parsing of the subcommand specific
 # options are primarily done by the subcommand implementations.
@@ -1140,7 +1151,7 @@ cmd_sync()
 while test $# != 0 && test -z "$command"
 do
        case "$1" in
-       add | foreach | init | deinit | update | status | summary | sync)
+       add | foreach | init | deinit | update | status | summary | sync | absorbgitdirs)
                command=$1
                ;;
        -q|--quiet)
diff --git a/git.c b/git.c
index e68b6ebec655c0d6aee22fd30f9d33fc31f7ab7c..c887272b129968db161a152ce8a91aca4439ca3c 100644 (file)
--- a/git.c
+++ b/git.c
@@ -435,7 +435,7 @@ static struct cmd_struct commands[] = {
        { "fsck-objects", cmd_fsck, RUN_SETUP },
        { "gc", cmd_gc, RUN_SETUP },
        { "get-tar-commit-id", cmd_get_tar_commit_id },
-       { "grep", cmd_grep, RUN_SETUP_GENTLY },
+       { "grep", cmd_grep, RUN_SETUP_GENTLY | SUPPORT_SUPER_PREFIX },
        { "hash-object", cmd_hash_object },
        { "help", cmd_help },
        { "index-pack", cmd_index_pack, RUN_SETUP_GENTLY },
@@ -472,7 +472,7 @@ static struct cmd_struct commands[] = {
        { "prune-packed", cmd_prune_packed, RUN_SETUP },
        { "pull", cmd_pull, RUN_SETUP | NEED_WORK_TREE },
        { "push", cmd_push, RUN_SETUP },
-       { "read-tree", cmd_read_tree, RUN_SETUP },
+       { "read-tree", cmd_read_tree, RUN_SETUP | SUPPORT_SUPER_PREFIX},
        { "receive-pack", cmd_receive_pack },
        { "reflog", cmd_reflog, RUN_SETUP },
        { "remote", cmd_remote, RUN_SETUP },
@@ -494,7 +494,7 @@ static struct cmd_struct commands[] = {
        { "stage", cmd_add, RUN_SETUP | NEED_WORK_TREE },
        { "status", cmd_status, RUN_SETUP | NEED_WORK_TREE },
        { "stripspace", cmd_stripspace },
-       { "submodule--helper", cmd_submodule__helper, RUN_SETUP },
+       { "submodule--helper", cmd_submodule__helper, RUN_SETUP | SUPPORT_SUPER_PREFIX},
        { "symbolic-ref", cmd_symbolic_ref, RUN_SETUP },
        { "tag", cmd_tag, RUN_SETUP },
        { "unpack-file", cmd_unpack_file, RUN_SETUP },
@@ -576,8 +576,7 @@ static void handle_builtin(int argc, const char **argv)
 
 static void execv_dashed_external(const char **argv)
 {
-       struct strbuf cmd = STRBUF_INIT;
-       const char *tmp;
+       struct child_process cmd = CHILD_PROCESS_INIT;
        int status;
 
        if (get_super_prefix())
@@ -587,30 +586,25 @@ static void execv_dashed_external(const char **argv)
                use_pager = check_pager_config(argv[0]);
        commit_pager_choice();
 
-       strbuf_addf(&cmd, "git-%s", argv[0]);
+       argv_array_pushf(&cmd.args, "git-%s", argv[0]);
+       argv_array_pushv(&cmd.args, argv + 1);
+       cmd.clean_on_exit = 1;
+       cmd.wait_after_clean = 1;
+       cmd.silent_exec_failure = 1;
 
-       /*
-        * argv[0] must be the git command, but the argv array
-        * belongs to the caller, and may be reused in
-        * subsequent loop iterations. Save argv[0] and
-        * restore it on error.
-        */
-       tmp = argv[0];
-       argv[0] = cmd.buf;
-
-       trace_argv_printf(argv, "trace: exec:");
+       trace_argv_printf(cmd.args.argv, "trace: exec:");
 
        /*
-        * if we fail because the command is not found, it is
-        * OK to return. Otherwise, we just pass along the status code.
+        * If we fail because the command is not found, it is
+        * OK to return. Otherwise, we just pass along the status code,
+        * or our usual generic code if we were not even able to exec
+        * the program.
         */
-       status = run_command_v_opt(argv, RUN_SILENT_EXEC_FAILURE | RUN_CLEAN_ON_EXIT);
-       if (status >= 0 || errno != ENOENT)
+       status = run_command(&cmd);
+       if (status >= 0)
                exit(status);
-
-       argv[0] = tmp;
-
-       strbuf_release(&cmd);
+       else if (errno != ENOENT)
+               exit(128);
 }
 
 static int run_argv(int *argcp, const char ***argv)
@@ -655,6 +649,11 @@ int cmd_main(int argc, const char **argv)
        cmd = argv[0];
        if (!cmd)
                cmd = "git-help";
+       else {
+               const char *slash = find_last_dir_sep(cmd);
+               if (slash)
+                       cmd = slash + 1;
+       }
 
        trace_command_performance(argv);
 
index 5acdc900abdfb3ccc1ad7616fecb098ce6f060e2..5bdd52a6ebfa722fe077ec6a3160f9bbd8ff6a2b 100644 (file)
@@ -50,6 +50,7 @@ endif
 all:: gitk-wish $(ALL_MSGFILES)
 
 install:: all
+       $(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(bindir_SQ)'
        $(INSTALL) -m 755 gitk-wish '$(DESTDIR_SQ)$(bindir_SQ)'/gitk
        $(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(msgsdir_SQ)'
        $(foreach p,$(ALL_MSGFILES), $(INSTALL) -m 644 $p '$(DESTDIR_SQ)$(msgsdir_SQ)' &&) true
index 805a1c703040d4b08fc0d6992c92e2a044c5ddc5..a14d7a16b2dd1162fa8572d776f4adee8a0ce91f 100755 (executable)
@@ -2,7 +2,7 @@
 # Tcl ignores the next line -*- tcl -*- \
 exec wish "$0" -- "$@"
 
-# Copyright © 2005-2014 Paul Mackerras.  All rights reserved.
+# Copyright © 2005-2016 Paul Mackerras.  All rights reserved.
 # This program is free software; it may be used, copied, modified
 # and distributed under the terms of the GNU General Public Licence,
 # either version 2, or (at your option) any later version.
@@ -588,7 +588,7 @@ proc updatecommits {} {
 proc reloadcommits {} {
     global curview viewcomplete selectedline currentid thickerline
     global showneartags treediffs commitinterest cached_commitrow
-    global targetid
+    global targetid commitinfo
 
     set selid {}
     if {$selectedline ne {}} {
@@ -609,6 +609,7 @@ proc reloadcommits {} {
        getallcommits
     }
     clear_display
+    unset -nocomplain commitinfo
     unset -nocomplain commitinterest
     unset -nocomplain cached_commitrow
     unset -nocomplain targetid
@@ -1315,7 +1316,7 @@ proc commitonrow {row} {
 
 proc closevarcs {v} {
     global varctok varccommits varcid parents children
-    global cmitlisted commitidx vtokmod
+    global cmitlisted commitidx vtokmod curview numcommits
 
     set missing_parents 0
     set scripts {}
@@ -1340,6 +1341,9 @@ proc closevarcs {v} {
            }
            lappend varccommits($v,$b) $p
            incr commitidx($v)
+           if {$v == $curview} {
+               set numcommits $commitidx($v)
+           }
            set scripts [check_interest $p $scripts]
        }
     }
@@ -2265,7 +2269,7 @@ proc makewindow {} {
        set h [expr {[font metrics uifont -linespace] + 2}]
        set progresscanv .tf.bar.progress
        canvas $progresscanv -relief sunken -height $h -borderwidth 2
-       set progressitem [$progresscanv create rect -1 0 0 $h -fill lime]
+       set progressitem [$progresscanv create rect -1 0 0 $h -fill "#00ff00"]
        set fprogitem [$progresscanv create rect -1 0 0 $h -fill yellow]
        set rprogitem [$progresscanv create rect -1 0 0 $h -fill red]
     }
@@ -2403,7 +2407,7 @@ proc makewindow {} {
 
     set ctext .bleft.bottom.ctext
     text $ctext -background $bgcolor -foreground $fgcolor \
-       -state disabled -font textfont \
+       -state disabled -undo 0 -font textfont \
        -yscrollcommand scrolltext -wrap none \
        -xscrollcommand ".bleft.bottom.sbhorizontal set"
     if {$have_tk85} {
@@ -2664,6 +2668,7 @@ proc makewindow {} {
     set headctxmenu .headctxmenu
     makemenu $headctxmenu {
        {mc "Check out this branch" command cobranch}
+       {mc "Rename this branch" command mvbranch}
        {mc "Remove this branch" command rmbranch}
        {mc "Copy branch name" command {clipboard clear; clipboard append $headmenuhead}}
     }
@@ -3033,7 +3038,7 @@ proc about {} {
     message $w.m -text [mc "
 Gitk - a commit viewer for git
 
-Copyright \u00a9 2005-2014 Paul Mackerras
+Copyright \u00a9 2005-2016 Paul Mackerras
 
 Use and redistribute under the terms of the GNU General Public License"] \
            -justify center -aspect 400 -border 2 -bg $bgcolor -relief groove
@@ -3397,7 +3402,7 @@ set rectmask {
        0x00, 0x00, 0xfc, 0x0f, 0xfc, 0x0f, 0xfc, 0x0f,
        0xfc, 0x0f, 0xfc, 0x0f, 0xfc, 0x0f, 0xfc, 0x0f, 0x00, 0x00};
 }
-image create bitmap reficon-H -background black -foreground lime \
+image create bitmap reficon-H -background black -foreground "#00ff00" \
     -data $rectdata -maskdata $rectmask
 image create bitmap reficon-o -background black -foreground "#ddddff" \
     -data $rectdata -maskdata $rectmask
@@ -8069,7 +8074,11 @@ proc getblobdiffline {bdf ids} {
     $ctext conf -state normal
     while {[incr nr] <= 1000 && [gets $bdf line] >= 0} {
        if {$ids != $diffids || $bdf != $blobdifffd($ids)} {
+           # Older diff read. Abort it.
            catch {close $bdf}
+           if {$ids != $diffids} {
+               array unset blobdifffd $ids
+           }
            return 0
        }
        parseblobdiffline $ids $line
@@ -8078,6 +8087,7 @@ proc getblobdiffline {bdf ids} {
     blobdiffmaybeseehere [eof $bdf]
     if {[eof $bdf]} {
        catch {close $bdf}
+       array unset blobdifffd $ids
        return 0
     }
     return [expr {$nr >= 1000? 2: 1}]
@@ -9452,26 +9462,63 @@ proc wrcomcan {} {
 }
 
 proc mkbranch {} {
-    global rowmenuid mkbrtop NS
+    global NS rowmenuid
+
+    set top .branchdialog
+
+    set val(name) ""
+    set val(id) $rowmenuid
+    set val(command) [list mkbrgo $top]
+
+    set ui(title) [mc "Create branch"]
+    set ui(accept) [mc "Create"]
+
+    branchdia $top val ui
+}
+
+proc mvbranch {} {
+    global NS
+    global headmenuid headmenuhead
+
+    set top .branchdialog
+
+    set val(name) $headmenuhead
+    set val(id) $headmenuid
+    set val(command) [list mvbrgo $top $headmenuhead]
+
+    set ui(title) [mc "Rename branch %s" $headmenuhead]
+    set ui(accept) [mc "Rename"]
+
+    branchdia $top val ui
+}
+
+proc branchdia {top valvar uivar} {
+    global NS commitinfo
+    upvar $valvar val $uivar ui
 
-    set top .makebranch
     catch {destroy $top}
     ttk_toplevel $top
     make_transient $top .
-    ${NS}::label $top.title -text [mc "Create new branch"]
+    ${NS}::label $top.title -text $ui(title)
     grid $top.title - -pady 10
     ${NS}::label $top.id -text [mc "ID:"]
     ${NS}::entry $top.sha1 -width 40
-    $top.sha1 insert 0 $rowmenuid
+    $top.sha1 insert 0 $val(id)
     $top.sha1 conf -state readonly
     grid $top.id $top.sha1 -sticky w
+    ${NS}::entry $top.head -width 60
+    $top.head insert 0 [lindex $commitinfo($val(id)) 0]
+    $top.head conf -state readonly
+    grid x $top.head -sticky ew
+    grid columnconfigure $top 1 -weight 1
     ${NS}::label $top.nlab -text [mc "Name:"]
     ${NS}::entry $top.name -width 40
+    $top.name insert 0 $val(name)
     grid $top.nlab $top.name -sticky w
     ${NS}::frame $top.buts
-    ${NS}::button $top.buts.go -text [mc "Create"] -command [list mkbrgo $top]
+    ${NS}::button $top.buts.go -text $ui(accept) -command $val(command)
     ${NS}::button $top.buts.can -text [mc "Cancel"] -command "catch {destroy $top}"
-    bind $top <Key-Return> [list mkbrgo $top]
+    bind $top <Key-Return> $val(command)
     bind $top <Key-Escape> "catch {destroy $top}"
     grid $top.buts.go $top.buts.can
     grid columnconfigure $top.buts 0 -weight 1 -uniform a
@@ -9526,6 +9573,46 @@ proc mkbrgo {top} {
     }
 }
 
+proc mvbrgo {top prevname} {
+    global headids idheads mainhead mainheadid
+
+    set name [$top.name get]
+    set id [$top.sha1 get]
+    set cmdargs {}
+    if {$name eq $prevname} {
+       catch {destroy $top}
+       return
+    }
+    if {$name eq {}} {
+       error_popup [mc "Please specify a new name for the branch"] $top
+       return
+    }
+    catch {destroy $top}
+    lappend cmdargs -m $prevname $name
+    nowbusy renamebranch
+    update
+    if {[catch {
+       eval exec git branch $cmdargs
+    } err]} {
+       notbusy renamebranch
+       error_popup $err
+    } else {
+       notbusy renamebranch
+       removehead $id $prevname
+       removedhead $id $prevname
+       set headids($name) $id
+       lappend idheads($id) $name
+       addedhead $id $name
+       if {$prevname eq $mainhead} {
+           set mainhead $name
+           set mainheadid $id
+       }
+       redrawtags $id
+       dispneartags 0
+       run refill_reflist
+    }
+}
+
 proc exec_citool {tool_args {baseid {}}} {
     global commitinfo env
 
@@ -9751,20 +9838,25 @@ proc readresetstat {fd} {
 
 # context menu for a head
 proc headmenu {x y id head} {
-    global headmenuid headmenuhead headctxmenu mainhead
+    global headmenuid headmenuhead headctxmenu mainhead headids
 
     stopfinding
     set headmenuid $id
     set headmenuhead $head
-    set state normal
+    array set state {0 normal 1 normal 2 normal}
     if {[string match "remotes/*" $head]} {
-       set state disabled
+       set localhead [string range $head [expr [string last / $head] + 1] end]
+       if {[info exists headids($localhead)]} {
+           set state(0) disabled
+       }
+       array set state {1 disabled 2 disabled}
     }
     if {$head eq $mainhead} {
-       set state disabled
+       array set state {0 disabled 2 disabled}
+    }
+    foreach i {0 1 2} {
+       $headctxmenu entryconfigure $i -state $state($i)
     }
-    $headctxmenu entryconfigure 0 -state $state
-    $headctxmenu entryconfigure 1 -state $state
     tk_popup $headctxmenu $x $y
 }
 
@@ -9773,11 +9865,27 @@ proc cobranch {} {
     global showlocalchanges
 
     # check the tree is clean first??
+    set newhead $headmenuhead
+    set command [list | git checkout]
+    if {[string match "remotes/*" $newhead]} {
+       set remote $newhead
+       set newhead [string range $newhead [expr [string last / $newhead] + 1] end]
+       # The following check is redundant - the menu option should
+       # be disabled to begin with...
+       if {[info exists headids($newhead)]} {
+           error_popup [mc "A local branch named %s exists already" $newhead]
+           return
+       }
+       lappend command -b $newhead --track $remote
+    } else {
+       lappend command $newhead
+    }
+    lappend command 2>@1
     nowbusy checkout [mc "Checking out"]
     update
     dohidelocalchanges
     if {[catch {
-       set fd [open [list | git checkout $headmenuhead 2>@1] r]
+       set fd [open $command r]
     } err]} {
        notbusy checkout
        error_popup $err
@@ -9785,12 +9893,12 @@ proc cobranch {} {
            dodiffindex
        }
     } else {
-       filerun $fd [list readcheckoutstat $fd $headmenuhead $headmenuid]
+       filerun $fd [list readcheckoutstat $fd $newhead $headmenuid]
     }
 }
 
 proc readcheckoutstat {fd newhead newheadid} {
-    global mainhead mainheadid headids showlocalchanges progresscoords
+    global mainhead mainheadid headids idheads showlocalchanges progresscoords
     global viewmainheadid curview
 
     if {[gets $fd line] >= 0} {
@@ -9805,8 +9913,14 @@ proc readcheckoutstat {fd newhead newheadid} {
     notbusy checkout
     if {[catch {close $fd} err]} {
        error_popup $err
+       return
     }
     set oldmainid $mainheadid
+    if {! [info exists headids($newhead)]} {
+       set headids($newhead) $newheadid
+       lappend idheads($newheadid) $newhead
+       addedhead $newheadid $newhead
+    }
     set mainhead $newhead
     set mainheadid $newheadid
     set viewmainheadid($curview) $newheadid
@@ -12188,7 +12302,7 @@ if {[tk windowingsystem] eq "aqua"} {
     set extdifftool "meld"
 }
 
-set colors {lime red blue magenta darkgrey brown orange}
+set colors {"#00ff00" red blue magenta darkgrey brown orange}
 if {[tk windowingsystem] eq "win32"} {
     set uicolor SystemButtonFace
     set uifgcolor SystemButtonText
@@ -12206,12 +12320,12 @@ if {[tk windowingsystem] eq "win32"} {
 }
 set diffcolors {red "#00a000" blue}
 set diffcontext 3
-set mergecolors {red blue lime purple brown "#009090" magenta "#808000" "#009000" "#ff0080" cyan "#b07070" "#70b0f0" "#70f0b0" "#f0b070" "#ff70b0"}
+set mergecolors {red blue "#00ff00" purple brown "#009090" magenta "#808000" "#009000" "#ff0080" cyan "#b07070" "#70b0f0" "#70f0b0" "#f0b070" "#ff70b0"}
 set ignorespace 0
 set worddiff ""
 set markbgcolor "#e0e0ff"
 
-set headbgcolor lime
+set headbgcolor "#00ff00"
 set headfgcolor black
 set headoutlinecolor black
 set remotebgcolor #ffddaa
@@ -12226,7 +12340,7 @@ set linehoverfgcolor black
 set linehoveroutlinecolor black
 set mainheadcirclecolor yellow
 set workingfilescirclecolor red
-set indexcirclecolor lime
+set indexcirclecolor "#00ff00"
 set circlecolors {white blue gray blue blue}
 set linkfgcolor blue
 set circleoutlinecolor $fgcolor
index 99aa77aa63bd24af12a2ccee120b2a1db7307781..407d5550b1aba947549ad509a641134c34f28d46 100644 (file)
@@ -371,14 +371,14 @@ msgid ""
 "\n"
 "Gitk - a commit viewer for git\n"
 "\n"
-"Copyright © 2005-2014 Paul Mackerras\n"
+"Copyright © 2005-2016 Paul Mackerras\n"
 "\n"
 "Use and redistribute under the terms of the GNU General Public License"
 msgstr ""
 "\n"
 "Gitk — визуализация на подаванията в Git\n"
 "\n"
-"Авторски права: © 2005-2014 Paul Mackerras\n"
+"Авторски права: © 2005-2016 Paul Mackerras\n"
 "\n"
 "Използвайте и разпространявайте при условията на ОПЛ на ГНУ"
 
index 5ad066f7ce84c4be7801a467498ee3de3abccbf9..87dfc18b4406b202221b7e09894f0372988e728d 100644 (file)
@@ -1,5 +1,5 @@
 # Translation of gitk
-# Copyright (C) 2005-2014 Paul Mackerras
+# Copyright (C) 2005-2016 Paul Mackerras
 # This file is distributed under the same license as the gitk package.
 # Alex Henrie <alexhenrie24@gmail.com>, 2015.
 #
@@ -365,14 +365,14 @@ msgid ""
 "\n"
 "Gitk - a commit viewer for git\n"
 "\n"
-"Copyright © 2005-2014 Paul Mackerras\n"
+"Copyright © 2005-2016 Paul Mackerras\n"
 "\n"
 "Use and redistribute under the terms of the GNU General Public License"
 msgstr ""
 "\n"
 "Gitk - visualitzador de comissions per al git\n"
 "\n"
-"Copyright © 2005-2014 Paul Mackerras\n"
+"Copyright © 2005-2016 Paul Mackerras\n"
 "\n"
 "Useu-lo i redistribuïu-lo sota els termes de la Llicència Pública General GNU"
 
index bde749ed8ac7391746e06a00742c44905f7e686e..5db38248289baa42f1732a6f72566652d5819289 100644 (file)
@@ -363,14 +363,14 @@ msgid ""
 "\n"
 "Gitk - a commit viewer for git\n"
 "\n"
-"Copyright © 2005-2014 Paul Mackerras\n"
+"Copyright © 2005-2016 Paul Mackerras\n"
 "\n"
 "Use and redistribute under the terms of the GNU General Public License"
 msgstr ""
 "\n"
 "Gitk - eine Visualisierung der Git-Historie\n"
 "\n"
-"Copyright \\u00a9 2005-2014 Paul Mackerras\n"
+"Copyright \\u00a9 2005-2016 Paul Mackerras\n"
 "\n"
 "Benutzung und Weiterverbreitung gemäß den Bedingungen der GNU General Public "
 "License"
index ddcb0a5f68dc27127d72f2a42f6d77d2bbf7c23f..fef3bbafeead3e6f25300efa219ad1304596cf78 100644 (file)
@@ -370,14 +370,14 @@ msgid ""
 "\n"
 "Gitk - a commit viewer for git\n"
 "\n"
-"Copyright © 2005-2014 Paul Mackerras\n"
+"Copyright © 2005-2016 Paul Mackerras\n"
 "\n"
 "Use and redistribute under the terms of the GNU General Public License"
 msgstr ""
 "\n"
 "Gitk - un visualizador de revisiones para git\n"
 "\n"
-"Copyright \\u00a9 2005-2010 Paul Mackerras\n"
+"Copyright \\u00a9 2005-2016 Paul Mackerras\n"
 "\n"
 "Uso y redistribución permitidos según los términos de la Licencia Pública "
 "General de GNU (GNU GPL)"
index c44f994fa5807036043e2ebe197e832c9d2e3e1f..e4fac932e5b0f6267076943c8244196e31bbd678 100644 (file)
@@ -372,14 +372,14 @@ msgid ""
 "\n"
 "Gitk - a commit viewer for git\n"
 "\n"
-"Copyright © 2005-2014 Paul Mackerras\n"
+"Copyright © 2005-2016 Paul Mackerras\n"
 "\n"
 "Use and redistribute under the terms of the GNU General Public License"
 msgstr ""
 "\n"
 "Gitk - visualisateur de commit pour git\n"
 "\n"
-"Copyright \\u00a9 2005-2014 Paul Mackerras\n"
+"Copyright \\u00a9 2005-2016 Paul Mackerras\n"
 "\n"
 "Utilisation et redistribution soumises aux termes de la GNU General Public License"
 
index 66fd75ba5b1634f13f067e4aab3cc1d921ca804b..79ec5a565674b0bc3fcec50588bb845afbde07a3 100644 (file)
@@ -366,14 +366,14 @@ msgid ""
 "\n"
 "Gitk - a commit viewer for git\n"
 "\n"
-"Copyright © 2005-2014 Paul Mackerras\n"
+"Copyright © 2005-2016 Paul Mackerras\n"
 "\n"
 "Use and redistribute under the terms of the GNU General Public License"
 msgstr ""
 "\n"
 "Gitk - commit nézegető a githez\n"
 "\n"
-"Szerzői jog \\u00a9 2005-2010 Paul Mackerras\n"
+"Szerzői jog \\u00a9 2005-2016 Paul Mackerras\n"
 "\n"
 "Használd és terjeszd a GNU General Public License feltételei mellett"
 
index b5f002db7d52d3106d3a52dbb03047ad67233b62..b58d23eb2b9253808282e31d44125e98098584e0 100644 (file)
@@ -367,14 +367,14 @@ msgid ""
 "\n"
 "Gitk - a commit viewer for git\n"
 "\n"
-"Copyright © 2005-2014 Paul Mackerras\n"
+"Copyright © 2005-2016 Paul Mackerras\n"
 "\n"
 "Use and redistribute under the terms of the GNU General Public License"
 msgstr ""
 "\n"
 "Gitk - un visualizzatore di revisioni per git\n"
 "\n"
-"Copyright \\u00a9 2005-2010 Paul Mackerras\n"
+"Copyright \\u00a9 2005-2016 Paul Mackerras\n"
 "\n"
 "Utilizzo e redistribuzione permessi sotto i termini della GNU General Public "
 "License"
index f143753db0b27cf0dfd1ef28ba89372c921feb7b..ca3c29b457bd375ff5f42bdc321d809f4cd301dc 100644 (file)
@@ -2,16 +2,17 @@
 # Copyright (C) 2005-2015 Paul Mackerras
 # This file is distributed under the same license as the gitk package.
 #
-# YOKOTA Hiroshi <yokota@netlab.cs.tsukuba.ac.jp>, 2015.
 # Mizar <mizar.jp@gmail.com>, 2009.
 # Junio C Hamano <gitster@pobox.com>, 2009.
+# YOKOTA Hiroshi <yokota@netlab.cs.tsukuba.ac.jp>, 2015.
+# Satoshi Yasushima <s.yasushima@gmail.com>, 2016.
 msgid ""
 msgstr ""
 "Project-Id-Version: gitk\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2015-05-17 14:32+1000\n"
 "PO-Revision-Date: 2015-11-12 13:00+0900\n"
-"Last-Translator: YOKOTA Hiroshi <yokota@netlab.cs.tsukuba.ac.jp>\n"
+"Last-Translator: Satoshi Yasushima <s.yasushima@gmail.com>\n"
 "Language-Team: Japanese\n"
 "Language: ja\n"
 "MIME-Version: 1.0\n"
@@ -314,11 +315,11 @@ msgstr "マークを付けたコミットと比較する"
 
 #: gitk:2630 gitk:2641
 msgid "Diff this -> marked commit"
-msgstr "これと選択したコミットのdiffを見る"
+msgstr "これとマークを付けたコミットのdiffを見る"
 
 #: gitk:2631 gitk:2642
 msgid "Diff marked commit -> this"
-msgstr "選択したコミットとこれのdiffを見る"
+msgstr "マークを付けたコミットとこれのdiffを見る"
 
 #: gitk:2632
 msgid "Revert this commit"
@@ -373,14 +374,14 @@ msgid ""
 "\n"
 "Gitk - a commit viewer for git\n"
 "\n"
-"Copyright © 2005-2014 Paul Mackerras\n"
+"Copyright © 2005-2016 Paul Mackerras\n"
 "\n"
 "Use and redistribute under the terms of the GNU General Public License"
 msgstr ""
 "\n"
 "Gitk - gitコミットビューア\n"
 "\n"
-"Copyright © 2005-2014 Paul Mackerras\n"
+"Copyright © 2005-2016 Paul Mackerras\n"
 "\n"
 "使用および再配布は GNU General Public License に従ってください"
 
index 3f78f1b7482614098e295f3f1ffb6c0925ae6383..1feb34854b32ccd03c0eaf15adbd488d3573aef4 100644 (file)
@@ -368,14 +368,14 @@ msgid ""
 "\n"
 "Gitk - a commit viewer for git\n"
 "\n"
-"Copyright © 2005-2014 Paul Mackerras\n"
+"Copyright © 2005-2016 Paul Mackerras\n"
 "\n"
 "Use and redistribute under the terms of the GNU General Public License"
 msgstr ""
 "\n"
 "Gitk - um visualizador de revisões para o git \n"
 "\n"
-"Copyright ©9 2005-2010 Paul Mackerras\n"
+"Copyright ©9 2005-2016 Paul Mackerras\n"
 "\n"
 "Uso e distribuição segundo os termos da Licença Pública Geral GNU"
 
diff --git a/gitk-git/po/pt_pt.po b/gitk-git/po/pt_pt.po
new file mode 100644 (file)
index 0000000..f680ea8
--- /dev/null
@@ -0,0 +1,1376 @@
+# Portuguese translations for gitk package.
+# Copyright (C) 2016 Paul Mackerras
+# This file is distributed under the same license as the gitk package.
+# Vasco Almeida <vascomalmeida@sapo.pt>, 2016.
+msgid ""
+msgstr ""
+"Project-Id-Version: gitk\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2016-04-15 16:52+0000\n"
+"PO-Revision-Date: 2016-05-06 15:35+0000\n"
+"Last-Translator: Vasco Almeida <vascomalmeida@sapo.pt>\n"
+"Language-Team: Portuguese\n"
+"Language: pt\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Virtaal 0.7.1\n"
+
+#: gitk:140
+msgid "Couldn't get list of unmerged files:"
+msgstr "Não foi possível obter lista de ficheiros não integrados:"
+
+#: gitk:212 gitk:2399
+msgid "Color words"
+msgstr "Colorir palavras"
+
+#: gitk:217 gitk:2399 gitk:8239 gitk:8272
+msgid "Markup words"
+msgstr "Marcar palavras"
+
+#: gitk:324
+msgid "Error parsing revisions:"
+msgstr "Erro ao analisar revisões:"
+
+#: gitk:380
+msgid "Error executing --argscmd command:"
+msgstr "Erro ao executar o comando de --argscmd:"
+
+#: gitk:393
+msgid "No files selected: --merge specified but no files are unmerged."
+msgstr ""
+"Nenhum ficheiro selecionado: --merge especificado mas não há ficheiros por "
+"integrar."
+
+#: gitk:396
+msgid ""
+"No files selected: --merge specified but no unmerged files are within file "
+"limit."
+msgstr ""
+"Nenhum ficheiro selecionado: --merge especificado mas não há ficheiros por "
+"integrar ao nível de ficheiro."
+
+#: gitk:418 gitk:566
+msgid "Error executing git log:"
+msgstr "Erro ao executar git log:"
+
+#: gitk:436 gitk:582
+msgid "Reading"
+msgstr "A ler"
+
+#: gitk:496 gitk:4544
+msgid "Reading commits..."
+msgstr "A ler commits..."
+
+#: gitk:499 gitk:1637 gitk:4547
+msgid "No commits selected"
+msgstr "Nenhum commit selecionado"
+
+#: gitk:1445 gitk:4064 gitk:12469
+msgid "Command line"
+msgstr "Linha de comandos"
+
+#: gitk:1511
+msgid "Can't parse git log output:"
+msgstr "Não é possível analisar a saída de git log:"
+
+#: gitk:1740
+msgid "No commit information available"
+msgstr "Não há informação disponível sobre o commit"
+
+#: gitk:1903 gitk:1932 gitk:4334 gitk:9702 gitk:11274 gitk:11554
+msgid "OK"
+msgstr "OK"
+
+#: gitk:1934 gitk:4336 gitk:9215 gitk:9294 gitk:9424 gitk:9473 gitk:9704
+#: gitk:11275 gitk:11555
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: gitk:2083
+msgid "&Update"
+msgstr "At&ualizar"
+
+#: gitk:2084
+msgid "&Reload"
+msgstr "&Recarregar"
+
+#: gitk:2085
+msgid "Reread re&ferences"
+msgstr "Reler re&ferências"
+
+#: gitk:2086
+msgid "&List references"
+msgstr "&Listar referências"
+
+#: gitk:2088
+msgid "Start git &gui"
+msgstr "Iniciar git &gui"
+
+#: gitk:2090
+msgid "&Quit"
+msgstr "&Sair"
+
+#: gitk:2082
+msgid "&File"
+msgstr "&Ficheiro"
+
+#: gitk:2094
+msgid "&Preferences"
+msgstr "&Preferências"
+
+#: gitk:2093
+msgid "&Edit"
+msgstr "&Editar"
+
+#: gitk:2098
+msgid "&New view..."
+msgstr "&Nova vista..."
+
+#: gitk:2099
+msgid "&Edit view..."
+msgstr "&Editar vista..."
+
+#: gitk:2100
+msgid "&Delete view"
+msgstr "Elimina&r vista"
+
+#: gitk:2102
+msgid "&All files"
+msgstr "&Todos os ficheiros"
+
+#: gitk:2097
+msgid "&View"
+msgstr "&Ver"
+
+#: gitk:2107 gitk:2117
+msgid "&About gitk"
+msgstr "&Sobre gitk"
+
+#: gitk:2108 gitk:2122
+msgid "&Key bindings"
+msgstr "&Atalhos"
+
+#: gitk:2106 gitk:2121
+msgid "&Help"
+msgstr "&Ajuda"
+
+#: gitk:2199 gitk:8671
+msgid "SHA1 ID:"
+msgstr "ID SHA1:"
+
+#: gitk:2243
+msgid "Row"
+msgstr "Linha"
+
+#: gitk:2281
+msgid "Find"
+msgstr "Procurar"
+
+#: gitk:2309
+msgid "commit"
+msgstr "commit"
+
+#: gitk:2313 gitk:2315 gitk:4706 gitk:4729 gitk:4753 gitk:6774 gitk:6846
+#: gitk:6931
+msgid "containing:"
+msgstr "contendo:"
+
+#: gitk:2316 gitk:3545 gitk:3550 gitk:4782
+msgid "touching paths:"
+msgstr "altera os caminhos:"
+
+#: gitk:2317 gitk:4796
+msgid "adding/removing string:"
+msgstr "adiciona/remove a cadeia:"
+
+#: gitk:2318 gitk:4798
+msgid "changing lines matching:"
+msgstr "altera linhas com:"
+
+#: gitk:2327 gitk:2329 gitk:4785
+msgid "Exact"
+msgstr "Exato"
+
+#: gitk:2329 gitk:4873 gitk:6742
+msgid "IgnCase"
+msgstr "IgnMaiúsculas"
+
+#: gitk:2329 gitk:4755 gitk:4871 gitk:6738
+msgid "Regexp"
+msgstr "Expr. regular"
+
+#: gitk:2331 gitk:2332 gitk:4893 gitk:4923 gitk:4930 gitk:6867 gitk:6935
+msgid "All fields"
+msgstr "Todos os campos"
+
+#: gitk:2332 gitk:4890 gitk:4923 gitk:6805
+msgid "Headline"
+msgstr "Cabeçalho"
+
+#: gitk:2333 gitk:4890 gitk:6805 gitk:6935 gitk:7408
+msgid "Comments"
+msgstr "Comentários"
+
+#: gitk:2333 gitk:4890 gitk:4895 gitk:4930 gitk:6805 gitk:7343 gitk:8849
+#: gitk:8864
+msgid "Author"
+msgstr "Autor"
+
+#: gitk:2333 gitk:4890 gitk:6805 gitk:7345
+msgid "Committer"
+msgstr "Committer"
+
+#: gitk:2367
+msgid "Search"
+msgstr "Pesquisar"
+
+#: gitk:2375
+msgid "Diff"
+msgstr "Diff"
+
+#: gitk:2377
+msgid "Old version"
+msgstr "Versão antiga"
+
+#: gitk:2379
+msgid "New version"
+msgstr "Versão nova"
+
+#: gitk:2382
+msgid "Lines of context"
+msgstr "Linhas de contexto"
+
+#: gitk:2392
+msgid "Ignore space change"
+msgstr "Ignorar espaços"
+
+#: gitk:2396 gitk:2398 gitk:7978 gitk:8225
+msgid "Line diff"
+msgstr "Diff de linha"
+
+#: gitk:2463
+msgid "Patch"
+msgstr "Patch"
+
+#: gitk:2465
+msgid "Tree"
+msgstr "Árvore"
+
+#: gitk:2635 gitk:2656
+msgid "Diff this -> selected"
+msgstr "Diff este -> seleção"
+
+#: gitk:2636 gitk:2657
+msgid "Diff selected -> this"
+msgstr "Diff seleção -> este"
+
+#: gitk:2637 gitk:2658
+msgid "Make patch"
+msgstr "Gerar patch"
+
+#: gitk:2638 gitk:9273
+msgid "Create tag"
+msgstr "Criar tag"
+
+#: gitk:2639
+msgid "Copy commit summary"
+msgstr "Copiar sumário do commit"
+
+#: gitk:2640 gitk:9404
+msgid "Write commit to file"
+msgstr "Escrever commit num ficheiro"
+
+#: gitk:2641 gitk:9461
+msgid "Create new branch"
+msgstr "Criar novo ramo"
+
+#: gitk:2642
+msgid "Cherry-pick this commit"
+msgstr "Efetuar cherry-pick deste commit"
+
+#: gitk:2643
+msgid "Reset HEAD branch to here"
+msgstr "Repor ramo HEAD para aqui"
+
+#: gitk:2644
+msgid "Mark this commit"
+msgstr "Marcar este commit"
+
+#: gitk:2645
+msgid "Return to mark"
+msgstr "Voltar à marca"
+
+#: gitk:2646
+msgid "Find descendant of this and mark"
+msgstr "Encontrar descendeste deste e da marca"
+
+#: gitk:2647
+msgid "Compare with marked commit"
+msgstr "Comparar com o commit marcado"
+
+#: gitk:2648 gitk:2659
+msgid "Diff this -> marked commit"
+msgstr "Diff este -> commit marcado"
+
+#: gitk:2649 gitk:2660
+msgid "Diff marked commit -> this"
+msgstr "Diff commit marcado -> este"
+
+#: gitk:2650
+msgid "Revert this commit"
+msgstr "Reverter este commit"
+
+#: gitk:2666
+msgid "Check out this branch"
+msgstr "Extrair este ramo"
+
+#: gitk:2667
+msgid "Remove this branch"
+msgstr "Remover este ramo"
+
+#: gitk:2668
+msgid "Copy branch name"
+msgstr "Copiar nome do ramo"
+
+#: gitk:2675
+msgid "Highlight this too"
+msgstr "Realçar este também"
+
+#: gitk:2676
+msgid "Highlight this only"
+msgstr "Realçar apenas este"
+
+#: gitk:2677
+msgid "External diff"
+msgstr "Diff externo"
+
+#: gitk:2678
+msgid "Blame parent commit"
+msgstr "Culpar commit pai"
+
+#: gitk:2679
+msgid "Copy path"
+msgstr "Copiar caminho"
+
+#: gitk:2686
+msgid "Show origin of this line"
+msgstr "Mostrar origem deste ficheiro"
+
+#: gitk:2687
+msgid "Run git gui blame on this line"
+msgstr "Executar git gui blame sobre esta linha"
+
+#: gitk:3031
+msgid "About gitk"
+msgstr "Sobre gitk"
+
+#: gitk:3033
+msgid ""
+"\n"
+"Gitk - a commit viewer for git\n"
+"\n"
+"Copyright © 2005-2016 Paul Mackerras\n"
+"\n"
+"Use and redistribute under the terms of the GNU General Public License"
+msgstr ""
+"\n"
+"Gitk - um visualizador de commits do git\n"
+"\n"
+"Copyright © 2005-2016 Paul Mackerras\n"
+"\n"
+"Use e redistribua sob os termos da GNU General Public License"
+
+#: gitk:3041 gitk:3108 gitk:9890
+msgid "Close"
+msgstr "Fechar"
+
+#: gitk:3062
+msgid "Gitk key bindings"
+msgstr "Atalhos do gitk"
+
+#: gitk:3065
+msgid "Gitk key bindings:"
+msgstr "Atalhos do gitk:"
+
+#: gitk:3067
+#, tcl-format
+msgid "<%s-Q>\t\tQuit"
+msgstr "<%s-Q>\t\tSair"
+
+#: gitk:3068
+#, tcl-format
+msgid "<%s-W>\t\tClose window"
+msgstr "<%s-W>\t\tFechar janela"
+
+#: gitk:3069
+msgid "<Home>\t\tMove to first commit"
+msgstr "<Home>\t\tMover para o primeiro commit"
+
+#: gitk:3070
+msgid "<End>\t\tMove to last commit"
+msgstr "<End>\t\tMover para o último commit"
+
+#: gitk:3071
+msgid "<Up>, p, k\tMove up one commit"
+msgstr "<Cima>, p, k\tMover para o commit acima"
+
+#: gitk:3072
+msgid "<Down>, n, j\tMove down one commit"
+msgstr "<Baixo>, n, j\tMover para o commit abaixo"
+
+#: gitk:3073
+msgid "<Left>, z, h\tGo back in history list"
+msgstr "<Esquerda>, z, h\tRecuar no histórico"
+
+#: gitk:3074
+msgid "<Right>, x, l\tGo forward in history list"
+msgstr "<Direita>, x, l\tAvançar no histórico"
+
+#: gitk:3075
+#, tcl-format
+msgid "<%s-n>\tGo to n-th parent of current commit in history list"
+msgstr "<%s-n>\tIr para o n-ésimo pai do commit atual no histórico"
+
+#: gitk:3076
+msgid "<PageUp>\tMove up one page in commit list"
+msgstr "<PageUp>\tMover a lista de commits uma página para cima"
+
+#: gitk:3077
+msgid "<PageDown>\tMove down one page in commit list"
+msgstr "<PageDown>\tMover a lista de commits uma página para baixo"
+
+#: gitk:3078
+#, tcl-format
+msgid "<%s-Home>\tScroll to top of commit list"
+msgstr "<%s-Home>\tDeslocar para o topo da lista"
+
+#: gitk:3079
+#, tcl-format
+msgid "<%s-End>\tScroll to bottom of commit list"
+msgstr "<%s-End>\tDeslocar para o fim da lista"
+
+#: gitk:3080
+#, tcl-format
+msgid "<%s-Up>\tScroll commit list up one line"
+msgstr "<%s-Cima>\tDeslocar a lista de commits uma linha para cima"
+
+#: gitk:3081
+#, tcl-format
+msgid "<%s-Down>\tScroll commit list down one line"
+msgstr "<%s-Baixo>\tDeslocar a lista de commits uma linha para baixo"
+
+#: gitk:3082
+#, tcl-format
+msgid "<%s-PageUp>\tScroll commit list up one page"
+msgstr "<%s-PageUp>\tDeslocar a lista de commits uma página para cima"
+
+#: gitk:3083
+#, tcl-format
+msgid "<%s-PageDown>\tScroll commit list down one page"
+msgstr "<%s-PageDown>\tDeslocar a lista de commits uma página para baixo"
+
+#: gitk:3084
+msgid "<Shift-Up>\tFind backwards (upwards, later commits)"
+msgstr "<Shift-Cima>\tProcurar para trás (para cima, commits posteriores)"
+
+#: gitk:3085
+msgid "<Shift-Down>\tFind forwards (downwards, earlier commits)"
+msgstr "<Shift-Baixo>\tProcurar para a frente (para baixo, commits anteriores)"
+
+#: gitk:3086
+msgid "<Delete>, b\tScroll diff view up one page"
+msgstr "<Delete>, b\tDeslocar vista diff uma página para cima"
+
+#: gitk:3087
+msgid "<Backspace>\tScroll diff view up one page"
+msgstr "<Retrocesso>\tDeslocar vista diff uma página para cima"
+
+#: gitk:3088
+msgid "<Space>\t\tScroll diff view down one page"
+msgstr "<Espaço>\tDeslocar vista diff uma página para baixo"
+
+#: gitk:3089
+msgid "u\t\tScroll diff view up 18 lines"
+msgstr "u\t\tDeslocar vista diff 18 linhas para cima"
+
+#: gitk:3090
+msgid "d\t\tScroll diff view down 18 lines"
+msgstr "d\t\tDeslocar vista diff 18 linhas para baixo"
+
+#: gitk:3091
+#, tcl-format
+msgid "<%s-F>\t\tFind"
+msgstr "<%s-F>\t\tProcurar"
+
+#: gitk:3092
+#, tcl-format
+msgid "<%s-G>\t\tMove to next find hit"
+msgstr "<%s-G>\t\tMover para a ocorrência seguinte"
+
+#: gitk:3093
+msgid "<Return>\tMove to next find hit"
+msgstr "<Return>\tMover para a ocorrência seguinte"
+
+#: gitk:3094
+msgid "g\t\tGo to commit"
+msgstr "g\t\tIr para o commit"
+
+#: gitk:3095
+msgid "/\t\tFocus the search box"
+msgstr "/\t\tFocar a caixa de pesquisa"
+
+#: gitk:3096
+msgid "?\t\tMove to previous find hit"
+msgstr "?\t\tMover para a ocorrência anterior"
+
+#: gitk:3097
+msgid "f\t\tScroll diff view to next file"
+msgstr "f\t\tDeslocar vista diff para o ficheiro seguinte"
+
+#: gitk:3098
+#, tcl-format
+msgid "<%s-S>\t\tSearch for next hit in diff view"
+msgstr "<%s-S>\t\tProcurar pela ocorrência seguinte na vista diff"
+
+#: gitk:3099
+#, tcl-format
+msgid "<%s-R>\t\tSearch for previous hit in diff view"
+msgstr "<%s-R>\t\tProcurar pela ocorrência anterior na vista diff"
+
+#: gitk:3100
+#, tcl-format
+msgid "<%s-KP+>\tIncrease font size"
+msgstr "<%s-KP+>\tAumentar o tamanho da letra"
+
+#: gitk:3101
+#, tcl-format
+msgid "<%s-plus>\tIncrease font size"
+msgstr "<%s-mais>\tAumentar o tamanho da letra"
+
+#: gitk:3102
+#, tcl-format
+msgid "<%s-KP->\tDecrease font size"
+msgstr "<%s-KP->\tDiminuir o tamanho da letra"
+
+#: gitk:3103
+#, tcl-format
+msgid "<%s-minus>\tDecrease font size"
+msgstr "<%s-menos>\tDiminuir o tamanho da letra"
+
+#: gitk:3104
+msgid "<F5>\t\tUpdate"
+msgstr "<F5>\t\tAtualizar"
+
+#: gitk:3569 gitk:3578
+#, tcl-format
+msgid "Error creating temporary directory %s:"
+msgstr "Erro ao criar ficheiro temporário %s:"
+
+#: gitk:3591
+#, tcl-format
+msgid "Error getting \"%s\" from %s:"
+msgstr "Erro ao obter \"%s\" de %s:"
+
+#: gitk:3654
+msgid "command failed:"
+msgstr "o comando falhou:"
+
+#: gitk:3803
+msgid "No such commit"
+msgstr "Commit inexistente"
+
+#: gitk:3817
+msgid "git gui blame: command failed:"
+msgstr "git gui blame: o comando falhou:"
+
+#: gitk:3848
+#, tcl-format
+msgid "Couldn't read merge head: %s"
+msgstr "Não foi possível ler a cabeça de integração: %s"
+
+#: gitk:3856
+#, tcl-format
+msgid "Error reading index: %s"
+msgstr "Erro ao ler o índice: %s"
+
+#: gitk:3881
+#, tcl-format
+msgid "Couldn't start git blame: %s"
+msgstr "Não foi possível iniciar git blame: %s"
+
+#: gitk:3884 gitk:6773
+msgid "Searching"
+msgstr "A procurar"
+
+#: gitk:3916
+#, tcl-format
+msgid "Error running git blame: %s"
+msgstr "Erro ao executar git blame: %s"
+
+#: gitk:3944
+#, tcl-format
+msgid "That line comes from commit %s,  which is not in this view"
+msgstr "Essa linha provém do commit %s, que não está nesta vista"
+
+#: gitk:3958
+msgid "External diff viewer failed:"
+msgstr "Visualizador diff externo falhou:"
+
+#: gitk:4062
+msgid "All files"
+msgstr "Todos os ficheiros"
+
+#: gitk:4086
+msgid "View"
+msgstr "Vista"
+
+#: gitk:4089
+msgid "Gitk view definition"
+msgstr "Definição de vistas do gitk"
+
+#: gitk:4093
+msgid "Remember this view"
+msgstr "Recordar esta vista"
+
+#: gitk:4094
+msgid "References (space separated list):"
+msgstr "Referências (lista separada por espaço):"
+
+#: gitk:4095
+msgid "Branches & tags:"
+msgstr "Ramos e tags:"
+
+#: gitk:4096
+msgid "All refs"
+msgstr "Todas as referências"
+
+#: gitk:4097
+msgid "All (local) branches"
+msgstr "Todos os ramos (locais)"
+
+#: gitk:4098
+msgid "All tags"
+msgstr "Todas as tags"
+
+#: gitk:4099
+msgid "All remote-tracking branches"
+msgstr "Todos os ramos remotos de monitorização"
+
+#: gitk:4100
+msgid "Commit Info (regular expressions):"
+msgstr "Informação Sobre o Commit (expressões regulares):"
+
+#: gitk:4101
+msgid "Author:"
+msgstr "Autor:"
+
+#: gitk:4102
+msgid "Committer:"
+msgstr "Committer:"
+
+#: gitk:4103
+msgid "Commit Message:"
+msgstr "Mensagem de Commit:"
+
+#: gitk:4104
+msgid "Matches all Commit Info criteria"
+msgstr "Corresponde a todos os critérios da Informação Sobre o Commit"
+
+#: gitk:4105
+msgid "Matches no Commit Info criteria"
+msgstr "Não corresponde a nenhum critério da Informação Sobre o Commit"
+
+#: gitk:4106
+msgid "Changes to Files:"
+msgstr "Alterações nos Ficheiros:"
+
+#: gitk:4107
+msgid "Fixed String"
+msgstr "Cadeia Fixa"
+
+#: gitk:4108
+msgid "Regular Expression"
+msgstr "Expressão Regular"
+
+#: gitk:4109
+msgid "Search string:"
+msgstr "Procurar pela cadeia:"
+
+#: gitk:4110
+msgid ""
+"Commit Dates (\"2 weeks ago\", \"2009-03-17 15:27:38\", \"March 17, 2009 "
+"15:27:38\"):"
+msgstr ""
+"Datas de Commit (\"2 weeks ago\", \"2009-03-17 15:27:38\", \"March 17, 2009 "
+"15:27:38\"):"
+
+#: gitk:4111
+msgid "Since:"
+msgstr "Desde:"
+
+#: gitk:4112
+msgid "Until:"
+msgstr "Até:"
+
+#: gitk:4113
+msgid "Limit and/or skip a number of revisions (positive integer):"
+msgstr "Limitar e/ou ignorar um número de revisões (inteiro positivo):"
+
+#: gitk:4114
+msgid "Number to show:"
+msgstr "Número a mostrar:"
+
+#: gitk:4115
+msgid "Number to skip:"
+msgstr "Número a ignorar:"
+
+#: gitk:4116
+msgid "Miscellaneous options:"
+msgstr "Opções diversas:"
+
+#: gitk:4117
+msgid "Strictly sort by date"
+msgstr "Ordenar estritamente pela data"
+
+#: gitk:4118
+msgid "Mark branch sides"
+msgstr "Marcar lado dos ramos"
+
+#: gitk:4119
+msgid "Limit to first parent"
+msgstr "Restringir ao primeiro pai"
+
+#: gitk:4120
+msgid "Simple history"
+msgstr "Histórico simples"
+
+#: gitk:4121
+msgid "Additional arguments to git log:"
+msgstr "Argumentos adicionais ao git log:"
+
+#: gitk:4122
+msgid "Enter files and directories to include, one per line:"
+msgstr "Introduza ficheiros e diretórios para incluir, um por linha:"
+
+#: gitk:4123
+msgid "Command to generate more commits to include:"
+msgstr "Comando para gerar mais commits para incluir:"
+
+#: gitk:4247
+msgid "Gitk: edit view"
+msgstr "Gitk: editar vista"
+
+#: gitk:4255
+msgid "-- criteria for selecting revisions"
+msgstr "-- critério para selecionar revisões"
+
+#: gitk:4260
+msgid "View Name"
+msgstr "Nome da Vista"
+
+#: gitk:4335
+msgid "Apply (F5)"
+msgstr "Aplicar (F5)"
+
+#: gitk:4373
+msgid "Error in commit selection arguments:"
+msgstr "Erro nos argumentos de seleção de commits:"
+
+#: gitk:4428 gitk:4481 gitk:4943 gitk:4957 gitk:6227 gitk:12410 gitk:12411
+msgid "None"
+msgstr "Nenhum"
+
+#: gitk:5040 gitk:5045
+msgid "Descendant"
+msgstr "Descendente"
+
+#: gitk:5041
+msgid "Not descendant"
+msgstr "Não descendente"
+
+#: gitk:5048 gitk:5053
+msgid "Ancestor"
+msgstr "Antecessor"
+
+#: gitk:5049
+msgid "Not ancestor"
+msgstr "Não antecessor"
+
+#: gitk:5343
+msgid "Local changes checked in to index but not committed"
+msgstr "Alterações locais preparadas no índice mas não submetidas"
+
+#: gitk:5379
+msgid "Local uncommitted changes, not checked in to index"
+msgstr "Alterações locais não submetidas, não preparadas no índice"
+
+#: gitk:7153
+msgid "and many more"
+msgstr "e muitos mais"
+
+#: gitk:7156
+msgid "many"
+msgstr "muitos"
+
+#: gitk:7347
+msgid "Tags:"
+msgstr "Tags:"
+
+#: gitk:7364 gitk:7370 gitk:8844
+msgid "Parent"
+msgstr "Pai"
+
+#: gitk:7375
+msgid "Child"
+msgstr "Filho"
+
+#: gitk:7384
+msgid "Branch"
+msgstr "Ramo"
+
+#: gitk:7387
+msgid "Follows"
+msgstr "Sucede"
+
+#: gitk:7390
+msgid "Precedes"
+msgstr "Precede"
+
+#: gitk:7985
+#, tcl-format
+msgid "Error getting diffs: %s"
+msgstr "Erro ao obter diferenças: %s"
+
+#: gitk:8669
+msgid "Goto:"
+msgstr "Ir para:"
+
+#: gitk:8690
+#, tcl-format
+msgid "Short SHA1 id %s is ambiguous"
+msgstr "O id SHA1 abreviado %s é ambíguo"
+
+#: gitk:8697
+#, tcl-format
+msgid "Revision %s is not known"
+msgstr "A revisão %s não é conhecida"
+
+#: gitk:8707
+#, tcl-format
+msgid "SHA1 id %s is not known"
+msgstr "O id SHA1 %s não é conhecido"
+
+#: gitk:8709
+#, tcl-format
+msgid "Revision %s is not in the current view"
+msgstr "A revisão %s não se encontra na vista atual"
+
+#: gitk:8851 gitk:8866
+msgid "Date"
+msgstr "Data"
+
+#: gitk:8854
+msgid "Children"
+msgstr "Filhos"
+
+#: gitk:8917
+#, tcl-format
+msgid "Reset %s branch to here"
+msgstr "Repor o ramo %s para aqui"
+
+#: gitk:8919
+msgid "Detached head: can't reset"
+msgstr "Cabeça destacada: não é possível repor"
+
+#: gitk:9024 gitk:9030
+msgid "Skipping merge commit "
+msgstr "A ignorar commit de integração "
+
+#: gitk:9039 gitk:9044
+msgid "Error getting patch ID for "
+msgstr "Erro ao obter ID de patch de "
+
+#: gitk:9040 gitk:9045
+msgid " - stopping\n"
+msgstr " - a interromper\n"
+
+#: gitk:9050 gitk:9053 gitk:9061 gitk:9075 gitk:9084
+msgid "Commit "
+msgstr "Commit "
+
+#: gitk:9054
+msgid ""
+" is the same patch as\n"
+"       "
+msgstr ""
+" é o mesmo patch que\n"
+"       "
+
+#: gitk:9062
+msgid ""
+" differs from\n"
+"       "
+msgstr ""
+" difere de\n"
+"       "
+
+#: gitk:9064
+msgid ""
+"Diff of commits:\n"
+"\n"
+msgstr ""
+"Diferença dos commits:\n"
+"\n"
+
+#: gitk:9076 gitk:9085
+#, tcl-format
+msgid " has %s children - stopping\n"
+msgstr " tem %s filhos - a interromper\n"
+
+#: gitk:9104
+#, tcl-format
+msgid "Error writing commit to file: %s"
+msgstr "Erro ao escrever commit no ficheiro: %s"
+
+#: gitk:9110
+#, tcl-format
+msgid "Error diffing commits: %s"
+msgstr "Erro ao calcular as diferenças dos commits: %s"
+
+#: gitk:9156
+msgid "Top"
+msgstr "Topo"
+
+#: gitk:9157
+msgid "From"
+msgstr "De"
+
+#: gitk:9162
+msgid "To"
+msgstr "Para"
+
+#: gitk:9186
+msgid "Generate patch"
+msgstr "Gerar patch"
+
+#: gitk:9188
+msgid "From:"
+msgstr "De:"
+
+#: gitk:9197
+msgid "To:"
+msgstr "Para:"
+
+#: gitk:9206
+msgid "Reverse"
+msgstr "Reverter"
+
+#: gitk:9208 gitk:9418
+msgid "Output file:"
+msgstr "Ficheiro de saída:"
+
+#: gitk:9214
+msgid "Generate"
+msgstr "Gerar"
+
+#: gitk:9252
+msgid "Error creating patch:"
+msgstr "Erro ao criar patch:"
+
+#: gitk:9275 gitk:9406 gitk:9463
+msgid "ID:"
+msgstr "ID:"
+
+#: gitk:9284
+msgid "Tag name:"
+msgstr "Nome da tag:"
+
+#: gitk:9287
+msgid "Tag message is optional"
+msgstr "A mensagem da tag é opcional"
+
+#: gitk:9289
+msgid "Tag message:"
+msgstr "Mensagem da tag:"
+
+#: gitk:9293 gitk:9472
+msgid "Create"
+msgstr "Criar"
+
+#: gitk:9311
+msgid "No tag name specified"
+msgstr "Nenhum nome de tag especificado"
+
+#: gitk:9315
+#, tcl-format
+msgid "Tag \"%s\" already exists"
+msgstr "A tag \"%s\" já existe"
+
+#: gitk:9325
+msgid "Error creating tag:"
+msgstr "Erro ao criar tag:"
+
+#: gitk:9415
+msgid "Command:"
+msgstr "Comando:"
+
+#: gitk:9423
+msgid "Write"
+msgstr "Escrever"
+
+#: gitk:9441
+msgid "Error writing commit:"
+msgstr "Erro ao escrever commit:"
+
+#: gitk:9468
+msgid "Name:"
+msgstr "Nome:"
+
+#: gitk:9491
+msgid "Please specify a name for the new branch"
+msgstr "Especifique um nome para o novo ramo"
+
+#: gitk:9496
+#, tcl-format
+msgid "Branch '%s' already exists. Overwrite?"
+msgstr "O ramo '%s' já existe. Substituí-lo?"
+
+#: gitk:9563
+#, tcl-format
+msgid "Commit %s is already included in branch %s -- really re-apply it?"
+msgstr "O commit %s já está incluído no ramo %s -- reaplicá-lo mesmo assim?"
+
+#: gitk:9568
+msgid "Cherry-picking"
+msgstr "A efetuar cherry-pick"
+
+#: gitk:9577
+#, tcl-format
+msgid ""
+"Cherry-pick failed because of local changes to file '%s'.\n"
+"Please commit, reset or stash your changes and try again."
+msgstr ""
+"Falha ao efetuar cherry-pick devido a alterações locais no ficheiro '%s'.\n"
+"Submeta, empilhe ou reponha as alterações e tente de novo."
+
+#: gitk:9583
+msgid ""
+"Cherry-pick failed because of merge conflict.\n"
+"Do you wish to run git citool to resolve it?"
+msgstr ""
+"Falha ao efetuar cherry-pick devido a conflito de integração.\n"
+"Deseja executar git citool para resolvê-lo?"
+
+#: gitk:9599 gitk:9657
+msgid "No changes committed"
+msgstr "Não foi submetida nenhum alteração"
+
+#: gitk:9626
+#, tcl-format
+msgid "Commit %s is not included in branch %s -- really revert it?"
+msgstr "O commit %s não está incluído no ramo %s -- revertê-lo mesmo assim?"
+
+#: gitk:9631
+msgid "Reverting"
+msgstr "A reverter"
+
+#: gitk:9639
+#, tcl-format
+msgid ""
+"Revert failed because of local changes to the following files:%s Please "
+"commit, reset or stash  your changes and try again."
+msgstr ""
+"Falha ao reverter devido a alterações locais nos seguintes ficheiros:%s "
+"Submeta, empilhe ou reponha as alterações e tente de novo."
+
+#: gitk:9643
+msgid ""
+"Revert failed because of merge conflict.\n"
+" Do you wish to run git citool to resolve it?"
+msgstr ""
+"Falha ao reverter devido a conflito de integração.\n"
+"Deseja executar git citool para resolvê-lo?"
+
+#: gitk:9686
+msgid "Confirm reset"
+msgstr "Confirmar reposição"
+
+#: gitk:9688
+#, tcl-format
+msgid "Reset branch %s to %s?"
+msgstr "Repor o ramo %s para %s?"
+
+#: gitk:9690
+msgid "Reset type:"
+msgstr "Tipo de reposição:"
+
+#: gitk:9693
+msgid "Soft: Leave working tree and index untouched"
+msgstr "Suave: Deixar a árvore de trabalho e o índice intactos"
+
+#: gitk:9696
+msgid "Mixed: Leave working tree untouched, reset index"
+msgstr "Misto: Deixar a árvore de trabalho intacta, repor índice"
+
+#: gitk:9699
+msgid ""
+"Hard: Reset working tree and index\n"
+"(discard ALL local changes)"
+msgstr ""
+"Forte: Repor árvore de trabalho e índice\n"
+"(descartar TODAS as alterações locais)"
+
+#: gitk:9716
+msgid "Resetting"
+msgstr "A repor"
+
+#: gitk:9776
+msgid "Checking out"
+msgstr "A extrair"
+
+#: gitk:9829
+msgid "Cannot delete the currently checked-out branch"
+msgstr "Não é possível eliminar o ramo atual extraído"
+
+#: gitk:9835
+#, tcl-format
+msgid ""
+"The commits on branch %s aren't on any other branch.\n"
+"Really delete branch %s?"
+msgstr ""
+"Os commits no ramo %s não estão presentes em mais nenhum ramo.\n"
+"Eliminar o ramo %s mesmo assim?"
+
+#: gitk:9866
+#, tcl-format
+msgid "Tags and heads: %s"
+msgstr "Tags e cabeças: %s"
+
+#: gitk:9883
+msgid "Filter"
+msgstr "Filtrar"
+
+#: gitk:10179
+msgid ""
+"Error reading commit topology information; branch and preceding/following "
+"tag information will be incomplete."
+msgstr ""
+"Erro ao ler informação de topologia do commit; a informação do ramo e da tag "
+"precedente/seguinte ficará incompleta."
+
+#: gitk:11156
+msgid "Tag"
+msgstr "Tag"
+
+#: gitk:11160
+msgid "Id"
+msgstr "Id"
+
+#: gitk:11243
+msgid "Gitk font chooser"
+msgstr "Escolha de tipo de letra do gitk"
+
+#: gitk:11260
+msgid "B"
+msgstr "B"
+
+#: gitk:11263
+msgid "I"
+msgstr "I"
+
+#: gitk:11381
+msgid "Commit list display options"
+msgstr "Opções de visualização da lista de commits"
+
+#: gitk:11384
+msgid "Maximum graph width (lines)"
+msgstr "Largura máxima do gráfico (linhas)"
+
+#: gitk:11388
+#, no-tcl-format
+msgid "Maximum graph width (% of pane)"
+msgstr "Largura máxima do gráfico (% do painel)"
+
+#: gitk:11391
+msgid "Show local changes"
+msgstr "Mostrar alterações locais"
+
+#: gitk:11394
+msgid "Auto-select SHA1 (length)"
+msgstr "Selecionar automaticamente SHA1 (largura)"
+
+#: gitk:11398
+msgid "Hide remote refs"
+msgstr "Ocultar referências remotas"
+
+#: gitk:11402
+msgid "Diff display options"
+msgstr "Opções de visualização de diferenças"
+
+#: gitk:11404
+msgid "Tab spacing"
+msgstr "Espaçamento da tabulação"
+
+#: gitk:11407
+msgid "Display nearby tags/heads"
+msgstr "Mostrar tags/cabeças próximas"
+
+#: gitk:11410
+msgid "Maximum # tags/heads to show"
+msgstr "Nº máximo de tags/cabeças a mostrar"
+
+#: gitk:11413
+msgid "Limit diffs to listed paths"
+msgstr "Limitar diferenças aos caminhos listados"
+
+#: gitk:11416
+msgid "Support per-file encodings"
+msgstr "Suportar codificação por cada ficheiro"
+
+#: gitk:11422 gitk:11569
+msgid "External diff tool"
+msgstr "Ferramenta diff externa"
+
+#: gitk:11423
+msgid "Choose..."
+msgstr "Escolher..."
+
+#: gitk:11428
+msgid "General options"
+msgstr "Opções gerais"
+
+#: gitk:11431
+msgid "Use themed widgets"
+msgstr "Usar widgets com estilo"
+
+#: gitk:11433
+msgid "(change requires restart)"
+msgstr "(alteração exige reiniciar)"
+
+#: gitk:11435
+msgid "(currently unavailable)"
+msgstr "(não disponível de momento)"
+
+#: gitk:11446
+msgid "Colors: press to choose"
+msgstr "Cores: pressione para escolher"
+
+#: gitk:11449
+msgid "Interface"
+msgstr "Interface"
+
+#: gitk:11450
+msgid "interface"
+msgstr "interface"
+
+#: gitk:11453
+msgid "Background"
+msgstr "Fundo"
+
+#: gitk:11454 gitk:11484
+msgid "background"
+msgstr "fundo"
+
+#: gitk:11457
+msgid "Foreground"
+msgstr "Primeiro plano"
+
+#: gitk:11458
+msgid "foreground"
+msgstr "primeiro plano"
+
+#: gitk:11461
+msgid "Diff: old lines"
+msgstr "Diff: linhas antigas"
+
+#: gitk:11462
+msgid "diff old lines"
+msgstr "diff linhas antigas"
+
+#: gitk:11466
+msgid "Diff: new lines"
+msgstr "Diff: linhas novas"
+
+#: gitk:11467
+msgid "diff new lines"
+msgstr "diff linhas novas"
+
+#: gitk:11471
+msgid "Diff: hunk header"
+msgstr "Diff: cabeçalho do excerto"
+
+#: gitk:11473
+msgid "diff hunk header"
+msgstr "diff cabeçalho do excerto"
+
+#: gitk:11477
+msgid "Marked line bg"
+msgstr "Fundo da linha marcada"
+
+#: gitk:11479
+msgid "marked line background"
+msgstr "fundo da linha marcada"
+
+#: gitk:11483
+msgid "Select bg"
+msgstr "Selecionar fundo"
+
+#: gitk:11492
+msgid "Fonts: press to choose"
+msgstr "Tipo de letra: pressione para escolher"
+
+#: gitk:11494
+msgid "Main font"
+msgstr "Tipo de letra principal"
+
+#: gitk:11495
+msgid "Diff display font"
+msgstr "Tipo de letra ao mostrar diferenças"
+
+#: gitk:11496
+msgid "User interface font"
+msgstr "Tipo de letra da interface de utilizador"
+
+#: gitk:11518
+msgid "Gitk preferences"
+msgstr "Preferências do gitk"
+
+#: gitk:11527
+msgid "General"
+msgstr "Geral"
+
+#: gitk:11528
+msgid "Colors"
+msgstr "Cores"
+
+#: gitk:11529
+msgid "Fonts"
+msgstr "Tipos de letra"
+
+#: gitk:11579
+#, tcl-format
+msgid "Gitk: choose color for %s"
+msgstr "Gitk: escolher cor de %s"
+
+#: gitk:12092
+msgid ""
+"Sorry, gitk cannot run with this version of Tcl/Tk.\n"
+" Gitk requires at least Tcl/Tk 8.4."
+msgstr ""
+"Não é possível executar o gitk com esta versão do Tcl/Tk.\n"
+"O gitk requer pelo menos Tcl/Tk 8.4."
+
+#: gitk:12302
+msgid "Cannot find a git repository here."
+msgstr "Não foi encontrado nenhum repositório git aqui."
+
+#: gitk:12349
+#, tcl-format
+msgid "Ambiguous argument '%s': both revision and filename"
+msgstr "Argumento '%s' ambíguo: pode ser uma revisão ou um ficheiro"
+
+#: gitk:12361
+msgid "Bad arguments to gitk:"
+msgstr "Argumentos do gitk incorretos:"
index 17ed026aa7da7c636457c302b2c28f7b866ae45a..9b08c263eadea7226a70d92d072f7a581da2bd20 100644 (file)
@@ -3,15 +3,15 @@
 # Translators:
 # 0xAX <kuleshovmail@gmail.com>, 2014
 # Alex Riesen <raa.lkml@gmail.com>, 2015
-# Dimitriy Ryazantcev <DJm00n@mail.ru>, 2015
+# Dimitriy Ryazantcev <DJm00n@mail.ru>, 2015-2016
 # Dmitry Potapov <dpotapov@gmail.com>, 2009
 # Skip <bsvskip@rambler.ru>, 2011
 msgid ""
 msgstr ""
 "Project-Id-Version: Git Russian Localization Project\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-05-17 14:32+1000\n"
-"PO-Revision-Date: 2015-10-12 10:14+0000\n"
+"POT-Creation-Date: 2016-12-15 00:18+0200\n"
+"PO-Revision-Date: 2016-12-14 22:23+0000\n"
 "Last-Translator: Dimitriy Ryazantcev <DJm00n@mail.ru>\n"
 "Language-Team: Russian (http://www.transifex.com/djm00n/git-po-ru/language/ru/)\n"
 "MIME-Version: 1.0\n"
@@ -24,11 +24,11 @@ msgstr ""
 msgid "Couldn't get list of unmerged files:"
 msgstr "Невозможно получить список файлов незавершённой операции слияния:"
 
-#: gitk:212 gitk:2381
+#: gitk:212 gitk:2403
 msgid "Color words"
 msgstr "Цветные слова"
 
-#: gitk:217 gitk:2381 gitk:8220 gitk:8253
+#: gitk:217 gitk:2403 gitk:8249 gitk:8282
 msgid "Markup words"
 msgstr "Помеченые слова"
 
@@ -58,1272 +58,1314 @@ msgstr "Ошибка запуска git log:"
 msgid "Reading"
 msgstr "Чтение"
 
-#: gitk:496 gitk:4525
+#: gitk:496 gitk:4549
 msgid "Reading commits..."
 msgstr "Чтение коммитов..."
 
-#: gitk:499 gitk:1637 gitk:4528
+#: gitk:499 gitk:1641 gitk:4552
 msgid "No commits selected"
 msgstr "Ничего не выбрано"
 
-#: gitk:1445 gitk:4045 gitk:12432
+#: gitk:1449 gitk:4069 gitk:12583
 msgid "Command line"
 msgstr "Командная строка"
 
-#: gitk:1511
+#: gitk:1515
 msgid "Can't parse git log output:"
 msgstr "Ошибка обработки вывода команды git log:"
 
-#: gitk:1740
+#: gitk:1744
 msgid "No commit information available"
 msgstr "Нет информации о коммите"
 
-#: gitk:1903 gitk:1932 gitk:4315 gitk:9669 gitk:11241 gitk:11521
+#: gitk:1907 gitk:1936 gitk:4339 gitk:9789 gitk:11388 gitk:11668
 msgid "OK"
 msgstr "Ok"
 
-#: gitk:1934 gitk:4317 gitk:9196 gitk:9275 gitk:9391 gitk:9440 gitk:9671
-#: gitk:11242 gitk:11522
+#: gitk:1938 gitk:4341 gitk:9225 gitk:9304 gitk:9434 gitk:9520 gitk:9791
+#: gitk:11389 gitk:11669
 msgid "Cancel"
 msgstr "Отмена"
 
-#: gitk:2069
+#: gitk:2087
 msgid "&Update"
 msgstr "Обновить"
 
-#: gitk:2070
+#: gitk:2088
 msgid "&Reload"
 msgstr "Перечитать"
 
-#: gitk:2071
+#: gitk:2089
 msgid "Reread re&ferences"
 msgstr "Обновить список ссылок"
 
-#: gitk:2072
+#: gitk:2090
 msgid "&List references"
 msgstr "Список ссылок"
 
-#: gitk:2074
+#: gitk:2092
 msgid "Start git &gui"
 msgstr "Запустить git gui"
 
-#: gitk:2076
+#: gitk:2094
 msgid "&Quit"
 msgstr "Завершить"
 
-#: gitk:2068
+#: gitk:2086
 msgid "&File"
 msgstr "Файл"
 
-#: gitk:2080
+#: gitk:2098
 msgid "&Preferences"
 msgstr "Настройки"
 
-#: gitk:2079
+#: gitk:2097
 msgid "&Edit"
 msgstr "Редактировать"
 
-#: gitk:2084
+#: gitk:2102
 msgid "&New view..."
 msgstr "Новое представление..."
 
-#: gitk:2085
+#: gitk:2103
 msgid "&Edit view..."
 msgstr "Редактировать представление..."
 
-#: gitk:2086
+#: gitk:2104
 msgid "&Delete view"
 msgstr "Удалить представление"
 
-#: gitk:2088 gitk:4043
+#: gitk:2106
 msgid "&All files"
 msgstr "Все файлы"
 
-#: gitk:2083 gitk:4067
+#: gitk:2101
 msgid "&View"
 msgstr "Представление"
 
-#: gitk:2093 gitk:2103 gitk:3012
+#: gitk:2111 gitk:2121
 msgid "&About gitk"
 msgstr "О gitk"
 
-#: gitk:2094 gitk:2108
+#: gitk:2112 gitk:2126
 msgid "&Key bindings"
 msgstr "Назначения клавиатуры"
 
-#: gitk:2092 gitk:2107
+#: gitk:2110 gitk:2125
 msgid "&Help"
 msgstr "Подсказка"
 
-#: gitk:2185 gitk:8652
+#: gitk:2203 gitk:8681
 msgid "SHA1 ID:"
 msgstr "SHA1 ID:"
 
-#: gitk:2229
+#: gitk:2247
 msgid "Row"
 msgstr "Строка"
 
-#: gitk:2267
+#: gitk:2285
 msgid "Find"
 msgstr "Поиск"
 
-#: gitk:2295
+#: gitk:2313
 msgid "commit"
 msgstr "коммит"
 
-#: gitk:2299 gitk:2301 gitk:4687 gitk:4710 gitk:4734 gitk:6755 gitk:6827
-#: gitk:6912
+#: gitk:2317 gitk:2319 gitk:4711 gitk:4734 gitk:4758 gitk:6779 gitk:6851
+#: gitk:6936
 msgid "containing:"
 msgstr "содержащее:"
 
-#: gitk:2302 gitk:3526 gitk:3531 gitk:4763
+#: gitk:2320 gitk:3550 gitk:3555 gitk:4787
 msgid "touching paths:"
 msgstr "касательно файлов:"
 
-#: gitk:2303 gitk:4777
+#: gitk:2321 gitk:4801
 msgid "adding/removing string:"
 msgstr "добавив/удалив строку:"
 
-#: gitk:2304 gitk:4779
+#: gitk:2322 gitk:4803
 msgid "changing lines matching:"
 msgstr "изменяя совпадающие строки:"
 
-#: gitk:2313 gitk:2315 gitk:4766
+#: gitk:2331 gitk:2333 gitk:4790
 msgid "Exact"
 msgstr "Точно"
 
-#: gitk:2315 gitk:4854 gitk:6723
+#: gitk:2333 gitk:4878 gitk:6747
 msgid "IgnCase"
 msgstr "Игнорировать большие/маленькие"
 
-#: gitk:2315 gitk:4736 gitk:4852 gitk:6719
+#: gitk:2333 gitk:4760 gitk:4876 gitk:6743
 msgid "Regexp"
 msgstr "Регулярные выражения"
 
-#: gitk:2317 gitk:2318 gitk:4874 gitk:4904 gitk:4911 gitk:6848 gitk:6916
+#: gitk:2335 gitk:2336 gitk:4898 gitk:4928 gitk:4935 gitk:6872 gitk:6940
 msgid "All fields"
 msgstr "Во всех полях"
 
-#: gitk:2318 gitk:4871 gitk:4904 gitk:6786
+#: gitk:2336 gitk:4895 gitk:4928 gitk:6810
 msgid "Headline"
 msgstr "Заголовок"
 
-#: gitk:2319 gitk:4871 gitk:6786 gitk:6916 gitk:7389
+#: gitk:2337 gitk:4895 gitk:6810 gitk:6940 gitk:7413
 msgid "Comments"
 msgstr "Комментарии"
 
-#: gitk:2319 gitk:4871 gitk:4876 gitk:4911 gitk:6786 gitk:7324 gitk:8830
-#: gitk:8845
+#: gitk:2337 gitk:4895 gitk:4900 gitk:4935 gitk:6810 gitk:7348 gitk:8859
+#: gitk:8874
 msgid "Author"
 msgstr "Автор"
 
-#: gitk:2319 gitk:4871 gitk:6786 gitk:7326
+#: gitk:2337 gitk:4895 gitk:6810 gitk:7350
 msgid "Committer"
 msgstr "Коммитер"
 
-#: gitk:2350
+#: gitk:2371
 msgid "Search"
 msgstr "Найти"
 
-#: gitk:2358
+#: gitk:2379
 msgid "Diff"
 msgstr "Сравнить"
 
-#: gitk:2360
+#: gitk:2381
 msgid "Old version"
 msgstr "Старая версия"
 
-#: gitk:2362
+#: gitk:2383
 msgid "New version"
 msgstr "Новая версия"
 
-#: gitk:2364
+#: gitk:2386
 msgid "Lines of context"
 msgstr "Строк контекста"
 
-#: gitk:2374
+#: gitk:2396
 msgid "Ignore space change"
 msgstr "Игнорировать пробелы"
 
-#: gitk:2378 gitk:2380 gitk:7959 gitk:8206
+#: gitk:2400 gitk:2402 gitk:7983 gitk:8235
 msgid "Line diff"
 msgstr "Изменения строк"
 
-#: gitk:2445
+#: gitk:2467
 msgid "Patch"
 msgstr "Патч"
 
-#: gitk:2447
+#: gitk:2469
 msgid "Tree"
 msgstr "Файлы"
 
-#: gitk:2617 gitk:2637
+#: gitk:2639 gitk:2660
 msgid "Diff this -> selected"
 msgstr "Сравнить этот коммит с выделенным"
 
-#: gitk:2618 gitk:2638
+#: gitk:2640 gitk:2661
 msgid "Diff selected -> this"
 msgstr "Сравнить выделенный с этим коммитом"
 
-#: gitk:2619 gitk:2639
+#: gitk:2641 gitk:2662
 msgid "Make patch"
 msgstr "Создать патч"
 
-#: gitk:2620 gitk:9254
+#: gitk:2642 gitk:9283
 msgid "Create tag"
 msgstr "Создать метку"
 
-#: gitk:2621 gitk:9371
+#: gitk:2643
+msgid "Copy commit summary"
+msgstr "Копировать информацию о коммите"
+
+#: gitk:2644 gitk:9414
 msgid "Write commit to file"
 msgstr "Сохранить коммит в файл"
 
-#: gitk:2622 gitk:9428
+#: gitk:2645
 msgid "Create new branch"
 msgstr "Создать ветку"
 
-#: gitk:2623
+#: gitk:2646
 msgid "Cherry-pick this commit"
-msgstr "Ð\9eÑ\82боÑ\80 Ð»Ñ\83Ñ\87Ñ\88его Ð´Ð»Ñ\8f Ñ\8dÑ\82ого ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82а"
+msgstr "Ð\9aопиÑ\80оваÑ\82Ñ\8c Ñ\8dÑ\82оÑ\82 ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82 Ð² Ñ\82екÑ\83Ñ\89Ñ\83Ñ\8e Ð²ÐµÑ\82кÑ\83"
 
-#: gitk:2624
+#: gitk:2647
 msgid "Reset HEAD branch to here"
 msgstr "Установить HEAD на этот коммит"
 
-#: gitk:2625
+#: gitk:2648
 msgid "Mark this commit"
 msgstr "Пометить этот коммит"
 
-#: gitk:2626
+#: gitk:2649
 msgid "Return to mark"
 msgstr "Вернуться на пометку"
 
-#: gitk:2627
+#: gitk:2650
 msgid "Find descendant of this and mark"
 msgstr "Найти и пометить потомка этого коммита"
 
-#: gitk:2628
+#: gitk:2651
 msgid "Compare with marked commit"
 msgstr "Сравнить с помеченным коммитом"
 
-#: gitk:2629 gitk:2640
+#: gitk:2652 gitk:2663
 msgid "Diff this -> marked commit"
 msgstr "Сравнить выделенное с помеченным коммитом"
 
-#: gitk:2630 gitk:2641
+#: gitk:2653 gitk:2664
 msgid "Diff marked commit -> this"
 msgstr "Сравнить помеченный с этим коммитом"
 
-#: gitk:2631
+#: gitk:2654
 msgid "Revert this commit"
-msgstr "Ð\92озвÑ\80аÑ\82 этого коммита"
+msgstr "Ð\9eбÑ\80аÑ\82иÑ\82Ñ\8c Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f этого коммита"
 
-#: gitk:2647
+#: gitk:2670
 msgid "Check out this branch"
 msgstr "Перейти на эту ветку"
 
-#: gitk:2648
+#: gitk:2671
+msgid "Rename this branch"
+msgstr "Переименовать эту ветку"
+
+#: gitk:2672
 msgid "Remove this branch"
 msgstr "Удалить эту ветку"
 
-#: gitk:2649
+#: gitk:2673
 msgid "Copy branch name"
 msgstr "Копировать имя ветки"
 
-#: gitk:2656
+#: gitk:2680
 msgid "Highlight this too"
 msgstr "Подсветить этот тоже"
 
-#: gitk:2657
+#: gitk:2681
 msgid "Highlight this only"
 msgstr "Подсветить только этот"
 
-#: gitk:2658
+#: gitk:2682
 msgid "External diff"
 msgstr "Программа сравнения"
 
-#: gitk:2659
+#: gitk:2683
 msgid "Blame parent commit"
 msgstr "Авторы изменений родительского коммита"
 
-#: gitk:2660
+#: gitk:2684
 msgid "Copy path"
 msgstr "Копировать путь"
 
-#: gitk:2667
+#: gitk:2691
 msgid "Show origin of this line"
 msgstr "Показать источник этой строки"
 
-#: gitk:2668
+#: gitk:2692
 msgid "Run git gui blame on this line"
 msgstr "Запустить git gui blame для этой строки"
 
-#: gitk:3014
+#: gitk:3036
+msgid "About gitk"
+msgstr "О gitk"
+
+#: gitk:3038
 msgid ""
 "\n"
 "Gitk - a commit viewer for git\n"
 "\n"
-"Copyright  2005-2014 Paul Mackerras\n"
+"Copyright © 2005-2016 Paul Mackerras\n"
 "\n"
 "Use and redistribute under the terms of the GNU General Public License"
-msgstr "\nGitk - программа просмотра истории репозиториев git\n\n©  2005-2014 Paul Mackerras\n\nИспользование и распространение согласно условиям GNU General Public License"
+msgstr "\nGitk — программа просмотра истории репозиториев git\n\n© 2005-2016 Paul Mackerras\n\nИспользование и распространение согласно условиям GNU General Public License"
 
-#: gitk:3022 gitk:3089 gitk:9857
+#: gitk:3046 gitk:3113 gitk:10004
 msgid "Close"
 msgstr "Закрыть"
 
-#: gitk:3043
+#: gitk:3067
 msgid "Gitk key bindings"
 msgstr "Назначения клавиатуры в Gitk"
 
-#: gitk:3046
+#: gitk:3070
 msgid "Gitk key bindings:"
 msgstr "Назначения клавиатуры в Gitk:"
 
-#: gitk:3048
+#: gitk:3072
 #, tcl-format
 msgid "<%s-Q>\t\tQuit"
 msgstr "<%s-Q>\t\tЗавершить"
 
-#: gitk:3049
+#: gitk:3073
 #, tcl-format
 msgid "<%s-W>\t\tClose window"
 msgstr "<%s-W>\t\tЗакрыть окно"
 
-#: gitk:3050
+#: gitk:3074
 msgid "<Home>\t\tMove to first commit"
 msgstr "<Home>\t\tПерейти к первому коммиту"
 
-#: gitk:3051
+#: gitk:3075
 msgid "<End>\t\tMove to last commit"
 msgstr "<End>\t\tПерейти к последнему коммиту"
 
-#: gitk:3052
+#: gitk:3076
 msgid "<Up>, p, k\tMove up one commit"
 msgstr "<Up>, p, k\tПерейти на один коммит вверх"
 
-#: gitk:3053
+#: gitk:3077
 msgid "<Down>, n, j\tMove down one commit"
 msgstr "<Down>, n, j\tПерейти на один коммит вниз"
 
-#: gitk:3054
+#: gitk:3078
 msgid "<Left>, z, h\tGo back in history list"
 msgstr "<Left>, z, h\tПоказать ранее посещённое состояние"
 
-#: gitk:3055
+#: gitk:3079
 msgid "<Right>, x, l\tGo forward in history list"
 msgstr "<Right>, x, l\tПоказать следующий посещённый коммит"
 
-#: gitk:3056
+#: gitk:3080
 #, tcl-format
 msgid "<%s-n>\tGo to n-th parent of current commit in history list"
 msgstr "<%s-n>\tПерейти на n родителя от текущего коммита"
 
-#: gitk:3057
+#: gitk:3081
 msgid "<PageUp>\tMove up one page in commit list"
 msgstr "<PageUp>\tПерейти на страницу выше в списке коммитов"
 
-#: gitk:3058
+#: gitk:3082
 msgid "<PageDown>\tMove down one page in commit list"
 msgstr "<PageDown>\tПерейти на страницу ниже в списке коммитов"
 
-#: gitk:3059
+#: gitk:3083
 #, tcl-format
 msgid "<%s-Home>\tScroll to top of commit list"
 msgstr "<%s-Home>\tПерейти на начало списка коммитов"
 
-#: gitk:3060
+#: gitk:3084
 #, tcl-format
 msgid "<%s-End>\tScroll to bottom of commit list"
 msgstr "<%s-End>\tПерейти на конец списка коммитов"
 
-#: gitk:3061
+#: gitk:3085
 #, tcl-format
 msgid "<%s-Up>\tScroll commit list up one line"
 msgstr "<%s-Up>\tПровернуть список коммитов вверх"
 
-#: gitk:3062
+#: gitk:3086
 #, tcl-format
 msgid "<%s-Down>\tScroll commit list down one line"
 msgstr "<%s-Down>\tПровернуть список коммитов вниз"
 
-#: gitk:3063
+#: gitk:3087
 #, tcl-format
 msgid "<%s-PageUp>\tScroll commit list up one page"
 msgstr "<%s-PageUp>\tПровернуть список коммитов на страницу вверх"
 
-#: gitk:3064
+#: gitk:3088
 #, tcl-format
 msgid "<%s-PageDown>\tScroll commit list down one page"
 msgstr "<%s-PageDown>\tПровернуть список коммитов на страницу вниз"
 
-#: gitk:3065
+#: gitk:3089
 msgid "<Shift-Up>\tFind backwards (upwards, later commits)"
 msgstr "<Shift-Up>\tПоиск в обратном порядке (вверх, среди новых коммитов)"
 
-#: gitk:3066
+#: gitk:3090
 msgid "<Shift-Down>\tFind forwards (downwards, earlier commits)"
 msgstr "<Shift-Down>\tПоиск (вниз, среди старых коммитов)"
 
-#: gitk:3067
+#: gitk:3091
 msgid "<Delete>, b\tScroll diff view up one page"
 msgstr "<Delete>, b\tПрокрутить список изменений на страницу выше"
 
-#: gitk:3068
+#: gitk:3092
 msgid "<Backspace>\tScroll diff view up one page"
 msgstr "<Backspace>\tПрокрутить список изменений на страницу выше"
 
-#: gitk:3069
+#: gitk:3093
 msgid "<Space>\t\tScroll diff view down one page"
 msgstr "<Leertaste>\t\tПрокрутить список изменений на страницу ниже"
 
-#: gitk:3070
+#: gitk:3094
 msgid "u\t\tScroll diff view up 18 lines"
 msgstr "u\t\tПрокрутить список изменений на 18 строк вверх"
 
-#: gitk:3071
+#: gitk:3095
 msgid "d\t\tScroll diff view down 18 lines"
 msgstr "d\t\tПрокрутить список изменений на 18 строк вниз"
 
-#: gitk:3072
+#: gitk:3096
 #, tcl-format
 msgid "<%s-F>\t\tFind"
 msgstr "<%s-F>\t\tПоиск"
 
-#: gitk:3073
+#: gitk:3097
 #, tcl-format
 msgid "<%s-G>\t\tMove to next find hit"
 msgstr "<%s-G>\t\tПерейти к следующему найденному коммиту"
 
-#: gitk:3074
+#: gitk:3098
 msgid "<Return>\tMove to next find hit"
 msgstr "<Return>\tПерейти к следующему найденному коммиту"
 
-#: gitk:3075
+#: gitk:3099
 msgid "g\t\tGo to commit"
 msgstr "g\t\tПерейти на коммит"
 
-#: gitk:3076
+#: gitk:3100
 msgid "/\t\tFocus the search box"
 msgstr "/\t\tПерейти к полю поиска"
 
-#: gitk:3077
+#: gitk:3101
 msgid "?\t\tMove to previous find hit"
 msgstr "?\t\tПерейти к предыдущему найденному коммиту"
 
-#: gitk:3078
+#: gitk:3102
 msgid "f\t\tScroll diff view to next file"
 msgstr "f\t\tПрокрутить список изменений к следующему файлу"
 
-#: gitk:3079
+#: gitk:3103
 #, tcl-format
 msgid "<%s-S>\t\tSearch for next hit in diff view"
 msgstr "<%s-S>\t\tПродолжить поиск в списке изменений"
 
-#: gitk:3080
+#: gitk:3104
 #, tcl-format
 msgid "<%s-R>\t\tSearch for previous hit in diff view"
 msgstr "<%s-R>\t\tПерейти к предыдущему найденному тексту в списке изменений"
 
-#: gitk:3081
+#: gitk:3105
 #, tcl-format
 msgid "<%s-KP+>\tIncrease font size"
 msgstr "<%s-KP+>\tУвеличить размер шрифта"
 
-#: gitk:3082
+#: gitk:3106
 #, tcl-format
 msgid "<%s-plus>\tIncrease font size"
 msgstr "<%s-plus>\tУвеличить размер шрифта"
 
-#: gitk:3083
+#: gitk:3107
 #, tcl-format
 msgid "<%s-KP->\tDecrease font size"
 msgstr "<%s-KP->\tУменьшить размер шрифта"
 
-#: gitk:3084
+#: gitk:3108
 #, tcl-format
 msgid "<%s-minus>\tDecrease font size"
 msgstr "<%s-minus>\tУменьшить размер шрифта"
 
-#: gitk:3085
+#: gitk:3109
 msgid "<F5>\t\tUpdate"
 msgstr "<F5>\t\tОбновить"
 
-#: gitk:3550 gitk:3559
+#: gitk:3574 gitk:3583
 #, tcl-format
 msgid "Error creating temporary directory %s:"
 msgstr "Ошибка создания временного каталога %s:"
 
-#: gitk:3572
+#: gitk:3596
 #, tcl-format
 msgid "Error getting \"%s\" from %s:"
 msgstr "Ошибка получения «%s» из %s:"
 
-#: gitk:3635
+#: gitk:3659
 msgid "command failed:"
 msgstr "ошибка выполнения команды:"
 
-#: gitk:3784
+#: gitk:3808
 msgid "No such commit"
 msgstr "Коммит не найден"
 
-#: gitk:3798
+#: gitk:3822
 msgid "git gui blame: command failed:"
 msgstr "git gui blame: ошибка выполнения команды:"
 
-#: gitk:3829
+#: gitk:3853
 #, tcl-format
 msgid "Couldn't read merge head: %s"
 msgstr "Ошибка чтения MERGE_HEAD: %s"
 
-#: gitk:3837
+#: gitk:3861
 #, tcl-format
 msgid "Error reading index: %s"
 msgstr "Ошибка чтения индекса: %s"
 
-#: gitk:3862
+#: gitk:3886
 #, tcl-format
 msgid "Couldn't start git blame: %s"
 msgstr "Ошибка запуска git blame: %s"
 
-#: gitk:3865 gitk:6754
+#: gitk:3889 gitk:6778
 msgid "Searching"
 msgstr "Поиск"
 
-#: gitk:3897
+#: gitk:3921
 #, tcl-format
 msgid "Error running git blame: %s"
 msgstr "Ошибка выполнения git blame: %s"
 
-#: gitk:3925
+#: gitk:3949
 #, tcl-format
 msgid "That line comes from commit %s,  which is not in this view"
 msgstr "Эта строка принадлежит коммиту %s, который не показан в этом представлении"
 
-#: gitk:3939
+#: gitk:3963
 msgid "External diff viewer failed:"
 msgstr "Ошибка выполнения программы сравнения:"
 
-#: gitk:4070
+#: gitk:4067
+msgid "All files"
+msgstr "Все файлы"
+
+#: gitk:4091
+msgid "View"
+msgstr "Представление"
+
+#: gitk:4094
 msgid "Gitk view definition"
 msgstr "Gitk определение представлений"
 
-#: gitk:4074
+#: gitk:4098
 msgid "Remember this view"
 msgstr "Запомнить представление"
 
-#: gitk:4075
+#: gitk:4099
 msgid "References (space separated list):"
 msgstr "Ссылки (разделённые пробелом):"
 
-#: gitk:4076
+#: gitk:4100
 msgid "Branches & tags:"
 msgstr "Ветки и метки"
 
-#: gitk:4077
+#: gitk:4101
 msgid "All refs"
 msgstr "Все ссылки"
 
-#: gitk:4078
+#: gitk:4102
 msgid "All (local) branches"
 msgstr "Все (локальные) ветки"
 
-#: gitk:4079
+#: gitk:4103
 msgid "All tags"
 msgstr "Все метки"
 
-#: gitk:4080
+#: gitk:4104
 msgid "All remote-tracking branches"
 msgstr "Все внешние отслеживаемые ветки"
 
-#: gitk:4081
+#: gitk:4105
 msgid "Commit Info (regular expressions):"
 msgstr "Информация о коммите (регулярные выражения):"
 
-#: gitk:4082
+#: gitk:4106
 msgid "Author:"
 msgstr "Автор:"
 
-#: gitk:4083
+#: gitk:4107
 msgid "Committer:"
 msgstr "Коммитер:"
 
-#: gitk:4084
+#: gitk:4108
 msgid "Commit Message:"
 msgstr "Сообщение коммита:"
 
-#: gitk:4085
+#: gitk:4109
 msgid "Matches all Commit Info criteria"
 msgstr "Совпадает со всеми условиями информации о коммите"
 
-#: gitk:4086
+#: gitk:4110
 msgid "Matches no Commit Info criteria"
 msgstr "Не совпадает с условиями информации о коммите"
 
-#: gitk:4087
+#: gitk:4111
 msgid "Changes to Files:"
 msgstr "Изменения файлов:"
 
-#: gitk:4088
+#: gitk:4112
 msgid "Fixed String"
 msgstr "Обычная строка"
 
-#: gitk:4089
+#: gitk:4113
 msgid "Regular Expression"
 msgstr "Регулярное выражение:"
 
-#: gitk:4090
+#: gitk:4114
 msgid "Search string:"
 msgstr "Строка для поиска:"
 
-#: gitk:4091
+#: gitk:4115
 msgid ""
 "Commit Dates (\"2 weeks ago\", \"2009-03-17 15:27:38\", \"March 17, 2009 "
 "15:27:38\"):"
 msgstr "Даты коммита («2 недели назад», «2009-03-17 15:27:38», «17 марта 2009 15:27:38»):"
 
-#: gitk:4092
+#: gitk:4116
 msgid "Since:"
 msgstr "С даты:"
 
-#: gitk:4093
+#: gitk:4117
 msgid "Until:"
 msgstr "По дату:"
 
-#: gitk:4094
+#: gitk:4118
 msgid "Limit and/or skip a number of revisions (positive integer):"
 msgstr "Ограничить и/или пропустить количество редакций (положительное число):"
 
-#: gitk:4095
+#: gitk:4119
 msgid "Number to show:"
 msgstr "Показать количество:"
 
-#: gitk:4096
+#: gitk:4120
 msgid "Number to skip:"
 msgstr "Пропустить количество:"
 
-#: gitk:4097
+#: gitk:4121
 msgid "Miscellaneous options:"
 msgstr "Различные опции:"
 
-#: gitk:4098
+#: gitk:4122
 msgid "Strictly sort by date"
 msgstr "Строгая сортировка по дате"
 
-#: gitk:4099
+#: gitk:4123
 msgid "Mark branch sides"
 msgstr "Отметить стороны веток"
 
-#: gitk:4100
+#: gitk:4124
 msgid "Limit to first parent"
 msgstr "Ограничить первым предком"
 
-#: gitk:4101
+#: gitk:4125
 msgid "Simple history"
 msgstr "Упрощенная история"
 
-#: gitk:4102
+#: gitk:4126
 msgid "Additional arguments to git log:"
 msgstr "Дополнительные аргументы для git log:"
 
-#: gitk:4103
+#: gitk:4127
 msgid "Enter files and directories to include, one per line:"
 msgstr "Файлы и каталоги для ограничения истории, по одному на строку:"
 
-#: gitk:4104
+#: gitk:4128
 msgid "Command to generate more commits to include:"
 msgstr "Дополнительная команда для списка коммитов:"
 
-#: gitk:4228
+#: gitk:4252
 msgid "Gitk: edit view"
 msgstr "Gitk: изменить представление"
 
-#: gitk:4236
+#: gitk:4260
 msgid "-- criteria for selecting revisions"
 msgstr "— критерий поиска редакций"
 
-#: gitk:4241
+#: gitk:4265
 msgid "View Name"
 msgstr "Имя представления"
 
-#: gitk:4316
+#: gitk:4340
 msgid "Apply (F5)"
 msgstr "Применить (F5)"
 
-#: gitk:4354
+#: gitk:4378
 msgid "Error in commit selection arguments:"
 msgstr "Ошибка в параметрах выбора коммитов:"
 
-#: gitk:4409 gitk:4462 gitk:4924 gitk:4938 gitk:6208 gitk:12373 gitk:12374
+#: gitk:4433 gitk:4486 gitk:4948 gitk:4962 gitk:6232 gitk:12524 gitk:12525
 msgid "None"
 msgstr "Ни одного"
 
-#: gitk:5021 gitk:5026
+#: gitk:5045 gitk:5050
 msgid "Descendant"
 msgstr "Порождённое"
 
-#: gitk:5022
+#: gitk:5046
 msgid "Not descendant"
 msgstr "Не порождённое"
 
-#: gitk:5029 gitk:5034
+#: gitk:5053 gitk:5058
 msgid "Ancestor"
 msgstr "Предок"
 
-#: gitk:5030
+#: gitk:5054
 msgid "Not ancestor"
 msgstr "Не предок"
 
-#: gitk:5324
+#: gitk:5348
 msgid "Local changes checked in to index but not committed"
 msgstr "Проиндексированные изменения"
 
-#: gitk:5360
+#: gitk:5384
 msgid "Local uncommitted changes, not checked in to index"
 msgstr "Непроиндексированные изменения"
 
-#: gitk:7134
+#: gitk:7158
 msgid "and many more"
 msgstr "и многое другое"
 
-#: gitk:7137
+#: gitk:7161
 msgid "many"
 msgstr "много"
 
-#: gitk:7328
+#: gitk:7352
 msgid "Tags:"
 msgstr "Метки:"
 
-#: gitk:7345 gitk:7351 gitk:8825
+#: gitk:7369 gitk:7375 gitk:8854
 msgid "Parent"
 msgstr "Предок"
 
-#: gitk:7356
+#: gitk:7380
 msgid "Child"
 msgstr "Потомок"
 
-#: gitk:7365
+#: gitk:7389
 msgid "Branch"
 msgstr "Ветка"
 
-#: gitk:7368
+#: gitk:7392
 msgid "Follows"
 msgstr "Следует за"
 
-#: gitk:7371
+#: gitk:7395
 msgid "Precedes"
 msgstr "Предшествует"
 
-#: gitk:7966
+#: gitk:7990
 #, tcl-format
 msgid "Error getting diffs: %s"
 msgstr "Ошибка получения изменений: %s"
 
-#: gitk:8650
+#: gitk:8679
 msgid "Goto:"
 msgstr "Перейти к:"
 
-#: gitk:8671
+#: gitk:8700
 #, tcl-format
 msgid "Short SHA1 id %s is ambiguous"
 msgstr "Сокращённый SHA1 идентификатор %s неоднозначен"
 
-#: gitk:8678
+#: gitk:8707
 #, tcl-format
 msgid "Revision %s is not known"
 msgstr "Редакция %s не найдена"
 
-#: gitk:8688
+#: gitk:8717
 #, tcl-format
 msgid "SHA1 id %s is not known"
 msgstr "SHA1 идентификатор %s не найден"
 
-#: gitk:8690
+#: gitk:8719
 #, tcl-format
 msgid "Revision %s is not in the current view"
 msgstr "Редакция %s не найдена в текущем представлении"
 
-#: gitk:8832 gitk:8847
+#: gitk:8861 gitk:8876
 msgid "Date"
 msgstr "Дата"
 
-#: gitk:8835
+#: gitk:8864
 msgid "Children"
 msgstr "Потомки"
 
-#: gitk:8898
+#: gitk:8927
 #, tcl-format
 msgid "Reset %s branch to here"
 msgstr "Сбросить ветку %s на этот коммит"
 
-#: gitk:8900
+#: gitk:8929
 msgid "Detached head: can't reset"
 msgstr "Коммит не принадлежит ни одной ветке, сбросить невозможно"
 
-#: gitk:9005 gitk:9011
+#: gitk:9034 gitk:9040
 msgid "Skipping merge commit "
 msgstr "Пропускаю коммит-слияние"
 
-#: gitk:9020 gitk:9025
+#: gitk:9049 gitk:9054
 msgid "Error getting patch ID for "
 msgstr "Не удалось получить идентификатор патча для "
 
-#: gitk:9021 gitk:9026
+#: gitk:9050 gitk:9055
 msgid " - stopping\n"
 msgstr " — останов\n"
 
-#: gitk:9031 gitk:9034 gitk:9042 gitk:9056 gitk:9065
+#: gitk:9060 gitk:9063 gitk:9071 gitk:9085 gitk:9094
 msgid "Commit "
 msgstr "Коммит"
 
-#: gitk:9035
+#: gitk:9064
 msgid ""
 " is the same patch as\n"
 "       "
 msgstr " такой же патч, как и\n       "
 
-#: gitk:9043
+#: gitk:9072
 msgid ""
 " differs from\n"
 "       "
 msgstr " отличается от\n       "
 
-#: gitk:9045
+#: gitk:9074
 msgid ""
 "Diff of commits:\n"
 "\n"
 msgstr "Различия коммитов:\n\n"
 
-#: gitk:9057 gitk:9066
+#: gitk:9086 gitk:9095
 #, tcl-format
 msgid " has %s children - stopping\n"
 msgstr " является %s потомком — останов\n"
 
-#: gitk:9085
+#: gitk:9114
 #, tcl-format
 msgid "Error writing commit to file: %s"
 msgstr "Произошла ошибка при записи коммита в файл: %s"
 
-#: gitk:9091
+#: gitk:9120
 #, tcl-format
 msgid "Error diffing commits: %s"
 msgstr "Произошла ошибка при выводе различий коммитов: %s"
 
-#: gitk:9137
+#: gitk:9166
 msgid "Top"
 msgstr "Верх"
 
-#: gitk:9138
+#: gitk:9167
 msgid "From"
 msgstr "От"
 
-#: gitk:9143
+#: gitk:9172
 msgid "To"
 msgstr "До"
 
-#: gitk:9167
+#: gitk:9196
 msgid "Generate patch"
 msgstr "Создать патч"
 
-#: gitk:9169
+#: gitk:9198
 msgid "From:"
 msgstr "От:"
 
-#: gitk:9178
+#: gitk:9207
 msgid "To:"
 msgstr "До:"
 
-#: gitk:9187
+#: gitk:9216
 msgid "Reverse"
 msgstr "В обратном порядке"
 
-#: gitk:9189 gitk:9385
+#: gitk:9218 gitk:9428
 msgid "Output file:"
 msgstr "Файл для сохранения:"
 
-#: gitk:9195
+#: gitk:9224
 msgid "Generate"
 msgstr "Создать"
 
-#: gitk:9233
+#: gitk:9262
 msgid "Error creating patch:"
 msgstr "Ошибка создания патча:"
 
-#: gitk:9256 gitk:9373 gitk:9430
+#: gitk:9285 gitk:9416 gitk:9504
 msgid "ID:"
 msgstr "ID:"
 
-#: gitk:9265
+#: gitk:9294
 msgid "Tag name:"
 msgstr "Имя метки:"
 
-#: gitk:9268
+#: gitk:9297
 msgid "Tag message is optional"
 msgstr "Описание метки указывать не обязательно"
 
-#: gitk:9270
+#: gitk:9299
 msgid "Tag message:"
 msgstr "Описание метки:"
 
-#: gitk:9274 gitk:9439
+#: gitk:9303 gitk:9474
 msgid "Create"
 msgstr "Создать"
 
-#: gitk:9292
+#: gitk:9321
 msgid "No tag name specified"
 msgstr "Не задано имя метки"
 
-#: gitk:9296
+#: gitk:9325
 #, tcl-format
 msgid "Tag \"%s\" already exists"
 msgstr "Метка «%s» уже существует"
 
-#: gitk:9306
+#: gitk:9335
 msgid "Error creating tag:"
 msgstr "Ошибка создания метки:"
 
-#: gitk:9382
+#: gitk:9425
 msgid "Command:"
 msgstr "Команда:"
 
-#: gitk:9390
+#: gitk:9433
 msgid "Write"
 msgstr "Запись"
 
-#: gitk:9408
+#: gitk:9451
 msgid "Error writing commit:"
 msgstr "Произошла ошибка при записи коммита:"
 
-#: gitk:9435
+#: gitk:9473
+msgid "Create branch"
+msgstr "Создать ветку"
+
+#: gitk:9489
+#, tcl-format
+msgid "Rename branch %s"
+msgstr "Переименовать ветку %s"
+
+#: gitk:9490
+msgid "Rename"
+msgstr "Переименовать"
+
+#: gitk:9514
 msgid "Name:"
 msgstr "Имя:"
 
-#: gitk:9458
+#: gitk:9538
 msgid "Please specify a name for the new branch"
 msgstr "Укажите имя для новой ветки"
 
-#: gitk:9463
+#: gitk:9543
 #, tcl-format
 msgid "Branch '%s' already exists. Overwrite?"
 msgstr "Ветка «%s» уже существует. Переписать?"
 
-#: gitk:9530
+#: gitk:9587
+msgid "Please specify a new name for the branch"
+msgstr "Укажите имя для новой ветки"
+
+#: gitk:9650
 #, tcl-format
 msgid "Commit %s is already included in branch %s -- really re-apply it?"
 msgstr "Коммит %s уже включён в ветку %s. Продолжить операцию?"
 
-#: gitk:9535
+#: gitk:9655
 msgid "Cherry-picking"
-msgstr "Ð\9aопиÑ\80ование Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹"
+msgstr "Ð\9aопиÑ\80ование ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82а"
 
-#: gitk:9544
+#: gitk:9664
 #, tcl-format
 msgid ""
 "Cherry-pick failed because of local changes to file '%s'.\n"
 "Please commit, reset or stash your changes and try again."
-msgstr "Ð\9eÑ\82боÑ\80 Ð»Ñ\83Ñ\87Ñ\88его Ð½ÐµÐ²Ð¾Ð·Ð¼Ð¾Ð¶ÐµÐ½ Ð¸Ð·-за Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ Ð² Ñ\84айле Â«%s».\nÐ\97акомитьте, сбросьте или спрячьте изменения и повторите операцию."
+msgstr "Ð\9aопиÑ\80ование ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82а Ð½ÐµÐ²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ Ð¸Ð·-за Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ Ð² Ñ\84айле Â«%s».\nÐ\97акоммитьте, сбросьте или спрячьте изменения и повторите операцию."
 
-#: gitk:9550
+#: gitk:9670
 msgid ""
 "Cherry-pick failed because of merge conflict.\n"
 "Do you wish to run git citool to resolve it?"
 msgstr "Копирование изменений невозможно из-за незавершённой операции слияния.\nЗапустить git citool для завершения этой операции?"
 
-#: gitk:9566 gitk:9624
+#: gitk:9686 gitk:9744
 msgid "No changes committed"
 msgstr "Изменения не закоммичены"
 
-#: gitk:9593
+#: gitk:9713
 #, tcl-format
 msgid "Commit %s is not included in branch %s -- really revert it?"
 msgstr "Коммит %s не включён в ветку %s. Продолжить операцию?"
 
-#: gitk:9598
+#: gitk:9718
 msgid "Reverting"
-msgstr "Ð\92озвÑ\80аÑ\82 изменений"
+msgstr "Ð\9eбÑ\80аÑ\89ение изменений"
 
-#: gitk:9606
+#: gitk:9726
 #, tcl-format
 msgid ""
 "Revert failed because of local changes to the following files:%s Please "
 "commit, reset or stash  your changes and try again."
-msgstr "Возврат изменений коммита не удался из-за локальных изменений в указанных файлах: %s\nЗакомитьте, сбросьте или спрячьте изменения и повторите операцию."
+msgstr "Ð\92озвÑ\80аÑ\82 Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82а Ð½Ðµ Ñ\83далÑ\81Ñ\8f Ð¸Ð·-за Ð»Ð¾ÐºÐ°Ð»Ñ\8cнÑ\8bÑ\85 Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ Ð² Ñ\83казаннÑ\8bÑ\85 Ñ\84айлаÑ\85: %s\nÐ\97акоммиÑ\82Ñ\8cÑ\82е, Ñ\81бÑ\80оÑ\81Ñ\8cÑ\82е Ð¸Ð»Ð¸ Ñ\81пÑ\80Ñ\8fÑ\87Ñ\8cÑ\82е Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f Ð¸ Ð¿Ð¾Ð²Ñ\82оÑ\80иÑ\82е Ð¾Ð¿ÐµÑ\80аÑ\86иÑ\8e."
 
-#: gitk:9610
+#: gitk:9730
 msgid ""
 "Revert failed because of merge conflict.\n"
 " Do you wish to run git citool to resolve it?"
 msgstr "Возврат изменений невозможен из-за незавершённой операции слияния.\nЗапустить git citool для завершения этой операции?"
 
-#: gitk:9653
+#: gitk:9773
 msgid "Confirm reset"
 msgstr "Подтвердите операцию перехода"
 
-#: gitk:9655
+#: gitk:9775
 #, tcl-format
 msgid "Reset branch %s to %s?"
 msgstr "Сбросить ветку %s на коммит %s?"
 
-#: gitk:9657
+#: gitk:9777
 msgid "Reset type:"
 msgstr "Тип операции перехода:"
 
-#: gitk:9660
+#: gitk:9780
 msgid "Soft: Leave working tree and index untouched"
 msgstr "Лёгкий: оставить рабочий каталог и индекс неизменными"
 
-#: gitk:9663
+#: gitk:9783
 msgid "Mixed: Leave working tree untouched, reset index"
 msgstr "Смешанный: оставить рабочий каталог неизменным, установить индекс"
 
-#: gitk:9666
+#: gitk:9786
 msgid ""
 "Hard: Reset working tree and index\n"
 "(discard ALL local changes)"
 msgstr "Жесткий: переписать индекс и рабочий каталог\n(все изменения в рабочем каталоге будут потеряны)"
 
-#: gitk:9683
+#: gitk:9803
 msgid "Resetting"
 msgstr "Сброс"
 
-#: gitk:9743
+#: gitk:9876
+#, tcl-format
+msgid "A local branch named %s exists already"
+msgstr "Локальная ветка с именем %s уже существует"
+
+#: gitk:9884
 msgid "Checking out"
 msgstr "Переход"
 
-#: gitk:9796
+#: gitk:9943
 msgid "Cannot delete the currently checked-out branch"
 msgstr "Активная ветка не может быть удалена"
 
-#: gitk:9802
+#: gitk:9949
 #, tcl-format
 msgid ""
 "The commits on branch %s aren't on any other branch.\n"
 "Really delete branch %s?"
 msgstr "Коммиты из ветки %s не принадлежат больше никакой другой ветке.\nДействительно удалить ветку %s?"
 
-#: gitk:9833
+#: gitk:9980
 #, tcl-format
 msgid "Tags and heads: %s"
 msgstr "Метки и ветки: %s"
 
-#: gitk:9850
+#: gitk:9997
 msgid "Filter"
 msgstr "Фильтровать"
 
-#: gitk:10146
+#: gitk:10293
 msgid ""
 "Error reading commit topology information; branch and preceding/following "
 "tag information will be incomplete."
 msgstr "Ошибка чтения истории проекта; информация о ветках и коммитах вокруг меток (до/после) может быть неполной."
 
-#: gitk:11123
+#: gitk:11270
 msgid "Tag"
 msgstr "Метка"
 
-#: gitk:11127
+#: gitk:11274
 msgid "Id"
 msgstr "Id"
 
-#: gitk:11210
+#: gitk:11357
 msgid "Gitk font chooser"
 msgstr "Шрифт Gitk"
 
-#: gitk:11227
+#: gitk:11374
 msgid "B"
 msgstr "Ж"
 
-#: gitk:11230
+#: gitk:11377
 msgid "I"
 msgstr "К"
 
-#: gitk:11348
+#: gitk:11495
 msgid "Commit list display options"
 msgstr "Параметры показа списка коммитов"
 
-#: gitk:11351
+#: gitk:11498
 msgid "Maximum graph width (lines)"
 msgstr "Макс. ширина графа (строк)"
 
-#: gitk:11355
+#: gitk:11502
 #, no-tcl-format
 msgid "Maximum graph width (% of pane)"
 msgstr "Макс. ширина графа (% ширины панели)"
 
-#: gitk:11358
+#: gitk:11505
 msgid "Show local changes"
 msgstr "Показывать изменения в рабочем каталоге"
 
-#: gitk:11361
+#: gitk:11508
 msgid "Auto-select SHA1 (length)"
 msgstr "Автоматически выделить SHA1 (длинна)"
 
-#: gitk:11365
+#: gitk:11512
 msgid "Hide remote refs"
 msgstr "Скрыть внешние ссылки"
 
-#: gitk:11369
+#: gitk:11516
 msgid "Diff display options"
 msgstr "Параметры показа изменений"
 
-#: gitk:11371
+#: gitk:11518
 msgid "Tab spacing"
 msgstr "Ширина табуляции"
 
-#: gitk:11374
+#: gitk:11521
 msgid "Display nearby tags/heads"
 msgstr "Показывать близкие метки/ветки"
 
-#: gitk:11377
+#: gitk:11524
 msgid "Maximum # tags/heads to show"
 msgstr "Показывать максимальное количество меток/веток"
 
-#: gitk:11380
+#: gitk:11527
 msgid "Limit diffs to listed paths"
 msgstr "Ограничить показ изменений выбранными файлами"
 
-#: gitk:11383
+#: gitk:11530
 msgid "Support per-file encodings"
 msgstr "Поддержка кодировок в отдельных файлах"
 
-#: gitk:11389 gitk:11536
+#: gitk:11536 gitk:11683
 msgid "External diff tool"
 msgstr "Программа для показа изменений"
 
-#: gitk:11390
+#: gitk:11537
 msgid "Choose..."
 msgstr "Выберите..."
 
-#: gitk:11395
+#: gitk:11542
 msgid "General options"
 msgstr "Общие опции"
 
-#: gitk:11398
+#: gitk:11545
 msgid "Use themed widgets"
 msgstr "Использовать стили виджетов"
 
-#: gitk:11400
+#: gitk:11547
 msgid "(change requires restart)"
 msgstr "(изменение потребует перезапуск)"
 
-#: gitk:11402
+#: gitk:11549
 msgid "(currently unavailable)"
 msgstr "(недоступно в данный момент)"
 
-#: gitk:11413
+#: gitk:11560
 msgid "Colors: press to choose"
 msgstr "Цвета: нажмите для выбора"
 
-#: gitk:11416
+#: gitk:11563
 msgid "Interface"
 msgstr "Интерфейс"
 
-#: gitk:11417
+#: gitk:11564
 msgid "interface"
 msgstr "интерфейс"
 
-#: gitk:11420
+#: gitk:11567
 msgid "Background"
 msgstr "Фон"
 
-#: gitk:11421 gitk:11451
+#: gitk:11568 gitk:11598
 msgid "background"
 msgstr "фон"
 
-#: gitk:11424
+#: gitk:11571
 msgid "Foreground"
 msgstr "Передний план"
 
-#: gitk:11425
+#: gitk:11572
 msgid "foreground"
 msgstr "передний план"
 
-#: gitk:11428
+#: gitk:11575
 msgid "Diff: old lines"
 msgstr "Изменения: старый текст"
 
-#: gitk:11429
+#: gitk:11576
 msgid "diff old lines"
 msgstr "старый текст изменения"
 
-#: gitk:11433
+#: gitk:11580
 msgid "Diff: new lines"
 msgstr "Изменения: новый текст"
 
-#: gitk:11434
+#: gitk:11581
 msgid "diff new lines"
 msgstr "новый текст изменения"
 
-#: gitk:11438
+#: gitk:11585
 msgid "Diff: hunk header"
 msgstr "Изменения: заголовок блока"
 
-#: gitk:11440
+#: gitk:11587
 msgid "diff hunk header"
 msgstr "заголовок блока изменений"
 
-#: gitk:11444
+#: gitk:11591
 msgid "Marked line bg"
 msgstr "Фон выбранной строки"
 
-#: gitk:11446
+#: gitk:11593
 msgid "marked line background"
 msgstr "фон выбранной строки"
 
-#: gitk:11450
+#: gitk:11597
 msgid "Select bg"
 msgstr "Выберите фон"
 
-#: gitk:11459
+#: gitk:11606
 msgid "Fonts: press to choose"
 msgstr "Шрифт: нажмите для выбора"
 
-#: gitk:11461
+#: gitk:11608
 msgid "Main font"
 msgstr "Основной шрифт"
 
-#: gitk:11462
+#: gitk:11609
 msgid "Diff display font"
 msgstr "Шрифт показа изменений"
 
-#: gitk:11463
+#: gitk:11610
 msgid "User interface font"
 msgstr "Шрифт интерфейса"
 
-#: gitk:11485
+#: gitk:11632
 msgid "Gitk preferences"
 msgstr "Настройки Gitk"
 
-#: gitk:11494
+#: gitk:11641
 msgid "General"
 msgstr "Общие"
 
-#: gitk:11495
+#: gitk:11642
 msgid "Colors"
 msgstr "Цвета"
 
-#: gitk:11496
+#: gitk:11643
 msgid "Fonts"
 msgstr "Шрифты"
 
-#: gitk:11546
+#: gitk:11693
 #, tcl-format
 msgid "Gitk: choose color for %s"
 msgstr "Gitk: выберите цвет для %s"
 
-#: gitk:12059
+#: gitk:12206
 msgid ""
 "Sorry, gitk cannot run with this version of Tcl/Tk.\n"
 " Gitk requires at least Tcl/Tk 8.4."
 msgstr "К сожалению gitk не может работать с этой версий Tcl/Tk.\nТребуется как минимум Tcl/Tk 8.4."
 
-#: gitk:12269
+#: gitk:12416
 msgid "Cannot find a git repository here."
 msgstr "Git-репозитарий не найден в текущем каталоге."
 
-#: gitk:12316
+#: gitk:12463
 #, tcl-format
 msgid "Ambiguous argument '%s': both revision and filename"
 msgstr "Неоднозначный аргумент «%s»: существует как редакция и как имя файла"
 
-#: gitk:12328
+#: gitk:12475
 msgid "Bad arguments to gitk:"
 msgstr "Неправильные аргументы для gitk:"
index d9d4e87a44a5cddafe957f276248ceec3c3ebc40..2a06fe5bbcf826c4a3312b0cff1e1ff53cf69490 100644 (file)
@@ -374,14 +374,14 @@ msgid ""
 "\n"
 "Gitk - a commit viewer for git\n"
 "\n"
-"Copyright © 2005-2014 Paul Mackerras\n"
+"Copyright © 2005-2016 Paul Mackerras\n"
 "\n"
 "Use and redistribute under the terms of the GNU General Public License"
 msgstr ""
 "\n"
 "Gitk - en incheckningsvisare för git\n"
 "\n"
-"Copyright © 2005-2014 Paul Mackerras\n"
+"Copyright © 2005-2016 Paul Mackerras\n"
 "\n"
 "Använd och vidareförmedla enligt villkoren i GNU General Public License"
 
@@ -1385,21 +1385,6 @@ msgstr "Felaktiga argument till gitk:"
 #~ msgid "mc"
 #~ msgstr "mc"
 
-#~ msgid ""
-#~ "\n"
-#~ "Gitk - a commit viewer for git\n"
-#~ "\n"
-#~ "Copyright © 2005-2015 Paul Mackerras\n"
-#~ "\n"
-#~ "Use and redistribute under the terms of the GNU General Public License"
-#~ msgstr ""
-#~ "\n"
-#~ "Gitk - en incheckningsvisare för git\n"
-#~ "\n"
-#~ "Copyright © 2005-2015 Paul Mackerras\n"
-#~ "\n"
-#~ "Använd och vidareförmedla enligt villkoren i GNU General Public License"
-
 #~ msgid "next"
 #~ msgstr "nästa"
 
index 8966812368a626e8da9f42012b69f233b4181642..59674986604891d9901e87c163e61dd39db14184 100644 (file)
@@ -363,14 +363,14 @@ msgid ""
 "\n"
 "Gitk - a commit viewer for git\n"
 "\n"
-"Copyright © 2005-2014 Paul Mackerras\n"
+"Copyright © 2005-2016 Paul Mackerras\n"
 "\n"
 "Use and redistribute under the terms of the GNU General Public License"
 msgstr ""
 "\n"
 "Gitk - ứng dụng để xem các lần chuyển giao dành cho git\n"
 "\n"
-"Bản quyền © 2005-2014 Paul Mackerras\n"
+"Bản quyền © 2005-2016 Paul Mackerras\n"
 "\n"
 "Dùng và phân phối lại phần mềm này theo các điều khoản của Giấy Phép Công GNU"
 
index ea68885ad5b73aa63acc936eee52a61252420892..d2d4fd3a656e3f4953aea5eda3eea435f37f237e 100644 (file)
@@ -1,8 +1,9 @@
 #ifndef GPG_INTERFACE_H
 #define GPG_INTERFACE_H
 
-#define GPG_VERIFY_VERBOSE     1
-#define GPG_VERIFY_RAW         2
+#define GPG_VERIFY_VERBOSE             1
+#define GPG_VERIFY_RAW                 2
+#define GPG_VERIFY_OMIT_STATUS 4
 
 struct signature_check {
        char *payload;
diff --git a/graph.c b/graph.c
index d4e8519c904df6e18869de527f7fe6d57adf2a26..0649007704ac635af163a4e1016121744a951d1c 100644 (file)
--- a/graph.c
+++ b/graph.c
@@ -3,6 +3,7 @@
 #include "color.h"
 #include "graph.h"
 #include "revision.h"
+#include "argv-array.h"
 
 /* Internal API */
 
@@ -79,6 +80,26 @@ static void graph_show_line_prefix(const struct diff_options *diffopt)
 static const char **column_colors;
 static unsigned short column_colors_max;
 
+static void parse_graph_colors_config(struct argv_array *colors, const char *string)
+{
+       const char *end, *start;
+
+       start = string;
+       end = string + strlen(string);
+       while (start < end) {
+               const char *comma = strchrnul(start, ',');
+               char color[COLOR_MAXLEN];
+
+               if (!color_parse_mem(start, comma - start, color))
+                       argv_array_push(colors, color);
+               else
+                       warning(_("ignore invalid color '%.*s' in log.graphColors"),
+                               (int)(comma - start), start);
+               start = comma + 1;
+       }
+       argv_array_push(colors, GIT_COLOR_RESET);
+}
+
 void graph_set_column_colors(const char **colors, unsigned short colors_max)
 {
        column_colors = colors;
@@ -238,9 +259,22 @@ struct git_graph *graph_init(struct rev_info *opt)
 {
        struct git_graph *graph = xmalloc(sizeof(struct git_graph));
 
-       if (!column_colors)
-               graph_set_column_colors(column_colors_ansi,
-                                       column_colors_ansi_max);
+       if (!column_colors) {
+               char *string;
+               if (git_config_get_string("log.graphcolors", &string)) {
+                       /* not configured -- use default */
+                       graph_set_column_colors(column_colors_ansi,
+                                               column_colors_ansi_max);
+               } else {
+                       static struct argv_array custom_colors = ARGV_ARRAY_INIT;
+                       argv_array_clear(&custom_colors);
+                       parse_graph_colors_config(&custom_colors, string);
+                       free(string);
+                       /* graph_set_column_colors takes a max-index, not a count */
+                       graph_set_column_colors(custom_colors.argv,
+                                               custom_colors.argc - 1);
+               }
+       }
 
        graph->commit = NULL;
        graph->revs = opt;
diff --git a/grep.c b/grep.c
index 1194d35b5d06d7960d4464884952e755914e2519..0dbdc1d007893042dc1005478f3023eed4ecfc12 100644 (file)
--- a/grep.c
+++ b/grep.c
@@ -1735,12 +1735,23 @@ void grep_source_init(struct grep_source *gs, enum grep_source_type type,
        case GREP_SOURCE_FILE:
                gs->identifier = xstrdup(identifier);
                break;
+       case GREP_SOURCE_SUBMODULE:
+               if (!identifier) {
+                       gs->identifier = NULL;
+                       break;
+               }
+               /*
+                * FALL THROUGH
+                * If the identifier is non-NULL (in the submodule case) it
+                * will be a SHA1 that needs to be copied.
+                */
        case GREP_SOURCE_SHA1:
                gs->identifier = xmalloc(20);
                hashcpy(gs->identifier, identifier);
                break;
        case GREP_SOURCE_BUF:
                gs->identifier = NULL;
+               break;
        }
 }
 
@@ -1760,6 +1771,7 @@ void grep_source_clear_data(struct grep_source *gs)
        switch (gs->type) {
        case GREP_SOURCE_FILE:
        case GREP_SOURCE_SHA1:
+       case GREP_SOURCE_SUBMODULE:
                free(gs->buf);
                gs->buf = NULL;
                gs->size = 0;
@@ -1831,8 +1843,10 @@ static int grep_source_load(struct grep_source *gs)
                return grep_source_load_sha1(gs);
        case GREP_SOURCE_BUF:
                return gs->buf ? 0 : -1;
+       case GREP_SOURCE_SUBMODULE:
+               break;
        }
-       die("BUG: invalid grep_source type");
+       die("BUG: invalid grep_source type to load");
 }
 
 void grep_source_load_driver(struct grep_source *gs)
diff --git a/grep.h b/grep.h
index 5856a23e4620773cbda2e2944f93946c2701f923..267534ca24df532505854e1af31c53ed01bab24e 100644 (file)
--- a/grep.h
+++ b/grep.h
@@ -161,6 +161,7 @@ struct grep_source {
                GREP_SOURCE_SHA1,
                GREP_SOURCE_FILE,
                GREP_SOURCE_BUF,
+               GREP_SOURCE_SUBMODULE,
        } type;
        void *identifier;
 
diff --git a/help.c b/help.c
index 53e2a67e0052b7abb9f01e075f76c4eb5f35cbfc..bc6cd19cf3a5e4300e32cbdd437b2d9231fd2d89 100644 (file)
--- a/help.c
+++ b/help.c
@@ -105,7 +105,22 @@ static int is_executable(const char *name)
                return 0;
 
 #if defined(GIT_WINDOWS_NATIVE)
-{      /* cannot trust the executable bit, peek into the file instead */
+       /*
+        * On Windows there is no executable bit. The file extension
+        * indicates whether it can be run as an executable, and Git
+        * has special-handling to detect scripts and launch them
+        * through the indicated script interpreter. We test for the
+        * file extension first because virus scanners may make
+        * it quite expensive to open many files.
+        */
+       if (ends_with(name, ".exe"))
+               return S_IXUSR;
+
+{
+       /*
+        * Now that we know it does not have an executable extension,
+        * peek into the file instead.
+        */
        char buf[3] = { 0 };
        int n;
        int fd = open(name, O_RDONLY);
@@ -113,8 +128,8 @@ static int is_executable(const char *name)
        if (fd >= 0) {
                n = read(fd, buf, 2);
                if (n == 2)
-                       /* DOS executables start with "MZ" */
-                       if (!strcmp(buf, "#!") || !strcmp(buf, "MZ"))
+                       /* look for a she-bang */
+                       if (!strcmp(buf, "#!"))
                                st.st_mode |= S_IXUSR;
                close(fd);
        }
index 0b2425531a8120fb29f37ee473a1e6e974959605..b34b6ace7cd80a482eae16e2063aa9d8960e8729 100644 (file)
@@ -3,6 +3,7 @@
 #include "walker.h"
 #include "http.h"
 #include "list.h"
+#include "transport.h"
 
 struct alt_base {
        char *base;
@@ -160,6 +161,32 @@ static void prefetch(struct walker *walker, unsigned char *sha1)
 #endif
 }
 
+static int is_alternate_allowed(const char *url)
+{
+       const char *protocols[] = {
+               "http", "https", "ftp", "ftps"
+       };
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(protocols); i++) {
+               const char *end;
+               if (skip_prefix(url, protocols[i], &end) &&
+                   starts_with(end, "://"))
+                       break;
+       }
+
+       if (i >= ARRAY_SIZE(protocols)) {
+               warning("ignoring alternate with unknown protocol: %s", url);
+               return 0;
+       }
+       if (!is_transport_allowed(protocols[i], 0)) {
+               warning("ignoring alternate with restricted protocol: %s", url);
+               return 0;
+       }
+
+       return 1;
+}
+
 static void process_alternates_response(void *callback_data)
 {
        struct alternates_request *alt_req =
@@ -274,18 +301,20 @@ static void process_alternates_response(void *callback_data)
                                struct strbuf target = STRBUF_INIT;
                                strbuf_add(&target, base, serverlen);
                                strbuf_add(&target, data + i, posn - i - 7);
-                               if (walker->get_verbosely)
-                                       fprintf(stderr, "Also look at %s\n",
+
+                               if (is_alternate_allowed(target.buf)) {
+                                       warning("adding alternate object store: %s",
                                                target.buf);
-                               newalt = xmalloc(sizeof(*newalt));
-                               newalt->next = NULL;
-                               newalt->base = strbuf_detach(&target, NULL);
-                               newalt->got_indices = 0;
-                               newalt->packs = NULL;
-
-                               while (tail->next != NULL)
-                                       tail = tail->next;
-                               tail->next = newalt;
+                                       newalt = xmalloc(sizeof(*newalt));
+                                       newalt->next = NULL;
+                                       newalt->base = strbuf_detach(&target, NULL);
+                                       newalt->got_indices = 0;
+                                       newalt->packs = NULL;
+
+                                       while (tail->next != NULL)
+                                               tail = tail->next;
+                                       tail->next = newalt;
+                               }
                        }
                }
                i = posn + 1;
@@ -302,6 +331,9 @@ static void fetch_alternates(struct walker *walker, const char *base)
        struct alternates_request alt_req;
        struct walker_data *cdata = walker->data;
 
+       if (http_follow_config != HTTP_FOLLOW_ALWAYS)
+               return;
+
        /*
         * If another request has already started fetching alternates,
         * wait for them to arrive and return to processing this request's
@@ -480,10 +512,13 @@ static int fetch_object(struct walker *walker, unsigned char *sha1)
         * we turned off CURLOPT_FAILONERROR to avoid losing a
         * persistent connection and got CURLE_OK.
         */
-       if (req->http_code == 404 && req->curl_result == CURLE_OK &&
+       if (req->http_code >= 300 && req->curl_result == CURLE_OK &&
                        (starts_with(req->url, "http://") ||
-                        starts_with(req->url, "https://")))
+                        starts_with(req->url, "https://"))) {
                req->curl_result = CURLE_HTTP_RETURNED_ERROR;
+               xsnprintf(req->errorstr, sizeof(req->errorstr),
+                         "HTTP request failed");
+       }
 
        if (obj_req->state == ABORTED) {
                ret = error("Request for %s aborted", hex);
diff --git a/http.c b/http.c
index 4c4a812fcc39509e32fbcae3db21871b97a1a5eb..90a1c0f1131c4a5fcbc50d6cc81c1be9cef3cd71 100644 (file)
--- a/http.c
+++ b/http.c
@@ -111,6 +111,8 @@ static int http_proactive_auth;
 static const char *user_agent;
 static int curl_empty_auth;
 
+enum http_follow_config http_follow_config = HTTP_FOLLOW_INITIAL;
+
 #if LIBCURL_VERSION_NUM >= 0x071700
 /* Use CURLOPT_KEYPASSWD as is */
 #elif LIBCURL_VERSION_NUM >= 0x070903
@@ -366,6 +368,16 @@ static int http_options(const char *var, const char *value, void *cb)
                return 0;
        }
 
+       if (!strcmp("http.followredirects", var)) {
+               if (value && !strcmp(value, "initial"))
+                       http_follow_config = HTTP_FOLLOW_INITIAL;
+               else if (git_config_bool(var, value))
+                       http_follow_config = HTTP_FOLLOW_ALWAYS;
+               else
+                       http_follow_config = HTTP_FOLLOW_NONE;
+               return 0;
+       }
+
        /* Fall back on the default ones */
        return git_default_config(var, value, cb);
 }
@@ -624,11 +636,25 @@ void setup_curl_trace(CURL *handle)
        curl_easy_setopt(handle, CURLOPT_DEBUGDATA, NULL);
 }
 
+static long get_curl_allowed_protocols(int from_user)
+{
+       long allowed_protocols = 0;
+
+       if (is_transport_allowed("http", from_user))
+               allowed_protocols |= CURLPROTO_HTTP;
+       if (is_transport_allowed("https", from_user))
+               allowed_protocols |= CURLPROTO_HTTPS;
+       if (is_transport_allowed("ftp", from_user))
+               allowed_protocols |= CURLPROTO_FTP;
+       if (is_transport_allowed("ftps", from_user))
+               allowed_protocols |= CURLPROTO_FTPS;
+
+       return allowed_protocols;
+}
 
 static CURL *get_curl_handle(void)
 {
        CURL *result = curl_easy_init();
-       long allowed_protocols = 0;
 
        if (!result)
                die("curl_easy_init failed");
@@ -717,7 +743,6 @@ static CURL *get_curl_handle(void)
                                 curl_low_speed_time);
        }
 
-       curl_easy_setopt(result, CURLOPT_FOLLOWLOCATION, 1);
        curl_easy_setopt(result, CURLOPT_MAXREDIRS, 20);
 #if LIBCURL_VERSION_NUM >= 0x071301
        curl_easy_setopt(result, CURLOPT_POSTREDIR, CURL_REDIR_POST_ALL);
@@ -725,19 +750,13 @@ static CURL *get_curl_handle(void)
        curl_easy_setopt(result, CURLOPT_POST301, 1);
 #endif
 #if LIBCURL_VERSION_NUM >= 0x071304
-       if (is_transport_allowed("http"))
-               allowed_protocols |= CURLPROTO_HTTP;
-       if (is_transport_allowed("https"))
-               allowed_protocols |= CURLPROTO_HTTPS;
-       if (is_transport_allowed("ftp"))
-               allowed_protocols |= CURLPROTO_FTP;
-       if (is_transport_allowed("ftps"))
-               allowed_protocols |= CURLPROTO_FTPS;
-       curl_easy_setopt(result, CURLOPT_REDIR_PROTOCOLS, allowed_protocols);
+       curl_easy_setopt(result, CURLOPT_REDIR_PROTOCOLS,
+                        get_curl_allowed_protocols(0));
+       curl_easy_setopt(result, CURLOPT_PROTOCOLS,
+                        get_curl_allowed_protocols(-1));
 #else
-       if (transport_restrict_protocols())
-               warning("protocol restrictions not applied to curl redirects because\n"
-                       "your curl version is too old (>= 7.19.4)");
+       warning("protocol restrictions not applied to curl redirects because\n"
+               "your curl version is too old (>= 7.19.4)");
 #endif
        if (getenv("GIT_CURL_VERBOSE"))
                curl_easy_setopt(result, CURLOPT_VERBOSE, 1L);
@@ -1044,6 +1063,16 @@ struct active_request_slot *get_active_slot(void)
        curl_easy_setopt(slot->curl, CURLOPT_FAILONERROR, 1);
        curl_easy_setopt(slot->curl, CURLOPT_RANGE, NULL);
 
+       /*
+        * Default following to off unless "ALWAYS" is configured; this gives
+        * callers a sane starting point, and they can tweak for individual
+        * HTTP_FOLLOW_* cases themselves.
+        */
+       if (http_follow_config == HTTP_FOLLOW_ALWAYS)
+               curl_easy_setopt(slot->curl, CURLOPT_FOLLOWLOCATION, 1);
+       else
+               curl_easy_setopt(slot->curl, CURLOPT_FOLLOWLOCATION, 0);
+
 #if LIBCURL_VERSION_NUM >= 0x070a08
        curl_easy_setopt(slot->curl, CURLOPT_IPRESOLVE, git_curl_ipresolve);
 #endif
@@ -1286,9 +1315,12 @@ static int handle_curl_result(struct slot_results *results)
         * If we see a failing http code with CURLE_OK, we have turned off
         * FAILONERROR (to keep the server's custom error response), and should
         * translate the code into failure here.
+        *
+        * Likewise, if we see a redirect (30x code), that means we turned off
+        * redirect-following, and we should treat the result as an error.
         */
        if (results->curl_result == CURLE_OK &&
-           results->http_code >= 400) {
+           results->http_code >= 300) {
                results->curl_result = CURLE_HTTP_RETURNED_ERROR;
                /*
                 * Normally curl will already have put the "reason phrase"
@@ -1607,6 +1639,9 @@ static int http_request(const char *url,
                strbuf_addstr(&buf, " no-cache");
        if (options && options->keep_error)
                curl_easy_setopt(slot->curl, CURLOPT_FAILONERROR, 0);
+       if (options && options->initial_request &&
+           http_follow_config == HTTP_FOLLOW_INITIAL)
+               curl_easy_setopt(slot->curl, CURLOPT_FOLLOWLOCATION, 1);
 
        headers = curl_slist_append(headers, buf.buf);
 
@@ -1655,16 +1690,16 @@ static int http_request(const char *url,
  *
  * Note that this assumes a sane redirect scheme. It's entirely possible
  * in the example above to end up at a URL that does not even end in
- * "info/refs".  In such a case we simply punt, as there is not much we can
- * do (and such a scheme is unlikely to represent a real git repository,
- * which means we are likely about to abort anyway).
+ * "info/refs".  In such a case we die. There's not much we can do, such a
+ * scheme is unlikely to represent a real git repository, and failing to
+ * rewrite the base opens options for malicious redirects to do funny things.
  */
 static int update_url_from_redirect(struct strbuf *base,
                                    const char *asked,
                                    const struct strbuf *got)
 {
        const char *tail;
-       size_t tail_len;
+       size_t new_len;
 
        if (!strcmp(asked, got->buf))
                return 0;
@@ -1673,14 +1708,16 @@ static int update_url_from_redirect(struct strbuf *base,
                die("BUG: update_url_from_redirect: %s is not a superset of %s",
                    asked, base->buf);
 
-       tail_len = strlen(tail);
-
-       if (got->len < tail_len ||
-           strcmp(tail, got->buf + got->len - tail_len))
-               return 0; /* insane redirect scheme */
+       new_len = got->len;
+       if (!strip_suffix_mem(got->buf, &new_len, tail))
+               die(_("unable to update url base from redirection:\n"
+                     "  asked for: %s\n"
+                     "   redirect: %s"),
+                   asked, got->buf);
 
        strbuf_reset(base);
-       strbuf_add(base, got->buf, got->len - tail_len);
+       strbuf_add(base, got->buf, new_len);
+
        return 1;
 }
 
@@ -2028,7 +2065,7 @@ static size_t fwrite_sha1_file(char *ptr, size_t eltsize, size_t nmemb,
                if (c != CURLE_OK)
                        die("BUG: curl_easy_getinfo for HTTP code failed: %s",
                                curl_easy_strerror(c));
-               if (slot->http_code >= 400)
+               if (slot->http_code >= 300)
                        return size;
        }
 
diff --git a/http.h b/http.h
index 5ab9d9c329378f4f254c9d912dd7f05105ea6695..02bccb7b0caf9f2b1be0b98cb16c6fc84b95cc74 100644 (file)
--- a/http.h
+++ b/http.h
@@ -116,6 +116,13 @@ extern struct credential http_auth;
 
 extern char curl_errorstr[CURL_ERROR_SIZE];
 
+enum http_follow_config {
+       HTTP_FOLLOW_NONE,
+       HTTP_FOLLOW_ALWAYS,
+       HTTP_FOLLOW_INITIAL
+};
+extern enum http_follow_config http_follow_config;
+
 static inline int missing__target(int code, int result)
 {
        return  /* file:// URL -- do we ever use one??? */
@@ -139,7 +146,8 @@ extern char *get_remote_object_url(const char *url, const char *hex,
 /* Options for http_get_*() */
 struct http_get_options {
        unsigned no_cache:1,
-                keep_error:1;
+                keep_error:1,
+                initial_request:1;
 
        /* If non-NULL, returns the content-type of the response. */
        struct strbuf *content_type;
index 9268cdf325f3881104d6d12ef31639536b15dcb2..aa69210d8b3a9063517d2d84153dc3ba738bef30 100644 (file)
@@ -174,8 +174,16 @@ int hold_lock_file_for_update_timeout(struct lock_file *lk, const char *path,
                                      int flags, long timeout_ms)
 {
        int fd = lock_file_timeout(lk, path, flags, timeout_ms);
-       if (fd < 0 && (flags & LOCK_DIE_ON_ERROR))
-               unable_to_lock_die(path, errno);
+       if (fd < 0) {
+               if (flags & LOCK_DIE_ON_ERROR)
+                       unable_to_lock_die(path, errno);
+               if (flags & LOCK_REPORT_ON_ERROR) {
+                       struct strbuf buf = STRBUF_INIT;
+                       unable_to_lock_message(path, errno, &buf);
+                       error("%s", buf.buf);
+                       strbuf_release(&buf);
+               }
+       }
        return fd;
 }
 
index d26ad27b2b2df207872cb20ce9cc0299ee0aff8e..7b715f9e7754882061dde0220d13fdc7d0d6c252 100644 (file)
@@ -129,10 +129,16 @@ struct lock_file {
 /*
  * If a lock is already taken for the file, `die()` with an error
  * message. If this flag is not specified, trying to lock a file that
- * is already locked returns -1 to the caller.
+ * is already locked silently returns -1 to the caller, or ...
  */
 #define LOCK_DIE_ON_ERROR 1
 
+/*
+ * ... this flag can be passed instead to return -1 and give the usual
+ * error message upon an error.
+ */
+#define LOCK_REPORT_ON_ERROR 4
+
 /*
  * Usually symbolic links in the destination path are resolved. This
  * means that (1) the lockfile is created by adding ".lock" to the
index 2fb3877ee44e9cdc83c43fa23971f02a94b5a49f..a489d9d0fbcc37a1198247a8daae4b3104ebe284 100644 (file)
@@ -710,7 +710,8 @@ static void flush_inbody_header_accum(struct mailinfo *mi)
 {
        if (!mi->inbody_header_accum.len)
                return;
-       assert(check_header(mi, &mi->inbody_header_accum, mi->s_hdr_data, 0));
+       if (!check_header(mi, &mi->inbody_header_accum, mi->s_hdr_data, 0))
+               die("BUG: inbody_header_accum, if not empty, must always contain a valid in-body header");
        strbuf_reset(&mi->inbody_header_accum);
 }
 
index 9041c2f149c01134ce02119354455894533e713c..d3272094430ccd3914c8214df73ba8e11363cfa7 100644 (file)
@@ -235,6 +235,8 @@ static int add_cacheinfo(struct merge_options *o,
                struct cache_entry *nce;
 
                nce = refresh_cache_entry(ce, CE_MATCH_REFRESH | CE_MATCH_IGNORE_MISSING);
+               if (!nce)
+                       return err(o, _("addinfo_cache failed for path '%s'"), path);
                if (nce != ce)
                        ret = add_cache_entry(nce, options);
        }
@@ -388,12 +390,10 @@ static struct string_list *get_unmerged(void)
        return unmerged;
 }
 
-static int string_list_df_name_compare(const void *a, const void *b)
+static int string_list_df_name_compare(const char *one, const char *two)
 {
-       const struct string_list_item *one = a;
-       const struct string_list_item *two = b;
-       int onelen = strlen(one->string);
-       int twolen = strlen(two->string);
+       int onelen = strlen(one);
+       int twolen = strlen(two);
        /*
         * Here we only care that entries for D/F conflicts are
         * adjacent, in particular with the file of the D/F conflict
@@ -406,8 +406,8 @@ static int string_list_df_name_compare(const void *a, const void *b)
         * since in other cases any changes in their order due to
         * sorting cause no problems for us.
         */
-       int cmp = df_name_compare(one->string, onelen, S_IFDIR,
-                                 two->string, twolen, S_IFDIR);
+       int cmp = df_name_compare(one, onelen, S_IFDIR,
+                                 two, twolen, S_IFDIR);
        /*
         * Now that 'foo' and 'foo/bar' compare equal, we have to make sure
         * that 'foo' comes before 'foo/bar'.
@@ -451,8 +451,8 @@ static void record_df_conflict_files(struct merge_options *o,
                string_list_append(&df_sorted_entries, next->string)->util =
                                   next->util;
        }
-       qsort(df_sorted_entries.items, entries->nr, sizeof(*entries->items),
-             string_list_df_name_compare);
+       df_sorted_entries.cmp = string_list_df_name_compare;
+       string_list_sort(&df_sorted_entries);
 
        string_list_clear(&o->df_conflict_file_set, 1);
        for (i = 0; i < df_sorted_entries.nr; i++) {
@@ -664,7 +664,13 @@ static char *unique_path(struct merge_options *o, const char *path, const char *
        return strbuf_detach(&newpath, NULL);
 }
 
-static int dir_in_way(const char *path, int check_working_copy)
+/**
+ * Check whether a directory in the index is in the way of an incoming
+ * file.  Return 1 if so.  If check_working_copy is non-zero, also
+ * check the working directory.  If empty_ok is non-zero, also return
+ * 0 in the case where the working-tree dir exists but is empty.
+ */
+static int dir_in_way(const char *path, int check_working_copy, int empty_ok)
 {
        int pos;
        struct strbuf dirpath = STRBUF_INIT;
@@ -684,7 +690,8 @@ static int dir_in_way(const char *path, int check_working_copy)
        }
 
        strbuf_release(&dirpath);
-       return check_working_copy && !lstat(path, &st) && S_ISDIR(st.st_mode);
+       return check_working_copy && !lstat(path, &st) && S_ISDIR(st.st_mode) &&
+               !(empty_ok && is_empty_dir(path));
 }
 
 static int was_tracked(const char *path)
@@ -1062,7 +1069,7 @@ static int handle_change_delete(struct merge_options *o,
 {
        char *renamed = NULL;
        int ret = 0;
-       if (dir_in_way(path, !o->call_depth)) {
+       if (dir_in_way(path, !o->call_depth, 0)) {
                renamed = unique_path(o, path, a_oid ? o->branch1 : o->branch2);
        }
 
@@ -1195,7 +1202,7 @@ static int handle_file(struct merge_options *o,
                remove_file(o, 0, rename->path, 0);
                dst_name = unique_path(o, rename->path, cur_branch);
        } else {
-               if (dir_in_way(rename->path, !o->call_depth)) {
+               if (dir_in_way(rename->path, !o->call_depth, 0)) {
                        dst_name = unique_path(o, rename->path, cur_branch);
                        output(o, 1, _("%s is a directory in %s adding as %s instead"),
                               rename->path, other_branch, dst_name);
@@ -1704,7 +1711,8 @@ static int merge_content(struct merge_options *o,
                         o->branch2 == rename_conflict_info->branch1) ?
                        pair1->two->path : pair1->one->path;
 
-               if (dir_in_way(path, !o->call_depth))
+               if (dir_in_way(path, !o->call_depth,
+                              S_ISGITLINK(pair1->two->mode)))
                        df_conflict_remains = 1;
        }
        if (merge_file_special_markers(o, &one, &a, &b,
@@ -1862,7 +1870,8 @@ static int process_entry(struct merge_options *o,
                        oid = b_oid;
                        conf = _("directory/file");
                }
-               if (dir_in_way(path, !o->call_depth)) {
+               if (dir_in_way(path, !o->call_depth,
+                              S_ISGITLINK(a_mode))) {
                        char *new_path = unique_path(o, path, add_branch);
                        clean_merge = 0;
                        output(o, 1, _("CONFLICT (%s): There is a directory with name %s in %s. "
@@ -2124,7 +2133,7 @@ int merge_recursive_generic(struct merge_options *o,
                }
        }
 
-       hold_locked_index(lock, 1);
+       hold_locked_index(lock, LOCK_DIE_ON_ERROR);
        clean = merge_recursive(o, head_commit, next_commit, ca,
                        result);
        if (clean < 0)
diff --git a/merge.c b/merge.c
index 23866c91655638d9e1a7213478772b78aa9d7c69..04ee5fc911c8d8134decb5c1a400576ae5681bf6 100644 (file)
--- a/merge.c
+++ b/merge.c
@@ -57,7 +57,7 @@ int checkout_fast_forward(const unsigned char *head,
 
        refresh_cache(REFRESH_QUIET);
 
-       if (hold_locked_index(lock_file, 0) < 0)
+       if (hold_locked_index(lock_file, LOCK_REPORT_ON_ERROR) < 0)
                return -1;
 
        memset(&trees, 0, sizeof(trees));
index 64f97c5e9755d54ace864cb53bf0e7844f530f49..e2407b65b70d1e622979cdb2fe0e425ba6403ee1 100644 (file)
@@ -3,7 +3,6 @@ diff_cmd () {
 }
 
 merge_cmd () {
-       touch "$BACKUP"
        if $base_present
        then
                "$merge_tool_path" -wait -merge -3 -a1 \
@@ -12,7 +11,6 @@ merge_cmd () {
                "$merge_tool_path" -wait -2 \
                        "$LOCAL" "$REMOTE" "$MERGED" >/dev/null 2>&1
        fi
-       check_unchanged
 }
 
 translate_merge_tool_path() {
index b6319d206e2333e42469486604d4635e846e5faa..3a69e60faa9c95dcf388cd295d040e9b88e0defd 100644 (file)
@@ -3,7 +3,6 @@ diff_cmd () {
 }
 
 merge_cmd () {
-       touch "$BACKUP"
        if $base_present
        then
                "$merge_tool_path" "$LOCAL" "$REMOTE" "$BASE" \
@@ -12,7 +11,6 @@ merge_cmd () {
                "$merge_tool_path" "$LOCAL" "$REMOTE" \
                        -mergeoutput="$MERGED"
        fi
-       check_unchanged
 }
 
 translate_merge_tool_path() {
index 3f0486bc807133f50abcaab27c991d4a806ec63c..9f60e8da6527cf28dcc5ad4a3e5f7f0ca9442cb4 100644 (file)
@@ -3,7 +3,6 @@ diff_cmd () {
 }
 
 merge_cmd () {
-       touch "$BACKUP"
        if $base_present
        then
                "$merge_tool_path" -MF="$LOCAL" -TF="$REMOTE" -BF="$BASE" \
@@ -12,7 +11,6 @@ merge_cmd () {
                "$merge_tool_path" -MF="$LOCAL" -TF="$REMOTE" \
                        -RF="$MERGED"
        fi
-       check_unchanged
 }
 
 translate_merge_tool_path() {
index b3c71b6236e343dd3b268a2288af853804b3acf6..ee6f374bceb8e14af5b424e64fbe9787006091e8 100644 (file)
@@ -16,6 +16,10 @@ merge_cmd () {
        fi >/dev/null 2>&1
 }
 
-translate_merge_tool_path() {
+translate_merge_tool_path () {
        echo DeltaWalker
 }
+
+exit_code_trustable () {
+       true
+}
index f138cb4e731018b40426337eb8062f40512df088..9b6355b98a71da2627b68c6543cea4f2515b8d54 100644 (file)
@@ -12,3 +12,7 @@ merge_cmd () {
                        --result="$MERGED" "$LOCAL" "$REMOTE"
        fi
 }
+
+exit_code_trustable () {
+       true
+}
index 02e0843f47e09a7cc6cdd2a9c70e36773ecc96af..5a3ae8b5695d3141ff0310a706495ea52037b464 100644 (file)
@@ -3,7 +3,6 @@ diff_cmd () {
 }
 
 merge_cmd () {
-       touch "$BACKUP"
        if $base_present
        then
                "$merge_tool_path" \
@@ -13,5 +12,4 @@ merge_cmd () {
                "$merge_tool_path" \
                        "$LOCAL" "$MERGED" "$REMOTE" | cat
        fi
-       check_unchanged
 }
index 13c2e439def45fe6cf58ae4345355894463ba34f..6c5101c4f729d49c544436e9262ca75e4ce6cddd 100644 (file)
@@ -3,7 +3,6 @@ diff_cmd () {
 }
 
 merge_cmd () {
-       touch "$BACKUP"
        if $base_present
        then
                "$merge_tool_path" "$BASE" "$LOCAL" "$REMOTE" \
@@ -12,5 +11,4 @@ merge_cmd () {
                "$merge_tool_path" "$LOCAL" "$REMOTE" \
                        --default --mode=merge2 --to="$MERGED"
        fi
-       check_unchanged
 }
index 7b895fdb1f9955eb470a2614e0634bfcd26d90c9..d1ce513ff5d3b3db14dd1270d2181099e1134c2c 100644 (file)
@@ -20,3 +20,7 @@ merge_cmd () {
 translate_merge_tool_path() {
        echo emacs
 }
+
+exit_code_trustable () {
+       true
+}
index 7b524d4088ff198d70c5e40a378011f2e515770e..e72b06fc4d8ff76e06a0b972ae28df73efd4180d 100644 (file)
@@ -3,14 +3,12 @@ diff_cmd () {
 }
 
 merge_cmd () {
-       touch "$BACKUP"
        if $base_present
        then
                "$merge_tool_path" -merge "$LOCAL" "$BASE" "$REMOTE" -o:"$MERGED" -nh
        else
                "$merge_tool_path" -merge "$LOCAL" "$REMOTE" -o:"$MERGED" -nh
        fi
-       check_unchanged
 }
 
 translate_merge_tool_path() {
index 793d1293b16c9b28a9ec5c70ec7fa0875ab0da54..0264ed5b20b29fec0fc5586408f88b0e8755d212 100644 (file)
@@ -21,3 +21,7 @@ merge_cmd () {
                >/dev/null 2>&1
        fi
 }
+
+exit_code_trustable () {
+       true
+}
index 433686c12a088195bbf21b2e409c21df199ba988..e8c0bfa678547258ff0f330ae756f3621e6aadc7 100644 (file)
@@ -5,3 +5,7 @@ can_merge () {
 diff_cmd () {
        "$merge_tool_path" "$LOCAL" "$REMOTE"
 }
+
+exit_code_trustable () {
+       true
+}
index 83ebdfb4c328ac79af38bfe935f0dbfa7fb6f53b..bc178e88827a1a0558e9fbee1a6f18f6ede83df1 100644 (file)
@@ -7,7 +7,7 @@ merge_cmd () {
        then
                check_meld_for_output_version
        fi
-       touch "$BACKUP"
+
        if test "$meld_has_output_option" = true
        then
                "$merge_tool_path" --output "$MERGED" \
@@ -15,7 +15,6 @@ merge_cmd () {
        else
                "$merge_tool_path" "$LOCAL" "$MERGED" "$REMOTE"
        fi
-       check_unchanged
 }
 
 # Check whether we should use 'meld --output <file>'
index 0942b2a733592d3f0a5a39b4fc1defd635eb7b04..b608dd6de30aaab9b30729145029761330f9fb55 100644 (file)
@@ -3,7 +3,6 @@ diff_cmd () {
 }
 
 merge_cmd () {
-       touch "$BACKUP"
        if $base_present
        then
                "$merge_tool_path" "$LOCAL" "$REMOTE" \
@@ -12,5 +11,4 @@ merge_cmd () {
                "$merge_tool_path" "$LOCAL" "$REMOTE" \
                        -merge "$MERGED" | cat
        fi
-       check_unchanged
 }
index 5a608abf9c77f436ab1472592e3d5777ef83805d..7a5b291dd28ad5b60ca0492480b800aaa9cc929e 100644 (file)
@@ -20,14 +20,12 @@ diff_cmd () {
 }
 
 merge_cmd () {
-       touch "$BACKUP"
        if ! $base_present
        then
                cp -- "$LOCAL" "$BASE"
                create_virtual_base "$BASE" "$REMOTE"
        fi
        "$merge_tool_path" "$BASE" "$REMOTE" "$LOCAL" "$MERGED"
-       check_unchanged
 }
 
 create_empty_file () {
index 618c438e8765a485ffcc70a105fb0cf46010540c..eee5cb57e3ccf7f1ad7ad150c37a8b6d7ab6d436 100644 (file)
@@ -10,3 +10,7 @@ merge_cmd () {
                "$merge_tool_path" -o "$MERGED" "$LOCAL" "$REMOTE"
        fi
 }
+
+exit_code_trustable () {
+       true
+}
index 3b89f1c82dc944fcbec889d24e8e7032fda612fc..d7ab666a59a2c8690861146bb6ae4874ed48e0de 100644 (file)
@@ -5,7 +5,6 @@ can_diff () {
 merge_cmd () {
        if $base_present
        then
-               touch "$BACKUP"
                basename="$(basename "$merge_tool_path" .exe)"
                if test "$basename" = "tortoisegitmerge"
                then
@@ -17,7 +16,6 @@ merge_cmd () {
                                -base:"$BASE" -mine:"$LOCAL" \
                                -theirs:"$REMOTE" -merged:"$MERGED"
                fi
-               check_unchanged
        else
                echo "$merge_tool_path cannot be used without a base" 1>&2
                return 1
index 74ea6d54793f62188cd88e93f1adfe74c5957dda..10d86f3e19304125cecf06ddad928b9ffe2d0c08 100644 (file)
@@ -4,7 +4,6 @@ diff_cmd () {
 }
 
 merge_cmd () {
-       touch "$BACKUP"
        case "$1" in
        gvimdiff|vimdiff)
                if $base_present
@@ -31,7 +30,6 @@ merge_cmd () {
                fi
                ;;
        esac
-       check_unchanged
 }
 
 translate_merge_tool_path() {
@@ -44,3 +42,7 @@ translate_merge_tool_path() {
                ;;
        esac
 }
+
+exit_code_trustable () {
+       true
+}
index f3819d316a2c05d9fe1f850d6ac20b04d9df0417..74d03259fdf157c9ee07eec7b2c40727f5ce49dc 100644 (file)
@@ -6,10 +6,8 @@ diff_cmd () {
 merge_cmd () {
        # mergetool.winmerge.trustExitCode is implicitly false.
        # touch $BACKUP so that we can check_unchanged.
-       touch "$BACKUP"
        "$merge_tool_path" -u -e -dl Local -dr Remote \
                "$LOCAL" "$REMOTE" "$MERGED"
-       check_unchanged
 }
 
 translate_merge_tool_path() {
index 05b443394ba166a82a22abfcf27865b4627405e2..ce5b8e9f296233470d18feae929772235e4f12f2 100644 (file)
@@ -1,25 +1,23 @@
 diff_cmd () {
        "$merge_tool_path" \
                -R 'Accel.Search: "Ctrl+F"' \
-               -R 'Accel.SearchForward: "Ctrl-G"' \
+               -R 'Accel.SearchForward: "Ctrl+G"' \
                "$LOCAL" "$REMOTE"
 }
 
 merge_cmd () {
-       touch "$BACKUP"
        if $base_present
        then
                "$merge_tool_path" -X --show-merged-pane \
-                       -R 'Accel.SaveAsMerged: "Ctrl-S"' \
+                       -R 'Accel.SaveAsMerged: "Ctrl+S"' \
                        -R 'Accel.Search: "Ctrl+F"' \
-                       -R 'Accel.SearchForward: "Ctrl-G"' \
+                       -R 'Accel.SearchForward: "Ctrl+G"' \
                        --merged-file "$MERGED" "$LOCAL" "$BASE" "$REMOTE"
        else
                "$merge_tool_path" -X $extra \
-                       -R 'Accel.SaveAsMerged: "Ctrl-S"' \
+                       -R 'Accel.SaveAsMerged: "Ctrl+S"' \
                        -R 'Accel.Search: "Ctrl+F"' \
-                       -R 'Accel.SearchForward: "Ctrl-G"' \
+                       -R 'Accel.SearchForward: "Ctrl+G"' \
                        --merged-file "$MERGED" "$LOCAL" "$REMOTE"
        fi
-       check_unchanged
 }
index 312a85dbdef5723ef805917f5a556b75a55a7041..4fbe924a5de27d04b271a11a2ae040e817483951 100644 (file)
@@ -661,7 +661,7 @@ void NORETURN usage_msg_opt(const char *msg,
                   const char * const *usagestr,
                   const struct option *options)
 {
-       fprintf(stderr, "%s\n\n", msg);
+       fprintf(stderr, "fatal: %s\n\n", msg);
        usage_with_options(usagestr, options);
 }
 
diff --git a/path.c b/path.c
index 52d889c88ea8483b7a78937804bb1b789d2daa1e..efcedafba6f2c0cae218f2d32425c13272df8dea 100644 (file)
--- a/path.c
+++ b/path.c
@@ -991,7 +991,7 @@ const char *remove_leading_path(const char *in, const char *prefix)
  *
  * Performs the following normalizations on src, storing the result in dst:
  * - Ensures that components are separated by '/' (Windows only)
- * - Squashes sequences of '/'.
+ * - Squashes sequences of '/' except "//server/share" on Windows
  * - Removes "." components.
  * - Removes ".." components, and the components the precede them.
  * Returns failure (non-zero) if a ".." component appears as first path
@@ -1014,17 +1014,22 @@ const char *remove_leading_path(const char *in, const char *prefix)
 int normalize_path_copy_len(char *dst, const char *src, int *prefix_len)
 {
        char *dst0;
-       int i;
+       const char *end;
 
-       for (i = has_dos_drive_prefix(src); i > 0; i--)
-               *dst++ = *src++;
+       /*
+        * Copy initial part of absolute path: "/", "C:/", "//server/share/".
+        */
+       end = src + offset_1st_component(src);
+       while (src < end) {
+               char c = *src++;
+               if (is_dir_sep(c))
+                       c = '/';
+               *dst++ = c;
+       }
        dst0 = dst;
 
-       if (is_dir_sep(*src)) {
-               *dst++ = '/';
-               while (is_dir_sep(*src))
-                       src++;
-       }
+       while (is_dir_sep(*src))
+               src++;
 
        for (;;) {
                char c = *src;
index 22ca74a126e79995607e68a557ae8bd4c2ab02f7..7ababb315944d5536ec251b19937beef5def2538 100644 (file)
@@ -67,20 +67,19 @@ static struct pathspec_magic {
        char mnemonic; /* this cannot be ':'! */
        const char *name;
 } pathspec_magic[] = {
-       { PATHSPEC_FROMTOP, '/', "top" },
-       { PATHSPEC_LITERAL,   0, "literal" },
-       { PATHSPEC_GLOB,   '\0', "glob" },
-       { PATHSPEC_ICASE,  '\0', "icase" },
-       { PATHSPEC_EXCLUDE, '!', "exclude" },
+       { PATHSPEC_FROMTOP,  '/', "top" },
+       { PATHSPEC_LITERAL, '\0', "literal" },
+       { PATHSPEC_GLOB,    '\0', "glob" },
+       { PATHSPEC_ICASE,   '\0', "icase" },
+       { PATHSPEC_EXCLUDE,  '!', "exclude" },
 };
 
-static void prefix_short_magic(struct strbuf *sb, int prefixlen,
-                              unsigned short_magic)
+static void prefix_magic(struct strbuf *sb, int prefixlen, unsigned magic)
 {
        int i;
        strbuf_addstr(sb, ":(");
        for (i = 0; i < ARRAY_SIZE(pathspec_magic); i++)
-               if (short_magic & pathspec_magic[i].bit) {
+               if (magic & pathspec_magic[i].bit) {
                        if (sb->buf[sb->len - 1] != '(')
                                strbuf_addch(sb, ',');
                        strbuf_addstr(sb, pathspec_magic[i].name);
@@ -88,54 +87,61 @@ static void prefix_short_magic(struct strbuf *sb, int prefixlen,
        strbuf_addf(sb, ",prefix:%d)", prefixlen);
 }
 
-/*
- * Take an element of a pathspec and check for magic signatures.
- * Append the result to the prefix. Return the magic bitmap.
- *
- * For now, we only parse the syntax and throw out anything other than
- * "top" magic.
- *
- * NEEDSWORK: This needs to be rewritten when we start migrating
- * get_pathspec() users to use the "struct pathspec" interface.  For
- * example, a pathspec element may be marked as case-insensitive, but
- * the prefix part must always match literally, and a single stupid
- * string cannot express such a case.
- */
-static unsigned prefix_pathspec(struct pathspec_item *item,
-                               unsigned *p_short_magic,
-                               const char **raw, unsigned flags,
-                               const char *prefix, int prefixlen,
-                               const char *elt)
+static inline int get_literal_global(void)
 {
-       static int literal_global = -1;
-       static int glob_global = -1;
-       static int noglob_global = -1;
-       static int icase_global = -1;
-       unsigned magic = 0, short_magic = 0, global_magic = 0;
-       const char *copyfrom = elt, *long_magic_end = NULL;
-       char *match;
-       int i, pathspec_prefix = -1;
+       static int literal = -1;
+
+       if (literal < 0)
+               literal = git_env_bool(GIT_LITERAL_PATHSPECS_ENVIRONMENT, 0);
+
+       return literal;
+}
+
+static inline int get_glob_global(void)
+{
+       static int glob = -1;
+
+       if (glob < 0)
+               glob = git_env_bool(GIT_GLOB_PATHSPECS_ENVIRONMENT, 0);
+
+       return glob;
+}
+
+static inline int get_noglob_global(void)
+{
+       static int noglob = -1;
+
+       if (noglob < 0)
+               noglob = git_env_bool(GIT_NOGLOB_PATHSPECS_ENVIRONMENT, 0);
+
+       return noglob;
+}
+
+static inline int get_icase_global(void)
+{
+       static int icase = -1;
+
+       if (icase < 0)
+               icase = git_env_bool(GIT_ICASE_PATHSPECS_ENVIRONMENT, 0);
+
+       return icase;
+}
+
+static int get_global_magic(int element_magic)
+{
+       int global_magic = 0;
 
-       if (literal_global < 0)
-               literal_global = git_env_bool(GIT_LITERAL_PATHSPECS_ENVIRONMENT, 0);
-       if (literal_global)
+       if (get_literal_global())
                global_magic |= PATHSPEC_LITERAL;
 
-       if (glob_global < 0)
-               glob_global = git_env_bool(GIT_GLOB_PATHSPECS_ENVIRONMENT, 0);
-       if (glob_global)
+       /* --glob-pathspec is overridden by :(literal) */
+       if (get_glob_global() && !(element_magic & PATHSPEC_LITERAL))
                global_magic |= PATHSPEC_GLOB;
 
-       if (noglob_global < 0)
-               noglob_global = git_env_bool(GIT_NOGLOB_PATHSPECS_ENVIRONMENT, 0);
-
-       if (glob_global && noglob_global)
+       if (get_glob_global() && get_noglob_global())
                die(_("global 'glob' and 'noglob' pathspec settings are incompatible"));
 
-
-       if (icase_global < 0)
-               icase_global = git_env_bool(GIT_ICASE_PATHSPECS_ENVIRONMENT, 0);
-       if (icase_global)
+       if (get_icase_global())
                global_magic |= PATHSPEC_ICASE;
 
        if ((global_magic & PATHSPEC_LITERAL) &&
@@ -143,84 +149,198 @@ static unsigned prefix_pathspec(struct pathspec_item *item,
                die(_("global 'literal' pathspec setting is incompatible "
                      "with all other global pathspec settings"));
 
-       if (flags & PATHSPEC_LITERAL_PATH)
-               global_magic = 0;
+       /* --noglob-pathspec adds :(literal) _unless_ :(glob) is specified */
+       if (get_noglob_global() && !(element_magic & PATHSPEC_GLOB))
+               global_magic |= PATHSPEC_LITERAL;
 
-       if (elt[0] != ':' || literal_global ||
-           (flags & PATHSPEC_LITERAL_PATH)) {
-               ; /* nothing to do */
-       } else if (elt[1] == '(') {
-               /* longhand */
-               const char *nextat;
-               for (copyfrom = elt + 2;
-                    *copyfrom && *copyfrom != ')';
-                    copyfrom = nextat) {
-                       size_t len = strcspn(copyfrom, ",)");
-                       if (copyfrom[len] == ',')
-                               nextat = copyfrom + len + 1;
-                       else
-                               /* handle ')' and '\0' */
-                               nextat = copyfrom + len;
-                       if (!len)
-                               continue;
-                       for (i = 0; i < ARRAY_SIZE(pathspec_magic); i++) {
-                               if (strlen(pathspec_magic[i].name) == len &&
-                                   !strncmp(pathspec_magic[i].name, copyfrom, len)) {
-                                       magic |= pathspec_magic[i].bit;
-                                       break;
-                               }
-                               if (starts_with(copyfrom, "prefix:")) {
-                                       char *endptr;
-                                       pathspec_prefix = strtol(copyfrom + 7,
-                                                                &endptr, 10);
-                                       if (endptr - copyfrom != len)
-                                               die(_("invalid parameter for pathspec magic 'prefix'"));
-                                       /* "i" would be wrong, but it does not matter */
-                                       break;
-                               }
+       return global_magic;
+}
+
+/*
+ * Parse the pathspec element looking for long magic
+ *
+ * saves all magic in 'magic'
+ * if prefix magic is used, save the prefix length in 'prefix_len'
+ * returns the position in 'elem' after all magic has been parsed
+ */
+static const char *parse_long_magic(unsigned *magic, int *prefix_len,
+                                   const char *elem)
+{
+       const char *pos;
+       const char *nextat;
+
+       for (pos = elem + 2; *pos && *pos != ')'; pos = nextat) {
+               size_t len = strcspn(pos, ",)");
+               int i;
+
+               if (pos[len] == ',')
+                       nextat = pos + len + 1; /* handle ',' */
+               else
+                       nextat = pos + len; /* handle ')' and '\0' */
+
+               if (!len)
+                       continue;
+
+               if (starts_with(pos, "prefix:")) {
+                       char *endptr;
+                       *prefix_len = strtol(pos + 7, &endptr, 10);
+                       if (endptr - pos != len)
+                               die(_("invalid parameter for pathspec magic 'prefix'"));
+                       continue;
+               }
+
+               for (i = 0; i < ARRAY_SIZE(pathspec_magic); i++) {
+                       if (strlen(pathspec_magic[i].name) == len &&
+                           !strncmp(pathspec_magic[i].name, pos, len)) {
+                               *magic |= pathspec_magic[i].bit;
+                               break;
                        }
-                       if (ARRAY_SIZE(pathspec_magic) <= i)
-                               die(_("Invalid pathspec magic '%.*s' in '%s'"),
-                                   (int) len, copyfrom, elt);
                }
-               if (*copyfrom != ')')
-                       die(_("Missing ')' at the end of pathspec magic in '%s'"), elt);
-               long_magic_end = copyfrom;
-               copyfrom++;
-       } else {
-               /* shorthand */
-               for (copyfrom = elt + 1;
-                    *copyfrom && *copyfrom != ':';
-                    copyfrom++) {
-                       char ch = *copyfrom;
 
-                       if (!is_pathspec_magic(ch))
+               if (ARRAY_SIZE(pathspec_magic) <= i)
+                       die(_("Invalid pathspec magic '%.*s' in '%s'"),
+                           (int) len, pos, elem);
+       }
+
+       if (*pos != ')')
+               die(_("Missing ')' at the end of pathspec magic in '%s'"),
+                   elem);
+       pos++;
+
+       return pos;
+}
+
+/*
+ * Parse the pathspec element looking for short magic
+ *
+ * saves all magic in 'magic'
+ * returns the position in 'elem' after all magic has been parsed
+ */
+static const char *parse_short_magic(unsigned *magic, const char *elem)
+{
+       const char *pos;
+
+       for (pos = elem + 1; *pos && *pos != ':'; pos++) {
+               char ch = *pos;
+               int i;
+
+               if (!is_pathspec_magic(ch))
+                       break;
+
+               for (i = 0; i < ARRAY_SIZE(pathspec_magic); i++) {
+                       if (pathspec_magic[i].mnemonic == ch) {
+                               *magic |= pathspec_magic[i].bit;
                                break;
-                       for (i = 0; i < ARRAY_SIZE(pathspec_magic); i++)
-                               if (pathspec_magic[i].mnemonic == ch) {
-                                       short_magic |= pathspec_magic[i].bit;
-                                       break;
-                               }
-                       if (ARRAY_SIZE(pathspec_magic) <= i)
-                               die(_("Unimplemented pathspec magic '%c' in '%s'"),
-                                   ch, elt);
+                       }
                }
-               if (*copyfrom == ':')
-                       copyfrom++;
+
+               if (ARRAY_SIZE(pathspec_magic) <= i)
+                       die(_("Unimplemented pathspec magic '%c' in '%s'"),
+                           ch, elem);
        }
 
-       magic |= short_magic;
-       *p_short_magic = short_magic;
+       if (*pos == ':')
+               pos++;
 
-       /* --noglob-pathspec adds :(literal) _unless_ :(glob) is specified */
-       if (noglob_global && !(magic & PATHSPEC_GLOB))
-               global_magic |= PATHSPEC_LITERAL;
+       return pos;
+}
 
-       /* --glob-pathspec is overridden by :(literal) */
-       if ((global_magic & PATHSPEC_GLOB) && (magic & PATHSPEC_LITERAL))
-               global_magic &= ~PATHSPEC_GLOB;
+static const char *parse_element_magic(unsigned *magic, int *prefix_len,
+                                      const char *elem)
+{
+       if (elem[0] != ':' || get_literal_global())
+               return elem; /* nothing to do */
+       else if (elem[1] == '(')
+               /* longhand */
+               return parse_long_magic(magic, prefix_len, elem);
+       else
+               /* shorthand */
+               return parse_short_magic(magic, elem);
+}
+
+static void strip_submodule_slash_cheap(struct pathspec_item *item)
+{
+       if (item->len >= 1 && item->match[item->len - 1] == '/') {
+               int i = cache_name_pos(item->match, item->len - 1);
+
+               if (i >= 0 && S_ISGITLINK(active_cache[i]->ce_mode)) {
+                       item->len--;
+                       item->match[item->len] = '\0';
+               }
+       }
+}
+
+static void strip_submodule_slash_expensive(struct pathspec_item *item)
+{
+       int i;
+
+       for (i = 0; i < active_nr; i++) {
+               struct cache_entry *ce = active_cache[i];
+               int ce_len = ce_namelen(ce);
+
+               if (!S_ISGITLINK(ce->ce_mode))
+                       continue;
+
+               if (item->len <= ce_len || item->match[ce_len] != '/' ||
+                   memcmp(ce->name, item->match, ce_len))
+                       continue;
+
+               if (item->len == ce_len + 1) {
+                       /* strip trailing slash */
+                       item->len--;
+                       item->match[item->len] = '\0';
+               } else {
+                       die(_("Pathspec '%s' is in submodule '%.*s'"),
+                           item->original, ce_len, ce->name);
+               }
+       }
+}
+
+static void die_inside_submodule_path(struct pathspec_item *item)
+{
+       int i;
+
+       for (i = 0; i < active_nr; i++) {
+               struct cache_entry *ce = active_cache[i];
+               int ce_len = ce_namelen(ce);
+
+               if (!S_ISGITLINK(ce->ce_mode))
+                       continue;
+
+               if (item->len < ce_len ||
+                   !(item->match[ce_len] == '/' || item->match[ce_len] == '\0') ||
+                   memcmp(ce->name, item->match, ce_len))
+                       continue;
 
-       magic |= global_magic;
+               die(_("Pathspec '%s' is in submodule '%.*s'"),
+                   item->original, ce_len, ce->name);
+       }
+}
+
+/*
+ * Perform the initialization of a pathspec_item based on a pathspec element.
+ */
+static void init_pathspec_item(struct pathspec_item *item, unsigned flags,
+                              const char *prefix, int prefixlen,
+                              const char *elt)
+{
+       unsigned magic = 0, element_magic = 0;
+       const char *copyfrom = elt;
+       char *match;
+       int pathspec_prefix = -1;
+
+       /* PATHSPEC_LITERAL_PATH ignores magic */
+       if (flags & PATHSPEC_LITERAL_PATH) {
+               magic = PATHSPEC_LITERAL;
+       } else {
+               copyfrom = parse_element_magic(&element_magic,
+                                              &pathspec_prefix,
+                                              elt);
+               magic |= element_magic;
+               magic |= get_global_magic(element_magic);
+       }
+
+       item->magic = magic;
 
        if (pathspec_prefix >= 0 &&
            (prefixlen || (prefix && *prefix)))
@@ -229,6 +349,7 @@ static unsigned prefix_pathspec(struct pathspec_item *item,
        if ((magic & PATHSPEC_LITERAL) && (magic & PATHSPEC_GLOB))
                die(_("%s: 'literal' and 'glob' are incompatible"), elt);
 
+       /* Create match string which will be used for pathspec matching */
        if (pathspec_prefix >= 0) {
                match = xstrdup(copyfrom);
                prefixlen = pathspec_prefix;
@@ -236,69 +357,47 @@ static unsigned prefix_pathspec(struct pathspec_item *item,
                match = xstrdup(copyfrom);
                prefixlen = 0;
        } else {
-               match = prefix_path_gently(prefix, prefixlen, &prefixlen, copyfrom);
+               match = prefix_path_gently(prefix, prefixlen,
+                                          &prefixlen, copyfrom);
                if (!match)
                        die(_("%s: '%s' is outside repository"), elt, copyfrom);
        }
-       *raw = item->match = match;
+
+       item->match = match;
+       item->len = strlen(item->match);
+       item->prefix = prefixlen;
+
        /*
         * Prefix the pathspec (keep all magic) and assign to
         * original. Useful for passing to another command.
         */
-       if (flags & PATHSPEC_PREFIX_ORIGIN) {
+       if ((flags & PATHSPEC_PREFIX_ORIGIN) &&
+           prefixlen && !get_literal_global()) {
                struct strbuf sb = STRBUF_INIT;
-               if (prefixlen && !literal_global) {
-                       /* Preserve the actual prefix length of each pattern */
-                       if (short_magic)
-                               prefix_short_magic(&sb, prefixlen, short_magic);
-                       else if (long_magic_end) {
-                               strbuf_add(&sb, elt, long_magic_end - elt);
-                               strbuf_addf(&sb, ",prefix:%d)", prefixlen);
-                       } else
-                               strbuf_addf(&sb, ":(prefix:%d)", prefixlen);
-               }
+
+               /* Preserve the actual prefix length of each pattern */
+               prefix_magic(&sb, prefixlen, element_magic);
+
                strbuf_addstr(&sb, match);
                item->original = strbuf_detach(&sb, NULL);
-       } else
-               item->original = elt;
-       item->len = strlen(item->match);
-       item->prefix = prefixlen;
-
-       if ((flags & PATHSPEC_STRIP_SUBMODULE_SLASH_CHEAP) &&
-           (item->len >= 1 && item->match[item->len - 1] == '/') &&
-           (i = cache_name_pos(item->match, item->len - 1)) >= 0 &&
-           S_ISGITLINK(active_cache[i]->ce_mode)) {
-               item->len--;
-               match[item->len] = '\0';
+       } else {
+               item->original = xstrdup(elt);
        }
 
+       if (flags & PATHSPEC_STRIP_SUBMODULE_SLASH_CHEAP)
+               strip_submodule_slash_cheap(item);
+
        if (flags & PATHSPEC_STRIP_SUBMODULE_SLASH_EXPENSIVE)
-               for (i = 0; i < active_nr; i++) {
-                       struct cache_entry *ce = active_cache[i];
-                       int ce_len = ce_namelen(ce);
-
-                       if (!S_ISGITLINK(ce->ce_mode))
-                               continue;
-
-                       if (item->len <= ce_len || match[ce_len] != '/' ||
-                           memcmp(ce->name, match, ce_len))
-                               continue;
-                       if (item->len == ce_len + 1) {
-                               /* strip trailing slash */
-                               item->len--;
-                               match[item->len] = '\0';
-                       } else
-                               die (_("Pathspec '%s' is in submodule '%.*s'"),
-                                    elt, ce_len, ce->name);
-               }
+               strip_submodule_slash_expensive(item);
 
-       if (magic & PATHSPEC_LITERAL)
+       if (magic & PATHSPEC_LITERAL) {
                item->nowildcard_len = item->len;
-       else {
+       else {
                item->nowildcard_len = simple_length(item->match);
                if (item->nowildcard_len < prefixlen)
                        item->nowildcard_len = prefixlen;
        }
+
        item->flags = 0;
        if (magic & PATHSPEC_GLOB) {
                /*
@@ -313,9 +412,18 @@ static unsigned prefix_pathspec(struct pathspec_item *item,
        }
 
        /* sanity checks, pathspec matchers assume these are sane */
-       assert(item->nowildcard_len <= item->len &&
-              item->prefix         <= item->len);
-       return magic;
+       if (item->nowildcard_len > item->len ||
+           item->prefix         > item->len) {
+               /*
+                * This case can be triggered by the user pointing us to a
+                * pathspec inside a submodule, which is an input error.
+                * Detect that here and complain, but fallback in the
+                * non-submodule case to a BUG, as we have no idea what
+                * would trigger that.
+                */
+               die_inside_submodule_path(item);
+               die ("BUG: item->nowildcard_len > item->len || item->prefix > item->len)");
+       }
 }
 
 static int pathspec_item_cmp(const void *a_, const void *b_)
@@ -328,22 +436,22 @@ static int pathspec_item_cmp(const void *a_, const void *b_)
 }
 
 static void NORETURN unsupported_magic(const char *pattern,
-                                      unsigned magic,
-                                      unsigned short_magic)
+                                      unsigned magic)
 {
        struct strbuf sb = STRBUF_INIT;
-       int i, n;
-       for (n = i = 0; i < ARRAY_SIZE(pathspec_magic); i++) {
+       int i;
+       for (i = 0; i < ARRAY_SIZE(pathspec_magic); i++) {
                const struct pathspec_magic *m = pathspec_magic + i;
                if (!(magic & m->bit))
                        continue;
                if (sb.len)
-                       strbuf_addch(&sb, ' ');
-               if (short_magic & m->bit)
-                       strbuf_addf(&sb, "'%c'", m->mnemonic);
+                       strbuf_addstr(&sb, ", ");
+
+               if (m->mnemonic)
+                       strbuf_addf(&sb, _("'%s' (mnemonic: '%c')"),
+                                   m->name, m->mnemonic);
                else
                        strbuf_addf(&sb, "'%s'", m->name);
-               n++;
        }
        /*
         * We may want to substitute "this command" with a command
@@ -381,8 +489,6 @@ void parse_pathspec(struct pathspec *pathspec,
 
        /* No arguments with prefix -> prefix pathspec */
        if (!entry) {
-               static const char *raw[2];
-
                if (flags & PATHSPEC_PREFER_FULL)
                        return;
 
@@ -390,14 +496,11 @@ void parse_pathspec(struct pathspec *pathspec,
                        die("BUG: PATHSPEC_PREFER_CWD requires arguments");
 
                pathspec->items = item = xcalloc(1, sizeof(*item));
-               item->match = prefix;
-               item->original = prefix;
+               item->match = xstrdup(prefix);
+               item->original = xstrdup(prefix);
                item->nowildcard_len = item->len = strlen(prefix);
                item->prefix = item->len;
-               raw[0] = prefix;
-               raw[1] = NULL;
                pathspec->nr = 1;
-               pathspec->_raw = raw;
                return;
        }
 
@@ -415,25 +518,17 @@ void parse_pathspec(struct pathspec *pathspec,
        pathspec->nr = n;
        ALLOC_ARRAY(pathspec->items, n);
        item = pathspec->items;
-       pathspec->_raw = argv;
        prefixlen = prefix ? strlen(prefix) : 0;
 
        for (i = 0; i < n; i++) {
-               unsigned short_magic;
                entry = argv[i];
 
-               item[i].magic = prefix_pathspec(item + i, &short_magic,
-                                               argv + i, flags,
-                                               prefix, prefixlen, entry);
-               if ((flags & PATHSPEC_LITERAL_PATH) &&
-                   !(magic_mask & PATHSPEC_LITERAL))
-                       item[i].magic |= PATHSPEC_LITERAL;
+               init_pathspec_item(item + i, flags, prefix, prefixlen, entry);
+
                if (item[i].magic & PATHSPEC_EXCLUDE)
                        nr_exclude++;
                if (item[i].magic & magic_mask)
-                       unsupported_magic(entry,
-                                         item[i].magic & magic_mask,
-                                         short_magic);
+                       unsupported_magic(entry, item[i].magic & magic_mask);
 
                if ((flags & PATHSPEC_SYMLINK_LEADING_PATH) &&
                    has_symlink_leading_path(item[i].match, item[i].len)) {
@@ -457,45 +552,29 @@ void parse_pathspec(struct pathspec *pathspec,
        }
 }
 
-/*
- * N.B. get_pathspec() is deprecated in favor of the "struct pathspec"
- * based interface - see pathspec.c:parse_pathspec().
- *
- * Arguments:
- *  - prefix - a path relative to the root of the working tree
- *  - pathspec - a list of paths underneath the prefix path
- *
- * Iterates over pathspec, prepending each path with prefix,
- * and return the resulting list.
- *
- * If pathspec is empty, return a singleton list containing prefix.
- *
- * If pathspec and prefix are both empty, return an empty list.
- *
- * This is typically used by built-in commands such as add.c, in order
- * to normalize argv arguments provided to the built-in into a list of
- * paths to process, all relative to the root of the working tree.
- */
-const char **get_pathspec(const char *prefix, const char **pathspec)
-{
-       struct pathspec ps;
-       parse_pathspec(&ps,
-                      PATHSPEC_ALL_MAGIC &
-                      ~(PATHSPEC_FROMTOP | PATHSPEC_LITERAL),
-                      PATHSPEC_PREFER_CWD,
-                      prefix, pathspec);
-       return ps._raw;
-}
-
 void copy_pathspec(struct pathspec *dst, const struct pathspec *src)
 {
+       int i;
+
        *dst = *src;
        ALLOC_ARRAY(dst->items, dst->nr);
        COPY_ARRAY(dst->items, src->items, dst->nr);
+
+       for (i = 0; i < dst->nr; i++) {
+               dst->items[i].match = xstrdup(src->items[i].match);
+               dst->items[i].original = xstrdup(src->items[i].original);
+       }
 }
 
 void clear_pathspec(struct pathspec *pathspec)
 {
+       int i;
+
+       for (i = 0; i < pathspec->nr; i++) {
+               free(pathspec->items[i].match);
+               free(pathspec->items[i].original);
+       }
        free(pathspec->items);
        pathspec->items = NULL;
+       pathspec->nr = 0;
 }
index 59809e4793a20e3030462ec23bff2b5358283282..49fd823ddfe9eb96c983f9f812f6ca1dcf062951 100644 (file)
 #define PATHSPEC_ONESTAR 1     /* the pathspec pattern satisfies GFNM_ONESTAR */
 
 struct pathspec {
-       const char **_raw; /* get_pathspec() result, not freed by clear_pathspec() */
        int nr;
        unsigned int has_wildcard:1;
        unsigned int recursive:1;
        unsigned magic;
        int max_depth;
        struct pathspec_item {
-               const char *match;
-               const char *original;
+               char *match;
+               char *original;
                unsigned magic;
                int len, prefix;
                int nowildcard_len;
index b2732822af0f34c6f7731df8a1a017d19f3e0508..bfce1f795dfa5fea05f4f96637a1ae2333038735 100644 (file)
@@ -1438,6 +1438,44 @@ sub END {
 
 } # %TEMP_* Lexical Context
 
+=item prefix_lines ( PREFIX, STRING [, STRING... ])
+
+Prefixes lines in C<STRING> with C<PREFIX>.
+
+=cut
+
+sub prefix_lines {
+       my $prefix = shift;
+       my $string = join("\n", @_);
+       $string =~ s/^/$prefix/mg;
+       return $string;
+}
+
+=item get_comment_line_char ( )
+
+Gets the core.commentchar configuration value.
+The value falls-back to '#' if core.commentchar is set to 'auto'.
+
+=cut
+
+sub get_comment_line_char {
+       my $comment_line_char = config("core.commentchar") || '#';
+       $comment_line_char = '#' if ($comment_line_char eq 'auto');
+       $comment_line_char = '#' if (length($comment_line_char) != 1);
+       return $comment_line_char;
+}
+
+=item comment_lines ( STRING [, STRING... ])
+
+Comments lines following core.commentchar configuration.
+
+=cut
+
+sub comment_lines {
+       my $comment_line_char = get_comment_line_char;
+       return prefix_lines("$comment_line_char ", @_);
+}
+
 =back
 
 =head1 ERROR HANDLING
index f889fd6da91d2d9b6a7469442a02e5478f094f8d..c41425c8d07a4b9a223ef3fb71e24ff526cb9fc9 100644 (file)
@@ -13,7 +13,7 @@ BEGIN
        }
 }
 
-our @EXPORT = qw(__);
+our @EXPORT = qw(__ __n N__);
 our @EXPORT_OK = @EXPORT;
 
 sub __bootstrap_locale_messages {
@@ -44,6 +44,7 @@ BEGIN
        eval {
                __bootstrap_locale_messages();
                *__ = \&Locale::Messages::gettext;
+               *__n = \&Locale::Messages::ngettext;
                1;
        } or do {
                # Tell test.pl that we couldn't load the gettext library.
@@ -51,7 +52,10 @@ BEGIN
 
                # Just a fall-through no-op
                *__ = sub ($) { $_[0] };
+               *__n = sub ($$$) { $_[2] == 1 ? $_[0] : $_[1] };
        };
+
+       sub N__($) { return shift; }
 }
 
 1;
@@ -70,6 +74,9 @@ =head1 SYNOPSIS
 
        printf __("The following error occurred: %s\n"), $error;
 
+       printf __n("commited %d file\n", "commited %d files\n", $files), $files;
+
+
 =head1 DESCRIPTION
 
 Git's internal Perl interface to gettext via L<Locale::Messages>. If
@@ -87,6 +94,16 @@ =head2 __($)
 L<Locale::Messages>'s gettext function if all goes well, otherwise our
 passthrough fallback function.
 
+=head2 __n($$$)
+
+L<Locale::Messages>'s ngettext function or passthrough fallback function.
+
+=head2 N__($)
+
+No-operation that only returns its argument. Use this if you want xgettext to
+extract the text to the pot template but do not want to trigger retrival of the
+translation at run time.
+
 =head1 AUTHOR
 
 E<AElig>var ArnfjE<ouml>rE<eth> Bjarmason <avarab@gmail.com>
index e7646968011234c09e1565577357a7678c015762..56ad9870bcfdfae68bd0fb5b57aa73e208bcb0fd 100644 (file)
@@ -606,7 +606,7 @@ sub minimize_url {
                        my $latest = $ra->get_latest_revnum;
                        $ra->get_log("", $latest, 0, 1, 0, 1, sub {});
                };
-       } while ($@ && ($c = shift @components));
+       } while ($@ && defined($c = shift @components));
 
        return canonicalize_url($url);
 }
index 30e00e2b5886a34edc33fb528195241290c44cf5..57d0e2faa8780b3434fd8f3656e206d4d4e7e75b 100644 (file)
--- a/po/ca.po
+++ b/po/ca.po
@@ -7,8 +7,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Git\n"
 "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2016-08-27 23:21+0800\n"
-"PO-Revision-Date: 2016-08-28 10:32-0600\n"
+"POT-Creation-Date: 2016-11-25 22:50+0800\n"
+"PO-Revision-Date: 2016-11-28 20:03-0700\n"
 "Last-Translator: Alex Henrie <alexhenrie24@gmail.com>\n"
 "Language-Team: Catalan\n"
 "Language: ca\n"
@@ -16,7 +16,7 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-Generator: Poedit 1.8.8\n"
+"X-Generator: Poedit 1.8.11\n"
 
 #: advice.c:55
 #, c-format
@@ -100,3957 +100,4458 @@ msgstr ""
 "\n"
 "  git checkout -b <nom-de-branca-nova>\n"
 
-#: archive.c:12
-msgid "git archive [<options>] <tree-ish> [<path>...]"
-msgstr "git archive [<opcions>] <arbre> [<camí>...]"
+#: apply.c:57
+#, c-format
+msgid "unrecognized whitespace option '%s'"
+msgstr "opció d'espai en blanc '%s' no reconeguda"
 
-#: archive.c:13
-msgid "git archive --list"
-msgstr "git archive --list"
+#: apply.c:73
+#, c-format
+msgid "unrecognized whitespace ignore option '%s'"
+msgstr "opció d'ignoral d'espai en blanc '%s' no reconeguda"
 
-#: archive.c:14
-msgid ""
-"git archive --remote <repo> [--exec <cmd>] [<options>] <tree-ish> [<path>...]"
-msgstr ""
-"git archive --remote <dipòsit> [--exec <ordre>] [<opcions>] <arbre> "
-"[<camí>...]"
+#: apply.c:125
+msgid "--reject and --3way cannot be used together."
+msgstr "--reject i --3way no es poden usar junts."
 
-#: archive.c:15
-msgid "git archive --remote <repo> [--exec <cmd>] --list"
-msgstr "git archive --remote <dipòsit> [--exec <ordre>] --list"
+#: apply.c:127
+msgid "--cached and --3way cannot be used together."
+msgstr "--cached i --3way no es poden usar junts."
 
-#: archive.c:344 builtin/add.c:139 builtin/add.c:435 builtin/rm.c:327
-#, c-format
-msgid "pathspec '%s' did not match any files"
-msgstr "L'especificació de camí '%s' no ha coincidit amb cap fitxer"
+#: apply.c:130
+msgid "--3way outside a repository"
+msgstr "--3way fora d'un dipòsit"
 
-#: archive.c:429
-msgid "fmt"
-msgstr "format"
+#: apply.c:141
+msgid "--index outside a repository"
+msgstr "--index fora d'un dipòsit"
 
-#: archive.c:429
-msgid "archive format"
-msgstr "format d'arxiu"
+#: apply.c:144
+msgid "--cached outside a repository"
+msgstr "--cached fora d'un dipòsit"
 
-#: archive.c:430 builtin/log.c:1422
-msgid "prefix"
-msgstr "prefix"
+#: apply.c:845
+#, c-format
+msgid "Cannot prepare timestamp regexp %s"
+msgstr "No es pot preparar l'expressió regular de marca de temps %s"
 
-#: archive.c:431
-msgid "prepend prefix to each pathname in the archive"
-msgstr "anteposa el prefix a cada nom de camí en l'arxiu"
+#: apply.c:854
+#, c-format
+msgid "regexec returned %d for input: %s"
+msgstr "regexec ha retornat %d per l'entrada: %s"
 
-#: archive.c:432 builtin/archive.c:88 builtin/blame.c:2553 builtin/blame.c:2554
-#: builtin/config.c:59 builtin/fast-export.c:987 builtin/fast-export.c:989
-#: builtin/grep.c:722 builtin/hash-object.c:100 builtin/ls-files.c:460
-#: builtin/ls-files.c:463 builtin/notes.c:399 builtin/notes.c:562
-#: builtin/read-tree.c:109 parse-options.h:153
-msgid "file"
-msgstr "fitxer"
+#: apply.c:938
+#, c-format
+msgid "unable to find filename in patch at line %d"
+msgstr "no s'ha pogut trobar el nom de fitxer en el pedaç a la línia %d"
 
-#: archive.c:433 builtin/archive.c:89
-msgid "write the archive to this file"
-msgstr "escriu l'arxiu a aquest fitxer"
+#: apply.c:977
+#, c-format
+msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d"
+msgstr ""
+"git apply: git-diff dolent - /dev/null esperat, %s rebut en la línia %d"
 
-#: archive.c:435
-msgid "read .gitattributes in working directory"
-msgstr "llegeix .gitattributes en el directori de treball"
+#: apply.c:983
+#, c-format
+msgid "git apply: bad git-diff - inconsistent new filename on line %d"
+msgstr ""
+"git apply: git-diff dolent - nom de fitxer nou inconsistent en la línia %d"
 
-#: archive.c:436
-msgid "report archived files on stderr"
-msgstr "informa de fitxers arxivats en stderr"
+#: apply.c:984
+#, c-format
+msgid "git apply: bad git-diff - inconsistent old filename on line %d"
+msgstr ""
+"git apply: git-diff dolent - nom de fitxer antic inconsistent en la línia %d"
 
-#: archive.c:437
-msgid "store only"
-msgstr "només emmagatzema"
+#: apply.c:990
+#, c-format
+msgid "git apply: bad git-diff - expected /dev/null on line %d"
+msgstr "git apply: git-diff dolent - /dev/null esperat en la línia %d"
 
-#: archive.c:438
-msgid "compress faster"
-msgstr "comprimeix més ràpidament"
+#: apply.c:1488
+#, c-format
+msgid "recount: unexpected line: %.*s"
+msgstr "recompte: línia inesperada: %.*s"
 
-#: archive.c:446
-msgid "compress better"
-msgstr "comprimeix millor"
+#: apply.c:1557
+#, c-format
+msgid "patch fragment without header at line %d: %.*s"
+msgstr "fragment de pedaç sense capçalera a la línia %d: %.*s"
 
-#: archive.c:449
-msgid "list supported archive formats"
-msgstr "allista els formats d'arxiu admesos"
+#: apply.c:1577
+#, c-format
+msgid ""
+"git diff header lacks filename information when removing %d leading pathname "
+"component (line %d)"
+msgid_plural ""
+"git diff header lacks filename information when removing %d leading pathname "
+"components (line %d)"
+msgstr[0] ""
+"a la capçalera de git diff li manca informació de nom de fitxer en eliminar "
+"%d component de nom de camí inicial (línia %d)"
+msgstr[1] ""
+"a la capçalera de git diff li manca informació de nom de fitxer en eliminar "
+"%d components de nom de camí inicial (línia %d)"
 
-#: archive.c:451 builtin/archive.c:90 builtin/clone.c:82
-#: builtin/submodule--helper.c:832
-msgid "repo"
-msgstr "dipòsit"
+#: apply.c:1589
+#, c-format
+msgid "git diff header lacks filename information (line %d)"
+msgstr ""
+"a la capçalera de git diff li manca informació de nom de fitxer (línia %d)"
 
-#: archive.c:452 builtin/archive.c:91
-msgid "retrieve the archive from remote repository <repo>"
-msgstr "recupera l'arxiu del dipòsit remot <dipòsit>"
+#: apply.c:1759
+msgid "new file depends on old contents"
+msgstr "el fitxer nou depèn dels continguts antics"
 
-#: archive.c:453 builtin/archive.c:92 builtin/notes.c:483
-msgid "command"
-msgstr "ordre"
+#: apply.c:1761
+msgid "deleted file still has contents"
+msgstr "el fitxer suprimit encara té continguts"
 
-#: archive.c:454 builtin/archive.c:93
-msgid "path to the remote git-upload-archive command"
-msgstr "camí a l'ordre git-upload-archive remota"
+#: apply.c:1795
+#, c-format
+msgid "corrupt patch at line %d"
+msgstr "pedaç malmès a la línia %d"
 
-#: archive.c:461
-msgid "Unexpected option --remote"
-msgstr "Opció inesperada --remote"
+#: apply.c:1832
+#, c-format
+msgid "new file %s depends on old contents"
+msgstr "el fitxer nou %s depèn dels continguts antics"
 
-#: archive.c:463
-msgid "Option --exec can only be used together with --remote"
-msgstr "L'opció --exec només es pot usar junt amb --remote"
+#: apply.c:1834
+#, c-format
+msgid "deleted file %s still has contents"
+msgstr "el fitxer suprimit %s encara té continguts"
 
-#: archive.c:465
-msgid "Unexpected option --output"
-msgstr "Opció inesperada --output"
+#: apply.c:1837
+#, c-format
+msgid "** warning: file %s becomes empty but is not deleted"
+msgstr "** advertència: el fitxer %s queda buit però no se suprimeix"
 
-#: archive.c:487
+#: apply.c:1984
 #, c-format
-msgid "Unknown archive format '%s'"
-msgstr "Format d'arxiu desconegut '%s'"
+msgid "corrupt binary patch at line %d: %.*s"
+msgstr "pedaç binari malmès a la línia %d: %.*s"
 
-#: archive.c:494
+#: apply.c:2021
 #, c-format
-msgid "Argument not supported for format '%s': -%d"
-msgstr "Paràmetre no admet per al format '%s': -%d"
+msgid "unrecognized binary patch at line %d"
+msgstr "pedaç binari no reconegut a la línia %d"
 
-#: attr.c:263
-msgid ""
-"Negative patterns are ignored in git attributes\n"
-"Use '\\!' for literal leading exclamation."
-msgstr ""
-"Els patrons negatius s'ignoren en els atributs de git\n"
-"Useu '\\!' per exclamació capdavantera literal."
+#: apply.c:2182
+#, c-format
+msgid "patch with only garbage at line %d"
+msgstr "pedaç amb només escombraries a la línia %d"
 
-#: bisect.c:441
+#: apply.c:2274
 #, c-format
-msgid "Could not open file '%s'"
-msgstr "No s'ha pogut obrir el fitxer '%s'"
+msgid "unable to read symlink %s"
+msgstr "no s'ha pogut llegir l'enllaç simbòlic %s"
 
-#: bisect.c:446
+#: apply.c:2278
 #, c-format
-msgid "Badly quoted content in file '%s': %s"
-msgstr "Comentari amb cometes dolentes en el fitxer '%s': %s"
+msgid "unable to open or read %s"
+msgstr "no s'ha pogut obrir o llegir %s"
 
-#: bisect.c:655
+#: apply.c:2931
 #, c-format
-msgid "We cannot bisect more!\n"
-msgstr "No podem bisecar més!\n"
+msgid "invalid start of line: '%c'"
+msgstr "inici de línia no vàlid: '%c'"
 
-#: bisect.c:708
+#: apply.c:3050
 #, c-format
-msgid "Not a valid commit name %s"
-msgstr "No és un nom de comissió vàlid %s"
+msgid "Hunk #%d succeeded at %d (offset %d line)."
+msgid_plural "Hunk #%d succeeded at %d (offset %d lines)."
+msgstr[0] "El tros #%d ha tingut èxit a %d (desplaçament d'%d línia)."
+msgstr[1] "El tros #%d ha tingut èxit a %d (desplaçament de %d línies)."
 
-#: bisect.c:732
+#: apply.c:3062
 #, c-format
-msgid ""
-"The merge base %s is bad.\n"
-"This means the bug has been fixed between %s and [%s].\n"
-msgstr ""
-"La base de fusió %s és dolenta.\n"
-"Això vol dir que el defecte s'ha arreglat entre %s i [%s].\n"
+msgid "Context reduced to (%ld/%ld) to apply fragment at %d"
+msgstr "El context s'ha reduït a (%ld/%ld) per a aplicar el fragment a %d"
 
-#: bisect.c:737
+#: apply.c:3068
 #, c-format
 msgid ""
-"The merge base %s is new.\n"
-"The property has changed between %s and [%s].\n"
+"while searching for:\n"
+"%.*s"
 msgstr ""
-"La base de fusió %s és nova.\n"
-"La propietat s'ha canviat entre %s i [%s].\n"
+"tot cercant:\n"
+"%.*s"
 
-#: bisect.c:742
+#: apply.c:3090
 #, c-format
-msgid ""
-"The merge base %s is %s.\n"
-"This means the first '%s' commit is between %s and [%s].\n"
-msgstr ""
-"La base de fusió %s és %s.\n"
-"Això vol dir que la primera comissió '%s' és entre %s i [%s].\n"
+msgid "missing binary patch data for '%s'"
+msgstr "manquen les dades de pedaç binari de '%s'"
 
-#: bisect.c:750
+#: apply.c:3098
 #, c-format
-msgid ""
-"Some %s revs are not ancestor of the %s rev.\n"
-"git bisect cannot work properly in this case.\n"
-"Maybe you mistook %s and %s revs?\n"
+msgid "cannot reverse-apply a binary patch without the reverse hunk to '%s'"
+msgstr "no es pot aplicar al revés un pedaç binari sense el tros revés a '%s'"
+
+#: apply.c:3144
+#, c-format
+msgid "cannot apply binary patch to '%s' without full index line"
 msgstr ""
-"Unes %s revisions no són els avantpassats de la revisió %s.\n"
-"git bisect no pot funcionar correctament en aquest cas.\n"
-"Potser heu confós les revisions %s i %s?\n"
+"no es pot aplicar un pedaç binari a '%s' sense la línia d'índex completa"
 
-#: bisect.c:763
+#: apply.c:3154
 #, c-format
 msgid ""
-"the merge base between %s and [%s] must be skipped.\n"
-"So we cannot be sure the first %s commit is between %s and %s.\n"
-"We continue anyway."
+"the patch applies to '%s' (%s), which does not match the current contents."
 msgstr ""
-"s'ha de saltar la base de fusió entre %s i [%s].\n"
-"Llavors, no podem estar segurs que la primera comissió %s sigui entre %s i "
-"%s.\n"
-"Continuem de totes maneres."
+"el pedaç s'aplica a '%s' (%s), el qual no coincideix amb els continguts "
+"actuals."
 
-#: bisect.c:798
+#: apply.c:3162
 #, c-format
-msgid "Bisecting: a merge base must be tested\n"
-msgstr "Bisecant: s'ha de provar una base de fusió\n"
+msgid "the patch applies to an empty '%s' but it is not empty"
+msgstr "el pedaç s'aplica a un '%s' buit però no és buit"
 
-#: bisect.c:849
+#: apply.c:3180
 #, c-format
-msgid "a %s revision is needed"
-msgstr "es necessita una revisió %s"
+msgid "the necessary postimage %s for '%s' cannot be read"
+msgstr "no es pot llegir la postimatge necessari %s per a '%s'"
 
-#: bisect.c:866 builtin/notes.c:174 builtin/tag.c:248
+#: apply.c:3193
 #, c-format
-msgid "could not create file '%s'"
-msgstr "no s'ha pogut crear el fitxer '%s'"
+msgid "binary patch does not apply to '%s'"
+msgstr "el pedaç binari no s'aplica a '%s'"
 
-#: bisect.c:917
+#: apply.c:3199
 #, c-format
-msgid "could not read file '%s'"
-msgstr "no s'ha pogut llegir el fitxer '%s'"
+msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)"
+msgstr ""
+"el pedaç binari a '%s' crea un resultat incorrecte (esperant %s, %s rebut)"
 
-#: bisect.c:947
-msgid "reading bisect refs failed"
-msgstr "la lectura de les referències de bisecció ha fallat"
+#: apply.c:3220
+#, c-format
+msgid "patch failed: %s:%ld"
+msgstr "el pedaç ha fallat: %s:%ld"
 
-#: bisect.c:967
+#: apply.c:3342
 #, c-format
-msgid "%s was both %s and %s\n"
-msgstr "%s era ambdós %s i %s\n"
+msgid "cannot checkout %s"
+msgstr "no es pot agafar %s"
 
-#: bisect.c:975
+#: apply.c:3390 apply.c:3401 apply.c:3447 setup.c:248
 #, c-format
-msgid ""
-"No testable commit found.\n"
-"Maybe you started with bad path parameters?\n"
-msgstr ""
-"No s'ha trobat cap comissió provable.\n"
-"Potser heu començat amb paràmetres de camí dolents?\n"
+msgid "failed to read %s"
+msgstr "s'ha fallat en llegir %s"
 
-#: bisect.c:994
+#: apply.c:3398
 #, c-format
-msgid "(roughly %d step)"
-msgid_plural "(roughly %d steps)"
-msgstr[0] "(aproximadament %d pas)"
-msgstr[1] "(aproximadament %d passos)"
+msgid "reading from '%s' beyond a symbolic link"
+msgstr "s'està llegint de '%s' més enllà d'un enllaç simbòlic"
 
-#. TRANSLATORS: the last %s will be replaced with
-#. "(roughly %d steps)" translation
-#: bisect.c:998
+#: apply.c:3427 apply.c:3667
 #, c-format
-msgid "Bisecting: %d revision left to test after this %s\n"
-msgid_plural "Bisecting: %d revisions left to test after this %s\n"
-msgstr[0] "Bisecant: manca %d revisió a provar després d'aquesta %s\n"
-msgstr[1] "Bisecant: manquen %d revisions a provar després d'aquesta %s\n"
+msgid "path %s has been renamed/deleted"
+msgstr "el camí %s s'ha canviat de nom / s'ha suprimit"
 
-#: branch.c:53
+#: apply.c:3510 apply.c:3681
 #, c-format
-msgid ""
-"\n"
-"After fixing the error cause you may try to fix up\n"
-"the remote tracking information by invoking\n"
-"\"git branch --set-upstream-to=%s%s%s\"."
-msgstr ""
-"\n"
-"Després de corregir la causa de l'error, podeu\n"
-"intentar corregir la informació de seguiment remot\n"
-"invocant \"git branch --set-upstream-to=%s%s%s\"."
+msgid "%s: does not exist in index"
+msgstr "%s: no existeix en l'índex"
 
-#: branch.c:67
+#: apply.c:3519 apply.c:3689
 #, c-format
-msgid "Not setting branch %s as its own upstream."
-msgstr "No s'està establint la branca %s com a la seva pròpia font."
+msgid "%s: does not match index"
+msgstr "%s: no coincideix amb l'índex"
 
-#: branch.c:93
-#, c-format
-msgid "Branch %s set up to track remote branch %s from %s by rebasing."
+#: apply.c:3554
+msgid "repository lacks the necessary blob to fall back on 3-way merge."
 msgstr ""
-"La branca %s està configurada per a seguir la branca remota %s de %s per "
-"rebasar."
+"al dipòsit li manca el blob necessari per a retrocedir a una fusió de 3 vies."
 
-#: branch.c:94
+#: apply.c:3557
 #, c-format
-msgid "Branch %s set up to track remote branch %s from %s."
-msgstr "La branca %s està configurada per a seguir la branca remota %s de %s."
+msgid "Falling back to three-way merge...\n"
+msgstr "S'està retrocedint a una fusió de 3 vies...\n"
 
-#: branch.c:98
+#: apply.c:3573 apply.c:3577
 #, c-format
-msgid "Branch %s set up to track local branch %s by rebasing."
-msgstr ""
-"La branca %s està configurada per a seguir la branca local %s per rebasar."
+msgid "cannot read the current contents of '%s'"
+msgstr "no es poden llegir els continguts actuals de '%s'"
 
-#: branch.c:99
+#: apply.c:3589
 #, c-format
-msgid "Branch %s set up to track local branch %s."
-msgstr "La branca %s està configurada per a seguir la branca local %s."
+msgid "Failed to fall back on three-way merge...\n"
+msgstr "S'ha fallat en retrocedir a una fusió de 3 vies...\n"
 
-#: branch.c:104
+#: apply.c:3603
 #, c-format
-msgid "Branch %s set up to track remote ref %s by rebasing."
-msgstr ""
-"La branca %s està configurada per a seguir la referència remota %s per "
-"rebasar."
+msgid "Applied patch to '%s' with conflicts.\n"
+msgstr "S'ha aplicat el pedaç a '%s' amb conflictes.\n"
 
-#: branch.c:105
+#: apply.c:3608
 #, c-format
-msgid "Branch %s set up to track remote ref %s."
-msgstr "La branca %s està configurada per a seguir la referència remota %s."
+msgid "Applied patch to '%s' cleanly.\n"
+msgstr "S'ha aplicat el pedaç a '%s' netament.\n"
 
-#: branch.c:109
-#, c-format
-msgid "Branch %s set up to track local ref %s by rebasing."
-msgstr ""
-"La branca %s està configurada per a seguir la referència local %s per "
-"rebasar."
+#: apply.c:3634
+msgid "removal patch leaves file contents"
+msgstr "el pedaç d'eliminació deixa els continguts dels fitxers"
 
-#: branch.c:110
+#: apply.c:3706
 #, c-format
-msgid "Branch %s set up to track local ref %s."
-msgstr "La branca %s està configurada per a seguir la referència local %s."
-
-#: branch.c:119
-msgid "Unable to write upstream branch configuration"
-msgstr "No es pot escriure la configuració de la branca font"
+msgid "%s: wrong type"
+msgstr "%s: tipus erroni"
 
-#: branch.c:156
+#: apply.c:3708
 #, c-format
-msgid "Not tracking: ambiguous information for ref %s"
-msgstr "No seguint: informació ambigua per a la referència %s"
+msgid "%s has type %o, expected %o"
+msgstr "%s és del tipus %o, s'esperava %o"
 
-#: branch.c:185
+#: apply.c:3859 apply.c:3861
 #, c-format
-msgid "'%s' is not a valid branch name."
-msgstr "'%s' no és un nom de branca vàlid."
+msgid "invalid path '%s'"
+msgstr "camí no vàlid: %s"
 
-#: branch.c:190
+#: apply.c:3917
 #, c-format
-msgid "A branch named '%s' already exists."
-msgstr "Una branca amb nom '%s' ja existeix."
-
-#: branch.c:198
-msgid "Cannot force update the current branch."
-msgstr "No es pot actualitzar la branca actual a la força."
+msgid "%s: already exists in index"
+msgstr "%s: ja existeix en l'índex"
 
-#: branch.c:218
+#: apply.c:3920
 #, c-format
-msgid "Cannot setup tracking information; starting point '%s' is not a branch."
-msgstr ""
-"No es pot configurar la informació de seguiment; el punt inicial '%s' no és "
-"una branca."
+msgid "%s: already exists in working directory"
+msgstr "%s: ja existeix en el directori de treball"
 
-#: branch.c:220
+#: apply.c:3940
 #, c-format
-msgid "the requested upstream branch '%s' does not exist"
-msgstr "la branca font demanada '%s' no existeix"
-
-#: branch.c:222
-msgid ""
-"\n"
-"If you are planning on basing your work on an upstream\n"
-"branch that already exists at the remote, you may need to\n"
-"run \"git fetch\" to retrieve it.\n"
-"\n"
-"If you are planning to push out a new local branch that\n"
-"will track its remote counterpart, you may want to use\n"
-"\"git push -u\" to set the upstream config as you push."
-msgstr ""
-"\n"
-"Si teniu pensat basar el vostre treball en una branca\n"
-"font que ja existeix al remot, pot ser que necessiteu\n"
-"executar \"git fetch\" per a obtenir-la.\n"
-"\n"
-"Si teniu pensat pujar una branca local nova que seguirà\n"
-"la seva contrapart remota, pot ser que vulgueu usar\n"
-"\"git push -u\" per a establir la configuració font\n"
-"mentre pugeu."
+msgid "new mode (%o) of %s does not match old mode (%o)"
+msgstr "el mode nou (%o) de %s no coincideix amb el mode antic (%o)"
 
-#: branch.c:266
+#: apply.c:3945
 #, c-format
-msgid "Not a valid object name: '%s'."
-msgstr "No és un nom d'objecte vàlid: '%s'."
+msgid "new mode (%o) of %s does not match old mode (%o) of %s"
+msgstr "el mode nou (%o) de %s no coincideix amb el mode antic (%o) de %s"
 
-#: branch.c:286
+#: apply.c:3965
 #, c-format
-msgid "Ambiguous object name: '%s'."
-msgstr "Nom d'objecte ambigu: '%s'."
+msgid "affected file '%s' is beyond a symbolic link"
+msgstr "el fitxer afectat '%s' és més enllà d'un enllaç simbòlic"
 
-#: branch.c:291
+#: apply.c:3969
 #, c-format
-msgid "Not a valid branch point: '%s'."
-msgstr "No és un punt de ramificació vàlid: '%s'."
+msgid "%s: patch does not apply"
+msgstr "%s: el pedaç no s'aplica"
 
-#: branch.c:345
+#: apply.c:3984
 #, c-format
-msgid "'%s' is already checked out at '%s'"
-msgstr "'%s' ja s'ha agafat a '%s'"
+msgid "Checking patch %s..."
+msgstr "S'està comprovant el pedaç %s..."
 
-#: branch.c:364
+#: apply.c:4075
 #, c-format
-msgid "HEAD of working tree %s is not updated"
-msgstr "La HEAD de l'arbre de treball %s no està actualitzat"
+msgid "sha1 information is lacking or useless for submodule %s"
+msgstr "falta la informació sha1 o és inútil per al submòdul %s"
 
-#: bundle.c:34
+#: apply.c:4082
 #, c-format
-msgid "'%s' does not look like a v2 bundle file"
-msgstr "'%s' no sembla un fitxer de farcell v2"
+msgid "mode change for %s, which is not in current HEAD"
+msgstr "canvi de mode per a %s, el qual no està en el HEAD actual"
 
-#: bundle.c:61
+#: apply.c:4085
 #, c-format
-msgid "unrecognized header: %s%s (%d)"
-msgstr "capçalera no reconeguda: %s%s (%d)"
+msgid "sha1 information is lacking or useless (%s)."
+msgstr "falta informació sha1 o és inútil (%s)."
 
-#: bundle.c:87 builtin/commit.c:778
+#: apply.c:4090 builtin/checkout.c:233 builtin/reset.c:135
 #, c-format
-msgid "could not open '%s'"
-msgstr "no s'ha pogut obrir '%s'"
-
-#: bundle.c:139
-msgid "Repository lacks these prerequisite commits:"
-msgstr "Al dipòsit li manquen aquestes comissions prerequisits:"
+msgid "make_cache_entry failed for path '%s'"
+msgstr "make_cache_entry ha fallat per al camí '%s'"
 
-#: bundle.c:163 ref-filter.c:1462 sequencer.c:630 sequencer.c:1085
-#: builtin/blame.c:2763 builtin/commit.c:1057 builtin/log.c:348
-#: builtin/log.c:890 builtin/log.c:1336 builtin/log.c:1659 builtin/log.c:1901
-#: builtin/merge.c:356 builtin/shortlog.c:170
-msgid "revision walk setup failed"
-msgstr "la configuració del passeig per revisions ha fallat"
+#: apply.c:4094
+#, c-format
+msgid "could not add %s to temporary index"
+msgstr "no s'ha pogut afegir %s a l'index temporal"
 
-#: bundle.c:185
+#: apply.c:4104
 #, c-format
-msgid "The bundle contains this ref:"
-msgid_plural "The bundle contains these %d refs:"
-msgstr[0] "El farcell conté aquesta referència:"
-msgstr[1] "El farcell conté aquestes %d referències:"
+msgid "could not write temporary index to %s"
+msgstr "no s'ha pogut escriure l'índex temporal a %s"
 
-#: bundle.c:192
-msgid "The bundle records a complete history."
-msgstr "El farcell registra una història completa."
+#: apply.c:4242
+#, c-format
+msgid "unable to remove %s from index"
+msgstr "no s'ha pogut eliminar %s de l'índex"
 
-#: bundle.c:194
+#: apply.c:4277
 #, c-format
-msgid "The bundle requires this ref:"
-msgid_plural "The bundle requires these %d refs:"
-msgstr[0] "El farcell requereix aquesta referència:"
-msgstr[1] "El farcell requereix aquestes %d referències:"
+msgid "corrupt patch for submodule %s"
+msgstr "pedaç malmès per al submòdul %s"
 
-#: bundle.c:253
-msgid "Could not spawn pack-objects"
-msgstr "No s'ha pogut executar el pack-objects"
+#: apply.c:4283
+#, c-format
+msgid "unable to stat newly created file '%s'"
+msgstr "no s'ha pogut fer stat al fitxer novament creat '%s'"
 
-#: bundle.c:264
-msgid "pack-objects died"
-msgstr "El pack-objects s'ha mort"
+#: apply.c:4291
+#, c-format
+msgid "unable to create backing store for newly created file %s"
+msgstr ""
+"no s'ha pogut crear un magatzem de recolzament per al fitxer novament creat "
+"%s"
 
-#: bundle.c:304
-msgid "rev-list died"
-msgstr "El rev-list s'ha mort"
+#: apply.c:4297 apply.c:4441
+#, c-format
+msgid "unable to add cache entry for %s"
+msgstr "no s'ha pogut afegir una entrada de cau per a %s"
 
-#: bundle.c:353
+#: apply.c:4338
 #, c-format
-msgid "ref '%s' is excluded by the rev-list options"
-msgstr "les opcions de la llista de revisions exclouen la referència '%s'"
+msgid "failed to write to '%s'"
+msgstr "s'ha fallat en escriure a '%s'"
 
-#: bundle.c:443 builtin/log.c:165 builtin/log.c:1565 builtin/shortlog.c:273
+#: apply.c:4342
 #, c-format
-msgid "unrecognized argument: %s"
-msgstr "paràmetre no reconegut: %s"
+msgid "closing file '%s'"
+msgstr "s'està tancant el fitxer '%s'"
 
-#: bundle.c:451
-msgid "Refusing to create empty bundle."
-msgstr "S'està refusant crear un farcell buit."
+#: apply.c:4412
+#, c-format
+msgid "unable to write file '%s' mode %o"
+msgstr "no s'ha pogut escriure el fitxer '%s' mode %o"
 
-#: bundle.c:463
+#: apply.c:4510
 #, c-format
-msgid "cannot create '%s'"
-msgstr "no es pot crear '%s'"
+msgid "Applied patch %s cleanly."
+msgstr "El pedaç %s s'ha aplicat netament."
 
-#: bundle.c:491
-msgid "index-pack died"
-msgstr "L'index-pack s'ha mort"
+#: apply.c:4518
+msgid "internal error"
+msgstr "error intern"
 
-#: color.c:290
+#: apply.c:4521
 #, c-format
-msgid "invalid color value: %.*s"
-msgstr "valor de color no vàlid: %.*s"
+msgid "Applying patch %%s with %d reject..."
+msgid_plural "Applying patch %%s with %d rejects..."
+msgstr[0] "S'està aplicant el pedaç %%s amb %d rebuig..."
+msgstr[1] "S'està aplicant el pedaç %%s amb %d rebuitjos..."
 
-#: commit.c:40 builtin/am.c:433 builtin/am.c:469 builtin/am.c:1505
-#: builtin/am.c:2119
+#: apply.c:4532
 #, c-format
-msgid "could not parse %s"
-msgstr "no s'ha pogut analitzar %s"
+msgid "truncating .rej filename to %.*s.rej"
+msgstr "s'està truncant el nom del fitxer .rej a %.*s.rej"
 
-#: commit.c:42
+#: apply.c:4540 builtin/fetch.c:740 builtin/fetch.c:989
 #, c-format
-msgid "%s %s is not a commit!"
-msgstr "%s %s no és una comissió!"
+msgid "cannot open %s"
+msgstr "no es pot obrir %s"
 
-#: compat/obstack.c:406 compat/obstack.c:408
-msgid "memory exhausted"
-msgstr "memòria esgotada"
+#: apply.c:4554
+#, c-format
+msgid "Hunk #%d applied cleanly."
+msgstr "El tros #%d s'ha aplicat netament."
 
-#: config.c:516
+#: apply.c:4558
 #, c-format
-msgid "bad config line %d in blob %s"
-msgstr "línia de configuració dolenta %d en el blob %s"
+msgid "Rejected hunk #%d."
+msgstr "S'ha rebutjat el tros #%d."
 
-#: config.c:520
+#: apply.c:4668
 #, c-format
-msgid "bad config line %d in file %s"
-msgstr "línia de configuració dolenta %d en el fitxer %s"
+msgid "Skipped patch '%s'."
+msgstr "S'ha saltat el pedaç '%s'."
 
-#: config.c:524
+#: apply.c:4676
+msgid "unrecognized input"
+msgstr "entrada no reconeguda"
+
+#: apply.c:4695
+msgid "unable to read index file"
+msgstr "no es pot llegir el fitxer d'índex"
+
+#: apply.c:4833
 #, c-format
-msgid "bad config line %d in standard input"
-msgstr "línia de configuració dolenta %d en l'entrada estàndard"
+msgid "can't open patch '%s': %s"
+msgstr "no es pot obrir el pedaç '%s': %s"
 
-#: config.c:528
+#: apply.c:4858
 #, c-format
-msgid "bad config line %d in submodule-blob %s"
-msgstr "línia de configuració dolenta %d en el blob de submòdul %s"
+msgid "squelched %d whitespace error"
+msgid_plural "squelched %d whitespace errors"
+msgstr[0] "s'ha omès %d error d'espai en blanc"
+msgstr[1] "s'han omès %d errors d'espai en blanc"
 
-#: config.c:532
+#: apply.c:4864 apply.c:4879
 #, c-format
-msgid "bad config line %d in command line %s"
-msgstr "línia de configuració dolenta %d en la línia d'ordres %s"
+msgid "%d line adds whitespace errors."
+msgid_plural "%d lines add whitespace errors."
+msgstr[0] "%d línia afegeix errors d'espai en blanc."
+msgstr[1] "%d línies afegeixen errors d'espai en blanc."
 
-#: config.c:536
+#: apply.c:4872
 #, c-format
-msgid "bad config line %d in %s"
-msgstr "línia de configuració dolenta %d en %s"
+msgid "%d line applied after fixing whitespace errors."
+msgid_plural "%d lines applied after fixing whitespace errors."
+msgstr[0] ""
+"S'ha aplicat %d línia desprès d'arreglar els errors d'espai en blanc."
+msgstr[1] ""
+"S'han aplicat %d línies desprès d'arreglar els errors d'espai en blanc."
 
-#: config.c:655
-msgid "out of range"
-msgstr "fora de rang"
+#: apply.c:4888 builtin/add.c:463 builtin/mv.c:286 builtin/rm.c:431
+msgid "Unable to write new index file"
+msgstr "no s'ha pogut escriure un fitxer d'índex nou"
 
-#: config.c:655
-msgid "invalid unit"
-msgstr "unitat no vàlida"
+#: apply.c:4919 apply.c:4922 builtin/am.c:2277 builtin/am.c:2280
+#: builtin/clone.c:95 builtin/fetch.c:98 builtin/pull.c:180
+#: builtin/submodule--helper.c:281 builtin/submodule--helper.c:407
+#: builtin/submodule--helper.c:589 builtin/submodule--helper.c:592
+#: builtin/submodule--helper.c:944 builtin/submodule--helper.c:947
+msgid "path"
+msgstr "camí"
 
-#: config.c:661
-#, c-format
-msgid "bad numeric config value '%s' for '%s': %s"
-msgstr "valor de configuració numèric dolent '%s' per '%s': %s"
+#: apply.c:4920
+msgid "don't apply changes matching the given path"
+msgstr "no apliquis els canvis que coincideixin amb el camí donat"
 
-#: config.c:666
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in blob %s: %s"
-msgstr "valor de configuració numèric dolent '%s' per '%s' en el blob %s: %s"
+#: apply.c:4923
+msgid "apply changes matching the given path"
+msgstr "aplica els canvis que coincideixin amb el camí donat"
 
-#: config.c:669
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in file %s: %s"
-msgstr "valor de configuració numèric dolent '%s' per '%s' en el fitxer %s: %s"
+#: apply.c:4925 builtin/am.c:2286
+msgid "num"
+msgstr "número"
 
-#: config.c:672
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in standard input: %s"
+#: apply.c:4926
+msgid "remove <num> leading slashes from traditional diff paths"
 msgstr ""
-"valor de configuració numèric dolent '%s' per '%s' en l'entrada estàndard: %s"
+"elimina <nombre> barres obliqües inicials dels camins de diferència "
+"tradicionals"
 
-#: config.c:675
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in submodule-blob %s: %s"
-msgstr ""
-"valor de configuració numèric dolent '%s' per '%s' en el blob de submòdul "
-"%s: %s"
+#: apply.c:4929
+msgid "ignore additions made by the patch"
+msgstr "ignora afegiments fets pel pedaç"
 
-#: config.c:678
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in command line %s: %s"
+#: apply.c:4931
+msgid "instead of applying the patch, output diffstat for the input"
 msgstr ""
-"valor de configuració numèric dolent '%s' per '%s' en la línia d'ordres %s: "
-"%s"
+"en lloc d'aplicar el pedaç, emet les estadístiques de diferència de l'entrada"
 
-#: config.c:681
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in %s: %s"
-msgstr "valor de configuració numèric dolent '%s' per '%s' en %s: %s"
+#: apply.c:4935
+msgid "show number of added and deleted lines in decimal notation"
+msgstr "mostra el nombre de línies afegides i suprimides en notació decimal"
 
-#: config.c:768
-#, c-format
-msgid "failed to expand user dir in: '%s'"
-msgstr "s'ha fallat en expandir el directori d'usuari en '%s'"
+#: apply.c:4937
+msgid "instead of applying the patch, output a summary for the input"
+msgstr "en lloc d'aplicar el pedaç, emet un resum de l'entrada"
 
-#: config.c:849 config.c:860
-#, c-format
-msgid "bad zlib compression level %d"
-msgstr "nivell de compressió de zlib dolent %d"
+#: apply.c:4939
+msgid "instead of applying the patch, see if the patch is applicable"
+msgstr "en lloc d'aplicar el pedaç, veges si el pedaç és aplicable"
 
-#: config.c:978
-#, c-format
-msgid "invalid mode for object creation: %s"
-msgstr "mode de creació d'objecte no vàlid: %s"
+#: apply.c:4941
+msgid "make sure the patch is applicable to the current index"
+msgstr "assegura que el pedaç sigui aplicable a l'índex actual"
 
-#: config.c:1312
-msgid "unable to parse command-line config"
-msgstr "no s'ha pogut analitzar la configuració de la línia d'ordres"
+#: apply.c:4943
+msgid "apply a patch without touching the working tree"
+msgstr "aplica un pedaç sense tocar l'arbre de treball"
 
-#: config.c:1362
-msgid "unknown error occurred while reading the configuration files"
-msgstr "un error desconegut ha ocorregut en llegir els fitxers de configuració"
+#: apply.c:4945
+msgid "accept a patch that touches outside the working area"
+msgstr "accepta un pedaç que toqui fora de l'àrea de treball"
 
-#: config.c:1716
-#, c-format
-msgid "unable to parse '%s' from command-line config"
-msgstr "no s'ha pogut analitzar '%s' de la configuració de la línia d'ordres"
+#: apply.c:4947
+msgid "also apply the patch (use with --stat/--summary/--check)"
+msgstr "aplica el pedaç també (useu amb --stat/--summary/--check)"
 
-#: config.c:1718
-#, c-format
-msgid "bad config variable '%s' in file '%s' at line %d"
-msgstr "variable de configuració dolenta '%s' en el fitxer '%s' a la línia %d"
+#: apply.c:4949
+msgid "attempt three-way merge if a patch does not apply"
+msgstr "intenta una fusió de tres vies si el pedaç no s'aplica"
 
-#: config.c:1777
-#, c-format
-msgid "%s has multiple values"
-msgstr "%s té múltiples valors"
+#: apply.c:4951
+msgid "build a temporary index based on embedded index information"
+msgstr "construeix un índex temporal basat en la informació d'índex incrustada"
 
-#: config.c:2311
-#, c-format
-msgid "could not set '%s' to '%s'"
-msgstr "no s'ha pogut establir '%s' a '%s'"
+#: apply.c:4954 builtin/checkout-index.c:169 builtin/ls-files.c:505
+msgid "paths are separated with NUL character"
+msgstr "els camins se separen amb el caràcter NUL"
 
-#: config.c:2313
-#, c-format
-msgid "could not unset '%s'"
-msgstr "no s'ha pogut desestablir '%s'"
+#: apply.c:4956
+msgid "ensure at least <n> lines of context match"
+msgstr "assegura't que almenys <n> línies de context coincideixin"
 
-#: connected.c:63 builtin/fsck.c:173 builtin/prune.c:140
-msgid "Checking connectivity"
-msgstr "S'està comprovant la connectivitat"
+#: apply.c:4957 builtin/am.c:2265
+msgid "action"
+msgstr "acció"
 
-#: connected.c:74
-msgid "Could not run 'git rev-list'"
-msgstr "No s'ha pogut executar 'git rev-list'"
+#: apply.c:4958
+msgid "detect new or modified lines that have whitespace errors"
+msgstr ""
+"detecta les línies noves o modificades que tinguin errors d'espai en blanc"
 
-#: connected.c:94
-msgid "failed write to rev-list"
-msgstr "escriptura fallada a rev-list"
+#: apply.c:4961 apply.c:4964
+msgid "ignore changes in whitespace when finding context"
+msgstr "ignora els canvis d'espai en blanc en cercar context"
 
-#: connected.c:101
-msgid "failed to close rev-list's stdin"
-msgstr "s'ha fallat en tancar l'stdin del rev-list"
+#: apply.c:4967
+msgid "apply the patch in reverse"
+msgstr "aplica el pedaç al revés"
 
-#: date.c:97
-msgid "in the future"
-msgstr "en el futur"
+#: apply.c:4969
+msgid "don't expect at least one line of context"
+msgstr "no esperis almenys una línia de context"
 
-#: date.c:103
-#, c-format
-msgid "%lu second ago"
-msgid_plural "%lu seconds ago"
-msgstr[0] "fa %lu segon"
-msgstr[1] "fa %lu segons"
+#: apply.c:4971
+msgid "leave the rejected hunks in corresponding *.rej files"
+msgstr "deixa els trossos rebutjats en fitxers *.reg corresponents"
 
-#: date.c:110
-#, c-format
-msgid "%lu minute ago"
-msgid_plural "%lu minutes ago"
-msgstr[0] "fa %lu minut"
-msgstr[1] "fa %lu minuts"
+#: apply.c:4973
+msgid "allow overlapping hunks"
+msgstr "permet trossos encavalcants"
 
-#: date.c:117
-#, c-format
-msgid "%lu hour ago"
-msgid_plural "%lu hours ago"
-msgstr[0] "fa %lu hora"
-msgstr[1] "fa %lu hores"
+#: apply.c:4974 builtin/add.c:267 builtin/check-ignore.c:19
+#: builtin/commit.c:1339 builtin/count-objects.c:94 builtin/fsck.c:593
+#: builtin/log.c:1860 builtin/mv.c:110 builtin/read-tree.c:114
+msgid "be verbose"
+msgstr "sigues detallat"
 
-#: date.c:124
-#, c-format
-msgid "%lu day ago"
-msgid_plural "%lu days ago"
-msgstr[0] "fa %lu dia"
-msgstr[1] "fa %lu dies"
+#: apply.c:4976
+msgid "tolerate incorrectly detected missing new-line at the end of file"
+msgstr "tolera una línia nova incorrectament detectada al final del fitxer"
 
-#: date.c:130
-#, c-format
-msgid "%lu week ago"
-msgid_plural "%lu weeks ago"
-msgstr[0] "fa %lu setmana"
-msgstr[1] "fa %lu setmanes"
+#: apply.c:4979
+msgid "do not trust the line counts in the hunk headers"
+msgstr "no confiïs en els recomptes de línia en les capçaleres dels trossos"
 
-#: date.c:137
-#, c-format
-msgid "%lu month ago"
-msgid_plural "%lu months ago"
-msgstr[0] "fa %lu mes"
-msgstr[1] "fa %lu mesos"
+#: apply.c:4981 builtin/am.c:2274
+msgid "root"
+msgstr "arrel"
 
-#: date.c:148
-#, c-format
-msgid "%lu year"
-msgid_plural "%lu years"
-msgstr[0] "%lu any"
-msgstr[1] "%lu anys"
+#: apply.c:4982
+msgid "prepend <root> to all filenames"
+msgstr "anteposa <arrel> a tots els noms de fitxer"
 
-#. TRANSLATORS: "%s" is "<n> years"
-#: date.c:151
-#, c-format
-msgid "%s, %lu month ago"
-msgid_plural "%s, %lu months ago"
-msgstr[0] "fa %s i %lu mes"
-msgstr[1] "fa %s i %lu mesos"
+#: archive.c:12
+msgid "git archive [<options>] <tree-ish> [<path>...]"
+msgstr "git archive [<opcions>] <arbre> [<camí>...]"
 
-#: date.c:156 date.c:161
-#, c-format
-msgid "%lu year ago"
-msgid_plural "%lu years ago"
-msgstr[0] "fa %lu any"
-msgstr[1] "fa %lu anys"
+#: archive.c:13
+msgid "git archive --list"
+msgstr "git archive --list"
 
-#: diffcore-order.c:24
-#, c-format
-msgid "failed to read orderfile '%s'"
-msgstr "s'ha fallat en llegir el fitxer d'ordres '%s'"
+#: archive.c:14
+msgid ""
+"git archive --remote <repo> [--exec <cmd>] [<options>] <tree-ish> [<path>...]"
+msgstr ""
+"git archive --remote <dipòsit> [--exec <ordre>] [<opcions>] <arbre> "
+"[<camí>...]"
 
-#: diffcore-rename.c:540
-msgid "Performing inexact rename detection"
-msgstr "S'està realitzant una detecció inexacta de canvis de nom"
+#: archive.c:15
+msgid "git archive --remote <repo> [--exec <cmd>] --list"
+msgstr "git archive --remote <dipòsit> [--exec <ordre>] --list"
 
-#: diff.c:116
+#: archive.c:344 builtin/add.c:152 builtin/add.c:442 builtin/rm.c:327
 #, c-format
-msgid "  Failed to parse dirstat cut-off percentage '%s'\n"
-msgstr "  S'ha fallat en analitzar el percentatge limitant de dirstat '%s'\n"
+msgid "pathspec '%s' did not match any files"
+msgstr "l'especificació de camí '%s' no ha coincidit amb cap fitxer"
 
-#: diff.c:121
-#, c-format
-msgid "  Unknown dirstat parameter '%s'\n"
-msgstr "  Paràmetre de dirstat desconegut '%s'\n"
+#: archive.c:429
+msgid "fmt"
+msgstr "format"
 
-#: diff.c:225
-#, c-format
-msgid "Unknown value for 'diff.submodule' config variable: '%s'"
-msgstr ""
-"Valor desconegut de la variable de configuració de 'diff.submodule': '%s'"
+#: archive.c:429
+msgid "archive format"
+msgstr "format d'arxiu"
 
-#: diff.c:277
-#, c-format
-msgid ""
-"Found errors in 'diff.dirstat' config variable:\n"
-"%s"
-msgstr ""
-"S'han trobat errors en la variable de configuració 'diff.dirstat':\n"
-"%s"
+#: archive.c:430 builtin/log.c:1429
+msgid "prefix"
+msgstr "prefix"
 
-#: diff.c:3017
-#, c-format
-msgid "external diff died, stopping at %s"
-msgstr "El diff external s'ha mort, s'està aturant a %s"
+#: archive.c:431
+msgid "prepend prefix to each pathname in the archive"
+msgstr "anteposa el prefix a cada nom de camí en l'arxiu"
 
-#: diff.c:3415
-msgid "--follow requires exactly one pathspec"
-msgstr "--follow requereix exactament una especificació de camí"
+#: archive.c:432 builtin/blame.c:2603 builtin/blame.c:2604 builtin/config.c:59
+#: builtin/fast-export.c:987 builtin/fast-export.c:989 builtin/grep.c:723
+#: builtin/hash-object.c:101 builtin/ls-files.c:539 builtin/ls-files.c:542
+#: builtin/notes.c:401 builtin/notes.c:564 builtin/read-tree.c:109
+#: parse-options.h:153
+msgid "file"
+msgstr "fitxer"
 
-#: diff.c:3578
-#, c-format
-msgid ""
-"Failed to parse --dirstat/-X option parameter:\n"
-"%s"
-msgstr ""
-"S'ha fallat en analitzar el paràmetre d'opció de --dirstat/-X:\n"
-"%s"
+#: archive.c:433 builtin/archive.c:89
+msgid "write the archive to this file"
+msgstr "escriu l'arxiu a aquest fitxer"
 
-#: diff.c:3592
-#, c-format
-msgid "Failed to parse --submodule option parameter: '%s'"
-msgstr "S'ha fallat en analitzar el paràmetre d'opció de --submodule: %s"
+#: archive.c:435
+msgid "read .gitattributes in working directory"
+msgstr "llegeix .gitattributes en el directori de treball"
 
-#: dir.c:1823
-msgid "failed to get kernel name and information"
-msgstr "s'ha fallat en obtenir el nombre i la informació del nucli"
+#: archive.c:436
+msgid "report archived files on stderr"
+msgstr "informa de fitxers arxivats en stderr"
 
-#: dir.c:1942
-msgid "Untracked cache is disabled on this system or location."
-msgstr ""
-"La memòria cau no seguida està inhabilitada en aquest sistema o ubicació."
+#: archive.c:437
+msgid "store only"
+msgstr "només emmagatzema"
 
-#: gpg-interface.c:178
-msgid "gpg failed to sign the data"
-msgstr "gpg ha fallat en signar les dades"
+#: archive.c:438
+msgid "compress faster"
+msgstr "comprimeix més ràpidament"
 
-#: gpg-interface.c:208
-msgid "could not create temporary file"
-msgstr "no s'ha pogut crear el fitxer temporal"
+#: archive.c:446
+msgid "compress better"
+msgstr "comprimeix millor"
 
-#: gpg-interface.c:210
-#, c-format
-msgid "failed writing detached signature to '%s'"
-msgstr "s'ha fallat en escriure la signatura separada a '%s'"
+#: archive.c:449
+msgid "list supported archive formats"
+msgstr "allista els formats d'arxiu admesos"
 
-#: grep.c:1792
-#, c-format
-msgid "'%s': unable to read %s"
-msgstr "'%s': no s'ha pogut llegir %s"
+#: archive.c:451 builtin/archive.c:90 builtin/clone.c:85 builtin/clone.c:88
+#: builtin/submodule--helper.c:601 builtin/submodule--helper.c:953
+msgid "repo"
+msgstr "dipòsit"
 
-#: grep.c:1809 builtin/clone.c:382 builtin/diff.c:84 builtin/rm.c:155
-#, c-format
-msgid "failed to stat '%s'"
-msgstr "s'ha fallat en fer stat a '%s'"
+#: archive.c:452 builtin/archive.c:91
+msgid "retrieve the archive from remote repository <repo>"
+msgstr "recupera l'arxiu del dipòsit remot <dipòsit>"
 
-#: grep.c:1820
-#, c-format
-msgid "'%s': short read"
-msgstr "'%s': lectura curta"
+#: archive.c:453 builtin/archive.c:92 builtin/notes.c:485
+msgid "command"
+msgstr "ordre"
 
-#: help.c:205
-#, c-format
-msgid "available git commands in '%s'"
-msgstr "ordres de git disponibles en '%s'"
+#: archive.c:454 builtin/archive.c:93
+msgid "path to the remote git-upload-archive command"
+msgstr "camí a l'ordre git-upload-archive remota"
 
-#: help.c:212
-msgid "git commands available from elsewhere on your $PATH"
-msgstr "ordres de git disponibles d'altres llocs en el vostre $PATH"
+#: archive.c:461
+msgid "Unexpected option --remote"
+msgstr "Opció inesperada --remote"
 
-#: help.c:244
-msgid "These are common Git commands used in various situations:"
-msgstr "Aquestes són ordres del Git comunament usades en diverses situacions:"
+#: archive.c:463
+msgid "Option --exec can only be used together with --remote"
+msgstr "L'opció --exec només es pot usar junt amb --remote"
 
-#: help.c:309
-#, c-format
-msgid ""
-"'%s' appears to be a git command, but we were not\n"
-"able to execute it. Maybe git-%s is broken?"
-msgstr ""
-"'%s' sembla una ordre de git, però no hem pogut\n"
-"executar-la. Pot ser que git-%s estigui estropejat?"
+#: archive.c:465
+msgid "Unexpected option --output"
+msgstr "Opció inesperada --output"
 
-#: help.c:366
-msgid "Uh oh. Your system reports no Git commands at all."
-msgstr "Ai. El vostre sistema no informa de cap ordre de Git."
+#: archive.c:487
+#, c-format
+msgid "Unknown archive format '%s'"
+msgstr "Format d'arxiu desconegut '%s'"
 
-#: help.c:388
+#: archive.c:494
 #, c-format
+msgid "Argument not supported for format '%s': -%d"
+msgstr "Paràmetre no admès per al format '%s': -%d"
+
+#: attr.c:263
 msgid ""
-"WARNING: You called a Git command named '%s', which does not exist.\n"
-"Continuing under the assumption that you meant '%s'"
+"Negative patterns are ignored in git attributes\n"
+"Use '\\!' for literal leading exclamation."
 msgstr ""
-"ADVERTÈNCIA: Heu invocat una ordre de Git amb nom '%s', la qual no "
-"existeix.\n"
-"S'està continuant sota l'assumpció que volíeu dir '%s'"
+"Els patrons negatius s'ignoren en els atributs de git\n"
+"Useu '\\!' per exclamació capdavantera literal."
 
-#: help.c:393
+#: bisect.c:441
 #, c-format
-msgid "in %0.1f seconds automatically..."
-msgstr "en %0.1f segons automàticament..."
+msgid "Could not open file '%s'"
+msgstr "No s'ha pogut obrir el fitxer '%s'"
 
-#: help.c:400
+#: bisect.c:446
 #, c-format
-msgid "git: '%s' is not a git command. See 'git --help'."
-msgstr "git: '%s' no és una ordre de git. Vegeu 'git --help'."
+msgid "Badly quoted content in file '%s': %s"
+msgstr "Comentari amb cometes dolentes en el fitxer '%s': %s"
 
-#: help.c:404 help.c:470
-msgid ""
-"\n"
-"Did you mean this?"
-msgid_plural ""
-"\n"
-"Did you mean one of these?"
-msgstr[0] ""
-"\n"
-"Volíeu dir això?"
-msgstr[1] ""
-"\n"
-"Volíeu dir un d'aquests?"
+#: bisect.c:655
+#, c-format
+msgid "We cannot bisect more!\n"
+msgstr "No podem bisecar més!\n"
 
-#: help.c:466
+#: bisect.c:708
 #, c-format
-msgid "%s: %s - %s"
-msgstr "%s: %s - %s"
+msgid "Not a valid commit name %s"
+msgstr "No és un nom de comissió vàlid %s"
 
-#: lockfile.c:152
+#: bisect.c:732
 #, c-format
 msgid ""
-"Unable to create '%s.lock': %s.\n"
-"\n"
-"Another git process seems to be running in this repository, e.g.\n"
-"an editor opened by 'git commit'. Please make sure all processes\n"
-"are terminated then try again. If it still fails, a git process\n"
-"may have crashed in this repository earlier:\n"
-"remove the file manually to continue."
+"The merge base %s is bad.\n"
+"This means the bug has been fixed between %s and [%s].\n"
 msgstr ""
-"No s'ha pogut crear '%s.lock': %s.\n"
-"\n"
-"Sembla que un altre procés de git s'està executant en aquest\n"
-"dipòsit, per exemple, un editor obert per 'git commit'. Si us\n"
-"plau, assegureu-vos que tots els processos s'hagin terminat i\n"
-"llavors trobeu de nou. Si encara falla, potser que un procés de\n"
-"git ha tingut una pana:\n"
-"elimineu el fitxer manualment per a continuar."
+"La base de fusió %s és dolenta.\n"
+"Això vol dir que el defecte s'ha arreglat entre %s i [%s].\n"
 
-#: lockfile.c:160
+#: bisect.c:737
 #, c-format
-msgid "Unable to create '%s.lock': %s"
-msgstr "No es pot crear '%s.lock': %s"
+msgid ""
+"The merge base %s is new.\n"
+"The property has changed between %s and [%s].\n"
+msgstr ""
+"La base de fusió %s és nova.\n"
+"La propietat s'ha canviat entre %s i [%s].\n"
 
-#: merge.c:41
-msgid "failed to read the cache"
-msgstr "s'ha fallat en llegir la memòria cau"
+#: bisect.c:742
+#, c-format
+msgid ""
+"The merge base %s is %s.\n"
+"This means the first '%s' commit is between %s and [%s].\n"
+msgstr ""
+"La base de fusió %s és %s.\n"
+"Això vol dir que la primera comissió '%s' és entre %s i [%s].\n"
 
-#: merge.c:94 builtin/am.c:1992 builtin/am.c:2027 builtin/checkout.c:375
-#: builtin/checkout.c:589 builtin/clone.c:732
-msgid "unable to write new index file"
-msgstr "no s'ha pogut escriure un fitxer d'índex nou"
+#: bisect.c:750
+#, c-format
+msgid ""
+"Some %s revs are not ancestor of the %s rev.\n"
+"git bisect cannot work properly in this case.\n"
+"Maybe you mistook %s and %s revs?\n"
+msgstr ""
+"Unes revisions %s no són els avantpassats de la revisió %s.\n"
+"git bisect no pot funcionar correctament en aquest cas.\n"
+"Potser heu confós les revisions %s i %s?\n"
 
-#: merge-recursive.c:209
-msgid "(bad commit)\n"
-msgstr "(comissió dolenta)\n"
+#: bisect.c:763
+#, c-format
+msgid ""
+"the merge base between %s and [%s] must be skipped.\n"
+"So we cannot be sure the first %s commit is between %s and %s.\n"
+"We continue anyway."
+msgstr ""
+"s'ha de saltar la base de fusió entre %s i [%s].\n"
+"Llavors, no podem estar segurs de que la primera comissió %s sigui entre %s "
+"i %s.\n"
+"Continuem de totes maneres."
 
-#: merge-recursive.c:231
+#: bisect.c:798
 #, c-format
-msgid "addinfo_cache failed for path '%s'"
-msgstr "addinfo_cache ha fallat per al camí '%s'"
+msgid "Bisecting: a merge base must be tested\n"
+msgstr "Bisecant: s'ha de provar una base de fusió\n"
 
-#: merge-recursive.c:301
-msgid "error building trees"
-msgstr "error en construir arbres"
+#: bisect.c:849
+#, c-format
+msgid "a %s revision is needed"
+msgstr "es necessita una revisió %s"
 
-#: merge-recursive.c:720
+#: bisect.c:866 builtin/notes.c:174 builtin/tag.c:248
 #, c-format
-msgid "failed to create path '%s'%s"
-msgstr "s'ha fallat en crear el camí '%s' %s"
+msgid "could not create file '%s'"
+msgstr "no s'ha pogut crear el fitxer '%s'"
 
-#: merge-recursive.c:731
+#: bisect.c:917
 #, c-format
-msgid "Removing %s to make room for subdirectory\n"
-msgstr "S'està eliminant %s per a fer espai per al subdirectori\n"
+msgid "could not read file '%s'"
+msgstr "no s'ha pogut llegir el fitxer '%s'"
 
-#: merge-recursive.c:745 merge-recursive.c:764
-msgid ": perhaps a D/F conflict?"
-msgstr ": potser un conflicte D/F?"
+#: bisect.c:947
+msgid "reading bisect refs failed"
+msgstr "la lectura de les referències de bisecció ha fallat"
 
-#: merge-recursive.c:754
+#: bisect.c:967
 #, c-format
-msgid "refusing to lose untracked file at '%s'"
-msgstr "s'està refusant perdre el fitxer no seguit a '%s'"
+msgid "%s was both %s and %s\n"
+msgstr "%s era ambdós %s i %s\n"
 
-#: merge-recursive.c:796
+#: bisect.c:975
 #, c-format
-msgid "cannot read object %s '%s'"
-msgstr "no es pot llegir l'objecte %s '%s'"
+msgid ""
+"No testable commit found.\n"
+"Maybe you started with bad path parameters?\n"
+msgstr ""
+"No s'ha trobat cap comissió provable.\n"
+"Potser heu començat amb paràmetres de camí dolents?\n"
 
-#: merge-recursive.c:798
+#: bisect.c:994
 #, c-format
-msgid "blob expected for %s '%s'"
-msgstr "blob esperat per a %s '%s'"
+msgid "(roughly %d step)"
+msgid_plural "(roughly %d steps)"
+msgstr[0] "(aproximadament %d pas)"
+msgstr[1] "(aproximadament %d passos)"
 
-#: merge-recursive.c:822
+#. TRANSLATORS: the last %s will be replaced with
+#. "(roughly %d steps)" translation
+#: bisect.c:998
 #, c-format
-msgid "failed to open '%s': %s"
-msgstr "s'ha fallat en obrir '%s': %s"
+msgid "Bisecting: %d revision left to test after this %s\n"
+msgid_plural "Bisecting: %d revisions left to test after this %s\n"
+msgstr[0] "Bisecant: manca %d revisió a provar després d'aquesta %s\n"
+msgstr[1] "Bisecant: manquen %d revisions a provar després d'aquesta %s\n"
 
-#: merge-recursive.c:833
+#: branch.c:53
 #, c-format
-msgid "failed to symlink '%s': %s"
-msgstr "s'ha fallat en fer l'enllaç simbòlic '%s': %s"
+msgid ""
+"\n"
+"After fixing the error cause you may try to fix up\n"
+"the remote tracking information by invoking\n"
+"\"git branch --set-upstream-to=%s%s%s\"."
+msgstr ""
+"\n"
+"Després de corregir la causa de l'error, podeu\n"
+"intentar corregir la informació de seguiment remot\n"
+"invocant \"git branch --set-upstream-to=%s%s%s\"."
 
-#: merge-recursive.c:838
+#: branch.c:67
 #, c-format
-msgid "do not know what to do with %06o %s '%s'"
-msgstr "no se sap què fer amb %06o %s '%s'"
-
-#: merge-recursive.c:978
-msgid "Failed to execute internal merge"
-msgstr "S'ha fallat en executar la fusió interna"
+msgid "Not setting branch %s as its own upstream."
+msgstr "No s'està establint la branca %s com a la seva pròpia font."
 
-#: merge-recursive.c:982
+#: branch.c:93
 #, c-format
-msgid "Unable to add %s to database"
-msgstr "no s'ha pogut afegir %s a la base de dades"
+msgid "Branch %s set up to track remote branch %s from %s by rebasing."
+msgstr ""
+"La branca %s està configurada per a seguir la branca remota %s de %s per "
+"rebasar."
 
-#: merge-recursive.c:1081 merge-recursive.c:1095
+#: branch.c:94
 #, c-format
-msgid ""
-"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
-"in tree."
-msgstr ""
-"CONFLICTE: (%s/supressió): %s suprimit en %s i %s en %s. La versió %s de %s "
-"s'ha deixat en l'arbre."
+msgid "Branch %s set up to track remote branch %s from %s."
+msgstr "La branca %s està configurada per a seguir la branca remota %s de %s."
 
-#: merge-recursive.c:1087 merge-recursive.c:1100
+#: branch.c:98
 #, c-format
-msgid ""
-"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
-"in tree at %s."
+msgid "Branch %s set up to track local branch %s by rebasing."
 msgstr ""
-"CONFLICTE: (%s/supressió): %s suprimit en %s i %s en %s. La versió %s de %s "
-"s'ha deixat en l'arbre a %s."
-
-#: merge-recursive.c:1143
-msgid "rename"
-msgstr "canvia de nom"
-
-#: merge-recursive.c:1143
-msgid "renamed"
-msgstr "canviat de nom"
+"La branca %s està configurada per a seguir la branca local %s per rebasar."
 
-#: merge-recursive.c:1200
+#: branch.c:99
 #, c-format
-msgid "%s is a directory in %s adding as %s instead"
-msgstr "%s és un directori en %s; s'està afegint com a %s en lloc d'això"
+msgid "Branch %s set up to track local branch %s."
+msgstr "La branca %s està configurada per a seguir la branca local %s."
 
-#: merge-recursive.c:1225
+#: branch.c:104
 #, c-format
-msgid ""
-"CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
-"\"->\"%s\" in \"%s\"%s"
+msgid "Branch %s set up to track remote ref %s by rebasing."
 msgstr ""
-"CONFLICTE (canvi de nom/canvi de nom): Canvi de nom \"%s\"->\"%s\" en la "
-"branca \"%s\" canvi de nom \"%s\"->\"%s\" en \"%s\"%s"
+"La branca %s està configurada per a seguir la referència remota %s per "
+"rebasar."
 
-#: merge-recursive.c:1230
-msgid " (left unresolved)"
-msgstr " (deixat sense resolució)"
+#: branch.c:105
+#, c-format
+msgid "Branch %s set up to track remote ref %s."
+msgstr "La branca %s està configurada per a seguir la referència remota %s."
 
-#: merge-recursive.c:1292
+#: branch.c:109
 #, c-format
-msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s"
+msgid "Branch %s set up to track local ref %s by rebasing."
 msgstr ""
-"CONFLICTE (canvi de nom/canvi de nom): Canvi de nom %s->%s en %s. Canvi de "
-"nom %s->%s en %s"
+"La branca %s està configurada per a seguir la referència local %s per "
+"rebasar."
 
-#: merge-recursive.c:1325
+#: branch.c:110
 #, c-format
-msgid "Renaming %s to %s and %s to %s instead"
-msgstr "S'està canviant el nom de %s a %s i %s a %s en lloc d'això"
+msgid "Branch %s set up to track local ref %s."
+msgstr "La branca %s està configurada per a seguir la referència local %s."
 
-#: merge-recursive.c:1531
+#: branch.c:119
+msgid "Unable to write upstream branch configuration"
+msgstr "No es pot escriure la configuració de la branca font"
+
+#: branch.c:156
 #, c-format
-msgid "CONFLICT (rename/add): Rename %s->%s in %s. %s added in %s"
-msgstr ""
-"CONFLICTE (canvi de nom/afegiment): Canvi de nom %s->%s en %s. %s afegit en "
-"%s"
+msgid "Not tracking: ambiguous information for ref %s"
+msgstr "No seguint: informació ambigua per a la referència %s"
 
-#: merge-recursive.c:1546
+#: branch.c:185
 #, c-format
-msgid "Adding merged %s"
-msgstr "S'està afegint %s fusionat"
+msgid "'%s' is not a valid branch name."
+msgstr "'%s' no és un nom de branca vàlid."
 
-#: merge-recursive.c:1553 merge-recursive.c:1766
+#: branch.c:190
 #, c-format
-msgid "Adding as %s instead"
-msgstr "S'està afegint com a %s en lloc d'això"
+msgid "A branch named '%s' already exists."
+msgstr "Una branca amb nom '%s' ja existeix."
 
-#: merge-recursive.c:1610
+#: branch.c:198
+msgid "Cannot force update the current branch."
+msgstr "No es pot actualitzar la branca actual a la força."
+
+#: branch.c:218
 #, c-format
-msgid "cannot read object %s"
-msgstr "no es pot llegir l'objecte %s"
+msgid "Cannot setup tracking information; starting point '%s' is not a branch."
+msgstr ""
+"No es pot configurar la informació de seguiment; el punt inicial '%s' no és "
+"una branca."
 
-#: merge-recursive.c:1613
+#: branch.c:220
 #, c-format
-msgid "object %s is not a blob"
-msgstr "L'objecte %s no és un blob"
+msgid "the requested upstream branch '%s' does not exist"
+msgstr "la branca font demanada '%s' no existeix"
 
-#: merge-recursive.c:1666
-msgid "modify"
-msgstr "modifica"
+#: branch.c:222
+msgid ""
+"\n"
+"If you are planning on basing your work on an upstream\n"
+"branch that already exists at the remote, you may need to\n"
+"run \"git fetch\" to retrieve it.\n"
+"\n"
+"If you are planning to push out a new local branch that\n"
+"will track its remote counterpart, you may want to use\n"
+"\"git push -u\" to set the upstream config as you push."
+msgstr ""
+"\n"
+"Si teniu pensat basar el vostre treball en una branca\n"
+"font que ja existeix al remot, pot ser que necessiteu\n"
+"executar \"git fetch\" per a obtenir-la.\n"
+"\n"
+"Si teniu pensat pujar una branca local nova que seguirà\n"
+"la seva contrapart remota, pot ser que vulgueu usar\n"
+"\"git push -u\" per a establir la configuració font\n"
+"mentre pugeu."
 
-#: merge-recursive.c:1666
-msgid "modified"
-msgstr "modificat"
+#: branch.c:265
+#, c-format
+msgid "Not a valid object name: '%s'."
+msgstr "No és un nom d'objecte vàlid: '%s'."
 
-#: merge-recursive.c:1676
-msgid "content"
-msgstr "contingut"
+#: branch.c:285
+#, c-format
+msgid "Ambiguous object name: '%s'."
+msgstr "Nom d'objecte ambigu: '%s'."
 
-#: merge-recursive.c:1683
-msgid "add/add"
-msgstr "afegiment/afegiment"
+#: branch.c:290
+#, c-format
+msgid "Not a valid branch point: '%s'."
+msgstr "No és un punt de ramificació vàlid: '%s'."
 
-#: merge-recursive.c:1718
+#: branch.c:344
 #, c-format
-msgid "Skipped %s (merged same as existing)"
-msgstr "S'ha saltat %s (el fusionat és igual a l'existent)"
+msgid "'%s' is already checked out at '%s'"
+msgstr "'%s' ja s'ha agafat a '%s'"
 
-#: merge-recursive.c:1732
+#: branch.c:363
 #, c-format
-msgid "Auto-merging %s"
-msgstr "S'està autofusionant %s"
+msgid "HEAD of working tree %s is not updated"
+msgstr "La HEAD de l'arbre de treball %s no està actualitzat"
 
-#: merge-recursive.c:1736 git-submodule.sh:919
-msgid "submodule"
-msgstr "submòdul"
+#: bundle.c:34
+#, c-format
+msgid "'%s' does not look like a v2 bundle file"
+msgstr "'%s' no sembla un fitxer de farcell v2"
 
-#: merge-recursive.c:1737
+#: bundle.c:61
 #, c-format
-msgid "CONFLICT (%s): Merge conflict in %s"
-msgstr "CONFLICTE (%s): Conflicte de fusió en %s"
+msgid "unrecognized header: %s%s (%d)"
+msgstr "capçalera no reconeguda: %s%s (%d)"
 
-#: merge-recursive.c:1831
+#: bundle.c:87 sequencer.c:963 builtin/commit.c:777
 #, c-format
-msgid "Removing %s"
-msgstr "S'està eliminant %s"
+msgid "could not open '%s'"
+msgstr "no s'ha pogut obrir '%s'"
 
-#: merge-recursive.c:1857
-msgid "file/directory"
-msgstr "fitxer/directori"
+#: bundle.c:139
+msgid "Repository lacks these prerequisite commits:"
+msgstr "Al dipòsit li manquen aquestes comissions prerequisits:"
 
-#: merge-recursive.c:1863
-msgid "directory/file"
-msgstr "directori/fitxer"
+#: bundle.c:163 ref-filter.c:1462 sequencer.c:830 sequencer.c:1374
+#: builtin/blame.c:2814 builtin/commit.c:1061 builtin/log.c:348
+#: builtin/log.c:890 builtin/log.c:1340 builtin/log.c:1666 builtin/log.c:1909
+#: builtin/merge.c:356 builtin/shortlog.c:170
+msgid "revision walk setup failed"
+msgstr "la configuració del passeig per revisions ha fallat"
 
-#: merge-recursive.c:1868
+#: bundle.c:185
 #, c-format
-msgid "CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s"
-msgstr ""
-"CONFLICTE (%s): Hi ha un directori amb nom %s en %s. S'està afegint %s com a "
-"%s"
-
-#: merge-recursive.c:1877
-#, c-format
-msgid "Adding %s"
-msgstr "S'està afegint %s"
+msgid "The bundle contains this ref:"
+msgid_plural "The bundle contains these %d refs:"
+msgstr[0] "El farcell conté aquesta referència:"
+msgstr[1] "El farcell conté aquestes %d referències:"
 
-#: merge-recursive.c:1914
-msgid "Already up-to-date!"
-msgstr "Ja està al dia!"
+#: bundle.c:192
+msgid "The bundle records a complete history."
+msgstr "El farcell registra una història completa."
 
-#: merge-recursive.c:1923
+#: bundle.c:194
 #, c-format
-msgid "merging of trees %s and %s failed"
-msgstr "la fusió dels arbres %s i %s ha fallat"
+msgid "The bundle requires this ref:"
+msgid_plural "The bundle requires these %d refs:"
+msgstr[0] "El farcell requereix aquesta referència:"
+msgstr[1] "El farcell requereix aquestes %d referències:"
 
-#: merge-recursive.c:2006
-msgid "Merging:"
-msgstr "Fusionant:"
+#: bundle.c:253
+msgid "Could not spawn pack-objects"
+msgstr "No s'ha pogut executar el pack-objects"
 
-#: merge-recursive.c:2019
-#, c-format
-msgid "found %u common ancestor:"
-msgid_plural "found %u common ancestors:"
-msgstr[0] "s'ha trobat %u avantpassat:"
-msgstr[1] "s'han trobat %u avantpassats:"
+#: bundle.c:264
+msgid "pack-objects died"
+msgstr "El pack-objects s'ha mort"
 
-#: merge-recursive.c:2058
-msgid "merge returned no commit"
-msgstr "la fusió no ha retornat cap comissió"
+#: bundle.c:304
+msgid "rev-list died"
+msgstr "El rev-list s'ha mort"
 
-#: merge-recursive.c:2121
+#: bundle.c:353
 #, c-format
-msgid "Could not parse object '%s'"
-msgstr "No s'ha pogut analitzar l'objecte '%s'"
+msgid "ref '%s' is excluded by the rev-list options"
+msgstr "les opcions de la llista de revisions exclouen la referència '%s'"
 
-#: merge-recursive.c:2135 builtin/merge.c:641 builtin/merge.c:788
-msgid "Unable to write index."
-msgstr "No s'ha pogut escriure l'índex."
+#: bundle.c:443 builtin/log.c:165 builtin/log.c:1572 builtin/shortlog.c:273
+#, c-format
+msgid "unrecognized argument: %s"
+msgstr "paràmetre no reconegut: %s"
 
-#: notes-utils.c:41
-msgid "Cannot commit uninitialized/unreferenced notes tree"
-msgstr "No es pot cometre un arbre de notes no inicialitzat / no referenciat"
+#: bundle.c:451
+msgid "Refusing to create empty bundle."
+msgstr "S'està refusant crear un farcell buit."
 
-#: notes-utils.c:100
+#: bundle.c:463
 #, c-format
-msgid "Bad notes.rewriteMode value: '%s'"
-msgstr "Valor de notes.rewriteMode dolent: '%s'"
+msgid "cannot create '%s'"
+msgstr "no es pot crear '%s'"
 
-#: notes-utils.c:110
+#: bundle.c:491
+msgid "index-pack died"
+msgstr "L'index-pack s'ha mort"
+
+#: color.c:290
 #, c-format
-msgid "Refusing to rewrite notes in %s (outside of refs/notes/)"
-msgstr "S'està refusant reescriure les notes en %s (fora de refs/notes/)"
+msgid "invalid color value: %.*s"
+msgstr "valor de color no vàlid: %.*s"
 
-#. TRANSLATORS: The first %s is the name of the
-#. environment variable, the second %s is its value
-#: notes-utils.c:137
+#: commit.c:40 builtin/am.c:421 builtin/am.c:457 builtin/am.c:1493
+#: builtin/am.c:2127
 #, c-format
-msgid "Bad %s value: '%s'"
-msgstr "Valor dolent de %s: '%s'"
+msgid "could not parse %s"
+msgstr "no s'ha pogut analitzar %s"
 
-#: object.c:242
+#: commit.c:42
 #, c-format
-msgid "unable to parse object: %s"
-msgstr "no s'ha pogut analitzar l'objecte: %s"
+msgid "%s %s is not a commit!"
+msgstr "%s %s no és una comissió!"
 
-#: parse-options.c:572
-msgid "..."
-msgstr "..."
+#: commit.c:1514
+msgid ""
+"Warning: commit message did not conform to UTF-8.\n"
+"You may want to amend it after fixing the message, or set the config\n"
+"variable i18n.commitencoding to the encoding your project uses.\n"
+msgstr ""
+"Advertència: el missatge de comissió no conformava a UTF-8.\n"
+"Potser voleu esemenar-lo després de corregir el missatge, o establir\n"
+"la variable de configuració i18n.commitencoding a la codificació que\n"
+"usi el vostre projecte.\n"
 
-#: parse-options.c:590
+#: compat/obstack.c:406 compat/obstack.c:408
+msgid "memory exhausted"
+msgstr "memòria esgotada"
+
+#: config.c:516
 #, c-format
-msgid "usage: %s"
-msgstr "ús: %s"
+msgid "bad config line %d in blob %s"
+msgstr "línia de configuració dolenta %d en el blob %s"
 
-#. TRANSLATORS: the colon here should align with the
-#. one in "usage: %s" translation
-#: parse-options.c:594
+#: config.c:520
 #, c-format
-msgid "   or: %s"
-msgstr " o: %s"
+msgid "bad config line %d in file %s"
+msgstr "línia de configuració dolenta %d en el fitxer %s"
 
-#: parse-options.c:597
+#: config.c:524
 #, c-format
-msgid "    %s"
-msgstr "    %s"
+msgid "bad config line %d in standard input"
+msgstr "línia de configuració dolenta %d en l'entrada estàndard"
 
-#: parse-options.c:631
-msgid "-NUM"
-msgstr "-NUM"
+#: config.c:528
+#, c-format
+msgid "bad config line %d in submodule-blob %s"
+msgstr "línia de configuració dolenta %d en el blob de submòdul %s"
 
-#: parse-options-cb.c:108
+#: config.c:532
 #, c-format
-msgid "malformed object name '%s'"
-msgstr "nom de camp mal format '%s'"
+msgid "bad config line %d in command line %s"
+msgstr "línia de configuració dolenta %d en la línia d'ordres %s"
 
-#: path.c:798
+#: config.c:536
 #, c-format
-msgid "Could not make %s writable by group"
-msgstr "No s'ha pogut fer %s escrivible pel grup"
+msgid "bad config line %d in %s"
+msgstr "línia de configuració dolenta %d en %s"
 
-#: pathspec.c:133
-msgid "global 'glob' and 'noglob' pathspec settings are incompatible"
-msgstr ""
-"els ajusts d'especificació de camí 'glob' i 'noglob' globals són "
-"incompatibles"
+#: config.c:655
+msgid "out of range"
+msgstr "fora de rang"
 
-#: pathspec.c:143
-msgid ""
-"global 'literal' pathspec setting is incompatible with all other global "
-"pathspec settings"
-msgstr ""
-"l'ajust d'especificació de camí 'literal' global és incompatible amb tots "
-"els altres ajusts d'especificació de camí globals"
+#: config.c:655
+msgid "invalid unit"
+msgstr "unitat no vàlida"
 
-#: pathspec.c:177
-msgid "invalid parameter for pathspec magic 'prefix'"
-msgstr "paràmetre no vàlid per a la màgia d'especificació de camí 'prefix'"
+#: config.c:661
+#, c-format
+msgid "bad numeric config value '%s' for '%s': %s"
+msgstr "valor de configuració numèric dolent '%s' per '%s': %s"
 
-#: pathspec.c:183
+#: config.c:666
 #, c-format
-msgid "Invalid pathspec magic '%.*s' in '%s'"
-msgstr "Màgia d'especificació de camí no vàlida '%.*s' en '%s'"
+msgid "bad numeric config value '%s' for '%s' in blob %s: %s"
+msgstr "valor de configuració numèric dolent '%s' per '%s' en el blob %s: %s"
 
-#: pathspec.c:187
+#: config.c:669
 #, c-format
-msgid "Missing ')' at the end of pathspec magic in '%s'"
-msgstr "')' mancant al final de la màgia d'especificació de camí en '%s'"
+msgid "bad numeric config value '%s' for '%s' in file %s: %s"
+msgstr "valor de configuració numèric dolent '%s' per '%s' en el fitxer %s: %s"
 
-#: pathspec.c:205
+#: config.c:672
 #, c-format
-msgid "Unimplemented pathspec magic '%c' in '%s'"
-msgstr "Màgia d'especificació de camí no implementada '%c' en '%s'"
+msgid "bad numeric config value '%s' for '%s' in standard input: %s"
+msgstr ""
+"valor de configuració numèric dolent '%s' per '%s' en l'entrada estàndard: %s"
 
-#: pathspec.c:230
+#: config.c:675
 #, c-format
-msgid "%s: 'literal' and 'glob' are incompatible"
-msgstr "%s: 'literal' i 'glob' són incompatibles"
+msgid "bad numeric config value '%s' for '%s' in submodule-blob %s: %s"
+msgstr ""
+"valor de configuració numèric dolent '%s' per '%s' en el blob de submòdul "
+"%s: %s"
 
-#: pathspec.c:241
+#: config.c:678
 #, c-format
-msgid "%s: '%s' is outside repository"
-msgstr "%s: '%s' és fora del dipòsit"
+msgid "bad numeric config value '%s' for '%s' in command line %s: %s"
+msgstr ""
+"valor de configuració numèric dolent '%s' per '%s' en la línia d'ordres %s: "
+"%s"
 
-#: pathspec.c:291
+#: config.c:681
 #, c-format
-msgid "Pathspec '%s' is in submodule '%.*s'"
-msgstr "L'especificació '%s' és en el submòdul '%.*s'"
+msgid "bad numeric config value '%s' for '%s' in %s: %s"
+msgstr "valor de configuració numèric dolent '%s' per '%s' en %s: %s"
 
-#: pathspec.c:353
+#: config.c:768
 #, c-format
-msgid "%s: pathspec magic not supported by this command: %s"
-msgstr ""
-"%s: aquesta ordre no és compatible amb la màgia d'especificació de camí: %s"
+msgid "failed to expand user dir in: '%s'"
+msgstr "s'ha fallat en expandir el directori d'usuari en: '%s'"
 
-#: pathspec.c:433
+#: config.c:852 config.c:863
 #, c-format
-msgid "pathspec '%s' is beyond a symbolic link"
-msgstr "l'especificació de camí '%s' és més enllà d'un enllaç simbòlic"
+msgid "bad zlib compression level %d"
+msgstr "nivell de compressió de zlib dolent %d"
 
-#: pathspec.c:442
-msgid ""
-"There is nothing to exclude from by :(exclude) patterns.\n"
-"Perhaps you forgot to add either ':/' or '.' ?"
-msgstr ""
-"No hi ha res a excloure per patrons :(exclusió).\n"
-"Potser heu oblidat afegir o ':/' o '.' ?"
+#: config.c:978
+#, c-format
+msgid "invalid mode for object creation: %s"
+msgstr "mode de creació d'objecte no vàlid: %s"
 
-#: pretty.c:973
-msgid "unable to parse --pretty format"
-msgstr "no s'ha pogut analitzar el format --pretty"
+#: config.c:1312
+msgid "unable to parse command-line config"
+msgstr "no s'ha pogut analitzar la configuració de la línia d'ordres"
 
-#: progress.c:235
-msgid "done"
-msgstr "fet"
+#: config.c:1362
+msgid "unknown error occurred while reading the configuration files"
+msgstr "un error desconegut ha ocorregut en llegir els fitxers de configuració"
 
-#: read-cache.c:1281
+#: config.c:1716
 #, c-format
-msgid ""
-"index.version set, but the value is invalid.\n"
-"Using version %i"
-msgstr ""
-"index.version establert, però el valor no és vàlid.\n"
-"S'està usant la versió %i"
+msgid "unable to parse '%s' from command-line config"
+msgstr "no s'ha pogut analitzar '%s' de la configuració de la línia d'ordres"
 
-#: read-cache.c:1291
+#: config.c:1718
 #, c-format
-msgid ""
-"GIT_INDEX_VERSION set, but the value is invalid.\n"
-"Using version %i"
-msgstr ""
-"GIT_INDEX_VERSION establert, però el valor no és vàlid.\n"
-"S'està usant la versió %i"
+msgid "bad config variable '%s' in file '%s' at line %d"
+msgstr "variable de configuració dolenta '%s' en el fitxer '%s' a la línia %d"
 
-#: refs.c:551 builtin/merge.c:840
+#: config.c:1777
 #, c-format
-msgid "Could not open '%s' for writing"
-msgstr "No s'ha pogut obrir '%s' per a escriptura"
+msgid "%s has multiple values"
+msgstr "%s té múltiples valors"
 
-#: refs/files-backend.c:2534
+#: config.c:2311
 #, c-format
-msgid "could not delete reference %s: %s"
-msgstr "no s'ha pogut suprimir la referència %s: %s"
+msgid "could not set '%s' to '%s'"
+msgstr "no s'ha pogut establir '%s' a '%s'"
 
-#: refs/files-backend.c:2537
+#: config.c:2313
 #, c-format
-msgid "could not delete references: %s"
-msgstr "no s'ha pogut suprimir les referències: %s"
+msgid "could not unset '%s'"
+msgstr "no s'ha pogut desestablir '%s'"
+
+#: connect.c:49
+msgid "The remote end hung up upon initial contact"
+msgstr "El costat remot ha penjat en el moment de contacte inicial"
+
+#: connect.c:51
+msgid ""
+"Could not read from remote repository.\n"
+"\n"
+"Please make sure you have the correct access rights\n"
+"and the repository exists."
+msgstr ""
+"No s'ha pogut llegir del dipòsit remot.\n"
+"\n"
+"Si us plau, assegureu-vos que tingueu els drets\n"
+"d'accés correctes i que el dipòsit existeixi."
+
+#: connected.c:63 builtin/fsck.c:173 builtin/prune.c:140
+msgid "Checking connectivity"
+msgstr "S'està comprovant la connectivitat"
+
+#: connected.c:75
+msgid "Could not run 'git rev-list'"
+msgstr "No s'ha pogut executar 'git rev-list'"
+
+#: connected.c:95
+msgid "failed write to rev-list"
+msgstr "escriptura fallada al rev-list"
 
-#: refs/files-backend.c:2546
+#: connected.c:102
+msgid "failed to close rev-list's stdin"
+msgstr "s'ha fallat en tancar l'stdin del rev-list"
+
+#: convert.c:201
 #, c-format
-msgid "could not remove reference %s"
-msgstr "no s'ha pogut eliminar la referència %s"
+msgid ""
+"CRLF will be replaced by LF in %s.\n"
+"The file will have its original line endings in your working directory."
+msgstr ""
+"LF reemplaçarà CRLF en %s.\n"
+"El fitxer tindrà els seus terminadors de línia originals en el vostre "
+"directori de treball."
 
-#: ref-filter.c:55
+#: convert.c:205
 #, c-format
-msgid "expected format: %%(color:<color>)"
-msgstr "format esperat: %%(color:<color>)"
+msgid "CRLF would be replaced by LF in %s."
+msgstr "LF reemplaçaria CRLF en %s."
 
-#: ref-filter.c:57
+#: convert.c:211
 #, c-format
-msgid "unrecognized color: %%(color:%s)"
-msgstr "color no reconegut: %%(color:%s)"
+msgid ""
+"LF will be replaced by CRLF in %s.\n"
+"The file will have its original line endings in your working directory."
+msgstr ""
+"CRLF reemplaçarà LF en %s.\n"
+"El fitxer tindrà els seus terminadors de línia originals en el vostre "
+"directori de treball."
 
-#: ref-filter.c:71
+#: convert.c:215
 #, c-format
-msgid "unrecognized format: %%(%s)"
-msgstr "format no reconegut: %%(%s)"
+msgid "LF would be replaced by CRLF in %s"
+msgstr "CRLF reemplaçaria LF en %s"
 
-#: ref-filter.c:77
+#: date.c:97
+msgid "in the future"
+msgstr "en el futur"
+
+#: date.c:103
 #, c-format
-msgid "%%(body) does not take arguments"
-msgstr "%%(body) no accepta paràmetres"
+msgid "%lu second ago"
+msgid_plural "%lu seconds ago"
+msgstr[0] "fa %lu segon"
+msgstr[1] "fa %lu segons"
 
-#: ref-filter.c:84
+#: date.c:110
 #, c-format
-msgid "%%(subject) does not take arguments"
-msgstr "%%(subject) no accepta paràmetres"
+msgid "%lu minute ago"
+msgid_plural "%lu minutes ago"
+msgstr[0] "fa %lu minut"
+msgstr[1] "fa %lu minuts"
 
-#: ref-filter.c:101
+#: date.c:117
 #, c-format
-msgid "positive value expected contents:lines=%s"
-msgstr "valor positiu esperat contents:lines=%s"
+msgid "%lu hour ago"
+msgid_plural "%lu hours ago"
+msgstr[0] "fa %lu hora"
+msgstr[1] "fa %lu hores"
 
-#: ref-filter.c:103
+#: date.c:124
 #, c-format
-msgid "unrecognized %%(contents) argument: %s"
-msgstr "paràmetre %%(contents) no reconegut: %s"
+msgid "%lu day ago"
+msgid_plural "%lu days ago"
+msgstr[0] "fa %lu dia"
+msgstr[1] "fa %lu dies"
 
-#: ref-filter.c:113
+#: date.c:130
 #, c-format
-msgid "unrecognized %%(objectname) argument: %s"
-msgstr "paràmetre %%(objectname) no reconegut: %s"
+msgid "%lu week ago"
+msgid_plural "%lu weeks ago"
+msgstr[0] "fa %lu setmana"
+msgstr[1] "fa %lu setmanes"
 
-#: ref-filter.c:135
+#: date.c:137
 #, c-format
-msgid "expected format: %%(align:<width>,<position>)"
-msgstr "format esperat: %%(align:<amplada>,<posició>)"
+msgid "%lu month ago"
+msgid_plural "%lu months ago"
+msgstr[0] "fa %lu mes"
+msgstr[1] "fa %lu mesos"
 
-#: ref-filter.c:147
+#: date.c:148
 #, c-format
-msgid "unrecognized position:%s"
-msgstr "posició no reconeguda:%s"
+msgid "%lu year"
+msgid_plural "%lu years"
+msgstr[0] "%lu any"
+msgstr[1] "%lu anys"
 
-#: ref-filter.c:151
+#. TRANSLATORS: "%s" is "<n> years"
+#: date.c:151
 #, c-format
-msgid "unrecognized width:%s"
-msgstr "amplada no reconeguda:%s"
+msgid "%s, %lu month ago"
+msgid_plural "%s, %lu months ago"
+msgstr[0] "fa %s i %lu mes"
+msgstr[1] "fa %s i %lu mesos"
 
-#: ref-filter.c:157
+#: date.c:156 date.c:161
 #, c-format
-msgid "unrecognized %%(align) argument: %s"
-msgstr "paràmetre %%(align) no reconegut: %s"
+msgid "%lu year ago"
+msgid_plural "%lu years ago"
+msgstr[0] "fa %lu any"
+msgstr[1] "fa %lu anys"
 
-#: ref-filter.c:161
+#: diffcore-order.c:24
 #, c-format
-msgid "positive width expected with the %%(align) atom"
-msgstr "amplada positiva esperada amb l'àtom %%(align)"
+msgid "failed to read orderfile '%s'"
+msgstr "s'ha fallat en llegir el fitxer d'ordres '%s'"
 
-#: ref-filter.c:244
+#: diffcore-rename.c:536
+msgid "Performing inexact rename detection"
+msgstr "S'està realitzant una detecció inexacta de canvis de nom"
+
+#: diff.c:62
 #, c-format
-msgid "malformed field name: %.*s"
-msgstr "nom d'objecte mal format: %.*s"
+msgid "option '%s' requires a value"
+msgstr "l'opció '%s' requereix un valor"
 
-#: ref-filter.c:270
+#: diff.c:124
 #, c-format
-msgid "unknown field name: %.*s"
-msgstr "nom de camp desconegut: %.*s"
+msgid "  Failed to parse dirstat cut-off percentage '%s'\n"
+msgstr "  S'ha fallat en analitzar el percentatge limitant de dirstat '%s'\n"
 
-#: ref-filter.c:372
+#: diff.c:129
 #, c-format
-msgid "format: %%(end) atom used without corresponding atom"
-msgstr "format: s'ha usat l'àtom %%(end) sense l'àtom corresponent"
+msgid "  Unknown dirstat parameter '%s'\n"
+msgstr "  Paràmetre de dirstat desconegut '%s'\n"
 
-#: ref-filter.c:424
+#: diff.c:283
 #, c-format
-msgid "malformed format string %s"
-msgstr "cadena de format mal format %s"
+msgid "Unknown value for 'diff.submodule' config variable: '%s'"
+msgstr ""
+"Valor desconegut de la variable de configuració de 'diff.submodule': '%s'"
 
-#: ref-filter.c:878
-msgid ":strip= requires a positive integer argument"
-msgstr ":strip= requereix un paràmetre enter positiu"
+#: diff.c:346
+#, c-format
+msgid ""
+"Found errors in 'diff.dirstat' config variable:\n"
+"%s"
+msgstr ""
+"S'han trobat errors en la variable de configuració 'diff.dirstat':\n"
+"%s"
 
-#: ref-filter.c:883
+#: diff.c:3087
 #, c-format
-msgid "ref '%s' does not have %ld components to :strip"
-msgstr "la referència '%s' no té %ld components per a :strip"
+msgid "external diff died, stopping at %s"
+msgstr "el diff external s'ha mort, s'està aturant a %s"
 
-#: ref-filter.c:1046
+#: diff.c:3412
+msgid "--name-only, --name-status, --check and -s are mutually exclusive"
+msgstr "--name-only, --name-status, --check i -s són mutualment exclusius"
+
+#: diff.c:3502
+msgid "--follow requires exactly one pathspec"
+msgstr "--follow requereix exactament una especificació de camí"
+
+#: diff.c:3665
 #, c-format
-msgid "unknown %.*s format %s"
-msgstr "format de %.*s desconegut %s"
+msgid ""
+"Failed to parse --dirstat/-X option parameter:\n"
+"%s"
+msgstr ""
+"S'ha fallat en analitzar el paràmetre d'opció de --dirstat/-X:\n"
+"%s"
 
-#: ref-filter.c:1066 ref-filter.c:1097
+#: diff.c:3679
 #, c-format
-msgid "missing object %s for %s"
-msgstr "manca l'objecte %s per a %s"
+msgid "Failed to parse --submodule option parameter: '%s'"
+msgstr "S'ha fallat en analitzar el paràmetre d'opció de --submodule: '%s'"
 
-#: ref-filter.c:1069 ref-filter.c:1100
+#: diff.c:4700
+msgid "inexact rename detection was skipped due to too many files."
+msgstr "s'ha saltat la detecció de canvi de nom a causa de massa fitxers."
+
+#: diff.c:4703
+msgid "only found copies from modified paths due to too many files."
+msgstr ""
+"només s'han trobat còpies des de camins modificats a causa de massa fitxers."
+
+#: diff.c:4706
 #, c-format
-msgid "parse_object_buffer failed on %s for %s"
-msgstr "parse_object_buffer ha fallat en %s per a %s"
+msgid ""
+"you may want to set your %s variable to at least %d and retry the command."
+msgstr ""
+"potser voleu establir la vostra variable %s a almenys %d i tornar a intentar "
+"l'ordre."
 
-#: ref-filter.c:1311
+#: dir.c:1866
+msgid "failed to get kernel name and information"
+msgstr "s'ha fallat en obtenir el nombre i la informació del nucli"
+
+#: dir.c:1985
+msgid "Untracked cache is disabled on this system or location."
+msgstr ""
+"La memòria cau no seguida està inhabilitada en aquest sistema o ubicació."
+
+#: fetch-pack.c:213
+msgid "git fetch-pack: expected shallow list"
+msgstr "git fetch-pack: llista superficial esperada"
+
+#: fetch-pack.c:225
+msgid "git fetch-pack: expected ACK/NAK, got EOF"
+msgstr "git fetch-pack: ACK/NAK esperat, EOF rebut"
+
+#: fetch-pack.c:243
 #, c-format
-msgid "malformed object at '%s'"
-msgstr "objecte mal format a '%s'"
+msgid "git fetch-pack: expected ACK/NAK, got '%s'"
+msgstr "git fetch-pack: ACK/NAK esperat, '%s' rebut"
 
-#: ref-filter.c:1373
+#: fetch-pack.c:295
+msgid "--stateless-rpc requires multi_ack_detailed"
+msgstr "--stateless-rpc requereix multi_ack_detailed"
+
+#: fetch-pack.c:381
 #, c-format
-msgid "ignoring ref with broken name %s"
-msgstr "s'està ignorant la referència amb nom trencat %s"
+msgid "invalid shallow line: %s"
+msgstr "línia de shallow no vàlida: %s"
 
-#: ref-filter.c:1378
+#: fetch-pack.c:387
 #, c-format
-msgid "ignoring broken ref %s"
-msgstr "s'està ignorant la referència trencada %s"
+msgid "invalid unshallow line: %s"
+msgstr "línia d'unshallow no vàlida: %s"
 
-#: ref-filter.c:1651
+#: fetch-pack.c:389
 #, c-format
-msgid "format: %%(end) atom missing"
-msgstr "format: manca l'àtom %%(end)"
+msgid "object not found: %s"
+msgstr "objecte no trobat: %s"
 
-#: ref-filter.c:1705
+#: fetch-pack.c:392
 #, c-format
-msgid "malformed object name %s"
-msgstr "nom d'objecte %s mal format"
+msgid "error in object: %s"
+msgstr "error en objecte: %s"
 
-#: remote.c:746
+#: fetch-pack.c:394
 #, c-format
-msgid "Cannot fetch both %s and %s to %s"
-msgstr "No es pot obtenir ambdós %s i %s a %s"
+msgid "no shallow found: %s"
+msgstr "no s'ha trobat cap superficial: %s"
 
-#: remote.c:750
+#: fetch-pack.c:397
 #, c-format
-msgid "%s usually tracks %s, not %s"
-msgstr "%s generalment segueix %s, no %s"
+msgid "expected shallow/unshallow, got %s"
+msgstr "s'esperava shallow/unshallow, s'ha rebut %s"
 
-#: remote.c:754
+#: fetch-pack.c:436
 #, c-format
-msgid "%s tracks both %s and %s"
-msgstr "%s segueix ambdós %s i %s"
+msgid "got %s %d %s"
+msgstr "%s %d %s rebut"
 
-#: remote.c:762
-msgid "Internal error"
-msgstr "Error intern"
+#: fetch-pack.c:450
+#, c-format
+msgid "invalid commit %s"
+msgstr "comissió no vàlida %s"
 
-#: remote.c:1677 remote.c:1720
-msgid "HEAD does not point to a branch"
-msgstr "HEAD no assenyala cap branca"
+#: fetch-pack.c:483
+msgid "giving up"
+msgstr "s'està rendint"
 
-#: remote.c:1686
-#, c-format
-msgid "no such branch: '%s'"
-msgstr "no hi ha tal branca: '%s'"
+#: fetch-pack.c:493 progress.c:235
+msgid "done"
+msgstr "fet"
 
-#: remote.c:1689
+#: fetch-pack.c:505
 #, c-format
-msgid "no upstream configured for branch '%s'"
-msgstr "cap font configurada per a la branca '%s'"
+msgid "got %s (%d) %s"
+msgstr "s'ha rebut %s (%d) %s"
 
-#: remote.c:1695
+#: fetch-pack.c:551
 #, c-format
-msgid "upstream branch '%s' not stored as a remote-tracking branch"
-msgstr "La branca font '%s' no s'emmagatzema com a branca amb seguiment remot"
+msgid "Marking %s as complete"
+msgstr "S'està marcant %s com a complet"
 
-#: remote.c:1710
+#: fetch-pack.c:697
 #, c-format
-msgid "push destination '%s' on remote '%s' has no local tracking branch"
-msgstr ""
-"el destí de pujada '%s' en el remot '%s' no té cap branca seguidora local"
+msgid "already have %s (%s)"
+msgstr "ja es té %s (%s)"
 
-#: remote.c:1725
+#: fetch-pack.c:735
+msgid "fetch-pack: unable to fork off sideband demultiplexer"
+msgstr "fetch-pack: no s'ha pogut bifurcar del demultiplexor de banda lateral"
+
+#: fetch-pack.c:743
+msgid "protocol error: bad pack header"
+msgstr "error de protocol: capçalera de paquet dolent"
+
+#: fetch-pack.c:799
 #, c-format
-msgid "branch '%s' has no remote for pushing"
-msgstr "la branca '%s' no té cap remot al qual pujar"
+msgid "fetch-pack: unable to fork off %s"
+msgstr "fetch-pack: no es pot bifurcar de %s"
 
-#: remote.c:1736
+#: fetch-pack.c:815
 #, c-format
-msgid "push refspecs for '%s' do not include '%s'"
-msgstr "les especificacions de referència de '%s' no inclouen '%s'"
+msgid "%s failed"
+msgstr "%s ha fallat"
 
-#: remote.c:1749
-msgid "push has no destination (push.default is 'nothing')"
-msgstr "push no té destí (push.default és 'nothing')"
+#: fetch-pack.c:817
+msgid "error in sideband demultiplexer"
+msgstr "error en demultiplexor de banda lateral"
 
-#: remote.c:1771
-msgid "cannot resolve 'simple' push to a single destination"
-msgstr "no es pot resoldre una pujada 'simple' a un sol destí"
+#: fetch-pack.c:844
+msgid "Server does not support shallow clients"
+msgstr "El servidor no permet clients superficials"
 
-#: remote.c:2073
-#, c-format
-msgid "Your branch is based on '%s', but the upstream is gone.\n"
-msgstr "La vostra branca està basada en '%s', però la font no hi és.\n"
-
-#: remote.c:2077
-msgid "  (use \"git branch --unset-upstream\" to fixup)\n"
-msgstr "  (useu \"git branch --unset-upstream\" per a arreglar)\n"
-
-#: remote.c:2080
-#, c-format
-msgid "Your branch is up-to-date with '%s'.\n"
-msgstr "La vostra branca està al dia amb '%s'.\n"
+#: fetch-pack.c:848
+msgid "Server supports multi_ack_detailed"
+msgstr "El servidor accepta multi_ack_detailed"
 
-#: remote.c:2084
-#, c-format
-msgid "Your branch is ahead of '%s' by %d commit.\n"
-msgid_plural "Your branch is ahead of '%s' by %d commits.\n"
-msgstr[0] "La vostra branca està davant de '%s' per %d comissió.\n"
-msgstr[1] "La vostra branca està davant de '%s' per %d comissions.\n"
+#: fetch-pack.c:851
+msgid "Server supports no-done"
+msgstr "El servidor accepta no-done"
 
-#: remote.c:2090
-msgid "  (use \"git push\" to publish your local commits)\n"
-msgstr "  (useu \"git push\" per a publicar les vostres comissions locals)\n"
+#: fetch-pack.c:857
+msgid "Server supports multi_ack"
+msgstr "El servidor accepta multi_ack"
 
-#: remote.c:2093
-#, c-format
-msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n"
-msgid_plural ""
-"Your branch is behind '%s' by %d commits, and can be fast-forwarded.\n"
-msgstr[0] ""
-"La vostra branca està darrere de '%s' per %d comissió, i pot avançar-se "
-"ràpidament.\n"
-msgstr[1] ""
-"La vostra branca està darrere de '%s' per %d comissions, i pot avançar-se "
-"ràpidament.\n"
+#: fetch-pack.c:861
+msgid "Server supports side-band-64k"
+msgstr "El servidor accepta side-band-64k"
 
-#: remote.c:2101
-msgid "  (use \"git pull\" to update your local branch)\n"
-msgstr " (useu \"git pull\" per a actualitzar la vostra branca local)\n"
+#: fetch-pack.c:865
+msgid "Server supports side-band"
+msgstr "El servidor accepta banda lateral"
 
-#: remote.c:2104
-#, c-format
-msgid ""
-"Your branch and '%s' have diverged,\n"
-"and have %d and %d different commit each, respectively.\n"
-msgid_plural ""
-"Your branch and '%s' have diverged,\n"
-"and have %d and %d different commits each, respectively.\n"
-msgstr[0] ""
-"La vostra branca i '%s' s'han divergit,\n"
-"i tenen %d i %d comissió distinta cada una, respectivament.\n"
-msgstr[1] ""
-"La vostra branca i '%s' s'han divergit,\n"
-"i tenen %d i %d comissions distintes cada una, respectivament.\n"
+#: fetch-pack.c:869
+msgid "Server supports allow-tip-sha1-in-want"
+msgstr "El servidor accepta allow-tip-sha1-in-want"
 
-#: remote.c:2114
-msgid "  (use \"git pull\" to merge the remote branch into yours)\n"
-msgstr "  (useu \"git pull\" per a fusionar la branca remota a la vostra)\n"
+#: fetch-pack.c:873
+msgid "Server supports allow-reachable-sha1-in-want"
+msgstr "El servidor accepta allow-reachable-sha1-in-want"
 
-#: revision.c:2132
-msgid "your current branch appears to be broken"
-msgstr "la vostra branca actual sembla trencada"
+#: fetch-pack.c:883
+msgid "Server supports ofs-delta"
+msgstr "El servidor accepta ofs-delta"
 
-#: revision.c:2135
+#: fetch-pack.c:890
 #, c-format
-msgid "your current branch '%s' does not have any commits yet"
-msgstr "la vostra branca actual '%s' encara no té cap comissió"
-
-#: revision.c:2329
-msgid "--first-parent is incompatible with --bisect"
-msgstr "--first-parent és incompatible amb --bisect"
-
-#: run-command.c:92
-msgid "open /dev/null failed"
-msgstr "s'ha fallat en obrir /dev/null"
+msgid "Server version is %.*s"
+msgstr "La versió del servidor és %.*s"
 
-#: run-command.c:94
-#, c-format
-msgid "dup2(%d,%d) failed"
-msgstr "dup2(%d,%d) ha fallat"
+#: fetch-pack.c:896
+msgid "Server does not support --shallow-since"
+msgstr "El servidor no admet --shallow-since"
 
-#: send-pack.c:298
-msgid "failed to sign the push certificate"
-msgstr "s'ha fallat en signar el certificat de pujada"
+#: fetch-pack.c:900
+msgid "Server does not support --shallow-exclude"
+msgstr "El servidor no admet --shallow-exclude"
 
-#: send-pack.c:411
-msgid "the receiving end does not support --signed push"
-msgstr "el destí receptor no admet pujar --signed"
+#: fetch-pack.c:902
+msgid "Server does not support --deepen"
+msgstr "El servidor no admet --deepen"
 
-#: send-pack.c:413
-msgid ""
-"not sending a push certificate since the receiving end does not support --"
-"signed push"
-msgstr ""
-"no s'està enviant una certificació de pujada perquè el destí receptor no "
-"admet pujar --signed"
+#: fetch-pack.c:913
+msgid "no common commits"
+msgstr "cap comissió en comú"
 
-#: send-pack.c:425
-msgid "the receiving end does not support --atomic push"
-msgstr "el destí receptor no admet pujar --atomic"
+#: fetch-pack.c:925
+msgid "git fetch-pack: fetch failed."
+msgstr "git fetch-pack: l'obtenció ha fallat."
 
-#: send-pack.c:430
-msgid "the receiving end does not support push options"
-msgstr "el destí receptor no admet opcions de pujada"
+#: fetch-pack.c:1087
+msgid "no matching remote head"
+msgstr "no hi ha cap cap remot coincident"
 
-#: sequencer.c:174
-msgid ""
-"after resolving the conflicts, mark the corrected paths\n"
-"with 'git add <paths>' or 'git rm <paths>'"
-msgstr ""
-"després de resoldre els conflictes, marqueu els camins\n"
-"corregits amb 'git add <camins>' o 'git rm <camins>'"
+#: gpg-interface.c:185
+msgid "gpg failed to sign the data"
+msgstr "gpg ha fallat en signar les dades"
 
-#: sequencer.c:177
-msgid ""
-"after resolving the conflicts, mark the corrected paths\n"
-"with 'git add <paths>' or 'git rm <paths>'\n"
-"and commit the result with 'git commit'"
-msgstr ""
-"després de resoldre els conflictes, marqueu els camins\n"
-"corregits amb 'git add <camins>' o 'git rm <camins>'\n"
-"i cometeu el resultat amb 'git commit'"
+#: gpg-interface.c:215
+msgid "could not create temporary file"
+msgstr "no s'ha pogut crear el fitxer temporal"
 
-#: sequencer.c:190 sequencer.c:841 sequencer.c:924
+#: gpg-interface.c:217
 #, c-format
-msgid "Could not write to %s"
-msgstr "No s'ha pogut escriure a %s"
+msgid "failed writing detached signature to '%s'"
+msgstr "s'ha fallat en escriure la signatura separada a '%s'"
 
-#: sequencer.c:193 sequencer.c:843 sequencer.c:928
+#: grep.c:1782
 #, c-format
-msgid "Error wrapping up %s."
-msgstr "Ha hagut un error en finalitzar %s."
-
-#: sequencer.c:208
-msgid "Your local changes would be overwritten by cherry-pick."
-msgstr "Els vostres canvis locals se sobreescriurien pel recull de cireres."
-
-#: sequencer.c:210
-msgid "Your local changes would be overwritten by revert."
-msgstr "Els vostres canvis locals se sobreescriurien per la reversió."
-
-#: sequencer.c:213
-msgid "Commit your changes or stash them to proceed."
-msgstr "Cometeu els vostres canvis o emmagatzemeu-los per a procedir."
+msgid "'%s': unable to read %s"
+msgstr "'%s': no s'ha pogut llegir %s"
 
-#: sequencer.c:228
+#: grep.c:1799 builtin/clone.c:381 builtin/diff.c:84 builtin/rm.c:155
 #, c-format
-msgid "%s: fast-forward"
-msgstr "%s: avanç ràpid"
+msgid "failed to stat '%s'"
+msgstr "s'ha fallat en fer stat a '%s'"
 
-#. TRANSLATORS: %s will be "revert" or "cherry-pick"
-#: sequencer.c:303
+#: grep.c:1810
 #, c-format
-msgid "%s: Unable to write new index file"
-msgstr "%s: No s'ha pogut escriure un fitxer d'índex nou"
-
-#: sequencer.c:321
-msgid "Could not resolve HEAD commit\n"
-msgstr "No s'ha pogut resoldre la comissió HEAD\n"
-
-#: sequencer.c:341
-msgid "Unable to update cache tree\n"
-msgstr "No s'ha pogut actualitzar l'arbre cau\n"
+msgid "'%s': short read"
+msgstr "'%s': lectura curta"
 
-#: sequencer.c:393
+#: help.c:203
 #, c-format
-msgid "Could not parse commit %s\n"
-msgstr "No s'ha pogut analitzar la comissió %s\n"
+msgid "available git commands in '%s'"
+msgstr "ordres de git disponibles en '%s'"
 
-#: sequencer.c:398
-#, c-format
-msgid "Could not parse parent commit %s\n"
-msgstr "No s'ha pogut analitzar la comissió mare %s\n"
+#: help.c:210
+msgid "git commands available from elsewhere on your $PATH"
+msgstr "ordres de git disponibles d'altres llocs en el vostre $PATH"
 
-#: sequencer.c:463
-msgid "Your index file is unmerged."
-msgstr "El vostre fitxer d'índex està sense fusionar."
+#: help.c:241
+msgid "These are common Git commands used in various situations:"
+msgstr "Aquestes són ordres del Git comunament usades en diverses situacions:"
 
-#: sequencer.c:482
+#: help.c:306
 #, c-format
-msgid "Commit %s is a merge but no -m option was given."
-msgstr "La comissió %s és una fusió però no s'ha donat cap opció -m."
+msgid ""
+"'%s' appears to be a git command, but we were not\n"
+"able to execute it. Maybe git-%s is broken?"
+msgstr ""
+"'%s' sembla una ordre de git, però no hem pogut\n"
+"executar-la. Pot ser que git-%s estigui estropejat?"
 
-#: sequencer.c:490
-#, c-format
-msgid "Commit %s does not have parent %d"
-msgstr "La comissió %s no té mare %d"
+#: help.c:361
+msgid "Uh oh. Your system reports no Git commands at all."
+msgstr "Ai. El vostre sistema no informa de cap ordre de Git."
 
-#: sequencer.c:494
+#: help.c:383
 #, c-format
-msgid "Mainline was specified but commit %s is not a merge."
+msgid ""
+"WARNING: You called a Git command named '%s', which does not exist.\n"
+"Continuing under the assumption that you meant '%s'"
 msgstr ""
-"S'ha especificat la línia principal però la comissió %s no és una fusió."
+"ADVERTÈNCIA: Heu invocat una ordre de Git amb nom '%s', la qual no "
+"existeix.\n"
+"S'està continuant sota l'assumpció que volíeu dir '%s'"
 
-#. TRANSLATORS: The first %s will be "revert" or
-#. "cherry-pick", the second %s a SHA1
-#: sequencer.c:507
+#: help.c:388
 #, c-format
-msgid "%s: cannot parse parent commit %s"
-msgstr "%s: no es pot analitzar la comissió mare %s"
+msgid "in %0.1f seconds automatically..."
+msgstr "en %0.1f segons automàticament..."
 
-#: sequencer.c:511
+#: help.c:395
 #, c-format
-msgid "Cannot get commit message for %s"
-msgstr "No es pot obtenir el missatge de comissió de %s"
+msgid "git: '%s' is not a git command. See 'git --help'."
+msgstr "git: '%s' no és una ordre de git. Vegeu 'git --help'."
 
-#: sequencer.c:597
-#, c-format
-msgid "could not revert %s... %s"
-msgstr "no s'ha pogut revertir %s...%s"
+#: help.c:399 help.c:465
+msgid ""
+"\n"
+"Did you mean this?"
+msgid_plural ""
+"\n"
+"Did you mean one of these?"
+msgstr[0] ""
+"\n"
+"Volíeu dir això?"
+msgstr[1] ""
+"\n"
+"Volíeu dir un d'aquests?"
 
-#: sequencer.c:598
+#: help.c:461
 #, c-format
-msgid "could not apply %s... %s"
-msgstr "no s'ha pogut aplicar %s...%s"
+msgid "%s: %s - %s"
+msgstr "%s: %s - %s"
 
-#: sequencer.c:633
-msgid "empty commit set passed"
-msgstr "conjunt de comissions buit passat"
+#: ident.c:334
+msgid ""
+"\n"
+"*** Please tell me who you are.\n"
+"\n"
+"Run\n"
+"\n"
+"  git config --global user.email \"you@example.com\"\n"
+"  git config --global user.name \"Your Name\"\n"
+"\n"
+"to set your account's default identity.\n"
+"Omit --global to set the identity only in this repository.\n"
+"\n"
+msgstr ""
+"\n"
+"*** Si us plau, digueu-me qui sou.\n"
+"\n"
+"Executeu\n"
+"\n"
+"  git config --global user.email \"vós@example.com\"\n"
+"  git config --global user.name \"El Vostre Nom\"\n"
+"\n"
+"per a establir la identitat predeterminat del vostre compte.\n"
+"Ometeu --global per a establir la identitat només en aquest dipòsit.\n"
 
-#: sequencer.c:641
+#: lockfile.c:152
 #, c-format
-msgid "git %s: failed to read the index"
-msgstr "git %s: s'ha fallat en llegir l'índex"
+msgid ""
+"Unable to create '%s.lock': %s.\n"
+"\n"
+"Another git process seems to be running in this repository, e.g.\n"
+"an editor opened by 'git commit'. Please make sure all processes\n"
+"are terminated then try again. If it still fails, a git process\n"
+"may have crashed in this repository earlier:\n"
+"remove the file manually to continue."
+msgstr ""
+"No s'ha pogut crear '%s.lock': %s.\n"
+"\n"
+"Sembla que un altre procés de git s'està executant en aquest\n"
+"dipòsit, per exemple, un editor obert per 'git commit'. Si us\n"
+"plau, assegureu-vos que tots els processos s'hagin terminat i\n"
+"llavors trobeu de nou. Si encara falla, potser que un procés de\n"
+"git ha tingut una pana:\n"
+"elimineu el fitxer manualment per a continuar."
 
-#: sequencer.c:645
+#: lockfile.c:160
 #, c-format
-msgid "git %s: failed to refresh the index"
-msgstr "git %s: s'ha fallat en actualitzar l'índex"
-
-#: sequencer.c:705
-msgid "Cannot revert during another revert."
-msgstr "No es pot revertir durant una altra reversió."
+msgid "Unable to create '%s.lock': %s"
+msgstr "No s'ha pogut crear '%s.lock': %s"
 
-#: sequencer.c:706
-msgid "Cannot revert during a cherry-pick."
-msgstr "No es pot revertir durant un recull de cireres."
+#: merge.c:41
+msgid "failed to read the cache"
+msgstr "s'ha fallat en llegir la memòria cau"
 
-#: sequencer.c:709
-msgid "Cannot cherry-pick during a revert."
-msgstr "No es pot recollir cireres durant una reversió."
+#: merge.c:96 builtin/am.c:2000 builtin/am.c:2035 builtin/checkout.c:374
+#: builtin/checkout.c:588 builtin/clone.c:731
+msgid "unable to write new index file"
+msgstr "no s'ha pogut escriure un fitxer d'índex nou"
 
-#: sequencer.c:710
-msgid "Cannot cherry-pick during another cherry-pick."
-msgstr "No es pot recollir cireres durant altre recull de cireres."
+#: merge-recursive.c:209
+msgid "(bad commit)\n"
+msgstr "(comissió dolenta)\n"
 
-#: sequencer.c:732
+#: merge-recursive.c:231
 #, c-format
-msgid "Could not parse line %d."
-msgstr "No s'ha pogut analitzar la línia %d."
+msgid "addinfo_cache failed for path '%s'"
+msgstr "addinfo_cache ha fallat per al camí '%s'"
 
-#: sequencer.c:737
-msgid "No commits parsed."
-msgstr "No s'ha analitzat cap comissió."
+#: merge-recursive.c:301
+msgid "error building trees"
+msgstr "error en construir arbres"
 
-#: sequencer.c:749
+#: merge-recursive.c:720
 #, c-format
-msgid "Could not open %s"
-msgstr "No s'ha pogut obrir %s"
+msgid "failed to create path '%s'%s"
+msgstr "s'ha fallat en crear el camí '%s'%s"
 
-#: sequencer.c:753
+#: merge-recursive.c:731
 #, c-format
-msgid "Could not read %s."
-msgstr "No s'ha pogut llegir %s."
+msgid "Removing %s to make room for subdirectory\n"
+msgstr "S'està eliminant %s per a fer espai per al subdirectori\n"
 
-#: sequencer.c:760
-#, c-format
-msgid "Unusable instruction sheet: %s"
-msgstr "Full d'instruccions inusable: %s"
+#: merge-recursive.c:745 merge-recursive.c:764
+msgid ": perhaps a D/F conflict?"
+msgstr ": potser un conflicte D/F?"
 
-#: sequencer.c:790
+#: merge-recursive.c:754
 #, c-format
-msgid "Invalid key: %s"
-msgstr "Clau no vàlida: %s"
+msgid "refusing to lose untracked file at '%s'"
+msgstr "s'està refusant perdre el fitxer no seguit a '%s'"
 
-#: sequencer.c:793 builtin/pull.c:50 builtin/pull.c:52
+#: merge-recursive.c:796 builtin/cat-file.c:34
 #, c-format
-msgid "Invalid value for %s: %s"
-msgstr "Valor no vàlid per a %s: %s"
+msgid "cannot read object %s '%s'"
+msgstr "no es pot llegir l'objecte %s '%s'"
 
-#: sequencer.c:803
+#: merge-recursive.c:798
 #, c-format
-msgid "Malformed options sheet: %s"
-msgstr "Full d'opcions mal format: %s"
-
-#: sequencer.c:822
-msgid "a cherry-pick or revert is already in progress"
-msgstr "un recull de cireres o una reversió ja està en curs"
-
-#: sequencer.c:823
-msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
-msgstr "intenteu \"git cherry-pick (--continue | --quit | --abort)\""
+msgid "blob expected for %s '%s'"
+msgstr "blob esperat per a %s '%s'"
 
-#: sequencer.c:827
+#: merge-recursive.c:822
 #, c-format
-msgid "Could not create sequencer directory %s"
-msgstr "No s'ha pogut crear el directori de seqüenciador %s"
-
-#: sequencer.c:862 sequencer.c:998
-msgid "no cherry-pick or revert in progress"
-msgstr "ni hi ha cap recull de cireres ni cap reversió en curs"
-
-#: sequencer.c:864
-msgid "cannot resolve HEAD"
-msgstr "no es pot resoldre HEAD"
-
-#: sequencer.c:866 sequencer.c:900
-msgid "cannot abort from a branch yet to be born"
-msgstr "no es pot avortar des d'una branca que encara ha de nàixer"
+msgid "failed to open '%s': %s"
+msgstr "s'ha fallat en obrir '%s': %s"
 
-#: sequencer.c:886 builtin/fetch.c:724 builtin/fetch.c:970
+#: merge-recursive.c:833
 #, c-format
-msgid "cannot open %s"
-msgstr "no es pot obrir %s"
+msgid "failed to symlink '%s': %s"
+msgstr "s'ha fallat en fer l'enllaç simbòlic '%s': %s"
 
-#: sequencer.c:888
+#: merge-recursive.c:838
 #, c-format
-msgid "cannot read %s: %s"
-msgstr "no es pot llegir %s: %s"
-
-#: sequencer.c:889
-msgid "unexpected end of file"
-msgstr "final de fitxer inesperat"
-
-#: sequencer.c:895
-#, c-format
-msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
-msgstr "el fitxer HEAD emmagatzemat abans del recull de cireres '%s' és malmès"
-
-#: sequencer.c:921
-#, c-format
-msgid "Could not format %s."
-msgstr "No s'ha pogut formatar %s."
-
-#: sequencer.c:1066
-#, c-format
-msgid "%s: can't cherry-pick a %s"
-msgstr "%s: no es pot recollir com a cirera un %s"
-
-#: sequencer.c:1069
-#, c-format
-msgid "%s: bad revision"
-msgstr "%s: revisió dolenta"
+msgid "do not know what to do with %06o %s '%s'"
+msgstr "no se sap què fer amb %06o %s '%s'"
 
-#: sequencer.c:1102
-msgid "Can't revert as initial commit"
-msgstr "No es pot revertir com a comissió inicial"
+#: merge-recursive.c:978
+msgid "Failed to execute internal merge"
+msgstr "S'ha fallat en executar la fusió interna"
 
-#: setup.c:160
+#: merge-recursive.c:982
 #, c-format
-msgid ""
-"%s: no such path in the working tree.\n"
-"Use 'git <command> -- <path>...' to specify paths that do not exist locally."
-msgstr ""
-"%s: no hi ha tal camí en l'arbre de treball.\n"
-"Useu 'git <ordre> -- <camí>...' per a especificar camins que no existeixin "
-"localment."
+msgid "Unable to add %s to database"
+msgstr "no s'ha pogut afegir %s a la base de dades"
 
-#: setup.c:173
+#: merge-recursive.c:1081 merge-recursive.c:1095
 #, c-format
 msgid ""
-"ambiguous argument '%s': unknown revision or path not in the working tree.\n"
-"Use '--' to separate paths from revisions, like this:\n"
-"'git <command> [<revision>...] -- [<file>...]'"
+"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
+"in tree."
 msgstr ""
-"paràmetre ambigu '%s': revisió no coneguda o camí no en l'arbre de treball.\n"
-"Useu '--' per a separar els camins de les revisions, com això:\n"
-"'git <ordre> [<revisió>...] -- [<fitxer>...]'"
+"CONFLICTE: (%s/supressió): %s suprimit en %s i %s en %s. La versió %s de %s "
+"s'ha deixat en l'arbre."
 
-#: setup.c:223
+#: merge-recursive.c:1087 merge-recursive.c:1100
 #, c-format
 msgid ""
-"ambiguous argument '%s': both revision and filename\n"
-"Use '--' to separate paths from revisions, like this:\n"
-"'git <command> [<revision>...] -- [<file>...]'"
+"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
+"in tree at %s."
 msgstr ""
-"paràmetre ambigu '%s': ambdós una revisió i un nom de fitxer\n"
-"Useu '--' per a separar els camins de les revisions, com això:\n"
-"'git <ordre> [<revisió>...] -- [<fitxer>...]'"
-
-#: setup.c:248 builtin/apply.c:3362 builtin/apply.c:3373 builtin/apply.c:3419
-#, c-format
-msgid "failed to read %s"
-msgstr "s'ha fallat en llegir %s"
+"CONFLICTE: (%s/supressió): %s suprimit en %s i %s en %s. La versió %s de %s "
+"s'ha deixat en l'arbre a %s."
 
-#: setup.c:468
-#, c-format
-msgid "Expected git repo version <= %d, found %d"
-msgstr "S'esperava una versió de dipòsit de git <= %d, s'ha trobat %d"
+#: merge-recursive.c:1143
+msgid "rename"
+msgstr "canvi de nom"
 
-#: setup.c:476
-msgid "unknown repository extensions found:"
-msgstr "s'han trobat extensions de dipòsit desconegudes:"
+#: merge-recursive.c:1143
+msgid "renamed"
+msgstr "canviat de nom"
 
-#: setup.c:762
+#: merge-recursive.c:1200
 #, c-format
-msgid "Not a git repository (or any of the parent directories): %s"
-msgstr "No un dipòsit de git (ni cap dels directoris pares): %s"
-
-#: setup.c:764 setup.c:915 builtin/index-pack.c:1641
-msgid "Cannot come back to cwd"
-msgstr "No es pot tornar al directori de treball actual"
-
-#: setup.c:845
-msgid "Unable to read current working directory"
-msgstr "No s'ha pogut llegir el directori de treball actual"
+msgid "%s is a directory in %s adding as %s instead"
+msgstr "%s és un directori en %s; s'està afegint com a %s en lloc d'això"
 
-#: setup.c:920
+#: merge-recursive.c:1225
 #, c-format
 msgid ""
-"Not a git repository (or any parent up to mount point %s)\n"
-"Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set)."
+"CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
+"\"->\"%s\" in \"%s\"%s"
 msgstr ""
-"No un dipòsit de git (ni cap pare fins el punt de muntatge %s)\n"
-"S'atura a la frontera de sistema de fitxers (GIT_DISCOVERY_ACROSS_FILESYSTEM "
-"no està establert)."
+"CONFLICTE (canvi de nom/canvi de nom): Canvi de nom \"%s\"->\"%s\" en la "
+"branca \"%s\" canvi de nom \"%s\"->\"%s\" en \"%s\"%s"
 
-#: setup.c:927
-#, c-format
-msgid "Cannot change to '%s/..'"
-msgstr "No es pot canviar a '%s/..'"
+#: merge-recursive.c:1230
+msgid " (left unresolved)"
+msgstr " (deixat sense resolució)"
 
-#: setup.c:989
+#: merge-recursive.c:1292
 #, c-format
-msgid ""
-"Problem with core.sharedRepository filemode value (0%.3o).\n"
-"The owner of files must always have read and write permissions."
+msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s"
 msgstr ""
-"Problema amb el valor de mode de fitxer core.sharedRepository (0%.3o).\n"
-"El propietari dels fitxers sempre ha de tenir permissions de lectura i "
-"escriptura."
-
-#: sha1_file.c:1046
-msgid "offset before end of packfile (broken .idx?)"
-msgstr "desplaçament abans de la fi del fitxer de paquet (.idx trencat?)"
+"CONFLICTE (canvi de nom/canvi de nom): Canvi de nom %s->%s en %s. Canvi de "
+"nom %s->%s en %s"
 
-#: sha1_file.c:2434
+#: merge-recursive.c:1325
 #, c-format
-msgid "offset before start of pack index for %s (corrupt index?)"
-msgstr ""
-"desplaçament abans d'inici d'índex de paquet per a %s (índex corromput?)"
+msgid "Renaming %s to %s and %s to %s instead"
+msgstr "S'està canviant el nom de %s a %s i %s a %s en lloc d'això"
 
-#: sha1_file.c:2438
+#: merge-recursive.c:1531
 #, c-format
-msgid "offset beyond end of pack index for %s (truncated index?)"
-msgstr ""
-"desplaçament més enllà de la fi d'índex de paquet per a %s (índex truncat?)"
-
-#: sha1_name.c:462
-msgid ""
-"Git normally never creates a ref that ends with 40 hex characters\n"
-"because it will be ignored when you just specify 40-hex. These refs\n"
-"may be created by mistake. For example,\n"
-"\n"
-"  git checkout -b $br $(git rev-parse ...)\n"
-"\n"
-"where \"$br\" is somehow empty and a 40-hex ref is created. Please\n"
-"examine these refs and maybe delete them. Turn this message off by\n"
-"running \"git config advice.objectNameWarning false\""
+msgid "CONFLICT (rename/add): Rename %s->%s in %s. %s added in %s"
 msgstr ""
-"Git normalment mai crea una referència que acabi amb 40 caràcters\n"
-"hexadecimals perquè s'ignorarà quan només especifiqueu 40 caràcters\n"
-"hexadecimals. Aquestes referències es poden crear per error. Per\n"
-"exemple,\n"
-"\n"
-"  git checkout -b $br $(git rev-parse ...)\n"
-"\n"
-"on \"$br\" és d'alguna manera buit i una referència de 40 caràcters\n"
-"hexadecimals. Si us plau, examineu aquestes referències i potser\n"
-"suprimiu-les. Desactiveu aquest missatge executant\n"
-"\"git config advice.objectNameWarning false\""
+"CONFLICTE (canvi de nom/afegiment): Canvi de nom %s->%s en %s. %s afegit en "
+"%s"
 
-#: submodule.c:64 submodule.c:98
-msgid "Cannot change unmerged .gitmodules, resolve merge conflicts first"
-msgstr ""
-"No es pot canviar un .gitmodules no fusionat, primer resoldreu els "
-"conflictes de fusió"
+#: merge-recursive.c:1546
+#, c-format
+msgid "Adding merged %s"
+msgstr "S'està afegint %s fusionat"
 
-#: submodule.c:68 submodule.c:102
+#: merge-recursive.c:1553 merge-recursive.c:1766
 #, c-format
-msgid "Could not find section in .gitmodules where path=%s"
-msgstr "No s'ha pogut trobar la secció en .gitmodules on path=%s"
+msgid "Adding as %s instead"
+msgstr "S'està afegint com a %s en lloc d'això"
 
-#: submodule.c:76
+#: merge-recursive.c:1610
 #, c-format
-msgid "Could not update .gitmodules entry %s"
-msgstr "No s'ha pogut actualitzar l'entrada de .gitmodules %s"
+msgid "cannot read object %s"
+msgstr "no es pot llegir l'objecte %s"
 
-#: submodule.c:109
+#: merge-recursive.c:1613
 #, c-format
-msgid "Could not remove .gitmodules entry for %s"
-msgstr "No s'ha pogut eliminar l'entrada de .gitmodules per a %s"
+msgid "object %s is not a blob"
+msgstr "l'objecte %s no és un blob"
 
-#: submodule.c:120
-msgid "staging updated .gitmodules failed"
-msgstr "L'allistament del .gitmodules actualitzat ha fallat"
+#: merge-recursive.c:1666
+msgid "modify"
+msgstr "modificació"
 
-#: submodule.c:177
-msgid "negative values not allowed for submodule.fetchJobs"
-msgstr "no es permeten els valors negatius a submodule.fetchJobs"
+#: merge-recursive.c:1666
+msgid "modified"
+msgstr "modificat"
 
-#: submodule-config.c:358
-#, c-format
-msgid "invalid value for %s"
-msgstr "valor no vàlid per a %s"
+#: merge-recursive.c:1676
+msgid "content"
+msgstr "contingut"
 
-#: trailer.c:237
-#, c-format
-msgid "running trailer command '%s' failed"
-msgstr "l'execució de l'ordre de remolc '%s' ha fallat"
+#: merge-recursive.c:1683
+msgid "add/add"
+msgstr "afegiment/afegiment"
 
-#: trailer.c:492 trailer.c:496 trailer.c:500 trailer.c:554 trailer.c:558
-#: trailer.c:562
+#: merge-recursive.c:1718
 #, c-format
-msgid "unknown value '%s' for key '%s'"
-msgstr "valor desconegut '%s' per a la clau '%s'"
+msgid "Skipped %s (merged same as existing)"
+msgstr "S'ha saltat %s (el fusionat és igual a l'existent)"
 
-#: trailer.c:544 trailer.c:549 builtin/remote.c:289
+#: merge-recursive.c:1732
 #, c-format
-msgid "more than one %s"
-msgstr "més d'un %s"
+msgid "Auto-merging %s"
+msgstr "S'està autofusionant %s"
+
+#: merge-recursive.c:1736 git-submodule.sh:924
+msgid "submodule"
+msgstr "submòdul"
 
-#: trailer.c:582
+#: merge-recursive.c:1737
 #, c-format
-msgid "empty trailer token in trailer '%.*s'"
-msgstr "fitxa de remolc buida en el remolc '%.*s'"
+msgid "CONFLICT (%s): Merge conflict in %s"
+msgstr "CONFLICTE (%s): Conflicte de fusió en %s"
 
-#: trailer.c:702
+#: merge-recursive.c:1831
 #, c-format
-msgid "could not read input file '%s'"
-msgstr "no s'ha pogut llegir el fitxer d'entrada '%s'"
+msgid "Removing %s"
+msgstr "S'està eliminant %s"
 
-#: trailer.c:705
-msgid "could not read from stdin"
-msgstr "No s'ha pogut llegir des d'stdin"
+#: merge-recursive.c:1857
+msgid "file/directory"
+msgstr "fitxer/directori"
 
-#: trailer.c:857 builtin/am.c:42
-#, c-format
-msgid "could not stat %s"
-msgstr "no s'ha pogut fer stat a %s"
+#: merge-recursive.c:1863
+msgid "directory/file"
+msgstr "directori/fitxer"
 
-#: trailer.c:859
+#: merge-recursive.c:1868
 #, c-format
-msgid "file %s is not a regular file"
-msgstr "el fitxer %s no és un fitxer regular"
+msgid "CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s"
+msgstr ""
+"CONFLICTE (%s): Hi ha un directori amb nom %s en %s. S'està afegint %s com a "
+"%s"
 
-#: trailer.c:861
+#: merge-recursive.c:1877
 #, c-format
-msgid "file %s is not writable by user"
-msgstr "el fitxer %s no és gravable per l'usuari"
+msgid "Adding %s"
+msgstr "S'està afegint %s"
 
-#: trailer.c:873
-msgid "could not open temporary file"
-msgstr "no s'ha pogut obrir el fitxer temporal"
+#: merge-recursive.c:1914
+msgid "Already up-to-date!"
+msgstr "Ja està al dia!"
 
-#: trailer.c:912
+#: merge-recursive.c:1923
 #, c-format
-msgid "could not rename temporary file to %s"
-msgstr "no s'ha pogut canviar el nom del fitxer temporal a %s"
+msgid "merging of trees %s and %s failed"
+msgstr "la fusió dels arbres %s i %s ha fallat"
 
-#: transport.c:62
+#: merge-recursive.c:2006
+msgid "Merging:"
+msgstr "Fusionant:"
+
+#: merge-recursive.c:2019
 #, c-format
-msgid "Would set upstream of '%s' to '%s' of '%s'\n"
-msgstr "Canviaria la font de '%s' a '%s' de '%s'\n"
+msgid "found %u common ancestor:"
+msgid_plural "found %u common ancestors:"
+msgstr[0] "s'ha trobat %u avantpassat en comú:"
+msgstr[1] "s'han trobat %u avantpassats en comú:"
 
-#: transport.c:151
+#: merge-recursive.c:2058
+msgid "merge returned no commit"
+msgstr "la fusió no ha retornat cap comissió"
+
+#: merge-recursive.c:2121
 #, c-format
-msgid "transport: invalid depth option '%s'"
-msgstr "transport: opció de profunditat no vàlida '%s'"
+msgid "Could not parse object '%s'"
+msgstr "No s'ha pogut analitzar l'objecte '%s'"
+
+#: merge-recursive.c:2135 builtin/merge.c:641 builtin/merge.c:788
+msgid "Unable to write index."
+msgstr "No s'ha pogut escriure l'índex."
 
-#: transport.c:771
+#: notes-merge.c:273
 #, c-format
 msgid ""
-"The following submodule paths contain changes that can\n"
-"not be found on any remote:\n"
+"You have not concluded your previous notes merge (%s exists).\n"
+"Please, use 'git notes merge --commit' or 'git notes merge --abort' to "
+"commit/abort the previous merge before you start a new notes merge."
 msgstr ""
-"Els camins de submòdul següents contenen canvis que no\n"
-"es poden trobar en cap remot:\n"
+"No heu conclòs la vostra fusió de notes prèvia (%s existeix).\n"
+"Si us plau, useu 'git notes merge --commit' o 'git notes merge --abort' per "
+"a cometre/avortar la fusió prèvia abans de començar una fusió de notes nova."
 
-#: transport.c:775
+#: notes-merge.c:280
 #, c-format
-msgid ""
-"\n"
-"Please try\n"
-"\n"
-"\tgit push --recurse-submodules=on-demand\n"
-"\n"
-"or cd to the path and use\n"
-"\n"
-"\tgit push\n"
-"\n"
-"to push them to a remote.\n"
-"\n"
-msgstr ""
-"\n"
-"Si us plau, intenteu\n"
-"\n"
-"\tgit push --recurse-submodules=on-demand\n"
-"\n"
-"o canviar de directori al camí i useu\n"
-"\n"
-"\tgit push\n"
-"\n"
-"per a pujar-los a un remot.\n"
+msgid "You have not concluded your notes merge (%s exists)."
+msgstr "No heu conclòs la vostra fusió de notes (%s existeix)."
 
-#: transport.c:783
-msgid "Aborting."
-msgstr "S'està avortant."
+#: notes-utils.c:41
+msgid "Cannot commit uninitialized/unreferenced notes tree"
+msgstr "No es pot cometre un arbre de notes no inicialitzat / no referenciat"
 
-#: transport-helper.c:1041
+#: notes-utils.c:100
 #, c-format
-msgid "Could not read ref %s"
-msgstr "No s'ha pogut llegir la referència %s"
+msgid "Bad notes.rewriteMode value: '%s'"
+msgstr "Valor de notes.rewriteMode dolent: '%s'"
 
-#: unpack-trees.c:64
+#: notes-utils.c:110
 #, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by checkout:\n"
-"%%sPlease commit your changes or stash them before you switch branches."
-msgstr ""
-"Els vostres canvis locals als fitxers següents se sobreescriurien per "
-"agafar:\n"
-"%%sSi us plau, cometeu els vostres canvis o emmagatzemeu-los abans de "
-"canviar de branca."
+msgid "Refusing to rewrite notes in %s (outside of refs/notes/)"
+msgstr "S'està refusant reescriure les notes en %s (fora de refs/notes/)"
 
-#: unpack-trees.c:66
+#. TRANSLATORS: The first %s is the name of the
+#. environment variable, the second %s is its value
+#: notes-utils.c:137
 #, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by checkout:\n"
-"%%s"
-msgstr ""
-"Els vostres canvis locals als fitxers següents se sobreescriurien per "
-"agafar:\n"
-"%%s"
+msgid "Bad %s value: '%s'"
+msgstr "Valor dolent de %s: '%s'"
 
-#: unpack-trees.c:69
+#: object.c:242
 #, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by merge:\n"
-"%%sPlease commit your changes or stash them before you merge."
-msgstr ""
-"Els vostres canvis locals als fitxers següents se sobreescriurien per "
-"fusionar:\n"
-"%%sSi us plau, cometeu els vostres canvis o emmagatzemeu-los abans de "
-"fusionar."
+msgid "unable to parse object: %s"
+msgstr "no s'ha pogut analitzar l'objecte: %s"
 
-#: unpack-trees.c:71
+#: parse-options.c:572
+msgid "..."
+msgstr "..."
+
+#: parse-options.c:590
 #, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by merge:\n"
-"%%s"
-msgstr ""
-"Els vostres canvis locals als fitxers següents se sobreescriurien per "
-"fusionar:\n"
-"%%s"
+msgid "usage: %s"
+msgstr "ús: %s"
 
-#: unpack-trees.c:74
+#. TRANSLATORS: the colon here should align with the
+#. one in "usage: %s" translation
+#: parse-options.c:594
 #, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by %s:\n"
-"%%sPlease commit your changes or stash them before you %s."
-msgstr ""
-"Els vostres canvis locals als fitxers següents se sobreescriurien per %s:\n"
-"%%sSi us plau, cometeu els vostres canvis o emmagatzemeu-los abans de %s."
+msgid "   or: %s"
+msgstr " o: %s"
 
-#: unpack-trees.c:76
+#: parse-options.c:597
 #, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by %s:\n"
-"%%s"
-msgstr ""
-"Els vostres canvis locals als fitxers següents se sobreescriurien per %s:\n"
-"%%s"
+msgid "    %s"
+msgstr "    %s"
 
-#: unpack-trees.c:81
+#: parse-options.c:631
+msgid "-NUM"
+msgstr "-NUM"
+
+#: parse-options-cb.c:108
 #, c-format
-msgid ""
-"Updating the following directories would lose untracked files in it:\n"
-"%s"
-msgstr ""
-"Actualitzar els directoris següents perdria fitxers no seguits en el:\n"
-"%s"
+msgid "malformed object name '%s'"
+msgstr "nom d'objecte mal format '%s'"
 
-#: unpack-trees.c:85
+#: path.c:826
 #, c-format
-msgid ""
-"The following untracked working tree files would be removed by checkout:\n"
-"%%sPlease move or remove them before you switch branches."
+msgid "Could not make %s writable by group"
+msgstr "No s'ha pogut fer %s escrivible pel grup"
+
+#: pathspec.c:133
+msgid "global 'glob' and 'noglob' pathspec settings are incompatible"
 msgstr ""
-"Els següents fitxers no seguits en l'arbre de treball s'eliminarien per "
-"agafar:\n"
-"%%sSi us plau, moveu-los o elimineu-los abans de canviar de branca."
+"els ajusts d'especificació de camí 'glob' i 'noglob' globals són "
+"incompatibles"
 
-#: unpack-trees.c:87
-#, c-format
+#: pathspec.c:143
 msgid ""
-"The following untracked working tree files would be removed by checkout:\n"
-"%%s"
+"global 'literal' pathspec setting is incompatible with all other global "
+"pathspec settings"
 msgstr ""
-"Els següents fitxers no seguits en l'arbre de treball s'eliminarien per "
-"agafar:\n"
-"%%s"
+"l'ajust d'especificació de camí 'literal' global és incompatible amb tots "
+"els altres ajusts d'especificació de camí globals"
 
-#: unpack-trees.c:90
+#: pathspec.c:177
+msgid "invalid parameter for pathspec magic 'prefix'"
+msgstr "paràmetre no vàlid per a la màgia d'especificació de camí 'prefix'"
+
+#: pathspec.c:183
 #, c-format
-msgid ""
-"The following untracked working tree files would be removed by merge:\n"
-"%%sPlease move or remove them before you merge."
-msgstr ""
-"Els següents fitxers no seguits en l'arbre de treball s'eliminarien per "
-"fusionar:\n"
-"%%sSi us plau, moveu-los o elimineu-los abans de fusionar."
+msgid "Invalid pathspec magic '%.*s' in '%s'"
+msgstr "Màgia d'especificació de camí no vàlida '%.*s' en '%s'"
 
-#: unpack-trees.c:92
+#: pathspec.c:187
 #, c-format
-msgid ""
-"The following untracked working tree files would be removed by merge:\n"
-"%%s"
-msgstr ""
-"Els següents fitxers no seguits en l'arbre de treball s'eliminarien per "
-"fusionar:\n"
-"%%s"
+msgid "Missing ')' at the end of pathspec magic in '%s'"
+msgstr "')' mancant al final de la màgia d'especificació de camí en '%s'"
 
-#: unpack-trees.c:95
+#: pathspec.c:205
+#, c-format
+msgid "Unimplemented pathspec magic '%c' in '%s'"
+msgstr "Màgia d'especificació de camí no implementada '%c' en '%s'"
+
+#: pathspec.c:230
+#, c-format
+msgid "%s: 'literal' and 'glob' are incompatible"
+msgstr "%s: 'literal' i 'glob' són incompatibles"
+
+#: pathspec.c:241
+#, c-format
+msgid "%s: '%s' is outside repository"
+msgstr "%s: '%s' és fora del dipòsit"
+
+#: pathspec.c:291
 #, c-format
+msgid "Pathspec '%s' is in submodule '%.*s'"
+msgstr "L'especificació '%s' és en el submòdul '%.*s'"
+
+#: pathspec.c:353
+#, c-format
+msgid "%s: pathspec magic not supported by this command: %s"
+msgstr ""
+"%s: aquesta ordre no és compatible amb la màgia d'especificació de camí: %s"
+
+#: pathspec.c:408
 msgid ""
-"The following untracked working tree files would be removed by %s:\n"
-"%%sPlease move or remove them before you %s."
+"empty strings as pathspecs will be made invalid in upcoming releases. please "
+"use . instead if you meant to match all paths"
 msgstr ""
-"Els següents fitxers no seguits en l'arbre de treball s'eliminarien per %s:\n"
-"%%sSi us plau, moveu-los o elimineu-los abans de %s."
+"es faran no vàlides les cadenes buides com especificacions de camí en "
+"versions futures. si us plau, useu . en lloc d'això si volíeu coincidir amb "
+"tots els camins"
 
-#: unpack-trees.c:97
+#: pathspec.c:440
 #, c-format
+msgid "pathspec '%s' is beyond a symbolic link"
+msgstr "l'especificació de camí '%s' és més enllà d'un enllaç simbòlic"
+
+#: pathspec.c:449
 msgid ""
-"The following untracked working tree files would be removed by %s:\n"
-"%%s"
+"There is nothing to exclude from by :(exclude) patterns.\n"
+"Perhaps you forgot to add either ':/' or '.' ?"
 msgstr ""
-"Els següents fitxers no seguits en l'arbre de treball s'eliminarien per %s:\n"
-"%%s"
+"No hi ha res a excloure per patrons :(exclusió).\n"
+"Potser heu oblidat afegir o ':/' o '.' ?"
 
-#: unpack-trees.c:102
+#: pretty.c:971
+msgid "unable to parse --pretty format"
+msgstr "no s'ha pogut analitzar el format --pretty"
+
+#: read-cache.c:1315
 #, c-format
 msgid ""
-"The following untracked working tree files would be overwritten by "
-"checkout:\n"
-"%%sPlease move or remove them before you switch branches."
+"index.version set, but the value is invalid.\n"
+"Using version %i"
 msgstr ""
-"Els següents fitxers no seguits en l'arbre de treball se sobreescriurien per "
-"agafar:\n"
-"%%sSi us plau, moveu-los o elimineu-los abans de canviar de branca."
+"index.version està establerta, però el valor no és vàlid.\n"
+"S'està usant la versió %i"
 
-#: unpack-trees.c:104
+#: read-cache.c:1325
 #, c-format
 msgid ""
-"The following untracked working tree files would be overwritten by "
-"checkout:\n"
-"%%s"
+"GIT_INDEX_VERSION set, but the value is invalid.\n"
+"Using version %i"
 msgstr ""
-"Els següents fitxers no seguits en l'arbre de treball se sobreescriurien per "
-"agafar:\n"
-"%%s"
+"GIT_INDEX_VERSION està establerta, però el valor no és vàlid.\n"
+"S'està usant la versió %i"
 
-#: unpack-trees.c:107
+#: refs.c:576 builtin/merge.c:840
 #, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by merge:\n"
-"%%sPlease move or remove them before you merge."
-msgstr ""
-"Els següents fitxers no seguits en l'arbre de treball se sobreescriurien per "
-"fusionar:\n"
-"%%sSi us plau, moveu-los o elimineu-los abans de fusionar."
+msgid "Could not open '%s' for writing"
+msgstr "No s'ha pogut obrir '%s' per a escriptura"
 
-#: unpack-trees.c:109
+#: refs/files-backend.c:2481
 #, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by merge:\n"
-"%%s"
-msgstr ""
-"Els següents fitxers no seguits en l'arbre de treball se sobreescriurien per "
-"fusionar:\n"
-"%%s"
+msgid "could not delete reference %s: %s"
+msgstr "no s'ha pogut suprimir la referència %s: %s"
 
-#: unpack-trees.c:112
+#: refs/files-backend.c:2484
 #, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by %s:\n"
-"%%sPlease move or remove them before you %s."
+msgid "could not delete references: %s"
+msgstr "no s'ha pogut suprimir les referències: %s"
+
+#: refs/files-backend.c:2493
+#, c-format
+msgid "could not remove reference %s"
+msgstr "no s'ha pogut eliminar la referència %s"
+
+#: ref-filter.c:55
+#, c-format
+msgid "expected format: %%(color:<color>)"
+msgstr "format esperat: %%(color:<color>)"
+
+#: ref-filter.c:57
+#, c-format
+msgid "unrecognized color: %%(color:%s)"
+msgstr "color no reconegut: %%(color:%s)"
+
+#: ref-filter.c:71
+#, c-format
+msgid "unrecognized format: %%(%s)"
+msgstr "format no reconegut: %%(%s)"
+
+#: ref-filter.c:77
+#, c-format
+msgid "%%(body) does not take arguments"
+msgstr "%%(body) no accepta paràmetres"
+
+#: ref-filter.c:84
+#, c-format
+msgid "%%(subject) does not take arguments"
+msgstr "%%(subject) no accepta paràmetres"
+
+#: ref-filter.c:101
+#, c-format
+msgid "positive value expected contents:lines=%s"
+msgstr "valor positiu esperat contents:lines=%s"
+
+#: ref-filter.c:103
+#, c-format
+msgid "unrecognized %%(contents) argument: %s"
+msgstr "paràmetre %%(contents) no reconegut: %s"
+
+#: ref-filter.c:113
+#, c-format
+msgid "unrecognized %%(objectname) argument: %s"
+msgstr "paràmetre %%(objectname) no reconegut: %s"
+
+#: ref-filter.c:135
+#, c-format
+msgid "expected format: %%(align:<width>,<position>)"
+msgstr "format esperat: %%(align:<amplada>,<posició>)"
+
+#: ref-filter.c:147
+#, c-format
+msgid "unrecognized position:%s"
+msgstr "posició no reconeguda:%s"
+
+#: ref-filter.c:151
+#, c-format
+msgid "unrecognized width:%s"
+msgstr "amplada no reconeguda:%s"
+
+#: ref-filter.c:157
+#, c-format
+msgid "unrecognized %%(align) argument: %s"
+msgstr "paràmetre %%(align) no reconegut: %s"
+
+#: ref-filter.c:161
+#, c-format
+msgid "positive width expected with the %%(align) atom"
+msgstr "amplada positiva esperada amb l'àtom %%(align)"
+
+#: ref-filter.c:244
+#, c-format
+msgid "malformed field name: %.*s"
+msgstr "nom de camp mal format: %.*s"
+
+#: ref-filter.c:270
+#, c-format
+msgid "unknown field name: %.*s"
+msgstr "nom de camp desconegut: %.*s"
+
+#: ref-filter.c:372
+#, c-format
+msgid "format: %%(end) atom used without corresponding atom"
+msgstr "format: s'ha usat l'àtom %%(end) sense l'àtom corresponent"
+
+#: ref-filter.c:424
+#, c-format
+msgid "malformed format string %s"
+msgstr "cadena de format mal format %s"
+
+#: ref-filter.c:878
+msgid ":strip= requires a positive integer argument"
+msgstr ":strip= requereix un paràmetre enter positiu"
+
+#: ref-filter.c:883
+#, c-format
+msgid "ref '%s' does not have %ld components to :strip"
+msgstr "la referència '%s' no té %ld components per a :strip"
+
+#: ref-filter.c:1046
+#, c-format
+msgid "unknown %.*s format %s"
+msgstr "format de %.*s desconegut %s"
+
+#: ref-filter.c:1066 ref-filter.c:1097
+#, c-format
+msgid "missing object %s for %s"
+msgstr "manca l'objecte %s per a %s"
+
+#: ref-filter.c:1069 ref-filter.c:1100
+#, c-format
+msgid "parse_object_buffer failed on %s for %s"
+msgstr "parse_object_buffer ha fallat en %s per a %s"
+
+#: ref-filter.c:1311
+#, c-format
+msgid "malformed object at '%s'"
+msgstr "objecte mal format a '%s'"
+
+#: ref-filter.c:1373
+#, c-format
+msgid "ignoring ref with broken name %s"
+msgstr "s'està ignorant la referència amb nom trencat %s"
+
+#: ref-filter.c:1378
+#, c-format
+msgid "ignoring broken ref %s"
+msgstr "s'està ignorant la referència trencada %s"
+
+#: ref-filter.c:1633
+#, c-format
+msgid "format: %%(end) atom missing"
+msgstr "format: manca l'àtom %%(end)"
+
+#: ref-filter.c:1687
+#, c-format
+msgid "malformed object name %s"
+msgstr "nom d'objecte %s mal format"
+
+#: remote.c:746
+#, c-format
+msgid "Cannot fetch both %s and %s to %s"
+msgstr "No es pot obtenir ambdós %s i %s a %s"
+
+#: remote.c:750
+#, c-format
+msgid "%s usually tracks %s, not %s"
+msgstr "%s generalment segueix %s, no %s"
+
+#: remote.c:754
+#, c-format
+msgid "%s tracks both %s and %s"
+msgstr "%s segueix ambdós %s i %s"
+
+#: remote.c:762
+msgid "Internal error"
+msgstr "Error intern"
+
+#: remote.c:1677 remote.c:1720
+msgid "HEAD does not point to a branch"
+msgstr "HEAD no assenyala cap branca"
+
+#: remote.c:1686
+#, c-format
+msgid "no such branch: '%s'"
+msgstr "no hi ha tal branca: '%s'"
+
+#: remote.c:1689
+#, c-format
+msgid "no upstream configured for branch '%s'"
+msgstr "cap font configurada per a la branca '%s'"
+
+#: remote.c:1695
+#, c-format
+msgid "upstream branch '%s' not stored as a remote-tracking branch"
+msgstr "la branca font '%s' no s'emmagatzema com a branca amb seguiment remot"
+
+#: remote.c:1710
+#, c-format
+msgid "push destination '%s' on remote '%s' has no local tracking branch"
 msgstr ""
-"Els següents fitxers no seguits en l'arbre de treball se sobreescriurien per "
-"%s:\n"
-"%%sSi us plau, moveu-los o elimineu-los abans de %s."
+"el destí de pujada '%s' en el remot '%s' no té cap branca seguidora local"
 
-#: unpack-trees.c:114
+#: remote.c:1725
+#, c-format
+msgid "branch '%s' has no remote for pushing"
+msgstr "la branca '%s' no té cap remot al qual pujar"
+
+#: remote.c:1736
+#, c-format
+msgid "push refspecs for '%s' do not include '%s'"
+msgstr "les especificacions de referència de '%s' no inclouen '%s'"
+
+#: remote.c:1749
+msgid "push has no destination (push.default is 'nothing')"
+msgstr "push no té destí (push.default és 'nothing')"
+
+#: remote.c:1771
+msgid "cannot resolve 'simple' push to a single destination"
+msgstr "no es pot resoldre una pujada 'simple' a un sol destí"
+
+#: remote.c:2073
+#, c-format
+msgid "Your branch is based on '%s', but the upstream is gone.\n"
+msgstr "La vostra branca està basada en '%s', però la font no hi és.\n"
+
+#: remote.c:2077
+msgid "  (use \"git branch --unset-upstream\" to fixup)\n"
+msgstr "  (useu \"git branch --unset-upstream\" per a arreglar)\n"
+
+#: remote.c:2080
+#, c-format
+msgid "Your branch is up-to-date with '%s'.\n"
+msgstr "La vostra branca està al dia amb '%s'.\n"
+
+#: remote.c:2084
+#, c-format
+msgid "Your branch is ahead of '%s' by %d commit.\n"
+msgid_plural "Your branch is ahead of '%s' by %d commits.\n"
+msgstr[0] "La vostra branca està davant de '%s' per %d comissió.\n"
+msgstr[1] "La vostra branca està davant de '%s' per %d comissions.\n"
+
+#: remote.c:2090
+msgid "  (use \"git push\" to publish your local commits)\n"
+msgstr "  (useu \"git push\" per a publicar les vostres comissions locals)\n"
+
+#: remote.c:2093
+#, c-format
+msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n"
+msgid_plural ""
+"Your branch is behind '%s' by %d commits, and can be fast-forwarded.\n"
+msgstr[0] ""
+"La vostra branca està darrere de '%s' per %d comissió, i pot avançar-se "
+"ràpidament.\n"
+msgstr[1] ""
+"La vostra branca està darrere de '%s' per %d comissions, i pot avançar-se "
+"ràpidament.\n"
+
+#: remote.c:2101
+msgid "  (use \"git pull\" to update your local branch)\n"
+msgstr " (useu \"git pull\" per a actualitzar la vostra branca local)\n"
+
+#: remote.c:2104
 #, c-format
 msgid ""
-"The following untracked working tree files would be overwritten by %s:\n"
-"%%s"
-msgstr ""
-"Els següents fitxers no seguits en l'arbre de treball se sobreescriurien per "
-"%s:\n"
-"%%s"
+"Your branch and '%s' have diverged,\n"
+"and have %d and %d different commit each, respectively.\n"
+msgid_plural ""
+"Your branch and '%s' have diverged,\n"
+"and have %d and %d different commits each, respectively.\n"
+msgstr[0] ""
+"La vostra branca i '%s' s'han divergit,\n"
+"i tenen %d i %d comissió distinta cada una, respectivament.\n"
+msgstr[1] ""
+"La vostra branca i '%s' s'han divergit,\n"
+"i tenen %d i %d comissions distintes cada una, respectivament.\n"
 
-#: unpack-trees.c:121
+#: remote.c:2114
+msgid "  (use \"git pull\" to merge the remote branch into yours)\n"
+msgstr "  (useu \"git pull\" per a fusionar la branca remota a la vostra)\n"
+
+#: revision.c:2158
+msgid "your current branch appears to be broken"
+msgstr "la vostra branca actual sembla trencada"
+
+#: revision.c:2161
 #, c-format
-msgid "Entry '%s' overlaps with '%s'.  Cannot bind."
-msgstr "L'entrada '%s' encavalca amb '%s'.  No es pot vincular."
+msgid "your current branch '%s' does not have any commits yet"
+msgstr "la vostra branca actual '%s' encara no té cap comissió"
 
-#: unpack-trees.c:124
+#: revision.c:2355
+msgid "--first-parent is incompatible with --bisect"
+msgstr "--first-parent és incompatible amb --bisect"
+
+#: run-command.c:106
+msgid "open /dev/null failed"
+msgstr "s'ha fallat en obrir /dev/null"
+
+#: run-command.c:108
 #, c-format
+msgid "dup2(%d,%d) failed"
+msgstr "dup2(%d,%d) ha fallat"
+
+#: send-pack.c:297
+msgid "failed to sign the push certificate"
+msgstr "s'ha fallat en signar el certificat de pujada"
+
+#: send-pack.c:410
+msgid "the receiving end does not support --signed push"
+msgstr "el destí receptor no admet pujar --signed"
+
+#: send-pack.c:412
 msgid ""
-"Cannot update sparse checkout: the following entries are not up-to-date:\n"
-"%s"
+"not sending a push certificate since the receiving end does not support --"
+"signed push"
 msgstr ""
-"No es pot actualitzar l'agafament parcial: les entrades següents no estan al "
-"dia:\n"
-"%s"
+"no s'està enviant una certificació de pujada perquè el destí receptor no "
+"admet pujar --signed"
 
-#: unpack-trees.c:126
-#, c-format
+#: send-pack.c:424
+msgid "the receiving end does not support --atomic push"
+msgstr "el destí receptor no admet pujar --atomic"
+
+#: send-pack.c:429
+msgid "the receiving end does not support push options"
+msgstr "el destí receptor no admet opcions de pujada"
+
+#: sequencer.c:171
+msgid "revert"
+msgstr "revertir"
+
+#: sequencer.c:171
+msgid "cherry-pick"
+msgstr "recollir cireres"
+
+#: sequencer.c:228
 msgid ""
-"The following Working tree files would be overwritten by sparse checkout "
-"update:\n"
-"%s"
+"after resolving the conflicts, mark the corrected paths\n"
+"with 'git add <paths>' or 'git rm <paths>'"
 msgstr ""
-"Els fitxers següents en l'arbre de treball se sobreescriurien per "
-"actualitzar l'agafament parcial:\n"
-"%s"
+"després de resoldre els conflictes, marqueu els camins\n"
+"corregits amb 'git add <camins>' o 'git rm <camins>'"
 
-#: unpack-trees.c:128
-#, c-format
+#: sequencer.c:231
 msgid ""
-"The following Working tree files would be removed by sparse checkout "
-"update:\n"
-"%s"
+"after resolving the conflicts, mark the corrected paths\n"
+"with 'git add <paths>' or 'git rm <paths>'\n"
+"and commit the result with 'git commit'"
 msgstr ""
-"Els fitxers següents en l'arbre de treball s'eliminarien per actualitzar "
-"l'agafament parcial:\n"
-"%s"
+"després de resoldre els conflictes, marqueu els camins\n"
+"corregits amb 'git add <camins>' o 'git rm <camins>'\n"
+"i cometeu el resultat amb 'git commit'"
 
-#: unpack-trees.c:205
+#: sequencer.c:244 sequencer.c:1209
 #, c-format
-msgid "Aborting\n"
-msgstr "S'està avortant\n"
+msgid "could not lock '%s'"
+msgstr "no s'ha pogut bloquejar '%s'"
 
-#: unpack-trees.c:237
-msgid "Checking out files"
-msgstr "S'està agafant fitxers"
+#: sequencer.c:247 sequencer.c:1125 sequencer.c:1214
+#, c-format
+msgid "could not write to '%s'"
+msgstr "no s'ha pogut escriure a '%s'"
 
-#: urlmatch.c:120
-msgid "invalid URL scheme name or missing '://' suffix"
-msgstr "l'esquema d'URL no és vàlid o li manca el sufix '://'"
+#: sequencer.c:251
+#, c-format
+msgid "could not write eol to '%s'"
+msgstr "no s'ha pogut escriure el terminador de línia a '%s'"
 
-#: urlmatch.c:144 urlmatch.c:297 urlmatch.c:356
+#: sequencer.c:255 sequencer.c:1130 sequencer.c:1216
 #, c-format
-msgid "invalid %XX escape sequence"
-msgstr "seqüència d'escapament %XX no vàlida"
+msgid "failed to finalize '%s'."
+msgstr "s'ha fallat en finalitzar '%s'."
 
-#: urlmatch.c:172
-msgid "missing host and scheme is not 'file:'"
-msgstr "manca la màquina i l'esquema no és 'file:'"
+#: sequencer.c:279 builtin/am.c:259 builtin/commit.c:749 builtin/merge.c:1032
+#, c-format
+msgid "could not read '%s'"
+msgstr "no s'ha pogut llegir '%s'"
 
-#: urlmatch.c:189
-msgid "a 'file:' URL may not have a port number"
-msgstr "un URL 'file:' no pot tenir número de port"
+#: sequencer.c:305
+#, c-format
+msgid "your local changes would be overwritten by %s."
+msgstr "els vostres canvis locals se sobreescriurien per %s."
 
-#: urlmatch.c:199
-msgid "invalid characters in host name"
-msgstr "hi ha caràcters no vàlids en el nom de màquina"
+#: sequencer.c:309
+msgid "commit your changes or stash them to proceed."
+msgstr "cometeu els vostres canvis o emmagatzemeu-los per a procedir."
 
-#: urlmatch.c:244 urlmatch.c:255
-msgid "invalid port number"
-msgstr "número de port no vàlid"
+#: sequencer.c:324
+#, c-format
+msgid "%s: fast-forward"
+msgstr "%s: avanç ràpid"
+
+#. TRANSLATORS: %s will be "revert" or "cherry-pick"
+#: sequencer.c:399
+#, c-format
+msgid "%s: Unable to write new index file"
+msgstr "%s: No s'ha pogut escriure un fitxer d'índex nou"
 
-#: urlmatch.c:322
-msgid "invalid '..' path segment"
-msgstr "segment de camí '..' no vàlid"
+#: sequencer.c:418
+msgid "could not resolve HEAD commit\n"
+msgstr "no s'ha pogut resoldre la comissió HEAD\n"
 
-#: worktree.c:282
-#, c-format
-msgid "failed to read '%s'"
-msgstr "s'ha fallat en llegir '%s'"
+#: sequencer.c:438
+msgid "unable to update cache tree\n"
+msgstr "no s'ha pogut actualitzar l'arbre cau\n"
 
-#: wrapper.c:222 wrapper.c:392
+#: sequencer.c:483
 #, c-format
-msgid "could not open '%s' for reading and writing"
-msgstr "no s'ha pogut obrir '%s' per a lectura i escriptura"
+msgid ""
+"you have staged changes in your working tree\n"
+"If these changes are meant to be squashed into the previous commit, run:\n"
+"\n"
+"  git commit --amend %s\n"
+"\n"
+"If they are meant to go into a new commit, run:\n"
+"\n"
+"  git commit %s\n"
+"\n"
+"In both cases, once you're done, continue with:\n"
+"\n"
+"  git rebase --continue\n"
+msgstr ""
+"teniu canvis allistats en el vostre arbre de treball\n"
+"Si aquests canvis són per a aixafar-se a la comissió prèvia, executeu:\n"
+"\n"
+"  git commit --amend %s\n"
+"\n"
+"Si són per a formar una comissió nova, executeu:\n"
+"\n"
+"  git commit %s\n"
+"\n"
+"En ambdós cassos, quan hàgiu terminat, continueu amb:\n"
+"\n"
+"  git rebase --continue\n"
 
-#: wrapper.c:224 wrapper.c:394 builtin/am.c:778
+#: sequencer.c:567
 #, c-format
-msgid "could not open '%s' for writing"
-msgstr "no s'ha pogut obrir '%s' per a escriptura"
+msgid "could not parse commit %s\n"
+msgstr "no s'ha pogut analitzar la comissió %s\n"
 
-#: wrapper.c:226 wrapper.c:396 builtin/am.c:324 builtin/am.c:771
-#: builtin/am.c:859 builtin/commit.c:1712 builtin/merge.c:1029
-#: builtin/pull.c:407
+#: sequencer.c:572
 #, c-format
-msgid "could not open '%s' for reading"
-msgstr "no s'ha pogut obrir '%s' per a lectura"
+msgid "could not parse parent commit %s\n"
+msgstr "no s'ha pogut analitzar la comissió mare %s\n"
 
-#: wrapper.c:605 wrapper.c:626
+#: sequencer.c:656
+msgid "your index file is unmerged."
+msgstr "el vostre fitxer d'índex està sense fusionar."
+
+#: sequencer.c:675
 #, c-format
-msgid "unable to access '%s'"
-msgstr "no s'ha pogut accedir a '%s'"
+msgid "commit %s is a merge but no -m option was given."
+msgstr "la comissió %s és una fusió però no s'ha donat cap opció -m."
 
-#: wrapper.c:634
-msgid "unable to get current working directory"
-msgstr "no s'ha pogut obtenir el directori de treball actual"
+#: sequencer.c:683
+#, c-format
+msgid "commit %s does not have parent %d"
+msgstr "la comissió %s no té mare %d"
 
-#: wrapper.c:658
+#: sequencer.c:687
 #, c-format
-msgid "could not write to %s"
-msgstr "no s'ha pogut escriure a %s"
+msgid "mainline was specified but commit %s is not a merge."
+msgstr ""
+"s'ha especificat la línia principal però la comissió %s no és una fusió."
 
-#: wrapper.c:660
+#. TRANSLATORS: The first %s will be a "todo" command like
+#. "revert" or "pick", the second %s a SHA1.
+#: sequencer.c:700
 #, c-format
-msgid "could not close %s"
-msgstr "no s'ha pogut tancar %s"
+msgid "%s: cannot parse parent commit %s"
+msgstr "%s: no es pot analitzar la comissió mare %s"
 
-#: wt-status.c:150
-msgid "Unmerged paths:"
-msgstr "Camins sense fusionar:"
+#: sequencer.c:705
+#, c-format
+msgid "cannot get commit message for %s"
+msgstr "no es pot obtenir el missatge de comissió de %s"
 
-#: wt-status.c:177 wt-status.c:204
+#: sequencer.c:797
 #, c-format
-msgid "  (use \"git reset %s <file>...\" to unstage)"
-msgstr "  (useu \"git reset %s <fitxer>...\" per a desallistar)"
+msgid "could not revert %s... %s"
+msgstr "no s'ha pogut revertir %s... %s"
 
-#: wt-status.c:179 wt-status.c:206
-msgid "  (use \"git rm --cached <file>...\" to unstage)"
-msgstr "  (useu \"git rm --cached <fitxer>...\" per a desallistar)"
+#: sequencer.c:798
+#, c-format
+msgid "could not apply %s... %s"
+msgstr "no s'ha pogut aplicar %s... %s"
 
-#: wt-status.c:183
-msgid "  (use \"git add <file>...\" to mark resolution)"
-msgstr "  (useu \"git add <fitxer>...\" per a senyalar resolució)"
+#: sequencer.c:833
+msgid "empty commit set passed"
+msgstr "conjunt de comissions buit passat"
 
-#: wt-status.c:185 wt-status.c:189
-msgid "  (use \"git add/rm <file>...\" as appropriate to mark resolution)"
-msgstr ""
-"  (useu \"git add/rm <fitxer>...\" segons sigui apropiat per a senyalar "
-"resolució)"
+#: sequencer.c:843
+#, c-format
+msgid "git %s: failed to read the index"
+msgstr "git %s: s'ha fallat en llegir l'índex"
 
-#: wt-status.c:187
-msgid "  (use \"git rm <file>...\" to mark resolution)"
-msgstr "  (useu \"git rm <fitxer>...\" per a senyalar resolució)"
+#: sequencer.c:850
+#, c-format
+msgid "git %s: failed to refresh the index"
+msgstr "git %s: s'ha fallat en actualitzar l'índex"
 
-#: wt-status.c:198 wt-status.c:882
-msgid "Changes to be committed:"
-msgstr "Canvis a cometre:"
+#: sequencer.c:944
+#, c-format
+msgid "invalid line %d: %.*s"
+msgstr "línia no vàlida %d: %.*s"
 
-#: wt-status.c:216 wt-status.c:891
-msgid "Changes not staged for commit:"
-msgstr "Canvis no allistats per a cometre:"
+#: sequencer.c:950
+msgid "no commits parsed."
+msgstr "no s'ha analitzat cap comissió."
 
-#: wt-status.c:220
-msgid "  (use \"git add <file>...\" to update what will be committed)"
-msgstr "  (useu \"git add <fitxer>...\" per a actualitzar què es cometrà)"
+#: sequencer.c:966
+#, c-format
+msgid "could not read '%s'."
+msgstr "no s'ha pogut llegir '%s'."
 
-#: wt-status.c:222
-msgid "  (use \"git add/rm <file>...\" to update what will be committed)"
-msgstr "  (useu \"git add/rm <fitxer>...\" per a actualitzar què es cometrà)"
+#: sequencer.c:972
+#, c-format
+msgid "unusable instruction sheet: '%s'"
+msgstr "full d'instruccions inusable: '%s'"
 
-#: wt-status.c:223
-msgid ""
-"  (use \"git checkout -- <file>...\" to discard changes in working directory)"
-msgstr ""
-"  (useu \"git checkout -- <fitxer>...\" per a descartar els canvis en el "
-"directori de treball)"
+#: sequencer.c:983
+msgid "cannot cherry-pick during a revert."
+msgstr "no es pot recollir cireres durant una reversió."
 
-#: wt-status.c:225
-msgid "  (commit or discard the untracked or modified content in submodules)"
-msgstr ""
-"  (cometeu o descarteu el contingut modificat o no seguit en els submòduls)"
+#: sequencer.c:985
+msgid "cannot revert during a cherry-pick."
+msgstr "no es pot revertir durant un recull de cireres."
 
-#: wt-status.c:237
+#: sequencer.c:1028
 #, c-format
-msgid "  (use \"git %s <file>...\" to include in what will be committed)"
-msgstr "  (useu \"git %s <fitxer>...\" per a incloure-ho en què es cometrà)"
-
-#: wt-status.c:252
-msgid "both deleted:"
-msgstr "suprimit per ambdós:"
+msgid "invalid key: %s"
+msgstr "clau no vàlida: %s"
 
-#: wt-status.c:254
-msgid "added by us:"
-msgstr "afegit per nosaltres:"
-
-#: wt-status.c:256
-msgid "deleted by them:"
-msgstr "suprimit per ells:"
+#: sequencer.c:1031
+#, c-format
+msgid "invalid value for %s: %s"
+msgstr "valor no vàlid per a %s: %s"
 
-#: wt-status.c:258
-msgid "added by them:"
-msgstr "afegit per ells:"
+#: sequencer.c:1063
+#, c-format
+msgid "malformed options sheet: '%s'"
+msgstr "full d'opcions mal format: '%s'"
 
-#: wt-status.c:260
-msgid "deleted by us:"
-msgstr "suprimit per nosaltres:"
+#: sequencer.c:1101
+msgid "a cherry-pick or revert is already in progress"
+msgstr "un recull de cireres o una reversió ja està en curs"
 
-#: wt-status.c:262
-msgid "both added:"
-msgstr "afegit per ambdós:"
+#: sequencer.c:1102
+msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
+msgstr "intenteu \"git cherry-pick (--continue | --quit | --abort)\""
 
-#: wt-status.c:264
-msgid "both modified:"
-msgstr "modificat per ambdós:"
+#: sequencer.c:1106
+#, c-format
+msgid "could not create sequencer directory '%s'"
+msgstr "no s'ha pogut crear el directori de seqüenciador '%s'"
 
-#: wt-status.c:274
-msgid "new file:"
-msgstr "fitxer nou:"
+#: sequencer.c:1120
+msgid "could not lock HEAD"
+msgstr "no s'ha pogut bloquejar HEAD"
 
-#: wt-status.c:276
-msgid "copied:"
-msgstr "copiat:"
+#: sequencer.c:1151 sequencer.c:1289
+msgid "no cherry-pick or revert in progress"
+msgstr "ni hi ha cap recull de cireres ni cap reversió en curs"
 
-#: wt-status.c:278
-msgid "deleted:"
-msgstr "suprimit:"
+#: sequencer.c:1153
+msgid "cannot resolve HEAD"
+msgstr "no es pot resoldre HEAD"
 
-#: wt-status.c:280
-msgid "modified:"
-msgstr "modificat:"
+#: sequencer.c:1155 sequencer.c:1189
+msgid "cannot abort from a branch yet to be born"
+msgstr "no es pot avortar des d'una branca que encara ha de nàixer"
 
-#: wt-status.c:282
-msgid "renamed:"
-msgstr "canviat de nom:"
+#: sequencer.c:1175 builtin/grep.c:578
+#, c-format
+msgid "cannot open '%s'"
+msgstr "no es pot obrir '%s'"
 
-#: wt-status.c:284
-msgid "typechange:"
-msgstr "canviat de tipus:"
+#: sequencer.c:1177
+#, c-format
+msgid "cannot read '%s': %s"
+msgstr "no es pot llegir '%s': %s"
 
-#: wt-status.c:286
-msgid "unknown:"
-msgstr "desconegut:"
+#: sequencer.c:1178
+msgid "unexpected end of file"
+msgstr "final de fitxer inesperat"
 
-#: wt-status.c:288
-msgid "unmerged:"
-msgstr "sense fusionar:"
+#: sequencer.c:1184
+#, c-format
+msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
+msgstr "el fitxer HEAD emmagatzemat abans del recull de cireres '%s' és malmès"
 
-#: wt-status.c:370
-msgid "new commits, "
-msgstr "comissions noves, "
+#: sequencer.c:1354
+#, c-format
+msgid "%s: can't cherry-pick a %s"
+msgstr "%s: no es pot recollir com a cirera un %s"
 
-#: wt-status.c:372
-msgid "modified content, "
-msgstr "contingut modificat, "
+#: sequencer.c:1358
+#, c-format
+msgid "%s: bad revision"
+msgstr "%s: revisió dolenta"
 
-#: wt-status.c:374
-msgid "untracked content, "
-msgstr "contingut no seguit, "
+#: sequencer.c:1391
+msgid "can't revert as initial commit"
+msgstr "no es pot revertir com a comissió inicial"
 
-#: wt-status.c:756
-msgid "Submodules changed but not updated:"
-msgstr "Submòduls canviats però no actualitzats:"
+#: setup.c:160
+#, c-format
+msgid ""
+"%s: no such path in the working tree.\n"
+"Use 'git <command> -- <path>...' to specify paths that do not exist locally."
+msgstr ""
+"%s: no hi ha tal camí en l'arbre de treball.\n"
+"Useu 'git <ordre> -- <camí>...' per a especificar camins que no existeixin "
+"localment."
 
-#: wt-status.c:758
-msgid "Submodule changes to be committed:"
-msgstr "Canvis de submòdul a cometre:"
+#: setup.c:173
+#, c-format
+msgid ""
+"ambiguous argument '%s': unknown revision or path not in the working tree.\n"
+"Use '--' to separate paths from revisions, like this:\n"
+"'git <command> [<revision>...] -- [<file>...]'"
+msgstr ""
+"paràmetre ambigu '%s': revisió no coneguda o camí no en l'arbre de treball.\n"
+"Useu '--' per a separar els camins de les revisions, com això:\n"
+"'git <ordre> [<revisió>...] -- [<fitxer>...]'"
 
-#: wt-status.c:839
+#: setup.c:223
+#, c-format
 msgid ""
-"Do not touch the line above.\n"
-"Everything below will be removed."
+"ambiguous argument '%s': both revision and filename\n"
+"Use '--' to separate paths from revisions, like this:\n"
+"'git <command> [<revision>...] -- [<file>...]'"
 msgstr ""
-"No toqueu la línia de sobre.\n"
-"Tot el que hi ha a sota s'eliminarà."
+"paràmetre ambigu '%s': ambdós una revisió i un nom de fitxer\n"
+"Useu '--' per a separar els camins de les revisions, com això:\n"
+"'git <ordre> [<revisió>...] -- [<fitxer>...]'"
 
-#: wt-status.c:950
-msgid "You have unmerged paths."
-msgstr "Teniu camins sense fusionar."
+#: setup.c:468
+#, c-format
+msgid "Expected git repo version <= %d, found %d"
+msgstr "S'esperava una versió de dipòsit de git <= %d, s'ha trobat %d"
 
-#: wt-status.c:953
-msgid "  (fix conflicts and run \"git commit\")"
-msgstr "  (arregleu els conflictes i executeu \"git commit\")"
+#: setup.c:476
+msgid "unknown repository extensions found:"
+msgstr "s'han trobat extensions de dipòsit desconegudes:"
 
-#: wt-status.c:955
-msgid "  (use \"git merge --abort\" to abort the merge)"
-msgstr "  (useu \"git merge --abort\" per a avortar la fusió)"
+#: setup.c:762
+#, c-format
+msgid "Not a git repository (or any of the parent directories): %s"
+msgstr "No és un dipòsit de git (ni cap dels directoris pares): %s"
 
-#: wt-status.c:960
-msgid "All conflicts fixed but you are still merging."
-msgstr "Tots els conflictes estan arreglats però encara esteu fusionant."
+#: setup.c:764 setup.c:915 builtin/index-pack.c:1641
+msgid "Cannot come back to cwd"
+msgstr "No es pot tornar al directori de treball actual"
 
-#: wt-status.c:963
-msgid "  (use \"git commit\" to conclude merge)"
-msgstr "  (useu \"git commit\" per a concloure la fusió)"
+#: setup.c:845
+msgid "Unable to read current working directory"
+msgstr "No s'ha pogut llegir el directori de treball actual"
 
-#: wt-status.c:973
-msgid "You are in the middle of an am session."
-msgstr "Esteu enmig d'una sessió am."
+#: setup.c:920
+#, c-format
+msgid ""
+"Not a git repository (or any parent up to mount point %s)\n"
+"Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set)."
+msgstr ""
+"No un dipòsit de git (ni cap pare fins el punt de muntatge %s)\n"
+"S'atura a la frontera de sistema de fitxers (GIT_DISCOVERY_ACROSS_FILESYSTEM "
+"no està establert)."
 
-#: wt-status.c:976
-msgid "The current patch is empty."
-msgstr "El pedaç actual està buit."
+#: setup.c:927
+#, c-format
+msgid "Cannot change to '%s/..'"
+msgstr "No es pot canviar a '%s/..'"
 
-#: wt-status.c:980
-msgid "  (fix conflicts and then run \"git am --continue\")"
-msgstr "  (arregleu els conflictes i després executeu \"git am --continue\")"
+#: setup.c:989
+#, c-format
+msgid ""
+"Problem with core.sharedRepository filemode value (0%.3o).\n"
+"The owner of files must always have read and write permissions."
+msgstr ""
+"Hi ha un problema amb el valor de mode de fitxer core.sharedRepository "
+"(0%.3o).\n"
+"El propietari dels fitxers sempre ha de tenir permissions de lectura i "
+"escriptura."
 
-#: wt-status.c:982
-msgid "  (use \"git am --skip\" to skip this patch)"
-msgstr "  (useu \"git am --skip\" per a ometre aquest pedaç)"
+#: sha1_file.c:473
+#, c-format
+msgid "path '%s' does not exist"
+msgstr "el camí '%s' no existeix"
 
-#: wt-status.c:984
-msgid "  (use \"git am --abort\" to restore the original branch)"
-msgstr "  (useu \"git am --abort\" per a restaurar la branca original)"
+#: sha1_file.c:499
+#, c-format
+msgid "reference repository '%s' as a linked checkout is not supported yet."
+msgstr ""
+"Encara no se suporta el dipòsit de referència '%s' com a agafament enllaçat."
 
-#: wt-status.c:1109
-msgid "No commands done."
-msgstr "No s'ha fet cap ordre."
+#: sha1_file.c:505
+#, c-format
+msgid "reference repository '%s' is not a local repository."
+msgstr "el dipòsit de referència '%s' no és un dipòsit local."
 
-#: wt-status.c:1112
+#: sha1_file.c:511
 #, c-format
-msgid "Last command done (%d command done):"
-msgid_plural "Last commands done (%d commands done):"
-msgstr[0] "Última ordre feta (%d ordre feta):"
-msgstr[1] "Últimes ordres fetes (%d ordres fetes):"
+msgid "reference repository '%s' is shallow"
+msgstr "el dipòsit de referència '%s' és superficial"
 
-#: wt-status.c:1123
+#: sha1_file.c:519
 #, c-format
-msgid "  (see more in file %s)"
-msgstr "  (vegeu més en el fitxer %s)"
+msgid "reference repository '%s' is grafted"
+msgstr "el dipòsit de referència '%s' és empeltat"
 
-#: wt-status.c:1128
-msgid "No commands remaining."
-msgstr "No manca cap ordre."
+#: sha1_file.c:1159
+msgid "offset before end of packfile (broken .idx?)"
+msgstr "desplaçament abans de la fi del fitxer de paquet (.idx trencat?)"
 
-#: wt-status.c:1131
+#: sha1_file.c:2592
 #, c-format
-msgid "Next command to do (%d remaining command):"
-msgid_plural "Next commands to do (%d remaining commands):"
-msgstr[0] "Ordre següent a fer (manca %d ordre):"
-msgstr[1] "Ordres següents a fer (manquen %d ordres):"
+msgid "offset before start of pack index for %s (corrupt index?)"
+msgstr ""
+"desplaçament abans d'inici d'índex de paquet per a %s (índex corromput?)"
 
-#: wt-status.c:1139
-msgid "  (use \"git rebase --edit-todo\" to view and edit)"
-msgstr "  (useu \"git rebase --edit-todo\" per a veure i editar)"
+#: sha1_file.c:2596
+#, c-format
+msgid "offset beyond end of pack index for %s (truncated index?)"
+msgstr ""
+"desplaçament més enllà de la fi d'índex de paquet per a %s (índex truncat?)"
 
-#: wt-status.c:1152
+#: sha1_name.c:407
 #, c-format
-msgid "You are currently rebasing branch '%s' on '%s'."
-msgstr "Actualment esteu rebasant la branca '%s' en '%s'."
+msgid "short SHA1 %s is ambiguous"
+msgstr "l'SHA1 %s curt és ambigu"
 
-#: wt-status.c:1157
-msgid "You are currently rebasing."
-msgstr "Actualment esteu rebasant."
+#: sha1_name.c:418
+msgid "The candidates are:"
+msgstr "Els candidats són:"
 
-#: wt-status.c:1171
-msgid "  (fix conflicts and then run \"git rebase --continue\")"
+#: sha1_name.c:578
+msgid ""
+"Git normally never creates a ref that ends with 40 hex characters\n"
+"because it will be ignored when you just specify 40-hex. These refs\n"
+"may be created by mistake. For example,\n"
+"\n"
+"  git checkout -b $br $(git rev-parse ...)\n"
+"\n"
+"where \"$br\" is somehow empty and a 40-hex ref is created. Please\n"
+"examine these refs and maybe delete them. Turn this message off by\n"
+"running \"git config advice.objectNameWarning false\""
 msgstr ""
-"  (arregleu els conflictes i després executeu \"git rebase --continue\")"
+"Git normalment mai crea una referència que acabi amb 40 caràcters\n"
+"hexadecimals perquè s'ignorarà quan només especifiqueu 40 caràcters\n"
+"hexadecimals. Aquestes referències es poden crear per error. Per\n"
+"exemple,\n"
+"\n"
+"  git checkout -b $br $(git rev-parse ...)\n"
+"\n"
+"on \"$br\" és d'alguna manera buida i una referència de 40 caràcters\n"
+"hexadecimals. Si us plau, examineu aquestes referències i potser\n"
+"suprimiu-les. Desactiveu aquest missatge executant\n"
+"\"git config advice.objectNameWarning false\""
 
-#: wt-status.c:1173
-msgid "  (use \"git rebase --skip\" to skip this patch)"
-msgstr "  (useu \"git rebase --skip\" per a saltar aquest pedaç)"
+#: submodule.c:64 submodule.c:98
+msgid "Cannot change unmerged .gitmodules, resolve merge conflicts first"
+msgstr ""
+"No es pot canviar un .gitmodules no fusionat, primer resoldreu els "
+"conflictes de fusió"
 
-#: wt-status.c:1175
-msgid "  (use \"git rebase --abort\" to check out the original branch)"
-msgstr "  (useu \"git rebase --abort\" per a agafar la branca original)"
+#: submodule.c:68 submodule.c:102
+#, c-format
+msgid "Could not find section in .gitmodules where path=%s"
+msgstr "No s'ha pogut trobar la secció en .gitmodules on path=%s"
 
-#: wt-status.c:1181
-msgid "  (all conflicts fixed: run \"git rebase --continue\")"
-msgstr "  (tots els conflictes arreglats: executeu \"git rebase --continue\")"
+#: submodule.c:76
+#, c-format
+msgid "Could not update .gitmodules entry %s"
+msgstr "No s'ha pogut actualitzar l'entrada de .gitmodules %s"
 
-#: wt-status.c:1185
+#: submodule.c:109
 #, c-format
-msgid ""
-"You are currently splitting a commit while rebasing branch '%s' on '%s'."
-msgstr ""
-"Actualment esteu dividint una comissió mentre rebaseu la branca '%s' en '%s'."
+msgid "Could not remove .gitmodules entry for %s"
+msgstr "No s'ha pogut eliminar l'entrada de .gitmodules per a %s"
 
-#: wt-status.c:1190
-msgid "You are currently splitting a commit during a rebase."
-msgstr "Actualment esteu dividint una comissió durant un rebasament."
+#: submodule.c:120
+msgid "staging updated .gitmodules failed"
+msgstr "l'allistament del .gitmodules actualitzat ha fallat"
 
-#: wt-status.c:1193
-msgid "  (Once your working directory is clean, run \"git rebase --continue\")"
-msgstr ""
-"  (Una vegada que el vostre directori de treball sigui net, executeu \"git "
-"rebase --continue\")"
+#: submodule.c:158
+msgid "negative values not allowed for submodule.fetchJobs"
+msgstr "no es permeten els valors negatius a submodule.fetchJobs"
 
-#: wt-status.c:1197
+#: submodule-config.c:358
 #, c-format
-msgid "You are currently editing a commit while rebasing branch '%s' on '%s'."
-msgstr ""
-"Actualment esteu editant una comissió mentre rebaseu la branca '%s' en '%s'."
+msgid "invalid value for %s"
+msgstr "valor no vàlid per a %s"
 
-#: wt-status.c:1202
-msgid "You are currently editing a commit during a rebase."
-msgstr "Actualment esteu editant una comissió durant un rebasament."
+#: trailer.c:238
+#, c-format
+msgid "running trailer command '%s' failed"
+msgstr "l'execució de l'ordre de remolc '%s' ha fallat"
 
-#: wt-status.c:1205
-msgid "  (use \"git commit --amend\" to amend the current commit)"
-msgstr "  (useu \"git commit --amend\" per a esmenar la comissió actual)"
+#: trailer.c:471 trailer.c:475 trailer.c:479 trailer.c:533 trailer.c:537
+#: trailer.c:541
+#, c-format
+msgid "unknown value '%s' for key '%s'"
+msgstr "valor desconegut '%s' per a la clau '%s'"
 
-#: wt-status.c:1207
-msgid ""
-"  (use \"git rebase --continue\" once you are satisfied with your changes)"
-msgstr ""
-"  (useu \"git rebase --continue\" una vegada que esteu satisfet amb els "
-"vostres canvis)"
+#: trailer.c:523 trailer.c:528 builtin/remote.c:289
+#, c-format
+msgid "more than one %s"
+msgstr "més d'un %s"
 
-#: wt-status.c:1217
+#: trailer.c:672
 #, c-format
-msgid "You are currently cherry-picking commit %s."
-msgstr "Actualment esteu recollint com a cirera la comissió %s."
+msgid "empty trailer token in trailer '%.*s'"
+msgstr "fitxa de remolc buida en el remolc '%.*s'"
 
-#: wt-status.c:1222
-msgid "  (fix conflicts and run \"git cherry-pick --continue\")"
-msgstr "  (arregleu els conflictes i executeu \"git cherry-pick --continue\")"
+#: trailer.c:695
+#, c-format
+msgid "could not read input file '%s'"
+msgstr "no s'ha pogut llegir el fitxer d'entrada '%s'"
 
-#: wt-status.c:1225
-msgid "  (all conflicts fixed: run \"git cherry-pick --continue\")"
-msgstr ""
-"  (tots els conflictes arreglats: executeu \"git cherry-pick --continue\")"
+#: trailer.c:698
+msgid "could not read from stdin"
+msgstr "no s'ha pogut llegir des d'stdin"
 
-#: wt-status.c:1227
-msgid "  (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)"
-msgstr ""
-"  (useu \"git cherry-pick --abort\" per a cancel·lar l'operació de recull de "
-"cireres)"
+#: trailer.c:929 builtin/am.c:44
+#, c-format
+msgid "could not stat %s"
+msgstr "no s'ha pogut fer stat a %s"
 
-#: wt-status.c:1236
+#: trailer.c:931
 #, c-format
-msgid "You are currently reverting commit %s."
-msgstr "Actualment esteu revertint la comissió %s."
+msgid "file %s is not a regular file"
+msgstr "el fitxer %s no és un fitxer regular"
 
-#: wt-status.c:1241
-msgid "  (fix conflicts and run \"git revert --continue\")"
-msgstr "  (arregleu els conflictes i executeu \"git revert --continue\")"
+#: trailer.c:933
+#, c-format
+msgid "file %s is not writable by user"
+msgstr "el fitxer %s no és gravable per l'usuari"
 
-#: wt-status.c:1244
-msgid "  (all conflicts fixed: run \"git revert --continue\")"
-msgstr ""
-"  (tots els conflictes estan arreglats: executeu \"git revert --continue\")"
+#: trailer.c:945
+msgid "could not open temporary file"
+msgstr "no s'ha pogut obrir el fitxer temporal"
 
-#: wt-status.c:1246
-msgid "  (use \"git revert --abort\" to cancel the revert operation)"
-msgstr ""
-"  (useu \"git revert --abort\" per a cancel·lar l'operació de reversió)"
+#: trailer.c:983
+#, c-format
+msgid "could not rename temporary file to %s"
+msgstr "no s'ha pogut canviar el nom del fitxer temporal a %s"
 
-#: wt-status.c:1257
+#: transport.c:62
 #, c-format
-msgid "You are currently bisecting, started from branch '%s'."
-msgstr "Actualment esteu bisecant, heu començat des de la branca '%s'."
+msgid "Would set upstream of '%s' to '%s' of '%s'\n"
+msgstr "Canviaria la font de '%s' a '%s' de '%s'\n"
 
-#: wt-status.c:1261
-msgid "You are currently bisecting."
-msgstr "Actualment esteu bisecant."
+#: transport.c:151
+#, c-format
+msgid "transport: invalid depth option '%s'"
+msgstr "transport: opció de profunditat no vàlida '%s'"
 
-#: wt-status.c:1264
-msgid "  (use \"git bisect reset\" to get back to the original branch)"
-msgstr "  (useu \"git bisect reset\" per a tornar a la branca original)"
+#: transport.c:817
+#, c-format
+msgid ""
+"The following submodule paths contain changes that can\n"
+"not be found on any remote:\n"
+msgstr ""
+"Els camins de submòdul següents contenen canvis que no\n"
+"es poden trobar en cap remot:\n"
 
-#: wt-status.c:1464
-msgid "On branch "
-msgstr "En la branca "
+#: transport.c:821
+#, c-format
+msgid ""
+"\n"
+"Please try\n"
+"\n"
+"\tgit push --recurse-submodules=on-demand\n"
+"\n"
+"or cd to the path and use\n"
+"\n"
+"\tgit push\n"
+"\n"
+"to push them to a remote.\n"
+"\n"
+msgstr ""
+"\n"
+"Si us plau, intenteu\n"
+"\n"
+"\tgit push --recurse-submodules=on-demand\n"
+"\n"
+"o canviar de directori al camí i useu\n"
+"\n"
+"\tgit push\n"
+"\n"
+"per a pujar-los a un remot.\n"
 
-#: wt-status.c:1470
-msgid "interactive rebase in progress; onto "
-msgstr "rebasament interactiu en progrés; sobre "
+#: transport.c:829
+msgid "Aborting."
+msgstr "S'està avortant."
 
-#: wt-status.c:1472
-msgid "rebase in progress; onto "
-msgstr "rebasament en progrés; sobre "
+#: transport-helper.c:1075
+#, c-format
+msgid "Could not read ref %s"
+msgstr "No s'ha pogut llegir la referència %s"
 
-#: wt-status.c:1477
-msgid "HEAD detached at "
-msgstr "HEAD separat a "
+#: tree-walk.c:31
+msgid "too-short tree object"
+msgstr "objecte d'arbre massa curt"
 
-#: wt-status.c:1479
-msgid "HEAD detached from "
-msgstr "HEAD separat de "
+#: tree-walk.c:37
+msgid "malformed mode in tree entry"
+msgstr "mode mal format en entrada d'arbre"
 
-#: wt-status.c:1482
-msgid "Not currently on any branch."
-msgstr "Actualment no s'és en cap branca."
+#: tree-walk.c:41
+msgid "empty filename in tree entry"
+msgstr "nom de fitxer buit en entrada de arbre"
 
-#: wt-status.c:1500
-msgid "Initial commit"
-msgstr "Comissió inicial"
+#: tree-walk.c:113
+msgid "too-short tree file"
+msgstr "fitxer d'arbre massa curt"
 
-#: wt-status.c:1514
-msgid "Untracked files"
-msgstr "Fitxers no seguits"
+#: unpack-trees.c:64
+#, c-format
+msgid ""
+"Your local changes to the following files would be overwritten by checkout:\n"
+"%%sPlease commit your changes or stash them before you switch branches."
+msgstr ""
+"Els vostres canvis locals als fitxers següents se sobreescriurien per "
+"agafar:\n"
+"%%sSi us plau, cometeu els vostres canvis o emmagatzemeu-los abans de "
+"canviar de branca."
 
-#: wt-status.c:1516
-msgid "Ignored files"
-msgstr "Fitxers ignorats"
+#: unpack-trees.c:66
+#, c-format
+msgid ""
+"Your local changes to the following files would be overwritten by checkout:\n"
+"%%s"
+msgstr ""
+"Els vostres canvis locals als fitxers següents se sobreescriurien per "
+"agafar:\n"
+"%%s"
+
+#: unpack-trees.c:69
+#, c-format
+msgid ""
+"Your local changes to the following files would be overwritten by merge:\n"
+"%%sPlease commit your changes or stash them before you merge."
+msgstr ""
+"Els vostres canvis locals als fitxers següents se sobreescriurien per "
+"fusionar:\n"
+"%%sSi us plau, cometeu els vostres canvis o emmagatzemeu-los abans de "
+"fusionar."
 
-#: wt-status.c:1520
+#: unpack-trees.c:71
 #, 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')."
+"Your local changes to the following files would be overwritten by merge:\n"
+"%%s"
 msgstr ""
-"S'ha trigat %.2f segons a enumerar fitxers no seguits.\n"
-"'status -uno' pot accelerar-ho, però heu d'anar amb compte de no\n"
-"oblidar-vos d'afegir fitxers nous per vós mateix (vegeu\n"
-"'git help status')."
+"Els vostres canvis locals als fitxers següents se sobreescriurien per "
+"fusionar:\n"
+"%%s"
 
-#: wt-status.c:1526
+#: unpack-trees.c:74
 #, c-format
-msgid "Untracked files not listed%s"
-msgstr "Els fitxers no seguits no estan llistats%s"
-
-#: wt-status.c:1528
-msgid " (use -u option to show untracked files)"
-msgstr " (useu l'opció -u per a mostrar els fitxers no seguits)"
-
-#: wt-status.c:1534
-msgid "No changes"
-msgstr "Sense canvis"
+msgid ""
+"Your local changes to the following files would be overwritten by %s:\n"
+"%%sPlease commit your changes or stash them before you %s."
+msgstr ""
+"Els vostres canvis locals als fitxers següents se sobreescriurien per %s:\n"
+"%%sSi us plau, cometeu els vostres canvis o emmagatzemeu-los abans de %s."
 
-#: wt-status.c:1539
+#: unpack-trees.c:76
 #, c-format
-msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n"
+msgid ""
+"Your local changes to the following files would be overwritten by %s:\n"
+"%%s"
 msgstr ""
-"no hi ha canvis afegits a cometre (useu \"git add\" o \"git commit -a\")\n"
+"Els vostres canvis locals als fitxers següents se sobreescriurien per %s:\n"
+"%%s"
 
-#: wt-status.c:1542
+#: unpack-trees.c:81
 #, c-format
-msgid "no changes added to commit\n"
-msgstr "no hi ha canvis afegits a cometre\n"
+msgid ""
+"Updating the following directories would lose untracked files in it:\n"
+"%s"
+msgstr ""
+"Actualitzar els directoris següents perdria fitxers no seguits en el:\n"
+"%s"
 
-#: wt-status.c:1545
+#: unpack-trees.c:85
 #, c-format
 msgid ""
-"nothing added to commit but untracked files present (use \"git add\" to "
-"track)\n"
+"The following untracked working tree files would be removed by checkout:\n"
+"%%sPlease move or remove them before you switch branches."
 msgstr ""
-"no hi ha res afegit a cometre però fitxers no seguits estan presents (useu "
-"\"git add\" per a seguir-los)\n"
+"Els següents fitxers no seguits en l'arbre de treball s'eliminarien per "
+"agafar:\n"
+"%%sSi us plau, moveu-los o elimineu-los abans de canviar de branca."
 
-#: wt-status.c:1548
+#: unpack-trees.c:87
 #, c-format
-msgid "nothing added to commit but untracked files present\n"
-msgstr "no hi ha res afegit a cometre però fitxers no seguits estan presents\n"
+msgid ""
+"The following untracked working tree files would be removed by checkout:\n"
+"%%s"
+msgstr ""
+"Els següents fitxers no seguits en l'arbre de treball s'eliminarien per "
+"agafar:\n"
+"%%s"
 
-#: wt-status.c:1551
+#: unpack-trees.c:90
 #, c-format
-msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
+msgid ""
+"The following untracked working tree files would be removed by merge:\n"
+"%%sPlease move or remove them before you merge."
 msgstr ""
-"no hi ha res a cometre (creeu/copieu fitxers i useu \"git add\" per a seguir-"
-"los)\n"
+"Els següents fitxers no seguits en l'arbre de treball s'eliminarien per "
+"fusionar:\n"
+"%%sSi us plau, moveu-los o elimineu-los abans de fusionar."
 
-#: wt-status.c:1554 wt-status.c:1559
+#: unpack-trees.c:92
 #, c-format
-msgid "nothing to commit\n"
-msgstr "no hi ha res a cometre\n"
+msgid ""
+"The following untracked working tree files would be removed by merge:\n"
+"%%s"
+msgstr ""
+"Els següents fitxers no seguits en l'arbre de treball s'eliminarien per "
+"fusionar:\n"
+"%%s"
 
-#: wt-status.c:1557
+#: unpack-trees.c:95
 #, c-format
-msgid "nothing to commit (use -u to show untracked files)\n"
+msgid ""
+"The following untracked working tree files would be removed by %s:\n"
+"%%sPlease move or remove them before you %s."
 msgstr ""
-"no hi ha res a cometre (useu -u per a mostrar els fitxers no seguits)\n"
+"Els següents fitxers no seguits en l'arbre de treball s'eliminarien per %s:\n"
+"%%sSi us plau, moveu-los o elimineu-los abans de %s."
 
-#: wt-status.c:1561
+#: unpack-trees.c:97
 #, c-format
-msgid "nothing to commit, working tree clean\n"
-msgstr "no hi ha res a cometre, l'arbre de treball està net\n"
-
-#: wt-status.c:1668
-msgid "Initial commit on "
-msgstr "Comissió inicial en "
-
-#: wt-status.c:1672
-msgid "HEAD (no branch)"
-msgstr "HEAD (sense branca)"
-
-#: wt-status.c:1701
-msgid "gone"
-msgstr "no hi és"
-
-#: wt-status.c:1703 wt-status.c:1711
-msgid "behind "
-msgstr "darrere "
-
-#: wt-status.c:1706 wt-status.c:1709
-msgid "ahead "
-msgstr "davant per "
+msgid ""
+"The following untracked working tree files would be removed by %s:\n"
+"%%s"
+msgstr ""
+"Els següents fitxers no seguits en l'arbre de treball s'eliminarien per %s:\n"
+"%%s"
 
-#: compat/precompose_utf8.c:57 builtin/clone.c:415
+#: unpack-trees.c:102
 #, c-format
-msgid "failed to unlink '%s'"
-msgstr "s'ha fallat en desenllaçar '%s'"
-
-#: builtin/add.c:22
-msgid "git add [<options>] [--] <pathspec>..."
-msgstr "git add [<opcions>] [--] <especificació-de-camí>..."
+msgid ""
+"The following untracked working tree files would be overwritten by "
+"checkout:\n"
+"%%sPlease move or remove them before you switch branches."
+msgstr ""
+"Els següents fitxers no seguits en l'arbre de treball se sobreescriurien per "
+"agafar:\n"
+"%%sSi us plau, moveu-los o elimineu-los abans de canviar de branca."
 
-#: builtin/add.c:65
+#: unpack-trees.c:104
 #, c-format
-msgid "unexpected diff status %c"
-msgstr "estat de diff inesperat %c"
-
-#: builtin/add.c:71 builtin/commit.c:281
-msgid "updating files failed"
-msgstr "s'ha fallat en actualitzar els fitxers"
+msgid ""
+"The following untracked working tree files would be overwritten by "
+"checkout:\n"
+"%%s"
+msgstr ""
+"Els següents fitxers no seguits en l'arbre de treball se sobreescriurien per "
+"agafar:\n"
+"%%s"
 
-#: builtin/add.c:81
+#: unpack-trees.c:107
 #, c-format
-msgid "remove '%s'\n"
-msgstr "elimina '%s'\n"
+msgid ""
+"The following untracked working tree files would be overwritten by merge:\n"
+"%%sPlease move or remove them before you merge."
+msgstr ""
+"Els següents fitxers no seguits en l'arbre de treball se sobreescriurien per "
+"fusionar:\n"
+"%%sSi us plau, moveu-los o elimineu-los abans de fusionar."
 
-#: builtin/add.c:136
-msgid "Unstaged changes after refreshing the index:"
-msgstr "Canvis no allistats després d'actualitzar l'índex:"
+#: unpack-trees.c:109
+#, c-format
+msgid ""
+"The following untracked working tree files would be overwritten by merge:\n"
+"%%s"
+msgstr ""
+"Els següents fitxers no seguits en l'arbre de treball se sobreescriurien per "
+"fusionar:\n"
+"%%s"
 
-#: builtin/add.c:196 builtin/rev-parse.c:811
-msgid "Could not read the index"
-msgstr "No s'ha pogut llegir l'índex"
+#: unpack-trees.c:112
+#, c-format
+msgid ""
+"The following untracked working tree files would be overwritten by %s:\n"
+"%%sPlease move or remove them before you %s."
+msgstr ""
+"Els següents fitxers no seguits en l'arbre de treball se sobreescriurien per "
+"%s:\n"
+"%%sSi us plau, moveu-los o elimineu-los abans de %s."
 
-#: builtin/add.c:207
+#: unpack-trees.c:114
 #, c-format
-msgid "Could not open '%s' for writing."
-msgstr "No s'ha pogut obrir '%s' per a escriptura."
+msgid ""
+"The following untracked working tree files would be overwritten by %s:\n"
+"%%s"
+msgstr ""
+"Els següents fitxers no seguits en l'arbre de treball se sobreescriurien per "
+"%s:\n"
+"%%s"
 
-#: builtin/add.c:211
-msgid "Could not write patch"
-msgstr "No s'ha pogut escriure el pedaç"
+#: unpack-trees.c:121
+#, c-format
+msgid "Entry '%s' overlaps with '%s'.  Cannot bind."
+msgstr "L'entrada '%s' encavalca amb '%s'.  No es pot vincular."
 
-#: builtin/add.c:214
-msgid "editing patch failed"
-msgstr "l'edició del pedaç ha fallat"
+#: unpack-trees.c:124
+#, c-format
+msgid ""
+"Cannot update sparse checkout: the following entries are not up-to-date:\n"
+"%s"
+msgstr ""
+"No es pot actualitzar l'agafament parcial: les entrades següents no estan al "
+"dia:\n"
+"%s"
 
-#: builtin/add.c:217
+#: unpack-trees.c:126
 #, c-format
-msgid "Could not stat '%s'"
-msgstr "No s'ha pogut fer stat a '%s'"
+msgid ""
+"The following working tree files would be overwritten by sparse checkout "
+"update:\n"
+"%s"
+msgstr ""
+"Els fitxers següents en l'arbre de treball se sobreescriurien per "
+"actualitzar l'agafament parcial:\n"
+"%s"
 
-#: builtin/add.c:219
-msgid "Empty patch. Aborted."
-msgstr "El pedaç és buit. S'ha avortat."
+#: unpack-trees.c:128
+#, c-format
+msgid ""
+"The following working tree files would be removed by sparse checkout "
+"update:\n"
+"%s"
+msgstr ""
+"Els fitxers següents en l'arbre de treball s'eliminarien per actualitzar "
+"l'agafament parcial:\n"
+"%s"
 
-#: builtin/add.c:224
+#: unpack-trees.c:205
 #, c-format
-msgid "Could not apply '%s'"
-msgstr "No s'ha pogut aplicar '%s'"
+msgid "Aborting\n"
+msgstr "S'està avortant\n"
 
-#: builtin/add.c:234
-msgid "The following paths are ignored by one of your .gitignore files:\n"
-msgstr ""
-"Els camins següents s'ignoren per un dels vostres fitxers .gitignore:\n"
+#: unpack-trees.c:237
+msgid "Checking out files"
+msgstr "S'està agafant fitxers"
 
-#: builtin/add.c:253 builtin/clean.c:870 builtin/fetch.c:113 builtin/mv.c:111
-#: builtin/prune-packed.c:55 builtin/pull.c:197 builtin/push.c:521
-#: builtin/remote.c:1327 builtin/rm.c:268 builtin/send-pack.c:162
-msgid "dry run"
-msgstr "marxa en sec"
+#: urlmatch.c:120
+msgid "invalid URL scheme name or missing '://' suffix"
+msgstr "l'esquema d'URL no és vàlid o li manca el sufix '://'"
 
-#: builtin/add.c:254 builtin/apply.c:4854 builtin/check-ignore.c:19
-#: builtin/commit.c:1334 builtin/count-objects.c:85 builtin/fsck.c:593
-#: builtin/log.c:1852 builtin/mv.c:110 builtin/read-tree.c:114
-msgid "be verbose"
-msgstr "sigues detallat"
+#: urlmatch.c:144 urlmatch.c:297 urlmatch.c:356
+#, c-format
+msgid "invalid %XX escape sequence"
+msgstr "seqüència d'escapament %XX no vàlida"
+
+#: urlmatch.c:172
+msgid "missing host and scheme is not 'file:'"
+msgstr "manca la màquina i l'esquema no és 'file:'"
 
-#: builtin/add.c:256
-msgid "interactive picking"
-msgstr "recull interactiu"
+#: urlmatch.c:189
+msgid "a 'file:' URL may not have a port number"
+msgstr "un URL 'file:' no pot tenir número de port"
 
-#: builtin/add.c:257 builtin/checkout.c:1157 builtin/reset.c:286
-msgid "select hunks interactively"
-msgstr "selecciona els trossos interactivament"
+#: urlmatch.c:199
+msgid "invalid characters in host name"
+msgstr "hi ha caràcters no vàlids en el nom de màquina"
 
-#: builtin/add.c:258
-msgid "edit current diff and apply"
-msgstr "edita la diferència actual i aplica-la"
+#: urlmatch.c:244 urlmatch.c:255
+msgid "invalid port number"
+msgstr "número de port no vàlid"
 
-#: builtin/add.c:259
-msgid "allow adding otherwise ignored files"
-msgstr "permet afegir fitxers que d'altra manera s'ignoren"
+#: urlmatch.c:322
+msgid "invalid '..' path segment"
+msgstr "segment de camí '..' no vàlid"
 
-#: builtin/add.c:260
-msgid "update tracked files"
-msgstr "actualitza els fitxers seguits"
+#: worktree.c:282
+#, c-format
+msgid "failed to read '%s'"
+msgstr "s'ha fallat en llegir '%s'"
 
-#: builtin/add.c:261
-msgid "record only the fact that the path will be added later"
-msgstr "registra només el fet que el camí s'afegirà més tard"
+#: wrapper.c:222 wrapper.c:392
+#, c-format
+msgid "could not open '%s' for reading and writing"
+msgstr "no s'ha pogut obrir '%s' per a lectura i escriptura"
 
-#: builtin/add.c:262
-msgid "add changes from all tracked and untracked files"
-msgstr "afegeix els canvis de tots els fitxers seguits i no seguits"
+#: wrapper.c:224 wrapper.c:394 builtin/am.c:766
+#, c-format
+msgid "could not open '%s' for writing"
+msgstr "no s'ha pogut obrir '%s' per a escriptura"
 
-#: builtin/add.c:265
-msgid "ignore paths removed in the working tree (same as --no-all)"
-msgstr ""
-"ignora els camins eliminats en l'arbre de treball (el mateix que --no-all)"
+#: wrapper.c:226 wrapper.c:396 builtin/am.c:320 builtin/am.c:759
+#: builtin/am.c:847 builtin/commit.c:1705 builtin/merge.c:1029
+#: builtin/pull.c:341
+#, c-format
+msgid "could not open '%s' for reading"
+msgstr "no s'ha pogut obrir '%s' per a lectura"
 
-#: builtin/add.c:267
-msgid "don't add, only refresh the index"
-msgstr "no afegeixis, només actualitza l'índex"
+#: wrapper.c:605 wrapper.c:626
+#, c-format
+msgid "unable to access '%s'"
+msgstr "no s'ha pogut accedir a '%s'"
 
-#: builtin/add.c:268
-msgid "just skip files which cannot be added because of errors"
-msgstr "només omet els fitxers que no es poden afegir a causa d'errors"
+#: wrapper.c:634
+msgid "unable to get current working directory"
+msgstr "no s'ha pogut obtenir el directori de treball actual"
 
-#: builtin/add.c:269
-msgid "check if - even missing - files are ignored in dry run"
-msgstr ""
-"comproveu si els fitxers - fins i tot els absents - s'ignoren en marxa en sec"
+#: wrapper.c:658
+#, c-format
+msgid "could not write to %s"
+msgstr "no s'ha pogut escriure a %s"
 
-#: builtin/add.c:270 builtin/update-index.c:958
-msgid "(+/-)x"
-msgstr "(+/-)x"
+#: wrapper.c:660
+#, c-format
+msgid "could not close %s"
+msgstr "no s'ha pogut tancar %s"
 
-#: builtin/add.c:270 builtin/update-index.c:959
-msgid "override the executable bit of the listed files"
-msgstr "passa per alt el bit executable dels fitxers llistats"
+#: wt-status.c:151
+msgid "Unmerged paths:"
+msgstr "Camins sense fusionar:"
 
-#: builtin/add.c:292
+#: wt-status.c:178 wt-status.c:205
 #, c-format
-msgid "Use -f if you really want to add them.\n"
-msgstr "Useu -f si realment els voleu afegir.\n"
+msgid "  (use \"git reset %s <file>...\" to unstage)"
+msgstr "  (useu \"git reset %s <fitxer>...\" per a desallistar)"
 
-#: builtin/add.c:300
-msgid "adding files failed"
-msgstr "l'afegiment de fitxers ha fallat"
+#: wt-status.c:180 wt-status.c:207
+msgid "  (use \"git rm --cached <file>...\" to unstage)"
+msgstr "  (useu \"git rm --cached <fitxer>...\" per a desallistar)"
 
-#: builtin/add.c:336
-msgid "-A and -u are mutually incompatible"
-msgstr "-A i -u són mutualment incompatibles"
+#: wt-status.c:184
+msgid "  (use \"git add <file>...\" to mark resolution)"
+msgstr "  (useu \"git add <fitxer>...\" per a senyalar resolució)"
 
-#: builtin/add.c:343
-msgid "Option --ignore-missing can only be used together with --dry-run"
-msgstr "L'opció --ignore-missing només es pot usar junt amb --dry-run"
+#: wt-status.c:186 wt-status.c:190
+msgid "  (use \"git add/rm <file>...\" as appropriate to mark resolution)"
+msgstr ""
+"  (useu \"git add/rm <fitxer>...\" segons sigui apropiat per a senyalar "
+"resolució)"
 
-#: builtin/add.c:352
-#, c-format
-msgid "--chmod param '%s' must be either -x or +x"
-msgstr "el paràmetre --chmod '%s' ha de ser o -x o +x"
+#: wt-status.c:188
+msgid "  (use \"git rm <file>...\" to mark resolution)"
+msgstr "  (useu \"git rm <fitxer>...\" per a senyalar resolució)"
 
-#: builtin/add.c:367
-#, c-format
-msgid "Nothing specified, nothing added.\n"
-msgstr "No s'ha especificat res, no s'ha afegit res.\n"
+#: wt-status.c:199 wt-status.c:945
+msgid "Changes to be committed:"
+msgstr "Canvis a cometre:"
 
-#: builtin/add.c:368
-#, c-format
-msgid "Maybe you wanted to say 'git add .'?\n"
-msgstr "Potser volíeu dir 'git add .'?\n"
+#: wt-status.c:217 wt-status.c:954
+msgid "Changes not staged for commit:"
+msgstr "Canvis no allistats per a cometre:"
 
-#: builtin/add.c:373 builtin/check-ignore.c:172 builtin/checkout.c:279
-#: builtin/checkout.c:473 builtin/clean.c:914 builtin/commit.c:340
-#: builtin/mv.c:131 builtin/reset.c:235 builtin/rm.c:298
-#: builtin/submodule--helper.c:240
-msgid "index file corrupt"
-msgstr "fitxer d'índex malmès"
+#: wt-status.c:221
+msgid "  (use \"git add <file>...\" to update what will be committed)"
+msgstr "  (useu \"git add <fitxer>...\" per a actualitzar què es cometrà)"
 
-#: builtin/add.c:454 builtin/apply.c:4784 builtin/mv.c:286 builtin/rm.c:431
-msgid "Unable to write new index file"
-msgstr "no s'ha pogut escriure un fitxer d'índex nou"
+#: wt-status.c:223
+msgid "  (use \"git add/rm <file>...\" to update what will be committed)"
+msgstr "  (useu \"git add/rm <fitxer>...\" per a actualitzar què es cometrà)"
 
-#: builtin/am.c:257 builtin/commit.c:750 builtin/merge.c:1032
-#, c-format
-msgid "could not read '%s'"
-msgstr "no s'ha pogut llegir '%s'"
+#: wt-status.c:224
+msgid ""
+"  (use \"git checkout -- <file>...\" to discard changes in working directory)"
+msgstr ""
+"  (useu \"git checkout -- <fitxer>...\" per a descartar els canvis en el "
+"directori de treball)"
 
-#: builtin/am.c:426
-msgid "could not parse author script"
-msgstr "no s'ha pogut analitzar l'script d'autor"
+#: wt-status.c:226
+msgid "  (commit or discard the untracked or modified content in submodules)"
+msgstr ""
+"  (cometeu o descarteu el contingut modificat o no seguit en els submòduls)"
 
-#: builtin/am.c:503
+#: wt-status.c:238
 #, c-format
-msgid "'%s' was deleted by the applypatch-msg hook"
-msgstr "s'ha suprimit '%s' pel ganxo applypatch-msg"
+msgid "  (use \"git %s <file>...\" to include in what will be committed)"
+msgstr "  (useu \"git %s <fitxer>...\" per a incloure-ho en què es cometrà)"
 
-#: builtin/am.c:544 builtin/notes.c:301
-#, c-format
-msgid "Malformed input line: '%s'."
-msgstr "Línia d'entrada mal formada: '%s'."
+#: wt-status.c:253
+msgid "both deleted:"
+msgstr "suprimit per ambdós:"
 
-#: builtin/am.c:581 builtin/notes.c:316
-#, c-format
-msgid "Failed to copy notes from '%s' to '%s'"
-msgstr "S'ha fallat en copiar les notes de '%s' a '%s'"
+#: wt-status.c:255
+msgid "added by us:"
+msgstr "afegit per nosaltres:"
 
-#: builtin/am.c:607
-msgid "fseek failed"
-msgstr "fseek ha fallat"
+#: wt-status.c:257
+msgid "deleted by them:"
+msgstr "suprimit per ells:"
 
-#: builtin/am.c:787
-#, c-format
-msgid "could not parse patch '%s'"
-msgstr "no s'ha pogut analitzar el pedaç '%s'"
+#: wt-status.c:259
+msgid "added by them:"
+msgstr "afegit per ells:"
 
-#: builtin/am.c:852
-msgid "Only one StGIT patch series can be applied at once"
-msgstr "només una sèrie de pedaços StGIT es pot aplicar a la vegada"
+#: wt-status.c:261
+msgid "deleted by us:"
+msgstr "suprimit per nosaltres:"
 
-#: builtin/am.c:899
-msgid "invalid timestamp"
-msgstr "marca de temps no vàlida"
+#: wt-status.c:263
+msgid "both added:"
+msgstr "afegit per ambdós:"
 
-#: builtin/am.c:902 builtin/am.c:910
-msgid "invalid Date line"
-msgstr "línia Date no vàlida"
+#: wt-status.c:265
+msgid "both modified:"
+msgstr "modificat per ambdós:"
 
-#: builtin/am.c:907
-msgid "invalid timezone offset"
-msgstr "desplaçament de zona de temps no vàlid"
+#: wt-status.c:275
+msgid "new file:"
+msgstr "fitxer nou:"
 
-#: builtin/am.c:996
-msgid "Patch format detection failed."
-msgstr "La detecció de format de pedaç ha fallat."
+#: wt-status.c:277
+msgid "copied:"
+msgstr "copiat:"
 
-#: builtin/am.c:1001 builtin/clone.c:380
-#, c-format
-msgid "failed to create directory '%s'"
-msgstr "s'ha fallat en crear el directori '%s'"
+#: wt-status.c:279
+msgid "deleted:"
+msgstr "suprimit:"
 
-#: builtin/am.c:1005
-msgid "Failed to split patches."
-msgstr "S'ha fallat en dividir els pedaços."
+#: wt-status.c:281
+msgid "modified:"
+msgstr "modificat:"
 
-#: builtin/am.c:1137 builtin/commit.c:366
-msgid "unable to write index file"
-msgstr "no s'ha pogut escriure el fitxer d'índex"
+#: wt-status.c:283
+msgid "renamed:"
+msgstr "canviat de nom:"
 
-#: builtin/am.c:1188
-#, c-format
-msgid "When you have resolved this problem, run \"%s --continue\"."
-msgstr "Quan hàgiu resolt aquest problema, executeu \"%s --continue\"."
+#: wt-status.c:285
+msgid "typechange:"
+msgstr "canviat de tipus:"
 
-#: builtin/am.c:1189
-#, c-format
-msgid "If you prefer to skip this patch, run \"%s --skip\" instead."
-msgstr ""
-"Si preferiu saltar aquest pedaç, executeu \"%s --skip\" en lloc d'això."
+#: wt-status.c:287
+msgid "unknown:"
+msgstr "desconegut:"
 
-#: builtin/am.c:1190
-#, c-format
-msgid "To restore the original branch and stop patching, run \"%s --abort\"."
-msgstr ""
-"Per a restaurar la branca original i deixar d'apedaçar, executeu \"%s --abort"
-"\"."
+#: wt-status.c:289
+msgid "unmerged:"
+msgstr "sense fusionar:"
 
-#: builtin/am.c:1328
-msgid "Patch is empty. Was it split wrong?"
-msgstr "El pedaç és buit. S'ha dividit malament?"
+#: wt-status.c:371
+msgid "new commits, "
+msgstr "comissions noves, "
 
-#: builtin/am.c:1402 builtin/log.c:1543
-#, c-format
-msgid "invalid ident line: %s"
-msgstr "línia d'identitat no vàlida: %s"
+#: wt-status.c:373
+msgid "modified content, "
+msgstr "contingut modificat, "
 
-#: builtin/am.c:1429
-#, c-format
-msgid "unable to parse commit %s"
-msgstr "no s'ha pogut analitzar la comissió %s"
+#: wt-status.c:375
+msgid "untracked content, "
+msgstr "contingut no seguit, "
 
-#: builtin/am.c:1602
-msgid "Repository lacks necessary blobs to fall back on 3-way merge."
-msgstr ""
-"Al dipòsit li manquen els blobs necessaris per a retrocedir a una fusió de 3 "
-"vies."
+#: wt-status.c:818
+msgid "Submodules changed but not updated:"
+msgstr "Submòduls canviats però no actualitzats:"
 
-#: builtin/am.c:1604
-msgid "Using index info to reconstruct a base tree..."
-msgstr "S'està usant la informació d'índex per a reconstruir un arbre base..."
+#: wt-status.c:820
+msgid "Submodule changes to be committed:"
+msgstr "Canvis de submòdul a cometre:"
 
-#: builtin/am.c:1623
+#: wt-status.c:901
 msgid ""
-"Did you hand edit your patch?\n"
-"It does not apply to blobs recorded in its index."
+"Do not touch the line above.\n"
+"Everything below will be removed."
 msgstr ""
-"Heu editat el vostre pedaç a mà?\n"
-"No s'aplica als blobs recordats en el seu índex."
+"No toqueu la línia a dalt.\n"
+"Tot el que hi ha a sota s'eliminarà."
 
-#: builtin/am.c:1629
-msgid "Falling back to patching base and 3-way merge..."
-msgstr "S'està retrocedint a apedaçar la base i fusionar de 3 vies..."
+#: wt-status.c:1013
+msgid "You have unmerged paths."
+msgstr "Teniu camins sense fusionar."
 
-#: builtin/am.c:1654
-msgid "Failed to merge in the changes."
-msgstr "S'ha fallat en fusionar els canvis."
+#: wt-status.c:1016
+msgid "  (fix conflicts and run \"git commit\")"
+msgstr "  (arregleu els conflictes i executeu \"git commit\")"
 
-#: builtin/am.c:1679 builtin/merge.c:628
-msgid "git write-tree failed to write a tree"
-msgstr "git write-tree ha fallat en escriure un arbre"
+#: wt-status.c:1018
+msgid "  (use \"git merge --abort\" to abort the merge)"
+msgstr "  (useu \"git merge --abort\" per a avortar la fusió)"
 
-#: builtin/am.c:1686
-msgid "applying to an empty history"
-msgstr "s'està aplicant a una història buida"
+#: wt-status.c:1023
+msgid "All conflicts fixed but you are still merging."
+msgstr "Tots els conflictes estan arreglats però encara esteu fusionant."
+
+#: wt-status.c:1026
+msgid "  (use \"git commit\" to conclude merge)"
+msgstr "  (useu \"git commit\" per a concloure la fusió)"
+
+#: wt-status.c:1036
+msgid "You are in the middle of an am session."
+msgstr "Esteu enmig d'una sessió am."
 
-#: builtin/am.c:1699 builtin/commit.c:1776 builtin/merge.c:798
-#: builtin/merge.c:823
-msgid "failed to write commit object"
-msgstr "s'ha fallat en escriure l'objecte de comissió"
+#: wt-status.c:1039
+msgid "The current patch is empty."
+msgstr "El pedaç actual està buit."
 
-#: builtin/am.c:1731 builtin/am.c:1735
-#, c-format
-msgid "cannot resume: %s does not exist."
-msgstr "no es pot reprendre: %s no existeix."
+#: wt-status.c:1043
+msgid "  (fix conflicts and then run \"git am --continue\")"
+msgstr "  (arregleu els conflictes i després executeu \"git am --continue\")"
 
-#: builtin/am.c:1751
-msgid "cannot be interactive without stdin connected to a terminal."
-msgstr ""
-"no es pot ser interactiu sense que stdin sigui connectat a un terminal."
+#: wt-status.c:1045
+msgid "  (use \"git am --skip\" to skip this patch)"
+msgstr "  (useu \"git am --skip\" per a ometre aquest pedaç)"
 
-#: builtin/am.c:1756
-msgid "Commit Body is:"
-msgstr "El cos de la comissió és:"
+#: wt-status.c:1047
+msgid "  (use \"git am --abort\" to restore the original branch)"
+msgstr "  (useu \"git am --abort\" per a restaurar la branca original)"
 
-#. TRANSLATORS: Make sure to include [y], [n], [e], [v] and [a]
-#. in your translation. The program will only accept English
-#. input at this point.
-#.
-#: builtin/am.c:1766
-msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all: "
-msgstr ""
-"Voleu aplicar-lo? [y]es/[n]o/[e]dita/[v]isualitza el pedaç/[a]ccepta'ls "
-"tots: "
+#: wt-status.c:1172
+msgid "No commands done."
+msgstr "No s'ha fet cap ordre."
 
-#: builtin/am.c:1816
+#: wt-status.c:1175
 #, c-format
-msgid "Dirty index: cannot apply patches (dirty: %s)"
-msgstr "Índex brut: no es pot aplicar pedaços (bruts: %s)"
+msgid "Last command done (%d command done):"
+msgid_plural "Last commands done (%d commands done):"
+msgstr[0] "Última ordre feta (%d ordre feta):"
+msgstr[1] "Últimes ordres fetes (%d ordres fetes):"
 
-#: builtin/am.c:1853 builtin/am.c:1925
+#: wt-status.c:1186
 #, c-format
-msgid "Applying: %.*s"
-msgstr "S'està aplicant: %.*s"
+msgid "  (see more in file %s)"
+msgstr "  (vegeu més en el fitxer %s)"
 
-#: builtin/am.c:1869
-msgid "No changes -- Patch already applied."
-msgstr "Sense canvis -- El pedaç ja s'ha aplicat."
+#: wt-status.c:1191
+msgid "No commands remaining."
+msgstr "No manca cap ordre."
 
-#: builtin/am.c:1877
+#: wt-status.c:1194
 #, c-format
-msgid "Patch failed at %s %.*s"
-msgstr "El pedaç ha fallat a %s %.*s"
+msgid "Next command to do (%d remaining command):"
+msgid_plural "Next commands to do (%d remaining commands):"
+msgstr[0] "Ordre següent a fer (manca %d ordre):"
+msgstr[1] "Ordres següents a fer (manquen %d ordres):"
+
+#: wt-status.c:1202
+msgid "  (use \"git rebase --edit-todo\" to view and edit)"
+msgstr "  (useu \"git rebase --edit-todo\" per a veure i editar)"
 
-#: builtin/am.c:1883
+#: wt-status.c:1215
 #, c-format
-msgid "The copy of the patch that failed is found in: %s"
-msgstr "La còpia del pedaç que ha fallat es troba en: %s"
+msgid "You are currently rebasing branch '%s' on '%s'."
+msgstr "Actualment esteu rebasant la branca '%s' en '%s'."
 
-#: builtin/am.c:1928
-msgid ""
-"No changes - did you forget to use 'git add'?\n"
-"If there is nothing left to stage, chances are that something else\n"
-"already introduced the same changes; you might want to skip this patch."
-msgstr ""
-"Cap canvi - heu oblidat d'usar 'git add'?\n"
-"Si no hi ha res a allistar, probablement alguna altra cosa\n"
-"ja ha introduït els mateixos canvis; potser voleu ometre aquest pedaç."
+#: wt-status.c:1220
+msgid "You are currently rebasing."
+msgstr "Actualment esteu rebasant."
 
-#: builtin/am.c:1935
-msgid ""
-"You still have unmerged paths in your index.\n"
-"Did you forget to use 'git add'?"
+#: wt-status.c:1234
+msgid "  (fix conflicts and then run \"git rebase --continue\")"
 msgstr ""
-"Encara teniu camins sense fusionar en el vostre índex.\n"
-"Heu oblidat d'usar 'git add'?"
+"  (arregleu els conflictes i després executeu \"git rebase --continue\")"
 
-#: builtin/am.c:2043 builtin/am.c:2047 builtin/am.c:2059 builtin/reset.c:308
-#: builtin/reset.c:316
-#, c-format
-msgid "Could not parse object '%s'."
-msgstr "No s'ha pogut analitzar l'objecte '%s'."
+#: wt-status.c:1236
+msgid "  (use \"git rebase --skip\" to skip this patch)"
+msgstr "  (useu \"git rebase --skip\" per a saltar aquest pedaç)"
 
-#: builtin/am.c:2095
-msgid "failed to clean index"
-msgstr "s'ha fallat en netejar l'índex"
+#: wt-status.c:1238
+msgid "  (use \"git rebase --abort\" to check out the original branch)"
+msgstr "  (useu \"git rebase --abort\" per a agafar la branca original)"
 
-#: builtin/am.c:2129
-msgid ""
-"You seem to have moved HEAD since the last 'am' failure.\n"
-"Not rewinding to ORIG_HEAD"
+#: wt-status.c:1244
+msgid "  (all conflicts fixed: run \"git rebase --continue\")"
 msgstr ""
-"Sembla que heu mogut HEAD després de l'última fallada de 'am'.\n"
-"No rebobinant a ORIG_HEAD"
+"  (tots els conflictes estan arreglats: executeu \"git rebase --continue\")"
 
-#: builtin/am.c:2192
+#: wt-status.c:1248
 #, c-format
-msgid "Invalid value for --patch-format: %s"
-msgstr "Valor no vàlid per a --patch-format: %s"
-
-#: builtin/am.c:2225
-msgid "git am [<options>] [(<mbox>|<Maildir>)...]"
-msgstr "git am [<opcions>] [(<bústia>|<directori-de-correu>)...]"
-
-#: builtin/am.c:2226
-msgid "git am [<options>] (--continue | --skip | --abort)"
-msgstr "git am [<opcions>] (--continue | --skip | --abort)"
-
-#: builtin/am.c:2232
-msgid "run interactively"
-msgstr "executa interactivament"
-
-#: builtin/am.c:2234
-msgid "historical option -- no-op"
-msgstr "opció històrica -- no-op"
-
-#: builtin/am.c:2236
-msgid "allow fall back on 3way merging if needed"
-msgstr "permet retrocedir a una fusió de 3 vies si és necessari"
-
-#: builtin/am.c:2237 builtin/init-db.c:481 builtin/prune-packed.c:57
-#: builtin/repack.c:172
-msgid "be quiet"
-msgstr "calla"
-
-#: builtin/am.c:2239
-msgid "add a Signed-off-by line to the commit message"
-msgstr "afegeix una línia Signed-off-by al missatge de comissió"
+msgid ""
+"You are currently splitting a commit while rebasing branch '%s' on '%s'."
+msgstr ""
+"Actualment esteu dividint una comissió mentre rebaseu la branca '%s' en '%s'."
 
-#: builtin/am.c:2242
-msgid "recode into utf8 (default)"
-msgstr "recodifica en utf8 (per defecte)"
+#: wt-status.c:1253
+msgid "You are currently splitting a commit during a rebase."
+msgstr "Actualment esteu dividint una comissió durant un rebasament."
 
-#: builtin/am.c:2244
-msgid "pass -k flag to git-mailinfo"
-msgstr "passa la bandera -k al git-mailinfo"
+#: wt-status.c:1256
+msgid "  (Once your working directory is clean, run \"git rebase --continue\")"
+msgstr ""
+"  (Una vegada que el vostre directori de treball sigui net, executeu \"git "
+"rebase --continue\")"
 
-#: builtin/am.c:2246
-msgid "pass -b flag to git-mailinfo"
-msgstr "passa la bandera -b al git-mailinfo"
+#: wt-status.c:1260
+#, c-format
+msgid "You are currently editing a commit while rebasing branch '%s' on '%s'."
+msgstr ""
+"Actualment esteu editant una comissió mentre rebaseu la branca '%s' en '%s'."
 
-#: builtin/am.c:2248
-msgid "pass -m flag to git-mailinfo"
-msgstr "passa la bandera -m al git-mailinfo"
+#: wt-status.c:1265
+msgid "You are currently editing a commit during a rebase."
+msgstr "Actualment esteu editant una comissió durant un rebasament."
 
-#: builtin/am.c:2250
-msgid "pass --keep-cr flag to git-mailsplit for mbox format"
-msgstr "passa la bandera --keep-cr al git-mailsplit pel format mbox"
+#: wt-status.c:1268
+msgid "  (use \"git commit --amend\" to amend the current commit)"
+msgstr "  (useu \"git commit --amend\" per a esmenar la comissió actual)"
 
-#: builtin/am.c:2253
-msgid "do not pass --keep-cr flag to git-mailsplit independent of am.keepcr"
+#: wt-status.c:1270
+msgid ""
+"  (use \"git rebase --continue\" once you are satisfied with your changes)"
 msgstr ""
-"no passis la bandera --keep-cr al git-mailsplit independent de am.keepcr"
-
-#: builtin/am.c:2256
-msgid "strip everything before a scissors line"
-msgstr "despulla tot abans d'una línia de tissores"
-
-#: builtin/am.c:2257 builtin/apply.c:4837
-msgid "action"
-msgstr "acció"
+"  (useu \"git rebase --continue\" una vegada que estigueu satisfet amb els "
+"vostres canvis)"
 
-#: builtin/am.c:2258 builtin/am.c:2261 builtin/am.c:2264 builtin/am.c:2267
-#: builtin/am.c:2270 builtin/am.c:2273 builtin/am.c:2276 builtin/am.c:2279
-#: builtin/am.c:2285
-msgid "pass it through git-apply"
-msgstr "passa-ho a través del git-apply"
+#: wt-status.c:1280
+#, c-format
+msgid "You are currently cherry-picking commit %s."
+msgstr "Actualment esteu recollint com a cirera la comissió %s."
 
-#: builtin/am.c:2266 builtin/apply.c:4861
-msgid "root"
-msgstr "arrel"
+#: wt-status.c:1285
+msgid "  (fix conflicts and run \"git cherry-pick --continue\")"
+msgstr "  (arregleu els conflictes i executeu \"git cherry-pick --continue\")"
 
-#: builtin/am.c:2269 builtin/am.c:2272 builtin/apply.c:4799
-#: builtin/apply.c:4802 builtin/clone.c:90 builtin/fetch.c:96
-#: builtin/pull.c:179 builtin/submodule--helper.c:277
-#: builtin/submodule--helper.c:402 builtin/submodule--helper.c:482
-#: builtin/submodule--helper.c:485 builtin/submodule--helper.c:823
-#: builtin/submodule--helper.c:826
-msgid "path"
-msgstr "camí"
+#: wt-status.c:1288
+msgid "  (all conflicts fixed: run \"git cherry-pick --continue\")"
+msgstr ""
+"  (tots els conflictes estan arreglats: executeu \"git cherry-pick --continue"
+"\")"
 
-#: builtin/am.c:2275 builtin/fmt-merge-msg.c:666 builtin/fmt-merge-msg.c:669
-#: builtin/grep.c:706 builtin/merge.c:200 builtin/pull.c:134 builtin/pull.c:193
-#: builtin/repack.c:181 builtin/repack.c:185 builtin/show-branch.c:645
-#: builtin/show-ref.c:175 builtin/tag.c:340 parse-options.h:132
-#: parse-options.h:134 parse-options.h:244
-msgid "n"
-msgstr "n"
+#: wt-status.c:1290
+msgid "  (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)"
+msgstr ""
+"  (useu \"git cherry-pick --abort\" per a cancel·lar l'operació de recull de "
+"cireres)"
 
-#: builtin/am.c:2278 builtin/apply.c:4805
-msgid "num"
-msgstr "número"
+#: wt-status.c:1299
+#, c-format
+msgid "You are currently reverting commit %s."
+msgstr "Actualment esteu revertint la comissió %s."
 
-#: builtin/am.c:2281 builtin/for-each-ref.c:37 builtin/replace.c:438
-#: builtin/tag.c:372
-msgid "format"
-msgstr "format"
+#: wt-status.c:1304
+msgid "  (fix conflicts and run \"git revert --continue\")"
+msgstr "  (arregleu els conflictes i executeu \"git revert --continue\")"
 
-#: builtin/am.c:2282
-msgid "format the patch(es) are in"
-msgstr "el format en el qual estan els pedaços"
+#: wt-status.c:1307
+msgid "  (all conflicts fixed: run \"git revert --continue\")"
+msgstr ""
+"  (tots els conflictes estan arreglats: executeu \"git revert --continue\")"
 
-#: builtin/am.c:2288
-msgid "override error message when patch failure occurs"
+#: wt-status.c:1309
+msgid "  (use \"git revert --abort\" to cancel the revert operation)"
 msgstr ""
-"passa per alt el missatge d'error quan s'ocorre una fallada en apedaçar"
+"  (useu \"git revert --abort\" per a cancel·lar l'operació de reversió)"
 
-#: builtin/am.c:2290
-msgid "continue applying patches after resolving a conflict"
-msgstr "segueix aplicant pedaços després de resoldre un conflicte"
+#: wt-status.c:1320
+#, c-format
+msgid "You are currently bisecting, started from branch '%s'."
+msgstr "Actualment esteu bisecant, heu començat des de la branca '%s'."
 
-#: builtin/am.c:2293
-msgid "synonyms for --continue"
-msgstr "sinònims de --continue"
+#: wt-status.c:1324
+msgid "You are currently bisecting."
+msgstr "Actualment esteu bisecant."
 
-#: builtin/am.c:2296
-msgid "skip the current patch"
-msgstr "salta el pedaç actual"
+#: wt-status.c:1327
+msgid "  (use \"git bisect reset\" to get back to the original branch)"
+msgstr "  (useu \"git bisect reset\" per a tornar a la branca original)"
 
-#: builtin/am.c:2299
-msgid "restore the original branch and abort the patching operation."
-msgstr "restaura la branca original i avorta l'operació d'apedaçament."
+#: wt-status.c:1524
+msgid "On branch "
+msgstr "En la branca "
 
-#: builtin/am.c:2303
-msgid "lie about committer date"
-msgstr "menteix sobre la data del comitent"
+#: wt-status.c:1530
+msgid "interactive rebase in progress; onto "
+msgstr "rebasament interactiu en progrés; sobre "
 
-#: builtin/am.c:2305
-msgid "use current timestamp for author date"
-msgstr "usa el marc de temps actual per la data d'autor"
+#: wt-status.c:1532
+msgid "rebase in progress; onto "
+msgstr "rebasament en progrés; sobre "
 
-#: builtin/am.c:2307 builtin/commit.c:1610 builtin/merge.c:229
-#: builtin/pull.c:164 builtin/revert.c:92 builtin/tag.c:355
-msgid "key-id"
-msgstr "ID de clau"
+#: wt-status.c:1537
+msgid "HEAD detached at "
+msgstr "HEAD separat a "
 
-#: builtin/am.c:2308
-msgid "GPG-sign commits"
-msgstr "signa les comissions amb GPG"
+#: wt-status.c:1539
+msgid "HEAD detached from "
+msgstr "HEAD separat de "
 
-#: builtin/am.c:2311
-msgid "(internal use for git-rebase)"
-msgstr "(ús intern per al git-rebase)"
+#: wt-status.c:1542
+msgid "Not currently on any branch."
+msgstr "Actualment no s'és en cap branca."
 
-#: builtin/am.c:2326
-msgid ""
-"The -b/--binary option has been a no-op for long time, and\n"
-"it will be removed. Please do not use it anymore."
-msgstr ""
-"Fa molt que l'opció -b/--binary no ha fet res, i\n"
-"s'eliminarà. Si us plau, no l'useu més."
+#: wt-status.c:1560
+msgid "Initial commit"
+msgstr "Comissió inicial"
 
-#: builtin/am.c:2333
-msgid "failed to read the index"
-msgstr "s'ha fallat en llegir l'índex"
+#: wt-status.c:1574
+msgid "Untracked files"
+msgstr "Fitxers no seguits"
 
-#: builtin/am.c:2348
-#, c-format
-msgid "previous rebase directory %s still exists but mbox given."
-msgstr ""
-"un directori de rebasament anterior %s encara existeix però s'ha donat una "
-"bústia."
+#: wt-status.c:1576
+msgid "Ignored files"
+msgstr "Fitxers ignorats"
 
-#: builtin/am.c:2372
+#: wt-status.c:1580
 #, c-format
 msgid ""
-"Stray %s directory found.\n"
-"Use \"git am --abort\" to remove it."
+"It took %.2f seconds to enumerate untracked files. 'status -uno'\n"
+"may speed it up, but you have to be careful not to forget to add\n"
+"new files yourself (see 'git help status')."
 msgstr ""
-"Directori %s extraviat trobat.\n"
-"Useu \"git am --abort\" per a eliminar-lo."
+"Ha trigat %.2f segons enumerar els fitxers no seguits.\n"
+"'status -uno' pot accelerar-ho, però heu d'anar amb compte de no\n"
+"oblidar-vos d'afegir fitxers nous per vós mateix (vegeu\n"
+"'git help status')."
 
-#: builtin/am.c:2378
-msgid "Resolve operation not in progress, we are not resuming."
-msgstr "Operació de resolució no en curs; no reprenem."
+#: wt-status.c:1586
+#, c-format
+msgid "Untracked files not listed%s"
+msgstr "Els fitxers no seguits no estan llistats%s"
 
-#: builtin/apply.c:122
-msgid "git apply [<options>] [<patch>...]"
-msgstr "git apply [<opcions>] [<pedaç>...]"
+#: wt-status.c:1588
+msgid " (use -u option to show untracked files)"
+msgstr " (useu l'opció -u per a mostrar els fitxers no seguits)"
 
-#: builtin/apply.c:153
-#, c-format
-msgid "unrecognized whitespace option '%s'"
-msgstr "opció d'espai en blanc '%s' no reconeguda"
+#: wt-status.c:1594
+msgid "No changes"
+msgstr "Sense canvis"
 
-#: builtin/apply.c:169
+#: wt-status.c:1599
 #, c-format
-msgid "unrecognized whitespace ignore option '%s'"
-msgstr "opció d'ignoral d'espai en blanc '%s' no reconeguda"
+msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n"
+msgstr ""
+"no hi ha canvis afegits a cometre (useu \"git add\" o \"git commit -a\")\n"
 
-#: builtin/apply.c:854
+#: wt-status.c:1602
 #, c-format
-msgid "Cannot prepare timestamp regexp %s"
-msgstr "No es pot preparar l'expressió regular de marca de temps %s"
+msgid "no changes added to commit\n"
+msgstr "no hi ha canvis afegits a cometre\n"
 
-#: builtin/apply.c:863
+#: wt-status.c:1605
 #, c-format
-msgid "regexec returned %d for input: %s"
-msgstr "regexec ha retornat %d per l'entrada: %s"
+msgid ""
+"nothing added to commit but untracked files present (use \"git add\" to "
+"track)\n"
+msgstr ""
+"no hi ha res afegit a cometre però fitxers no seguits estan presents (useu "
+"\"git add\" per a seguir-los)\n"
 
-#: builtin/apply.c:947
+#: wt-status.c:1608
 #, c-format
-msgid "unable to find filename in patch at line %d"
-msgstr "no s'ha pogut trobar el nom de fitxer en el pedaç a la línia %d"
+msgid "nothing added to commit but untracked files present\n"
+msgstr "no hi ha res afegit a cometre però fitxers no seguits estan presents\n"
 
-#: builtin/apply.c:984
+#: wt-status.c:1611
 #, c-format
-msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d"
+msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
 msgstr ""
-"git apply: git-diff dolent - /dev/null esperat, %s rebut en la línia %d"
+"no hi ha res a cometre (creeu/copieu fitxers i useu \"git add\" per a seguir-"
+"los)\n"
 
-#: builtin/apply.c:989
+#: wt-status.c:1614 wt-status.c:1619
 #, c-format
-msgid "git apply: bad git-diff - inconsistent new filename on line %d"
-msgstr ""
-"git apply: git-diff dolent - nom de fitxer nou inconsistent en la línia %d"
+msgid "nothing to commit\n"
+msgstr "no hi ha res a cometre\n"
 
-#: builtin/apply.c:990
+#: wt-status.c:1617
 #, c-format
-msgid "git apply: bad git-diff - inconsistent old filename on line %d"
+msgid "nothing to commit (use -u to show untracked files)\n"
 msgstr ""
-"git apply: git-diff dolent - nom de fitxer antic inconsistent en la línia %d"
+"no hi ha res a cometre (useu -u per a mostrar els fitxers no seguits)\n"
 
-#: builtin/apply.c:995
+#: wt-status.c:1621
 #, c-format
-msgid "git apply: bad git-diff - expected /dev/null on line %d"
-msgstr "git apply: git-diff dolent - /dev/null esperat en la línia %d"
+msgid "nothing to commit, working tree clean\n"
+msgstr "no hi ha res a cometre, l'arbre de treball està net\n"
 
-#: builtin/apply.c:1489
-#, c-format
-msgid "recount: unexpected line: %.*s"
-msgstr "recompte: línia inesperada: %.*s"
+#: wt-status.c:1728
+msgid "Initial commit on "
+msgstr "Comissió inicial en "
 
-#: builtin/apply.c:1550
-#, c-format
-msgid "patch fragment without header at line %d: %.*s"
-msgstr "fragment de pedaç sense capçalera a la línia %d: %.*s"
+#: wt-status.c:1732
+msgid "HEAD (no branch)"
+msgstr "HEAD (sense branca)"
 
-#: builtin/apply.c:1567
-#, c-format
-msgid ""
-"git diff header lacks filename information when removing %d leading pathname "
-"component (line %d)"
-msgid_plural ""
-"git diff header lacks filename information when removing %d leading pathname "
-"components (line %d)"
-msgstr[0] ""
-"a la capçalera de git diff li manca informació de nom de fitxer en eliminar "
-"%d component de nom de camí inicial (línia %d)"
-msgstr[1] ""
-"a la capçalera de git diff li manca informació de nom de fitxer en eliminar "
-"%d components de nom de camí inicial (línia %d)"
+#: wt-status.c:1761
+msgid "gone"
+msgstr "no hi és"
 
-#: builtin/apply.c:1743
-msgid "new file depends on old contents"
-msgstr "el fitxer nou depèn dels continguts antics"
+#: wt-status.c:1763 wt-status.c:1771
+msgid "behind "
+msgstr "darrere "
 
-#: builtin/apply.c:1745
-msgid "deleted file still has contents"
-msgstr "el fitxer suprimit encara té continguts"
+#: wt-status.c:1766 wt-status.c:1769
+msgid "ahead "
+msgstr "davant per "
 
-#: builtin/apply.c:1774
+#. TRANSLATORS: the action is e.g. "pull with rebase"
+#: wt-status.c:2270
 #, c-format
-msgid "corrupt patch at line %d"
-msgstr "el pedaç és malmès a la línia %d"
+msgid "cannot %s: You have unstaged changes."
+msgstr "no es pot %s: Teniu canvis no allistats."
 
-#: builtin/apply.c:1810
-#, c-format
-msgid "new file %s depends on old contents"
-msgstr "el fitxer nou %s depèn dels continguts antics"
+#: wt-status.c:2276
+msgid "additionally, your index contains uncommitted changes."
+msgstr "addicionalment, el vostre índex conté canvis sense cometre."
 
-#: builtin/apply.c:1812
+#: wt-status.c:2278
 #, c-format
-msgid "deleted file %s still has contents"
-msgstr "el fitxer suprimit %s encara té continguts"
+msgid "cannot %s: Your index contains uncommitted changes."
+msgstr "no es pot %s: El vostre índex conté canvis sense cometre."
 
-#: builtin/apply.c:1815
+#: compat/precompose_utf8.c:57 builtin/clone.c:414
 #, c-format
-msgid "** warning: file %s becomes empty but is not deleted"
-msgstr "** advertència: el fitxer %s queda buit però no se suprimeix"
+msgid "failed to unlink '%s'"
+msgstr "s'ha fallat en desenllaçar '%s'"
 
-#: builtin/apply.c:1962
-#, c-format
-msgid "corrupt binary patch at line %d: %.*s"
-msgstr "pedaç binari malmès a la línia %d: %.*s"
+#: builtin/add.c:22
+msgid "git add [<options>] [--] <pathspec>..."
+msgstr "git add [<opcions>] [--] <especificació-de-camí>..."
 
-#: builtin/apply.c:1999
+#: builtin/add.c:80
 #, c-format
-msgid "unrecognized binary patch at line %d"
-msgstr "pedaç binari no reconegut a la línia %d"
+msgid "unexpected diff status %c"
+msgstr "estat de diff inesperat %c"
+
+#: builtin/add.c:85 builtin/commit.c:291
+msgid "updating files failed"
+msgstr "s'ha fallat en actualitzar els fitxers"
 
-#: builtin/apply.c:2154
+#: builtin/add.c:95
 #, c-format
-msgid "patch with only garbage at line %d"
-msgstr "pedaç amb només escombraries a la línia %d"
+msgid "remove '%s'\n"
+msgstr "elimina '%s'\n"
+
+#: builtin/add.c:149
+msgid "Unstaged changes after refreshing the index:"
+msgstr "Canvis no allistats després d'actualitzar l'índex:"
 
-#: builtin/apply.c:2244
+#: builtin/add.c:209 builtin/rev-parse.c:840
+msgid "Could not read the index"
+msgstr "No s'ha pogut llegir l'índex"
+
+#: builtin/add.c:220
 #, c-format
-msgid "unable to read symlink %s"
-msgstr "no s'ha pogut llegir l'enllaç simbòlic %s"
+msgid "Could not open '%s' for writing."
+msgstr "No s'ha pogut obrir '%s' per a escriptura."
+
+#: builtin/add.c:224
+msgid "Could not write patch"
+msgstr "No s'ha pogut escriure el pedaç"
+
+#: builtin/add.c:227
+msgid "editing patch failed"
+msgstr "l'edició del pedaç ha fallat"
 
-#: builtin/apply.c:2248
+#: builtin/add.c:230
 #, c-format
-msgid "unable to open or read %s"
-msgstr "no s'ha pogut obrir o llegir %s"
+msgid "Could not stat '%s'"
+msgstr "No s'ha pogut fer stat a '%s'"
+
+#: builtin/add.c:232
+msgid "Empty patch. Aborted."
+msgstr "El pedaç és buit. S'ha avortat."
 
-#: builtin/apply.c:2901
+#: builtin/add.c:237
 #, c-format
-msgid "invalid start of line: '%c'"
-msgstr "inici de línia no vàlid: '%c'"
+msgid "Could not apply '%s'"
+msgstr "No s'ha pogut aplicar '%s'"
+
+#: builtin/add.c:247
+msgid "The following paths are ignored by one of your .gitignore files:\n"
+msgstr ""
+"Els camins següents s'ignoren per un dels vostres fitxers .gitignore:\n"
+
+#: builtin/add.c:266 builtin/clean.c:870 builtin/fetch.c:115 builtin/mv.c:111
+#: builtin/prune-packed.c:55 builtin/pull.c:198 builtin/push.c:521
+#: builtin/remote.c:1326 builtin/rm.c:268 builtin/send-pack.c:162
+msgid "dry run"
+msgstr "marxa en sec"
+
+#: builtin/add.c:269
+msgid "interactive picking"
+msgstr "recull interactiu"
+
+#: builtin/add.c:270 builtin/checkout.c:1156 builtin/reset.c:286
+msgid "select hunks interactively"
+msgstr "selecciona els trossos interactivament"
+
+#: builtin/add.c:271
+msgid "edit current diff and apply"
+msgstr "edita la diferència actual i aplica-la"
+
+#: builtin/add.c:272
+msgid "allow adding otherwise ignored files"
+msgstr "permet afegir fitxers que d'altra manera s'ignoren"
+
+#: builtin/add.c:273
+msgid "update tracked files"
+msgstr "actualitza els fitxers seguits"
+
+#: builtin/add.c:274
+msgid "record only the fact that the path will be added later"
+msgstr "registra només el fet de que el camí s'afegirà més tard"
+
+#: builtin/add.c:275
+msgid "add changes from all tracked and untracked files"
+msgstr "afegeix els canvis de tots els fitxers seguits i no seguits"
+
+#: builtin/add.c:278
+msgid "ignore paths removed in the working tree (same as --no-all)"
+msgstr ""
+"ignora els camins eliminats en l'arbre de treball (el mateix que --no-all)"
+
+#: builtin/add.c:280
+msgid "don't add, only refresh the index"
+msgstr "no afegeixis, només actualitza l'índex"
+
+#: builtin/add.c:281
+msgid "just skip files which cannot be added because of errors"
+msgstr "només omet els fitxers que no es poden afegir a causa d'errors"
+
+#: builtin/add.c:282
+msgid "check if - even missing - files are ignored in dry run"
+msgstr ""
+"comproveu si els fitxers - fins i tot els absents - s'ignoren en marxa en sec"
+
+#: builtin/add.c:283 builtin/update-index.c:947
+msgid "(+/-)x"
+msgstr "(+/-)x"
+
+#: builtin/add.c:283 builtin/update-index.c:948
+msgid "override the executable bit of the listed files"
+msgstr "passa per alt el bit executable dels fitxers llistats"
 
-#: builtin/apply.c:3020
+#: builtin/add.c:305
 #, c-format
-msgid "Hunk #%d succeeded at %d (offset %d line)."
-msgid_plural "Hunk #%d succeeded at %d (offset %d lines)."
-msgstr[0] "El tros #%d ha tingut èxit a %d (desplaçament %d línia)."
-msgstr[1] "El tros #%d ha tingut èxit a %d (desplaçament %d línies)."
+msgid "Use -f if you really want to add them.\n"
+msgstr "Useu -f si realment els voleu afegir.\n"
+
+#: builtin/add.c:312
+msgid "adding files failed"
+msgstr "l'afegiment de fitxers ha fallat"
+
+#: builtin/add.c:348
+msgid "-A and -u are mutually incompatible"
+msgstr "-A i -u són mutualment incompatibles"
+
+#: builtin/add.c:355
+msgid "Option --ignore-missing can only be used together with --dry-run"
+msgstr "L'opció --ignore-missing només es pot usar junt amb --dry-run"
 
-#: builtin/apply.c:3032
+#: builtin/add.c:359
 #, c-format
-msgid "Context reduced to (%ld/%ld) to apply fragment at %d"
-msgstr "El context s'ha reduït a (%ld/%ld) per a aplicar el fragment a %d"
+msgid "--chmod param '%s' must be either -x or +x"
+msgstr "el paràmetre --chmod '%s' ha de ser o -x o +x"
 
-#: builtin/apply.c:3038
+#: builtin/add.c:374
 #, c-format
-msgid ""
-"while searching for:\n"
-"%.*s"
-msgstr ""
-"tot cercant:\n"
-"%.*s"
+msgid "Nothing specified, nothing added.\n"
+msgstr "No s'ha especificat res, no s'ha afegit res.\n"
 
-#: builtin/apply.c:3060
+#: builtin/add.c:375
 #, c-format
-msgid "missing binary patch data for '%s'"
-msgstr "manquen les dades de pedaç binari de '%s'"
+msgid "Maybe you wanted to say 'git add .'?\n"
+msgstr "Potser volíeu dir 'git add .'?\n"
+
+#: builtin/add.c:380 builtin/check-ignore.c:172 builtin/checkout.c:279
+#: builtin/checkout.c:472 builtin/clean.c:914 builtin/commit.c:350
+#: builtin/mv.c:131 builtin/reset.c:235 builtin/rm.c:298
+#: builtin/submodule--helper.c:244
+msgid "index file corrupt"
+msgstr "fitxer d'índex malmès"
+
+#: builtin/am.c:414
+msgid "could not parse author script"
+msgstr "no s'ha pogut analitzar l'script d'autor"
 
-#: builtin/apply.c:3163
+#: builtin/am.c:491
 #, c-format
-msgid "binary patch does not apply to '%s'"
-msgstr "el pedaç binari no s'aplica a '%s'"
+msgid "'%s' was deleted by the applypatch-msg hook"
+msgstr "s'ha suprimit '%s' pel ganxo applypatch-msg"
 
-#: builtin/apply.c:3169
+#: builtin/am.c:532
 #, c-format
-msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)"
-msgstr ""
-"el pedaç binari a '%s' crea un resultat incorrecte (esperant %s, %s rebut)"
+msgid "Malformed input line: '%s'."
+msgstr "Línia d'entrada mal formada: '%s'."
 
-#: builtin/apply.c:3190
+#: builtin/am.c:569
 #, c-format
-msgid "patch failed: %s:%ld"
-msgstr "el pedaç ha fallat: %s:%ld"
+msgid "Failed to copy notes from '%s' to '%s'"
+msgstr "S'ha fallat en copiar les notes de '%s' a '%s'"
+
+#: builtin/am.c:595
+msgid "fseek failed"
+msgstr "fseek ha fallat"
 
-#: builtin/apply.c:3314
+#: builtin/am.c:775
 #, c-format
-msgid "cannot checkout %s"
-msgstr "no es pot agafar %s"
+msgid "could not parse patch '%s'"
+msgstr "no s'ha pogut analitzar el pedaç '%s'"
+
+#: builtin/am.c:840
+msgid "Only one StGIT patch series can be applied at once"
+msgstr "només una sèrie de pedaços StGIT es pot aplicar a la vegada"
 
-#: builtin/apply.c:3370
-#, c-format
-msgid "reading from '%s' beyond a symbolic link"
-msgstr "s'està llegint de '%s' més enllà d'un enllaç simbòlic"
+#: builtin/am.c:887
+msgid "invalid timestamp"
+msgstr "marca de temps no vàlida"
 
-#: builtin/apply.c:3399 builtin/apply.c:3630
-#, c-format
-msgid "path %s has been renamed/deleted"
-msgstr "el camí %s s'ha canviat de nom / s'ha suprimit"
+#: builtin/am.c:890 builtin/am.c:898
+msgid "invalid Date line"
+msgstr "línia Date no vàlida"
 
-#: builtin/apply.c:3482 builtin/apply.c:3644
-#, c-format
-msgid "%s: does not exist in index"
-msgstr "%s: no existeix en l'índex"
+#: builtin/am.c:895
+msgid "invalid timezone offset"
+msgstr "desplaçament de zona de temps no vàlid"
 
-#: builtin/apply.c:3486 builtin/apply.c:3636 builtin/apply.c:3658
-#, c-format
-msgid "%s: %s"
-msgstr "%s: %s"
+#: builtin/am.c:984
+msgid "Patch format detection failed."
+msgstr "La detecció de format de pedaç ha fallat."
 
-#: builtin/apply.c:3491 builtin/apply.c:3652
+#: builtin/am.c:989 builtin/clone.c:379
 #, c-format
-msgid "%s: does not match index"
-msgstr "%s: no coincideix amb l'índex"
+msgid "failed to create directory '%s'"
+msgstr "s'ha fallat en crear el directori '%s'"
 
-#: builtin/apply.c:3597
-msgid "removal patch leaves file contents"
-msgstr "el pedaç d'eliminació deixa els continguts dels fitxers"
+#: builtin/am.c:993
+msgid "Failed to split patches."
+msgstr "S'ha fallat en dividir els pedaços."
 
-#: builtin/apply.c:3669
-#, c-format
-msgid "%s: wrong type"
-msgstr "%s: tipus erroni"
+#: builtin/am.c:1125 builtin/commit.c:376
+msgid "unable to write index file"
+msgstr "no s'ha pogut escriure el fitxer d'índex"
 
-#: builtin/apply.c:3671
+#: builtin/am.c:1176
 #, c-format
-msgid "%s has type %o, expected %o"
-msgstr "%s és del tipus %o, s'esperava %o"
+msgid "When you have resolved this problem, run \"%s --continue\"."
+msgstr "Quan hàgiu resolt aquest problema, executeu \"%s --continue\"."
 
-#: builtin/apply.c:3822 builtin/apply.c:3824
+#: builtin/am.c:1177
 #, c-format
-msgid "invalid path '%s'"
-msgstr "camí no vàlid: %s"
+msgid "If you prefer to skip this patch, run \"%s --skip\" instead."
+msgstr ""
+"Si preferiu saltar aquest pedaç, executeu \"%s --skip\" en lloc d'això."
 
-#: builtin/apply.c:3879
+#: builtin/am.c:1178
 #, c-format
-msgid "%s: already exists in index"
-msgstr "%s: ja existeix en l'índex"
+msgid "To restore the original branch and stop patching, run \"%s --abort\"."
+msgstr ""
+"Per a restaurar la branca original i deixar d'apedaçar, executeu \"%s --abort"
+"\"."
 
-#: builtin/apply.c:3882
-#, c-format
-msgid "%s: already exists in working directory"
-msgstr "%s: ja existeix en el directori de treball"
+#: builtin/am.c:1316
+msgid "Patch is empty. Was it split wrong?"
+msgstr "El pedaç és buit. S'ha dividit malament?"
 
-#: builtin/apply.c:3902
+#: builtin/am.c:1390 builtin/log.c:1550
 #, c-format
-msgid "new mode (%o) of %s does not match old mode (%o)"
-msgstr "el mode nou (%o) de %s no coincideix amb el mode antic (%o)"
+msgid "invalid ident line: %s"
+msgstr "línia d'identitat no vàlida: %s"
 
-#: builtin/apply.c:3907
+#: builtin/am.c:1417
 #, c-format
-msgid "new mode (%o) of %s does not match old mode (%o) of %s"
-msgstr "el mode nou (%o) de %s no coincideix amb el mode antic (%o) de %s"
+msgid "unable to parse commit %s"
+msgstr "no s'ha pogut analitzar la comissió %s"
 
-#: builtin/apply.c:3927
-#, c-format
-msgid "affected file '%s' is beyond a symbolic link"
-msgstr "el fitxer afectat '%s' és més enllà d'un enllaç simbòlic"
+#: builtin/am.c:1610
+msgid "Repository lacks necessary blobs to fall back on 3-way merge."
+msgstr ""
+"Al dipòsit li manquen els blobs necessaris per a retrocedir a una fusió de 3 "
+"vies."
 
-#: builtin/apply.c:3931
-#, c-format
-msgid "%s: patch does not apply"
-msgstr "%s: el pedaç no s'aplica"
+#: builtin/am.c:1612
+msgid "Using index info to reconstruct a base tree..."
+msgstr "S'està usant la informació d'índex per a reconstruir un arbre base..."
 
-#: builtin/apply.c:3945
-#, c-format
-msgid "Checking patch %s..."
-msgstr "S'està comprovant el pedaç %s..."
+#: builtin/am.c:1631
+msgid ""
+"Did you hand edit your patch?\n"
+"It does not apply to blobs recorded in its index."
+msgstr ""
+"Heu editat el vostre pedaç a mà?\n"
+"No s'aplica als blobs recordats en el seu índex."
 
-#: builtin/apply.c:4038 builtin/checkout.c:233 builtin/reset.c:135
-#, c-format
-msgid "make_cache_entry failed for path '%s'"
-msgstr "make_cache_entry ha fallat per al camí '%s'"
+#: builtin/am.c:1637
+msgid "Falling back to patching base and 3-way merge..."
+msgstr "S'està retrocedint a apedaçar la base i fusionar de 3 vies..."
 
-#: builtin/apply.c:4182
-#, c-format
-msgid "unable to remove %s from index"
-msgstr "no s'ha pogut eliminar %s de l'índex"
+#: builtin/am.c:1662
+msgid "Failed to merge in the changes."
+msgstr "S'ha fallat en fusionar els canvis."
 
-#: builtin/apply.c:4215
-#, c-format
-msgid "corrupt patch for submodule %s"
-msgstr "pedaç malmès per al submòdul %s"
+#: builtin/am.c:1686 builtin/merge.c:628
+msgid "git write-tree failed to write a tree"
+msgstr "git write-tree ha fallat en escriure un arbre"
 
-#: builtin/apply.c:4219
-#, c-format
-msgid "unable to stat newly created file '%s'"
-msgstr "no s'ha pogut fer stat al fitxer novament creat '%s'"
+#: builtin/am.c:1693
+msgid "applying to an empty history"
+msgstr "s'està aplicant a una història buida"
+
+#: builtin/am.c:1706 builtin/commit.c:1769 builtin/merge.c:798
+#: builtin/merge.c:823
+msgid "failed to write commit object"
+msgstr "s'ha fallat en escriure l'objecte de comissió"
 
-#: builtin/apply.c:4224
+#: builtin/am.c:1739 builtin/am.c:1743
 #, c-format
-msgid "unable to create backing store for newly created file %s"
+msgid "cannot resume: %s does not exist."
+msgstr "no es pot reprendre: %s no existeix."
+
+#: builtin/am.c:1759
+msgid "cannot be interactive without stdin connected to a terminal."
 msgstr ""
-"no s'ha pogut crear un magatzem de recolzament per al fitxer novament creat "
-"%s"
+"no es pot ser interactiu sense que stdin estigui connectada a un terminal."
 
-#: builtin/apply.c:4227 builtin/apply.c:4340
-#, c-format
-msgid "unable to add cache entry for %s"
-msgstr "no s'ha pogut afegir una entrada de cau per a %s"
+#: builtin/am.c:1764
+msgid "Commit Body is:"
+msgstr "El cos de la comissió és:"
 
-#: builtin/apply.c:4260
-#, c-format
-msgid "closing file '%s'"
-msgstr "s'està tancant el fitxer '%s'"
+#. TRANSLATORS: Make sure to include [y], [n], [e], [v] and [a]
+#. in your translation. The program will only accept English
+#. input at this point.
+#.
+#: builtin/am.c:1774
+msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all: "
+msgstr ""
+"Voleu aplicar-lo? [y]es/[n]o/[e]dita/[v]isualitza el pedaç/[a]ccepta'ls "
+"tots: "
 
-#: builtin/apply.c:4313
+#: builtin/am.c:1824
 #, c-format
-msgid "unable to write file '%s' mode %o"
-msgstr "no s'ha pogut escriure el fitxer '%s' mode %o"
+msgid "Dirty index: cannot apply patches (dirty: %s)"
+msgstr "Índex brut: no es pot aplicar pedaços (bruts: %s)"
 
-#: builtin/apply.c:4403
+#: builtin/am.c:1861 builtin/am.c:1933
 #, c-format
-msgid "Applied patch %s cleanly."
-msgstr "El pedaç %s s'ha aplicat netament."
+msgid "Applying: %.*s"
+msgstr "S'està aplicant: %.*s"
 
-#: builtin/apply.c:4411
-msgid "internal error"
-msgstr "error intern"
+#: builtin/am.c:1877
+msgid "No changes -- Patch already applied."
+msgstr "Sense canvis -- El pedaç ja s'ha aplicat."
 
-#: builtin/apply.c:4414
+#: builtin/am.c:1885
 #, c-format
-msgid "Applying patch %%s with %d reject..."
-msgid_plural "Applying patch %%s with %d rejects..."
-msgstr[0] "S'està aplicant el pedaç %%s amb %d rebuig..."
-msgstr[1] "S'està aplicant el pedaç %%s amb %d rebuitjos..."
+msgid "Patch failed at %s %.*s"
+msgstr "El pedaç ha fallat a %s %.*s"
 
-#: builtin/apply.c:4424
+#: builtin/am.c:1891
 #, c-format
-msgid "truncating .rej filename to %.*s.rej"
-msgstr "s'està truncant el nom del fitxer .rej a %.*s.rej"
+msgid "The copy of the patch that failed is found in: %s"
+msgstr "La còpia del pedaç que ha fallat es troba en: %s"
 
-#: builtin/apply.c:4432
-#, c-format
-msgid "cannot open %s: %s"
-msgstr "no es pot obrir %s: %s"
+#: builtin/am.c:1936
+msgid ""
+"No changes - did you forget to use 'git add'?\n"
+"If there is nothing left to stage, chances are that something else\n"
+"already introduced the same changes; you might want to skip this patch."
+msgstr ""
+"Cap canvi - heu oblidat d'usar 'git add'?\n"
+"Si no hi ha res a allistar, probablement alguna altra cosa ja ha\n"
+"introduït els mateixos canvis; potser voleu ometre aquest pedaç."
 
-#: builtin/apply.c:4445
-#, c-format
-msgid "Hunk #%d applied cleanly."
-msgstr "El tros #%d s'ha aplicat netament."
+#: builtin/am.c:1943
+msgid ""
+"You still have unmerged paths in your index.\n"
+"Did you forget to use 'git add'?"
+msgstr ""
+"Encara teniu camins sense fusionar en el vostre índex.\n"
+"Heu oblidat d'usar 'git add'?"
 
-#: builtin/apply.c:4448
+#: builtin/am.c:2051 builtin/am.c:2055 builtin/am.c:2067 builtin/reset.c:308
+#: builtin/reset.c:316
 #, c-format
-msgid "Rejected hunk #%d."
-msgstr "S'ha rebutjat el tros #%d."
+msgid "Could not parse object '%s'."
+msgstr "No s'ha pogut analitzar l'objecte '%s'."
+
+#: builtin/am.c:2103
+msgid "failed to clean index"
+msgstr "s'ha fallat en netejar l'índex"
+
+#: builtin/am.c:2137
+msgid ""
+"You seem to have moved HEAD since the last 'am' failure.\n"
+"Not rewinding to ORIG_HEAD"
+msgstr ""
+"Sembla que heu mogut HEAD després de l'última fallada de 'am'.\n"
+"No s'està rebobinant a ORIG_HEAD"
 
-#: builtin/apply.c:4537
+#: builtin/am.c:2200
 #, c-format
-msgid "Skipped patch '%s'."
-msgstr "S'ha saltat el pedaç '%s'."
+msgid "Invalid value for --patch-format: %s"
+msgstr "Valor no vàlid per a --patch-format: %s"
 
-#: builtin/apply.c:4545
-msgid "unrecognized input"
-msgstr "entrada no reconeguda"
+#: builtin/am.c:2233
+msgid "git am [<options>] [(<mbox> | <Maildir>)...]"
+msgstr "git am [<opcions>] [(<bústia> | <directori-de-correu>)...]"
 
-#: builtin/apply.c:4556
-msgid "unable to read index file"
-msgstr "no es pot llegir el fitxer d'índex"
+#: builtin/am.c:2234
+msgid "git am [<options>] (--continue | --skip | --abort)"
+msgstr "git am [<opcions>] (--continue | --skip | --abort)"
 
-#: builtin/apply.c:4701
-msgid "--3way outside a repository"
-msgstr "--3way fora d'un dipòsit"
+#: builtin/am.c:2240
+msgid "run interactively"
+msgstr "executa interactivament"
 
-#: builtin/apply.c:4709
-msgid "--index outside a repository"
-msgstr "--index fora d'un dipòsit"
+#: builtin/am.c:2242
+msgid "historical option -- no-op"
+msgstr "opció històrica -- no-op"
 
-#: builtin/apply.c:4712
-msgid "--cached outside a repository"
-msgstr "--cached fora d'un dipòsit"
+#: builtin/am.c:2244
+msgid "allow fall back on 3way merging if needed"
+msgstr "permet retrocedir a una fusió de 3 vies si és necessari"
 
-#: builtin/apply.c:4745
-#, c-format
-msgid "can't open patch '%s'"
-msgstr "no es pot obrir el pedaç '%s'"
+#: builtin/am.c:2245 builtin/init-db.c:483 builtin/prune-packed.c:57
+#: builtin/repack.c:172
+msgid "be quiet"
+msgstr "calla"
 
-#: builtin/apply.c:4760
-#, c-format
-msgid "squelched %d whitespace error"
-msgid_plural "squelched %d whitespace errors"
-msgstr[0] "s'ha omès %d error d'espai en blanc"
-msgstr[1] "s'han omès %d errors d'espai en blanc"
+#: builtin/am.c:2247
+msgid "add a Signed-off-by line to the commit message"
+msgstr "afegeix una línia Signed-off-by al missatge de comissió"
 
-#: builtin/apply.c:4766 builtin/apply.c:4776
-#, c-format
-msgid "%d line adds whitespace errors."
-msgid_plural "%d lines add whitespace errors."
-msgstr[0] "%d línia afegeix errors d'espai en blanc."
-msgstr[1] "%d línies afegeixen errors d'espai en blanc."
+#: builtin/am.c:2250
+msgid "recode into utf8 (default)"
+msgstr "recodifica en utf8 (per defecte)"
 
-#: builtin/apply.c:4800
-msgid "don't apply changes matching the given path"
-msgstr "no apliquis els canvis que coincideixin amb el camí donat"
+#: builtin/am.c:2252
+msgid "pass -k flag to git-mailinfo"
+msgstr "passa la bandera -k al git-mailinfo"
 
-#: builtin/apply.c:4803
-msgid "apply changes matching the given path"
-msgstr "aplica els canvis que coincideixin amb el camí donat"
+#: builtin/am.c:2254
+msgid "pass -b flag to git-mailinfo"
+msgstr "passa la bandera -b al git-mailinfo"
 
-#: builtin/apply.c:4806
-msgid "remove <num> leading slashes from traditional diff paths"
-msgstr ""
-"elimina <nombre> barres obliqües inicials dels camins de diferència "
-"tradicionals"
+#: builtin/am.c:2256
+msgid "pass -m flag to git-mailinfo"
+msgstr "passa la bandera -m al git-mailinfo"
 
-#: builtin/apply.c:4809
-msgid "ignore additions made by the patch"
-msgstr "ignora afegiments fets pel pedaç"
+#: builtin/am.c:2258
+msgid "pass --keep-cr flag to git-mailsplit for mbox format"
+msgstr "passa la bandera --keep-cr al git-mailsplit per al format mbox"
 
-#: builtin/apply.c:4811
-msgid "instead of applying the patch, output diffstat for the input"
+#: builtin/am.c:2261
+msgid "do not pass --keep-cr flag to git-mailsplit independent of am.keepcr"
 msgstr ""
-"en lloc d'aplicar el pedaç, emet les estadístiques de diferència de l'entrada"
+"no passis la bandera --keep-cr al git-mailsplit independent de am.keepcr"
 
-#: builtin/apply.c:4815
-msgid "show number of added and deleted lines in decimal notation"
-msgstr "mostra el nombre de línies afegides i suprimides en notació decimal"
+#: builtin/am.c:2264
+msgid "strip everything before a scissors line"
+msgstr "despulla tot abans d'una línia de tissores"
 
-#: builtin/apply.c:4817
-msgid "instead of applying the patch, output a summary for the input"
-msgstr "en lloc d'aplicar el pedaç, emet un resum de l'entrada"
+#: builtin/am.c:2266 builtin/am.c:2269 builtin/am.c:2272 builtin/am.c:2275
+#: builtin/am.c:2278 builtin/am.c:2281 builtin/am.c:2284 builtin/am.c:2287
+#: builtin/am.c:2293
+msgid "pass it through git-apply"
+msgstr "passa-ho a través del git-apply"
+
+#: builtin/am.c:2283 builtin/fmt-merge-msg.c:662 builtin/fmt-merge-msg.c:665
+#: builtin/grep.c:707 builtin/merge.c:200 builtin/pull.c:135 builtin/pull.c:194
+#: builtin/repack.c:181 builtin/repack.c:185 builtin/show-branch.c:644
+#: builtin/show-ref.c:175 builtin/tag.c:340 parse-options.h:132
+#: parse-options.h:134 parse-options.h:245
+msgid "n"
+msgstr "n"
 
-#: builtin/apply.c:4819
-msgid "instead of applying the patch, see if the patch is applicable"
-msgstr "en lloc d'aplicar el pedaç, veges si el pedaç és aplicable"
+#: builtin/am.c:2289 builtin/for-each-ref.c:37 builtin/replace.c:438
+#: builtin/tag.c:372
+msgid "format"
+msgstr "format"
 
-#: builtin/apply.c:4821
-msgid "make sure the patch is applicable to the current index"
-msgstr "assegura que el pedaç sigui aplicable a l'índex actual"
+#: builtin/am.c:2290
+msgid "format the patch(es) are in"
+msgstr "el format en el qual estan els pedaços"
 
-#: builtin/apply.c:4823
-msgid "apply a patch without touching the working tree"
-msgstr "aplica un pedaç sense tocar l'arbre de treball"
+#: builtin/am.c:2296
+msgid "override error message when patch failure occurs"
+msgstr ""
+"passa per alt el missatge d'error quan s'ocorre una fallada en apedaçar"
 
-#: builtin/apply.c:4825
-msgid "accept a patch that touches outside the working area"
-msgstr "accepta un pedaç que toqui fora de l'àrea de treball"
+#: builtin/am.c:2298
+msgid "continue applying patches after resolving a conflict"
+msgstr "segueix aplicant pedaços després de resoldre un conflicte"
 
-#: builtin/apply.c:4827
-msgid "also apply the patch (use with --stat/--summary/--check)"
-msgstr "aplica el pedaç també (useu amb --stat/--summary/--check)"
+#: builtin/am.c:2301
+msgid "synonyms for --continue"
+msgstr "sinònims de --continue"
 
-#: builtin/apply.c:4829
-msgid "attempt three-way merge if a patch does not apply"
-msgstr "intenta una fusió de tres vies si el pedaç no s'aplica"
+#: builtin/am.c:2304
+msgid "skip the current patch"
+msgstr "salta el pedaç actual"
 
-#: builtin/apply.c:4831
-msgid "build a temporary index based on embedded index information"
-msgstr "construeix un índex temporal basat en la informació d'índex incrustada"
+#: builtin/am.c:2307
+msgid "restore the original branch and abort the patching operation."
+msgstr "restaura la branca original i avorta l'operació d'apedaçament."
 
-#: builtin/apply.c:4834 builtin/checkout-index.c:169 builtin/ls-files.c:426
-msgid "paths are separated with NUL character"
-msgstr "els camins se separen amb el caràcter NUL"
+#: builtin/am.c:2311
+msgid "lie about committer date"
+msgstr "menteix sobre la data del comitent"
 
-#: builtin/apply.c:4836
-msgid "ensure at least <n> lines of context match"
-msgstr "assegura't que almenys <n> línies de context coincideixin"
+#: builtin/am.c:2313
+msgid "use current timestamp for author date"
+msgstr "usa el marc de temps actual per la data d'autor"
 
-#: builtin/apply.c:4838
-msgid "detect new or modified lines that have whitespace errors"
-msgstr ""
-"detecta les línies noves o modificades que tinguin errors d'espai en blanc"
+#: builtin/am.c:2315 builtin/commit.c:1605 builtin/merge.c:229
+#: builtin/pull.c:165 builtin/revert.c:92 builtin/tag.c:355
+msgid "key-id"
+msgstr "ID de clau"
 
-#: builtin/apply.c:4841 builtin/apply.c:4844
-msgid "ignore changes in whitespace when finding context"
-msgstr "ignora els canvis d'espai en blanc en cercar context"
+#: builtin/am.c:2316
+msgid "GPG-sign commits"
+msgstr "signa les comissions amb GPG"
 
-#: builtin/apply.c:4847
-msgid "apply the patch in reverse"
-msgstr "aplica el pedaç al revés"
+#: builtin/am.c:2319
+msgid "(internal use for git-rebase)"
+msgstr "(ús intern per al git-rebase)"
 
-#: builtin/apply.c:4849
-msgid "don't expect at least one line of context"
-msgstr "no esperis almenys una línia de context"
+#: builtin/am.c:2334
+msgid ""
+"The -b/--binary option has been a no-op for long time, and\n"
+"it will be removed. Please do not use it anymore."
+msgstr ""
+"Fa molt que l'opció -b/--binary no ha fet res, i\n"
+"s'eliminarà. Si us plau, no l'useu més."
 
-#: builtin/apply.c:4851
-msgid "leave the rejected hunks in corresponding *.rej files"
-msgstr "deixa els trossos rebutjats en fitxers *.reg coresspondents"
+#: builtin/am.c:2341
+msgid "failed to read the index"
+msgstr "s'ha fallat en llegir l'índex"
 
-#: builtin/apply.c:4853
-msgid "allow overlapping hunks"
-msgstr "permet trossos encavalcants"
+#: builtin/am.c:2356
+#, c-format
+msgid "previous rebase directory %s still exists but mbox given."
+msgstr ""
+"un directori de rebasament anterior %s encara existeix però s'ha donat una "
+"bústia."
 
-#: builtin/apply.c:4856
-msgid "tolerate incorrectly detected missing new-line at the end of file"
-msgstr "tolera una línia nova incorrectament detectada al final del fitxer"
+#: builtin/am.c:2380
+#, c-format
+msgid ""
+"Stray %s directory found.\n"
+"Use \"git am --abort\" to remove it."
+msgstr ""
+"S'ha trobat un directori %s extraviat.\n"
+"Useu \"git am --abort\" per a eliminar-lo."
 
-#: builtin/apply.c:4859
-msgid "do not trust the line counts in the hunk headers"
-msgstr "no confiïs en els recomptes de línia en les capçaleres dels trossos"
+#: builtin/am.c:2386
+msgid "Resolve operation not in progress, we are not resuming."
+msgstr "Una operació de resolució no està en curs; no reprenem."
 
-#: builtin/apply.c:4862
-msgid "prepend <root> to all filenames"
-msgstr "anteposa <arrel> a tots els noms de fitxer"
+#: builtin/apply.c:8
+msgid "git apply [<options>] [<patch>...]"
+msgstr "git apply [<opcions>] [<pedaç>...]"
 
 #: builtin/archive.c:17
 #, c-format
@@ -4111,118 +4612,172 @@ msgstr "es documenten les <opcions-de-revisió> en git-rev-list(1)"
 msgid "Blaming lines"
 msgstr "S'estan culpant les línies"
 
-#: builtin/blame.c:2536
+#: builtin/blame.c:2577
 msgid "Show blame entries as we find them, incrementally"
 msgstr "Mostra les entrades de culpa mentre les trobem, incrementalment"
 
-#: builtin/blame.c:2537
+#: builtin/blame.c:2578
 msgid "Show blank SHA-1 for boundary commits (Default: off)"
 msgstr ""
 "Mostra un SHA-1 en blanc per les comissions de frontera (Per defecte: "
 "desactivat)"
 
-#: builtin/blame.c:2538
+#: builtin/blame.c:2579
 msgid "Do not treat root commits as boundaries (Default: off)"
 msgstr ""
 "No tractis les comissions d'arrel com a límits (Per defecte: desactivat)"
 
-#: builtin/blame.c:2539
+#: builtin/blame.c:2580
 msgid "Show work cost statistics"
 msgstr "Mostra les estadístiques de preu de treball"
 
-#: builtin/blame.c:2540
+#: builtin/blame.c:2581
 msgid "Force progress reporting"
 msgstr "Força l'informe de progrés"
 
-#: builtin/blame.c:2541
+#: builtin/blame.c:2582
 msgid "Show output score for blame entries"
 msgstr "Mostra la puntuació de sortida de les entrades de culpa"
 
-#: builtin/blame.c:2542
+#: builtin/blame.c:2583
 msgid "Show original filename (Default: auto)"
 msgstr "Mostra el nom de fitxer original (Per defecte: automàtic)"
 
-#: builtin/blame.c:2543
+#: builtin/blame.c:2584
 msgid "Show original linenumber (Default: off)"
 msgstr "Mostra el número de línia original (Per defecte: desactivat)"
 
-#: builtin/blame.c:2544
+#: builtin/blame.c:2585
 msgid "Show in a format designed for machine consumption"
 msgstr "Presenta en un format dissenyat per consumpció per màquina"
 
-#: builtin/blame.c:2545
+#: builtin/blame.c:2586
 msgid "Show porcelain format with per-line commit information"
 msgstr "Mostra el format de porcellana amb informació de comissió per línia"
 
-#: builtin/blame.c:2546
+#: builtin/blame.c:2587
 msgid "Use the same output mode as git-annotate (Default: off)"
 msgstr ""
 "Usa el mateix mode de sortida que git-annotate (Per defecte: desactivat)"
 
-#: builtin/blame.c:2547
+#: builtin/blame.c:2588
 msgid "Show raw timestamp (Default: off)"
 msgstr "Mostra la marca de temps crua (Per defecte: desactivat)"
 
-#: builtin/blame.c:2548
+#: builtin/blame.c:2589
 msgid "Show long commit SHA1 (Default: off)"
 msgstr "Mostra l'SHA1 de comissió llarg (Per defecte: desactivat)"
 
-#: builtin/blame.c:2549
+#: builtin/blame.c:2590
 msgid "Suppress author name and timestamp (Default: off)"
 msgstr "Omet el nom d'autor i la marca de temps (Per defecte: desactivat)"
 
-#: builtin/blame.c:2550
+#: builtin/blame.c:2591
 msgid "Show author email instead of name (Default: off)"
 msgstr ""
 "Mostra l'adreça de correu electrònic de l'autor en lloc del nom (Per "
 "defecte: desactivat)"
 
-#: builtin/blame.c:2551
+#: builtin/blame.c:2592
 msgid "Ignore whitespace differences"
 msgstr "Ignora les diferències d'espai en blanc"
 
-#: builtin/blame.c:2552
+#: builtin/blame.c:2599
+msgid "Use an experimental indent-based heuristic to improve diffs"
+msgstr ""
+"Usa un heurístic experimental basat en sagnat per a millorar les diferències"
+
+#: builtin/blame.c:2600
+msgid "Use an experimental blank-line-based heuristic to improve diffs"
+msgstr ""
+"Usa un heurístic experimental basat en línies en blanc per a millorar les "
+"diferències"
+
+#: builtin/blame.c:2602
 msgid "Spend extra cycles to find better match"
 msgstr "Gasta cicles extres per a trobar una coincidència millor"
 
-#: builtin/blame.c:2553
+#: builtin/blame.c:2603
 msgid "Use revisions from <file> instead of calling git-rev-list"
 msgstr "Usa les revisions de <fitxer> en lloc d'invocar git-rev-list"
 
-#: builtin/blame.c:2554
+#: builtin/blame.c:2604
 msgid "Use <file>'s contents as the final image"
 msgstr "Usa els continguts de <fitxer> com a la imatge final"
 
-#: builtin/blame.c:2555 builtin/blame.c:2556
+#: builtin/blame.c:2605 builtin/blame.c:2606
 msgid "score"
 msgstr "puntuació"
 
-#: builtin/blame.c:2555
+#: builtin/blame.c:2605
 msgid "Find line copies within and across files"
 msgstr "Troba còpies de línia dins i a través dels fitxers"
 
-#: builtin/blame.c:2556
+#: builtin/blame.c:2606
 msgid "Find line movements within and across files"
 msgstr "Troba moviments de línia dins i a través dels fitxers"
 
-#: builtin/blame.c:2557
+#: builtin/blame.c:2607
 msgid "n,m"
 msgstr "n,m"
 
-#: builtin/blame.c:2557
+#: builtin/blame.c:2607
 msgid "Process only line range n,m, counting from 1"
 msgstr "Processa només el rang de línies n,m, comptant des d'1"
 
+#: builtin/blame.c:2654
+msgid "--progress can't be used with --incremental or porcelain formats"
+msgstr ""
+"no es pot usar --progress amb els formats --incremental o de porcellana"
+
 #. TRANSLATORS: This string is used to tell us the maximum
 #. display width for a relative timestamp in "git blame"
 #. output.  For C locale, "4 years, 11 months ago", which
 #. takes 22 places, is the longest among various forms of
 #. relative timestamps, but your language may need more or
 #. fewer display columns.
-#: builtin/blame.c:2649
+#: builtin/blame.c:2700
 msgid "4 years, 11 months ago"
 msgstr "fa 4 anys i 11 mesos"
 
+#: builtin/blame.c:2780
+msgid "--contents and --reverse do not blend well."
+msgstr "--contents i --reverse no es jutgen bé."
+
+#: builtin/blame.c:2800
+msgid "cannot use --contents with final commit object name"
+msgstr "no es pot usar --contents amb el nom d'objecte de la comissió final"
+
+#: builtin/blame.c:2805
+msgid "--reverse and --first-parent together require specified latest commit"
+msgstr ""
+"--reverse i --first-parent-together requereixen una última comissió "
+"especificada"
+
+#: builtin/blame.c:2832
+msgid ""
+"--reverse --first-parent together require range along first-parent chain"
+msgstr ""
+"--reverse --first-parent junts requereixen un rang de la cadena de mares "
+"primeres"
+
+#: builtin/blame.c:2843
+#, c-format
+msgid "no such path %s in %s"
+msgstr "no hi ha tal camí %s en %s"
+
+#: builtin/blame.c:2854
+#, c-format
+msgid "cannot read blob %s for path %s"
+msgstr "no es pot llegir el blob %s per al camí %s"
+
+#: builtin/blame.c:2873
+#, c-format
+msgid "file %s has only %lu line"
+msgid_plural "file %s has only %lu lines"
+msgstr[0] "el fitxer %s té només %lu línia"
+msgstr[1] "el fitxer %s té només %lu línies"
+
 #: builtin/branch.c:26
 msgid "git branch [<options>] [-r | -a] [--merged | --no-merged]"
 msgstr "git branch [<opcions>] [-r | -a] [--merged | --no-merged]"
@@ -4474,6 +5029,10 @@ msgstr "font"
 msgid "change the upstream info"
 msgstr "canvia la informació de font"
 
+#: builtin/branch.c:660
+msgid "Unset the upstream info"
+msgstr "Desestableix la informació de font"
+
 #: builtin/branch.c:661
 msgid "use colored output"
 msgstr "usa sortida colorada"
@@ -4546,8 +5105,8 @@ msgstr "clau"
 msgid "field name to sort on"
 msgstr "nom del camp en el qual ordenar"
 
-#: builtin/branch.c:686 builtin/for-each-ref.c:41 builtin/notes.c:402
-#: builtin/notes.c:405 builtin/notes.c:565 builtin/notes.c:568
+#: builtin/branch.c:686 builtin/for-each-ref.c:41 builtin/notes.c:404
+#: builtin/notes.c:407 builtin/notes.c:567 builtin/notes.c:570
 #: builtin/tag.c:369
 msgid "object"
 msgstr "objecte"
@@ -4560,7 +5119,7 @@ msgstr "imprimeix només les branques de l'objecte"
 msgid "Failed to resolve HEAD as a valid ref."
 msgstr "S'ha fallat en resoldre HEAD com a referència vàlida."
 
-#: builtin/branch.c:709 builtin/clone.c:707
+#: builtin/branch.c:709 builtin/clone.c:706
 msgid "HEAD not found below refs/heads!"
 msgstr "HEAD no trobat sota refs/heads!"
 
@@ -4671,65 +5230,82 @@ msgstr "Cal un dipòsit per a fer un farcell."
 msgid "Need a repository to unbundle."
 msgstr "Cal un dipòsit per a desfer un farcell."
 
-#: builtin/cat-file.c:443
+#: builtin/cat-file.c:513
 msgid ""
-"git cat-file (-t [--allow-unknown-type]|-s [--allow-unknown-type]|-e|-p|"
-"<type>|--textconv) <object>"
+"git cat-file (-t [--allow-unknown-type] | -s [--allow-unknown-type] | -e | -"
+"p | <type> | --textconv | --filters) [--path=<path>] <object>"
 msgstr ""
-"git cat-file (-t [--allow-unknown-type]|-s [--allow-unknown-type]|-e|-p|"
-"<tipus>|--textconv) <objecte>"
+"git cat-file (-t [--allow-unknown-type] | -s [--allow-unknown-type] | -e | -"
+"p | <tipus> | --textconv | --filters [--path=<camí>]) <objecte>"
 
-#: builtin/cat-file.c:444
-msgid "git cat-file (--batch | --batch-check) [--follow-symlinks]"
-msgstr "git cat-file (--batch | --batch-check) [--follow-symlinks]"
+#: builtin/cat-file.c:514
+msgid ""
+"git cat-file (--batch | --batch-check) [--follow-symlinks] [--textconv | --"
+"filters]"
+msgstr ""
+"git cat-file (--batch | --batch-check) [--follow-symlinks] [--textconv | --"
+"filters]"
 
-#: builtin/cat-file.c:481
+#: builtin/cat-file.c:551
 msgid "<type> can be one of: blob, tree, commit, tag"
 msgstr "<tipus> pot ser un de: blob, tree, commit, tag"
 
-#: builtin/cat-file.c:482
+#: builtin/cat-file.c:552
 msgid "show object type"
 msgstr "mostra el tipus de l'objecte"
 
-#: builtin/cat-file.c:483
+#: builtin/cat-file.c:553
 msgid "show object size"
 msgstr "mostra la mida de l'objecte"
 
-#: builtin/cat-file.c:485
+#: builtin/cat-file.c:555
 msgid "exit with zero when there's no error"
 msgstr "surt amb zero quan no hi ha error"
 
-#: builtin/cat-file.c:486
+#: builtin/cat-file.c:556
 msgid "pretty-print object's content"
 msgstr "imprimeix bellament el contingut de l'objecte"
 
-#: builtin/cat-file.c:488
+#: builtin/cat-file.c:558
 msgid "for blob objects, run textconv on object's content"
 msgstr "en els objectes de blob, executa textconv en el contingut de l'objecte"
 
-#: builtin/cat-file.c:490
+#: builtin/cat-file.c:560
+msgid "for blob objects, run filters on object's content"
+msgstr ""
+"en els objectes de blob, executa els filtres en el contingut de l'objecte"
+
+#: builtin/cat-file.c:561 git-submodule.sh:923
+msgid "blob"
+msgstr "blob"
+
+#: builtin/cat-file.c:562
+msgid "use a specific path for --textconv/--filters"
+msgstr "usa un camí especìfic per a --textconv/--filters"
+
+#: builtin/cat-file.c:564
 msgid "allow -s and -t to work with broken/corrupt objects"
 msgstr "permet que -s i -t funcionin amb objectes trencats/malmesos"
 
-#: builtin/cat-file.c:491
+#: builtin/cat-file.c:565
 msgid "buffer --batch output"
 msgstr "posa la sortida de --batch en memòria intermèdia"
 
-#: builtin/cat-file.c:493
+#: builtin/cat-file.c:567
 msgid "show info and content of objects fed from the standard input"
 msgstr ""
 "mostra la informació i contingut dels objectes rebuts de l'entrada estàndard"
 
-#: builtin/cat-file.c:496
+#: builtin/cat-file.c:570
 msgid "show info about objects fed from the standard input"
 msgstr "mostra informació sobre els objectes rebuts de l'entrada estàndard"
 
-#: builtin/cat-file.c:499
+#: builtin/cat-file.c:573
 msgid "follow in-tree symlinks (used with --batch or --batch-check)"
 msgstr ""
 "segueix els enllaços simbòlics en l'arbre (s'usa amb --batch o --batch-check)"
 
-#: builtin/cat-file.c:501
+#: builtin/cat-file.c:575
 msgid "show all objects with --batch or --batch-check"
 msgstr "mostra tots els objectes amb --batch o --batch-check"
 
@@ -4749,7 +5325,7 @@ msgstr "informa de tots els atributs establerts en el fitxer"
 msgid "use .gitattributes only from the index"
 msgstr "usa .gitattributes només des de l'índex"
 
-#: builtin/check-attr.c:21 builtin/check-ignore.c:22 builtin/hash-object.c:97
+#: builtin/check-attr.c:21 builtin/check-ignore.c:22 builtin/hash-object.c:98
 msgid "read file names from stdin"
 msgstr "llegeix els noms de fitxer d'stdin"
 
@@ -4757,7 +5333,7 @@ msgstr "llegeix els noms de fitxer d'stdin"
 msgid "terminate input and output records by a NUL character"
 msgstr "acaba els registres d'entrada i de sortida amb un caràcter NUL"
 
-#: builtin/check-ignore.c:18 builtin/checkout.c:1138 builtin/gc.c:325
+#: builtin/check-ignore.c:18 builtin/checkout.c:1137 builtin/gc.c:325
 msgid "suppress progress reporting"
 msgstr "omet el reportatge de progrés"
 
@@ -4847,9 +5423,9 @@ msgid "write the content to temporary files"
 msgstr "escriu el contingut a fitxers temporals"
 
 #: builtin/checkout-index.c:174 builtin/column.c:30
-#: builtin/submodule--helper.c:488 builtin/submodule--helper.c:491
-#: builtin/submodule--helper.c:494 builtin/submodule--helper.c:497
-#: builtin/submodule--helper.c:830 builtin/worktree.c:469
+#: builtin/submodule--helper.c:595 builtin/submodule--helper.c:598
+#: builtin/submodule--helper.c:604 builtin/submodule--helper.c:951
+#: builtin/worktree.c:469
 msgid "string"
 msgstr "cadena"
 
@@ -4897,7 +5473,7 @@ msgstr "camí '%s': no es pot fusionar"
 #: builtin/checkout.c:230
 #, c-format
 msgid "Unable to add merge result for '%s'"
-msgstr "no s'ha pogut afegir el resultat de fusió per a '%s'"
+msgstr "No s'ha pogut afegir el resultat de fusió per a '%s'"
 
 #: builtin/checkout.c:250 builtin/checkout.c:253 builtin/checkout.c:256
 #: builtin/checkout.c:259
@@ -4921,54 +5497,54 @@ msgstr ""
 msgid "path '%s' is unmerged"
 msgstr "el camí '%s' està sense fusionar"
 
-#: builtin/checkout.c:495
+#: builtin/checkout.c:494
 msgid "you need to resolve your current index first"
 msgstr "heu de primer resoldre el vostre índex actual"
 
-#: builtin/checkout.c:625
+#: builtin/checkout.c:624
 #, c-format
 msgid "Can not do reflog for '%s': %s\n"
 msgstr "No es pot fer reflog per a '%s': %s\n"
 
-#: builtin/checkout.c:664
+#: builtin/checkout.c:663
 msgid "HEAD is now at"
 msgstr "HEAD ara és a"
 
-#: builtin/checkout.c:668 builtin/clone.c:661
+#: builtin/checkout.c:667 builtin/clone.c:660
 msgid "unable to update HEAD"
 msgstr "no s'ha pogut actualitzar HEAD"
 
-#: builtin/checkout.c:672
+#: builtin/checkout.c:671
 #, c-format
 msgid "Reset branch '%s'\n"
 msgstr "Restableix la branca '%s'\n"
 
-#: builtin/checkout.c:675
+#: builtin/checkout.c:674
 #, c-format
 msgid "Already on '%s'\n"
 msgstr "Ja en '%s'\n"
 
-#: builtin/checkout.c:679
+#: builtin/checkout.c:678
 #, c-format
 msgid "Switched to and reset branch '%s'\n"
 msgstr "S'ha agafat i restablert la branca '%s'\n"
 
-#: builtin/checkout.c:681 builtin/checkout.c:1070
+#: builtin/checkout.c:680 builtin/checkout.c:1069
 #, c-format
 msgid "Switched to a new branch '%s'\n"
 msgstr "S'ha agafat la branca nova '%s'\n"
 
-#: builtin/checkout.c:683
+#: builtin/checkout.c:682
 #, c-format
 msgid "Switched to branch '%s'\n"
 msgstr "S'ha agafat la branca '%s'\n"
 
-#: builtin/checkout.c:734
+#: builtin/checkout.c:733
 #, c-format
 msgid " ... and %d more.\n"
 msgstr " ... i %d més.\n"
 
-#: builtin/checkout.c:740
+#: builtin/checkout.c:739
 #, c-format
 msgid ""
 "Warning: you are leaving %d commit behind, not connected to\n"
@@ -4991,7 +5567,7 @@ msgstr[1] ""
 "\n"
 "%s\n"
 
-#: builtin/checkout.c:759
+#: builtin/checkout.c:758
 #, c-format
 msgid ""
 "If you want to keep it by creating a new branch, this may be a good time\n"
@@ -5018,150 +5594,150 @@ msgstr[1] ""
 " git branch <nom-de-branca-nova> %s\n"
 "\n"
 
-#: builtin/checkout.c:795
+#: builtin/checkout.c:794
 msgid "internal error in revision walk"
 msgstr "error intern en el passeig per revisions"
 
-#: builtin/checkout.c:799
+#: builtin/checkout.c:798
 msgid "Previous HEAD position was"
 msgstr "La posició de HEAD anterior era"
 
-#: builtin/checkout.c:826 builtin/checkout.c:1065
+#: builtin/checkout.c:825 builtin/checkout.c:1064
 msgid "You are on a branch yet to be born"
 msgstr "Sou en una branca que encara ha de nàixer"
 
-#: builtin/checkout.c:971
+#: builtin/checkout.c:970
 #, c-format
 msgid "only one reference expected, %d given."
 msgstr "s'esperava només una referència, s'han donat %d."
 
-#: builtin/checkout.c:1011 builtin/worktree.c:214
+#: builtin/checkout.c:1010 builtin/worktree.c:214
 #, c-format
 msgid "invalid reference: %s"
 msgstr "referència no vàlida: %s"
 
-#: builtin/checkout.c:1040
+#: builtin/checkout.c:1039
 #, c-format
 msgid "reference is not a tree: %s"
 msgstr "la referència no és un arbre: %s"
 
-#: builtin/checkout.c:1079
+#: builtin/checkout.c:1078
 msgid "paths cannot be used with switching branches"
 msgstr "els camins no es poden usar amb canvi de branca"
 
-#: builtin/checkout.c:1082 builtin/checkout.c:1086
+#: builtin/checkout.c:1081 builtin/checkout.c:1085
 #, c-format
 msgid "'%s' cannot be used with switching branches"
 msgstr "'%s' no es pot usar amb canvi de branca"
 
-#: builtin/checkout.c:1090 builtin/checkout.c:1093 builtin/checkout.c:1098
-#: builtin/checkout.c:1101
+#: builtin/checkout.c:1089 builtin/checkout.c:1092 builtin/checkout.c:1097
+#: builtin/checkout.c:1100
 #, c-format
 msgid "'%s' cannot be used with '%s'"
 msgstr "'%s' no es pot usar amb '%s'"
 
-#: builtin/checkout.c:1106
+#: builtin/checkout.c:1105
 #, c-format
 msgid "Cannot switch branch to a non-commit '%s'"
 msgstr "No es pot canviar la branca a la no comissió '%s'"
 
-#: builtin/checkout.c:1139 builtin/checkout.c:1141 builtin/clone.c:88
+#: builtin/checkout.c:1138 builtin/checkout.c:1140 builtin/clone.c:93
 #: builtin/remote.c:165 builtin/remote.c:167 builtin/worktree.c:324
 #: builtin/worktree.c:326
 msgid "branch"
 msgstr "branca"
 
-#: builtin/checkout.c:1140
+#: builtin/checkout.c:1139
 msgid "create and checkout a new branch"
 msgstr "crea i agafa una branca nova"
 
-#: builtin/checkout.c:1142
+#: builtin/checkout.c:1141
 msgid "create/reset and checkout a branch"
 msgstr "crea/restableix i agafa una branca"
 
-#: builtin/checkout.c:1143
+#: builtin/checkout.c:1142
 msgid "create reflog for new branch"
 msgstr "crea un registre de referència per a la branca nova"
 
-#: builtin/checkout.c:1144 builtin/worktree.c:328
+#: builtin/checkout.c:1143 builtin/worktree.c:328
 msgid "detach HEAD at named commit"
 msgstr "separa HEAD a la comissió anomenada"
 
-#: builtin/checkout.c:1145
+#: builtin/checkout.c:1144
 msgid "set upstream info for new branch"
 msgstr "estableix la informació de font de la branca nova"
 
-#: builtin/checkout.c:1147
+#: builtin/checkout.c:1146
 msgid "new-branch"
 msgstr "branca-nova"
 
-#: builtin/checkout.c:1147
+#: builtin/checkout.c:1146
 msgid "new unparented branch"
 msgstr "branca òrfena nova"
 
-#: builtin/checkout.c:1148
+#: builtin/checkout.c:1147
 msgid "checkout our version for unmerged files"
 msgstr "agafa la versió nostra dels fitxers sense fusionar"
 
-#: builtin/checkout.c:1150
+#: builtin/checkout.c:1149
 msgid "checkout their version for unmerged files"
 msgstr "agafa la versió seva dels fitxers sense fusionar"
 
-#: builtin/checkout.c:1152
+#: builtin/checkout.c:1151
 msgid "force checkout (throw away local modifications)"
 msgstr "agafa a la força (descarta qualsevulla modificació local)"
 
-#: builtin/checkout.c:1153
+#: builtin/checkout.c:1152
 msgid "perform a 3-way merge with the new branch"
 msgstr "realitza una fusió de 3 vies amb la branca nova"
 
-#: builtin/checkout.c:1154 builtin/merge.c:231
+#: builtin/checkout.c:1153 builtin/merge.c:231
 msgid "update ignored files (default)"
 msgstr "actualitza els fitxers ignorats (per defecte)"
 
-#: builtin/checkout.c:1155 builtin/log.c:1459 parse-options.h:250
+#: builtin/checkout.c:1154 builtin/log.c:1466 parse-options.h:251
 msgid "style"
 msgstr "estil"
 
-#: builtin/checkout.c:1156
+#: builtin/checkout.c:1155
 msgid "conflict style (merge or diff3)"
 msgstr "estil de conflicte (fusió o diff3)"
 
-#: builtin/checkout.c:1159
+#: builtin/checkout.c:1158
 msgid "do not limit pathspecs to sparse entries only"
 msgstr "no limitis les especificacions de camí només a entrades disperses"
 
-#: builtin/checkout.c:1161
+#: builtin/checkout.c:1160
 msgid "second guess 'git checkout <no-such-branch>'"
 msgstr "dubta 'git checkout <cap-branca-així>'"
 
-#: builtin/checkout.c:1163
+#: builtin/checkout.c:1162
 msgid "do not check if another worktree is holding the given ref"
 msgstr "no comprovis si altre arbre de treball té la referència donada"
 
-#: builtin/checkout.c:1164 builtin/clone.c:60 builtin/fetch.c:117
-#: builtin/merge.c:228 builtin/pull.c:116 builtin/push.c:536
+#: builtin/checkout.c:1163 builtin/clone.c:63 builtin/fetch.c:119
+#: builtin/merge.c:228 builtin/pull.c:117 builtin/push.c:536
 #: builtin/send-pack.c:168
 msgid "force progress reporting"
 msgstr "força l'informe de progrés"
 
-#: builtin/checkout.c:1195
+#: builtin/checkout.c:1194
 msgid "-b, -B and --orphan are mutually exclusive"
 msgstr "-b, -B i --orphan són mutualment exclusius"
 
-#: builtin/checkout.c:1212
+#: builtin/checkout.c:1211
 msgid "--track needs a branch name"
 msgstr "--track necessita un nom de branca"
 
-#: builtin/checkout.c:1217
+#: builtin/checkout.c:1216
 msgid "Missing branch name; try -b"
 msgstr "Manca el nom de branca; proveu -b"
 
-#: builtin/checkout.c:1253
+#: builtin/checkout.c:1252
 msgid "invalid path specification"
 msgstr "especificació de camí no vàlida"
 
-#: builtin/checkout.c:1260
+#: builtin/checkout.c:1259
 #, c-format
 msgid ""
 "Cannot update paths and switch to branch '%s' at the same time.\n"
@@ -5170,12 +5746,12 @@ msgstr ""
 "No es poden actualitzar els camins i canviar a la branca '%s' a la vegada.\n"
 "Volíeu agafar '%s', la qual no es pot resoldre com a comissió?"
 
-#: builtin/checkout.c:1265
+#: builtin/checkout.c:1264
 #, c-format
 msgid "git checkout: --detach does not take a path argument '%s'"
 msgstr "git checkout: --detach no accepta un paràmetre de camí '%s'"
 
-#: builtin/checkout.c:1269
+#: builtin/checkout.c:1268
 msgid ""
 "git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
 "checking out of the index."
@@ -5327,8 +5903,8 @@ msgstr "neteja interactiva"
 msgid "remove whole directories"
 msgstr "elimina directoris sencers"
 
-#: builtin/clean.c:875 builtin/describe.c:407 builtin/grep.c:724
-#: builtin/ls-files.c:457 builtin/name-rev.c:314 builtin/show-ref.c:182
+#: builtin/clean.c:875 builtin/describe.c:407 builtin/grep.c:725
+#: builtin/ls-files.c:536 builtin/name-rev.c:313 builtin/show-ref.c:182
 msgid "pattern"
 msgstr "patró"
 
@@ -5368,112 +5944,129 @@ msgstr ""
 msgid "git clone [<options>] [--] <repo> [<dir>]"
 msgstr "git clone [<opcions>] [--] <dipòsit> [<directori>]"
 
-#: builtin/clone.c:62
+#: builtin/clone.c:65
 msgid "don't create a checkout"
 msgstr "no facis cap agafament"
 
-#: builtin/clone.c:63 builtin/clone.c:65 builtin/init-db.c:476
+#: builtin/clone.c:66 builtin/clone.c:68 builtin/init-db.c:478
 msgid "create a bare repository"
 msgstr "crea un dipòsit nu"
 
-#: builtin/clone.c:67
+#: builtin/clone.c:70
 msgid "create a mirror repository (implies bare)"
 msgstr "crea un dipòsit reflectit (implica bare)"
 
-#: builtin/clone.c:69
+#: builtin/clone.c:72
 msgid "to clone from a local repository"
 msgstr "per a clonar des d'un dipòsit local"
 
-#: builtin/clone.c:71
+#: builtin/clone.c:74
 msgid "don't use local hardlinks, always copy"
 msgstr "no usis enllaços durs locals, sempre copia"
 
-#: builtin/clone.c:73
+#: builtin/clone.c:76
 msgid "setup as shared repository"
 msgstr "configura com a dipòsit compartit"
 
-#: builtin/clone.c:75 builtin/clone.c:77
+#: builtin/clone.c:78 builtin/clone.c:80
 msgid "initialize submodules in the clone"
 msgstr "inicialitza els submòduls en el clon"
 
-#: builtin/clone.c:79
+#: builtin/clone.c:82
 msgid "number of submodules cloned in parallel"
 msgstr "nombre de submòduls clonats en paral·lel"
 
-#: builtin/clone.c:80 builtin/init-db.c:473
+#: builtin/clone.c:83 builtin/init-db.c:475
 msgid "template-directory"
 msgstr "directori-de-plantilla"
 
-#: builtin/clone.c:81 builtin/init-db.c:474
+#: builtin/clone.c:84 builtin/init-db.c:476
 msgid "directory from which templates will be used"
 msgstr "directori del qual les plantilles s'usaran"
 
-#: builtin/clone.c:83 builtin/submodule--helper.c:495
-#: builtin/submodule--helper.c:833
+#: builtin/clone.c:86 builtin/clone.c:88 builtin/submodule--helper.c:602
+#: builtin/submodule--helper.c:954
 msgid "reference repository"
 msgstr "dipòsit de referència"
 
-#: builtin/clone.c:85
+#: builtin/clone.c:90
 msgid "use --reference only while cloning"
 msgstr "usa --reference només en clonar"
 
-#: builtin/clone.c:86 builtin/column.c:26 builtin/merge-file.c:44
+#: builtin/clone.c:91 builtin/column.c:26 builtin/merge-file.c:44
 msgid "name"
 msgstr "nom"
 
-#: builtin/clone.c:87
+#: builtin/clone.c:92
 msgid "use <name> instead of 'origin' to track upstream"
 msgstr "usa <nom> en lloc de 'origin' per a seguir la font"
 
-#: builtin/clone.c:89
+#: builtin/clone.c:94
 msgid "checkout <branch> instead of the remote's HEAD"
 msgstr "agafa <branca> en lloc del HEAD del remot"
 
-#: builtin/clone.c:91
+#: builtin/clone.c:96
 msgid "path to git-upload-pack on the remote"
 msgstr "camí a git-upload-pack en el remot"
 
-#: builtin/clone.c:92 builtin/fetch.c:118 builtin/grep.c:667 builtin/pull.c:201
+#: builtin/clone.c:97 builtin/fetch.c:120 builtin/grep.c:668 builtin/pull.c:202
 msgid "depth"
 msgstr "profunditat"
 
-#: builtin/clone.c:93
+#: builtin/clone.c:98
 msgid "create a shallow clone of that depth"
 msgstr "crea un clon superficial de tal profunditat"
 
-#: builtin/clone.c:95
+#: builtin/clone.c:99 builtin/fetch.c:122 builtin/pack-objects.c:2848
+#: parse-options.h:142
+msgid "time"
+msgstr "hora"
+
+#: builtin/clone.c:100
+msgid "create a shallow clone since a specific time"
+msgstr "crea un clon superficial des d'una hora específica"
+
+#: builtin/clone.c:101 builtin/fetch.c:124
+msgid "revision"
+msgstr "revisió"
+
+#: builtin/clone.c:102 builtin/fetch.c:125
+msgid "deepen history of shallow clone by excluding rev"
+msgstr "aprofundeix la història d'un clon superficial excloent una revisió"
+
+#: builtin/clone.c:104
 msgid "clone only one branch, HEAD or --branch"
 msgstr "clona només una branca, HEAD o --branch"
 
-#: builtin/clone.c:97
+#: builtin/clone.c:106
 msgid "any cloned submodules will be shallow"
 msgstr "qualsevol submòdul clonat serà superficial"
 
-#: builtin/clone.c:98 builtin/init-db.c:482
+#: builtin/clone.c:107 builtin/init-db.c:484
 msgid "gitdir"
 msgstr "directori de git"
 
-#: builtin/clone.c:99 builtin/init-db.c:483
+#: builtin/clone.c:108 builtin/init-db.c:485
 msgid "separate git dir from working tree"
 msgstr "separa el directori de git de l'arbre de treball"
 
-#: builtin/clone.c:100
+#: builtin/clone.c:109
 msgid "key=value"
 msgstr "clau=valor"
 
-#: builtin/clone.c:101
+#: builtin/clone.c:110
 msgid "set config inside the new repository"
 msgstr "estableix la configuració dins del dipòsit nou"
 
-#: builtin/clone.c:102 builtin/fetch.c:132 builtin/push.c:547
+#: builtin/clone.c:111 builtin/fetch.c:140 builtin/push.c:547
 msgid "use IPv4 addresses only"
 msgstr "usa només les adreces IPv4"
 
-#: builtin/clone.c:104 builtin/fetch.c:134 builtin/push.c:549
+#: builtin/clone.c:113 builtin/fetch.c:142 builtin/push.c:549
 msgid "use IPv6 addresses only"
 msgstr "usa només les adreces IPv6"
 
-#: builtin/clone.c:241
+#: builtin/clone.c:250
 msgid ""
 "No directory name could be guessed.\n"
 "Please specify a directory on the command line"
@@ -5481,58 +6074,42 @@ msgstr ""
 "No s'ha pogut endevinar cap nom de directori.\n"
 "Si us plau, especifiqueu un directori en la línia d'ordres"
 
-#: builtin/clone.c:307
-#, c-format
-msgid "reference repository '%s' as a linked checkout is not supported yet."
-msgstr ""
-"Encara no se suporta el dipòsit de referència '%s' com a agafament enllaçat."
-
-#: builtin/clone.c:309
-#, c-format
-msgid "reference repository '%s' is not a local repository."
-msgstr "el dipòsit de referència '%s' no és un dipòsit local."
-
-#: builtin/clone.c:314
-#, c-format
-msgid "reference repository '%s' is shallow"
-msgstr "el dipòsit de referència '%s' és superficial"
-
-#: builtin/clone.c:317
+#: builtin/clone.c:303
 #, c-format
-msgid "reference repository '%s' is grafted"
-msgstr "el dipòsit de referència '%s' és empeltat"
+msgid "info: Could not add alternate for '%s': %s\n"
+msgstr "info: No s'ha pogut afegir un alternatiu per a '%s': %s\n"
 
-#: builtin/clone.c:376
+#: builtin/clone.c:375
 #, c-format
 msgid "failed to open '%s'"
 msgstr "s'ha fallat en obrir '%s'"
 
-#: builtin/clone.c:384
+#: builtin/clone.c:383
 #, c-format
 msgid "%s exists and is not a directory"
 msgstr "%s existeix i no és directori"
 
-#: builtin/clone.c:398
+#: builtin/clone.c:397
 #, c-format
 msgid "failed to stat %s\n"
 msgstr "s'ha fallat en fer stat a '%s'\n"
 
-#: builtin/clone.c:420
+#: builtin/clone.c:419
 #, c-format
 msgid "failed to create link '%s'"
 msgstr "s'ha fallat en crear l'enllaç '%s'"
 
-#: builtin/clone.c:424
+#: builtin/clone.c:423
 #, c-format
 msgid "failed to copy file to '%s'"
 msgstr "s'ha fallat en copiar el fitxer a '%s'"
 
-#: builtin/clone.c:449
+#: builtin/clone.c:448
 #, c-format
 msgid "done.\n"
 msgstr "fet.\n"
 
-#: builtin/clone.c:461
+#: builtin/clone.c:460
 msgid ""
 "Clone succeeded, but checkout failed.\n"
 "You can inspect what was checked out with 'git status'\n"
@@ -5543,123 +6120,141 @@ msgstr ""
 "'git status' i tornar a intentar l'agafament amb\n"
 "'git checkout -f HEAD'\n"
 
-#: builtin/clone.c:538
+#: builtin/clone.c:537
 #, c-format
 msgid "Could not find remote branch %s to clone."
 msgstr "No s'ha pogut trobar la branca remota %s per a clonar."
 
-#: builtin/clone.c:633
+#: builtin/clone.c:632
 msgid "remote did not send all necessary objects"
 msgstr "el remot no ha enviat tots els objectes necessaris"
 
-#: builtin/clone.c:649
+#: builtin/clone.c:648
 #, c-format
 msgid "unable to update %s"
 msgstr "no s'ha pogut actualitzar %s"
 
-#: builtin/clone.c:698
+#: builtin/clone.c:697
 msgid "remote HEAD refers to nonexistent ref, unable to checkout.\n"
 msgstr ""
 "el HEAD remot es refereix a una referència que no existeix; no s'ha pogut "
 "agafar.\n"
 
-#: builtin/clone.c:729
+#: builtin/clone.c:728
 msgid "unable to checkout working tree"
 msgstr "no s'ha pogut agafar l'arbre de treball"
 
-#: builtin/clone.c:766
+#: builtin/clone.c:768
 msgid "unable to write parameters to config file"
 msgstr "no s'ha pogut escriure els paràmetres al fitxer de configuració"
 
-#: builtin/clone.c:829
+#: builtin/clone.c:831
 msgid "cannot repack to clean up"
 msgstr "no es pot reempaquetar per a netejar"
 
-#: builtin/clone.c:831
+#: builtin/clone.c:833
 msgid "cannot unlink temporary alternates file"
 msgstr "no es pot desenllaçar el fitxer d'alternatives temporal"
 
-#: builtin/clone.c:863 builtin/receive-pack.c:1855
+#: builtin/clone.c:866 builtin/receive-pack.c:1895
 msgid "Too many arguments."
 msgstr "Hi ha massa paràmetres."
 
-#: builtin/clone.c:867
+#: builtin/clone.c:870
 msgid "You must specify a repository to clone."
 msgstr "Heu d'especificar un dipòsit per a clonar."
 
-#: builtin/clone.c:878
+#: builtin/clone.c:883
 #, c-format
 msgid "--bare and --origin %s options are incompatible."
 msgstr "les opcions --bare i --origin %s són incompatibles."
 
-#: builtin/clone.c:881
+#: builtin/clone.c:886
 msgid "--bare and --separate-git-dir are incompatible."
 msgstr "--bare i --separate-git-dir són incompatibles."
 
-#: builtin/clone.c:894
+#: builtin/clone.c:899
 #, c-format
 msgid "repository '%s' does not exist"
 msgstr "el dipòsit '%s' no existeix"
 
-#: builtin/clone.c:900 builtin/fetch.c:1293
+#: builtin/clone.c:905 builtin/fetch.c:1338
 #, c-format
 msgid "depth %s is not a positive number"
 msgstr "la profunditat %s no és nombre positiu"
 
-#: builtin/clone.c:910
+#: builtin/clone.c:915
 #, c-format
 msgid "destination path '%s' already exists and is not an empty directory."
 msgstr "el camí destí '%s' ja existeix i no és un directori buit."
 
-#: builtin/clone.c:920
+#: builtin/clone.c:925
 #, c-format
 msgid "working tree '%s' already exists."
 msgstr "l'arbre de treball '%s' ja existeix."
 
-#: builtin/clone.c:935 builtin/clone.c:946 builtin/submodule--helper.c:544
+#: builtin/clone.c:940 builtin/clone.c:951 builtin/submodule--helper.c:657
 #: builtin/worktree.c:222 builtin/worktree.c:249
 #, c-format
 msgid "could not create leading directories of '%s'"
 msgstr "no s'ha pogut crear els directoris inicials de '%s'"
 
-#: builtin/clone.c:938
+#: builtin/clone.c:943
 #, c-format
 msgid "could not create work tree dir '%s'"
 msgstr "no s'ha pogut crear el directori d'arbre de treball '%s'"
 
-#: builtin/clone.c:956
+#: builtin/clone.c:955
 #, c-format
 msgid "Cloning into bare repository '%s'...\n"
 msgstr "S'està clonant al dipòsit nu '%s'...\n"
 
-#: builtin/clone.c:958
+#: builtin/clone.c:957
 #, c-format
 msgid "Cloning into '%s'...\n"
 msgstr "S'està clonant a '%s'...\n"
 
-#: builtin/clone.c:997
+#: builtin/clone.c:963
+msgid ""
+"clone --recursive is not compatible with both --reference and --reference-if-"
+"able"
+msgstr ""
+"clone --recursive no és compatible amb ambdòs --reference i --reference-if-"
+"able"
+
+#: builtin/clone.c:1019
 msgid "--depth is ignored in local clones; use file:// instead."
 msgstr "--depth s'ignora en els clons locals; useu file:// en lloc d'això."
 
-#: builtin/clone.c:1000
+#: builtin/clone.c:1021
+msgid "--shallow-since is ignored in local clones; use file:// instead."
+msgstr ""
+"--shallow-since s'ignora en els clons locals; useu file:// en lloc d'això."
+
+#: builtin/clone.c:1023
+msgid "--shallow-exclude is ignored in local clones; use file:// instead."
+msgstr ""
+"--shallow-exclude s'ignora en els clons locals; useu file:// en lloc d'això."
+
+#: builtin/clone.c:1026
 msgid "source repository is shallow, ignoring --local"
 msgstr "el dipòsit font és superficial, s'està ignorant --local"
 
-#: builtin/clone.c:1005
+#: builtin/clone.c:1031
 msgid "--local is ignored"
 msgstr "--local s'ignora"
 
-#: builtin/clone.c:1009
+#: builtin/clone.c:1035
 #, c-format
 msgid "Don't know how to clone %s"
 msgstr "No se sap com clonar %s"
 
-#: builtin/clone.c:1058 builtin/clone.c:1066
+#: builtin/clone.c:1090 builtin/clone.c:1098
 #, c-format
 msgid "Remote branch %s not found in upstream %s"
 msgstr "La branca remota %s no es troba en la font %s"
 
-#: builtin/clone.c:1069
+#: builtin/clone.c:1101
 msgid "You appear to have cloned an empty repository."
 msgstr "Sembla que heu clonat un dipòsit buit."
 
@@ -5801,66 +6396,66 @@ msgstr ""
 "Llavors \"git cherry-pick --continue\" reprendrà recollint\n"
 "com a cireres les comissions restants.\n"
 
-#: builtin/commit.c:308
+#: builtin/commit.c:318
 msgid "failed to unpack HEAD tree object"
 msgstr "s'ha fallat en desempaquetar l'objecte d'arbre HEAD"
 
-#: builtin/commit.c:349
+#: builtin/commit.c:359
 msgid "unable to create temporary index"
 msgstr "no s'ha pogut crear un índex temporal"
 
-#: builtin/commit.c:355
+#: builtin/commit.c:365
 msgid "interactive add failed"
 msgstr "l'afegiment interactiu ha fallat"
 
-#: builtin/commit.c:368
+#: builtin/commit.c:378
 msgid "unable to update temporary index"
 msgstr "no s'ha pogut actualitzar l'índex temporal"
 
-#: builtin/commit.c:370
+#: builtin/commit.c:380
 msgid "Failed to update main cache tree"
 msgstr "S'ha fallat en actualitzar l'arbre principal de memòria cau"
 
-#: builtin/commit.c:394 builtin/commit.c:417 builtin/commit.c:466
+#: builtin/commit.c:404 builtin/commit.c:427 builtin/commit.c:476
 msgid "unable to write new_index file"
 msgstr "no s'ha pogut escriure el fitxer new_index"
 
-#: builtin/commit.c:448
+#: builtin/commit.c:458
 msgid "cannot do a partial commit during a merge."
 msgstr "no es pot fer una comissió parcial durant una fusió."
 
-#: builtin/commit.c:450
+#: builtin/commit.c:460
 msgid "cannot do a partial commit during a cherry-pick."
 msgstr "no es pot fer una comissió parcial durant un recull de cireres."
 
-#: builtin/commit.c:459
+#: builtin/commit.c:469
 msgid "cannot read the index"
 msgstr "no es pot llegir l'índex"
 
-#: builtin/commit.c:478
+#: builtin/commit.c:488
 msgid "unable to write temporary index file"
 msgstr "no s'ha pogut escriure un fitxer d'índex temporal"
 
-#: builtin/commit.c:583
+#: builtin/commit.c:582
 #, c-format
 msgid "commit '%s' lacks author header"
 msgstr "a la comissió '%s' li manca la capçalera d'autor"
 
-#: builtin/commit.c:585
+#: builtin/commit.c:584
 #, c-format
 msgid "commit '%s' has malformed author line"
 msgstr "la comissió '%s' té una línia d'autor mal formada"
 
-#: builtin/commit.c:604
+#: builtin/commit.c:603
 msgid "malformed --author parameter"
 msgstr "paràmetre --author mal format"
 
-#: builtin/commit.c:612
+#: builtin/commit.c:611
 #, c-format
 msgid "invalid date format: %s"
 msgstr "format de data no vàlid: %s"
 
-#: builtin/commit.c:656
+#: builtin/commit.c:655
 msgid ""
 "unable to select a comment character that is not used\n"
 "in the current commit message"
@@ -5868,38 +6463,38 @@ msgstr ""
 "no es pot seleccionar un caràcter de comentari que\n"
 "no sigui usat en el missatge de comissió actual"
 
-#: builtin/commit.c:693 builtin/commit.c:726 builtin/commit.c:1092
+#: builtin/commit.c:692 builtin/commit.c:725 builtin/commit.c:1096
 #, c-format
 msgid "could not lookup commit %s"
 msgstr "no s'ha pogut trobar la comissió %s"
 
-#: builtin/commit.c:705 builtin/shortlog.c:286
+#: builtin/commit.c:704 builtin/shortlog.c:286
 #, c-format
 msgid "(reading log message from standard input)\n"
 msgstr "(s'està llegint el missatge de registre des de l'entrada estàndard)\n"
 
-#: builtin/commit.c:707
+#: builtin/commit.c:706
 msgid "could not read log from standard input"
 msgstr "no s'ha pogut llegir el registre des de l'entrada estàndard"
 
-#: builtin/commit.c:711
+#: builtin/commit.c:710
 #, c-format
 msgid "could not read log file '%s'"
 msgstr "no s'ha pogut llegir el fitxer de registre '%s'"
 
-#: builtin/commit.c:738 builtin/commit.c:746
+#: builtin/commit.c:737 builtin/commit.c:745
 msgid "could not read SQUASH_MSG"
 msgstr "no s'ha pogut llegir SQUASH_MSG"
 
-#: builtin/commit.c:743
+#: builtin/commit.c:742
 msgid "could not read MERGE_MSG"
 msgstr "no s'ha pogut llegir MERGE_MSG"
 
-#: builtin/commit.c:797
+#: builtin/commit.c:796
 msgid "could not write commit template"
 msgstr "no s'ha pogut escriure la plantilla de comissió"
 
-#: builtin/commit.c:815
+#: builtin/commit.c:814
 #, c-format
 msgid ""
 "\n"
@@ -5914,7 +6509,7 @@ msgstr ""
 "\t%s\n"
 "i intenteu-ho de nou.\n"
 
-#: builtin/commit.c:820
+#: builtin/commit.c:819
 #, c-format
 msgid ""
 "\n"
@@ -5929,7 +6524,7 @@ msgstr ""
 "\t%s\n"
 "i intenteu-ho de nou.\n"
 
-#: builtin/commit.c:833
+#: builtin/commit.c:832
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
@@ -5939,7 +6534,7 @@ msgstr ""
 "S'ignoraran les línies començant amb '%c', i un missatge de\n"
 "comissió buit avorta la comissió.\n"
 
-#: builtin/commit.c:840
+#: builtin/commit.c:839
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
@@ -5950,150 +6545,154 @@ msgstr ""
 "Es retindran les línies començants amb '%c'; podeu eliminar-les per vós\n"
 "mateix si voleu. Un missatge buit avorta la comissió.\n"
 
-#: builtin/commit.c:860
+#: builtin/commit.c:859
 #, c-format
 msgid "%sAuthor:    %.*s <%.*s>"
 msgstr "%sAutor:    %.*s <%.*s>"
 
-#: builtin/commit.c:868
+#: builtin/commit.c:867
 #, c-format
 msgid "%sDate:      %s"
 msgstr "%sData:      %s"
 
-#: builtin/commit.c:875
+#: builtin/commit.c:874
 #, c-format
 msgid "%sCommitter: %.*s <%.*s>"
 msgstr "%sComitent: %.*s <%.*s>"
 
-#: builtin/commit.c:893
+#: builtin/commit.c:892
 msgid "Cannot read index"
 msgstr "No es pot llegir l'índex"
 
-#: builtin/commit.c:950
+#: builtin/commit.c:954
 msgid "Error building trees"
 msgstr "Error en construir arbres"
 
-#: builtin/commit.c:965 builtin/tag.c:266
+#: builtin/commit.c:969 builtin/tag.c:266
 #, c-format
 msgid "Please supply the message using either -m or -F option.\n"
 msgstr "Si us plau, proveïu el missatge per usar o l'opció -m o l'opció -F.\n"
 
-#: builtin/commit.c:1067
+#: builtin/commit.c:1071
 #, c-format
 msgid "--author '%s' is not 'Name <email>' and matches no existing author"
 msgstr ""
 "--author '%s' no és 'Nom <adreça-de-correu-electrònic>' i no coincideix amb\n"
 "cap autor existent"
 
-#: builtin/commit.c:1082 builtin/commit.c:1322
+#: builtin/commit.c:1086 builtin/commit.c:1327
 #, c-format
 msgid "Invalid untracked files mode '%s'"
 msgstr "Mode de fitxers no seguits no vàlid '%s'"
 
-#: builtin/commit.c:1119
+#: builtin/commit.c:1124
 msgid "--long and -z are incompatible"
 msgstr "--long i -z són incompatibles"
 
-#: builtin/commit.c:1149
+#: builtin/commit.c:1154
 msgid "Using both --reset-author and --author does not make sense"
 msgstr "Usar ambdós --reset-author i --author no té sentit"
 
-#: builtin/commit.c:1158
+#: builtin/commit.c:1163
 msgid "You have nothing to amend."
 msgstr "No teniu res a esmenar."
 
-#: builtin/commit.c:1161
+#: builtin/commit.c:1166
 msgid "You are in the middle of a merge -- cannot amend."
 msgstr "Esteu enmig d'una fusió -- no es pot esmenar."
 
-#: builtin/commit.c:1163
+#: builtin/commit.c:1168
 msgid "You are in the middle of a cherry-pick -- cannot amend."
 msgstr "Esteu enmig d'un recull de cireres -- no es pot esmenar."
 
-#: builtin/commit.c:1166
+#: builtin/commit.c:1171
 msgid "Options --squash and --fixup cannot be used together"
 msgstr "Les opcions --squash i --fixup no es poden usar juntes"
 
-#: builtin/commit.c:1176
+#: builtin/commit.c:1181
 msgid "Only one of -c/-C/-F/--fixup can be used."
 msgstr "Només un de -c/-C/-F/--fixup es pot usar."
 
-#: builtin/commit.c:1178
+#: builtin/commit.c:1183
 msgid "Option -m cannot be combined with -c/-C/-F/--fixup."
 msgstr "L'opció -m no es pot combinar amb -c/-C/-F/--fixup."
 
-#: builtin/commit.c:1186
+#: builtin/commit.c:1191
 msgid "--reset-author can be used only with -C, -c or --amend."
 msgstr "--reset-author només es pot usar amb -C, -c o --amend."
 
-#: builtin/commit.c:1203
+#: builtin/commit.c:1208
 msgid "Only one of --include/--only/--all/--interactive/--patch can be used."
 msgstr "Només un de --include/--only/--all/--interactive/--patch es pot usar."
 
-#: builtin/commit.c:1205
+#: builtin/commit.c:1210
 msgid "No paths with --include/--only does not make sense."
 msgstr "--include/--only no té sentit sense camí."
 
-#: builtin/commit.c:1207
+#: builtin/commit.c:1212
 msgid "Clever... amending the last one with dirty index."
 msgstr "Intel·ligent... s'està esmenant l'últim amb índex brut."
 
-#: builtin/commit.c:1209
+#: builtin/commit.c:1214
 msgid "Explicit paths specified without -i or -o; assuming --only paths..."
 msgstr ""
 "S'han especificat camins explícits sense -i o -o; s'està presumint camins --"
 "only..."
 
-#: builtin/commit.c:1221 builtin/tag.c:474
+#: builtin/commit.c:1226 builtin/tag.c:474
 #, c-format
 msgid "Invalid cleanup mode %s"
 msgstr "Mode de neteja no vàlid %s"
 
-#: builtin/commit.c:1226
+#: builtin/commit.c:1231
 msgid "Paths with -a does not make sense."
 msgstr "-a no té sentit amb camins."
 
-#: builtin/commit.c:1336 builtin/commit.c:1622
+#: builtin/commit.c:1341 builtin/commit.c:1617
 msgid "show status concisely"
 msgstr "mostra l'estat concisament"
 
-#: builtin/commit.c:1338 builtin/commit.c:1624
+#: builtin/commit.c:1343 builtin/commit.c:1619
 msgid "show branch information"
 msgstr "mostra la informació de branca"
 
-#: builtin/commit.c:1340 builtin/commit.c:1626 builtin/push.c:522
+#: builtin/commit.c:1345
+msgid "version"
+msgstr "versió"
+
+#: builtin/commit.c:1345 builtin/commit.c:1621 builtin/push.c:522
 #: builtin/worktree.c:440
 msgid "machine-readable output"
 msgstr "sortida llegible per màquina"
 
-#: builtin/commit.c:1343 builtin/commit.c:1628
+#: builtin/commit.c:1348 builtin/commit.c:1623
 msgid "show status in long format (default)"
 msgstr "mostra l'estat en format llarg (per defecte)"
 
-#: builtin/commit.c:1346 builtin/commit.c:1631
+#: builtin/commit.c:1351 builtin/commit.c:1626
 msgid "terminate entries with NUL"
 msgstr "acaba les entrades amb NUL"
 
-#: builtin/commit.c:1348 builtin/commit.c:1634 builtin/fast-export.c:981
+#: builtin/commit.c:1353 builtin/commit.c:1629 builtin/fast-export.c:981
 #: builtin/fast-export.c:984 builtin/tag.c:353
 msgid "mode"
 msgstr "mode"
 
-#: builtin/commit.c:1349 builtin/commit.c:1634
+#: builtin/commit.c:1354 builtin/commit.c:1629
 msgid "show untracked files, optional modes: all, normal, no. (Default: all)"
 msgstr ""
 "mostra els fitxers no seguits, modes opcionals: all, normal, no. (Per "
 "defecte: all)"
 
-#: builtin/commit.c:1352
+#: builtin/commit.c:1357
 msgid "show ignored files"
 msgstr "mostra els fitxers ignorats"
 
-#: builtin/commit.c:1353 parse-options.h:155
+#: builtin/commit.c:1358 parse-options.h:155
 msgid "when"
 msgstr "quan"
 
-#: builtin/commit.c:1354
+#: builtin/commit.c:1359
 msgid ""
 "ignore changes to submodules, optional when: all, dirty, untracked. "
 "(Default: all)"
@@ -6101,202 +6700,202 @@ msgstr ""
 "ignora els canvis als submòduls, opcional quan: all, dirty, untracked. (Per "
 "defecte: all)"
 
-#: builtin/commit.c:1356
+#: builtin/commit.c:1361
 msgid "list untracked files in columns"
 msgstr "mostra els fitxers no seguits en columnes"
 
-#: builtin/commit.c:1442
+#: builtin/commit.c:1437
 msgid "couldn't look up newly created commit"
 msgstr "no s'ha pogut trobar la comissió novament creada"
 
-#: builtin/commit.c:1444
+#: builtin/commit.c:1439
 msgid "could not parse newly created commit"
 msgstr "no s'ha pogut analitzar la comissió novament creada"
 
-#: builtin/commit.c:1489
+#: builtin/commit.c:1484
 msgid "detached HEAD"
 msgstr "HEAD separat"
 
-#: builtin/commit.c:1492
+#: builtin/commit.c:1487
 msgid " (root-commit)"
 msgstr " (comissió d'arrel)"
 
-#: builtin/commit.c:1592
+#: builtin/commit.c:1587
 msgid "suppress summary after successful commit"
 msgstr "omet el resum després d'una comissió reeixida"
 
-#: builtin/commit.c:1593
+#: builtin/commit.c:1588
 msgid "show diff in commit message template"
 msgstr "mostra la diferència en la plantilla de missatge de comissió"
 
-#: builtin/commit.c:1595
+#: builtin/commit.c:1590
 msgid "Commit message options"
 msgstr "Opcions de missatge de comissió"
 
-#: builtin/commit.c:1596 builtin/tag.c:351
+#: builtin/commit.c:1591 builtin/tag.c:351
 msgid "read message from file"
 msgstr "llegiu el missatge des d'un fitxer"
 
-#: builtin/commit.c:1597
+#: builtin/commit.c:1592
 msgid "author"
 msgstr "autor"
 
-#: builtin/commit.c:1597
+#: builtin/commit.c:1592
 msgid "override author for commit"
 msgstr "autor corregit de la comissió"
 
-#: builtin/commit.c:1598 builtin/gc.c:326
+#: builtin/commit.c:1593 builtin/gc.c:326
 msgid "date"
 msgstr "data"
 
-#: builtin/commit.c:1598
+#: builtin/commit.c:1593
 msgid "override date for commit"
 msgstr "data corregida de la comissió"
 
-#: builtin/commit.c:1599 builtin/merge.c:220 builtin/notes.c:396
-#: builtin/notes.c:559 builtin/tag.c:349
+#: builtin/commit.c:1594 builtin/merge.c:220 builtin/notes.c:398
+#: builtin/notes.c:561 builtin/tag.c:349
 msgid "message"
 msgstr "missatge"
 
-#: builtin/commit.c:1599
+#: builtin/commit.c:1594
 msgid "commit message"
 msgstr "missatge de comissió"
 
-#: builtin/commit.c:1600 builtin/commit.c:1601 builtin/commit.c:1602
-#: builtin/commit.c:1603 parse-options.h:256 ref-filter.h:79
+#: builtin/commit.c:1595 builtin/commit.c:1596 builtin/commit.c:1597
+#: builtin/commit.c:1598 parse-options.h:257 ref-filter.h:79
 msgid "commit"
 msgstr "comissió"
 
-#: builtin/commit.c:1600
+#: builtin/commit.c:1595
 msgid "reuse and edit message from specified commit"
 msgstr "reusa i edita el missatge de la comissió especificada"
 
-#: builtin/commit.c:1601
+#: builtin/commit.c:1596
 msgid "reuse message from specified commit"
 msgstr "reusa el missatge de la comissió especificada"
 
-#: builtin/commit.c:1602
+#: builtin/commit.c:1597
 msgid "use autosquash formatted message to fixup specified commit"
 msgstr ""
 "usa el missatge formatat d'aixafada automàtica per a arreglar la comissió "
 "especificada"
 
-#: builtin/commit.c:1603
+#: builtin/commit.c:1598
 msgid "use autosquash formatted message to squash specified commit"
 msgstr ""
 "usa el missatge formatat d'aixafada automàtica per a aixafar la comissió "
 "especificada"
 
-#: builtin/commit.c:1604
+#: builtin/commit.c:1599
 msgid "the commit is authored by me now (used with -C/-c/--amend)"
 msgstr "l'autor de la comissió ja sóc jo (s'usa amb -C/-c/--amend)"
 
-#: builtin/commit.c:1605 builtin/log.c:1409 builtin/revert.c:86
+#: builtin/commit.c:1600 builtin/log.c:1413 builtin/revert.c:86
 msgid "add Signed-off-by:"
 msgstr "afegeix Signed-off-by:"
 
-#: builtin/commit.c:1606
+#: builtin/commit.c:1601
 msgid "use specified template file"
 msgstr "usa el fitxer de plantilla especificat"
 
-#: builtin/commit.c:1607
+#: builtin/commit.c:1602
 msgid "force edit of commit"
 msgstr "força l'edició de la comissió"
 
-#: builtin/commit.c:1608
+#: builtin/commit.c:1603
 msgid "default"
 msgstr "per defecte"
 
-#: builtin/commit.c:1608 builtin/tag.c:354
+#: builtin/commit.c:1603 builtin/tag.c:354
 msgid "how to strip spaces and #comments from message"
 msgstr "com despullar els espais i #comentaris del missatge"
 
-#: builtin/commit.c:1609
+#: builtin/commit.c:1604
 msgid "include status in commit message template"
 msgstr "inclou l'estat en la plantilla de missatge de comissió"
 
-#: builtin/commit.c:1611 builtin/merge.c:230 builtin/pull.c:165
+#: builtin/commit.c:1606 builtin/merge.c:230 builtin/pull.c:166
 #: builtin/revert.c:93
 msgid "GPG sign commit"
 msgstr "signa la comissió amb GPG"
 
-#: builtin/commit.c:1614
+#: builtin/commit.c:1609
 msgid "Commit contents options"
 msgstr "Opcions dels continguts de les comissions"
 
-#: builtin/commit.c:1615
+#: builtin/commit.c:1610
 msgid "commit all changed files"
 msgstr "comet tots els fitxers canviats"
 
-#: builtin/commit.c:1616
+#: builtin/commit.c:1611
 msgid "add specified files to index for commit"
 msgstr "afegeix els fitxers especificats a l'índex per a cometre"
 
-#: builtin/commit.c:1617
+#: builtin/commit.c:1612
 msgid "interactively add files"
 msgstr "afegeix els fitxers interactivament"
 
-#: builtin/commit.c:1618
+#: builtin/commit.c:1613
 msgid "interactively add changes"
 msgstr "afegeix els canvis interactivament"
 
-#: builtin/commit.c:1619
+#: builtin/commit.c:1614
 msgid "commit only specified files"
 msgstr "comet només els fitxers especificats"
 
-#: builtin/commit.c:1620
+#: builtin/commit.c:1615
 msgid "bypass pre-commit and commit-msg hooks"
 msgstr "evita els ganxos de precomissió i missatge de comissió"
 
-#: builtin/commit.c:1621
+#: builtin/commit.c:1616
 msgid "show what would be committed"
 msgstr "mostra què es cometria"
 
-#: builtin/commit.c:1632
+#: builtin/commit.c:1627
 msgid "amend previous commit"
 msgstr "esmena la comissió anterior"
 
-#: builtin/commit.c:1633
+#: builtin/commit.c:1628
 msgid "bypass post-rewrite hook"
 msgstr "evita el ganxo de postreescriure"
 
-#: builtin/commit.c:1638
+#: builtin/commit.c:1633
 msgid "ok to record an empty change"
 msgstr "està bé registrar un canvi buit"
 
-#: builtin/commit.c:1640
+#: builtin/commit.c:1635
 msgid "ok to record a change with an empty message"
 msgstr "està bé registrar un canvi amb missatge buit"
 
-#: builtin/commit.c:1669
+#: builtin/commit.c:1664
 msgid "could not parse HEAD commit"
 msgstr "no s'ha pogut analitzar la comissió HEAD"
 
-#: builtin/commit.c:1719
+#: builtin/commit.c:1712
 #, c-format
 msgid "Corrupt MERGE_HEAD file (%s)"
 msgstr "Fitxer MERGE_HEAD malmès (%s)"
 
-#: builtin/commit.c:1726
+#: builtin/commit.c:1719
 msgid "could not read MERGE_MODE"
 msgstr "no s'ha pogut llegir MERGE_MODE"
 
-#: builtin/commit.c:1745
+#: builtin/commit.c:1738
 #, c-format
 msgid "could not read commit message: %s"
 msgstr "no s'ha pogut llegir el missatge de comissió: %s"
 
-#: builtin/commit.c:1756
+#: builtin/commit.c:1749
 #, c-format
 msgid "Aborting commit; you did not edit the message.\n"
 msgstr "S'està avortant la comissió; no heu editat el missatge.\n"
 
-#: builtin/commit.c:1761
+#: builtin/commit.c:1754
 #, c-format
 msgid "Aborting commit due to empty commit message.\n"
 msgstr "S'està avortant la comissió a causa d'un missatge de comissió buit.\n"
 
-#: builtin/commit.c:1809
+#: builtin/commit.c:1802
 msgid ""
 "Repository has been updated, but unable to write\n"
 "new_index file. Check that disk is not full and quota is\n"
@@ -6466,17 +7065,26 @@ msgstr ""
 msgid "cannot create configuration file %s"
 msgstr "no es pot crear el fitxer de configuració '%s'"
 
-#: builtin/count-objects.c:77
+#: builtin/config.c:625
+#, c-format
+msgid ""
+"cannot overwrite multiple values with a single value\n"
+"       Use a regexp, --add or --replace-all to change %s."
+msgstr ""
+"no es pot sobreescriure múltiples valors amb un sol valor\n"
+"       Useu una expresió regular, --add o --replace-all per a canviar %s."
+
+#: builtin/count-objects.c:86
 msgid "git count-objects [-v] [-H | --human-readable]"
 msgstr "git count-objects [-v] [-H | --human-readable]"
 
-#: builtin/count-objects.c:87
+#: builtin/count-objects.c:96
 msgid "print sizes in human readable format"
 msgstr "imprimeix les mides en un format llegible pels humans"
 
 #: builtin/describe.c:17
 msgid "git describe [<options>] [<commit-ish>...]"
-msgstr "git describe [opcions] [<comissió>...]"
+msgstr "git describe [<opcions>] [<comissió>...]"
 
 #: builtin/describe.c:18
 msgid "git describe [<options>] --dirty"
@@ -6590,7 +7198,7 @@ msgstr "considera les <n> etiquetes més recents (per defecte: 10)"
 msgid "only consider tags matching <pattern>"
 msgstr "només considera les etiquetes que coincideixen amb <patró>"
 
-#: builtin/describe.c:410 builtin/name-rev.c:321
+#: builtin/describe.c:410 builtin/name-rev.c:320
 msgid "show abbreviated commit object as fallback"
 msgstr "mostra l'objecte de comissió abreviat com a retrocediment"
 
@@ -6624,21 +7232,21 @@ msgstr "'%s': no és ni fitxer regular ni enllaç simbòlic"
 msgid "invalid option: %s"
 msgstr "opció no vàlida: %s"
 
-#: builtin/diff.c:360
+#: builtin/diff.c:361
 msgid "Not a git repository"
 msgstr "No és un dipòsit de git"
 
-#: builtin/diff.c:403
+#: builtin/diff.c:404
 #, c-format
 msgid "invalid object '%s' given."
 msgstr "s'ha donat un objecte no vàlid '%s'."
 
-#: builtin/diff.c:412
+#: builtin/diff.c:413
 #, c-format
 msgid "more than two blobs given: '%s'"
 msgstr "s'ha donat més de dos blobs: '%s"
 
-#: builtin/diff.c:419
+#: builtin/diff.c:420
 #, c-format
 msgid "unhandled object '%s' given."
 msgstr "s'ha donat l'objecte no gestionat '%s'."
@@ -6711,162 +7319,166 @@ msgstr "git fetch --multiple [<opcions>] [(<dipòsit> | <grup>)...]"
 msgid "git fetch --all [<options>]"
 msgstr "git fetch --all [<opcions>]"
 
-#: builtin/fetch.c:93 builtin/pull.c:174
+#: builtin/fetch.c:95 builtin/pull.c:175
 msgid "fetch from all remotes"
 msgstr "obtén de tots els remots"
 
-#: builtin/fetch.c:95 builtin/pull.c:177
+#: builtin/fetch.c:97 builtin/pull.c:178
 msgid "append to .git/FETCH_HEAD instead of overwriting"
 msgstr "annexa a .git/FETCH_HEAD en lloc de sobreescriure"
 
-#: builtin/fetch.c:97 builtin/pull.c:180
+#: builtin/fetch.c:99 builtin/pull.c:181
 msgid "path to upload pack on remote end"
 msgstr "camí al qual pujar el paquet al costat remot"
 
-#: builtin/fetch.c:98 builtin/pull.c:182
+#: builtin/fetch.c:100 builtin/pull.c:183
 msgid "force overwrite of local branch"
 msgstr "força la sobreescriptura de la branca local"
 
-#: builtin/fetch.c:100
+#: builtin/fetch.c:102
 msgid "fetch from multiple remotes"
 msgstr "obtén de múltiples remots"
 
-#: builtin/fetch.c:102 builtin/pull.c:184
+#: builtin/fetch.c:104 builtin/pull.c:185
 msgid "fetch all tags and associated objects"
 msgstr "obtén totes les etiquetes i tots els objectes associats"
 
-#: builtin/fetch.c:104
+#: builtin/fetch.c:106
 msgid "do not fetch all tags (--no-tags)"
 msgstr "no obtinguis les etiquetes (--no-tags)"
 
-#: builtin/fetch.c:106
+#: builtin/fetch.c:108
 msgid "number of submodules fetched in parallel"
 msgstr "nombre de submòduls obtinguts en paral·lel"
 
-#: builtin/fetch.c:108 builtin/pull.c:187
+#: builtin/fetch.c:110 builtin/pull.c:188
 msgid "prune remote-tracking branches no longer on remote"
 msgstr "poda les branques amb seguiment remot que ja no estiguin en el remot"
 
-#: builtin/fetch.c:109 builtin/pull.c:190
+#: builtin/fetch.c:111 builtin/pull.c:191
 msgid "on-demand"
 msgstr "sota demanda"
 
-#: builtin/fetch.c:110 builtin/pull.c:191
+#: builtin/fetch.c:112 builtin/pull.c:192
 msgid "control recursive fetching of submodules"
 msgstr "controla l'obtenció recursiva de submòduls"
 
-#: builtin/fetch.c:114 builtin/pull.c:199
+#: builtin/fetch.c:116 builtin/pull.c:200
 msgid "keep downloaded pack"
 msgstr "retén el paquet baixat"
 
-#: builtin/fetch.c:116
+#: builtin/fetch.c:118
 msgid "allow updating of HEAD ref"
 msgstr "permet l'actualització de la referència HEAD"
 
-#: builtin/fetch.c:119 builtin/pull.c:202
+#: builtin/fetch.c:121 builtin/fetch.c:127 builtin/pull.c:203
 msgid "deepen history of shallow clone"
 msgstr "aprofundeix la història d'un clon superficial"
 
-#: builtin/fetch.c:121 builtin/pull.c:205
+#: builtin/fetch.c:123
+msgid "deepen history of shallow repository based on time"
+msgstr "aprofundeix la història d'un clon superficial basat en temps"
+
+#: builtin/fetch.c:129 builtin/pull.c:206
 msgid "convert to a complete repository"
 msgstr "converteix en un dipòsit complet"
 
-#: builtin/fetch.c:123 builtin/log.c:1426
+#: builtin/fetch.c:131 builtin/log.c:1433
 msgid "dir"
 msgstr "directori"
 
-#: builtin/fetch.c:124
+#: builtin/fetch.c:132
 msgid "prepend this to submodule path output"
 msgstr "anteposa això a la sortida de camí del submòdul"
 
-#: builtin/fetch.c:127
+#: builtin/fetch.c:135
 msgid "default mode for recursion"
 msgstr "mode de recursivitat per defecte"
 
-#: builtin/fetch.c:129 builtin/pull.c:208
+#: builtin/fetch.c:137 builtin/pull.c:209
 msgid "accept refs that update .git/shallow"
 msgstr "accepta les referències que actualitzin .git/shallow"
 
-#: builtin/fetch.c:130 builtin/pull.c:210
+#: builtin/fetch.c:138 builtin/pull.c:211
 msgid "refmap"
 msgstr "mapa de referències"
 
-#: builtin/fetch.c:131 builtin/pull.c:211
+#: builtin/fetch.c:139 builtin/pull.c:212
 msgid "specify fetch refmap"
 msgstr "mostra el mapa de referències d'obtenció"
 
-#: builtin/fetch.c:387
+#: builtin/fetch.c:398
 msgid "Couldn't find remote ref HEAD"
 msgstr "No s'ha pogut trobar la referència HEAD remota"
 
-#: builtin/fetch.c:503
+#: builtin/fetch.c:514
 #, c-format
 msgid "configuration fetch.output contains invalid value %s"
 msgstr "la configuració fetch.output conté un valor no vàlid %s"
 
-#: builtin/fetch.c:592
+#: builtin/fetch.c:607
 #, c-format
 msgid "object %s not found"
 msgstr "objecte %s no trobat"
 
-#: builtin/fetch.c:596
+#: builtin/fetch.c:611
 msgid "[up to date]"
 msgstr "[al dia]"
 
-#: builtin/fetch.c:609 builtin/fetch.c:689
+#: builtin/fetch.c:624 builtin/fetch.c:704
 msgid "[rejected]"
 msgstr "[rebutjat]"
 
-#: builtin/fetch.c:610
+#: builtin/fetch.c:625
 msgid "can't fetch in current branch"
 msgstr "no es pot obtenir en la branca actual"
 
-#: builtin/fetch.c:619
+#: builtin/fetch.c:634
 msgid "[tag update]"
 msgstr "[actualització d'etiqueta]"
 
-#: builtin/fetch.c:620 builtin/fetch.c:653 builtin/fetch.c:669
-#: builtin/fetch.c:684
+#: builtin/fetch.c:635 builtin/fetch.c:668 builtin/fetch.c:684
+#: builtin/fetch.c:699
 msgid "unable to update local ref"
 msgstr "no s'ha pogut actualitzar la referència local"
 
-#: builtin/fetch.c:639
+#: builtin/fetch.c:654
 msgid "[new tag]"
 msgstr "[etiqueta nova]"
 
-#: builtin/fetch.c:642
+#: builtin/fetch.c:657
 msgid "[new branch]"
 msgstr "[branca nova]"
 
-#: builtin/fetch.c:645
+#: builtin/fetch.c:660
 msgid "[new ref]"
 msgstr "[referència nova]"
 
-#: builtin/fetch.c:684
+#: builtin/fetch.c:699
 msgid "forced update"
 msgstr "actualització forçada"
 
-#: builtin/fetch.c:689
+#: builtin/fetch.c:704
 msgid "non-fast-forward"
 msgstr "sense avanç ràpid"
 
-#: builtin/fetch.c:733
+#: builtin/fetch.c:749
 #, c-format
 msgid "%s did not send all necessary objects\n"
 msgstr "%s no ha enviat tots els objectes necessaris\n"
 
-#: builtin/fetch.c:753
+#: builtin/fetch.c:769
 #, c-format
 msgid "reject %s because shallow roots are not allowed to be updated"
 msgstr ""
 "rebutja %s perquè no es permet que les arrels superficials s'actualitzin"
 
-#: builtin/fetch.c:839 builtin/fetch.c:934
+#: builtin/fetch.c:856 builtin/fetch.c:952
 #, c-format
 msgid "From %.*s\n"
 msgstr "De %.*s\n"
 
-#: builtin/fetch.c:850
+#: builtin/fetch.c:867
 #, c-format
 msgid ""
 "some local refs could not be updated; try running\n"
@@ -6876,55 +7488,55 @@ msgstr ""
 " intenteu executar 'git remote prune %s' per a eliminar\n"
 " qualsevulla branca antiga o conflictiva"
 
-#: builtin/fetch.c:904
+#: builtin/fetch.c:922
 #, c-format
 msgid "   (%s will become dangling)"
 msgstr "   (%s es tornarà penjant)"
 
-#: builtin/fetch.c:905
+#: builtin/fetch.c:923
 #, c-format
 msgid "   (%s has become dangling)"
 msgstr "   (%s s'ha tornat penjant)"
 
-#: builtin/fetch.c:937
+#: builtin/fetch.c:955
 msgid "[deleted]"
 msgstr "[suprimit]"
 
-#: builtin/fetch.c:938 builtin/remote.c:1020
+#: builtin/fetch.c:956 builtin/remote.c:1020
 msgid "(none)"
 msgstr "(cap)"
 
-#: builtin/fetch.c:960
+#: builtin/fetch.c:979
 #, c-format
 msgid "Refusing to fetch into current branch %s of non-bare repository"
 msgstr "S'està refusant obtenir en la branca actual %s d'un dipòsit no nu"
 
-#: builtin/fetch.c:979
+#: builtin/fetch.c:998
 #, c-format
 msgid "Option \"%s\" value \"%s\" is not valid for %s"
 msgstr "L'opció \"%s\" amb valor \"%s\" no és vàlida per a %s"
 
-#: builtin/fetch.c:982
+#: builtin/fetch.c:1001
 #, c-format
 msgid "Option \"%s\" is ignored for %s\n"
 msgstr "S'ignora l'opció \"%s\" per a %s\n"
 
-#: builtin/fetch.c:1039
+#: builtin/fetch.c:1077
 #, c-format
 msgid "Don't know how to fetch from %s"
 msgstr "No se sap com obtenir de %s"
 
-#: builtin/fetch.c:1199
+#: builtin/fetch.c:1237
 #, c-format
 msgid "Fetching %s\n"
 msgstr "S'està obtenint %s\n"
 
-#: builtin/fetch.c:1201 builtin/remote.c:96
+#: builtin/fetch.c:1239 builtin/remote.c:96
 #, c-format
 msgid "Could not fetch %s"
 msgstr "No s'ha pogut obtenir %s"
 
-#: builtin/fetch.c:1219
+#: builtin/fetch.c:1257
 msgid ""
 "No remote repository specified.  Please, specify either a URL or a\n"
 "remote name from which new revisions should be fetched."
@@ -6932,32 +7544,40 @@ msgstr ""
 "Cap dipòsit remot especificat. Si us plau, especifiqueu o un URL o\n"
 "un nom remot del qual es deuen obtenir les revisions noves."
 
-#: builtin/fetch.c:1242
+#: builtin/fetch.c:1280
 msgid "You need to specify a tag name."
 msgstr "Necessiteu especificar un nom d'etiqueta."
 
-#: builtin/fetch.c:1284
+#: builtin/fetch.c:1322
+msgid "Negative depth in --deepen is not supported"
+msgstr "No s'admet una profunditat negativa en --deepen"
+
+#: builtin/fetch.c:1324
+msgid "--deepen and --depth are mutually exclusive"
+msgstr "--deepen i --depth són mutualment exclusius"
+
+#: builtin/fetch.c:1329
 msgid "--depth and --unshallow cannot be used together"
 msgstr "--depth i --unshallow no es poden usar junts"
 
-#: builtin/fetch.c:1286
+#: builtin/fetch.c:1331
 msgid "--unshallow on a complete repository does not make sense"
 msgstr "--unshallow en un dipòsit complet no té sentit"
 
-#: builtin/fetch.c:1306
+#: builtin/fetch.c:1353
 msgid "fetch --all does not take a repository argument"
 msgstr "fetch --all no accepta un paràmetre de dipòsit"
 
-#: builtin/fetch.c:1308
+#: builtin/fetch.c:1355
 msgid "fetch --all does not make sense with refspecs"
 msgstr "fetch --all no té sentit amb especificacions de referència"
 
-#: builtin/fetch.c:1319
+#: builtin/fetch.c:1366
 #, c-format
 msgid "No such remote or remote group: %s"
 msgstr "No hi ha tal remot ni tal grup remot: %s"
 
-#: builtin/fetch.c:1327
+#: builtin/fetch.c:1374
 msgid "Fetching a group and specifying refspecs does not make sense"
 msgstr "Obtenir un grup i especificar referències no té sentit"
 
@@ -6967,23 +7587,23 @@ msgid ""
 msgstr ""
 "git fmt-merge-msg [-m <missatge>] [--log[=<n>] | --no-log] [--file <fitxer>]"
 
-#: builtin/fmt-merge-msg.c:667
+#: builtin/fmt-merge-msg.c:663
 msgid "populate log with at most <n> entries from shortlog"
 msgstr "emplena el registre amb <n> entrades del registre curt com a màxim"
 
-#: builtin/fmt-merge-msg.c:670
+#: builtin/fmt-merge-msg.c:666
 msgid "alias for --log (deprecated)"
 msgstr "àlies per --log (desaprovat)"
 
-#: builtin/fmt-merge-msg.c:673
+#: builtin/fmt-merge-msg.c:669
 msgid "text"
 msgstr "text"
 
-#: builtin/fmt-merge-msg.c:674
+#: builtin/fmt-merge-msg.c:670
 msgid "use <text> as start of message"
 msgstr "usa <text> com a inici de missatge"
 
-#: builtin/fmt-merge-msg.c:675
+#: builtin/fmt-merge-msg.c:671
 msgid "file to read from"
 msgstr "fitxer del qual llegir"
 
@@ -7101,7 +7721,7 @@ msgstr "mostra el progrés"
 msgid "show verbose names for reachable objects"
 msgstr "mostra els noms detallats dels objectes abastables"
 
-#: builtin/fsck.c:671
+#: builtin/fsck.c:665
 msgid "Checking objects"
 msgstr "S'estan comprovant els objectes"
 
@@ -7195,228 +7815,223 @@ msgstr "grep: s'ha fallat en crear fil: %s"
 msgid "invalid number of threads specified (%d) for %s"
 msgstr "s'ha especificat un nombre de fils no vàlid (%d) per a %s"
 
-#: builtin/grep.c:452 builtin/grep.c:487
+#: builtin/grep.c:453 builtin/grep.c:488
 #, c-format
 msgid "unable to read tree (%s)"
 msgstr "no s'ha pogut llegir l'arbre (%s)"
 
-#: builtin/grep.c:502
+#: builtin/grep.c:503
 #, c-format
 msgid "unable to grep from object of type %s"
 msgstr "no es pot fer grep des d'un objecte de tipus %s"
 
-#: builtin/grep.c:560
+#: builtin/grep.c:561
 #, c-format
 msgid "switch `%c' expects a numerical value"
 msgstr "l'opció `%c' espera un valor numèric"
 
-#: builtin/grep.c:577
-#, c-format
-msgid "cannot open '%s'"
-msgstr "no es pot obrir '%s'"
-
-#: builtin/grep.c:646
+#: builtin/grep.c:647
 msgid "search in index instead of in the work tree"
 msgstr "cerca en l'índex en lloc de l'arbre de treball"
 
-#: builtin/grep.c:648
+#: builtin/grep.c:649
 msgid "find in contents not managed by git"
 msgstr "cerca en continguts no gestionats per git"
 
-#: builtin/grep.c:650
+#: builtin/grep.c:651
 msgid "search in both tracked and untracked files"
 msgstr "cerca tant en fitxers seguits com en no seguits"
 
-#: builtin/grep.c:652
+#: builtin/grep.c:653
 msgid "ignore files specified via '.gitignore'"
 msgstr "ignora els fitxers especificats mitjançant '.gitignore'"
 
-#: builtin/grep.c:655
+#: builtin/grep.c:656
 msgid "show non-matching lines"
 msgstr "mostra les línies no coincidents"
 
-#: builtin/grep.c:657
+#: builtin/grep.c:658
 msgid "case insensitive matching"
 msgstr "coincidència insensible a majúscula i minúscula"
 
-#: builtin/grep.c:659
+#: builtin/grep.c:660
 msgid "match patterns only at word boundaries"
 msgstr "coincideix amb els patrons només als límits de paraula"
 
-#: builtin/grep.c:661
+#: builtin/grep.c:662
 msgid "process binary files as text"
 msgstr "processa els fitxers binaris com a text"
 
-#: builtin/grep.c:663
+#: builtin/grep.c:664
 msgid "don't match patterns in binary files"
 msgstr "no coincideixis amb els patrons en els fitxers binaris"
 
-#: builtin/grep.c:666
+#: builtin/grep.c:667
 msgid "process binary files with textconv filters"
 msgstr "processa els fitxers binaris amb filtres de textconv"
 
-#: builtin/grep.c:668
+#: builtin/grep.c:669
 msgid "descend at most <depth> levels"
 msgstr "descendeix com a màxim <profunditat> nivells"
 
-#: builtin/grep.c:672
+#: builtin/grep.c:673
 msgid "use extended POSIX regular expressions"
 msgstr "usa les expressions regulars POSIX esteses"
 
-#: builtin/grep.c:675
+#: builtin/grep.c:676
 msgid "use basic POSIX regular expressions (default)"
 msgstr "usa les expressions regulars POSIX bàsiques (per defecte)"
 
-#: builtin/grep.c:678
+#: builtin/grep.c:679
 msgid "interpret patterns as fixed strings"
 msgstr "interpreta els patrons com a cadenes fixes"
 
-#: builtin/grep.c:681
+#: builtin/grep.c:682
 msgid "use Perl-compatible regular expressions"
 msgstr "usa les expressions regulars compatibles amb Perl"
 
-#: builtin/grep.c:684
+#: builtin/grep.c:685
 msgid "show line numbers"
 msgstr "mostra els números de línia"
 
-#: builtin/grep.c:685
+#: builtin/grep.c:686
 msgid "don't show filenames"
 msgstr "no mostris els noms de fitxer"
 
-#: builtin/grep.c:686
+#: builtin/grep.c:687
 msgid "show filenames"
 msgstr "mostra els noms de fitxer"
 
-#: builtin/grep.c:688
+#: builtin/grep.c:689
 msgid "show filenames relative to top directory"
 msgstr "mostra els noms de fitxer relatius al directori superior"
 
-#: builtin/grep.c:690
+#: builtin/grep.c:691
 msgid "show only filenames instead of matching lines"
 msgstr "mostra només els noms de fitxer en lloc de les línies coincidents"
 
-#: builtin/grep.c:692
+#: builtin/grep.c:693
 msgid "synonym for --files-with-matches"
 msgstr "sinònim de --files-with-matches"
 
-#: builtin/grep.c:695
+#: builtin/grep.c:696
 msgid "show only the names of files without match"
 msgstr "mostra només els noms dels fitxers sense coincidència"
 
-#: builtin/grep.c:697
+#: builtin/grep.c:698
 msgid "print NUL after filenames"
 msgstr "imprimeix NUL després dels noms de fitxer"
 
-#: builtin/grep.c:699
+#: builtin/grep.c:700
 msgid "show the number of matches instead of matching lines"
 msgstr "mostra el nombre de coincidències en lloc de les línies coincidents"
 
-#: builtin/grep.c:700
+#: builtin/grep.c:701
 msgid "highlight matches"
 msgstr "ressalta les coincidències"
 
-#: builtin/grep.c:702
+#: builtin/grep.c:703
 msgid "print empty line between matches from different files"
 msgstr "imprimeix una línia buida entre coincidències de fitxers distints"
 
-#: builtin/grep.c:704
+#: builtin/grep.c:705
 msgid "show filename only once above matches from same file"
 msgstr ""
 "mostra el nom de fitxer només una vegada a dalt de les coincidències del "
 "mateix fitxer"
 
-#: builtin/grep.c:707
+#: builtin/grep.c:708
 msgid "show <n> context lines before and after matches"
 msgstr "mostra <n> línies de context abans i després d'una coincidència"
 
-#: builtin/grep.c:710
+#: builtin/grep.c:711
 msgid "show <n> context lines before matches"
 msgstr "mostra <n> línies de context abans d'una coincidència"
 
-#: builtin/grep.c:712
+#: builtin/grep.c:713
 msgid "show <n> context lines after matches"
 msgstr "mostra <n> línies de context després d'una coincidència"
 
-#: builtin/grep.c:714
+#: builtin/grep.c:715
 msgid "use <n> worker threads"
 msgstr "usa <n> fils obrers"
 
-#: builtin/grep.c:715
+#: builtin/grep.c:716
 msgid "shortcut for -C NUM"
 msgstr "drecera per -C NUM"
 
-#: builtin/grep.c:718
+#: builtin/grep.c:719
 msgid "show a line with the function name before matches"
 msgstr "mostra una línia amb el nom de funció abans de les coincidències"
 
-#: builtin/grep.c:720
+#: builtin/grep.c:721
 msgid "show the surrounding function"
 msgstr "mostra la funció circumdant"
 
-#: builtin/grep.c:723
+#: builtin/grep.c:724
 msgid "read patterns from file"
 msgstr "llegeix els patrons des d'un fitxer"
 
-#: builtin/grep.c:725
+#: builtin/grep.c:726
 msgid "match <pattern>"
 msgstr "coincideix amb <patró>"
 
-#: builtin/grep.c:727
+#: builtin/grep.c:728
 msgid "combine patterns specified with -e"
 msgstr "combina els patrons especificats amb -e"
 
-#: builtin/grep.c:739
+#: builtin/grep.c:740
 msgid "indicate hit with exit status without output"
 msgstr "indica coincidència amb estat de sortida sense sortida textual"
 
-#: builtin/grep.c:741
+#: builtin/grep.c:742
 msgid "show only matches from files that match all patterns"
 msgstr ""
 "mostra només les coincidències dels fitxers que coincideixin amb tots els "
 "patrons"
 
-#: builtin/grep.c:743
+#: builtin/grep.c:744
 msgid "show parse tree for grep expression"
 msgstr "mostra l'arbre d'anàlisis de l'expressió de grep"
 
-#: builtin/grep.c:747
+#: builtin/grep.c:748
 msgid "pager"
 msgstr "paginador"
 
-#: builtin/grep.c:747
+#: builtin/grep.c:748
 msgid "show matching files in the pager"
 msgstr "mostra els fitxers coincidents en el paginador"
 
-#: builtin/grep.c:750
+#: builtin/grep.c:751
 msgid "allow calling of grep(1) (ignored by this build)"
 msgstr "permet la invocació de grep(1) (ignorat per aquesta compilació)"
 
-#: builtin/grep.c:813
+#: builtin/grep.c:814
 msgid "no pattern given."
 msgstr "cap patró donat."
 
-#: builtin/grep.c:845 builtin/index-pack.c:1479
+#: builtin/grep.c:846 builtin/index-pack.c:1480
 #, c-format
 msgid "invalid number of threads specified (%d)"
 msgstr "s'ha especificat un nombre de fils no vàlid (%d)"
 
-#: builtin/grep.c:875
+#: builtin/grep.c:876
 msgid "--open-files-in-pager only works on the worktree"
 msgstr "--open-files-in-pager només funciona en l'arbre de treball"
 
-#: builtin/grep.c:901
+#: builtin/grep.c:902
 msgid "--cached or --untracked cannot be used with --no-index."
 msgstr "--cached o --untracked no es pot usar amb --no-index."
 
-#: builtin/grep.c:906
+#: builtin/grep.c:907
 msgid "--no-index or --untracked cannot be used with revs."
 msgstr "--no-index o --untracked no es pot usar amb revisions."
 
-#: builtin/grep.c:909
+#: builtin/grep.c:910
 msgid "--[no-]exclude-standard cannot be used for tracked contents."
 msgstr "--[no-]exclude-standard no es pot usar per als continguts seguits."
 
-#: builtin/grep.c:917
+#: builtin/grep.c:918
 msgid "both --cached and trees are given."
 msgstr "s'han donat ambdós --caches i arbres."
 
@@ -7432,85 +8047,89 @@ msgstr ""
 msgid "git hash-object  --stdin-paths"
 msgstr "git hash-object  --stdin-paths"
 
-#: builtin/hash-object.c:93
+#: builtin/hash-object.c:94
 msgid "type"
 msgstr "tipus"
 
-#: builtin/hash-object.c:93
+#: builtin/hash-object.c:94
 msgid "object type"
 msgstr "tipus d'objecte"
 
-#: builtin/hash-object.c:94
+#: builtin/hash-object.c:95
 msgid "write the object into the object database"
 msgstr "escriu l'objecte a la base de dades d'objectes"
 
-#: builtin/hash-object.c:96
+#: builtin/hash-object.c:97
 msgid "read the object from stdin"
 msgstr "llegeix l'objecte des d'stdin"
 
-#: builtin/hash-object.c:98
+#: builtin/hash-object.c:99
 msgid "store file as is without filters"
 msgstr "emmagatzema el fitxer tal com és sense filtres"
 
-#: builtin/hash-object.c:99
+#: builtin/hash-object.c:100
 msgid ""
 "just hash any random garbage to create corrupt objects for debugging Git"
 msgstr ""
 "només suma qualsevulla brossa aleatòria per a crear objectes malmesos per a "
 "depurar al Git"
 
-#: builtin/hash-object.c:100
+#: builtin/hash-object.c:101
 msgid "process file as it were from this path"
 msgstr "processa el fitxer com si fos d'aquest camí"
 
-#: builtin/help.c:41
+#: builtin/help.c:42
 msgid "print all available commands"
 msgstr "imprimeix totes les ordres disponibles"
 
-#: builtin/help.c:42
+#: builtin/help.c:43
+msgid "exclude guides"
+msgstr "exclou guíes"
+
+#: builtin/help.c:44
 msgid "print list of useful guides"
 msgstr "imprimeix la llista de guies útils"
 
-#: builtin/help.c:43
+#: builtin/help.c:45
 msgid "show man page"
 msgstr "mostra la pàgina de manual"
 
-#: builtin/help.c:44
+#: builtin/help.c:46
 msgid "show manual in web browser"
 msgstr "mostra la pàgina de manual en el navegador web"
 
-#: builtin/help.c:46
+#: builtin/help.c:48
 msgid "show info page"
 msgstr "mostra la pàgina d'informació"
 
-#: builtin/help.c:52
+#: builtin/help.c:54
 msgid "git help [--all] [--guides] [--man | --web | --info] [<command>]"
 msgstr "git help [--all] [--guides] [--man | --web | --info] [<ordre>]"
 
-#: builtin/help.c:64
+#: builtin/help.c:66
 #, c-format
 msgid "unrecognized help format '%s'"
 msgstr "format d'ajuda no reconegut '%s'"
 
-#: builtin/help.c:91
+#: builtin/help.c:93
 msgid "Failed to start emacsclient."
 msgstr "S'ha fallat en iniciar emacsclient."
 
-#: builtin/help.c:104
+#: builtin/help.c:106
 msgid "Failed to parse emacsclient version."
 msgstr "S'ha fallat en analitzar la versió d'emacsclient."
 
-#: builtin/help.c:112
+#: builtin/help.c:114
 #, c-format
 msgid "emacsclient version '%d' too old (< 22)."
 msgstr "la versió d'emacsclient '%d' és massa vella (< 22)."
 
-#: builtin/help.c:130 builtin/help.c:151 builtin/help.c:160 builtin/help.c:168
+#: builtin/help.c:132 builtin/help.c:153 builtin/help.c:162 builtin/help.c:170
 #, c-format
 msgid "failed to exec '%s'"
 msgstr "s'ha fallat en executar '%s'"
 
-#: builtin/help.c:205
+#: builtin/help.c:207
 #, c-format
 msgid ""
 "'%s': path for unsupported man viewer.\n"
@@ -7519,7 +8138,7 @@ msgstr ""
 "'%s': camí a un visualitzador de manuals no compatible.\n"
 "Si us plau, considereu usar 'man.<eina>.cmd' en lloc d'això."
 
-#: builtin/help.c:217
+#: builtin/help.c:219
 #, c-format
 msgid ""
 "'%s': cmd for supported man viewer.\n"
@@ -7528,155 +8147,159 @@ msgstr ""
 "'%s': ordre per a un visualitzador de manuals compatible.\n"
 "Si us plau, considereu usar 'man.<eina>.path' en lloc d'això."
 
-#: builtin/help.c:334
+#: builtin/help.c:336
 #, c-format
 msgid "'%s': unknown man viewer."
 msgstr "'%s': visualitzador de manuals desconegut."
 
-#: builtin/help.c:351
+#: builtin/help.c:353
 msgid "no man viewer handled the request"
 msgstr "cap visualitzador de manuals ha gestionat la sol·licitud"
 
-#: builtin/help.c:359
+#: builtin/help.c:361
 msgid "no info viewer handled the request"
 msgstr "cap visualitzador d'informació ha gestionat la sol·licitud"
 
-#: builtin/help.c:401
+#: builtin/help.c:403
 msgid "Defining attributes per path"
 msgstr "La definició d'atributs per camí"
 
-#: builtin/help.c:402
+#: builtin/help.c:404
 msgid "Everyday Git With 20 Commands Or So"
 msgstr "Git quotidià amb més o menys 20 ordres"
 
-#: builtin/help.c:403
+#: builtin/help.c:405
 msgid "A Git glossary"
 msgstr "Un glossari de Git"
 
-#: builtin/help.c:404
+#: builtin/help.c:406
 msgid "Specifies intentionally untracked files to ignore"
 msgstr "Especifica els fitxers intencionalment no seguits a ignorar"
 
-#: builtin/help.c:405
+#: builtin/help.c:407
 msgid "Defining submodule properties"
 msgstr "La definició de les propietats de submòduls"
 
-#: builtin/help.c:406
+#: builtin/help.c:408
 msgid "Specifying revisions and ranges for Git"
 msgstr "L'especificació de revisions i rangs per al Git"
 
-#: builtin/help.c:407
+#: builtin/help.c:409
 msgid "A tutorial introduction to Git (for version 1.5.1 or newer)"
 msgstr "Una introducció tutorial al Git (per a la versió 1.5.1 o més nou)"
 
-#: builtin/help.c:408
+#: builtin/help.c:410
 msgid "An overview of recommended workflows with Git"
 msgstr "Una visió de conjunt de fluxos de treball recomanats amb Git"
 
-#: builtin/help.c:420
+#: builtin/help.c:422
 msgid "The common Git guides are:\n"
 msgstr "Les guies de Git comunes són:\n"
 
-#: builtin/help.c:441 builtin/help.c:458
-#, c-format
-msgid "usage: %s%s"
-msgstr "ús: %s%s"
-
-#: builtin/help.c:474
+#: builtin/help.c:440
 #, c-format
 msgid "`git %s' is aliased to `%s'"
 msgstr "`git %s' és un àlies de `%s'"
 
-#: builtin/index-pack.c:153
+#: builtin/help.c:462 builtin/help.c:479
+#, c-format
+msgid "usage: %s%s"
+msgstr "ús: %s%s"
+
+#: builtin/index-pack.c:154
 #, c-format
 msgid "unable to open %s"
 msgstr "no s'ha pogut obrir %s"
 
-#: builtin/index-pack.c:203
+#: builtin/index-pack.c:204
 #, c-format
 msgid "object type mismatch at %s"
 msgstr "hi ha una discordança de tipus d'objecte a %s"
 
-#: builtin/index-pack.c:223
+#: builtin/index-pack.c:224
 #, c-format
 msgid "did not receive expected object %s"
 msgstr "no s'ha rebut l'objecte esperat %s"
 
-#: builtin/index-pack.c:226
+#: builtin/index-pack.c:227
 #, c-format
 msgid "object %s: expected type %s, found %s"
 msgstr "objecte %s: tipus %s esperat, %s trobat"
 
-#: builtin/index-pack.c:268
+#: builtin/index-pack.c:269
 #, c-format
 msgid "cannot fill %d byte"
 msgid_plural "cannot fill %d bytes"
 msgstr[0] "no es pot omplir %d octet"
 msgstr[1] "no es pot omplir %d octets"
 
-#: builtin/index-pack.c:278
+#: builtin/index-pack.c:279
 msgid "early EOF"
 msgstr "EOF prematur"
 
-#: builtin/index-pack.c:279
+#: builtin/index-pack.c:280
 msgid "read error on input"
 msgstr "error de lectura d'entrada"
 
-#: builtin/index-pack.c:291
+#: builtin/index-pack.c:292
 msgid "used more bytes than were available"
 msgstr "s'han usat més octets que hi havia disponibles"
 
-#: builtin/index-pack.c:298
+#: builtin/index-pack.c:299
 msgid "pack too large for current definition of off_t"
 msgstr "paquet massa gran per a la definició actual d'off_t"
 
-#: builtin/index-pack.c:314
+#: builtin/index-pack.c:302 builtin/unpack-objects.c:92
+msgid "pack exceeds maximum allowed size"
+msgstr "el paquet supera la mida màxima permesa"
+
+#: builtin/index-pack.c:317
 #, c-format
 msgid "unable to create '%s'"
-msgstr "no es pot crear '%s'"
+msgstr "no s'ha pogut crear '%s'"
 
-#: builtin/index-pack.c:319
+#: builtin/index-pack.c:322
 #, c-format
 msgid "cannot open packfile '%s'"
 msgstr "no es pot obrir el fitxer de paquet '%s'"
 
-#: builtin/index-pack.c:333
+#: builtin/index-pack.c:336
 msgid "pack signature mismatch"
 msgstr "hi ha una discordança de signatura de paquet"
 
-#: builtin/index-pack.c:335
+#: builtin/index-pack.c:338
 #, c-format
 msgid "pack version %<PRIu32> unsupported"
 msgstr "la versió de paquet %<PRIu32> no és compatible"
 
-#: builtin/index-pack.c:353
+#: builtin/index-pack.c:356
 #, c-format
 msgid "pack has bad object at offset %<PRIuMAX>: %s"
 msgstr "el paquet té un objecte dolent a la posició %<PRIuMAX>: %s"
 
-#: builtin/index-pack.c:475
+#: builtin/index-pack.c:478
 #, c-format
 msgid "inflate returned %d"
 msgstr "la inflació ha retornat %d"
 
-#: builtin/index-pack.c:524
+#: builtin/index-pack.c:527
 msgid "offset value overflow for delta base object"
 msgstr "desbordament de valor de desplaçament per a l'objecte base de delta"
 
-#: builtin/index-pack.c:532
+#: builtin/index-pack.c:535
 msgid "delta base offset is out of bound"
 msgstr "el desplaçament de base de delta està fora de límits"
 
-#: builtin/index-pack.c:540
+#: builtin/index-pack.c:543
 #, c-format
 msgid "unknown object type %d"
 msgstr "tipus d'objecte desconegut %d"
 
-#: builtin/index-pack.c:571
+#: builtin/index-pack.c:574
 msgid "cannot pread pack file"
 msgstr "no es pot fer pread en el fitxer de paquet"
 
-#: builtin/index-pack.c:573
+#: builtin/index-pack.c:576
 #, c-format
 msgid "premature end of pack file, %<PRIuMAX> byte missing"
 msgid_plural "premature end of pack file, %<PRIuMAX> bytes missing"
@@ -7684,144 +8307,144 @@ msgstr[0] "el final del fitxer de paquet és prematur, manca %<PRIuMAX> octet"
 msgstr[1] ""
 "el final del fitxer de paquet és prematur, manquen %<PRIuMAX> octets"
 
-#: builtin/index-pack.c:599
+#: builtin/index-pack.c:602
 msgid "serious inflate inconsistency"
 msgstr "hi ha una inconsistència seriosa d'inflació"
 
-#: builtin/index-pack.c:745 builtin/index-pack.c:751 builtin/index-pack.c:774
-#: builtin/index-pack.c:808 builtin/index-pack.c:817
+#: builtin/index-pack.c:748 builtin/index-pack.c:754 builtin/index-pack.c:777
+#: builtin/index-pack.c:811 builtin/index-pack.c:820
 #, c-format
 msgid "SHA1 COLLISION FOUND WITH %s !"
 msgstr "S'HA TROBAT UNA COL·LISIÓ SHA1 AMB %s !"
 
-#: builtin/index-pack.c:748 builtin/pack-objects.c:164
-#: builtin/pack-objects.c:256
+#: builtin/index-pack.c:751 builtin/pack-objects.c:166
+#: builtin/pack-objects.c:258
 #, c-format
 msgid "unable to read %s"
 msgstr "no s'ha pogut llegir %s"
 
-#: builtin/index-pack.c:814
+#: builtin/index-pack.c:817
 #, c-format
 msgid "cannot read existing object %s"
 msgstr "no es pot llegir l'objecte existent %s"
 
-#: builtin/index-pack.c:828
+#: builtin/index-pack.c:831
 #, c-format
 msgid "invalid blob object %s"
 msgstr "objecte de blob no vàlid %s"
 
-#: builtin/index-pack.c:842
+#: builtin/index-pack.c:845
 #, c-format
 msgid "invalid %s"
 msgstr "%s no vàlid"
 
-#: builtin/index-pack.c:845
+#: builtin/index-pack.c:848
 msgid "Error in object"
 msgstr "Error en objecte"
 
-#: builtin/index-pack.c:847
+#: builtin/index-pack.c:850
 #, c-format
 msgid "Not all child objects of %s are reachable"
 msgstr "No tots els objectes fills de %s són abastables"
 
-#: builtin/index-pack.c:919 builtin/index-pack.c:950
+#: builtin/index-pack.c:922 builtin/index-pack.c:953
 msgid "failed to apply delta"
 msgstr "s'ha fallat en aplicar la delta"
 
-#: builtin/index-pack.c:1120
+#: builtin/index-pack.c:1123
 msgid "Receiving objects"
 msgstr "S'estan rebent objectes"
 
-#: builtin/index-pack.c:1120
+#: builtin/index-pack.c:1123
 msgid "Indexing objects"
 msgstr "S'estan indexant objectes"
 
-#: builtin/index-pack.c:1152
+#: builtin/index-pack.c:1155
 msgid "pack is corrupted (SHA1 mismatch)"
 msgstr "el paquet és malmès (discordança SHA1)"
 
-#: builtin/index-pack.c:1157
+#: builtin/index-pack.c:1160
 msgid "cannot fstat packfile"
 msgstr "no es pot fer fstat en el fitxer de paquet"
 
-#: builtin/index-pack.c:1160
+#: builtin/index-pack.c:1163
 msgid "pack has junk at the end"
 msgstr "el paquet té brossa al seu final"
 
-#: builtin/index-pack.c:1171
+#: builtin/index-pack.c:1174
 msgid "confusion beyond insanity in parse_pack_objects()"
 msgstr "confusió més enllà de la bogeria en parse_pack_objects()"
 
-#: builtin/index-pack.c:1196
+#: builtin/index-pack.c:1197
 msgid "Resolving deltas"
 msgstr "S'estan resolent les deltes"
 
-#: builtin/index-pack.c:1207
+#: builtin/index-pack.c:1208
 #, c-format
 msgid "unable to create thread: %s"
 msgstr "no s'ha pogut crear fil: %s"
 
-#: builtin/index-pack.c:1249
+#: builtin/index-pack.c:1250
 msgid "confusion beyond insanity"
 msgstr "confusió més enllà de la bogeria"
 
-#: builtin/index-pack.c:1255
+#: builtin/index-pack.c:1256
 #, c-format
 msgid "completed with %d local object"
 msgid_plural "completed with %d local objects"
 msgstr[0] "s'ha completat amb %d objecte local"
 msgstr[1] "s'ha completat amb %d objectes locals"
 
-#: builtin/index-pack.c:1267
+#: builtin/index-pack.c:1268
 #, c-format
 msgid "Unexpected tail checksum for %s (disk corruption?)"
 msgstr "Suma de verificació final no esperada per a %s (corrupció de disc?)"
 
-#: builtin/index-pack.c:1271
+#: builtin/index-pack.c:1272
 #, c-format
 msgid "pack has %d unresolved delta"
 msgid_plural "pack has %d unresolved deltas"
 msgstr[0] "El paquet té %d delta no resolta"
 msgstr[1] "El paquet té %d deltes no resoltes"
 
-#: builtin/index-pack.c:1295
+#: builtin/index-pack.c:1296
 #, c-format
 msgid "unable to deflate appended object (%d)"
 msgstr "no s'ha pogut desinflar l'objecte annexat (%d)"
 
-#: builtin/index-pack.c:1371
+#: builtin/index-pack.c:1372
 #, c-format
 msgid "local object %s is corrupt"
 msgstr "l'objecte local %s és malmès"
 
-#: builtin/index-pack.c:1395
+#: builtin/index-pack.c:1396
 msgid "error while closing pack file"
 msgstr "error en tancar el fitxer de paquet"
 
-#: builtin/index-pack.c:1408
+#: builtin/index-pack.c:1409
 #, c-format
 msgid "cannot write keep file '%s'"
 msgstr "no es pot escriure el fitxer a retenir '%s'"
 
-#: builtin/index-pack.c:1416
+#: builtin/index-pack.c:1417
 #, c-format
 msgid "cannot close written keep file '%s'"
 msgstr "no es pot tancar el fitxer escrit a retenir '%s'"
 
-#: builtin/index-pack.c:1429
+#: builtin/index-pack.c:1430
 msgid "cannot store pack file"
 msgstr "no es pot emmagatzemar el fitxer de paquet"
 
-#: builtin/index-pack.c:1440
+#: builtin/index-pack.c:1441
 msgid "cannot store index file"
 msgstr "no es pot emmagatzemar el fitxer d'índex"
 
-#: builtin/index-pack.c:1473
+#: builtin/index-pack.c:1474
 #, c-format
 msgid "bad pack.indexversion=%<PRIu32>"
 msgstr "pack.indexversion=%<PRIu32> dolent"
 
-#: builtin/index-pack.c:1483 builtin/index-pack.c:1681
+#: builtin/index-pack.c:1484 builtin/index-pack.c:1681
 #, c-format
 msgid "no threads support, ignoring %s"
 msgstr "no hi ha suport de fils, s'està ignorant %s"
@@ -7861,95 +8484,95 @@ msgstr "el nom del fitxer de paquet '%s' no acaba amb '.pack'"
 msgid "bad %s"
 msgstr "%s dolent"
 
-#: builtin/index-pack.c:1730
+#: builtin/index-pack.c:1732
 msgid "--fix-thin cannot be used without --stdin"
 msgstr "--fix-thin no es pot usar sense --stdin"
 
-#: builtin/index-pack.c:1738
+#: builtin/index-pack.c:1740
 msgid "--verify with no packfile name given"
 msgstr "s'ha donat --verify sense nom de fitxer de paquet"
 
-#: builtin/init-db.c:55
+#: builtin/init-db.c:54
 #, c-format
 msgid "cannot stat '%s'"
 msgstr "no es pot fer stat en '%s'"
 
-#: builtin/init-db.c:61
+#: builtin/init-db.c:60
 #, c-format
 msgid "cannot stat template '%s'"
 msgstr "no es pot fer stat en la plantilla '%s'"
 
-#: builtin/init-db.c:66
+#: builtin/init-db.c:65
 #, c-format
 msgid "cannot opendir '%s'"
 msgstr "no es pot fer opendir en el directori '%s'"
 
-#: builtin/init-db.c:77
+#: builtin/init-db.c:76
 #, c-format
 msgid "cannot readlink '%s'"
 msgstr "no es pot fer readlink en '%s'"
 
-#: builtin/init-db.c:79
+#: builtin/init-db.c:78
 #, c-format
 msgid "cannot symlink '%s' '%s'"
 msgstr "no es pot fer symlink en '%s' '%s'"
 
-#: builtin/init-db.c:85
+#: builtin/init-db.c:84
 #, c-format
 msgid "cannot copy '%s' to '%s'"
 msgstr "no es pot copiar '%s' a '%s'"
 
-#: builtin/init-db.c:89
+#: builtin/init-db.c:88
 #, c-format
 msgid "ignoring template %s"
 msgstr "s'està ignorant la plantilla %s"
 
-#: builtin/init-db.c:120
+#: builtin/init-db.c:119
 #, c-format
 msgid "templates not found %s"
 msgstr "no s'han trobat les plantilles %s"
 
-#: builtin/init-db.c:135
+#: builtin/init-db.c:134
 #, c-format
 msgid "not copying templates from '%s': %s"
 msgstr "no s'està copiant plantilles de '%s': %s"
 
-#: builtin/init-db.c:312 builtin/init-db.c:315
-#, c-format
-msgid "%s already exists"
-msgstr "%s ja existeix"
-
-#: builtin/init-db.c:344
+#: builtin/init-db.c:327
 #, c-format
 msgid "unable to handle file type %d"
 msgstr "no s'ha pogut gestionar el tipus de fitxer %d"
 
-#: builtin/init-db.c:347
+#: builtin/init-db.c:330
 #, c-format
 msgid "unable to move %s to %s"
 msgstr "no s'ha pogut moure %s a %s"
 
-#: builtin/init-db.c:402
+#: builtin/init-db.c:347 builtin/init-db.c:350
+#, c-format
+msgid "%s already exists"
+msgstr "%s ja existeix"
+
+#: builtin/init-db.c:403
 #, c-format
 msgid "Reinitialized existing shared Git repository in %s%s\n"
 msgstr "S'ha reinicialitzat el dipòsit compartit existent del Git en %s%s\n"
 
-#: builtin/init-db.c:403
+#: builtin/init-db.c:404
 #, c-format
 msgid "Reinitialized existing Git repository in %s%s\n"
 msgstr "S'ha reinicialitzat el dipòsit existent del Git en %s%s\n"
 
-#: builtin/init-db.c:407
+#: builtin/init-db.c:408
 #, c-format
 msgid "Initialized empty shared Git repository in %s%s\n"
 msgstr "S'ha inicialitzat un dipòsit compartit buit del Git en %s%s\n"
 
-#: builtin/init-db.c:408
+#: builtin/init-db.c:409
 #, c-format
 msgid "Initialized empty Git repository in %s%s\n"
 msgstr "S'ha inicialitzat un dipòsit buit del Git en %s%s\n"
 
-#: builtin/init-db.c:455
+#: builtin/init-db.c:457
 msgid ""
 "git init [-q | --quiet] [--bare] [--template=<template-directory>] [--"
 "shared[=<permissions>]] [<directory>]"
@@ -7957,25 +8580,25 @@ msgstr ""
 "git init [-q | --quiet] [--bare] [--template=<directori-de-plantilla>] [--"
 "shared[=<permisos>]] [<directori>]"
 
-#: builtin/init-db.c:478
+#: builtin/init-db.c:480
 msgid "permissions"
 msgstr "permisos"
 
-#: builtin/init-db.c:479
+#: builtin/init-db.c:481
 msgid "specify that the git repository is to be shared amongst several users"
 msgstr "especifica que el dipòsit de git es compartirà entre diversos usuaris"
 
-#: builtin/init-db.c:513 builtin/init-db.c:518
+#: builtin/init-db.c:515 builtin/init-db.c:520
 #, c-format
 msgid "cannot mkdir %s"
 msgstr "no es pot mkdir %s"
 
-#: builtin/init-db.c:522
+#: builtin/init-db.c:524
 #, c-format
 msgid "cannot chdir to %s"
 msgstr "no es pot canviar de directori a %s"
 
-#: builtin/init-db.c:543
+#: builtin/init-db.c:545
 #, c-format
 msgid ""
 "%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-"
@@ -7984,7 +8607,7 @@ msgstr ""
 "no es permet %s (o --work-tree=<directori>) sense especificar %s (o --git-"
 "dir=<directori>)"
 
-#: builtin/init-db.c:571
+#: builtin/init-db.c:573
 #, c-format
 msgid "Cannot access work tree '%s'"
 msgstr "No es pot accedir a l'arbre de treball '%s'"
@@ -8095,37 +8718,34 @@ msgstr "No és un rang."
 msgid "Cover letter needs email format"
 msgstr "La carta de presentació necessita el format de correu electrònic"
 
-#: builtin/log.c:1064
+#: builtin/log.c:1063
 #, c-format
 msgid "insane in-reply-to: %s"
 msgstr "in-reply-to boig: %s"
 
-#: builtin/log.c:1092
+#: builtin/log.c:1091
 msgid "git format-patch [<options>] [<since> | <revision-range>]"
 msgstr "git format-patch [<opcions>] [<des-de> | <rang-de-revisions>]"
 
-#: builtin/log.c:1137
+#: builtin/log.c:1141
 msgid "Two output directories?"
 msgstr "Hi ha dos directoris de sortida?"
 
-#: builtin/log.c:1244 builtin/log.c:1883 builtin/log.c:1885 builtin/log.c:1897
+#: builtin/log.c:1248 builtin/log.c:1891 builtin/log.c:1893 builtin/log.c:1905
 #, c-format
 msgid "Unknown commit %s"
 msgstr "Comissió desconeguda %s"
 
-#: builtin/log.c:1254 builtin/notes.c:254 builtin/notes.c:305
-#: builtin/notes.c:307 builtin/notes.c:370 builtin/notes.c:425
-#: builtin/notes.c:511 builtin/notes.c:516 builtin/notes.c:594
-#: builtin/notes.c:657 builtin/notes.c:882 builtin/tag.c:455
+#: builtin/log.c:1258 builtin/notes.c:884 builtin/tag.c:455
 #, c-format
 msgid "Failed to resolve '%s' as a valid ref."
 msgstr "S'ha fallat en resoldre '%s' com a referència vàlida."
 
-#: builtin/log.c:1259
+#: builtin/log.c:1263
 msgid "Could not find exact merge base."
 msgstr "No s'ha pogut trobar la base exacta de fusió."
 
-#: builtin/log.c:1263
+#: builtin/log.c:1267
 msgid ""
 "Failed to get upstream, if you want to record base commit automatically,\n"
 "please use git branch --set-upstream-to to track a remote branch.\n"
@@ -8136,211 +8756,215 @@ msgstr ""
 "seguir una branca remot. O podeu especificar la comissió base manualment\n"
 "amb --base=<id-de-comissió-base>."
 
-#: builtin/log.c:1283
+#: builtin/log.c:1287
 msgid "Failed to find exact merge base"
 msgstr "S'ha fallat en trobar la base exacta de fusió."
 
-#: builtin/log.c:1294
+#: builtin/log.c:1298
 msgid "base commit should be the ancestor of revision list"
 msgstr "la comissió base ha de ser l'avantpassat de la llista de revisions"
 
-#: builtin/log.c:1298
+#: builtin/log.c:1302
 msgid "base commit shouldn't be in revision list"
 msgstr "la comissió base no ha de ser en la llista de revisions"
 
-#: builtin/log.c:1347
+#: builtin/log.c:1351
 msgid "cannot get patch id"
 msgstr "no es pot obtenir l'id del pedaç"
 
-#: builtin/log.c:1404
+#: builtin/log.c:1408
 msgid "use [PATCH n/m] even with a single patch"
 msgstr "usa [PATCH n/m] fins i tot amb un sol pedaç"
 
-#: builtin/log.c:1407
+#: builtin/log.c:1411
 msgid "use [PATCH] even with multiple patches"
 msgstr "usa [PATCH] fins i tot amb múltiples pedaços"
 
-#: builtin/log.c:1411
+#: builtin/log.c:1415
 msgid "print patches to standard out"
 msgstr "imprimeix els pedaços a la sortida estàndard"
 
-#: builtin/log.c:1413
+#: builtin/log.c:1417
 msgid "generate a cover letter"
 msgstr "genera una carta de presentació"
 
-#: builtin/log.c:1415
+#: builtin/log.c:1419
 msgid "use simple number sequence for output file names"
 msgstr "usa una seqüència de números per als noms dels fitxers de sortida"
 
-#: builtin/log.c:1416
+#: builtin/log.c:1420
 msgid "sfx"
 msgstr "sufix"
 
-#: builtin/log.c:1417
+#: builtin/log.c:1421
 msgid "use <sfx> instead of '.patch'"
 msgstr "usa <sufix> en lloc de '.patch'"
 
-#: builtin/log.c:1419
+#: builtin/log.c:1423
 msgid "start numbering patches at <n> instead of 1"
 msgstr "comença numerant els pedaços a <n> en lloc d'1"
 
-#: builtin/log.c:1421
+#: builtin/log.c:1425
 msgid "mark the series as Nth re-roll"
 msgstr "marca la sèrie com a l'enèsima llançada"
 
-#: builtin/log.c:1423
+#: builtin/log.c:1427
+msgid "Use [RFC PATCH] instead of [PATCH]"
+msgstr "Usa [RFC PATCH] en lloc de [PATCH]"
+
+#: builtin/log.c:1430
 msgid "Use [<prefix>] instead of [PATCH]"
 msgstr "Usa [<prefix>] en lloc de [PATCH]"
 
-#: builtin/log.c:1426
+#: builtin/log.c:1433
 msgid "store resulting files in <dir>"
 msgstr "emmagatzema els fitxers resultants a <directori>"
 
-#: builtin/log.c:1429
+#: builtin/log.c:1436
 msgid "don't strip/add [PATCH]"
 msgstr "no despullis/afegeixis [PATCH]"
 
-#: builtin/log.c:1432
+#: builtin/log.c:1439
 msgid "don't output binary diffs"
 msgstr "no emetis diferències binàries"
 
-#: builtin/log.c:1434
+#: builtin/log.c:1441
 msgid "output all-zero hash in From header"
 msgstr "emet un hash de tots zeros en la capçalera From"
 
-#: builtin/log.c:1436
+#: builtin/log.c:1443
 msgid "don't include a patch matching a commit upstream"
 msgstr "no incloguis pedaços que coincideixin amb comissions a la font"
 
-#: builtin/log.c:1438
+#: builtin/log.c:1445
 msgid "show patch format instead of default (patch + stat)"
 msgstr ""
 "mostra el format de pedaç en lloc del per defecte (pedaç + estadístiques)"
 
-#: builtin/log.c:1440
+#: builtin/log.c:1447
 msgid "Messaging"
 msgstr "Missatgeria"
 
-#: builtin/log.c:1441
+#: builtin/log.c:1448
 msgid "header"
 msgstr "capçalera"
 
-#: builtin/log.c:1442
+#: builtin/log.c:1449
 msgid "add email header"
 msgstr "afegeix una capçalera de correu electrònic"
 
-#: builtin/log.c:1443 builtin/log.c:1445
+#: builtin/log.c:1450 builtin/log.c:1452
 msgid "email"
 msgstr "correu electrònic"
 
-#: builtin/log.c:1443
+#: builtin/log.c:1450
 msgid "add To: header"
 msgstr "afegeix la capçalera To:"
 
-#: builtin/log.c:1445
+#: builtin/log.c:1452
 msgid "add Cc: header"
 msgstr "afegeix la capçalera Cc:"
 
-#: builtin/log.c:1447
+#: builtin/log.c:1454
 msgid "ident"
 msgstr "identitat"
 
-#: builtin/log.c:1448
+#: builtin/log.c:1455
 msgid "set From address to <ident> (or committer ident if absent)"
 msgstr ""
 "estableix l'adreça From a <identitat> (o la identitat del comitent si manca)"
 
-#: builtin/log.c:1450
+#: builtin/log.c:1457
 msgid "message-id"
 msgstr "ID de missatge"
 
-#: builtin/log.c:1451
+#: builtin/log.c:1458
 msgid "make first mail a reply to <message-id>"
 msgstr "fes que el primer missatge sigui una resposta a <ID de missatge>"
 
-#: builtin/log.c:1452 builtin/log.c:1455
+#: builtin/log.c:1459 builtin/log.c:1462
 msgid "boundary"
 msgstr "límit"
 
-#: builtin/log.c:1453
+#: builtin/log.c:1460
 msgid "attach the patch"
 msgstr "ajunta el pedaç"
 
-#: builtin/log.c:1456
+#: builtin/log.c:1463
 msgid "inline the patch"
 msgstr "posa el pedaç en el cos"
 
-#: builtin/log.c:1460
+#: builtin/log.c:1467
 msgid "enable message threading, styles: shallow, deep"
 msgstr "habilita l'enfilada de missatges, estils: shallow, deep"
 
-#: builtin/log.c:1462
+#: builtin/log.c:1469
 msgid "signature"
 msgstr "signatura"
 
-#: builtin/log.c:1463
+#: builtin/log.c:1470
 msgid "add a signature"
 msgstr "afegeix una signatura"
 
-#: builtin/log.c:1464
+#: builtin/log.c:1471
 msgid "base-commit"
 msgstr "comissió base"
 
-#: builtin/log.c:1465
+#: builtin/log.c:1472
 msgid "add prerequisite tree info to the patch series"
 msgstr "afegeix la informació d'arbre prerequerida a la sèrie de pedaços"
 
-#: builtin/log.c:1467
+#: builtin/log.c:1474
 msgid "add a signature from a file"
 msgstr "afegeix una signatura des d'un fitxer"
 
-#: builtin/log.c:1468
+#: builtin/log.c:1475
 msgid "don't print the patch filenames"
 msgstr "no imprimeixis els noms de fitxer del pedaç"
 
-#: builtin/log.c:1558
+#: builtin/log.c:1565
 msgid "-n and -k are mutually exclusive."
 msgstr "-n i -k són mutualment exclusius."
 
-#: builtin/log.c:1560
-msgid "--subject-prefix and -k are mutually exclusive."
-msgstr "--subject-prefix i -k són mutualment exclusius."
+#: builtin/log.c:1567
+msgid "--subject-prefix/--rfc and -k are mutually exclusive."
+msgstr "--subject-prefix/--rfc i -k són mutualment exclusius."
 
-#: builtin/log.c:1568
+#: builtin/log.c:1575
 msgid "--name-only does not make sense"
 msgstr "--name-only no té sentit"
 
-#: builtin/log.c:1570
+#: builtin/log.c:1577
 msgid "--name-status does not make sense"
 msgstr "--name-status no té sentit"
 
-#: builtin/log.c:1572
+#: builtin/log.c:1579
 msgid "--check does not make sense"
 msgstr "--check no té sentit"
 
-#: builtin/log.c:1602
+#: builtin/log.c:1609
 msgid "standard output, or directory, which one?"
 msgstr "sortida estàndard o directori, quin dels dos?"
 
-#: builtin/log.c:1604
+#: builtin/log.c:1611
 #, c-format
 msgid "Could not create directory '%s'"
 msgstr "No s'ha pogut crear el directori '%s'"
 
-#: builtin/log.c:1698
+#: builtin/log.c:1705
 #, c-format
 msgid "unable to read signature file '%s'"
 msgstr "no s'ha pogut llegir el fitxer de signatura '%s'"
 
-#: builtin/log.c:1769
+#: builtin/log.c:1777
 msgid "Failed to create output files"
 msgstr "S'ha fallat en crear els fitxers de sortida"
 
-#: builtin/log.c:1818
+#: builtin/log.c:1826
 msgid "git cherry [-v] [<upstream> [<head> [<limit>]]]"
 msgstr "git cherry [-v] [<font> [<cap> [<límit>]]]"
 
-#: builtin/log.c:1872
+#: builtin/log.c:1880
 #, c-format
 msgid ""
 "Could not find a tracked remote branch, please specify <upstream> manually.\n"
@@ -8348,101 +8972,105 @@ msgstr ""
 "No s'ha pogut trobar una branca remota seguida. Si us plau, especifiqueu "
 "<font> manualment.\n"
 
-#: builtin/ls-files.c:379
+#: builtin/ls-files.c:458
 msgid "git ls-files [<options>] [<file>...]"
 msgstr "git ls-files [<opcions>] [<fitxer>...]"
 
-#: builtin/ls-files.c:428
+#: builtin/ls-files.c:507
 msgid "identify the file status with tags"
 msgstr "identifica l'estat de fitxer amb etiquetes"
 
-#: builtin/ls-files.c:430
+#: builtin/ls-files.c:509
 msgid "use lowercase letters for 'assume unchanged' files"
 msgstr "usa lletres minúscules per als fitxers 'assume unchanged'"
 
-#: builtin/ls-files.c:432
+#: builtin/ls-files.c:511
 msgid "show cached files in the output (default)"
 msgstr ""
 "mostra en la sortida els fitxers desats en la memòria cau (per defecte)"
 
-#: builtin/ls-files.c:434
+#: builtin/ls-files.c:513
 msgid "show deleted files in the output"
 msgstr "mostra en la sortida els fitxers suprimits"
 
-#: builtin/ls-files.c:436
+#: builtin/ls-files.c:515
 msgid "show modified files in the output"
 msgstr "mostra en la sortida els fitxers modificats"
 
-#: builtin/ls-files.c:438
+#: builtin/ls-files.c:517
 msgid "show other files in the output"
 msgstr "mostra en la sortida els altres fitxers"
 
-#: builtin/ls-files.c:440
+#: builtin/ls-files.c:519
 msgid "show ignored files in the output"
 msgstr "mostra en la sortida els fitxers ignorats"
 
-#: builtin/ls-files.c:443
+#: builtin/ls-files.c:522
 msgid "show staged contents' object name in the output"
 msgstr "mostra en la sortida el nom d'objecte dels continguts allistats"
 
-#: builtin/ls-files.c:445
+#: builtin/ls-files.c:524
 msgid "show files on the filesystem that need to be removed"
 msgstr "mostra els fitxers en el sistema de fitxers que s'han d'eliminar"
 
-#: builtin/ls-files.c:447
+#: builtin/ls-files.c:526
 msgid "show 'other' directories' names only"
 msgstr "mostra només els noms dels directoris 'other'"
 
-#: builtin/ls-files.c:449
+#: builtin/ls-files.c:528
 msgid "show line endings of files"
-msgstr "mostra els terminis de línia dels fitxers"
+msgstr "mostra els terminadors de línia dels fitxers"
 
-#: builtin/ls-files.c:451
+#: builtin/ls-files.c:530
 msgid "don't show empty directories"
 msgstr "no mostris els directoris buits"
 
-#: builtin/ls-files.c:454
+#: builtin/ls-files.c:533
 msgid "show unmerged files in the output"
 msgstr "mostra en la sortida els fitxers sense fusionar"
 
-#: builtin/ls-files.c:456
+#: builtin/ls-files.c:535
 msgid "show resolve-undo information"
 msgstr "mostra la informació de resolució de desfet"
 
-#: builtin/ls-files.c:458
+#: builtin/ls-files.c:537
 msgid "skip files matching pattern"
 msgstr "salta els fitxers coincidents amb el patró"
 
-#: builtin/ls-files.c:461
+#: builtin/ls-files.c:540
 msgid "exclude patterns are read from <file>"
 msgstr "els patrons d'exclusió es llegeixen de <fitxer>"
 
-#: builtin/ls-files.c:464
+#: builtin/ls-files.c:543
 msgid "read additional per-directory exclude patterns in <file>"
 msgstr "llegeix els patrons addicionals d'exclusió per directori en <fitxer>"
 
-#: builtin/ls-files.c:466
+#: builtin/ls-files.c:545
 msgid "add the standard git exclusions"
 msgstr "afegeix les exclusions estàndards de git"
 
-#: builtin/ls-files.c:469
+#: builtin/ls-files.c:548
 msgid "make the output relative to the project top directory"
 msgstr "fes que la sortida sigui relativa al directori superior del projecte"
 
-#: builtin/ls-files.c:472
+#: builtin/ls-files.c:551
+msgid "recurse through submodules"
+msgstr "recursa als submòduls"
+
+#: builtin/ls-files.c:553
 msgid "if any <file> is not in the index, treat this as an error"
 msgstr "si qualsevol <fitxer> no és en l'índex, tracta això com a error"
 
-#: builtin/ls-files.c:473
+#: builtin/ls-files.c:554
 msgid "tree-ish"
 msgstr "arbre"
 
-#: builtin/ls-files.c:474
+#: builtin/ls-files.c:555
 msgid "pretend that paths removed since <tree-ish> are still present"
 msgstr ""
 "pretén que els camins eliminats després de <arbre> encara siguin presents"
 
-#: builtin/ls-files.c:476
+#: builtin/ls-files.c:557
 msgid "show debugging data"
 msgstr "mostra les dades de depuració"
 
@@ -8561,33 +9189,33 @@ msgstr "Les estratègies disponibles són:"
 msgid "Available custom strategies are:"
 msgstr "Les estratègies personalitzades disponibles són:"
 
-#: builtin/merge.c:195 builtin/pull.c:126
+#: builtin/merge.c:195 builtin/pull.c:127
 msgid "do not show a diffstat at the end of the merge"
 msgstr "no mostris les estadístiques de diferència al final de la fusió"
 
-#: builtin/merge.c:198 builtin/pull.c:129
+#: builtin/merge.c:198 builtin/pull.c:130
 msgid "show a diffstat at the end of the merge"
 msgstr "mostra les estadístiques de diferència al final de la fusió"
 
-#: builtin/merge.c:199 builtin/pull.c:132
+#: builtin/merge.c:199 builtin/pull.c:133
 msgid "(synonym to --stat)"
 msgstr "(sinònim de --stat)"
 
-#: builtin/merge.c:201 builtin/pull.c:135
+#: builtin/merge.c:201 builtin/pull.c:136
 msgid "add (at most <n>) entries from shortlog to merge commit message"
 msgstr ""
 "afegeix (com a màxim <n>) entrades del registre curt al missatge de comissió "
 "de fusió"
 
-#: builtin/merge.c:204 builtin/pull.c:138
+#: builtin/merge.c:204 builtin/pull.c:139
 msgid "create a single commit instead of doing a merge"
 msgstr "crea una única comissió en lloc de fusionar"
 
-#: builtin/merge.c:206 builtin/pull.c:141
+#: builtin/merge.c:206 builtin/pull.c:142
 msgid "perform a commit if the merge succeeds (default)"
 msgstr "realitza una comissió si la fusió té èxit (per defecte)"
 
-#: builtin/merge.c:208 builtin/pull.c:144
+#: builtin/merge.c:208 builtin/pull.c:145
 msgid "edit message before committing"
 msgstr "edita el missatge abans de cometre"
 
@@ -8595,28 +9223,28 @@ msgstr "edita el missatge abans de cometre"
 msgid "allow fast-forward (default)"
 msgstr "permet l'avanç ràpid (per defecte)"
 
-#: builtin/merge.c:211 builtin/pull.c:150
+#: builtin/merge.c:211 builtin/pull.c:151
 msgid "abort if fast-forward is not possible"
 msgstr "avorta si l'avanç ràpid no és possible"
 
-#: builtin/merge.c:215 builtin/pull.c:153
+#: builtin/merge.c:215 builtin/pull.c:154
 msgid "verify that the named commit has a valid GPG signature"
 msgstr "verifica que la comissió anomenada tingui una signatura GPG vàlida"
 
-#: builtin/merge.c:216 builtin/notes.c:772 builtin/pull.c:157
+#: builtin/merge.c:216 builtin/notes.c:774 builtin/pull.c:158
 #: builtin/revert.c:89
 msgid "strategy"
 msgstr "estratègia"
 
-#: builtin/merge.c:217 builtin/pull.c:158
+#: builtin/merge.c:217 builtin/pull.c:159
 msgid "merge strategy to use"
 msgstr "estratègia de fusió a usar"
 
-#: builtin/merge.c:218 builtin/pull.c:161
+#: builtin/merge.c:218 builtin/pull.c:162
 msgid "option=value"
 msgstr "opció=valor"
 
-#: builtin/merge.c:219 builtin/pull.c:162
+#: builtin/merge.c:219 builtin/pull.c:163
 msgid "option for selected merge strategy"
 msgstr "opció per a l'estratègia de fusió seleccionada"
 
@@ -8628,7 +9256,7 @@ msgstr "missatge de comissió de fusió (per a una fusió no d'avanç ràpid)"
 msgid "abort the current in-progress merge"
 msgstr "avorta la fusió en curs actual"
 
-#: builtin/merge.c:227 builtin/pull.c:169
+#: builtin/merge.c:227 builtin/pull.c:170
 msgid "allow merging unrelated histories"
 msgstr "permet fusionar històries no relacionades"
 
@@ -8851,55 +9479,55 @@ msgstr "s'està refusant fusionar històries no relacionades"
 msgid "Already up-to-date."
 msgstr "Ja està al dia."
 
-#: builtin/merge.c:1382
+#: builtin/merge.c:1377
 #, c-format
 msgid "Updating %s..%s\n"
 msgstr "S'estan actualitzant %s..%s\n"
 
-#: builtin/merge.c:1419
+#: builtin/merge.c:1418
 #, c-format
 msgid "Trying really trivial in-index merge...\n"
 msgstr "S'està intentant una fusió molt trivial en l'índex...\n"
 
-#: builtin/merge.c:1426
+#: builtin/merge.c:1425
 #, c-format
 msgid "Nope.\n"
 msgstr "No.\n"
 
-#: builtin/merge.c:1451
+#: builtin/merge.c:1450
 msgid "Already up-to-date. Yeeah!"
 msgstr "Ja està al dia. Estupend!"
 
-#: builtin/merge.c:1457
+#: builtin/merge.c:1456
 msgid "Not possible to fast-forward, aborting."
 msgstr "No és possible avançar ràpidament, s'està avortant."
 
-#: builtin/merge.c:1480 builtin/merge.c:1559
+#: builtin/merge.c:1479 builtin/merge.c:1558
 #, c-format
 msgid "Rewinding the tree to pristine...\n"
 msgstr "S'està rebobinant l'arbre a la pristina...\n"
 
-#: builtin/merge.c:1484
+#: builtin/merge.c:1483
 #, c-format
 msgid "Trying merge strategy %s...\n"
 msgstr "S'està intentant l'estratègia de fusió %s...\n"
 
-#: builtin/merge.c:1550
+#: builtin/merge.c:1549
 #, c-format
 msgid "No merge strategy handled the merge.\n"
 msgstr "Cap estratègia de fusió ha gestionat la fusió.\n"
 
-#: builtin/merge.c:1552
+#: builtin/merge.c:1551
 #, c-format
 msgid "Merge with strategy %s failed.\n"
 msgstr "L'estratègia de fusió %s ha fallat.\n"
 
-#: builtin/merge.c:1561
+#: builtin/merge.c:1560
 #, c-format
 msgid "Using the %s to prepare resolving by hand.\n"
 msgstr "S'està usant el %s per a preparar la resolució a mà.\n"
 
-#: builtin/merge.c:1573
+#: builtin/merge.c:1572
 #, c-format
 msgid "Automatic merge went well; stopped before committing as requested\n"
 msgstr ""
@@ -8926,23 +9554,23 @@ msgstr "git merge-base --is-ancestor <comissió> <comissió>"
 msgid "git merge-base --fork-point <ref> [<commit>]"
 msgstr "git merge-base --fork-point <referència> [<comissió>]"
 
-#: builtin/merge-base.c:214
+#: builtin/merge-base.c:217
 msgid "output all common ancestors"
 msgstr "emet tots els avantpassats comuns"
 
-#: builtin/merge-base.c:216
+#: builtin/merge-base.c:219
 msgid "find ancestors for a single n-way merge"
 msgstr "troba els avantpassats per a una sola fusió d'n vies"
 
-#: builtin/merge-base.c:218
+#: builtin/merge-base.c:221
 msgid "list revs not reachable from others"
 msgstr "llista les revisions no abastables d'altres"
 
-#: builtin/merge-base.c:220
+#: builtin/merge-base.c:223
 msgid "is the first one ancestor of the other?"
 msgstr "és la primera un avantpassat de l'altre?"
 
-#: builtin/merge-base.c:222
+#: builtin/merge-base.c:225
 msgid "find where <commit> forked from reflog of <ref>"
 msgstr ""
 "troba on <comissió> s'ha bifurcat del registre de referències de <referència>"
@@ -8987,6 +9615,37 @@ msgstr "no avisis de conflictes"
 msgid "set labels for file1/orig-file/file2"
 msgstr "estableix les etiquetes per a fitxer1/fitxer-original/fitxer2"
 
+#: builtin/merge-recursive.c:45
+#, c-format
+msgid "unknown option %s"
+msgstr "opció desconeguda %s"
+
+#: builtin/merge-recursive.c:51
+#, c-format
+msgid "could not parse object '%s'"
+msgstr "no s'ha pogut analitzar l'objecte '%s'"
+
+#: builtin/merge-recursive.c:55
+#, c-format
+msgid "cannot handle more than %d base. Ignoring %s."
+msgid_plural "cannot handle more than %d bases. Ignoring %s."
+msgstr[0] "no es pot gestionar més d'%d base. S'està ignorant %s."
+msgstr[1] "no es poden gestionar més de %d bases. S'està ignorant %s."
+
+#: builtin/merge-recursive.c:63
+msgid "not handling anything other than two heads merge."
+msgstr "no s'està gestionant res a part de la fusió de dos caps."
+
+#: builtin/merge-recursive.c:69 builtin/merge-recursive.c:71
+#, c-format
+msgid "could not resolve ref '%s'"
+msgstr "no s'ha pogut resoldre la referència '%s'"
+
+#: builtin/merge-recursive.c:77
+#, c-format
+msgid "Merging %s with %s\n"
+msgstr "S'està fusionant %s amb %s\n"
+
 #: builtin/mktree.c:65
 msgid "git mktree [-z] [--missing] [--batch]"
 msgstr "git mktree [-z] [--missing] [--batch]"
@@ -9097,43 +9756,43 @@ msgstr "S'està canviant el nom de %s a %s\n"
 msgid "renaming '%s' failed"
 msgstr "el canvi del nom de '%s' ha fallat"
 
-#: builtin/name-rev.c:258
+#: builtin/name-rev.c:257
 msgid "git name-rev [<options>] <commit>..."
 msgstr "git name-rev [<opcions>] <comissió>..."
 
-#: builtin/name-rev.c:259
+#: builtin/name-rev.c:258
 msgid "git name-rev [<options>] --all"
 msgstr "git name-rev [<opcions>] --all"
 
-#: builtin/name-rev.c:260
+#: builtin/name-rev.c:259
 msgid "git name-rev [<options>] --stdin"
 msgstr "git name-rev [<opcions>] --stdin"
 
-#: builtin/name-rev.c:312
+#: builtin/name-rev.c:311
 msgid "print only names (no SHA-1)"
 msgstr "imprimeix només els noms (sense SHA-1)"
 
-#: builtin/name-rev.c:313
+#: builtin/name-rev.c:312
 msgid "only use tags to name the commits"
 msgstr "només usa les etiquetes per a anomenar les comissions"
 
-#: builtin/name-rev.c:315
+#: builtin/name-rev.c:314
 msgid "only use refs matching <pattern>"
 msgstr "només usa les referències que coincideixin amb <patró>"
 
-#: builtin/name-rev.c:317
+#: builtin/name-rev.c:316
 msgid "list all commits reachable from all refs"
 msgstr "llista totes les comissions abastables de totes les referències"
 
-#: builtin/name-rev.c:318
+#: builtin/name-rev.c:317
 msgid "read from stdin"
 msgstr "llegeix d'stdin"
 
-#: builtin/name-rev.c:319
+#: builtin/name-rev.c:318
 msgid "allow to print `undefined` names (default)"
 msgstr "permet imprimir els noms `undefined` (per defecte)"
 
-#: builtin/name-rev.c:325
+#: builtin/name-rev.c:324
 msgid "dereference tags in the input (internal use)"
 msgstr "dereferencia les etiquetes en l'entrada (ús intern)"
 
@@ -9269,9 +9928,9 @@ msgid "failed to finish 'show' for object '%s'"
 msgstr "s'ha fallat en finalitzar 'show' per a l'objecte '%s'"
 
 #: builtin/notes.c:194
-msgid "Please supply the note contents using either -m or -F option"
+msgid "please supply the note contents using either -m or -F option"
 msgstr ""
-"Si us plau, proveïu els continguts de la nota fent servir l'opció -m o "
+"si us plau, proveïu els continguts de la nota fent servir l'opció -m o "
 "l'opció -F"
 
 #: builtin/notes.c:203
@@ -9280,8 +9939,8 @@ msgstr "no s'ha pogut escriure l'objecte de nota"
 
 #: builtin/notes.c:205
 #, c-format
-msgid "The note contents have been left in %s"
-msgstr "Els continguts de la nota s'han deixat en %s"
+msgid "the note contents have been left in %s"
+msgstr "s'han deixat els continguts de la nota en %s"
 
 #: builtin/notes.c:233 builtin/tag.c:439
 #, c-format
@@ -9293,52 +9952,76 @@ msgstr "no es pot llegir '%s'"
 msgid "could not open or read '%s'"
 msgstr "no s'ha pogut obrir o llegir '%s'"
 
+#: builtin/notes.c:254 builtin/notes.c:305 builtin/notes.c:307
+#: builtin/notes.c:372 builtin/notes.c:427 builtin/notes.c:513
+#: builtin/notes.c:518 builtin/notes.c:596 builtin/notes.c:659
+#, c-format
+msgid "failed to resolve '%s' as a valid ref."
+msgstr "s'ha fallat en resoldre '%s' com a referència vàlida."
+
 #: builtin/notes.c:257
 #, c-format
-msgid "Failed to read object '%s'."
-msgstr "S'ha fallat en llegir l'objecte '%s'."
+msgid "failed to read object '%s'."
+msgstr "s'ha fallat en llegir l'objecte '%s'."
 
 #: builtin/notes.c:261
 #, c-format
-msgid "Cannot read note data from non-blob object '%s'."
-msgstr "No es pot llegir les dades de node de l'objecte no de blob '%s'."
+msgid "cannot read note data from non-blob object '%s'."
+msgstr "no es pot llegir les dades de node de l'objecte no de blob '%s'."
+
+#: builtin/notes.c:301
+#, c-format
+msgid "malformed input line: '%s'."
+msgstr "línia d'entrada mal formada: '%s'."
+
+#: builtin/notes.c:316
+#, c-format
+msgid "failed to copy notes from '%s' to '%s'"
+msgstr "s'ha fallat en copiar les notes de '%s' a '%s'"
+
+#. TRANSLATORS: the first %s will be replaced by a
+#. git notes command: 'add', 'merge', 'remove', etc.
+#: builtin/notes.c:345
+#, c-format
+msgid "refusing to %s notes in %s (outside of refs/notes/)"
+msgstr "s'està refusant %s les notes en %s (fora de refs/notes/)"
 
-#: builtin/notes.c:363 builtin/notes.c:418 builtin/notes.c:494
-#: builtin/notes.c:506 builtin/notes.c:582 builtin/notes.c:650
-#: builtin/notes.c:800 builtin/notes.c:947 builtin/notes.c:968
+#: builtin/notes.c:365 builtin/notes.c:420 builtin/notes.c:496
+#: builtin/notes.c:508 builtin/notes.c:584 builtin/notes.c:652
+#: builtin/notes.c:802 builtin/notes.c:949 builtin/notes.c:970
 msgid "too many parameters"
 msgstr "massa paràmetres"
 
-#: builtin/notes.c:376 builtin/notes.c:663
+#: builtin/notes.c:378 builtin/notes.c:665
 #, c-format
-msgid "No note found for object %s."
-msgstr "No s'ha trobat cap nota per a l'objecte %s."
+msgid "no note found for object %s."
+msgstr "no s'ha trobat cap nota per a l'objecte %s."
 
-#: builtin/notes.c:397 builtin/notes.c:560
+#: builtin/notes.c:399 builtin/notes.c:562
 msgid "note contents as a string"
 msgstr "anota els continguts com a cadena"
 
-#: builtin/notes.c:400 builtin/notes.c:563
+#: builtin/notes.c:402 builtin/notes.c:565
 msgid "note contents in a file"
 msgstr "anota els continguts en un fitxer"
 
-#: builtin/notes.c:403 builtin/notes.c:566
+#: builtin/notes.c:405 builtin/notes.c:568
 msgid "reuse and edit specified note object"
 msgstr "reusa i edita l'objecte de nota especificat"
 
-#: builtin/notes.c:406 builtin/notes.c:569
+#: builtin/notes.c:408 builtin/notes.c:571
 msgid "reuse specified note object"
 msgstr "reusa l'objecte de nota especificat"
 
-#: builtin/notes.c:409 builtin/notes.c:572
+#: builtin/notes.c:411 builtin/notes.c:574
 msgid "allow storing empty note"
 msgstr "permet l'emmagatzematge d'una nota buida"
 
-#: builtin/notes.c:410 builtin/notes.c:481
+#: builtin/notes.c:412 builtin/notes.c:483
 msgid "replace existing notes"
 msgstr "reemplaça les notes existents"
 
-#: builtin/notes.c:435
+#: builtin/notes.c:437
 #, c-format
 msgid ""
 "Cannot add notes. Found existing notes for object %s. Use '-f' to overwrite "
@@ -9347,30 +10030,30 @@ msgstr ""
 "No es pot afegir les notes. S'han trobat notes existents de l'objecte %s. "
 "Useu '-f' per a sobreescriure les notes existents."
 
-#: builtin/notes.c:450 builtin/notes.c:529
+#: builtin/notes.c:452 builtin/notes.c:531
 #, c-format
 msgid "Overwriting existing notes for object %s\n"
 msgstr "S'estan sobreescrivint les notes existents de l'objecte %s\n"
 
-#: builtin/notes.c:461 builtin/notes.c:622 builtin/notes.c:887
+#: builtin/notes.c:463 builtin/notes.c:624 builtin/notes.c:889
 #, c-format
 msgid "Removing note for object %s\n"
 msgstr "S'està eliminant la nota de l'objecte %s\n"
 
-#: builtin/notes.c:482
+#: builtin/notes.c:484
 msgid "read objects from stdin"
 msgstr "llegeix els objectes des d'stdin"
 
-#: builtin/notes.c:484
+#: builtin/notes.c:486
 msgid "load rewriting config for <command> (implies --stdin)"
 msgstr ""
 "carrega la configuració de reescriptura per a <ordre> (implica --stdin)"
 
-#: builtin/notes.c:502
+#: builtin/notes.c:504
 msgid "too few parameters"
 msgstr "hi ha massa pocs paràmetres"
 
-#: builtin/notes.c:523
+#: builtin/notes.c:525
 #, c-format
 msgid ""
 "Cannot copy notes. Found existing notes for object %s. Use '-f' to overwrite "
@@ -9379,12 +10062,12 @@ msgstr ""
 "No es pot copiar les notes. S'han trobat notes existents de l'objecte %s. "
 "Useu '-f' per a sobreescriure les notes existents."
 
-#: builtin/notes.c:535
+#: builtin/notes.c:537
 #, c-format
-msgid "Missing notes on source object %s. Cannot copy."
-msgstr "Manquen notes a l'objecte font %s. No es pot copiar."
+msgid "missing notes on source object %s. Cannot copy."
+msgstr "manquen notes a l'objecte font %s. No es pot copiar."
 
-#: builtin/notes.c:587
+#: builtin/notes.c:589
 #, c-format
 msgid ""
 "The -m/-F/-c/-C options have been deprecated for the 'edit' subcommand.\n"
@@ -9393,20 +10076,52 @@ msgstr ""
 "S'han desaprovat les opcions -m/-F/-c/-C en favor de la subordre 'edit'.\n"
 "Si us plau, useu 'git notes add -f -m/-F/-c/-C' en lloc d'això.\n"
 
-#: builtin/notes.c:753
+#: builtin/notes.c:685
+msgid "failed to delete ref NOTES_MERGE_PARTIAL"
+msgstr "s'ha fallat en suprimir la referència NOTES_MERGE_PARTIAL"
+
+#: builtin/notes.c:687
+msgid "failed to delete ref NOTES_MERGE_REF"
+msgstr "s'ha fallat en suprimir la referència NOTES_MERGE_REF"
+
+#: builtin/notes.c:689
+msgid "failed to remove 'git notes merge' worktree"
+msgstr "s'ha fallat en eliminar l'arbre de treball de 'git notes merge'"
+
+#: builtin/notes.c:709
+msgid "failed to read ref NOTES_MERGE_PARTIAL"
+msgstr "s'ha fallat en llegir la referència NOTES_MERGE_PARTIAL"
+
+#: builtin/notes.c:711
+msgid "could not find commit from NOTES_MERGE_PARTIAL."
+msgstr "no s'ha pogut trobar cap comissió de NOTES_MERGE_PARTIAL."
+
+#: builtin/notes.c:713
+msgid "could not parse commit from NOTES_MERGE_PARTIAL."
+msgstr "no s'ha pogut analitzar la comissió de NOTES_MERGE_PARTIAL."
+
+#: builtin/notes.c:726
+msgid "failed to resolve NOTES_MERGE_REF"
+msgstr "s'ha fallat en resoldre NOTES_MERGE_REF"
+
+#: builtin/notes.c:729
+msgid "failed to finalize notes merge"
+msgstr "s'ha fallat en finalitzar la fusió de notes"
+
+#: builtin/notes.c:755
 #, c-format
 msgid "unknown notes merge strategy %s"
 msgstr "estratègia de fusió de notes desconeguda %s"
 
-#: builtin/notes.c:769
+#: builtin/notes.c:771
 msgid "General options"
 msgstr "Opcions generals"
 
-#: builtin/notes.c:771
+#: builtin/notes.c:773
 msgid "Merge options"
 msgstr "Opcions de fusió"
 
-#: builtin/notes.c:773
+#: builtin/notes.c:775
 msgid ""
 "resolve notes conflicts using the given strategy (manual/ours/theirs/union/"
 "cat_sort_uniq)"
@@ -9414,47 +10129,47 @@ msgstr ""
 "resol els conflictes de nota usant l'estratègia donada (manual/ours/theirs/"
 "union/cat_sort_uniq)"
 
-#: builtin/notes.c:775
+#: builtin/notes.c:777
 msgid "Committing unmerged notes"
 msgstr "S'estan cometent les notes sense fusionar"
 
-#: builtin/notes.c:777
+#: builtin/notes.c:779
 msgid "finalize notes merge by committing unmerged notes"
 msgstr "finalitza la fusió de notes cometent les notes sense fusionar"
 
-#: builtin/notes.c:779
+#: builtin/notes.c:781
 msgid "Aborting notes merge resolution"
 msgstr "S'està avortant la resolució de fusió de notes"
 
-#: builtin/notes.c:781
+#: builtin/notes.c:783
 msgid "abort notes merge"
 msgstr "avorta la fusió de notes"
 
-#: builtin/notes.c:792
+#: builtin/notes.c:794
 msgid "cannot mix --commit, --abort or -s/--strategy"
 msgstr "no es pot combinar --commit, --abort i -s/--strategy"
 
-#: builtin/notes.c:797
-msgid "Must specify a notes ref to merge"
-msgstr "Cal especificar una referència de notes a fusionar"
+#: builtin/notes.c:799
+msgid "must specify a notes ref to merge"
+msgstr "cal especificar una referència de notes a fusionar"
 
-#: builtin/notes.c:821
+#: builtin/notes.c:823
 #, c-format
-msgid "Unknown -s/--strategy: %s"
+msgid "unknown -s/--strategy: %s"
 msgstr "-s/--strategy desconeguda: %s"
 
-#: builtin/notes.c:858
+#: builtin/notes.c:860
 #, c-format
-msgid "A notes merge into %s is already in-progress at %s"
-msgstr "Una fusió de notes a %s ja està en curs a %s"
+msgid "a notes merge into %s is already in-progress at %s"
+msgstr "una fusió de notes a %s ja està en curs a %s"
 
-#: builtin/notes.c:861
+#: builtin/notes.c:863
 #, c-format
-msgid "Failed to store link to current notes ref (%s)"
+msgid "failed to store link to current notes ref (%s)"
 msgstr ""
-"S'ha fallat en emmagatzemar l'enllaç a la referència de notes actual (%s)"
+"s'ha fallat en emmagatzemar l'enllaç a la referència de notes actual (%s)"
 
-#: builtin/notes.c:863
+#: builtin/notes.c:865
 #, c-format
 msgid ""
 "Automatic notes merge failed. Fix conflicts in %s and commit the result with "
@@ -9465,239 +10180,235 @@ msgstr ""
 "cometeu el resultat amb 'git notes merge --commit', o avorteu la fusió amb "
 "'git notes merge --abort'.\n"
 
-#: builtin/notes.c:885
+#: builtin/notes.c:887
 #, c-format
 msgid "Object %s has no note\n"
 msgstr "L'objecte %s no té cap nota\n"
 
-#: builtin/notes.c:897
+#: builtin/notes.c:899
 msgid "attempt to remove non-existent note is not an error"
 msgstr "l'intent d'eliminar una nota no existent no és un error"
 
-#: builtin/notes.c:900
+#: builtin/notes.c:902
 msgid "read object names from the standard input"
 msgstr "llegeix els noms d'objecte des de l'entrada estàndard"
 
-#: builtin/notes.c:938 builtin/prune.c:105 builtin/worktree.c:127
+#: builtin/notes.c:940 builtin/prune.c:105 builtin/worktree.c:127
 msgid "do not remove, show only"
 msgstr "no eliminis, només mostra"
 
-#: builtin/notes.c:939
+#: builtin/notes.c:941
 msgid "report pruned notes"
 msgstr "informa de notes podades"
 
-#: builtin/notes.c:981
+#: builtin/notes.c:983
 msgid "notes-ref"
 msgstr "referència de notes"
 
-#: builtin/notes.c:982
+#: builtin/notes.c:984
 msgid "use notes from <notes-ref>"
 msgstr "usa les notes de <referència-de-notes>"
 
-#: builtin/notes.c:1017 builtin/remote.c:1623
+#: builtin/notes.c:1019
 #, c-format
-msgid "Unknown subcommand: %s"
-msgstr "Subordre desconeguda: %s"
+msgid "unknown subcommand: %s"
+msgstr "subordre desconeguda: %s"
 
-#: builtin/pack-objects.c:28
+#: builtin/pack-objects.c:29
 msgid ""
 "git pack-objects --stdout [<options>...] [< <ref-list> | < <object-list>]"
 msgstr ""
 "git pack-objects --stdout [<opcions>...] [< <llista-de-referències> | < "
 "<llista-de-objectes>]"
 
-#: builtin/pack-objects.c:29
+#: builtin/pack-objects.c:30
 msgid ""
 "git pack-objects [<options>...] <base-name> [< <ref-list> | < <object-list>]"
 msgstr ""
 "git pack-objects [<opcions>...] <nom-base> [< <llista-de-referències> | < "
 "<llista-de-objectes>]"
 
-#: builtin/pack-objects.c:177 builtin/pack-objects.c:180
+#: builtin/pack-objects.c:179 builtin/pack-objects.c:182
 #, c-format
 msgid "deflate error (%d)"
 msgstr "error de deflació (%d)"
 
-#: builtin/pack-objects.c:766
+#: builtin/pack-objects.c:768
 msgid "disabling bitmap writing, packs are split due to pack.packSizeLimit"
 msgstr ""
 "s'està inhabilitant l'escriptura de mapes de bits, es divideixen els paquets "
 "a causa de pack.packSizeLimit"
 
-#: builtin/pack-objects.c:779
+#: builtin/pack-objects.c:781
 msgid "Writing objects"
 msgstr "S'estan escrivint els objectes"
 
-#: builtin/pack-objects.c:1037
+#: builtin/pack-objects.c:1070
 msgid "disabling bitmap writing, as some objects are not being packed"
 msgstr ""
 "s'està inhabilitant l'escriptura de mapes de bits, perquè alguns objectes no "
 "s'empaqueten"
 
-#: builtin/pack-objects.c:2197
+#: builtin/pack-objects.c:2346
 msgid "Compressing objects"
 msgstr "S'estan comprimint objectes"
 
-#: builtin/pack-objects.c:2611
+#: builtin/pack-objects.c:2759
 #, c-format
 msgid "unsupported index version %s"
 msgstr "versió d'índex no compatible %s"
 
-#: builtin/pack-objects.c:2615
+#: builtin/pack-objects.c:2763
 #, c-format
 msgid "bad index version '%s'"
 msgstr "versió d'índex dolenta '%s'"
 
-#: builtin/pack-objects.c:2645
+#: builtin/pack-objects.c:2793
 msgid "do not show progress meter"
 msgstr "no mostris l'indicador de progrés"
 
-#: builtin/pack-objects.c:2647
+#: builtin/pack-objects.c:2795
 msgid "show progress meter"
 msgstr "mostra l'indicador de progrés"
 
-#: builtin/pack-objects.c:2649
+#: builtin/pack-objects.c:2797
 msgid "show progress meter during object writing phase"
 msgstr "mostra l'indicador de progrés durant la fase d'escriptura d'objectes"
 
-#: builtin/pack-objects.c:2652
+#: builtin/pack-objects.c:2800
 msgid "similar to --all-progress when progress meter is shown"
 msgstr "similar a --all-progress quan l'indicador de progrés es mostra"
 
-#: builtin/pack-objects.c:2653
+#: builtin/pack-objects.c:2801
 msgid "version[,offset]"
 msgstr "versió[,desplaçament]"
 
-#: builtin/pack-objects.c:2654
+#: builtin/pack-objects.c:2802
 msgid "write the pack index file in the specified idx format version"
 msgstr ""
 "escriu el fitxer d'índex de paquet en la versió de format d'índex "
 "especificada"
 
-#: builtin/pack-objects.c:2657
+#: builtin/pack-objects.c:2805
 msgid "maximum size of each output pack file"
 msgstr "mida màxima de cada fitxer de paquet de sortida"
 
-#: builtin/pack-objects.c:2659
+#: builtin/pack-objects.c:2807
 msgid "ignore borrowed objects from alternate object store"
 msgstr ""
 "ignora els objectes prestats d'un emmagatzemament d'objectes alternatiu"
 
-#: builtin/pack-objects.c:2661
+#: builtin/pack-objects.c:2809
 msgid "ignore packed objects"
 msgstr "ignora els objectes empaquetats"
 
-#: builtin/pack-objects.c:2663
+#: builtin/pack-objects.c:2811
 msgid "limit pack window by objects"
 msgstr "limita la finestra d'empaquetament per objectes"
 
-#: builtin/pack-objects.c:2665
+#: builtin/pack-objects.c:2813
 msgid "limit pack window by memory in addition to object limit"
 msgstr ""
 "limita la finestra d'empaquetament per memòria a més del límit d'objectes"
 
-#: builtin/pack-objects.c:2667
+#: builtin/pack-objects.c:2815
 msgid "maximum length of delta chain allowed in the resulting pack"
 msgstr "longitud màxima de la cadena de deltes permesa en el paquet resultant"
 
-#: builtin/pack-objects.c:2669
+#: builtin/pack-objects.c:2817
 msgid "reuse existing deltas"
 msgstr "reusa les deltes existents"
 
-#: builtin/pack-objects.c:2671
+#: builtin/pack-objects.c:2819
 msgid "reuse existing objects"
 msgstr "reusa els objectes existents"
 
-#: builtin/pack-objects.c:2673
+#: builtin/pack-objects.c:2821
 msgid "use OFS_DELTA objects"
 msgstr "usa objectes OFS_DELTA"
 
-#: builtin/pack-objects.c:2675
+#: builtin/pack-objects.c:2823
 msgid "use threads when searching for best delta matches"
 msgstr "usa fils en cercar les millores coincidències de delta"
 
-#: builtin/pack-objects.c:2677
+#: builtin/pack-objects.c:2825
 msgid "do not create an empty pack output"
 msgstr "no creïs una emissió de paquet buida"
 
-#: builtin/pack-objects.c:2679
+#: builtin/pack-objects.c:2827
 msgid "read revision arguments from standard input"
 msgstr "llegeix els paràmetres de revisió des de l'entrada estàndard"
 
-#: builtin/pack-objects.c:2681
+#: builtin/pack-objects.c:2829
 msgid "limit the objects to those that are not yet packed"
 msgstr "limita els objectes als quals encara no s'hagin empaquetat"
 
-#: builtin/pack-objects.c:2684
+#: builtin/pack-objects.c:2832
 msgid "include objects reachable from any reference"
 msgstr "inclou els objectes abastables de qualsevulla referència"
 
-#: builtin/pack-objects.c:2687
+#: builtin/pack-objects.c:2835
 msgid "include objects referred by reflog entries"
 msgstr ""
 "inclou els objectes als quals facin referència les entrades del registre de "
 "referències"
 
-#: builtin/pack-objects.c:2690
+#: builtin/pack-objects.c:2838
 msgid "include objects referred to by the index"
 msgstr "inclou els objectes als quals faci referència l'índex"
 
-#: builtin/pack-objects.c:2693
+#: builtin/pack-objects.c:2841
 msgid "output pack to stdout"
 msgstr "emet el paquet a stdout"
 
-#: builtin/pack-objects.c:2695
+#: builtin/pack-objects.c:2843
 msgid "include tag objects that refer to objects to be packed"
 msgstr ""
 "inclou els objectes d'etiqueta que facin referència als objectes a empaquetar"
 
-#: builtin/pack-objects.c:2697
+#: builtin/pack-objects.c:2845
 msgid "keep unreachable objects"
 msgstr "retén els objectes inabastables"
 
-#: builtin/pack-objects.c:2699
+#: builtin/pack-objects.c:2847
 msgid "pack loose unreachable objects"
 msgstr "empaqueta els objectes inabastables solts"
 
-#: builtin/pack-objects.c:2700 parse-options.h:142
-msgid "time"
-msgstr "hora"
-
-#: builtin/pack-objects.c:2701
+#: builtin/pack-objects.c:2849
 msgid "unpack unreachable objects newer than <time>"
 msgstr "desempaqueta els objectes inabastables més nous que <hora>"
 
-#: builtin/pack-objects.c:2704
+#: builtin/pack-objects.c:2852
 msgid "create thin packs"
 msgstr "crea paquets prims"
 
-#: builtin/pack-objects.c:2706
+#: builtin/pack-objects.c:2854
 msgid "create packs suitable for shallow fetches"
 msgstr "crea paquets adequats per a les obtencions superficials"
 
-#: builtin/pack-objects.c:2708
+#: builtin/pack-objects.c:2856
 msgid "ignore packs that have companion .keep file"
 msgstr "ignora els paquets que tinguin un fitxer .keep corresponent"
 
-#: builtin/pack-objects.c:2710
+#: builtin/pack-objects.c:2858
 msgid "pack compression level"
 msgstr "nivell de compressió de paquet"
 
-#: builtin/pack-objects.c:2712
+#: builtin/pack-objects.c:2860
 msgid "do not hide commits by grafts"
 msgstr "no amaguis les comissions per empelt"
 
-#: builtin/pack-objects.c:2714
+#: builtin/pack-objects.c:2862
 msgid "use a bitmap index if available to speed up counting objects"
 msgstr ""
 "usa un índex de mapa de bits, si està disponible, per a accelerar el "
 "recompte d'objectes"
 
-#: builtin/pack-objects.c:2716
+#: builtin/pack-objects.c:2864
 msgid "write a bitmap index together with the pack index"
 msgstr "escriu un índex de mapa de bits junt amb l'índex de paquet"
 
-#: builtin/pack-objects.c:2829
+#: builtin/pack-objects.c:2993
 msgid "Counting objects"
 msgstr "S'estan comptant els objectes"
 
@@ -9737,53 +10448,45 @@ msgstr "fes caducar els objectes més vells que <hora>"
 msgid "cannot prune in a precious-objects repo"
 msgstr "no es pot podar en un dipòsit d'objectes preciosos"
 
-#: builtin/pull.c:72
+#: builtin/pull.c:51 builtin/pull.c:53
+#, c-format
+msgid "Invalid value for %s: %s"
+msgstr "Valor no vàlid per a %s: %s"
+
+#: builtin/pull.c:73
 msgid "git pull [<options>] [<repository> [<refspec>...]]"
-msgstr "git pull [opcions] [<dipòsit> [<especificació-de-referència>...]]"
+msgstr "git pull [<opcions>] [<dipòsit> [<especificació-de-referència>...]]"
 
-#: builtin/pull.c:120
+#: builtin/pull.c:121
 msgid "Options related to merging"
 msgstr "Opcions relacionades amb fusionar"
 
-#: builtin/pull.c:123
+#: builtin/pull.c:124
 msgid "incorporate changes by rebasing rather than merging"
 msgstr "incorpora els canvis per rebasar en lloc de fusionar"
 
-#: builtin/pull.c:147 builtin/revert.c:101
+#: builtin/pull.c:148 builtin/revert.c:101
 msgid "allow fast-forward"
 msgstr "permet l'avanç ràpid"
 
-#: builtin/pull.c:156
+#: builtin/pull.c:157
 msgid "automatically stash/stash pop before and after rebase"
 msgstr "automàticament emmagatzema/desempila abans i després de rebasament"
 
-#: builtin/pull.c:172
+#: builtin/pull.c:173
 msgid "Options related to fetching"
 msgstr "Opcions relacionades amb obtenir"
 
-#: builtin/pull.c:194
+#: builtin/pull.c:195
 msgid "number of submodules pulled in parallel"
 msgstr "nombre de submòduls baixats en paral·lel"
 
-#: builtin/pull.c:283
+#: builtin/pull.c:284
 #, c-format
 msgid "Invalid value for pull.ff: %s"
 msgstr "Valor no vàlid per a pull.ff: %s"
 
-#: builtin/pull.c:379 git-sh-setup.sh:226
-msgid "Cannot pull with rebase: You have unstaged changes."
-msgstr "No es pot baixar amb rebasament: Teniu canvis no allistats."
-
-#: builtin/pull.c:385 git-sh-setup.sh:252
-msgid "Additionally, your index contains uncommitted changes."
-msgstr "Addicionalment, el vostre índex conté canvis sense cometre."
-
-#: builtin/pull.c:387 git-sh-setup.sh:245
-msgid "Cannot pull with rebase: Your index contains uncommitted changes."
-msgstr ""
-"No es pot baixar amb rebasament: El vostre índex conté canvis sense cometre."
-
-#: builtin/pull.c:463
+#: builtin/pull.c:397
 msgid ""
 "There is no candidate for rebasing against among the refs that you just "
 "fetched."
@@ -9791,13 +10494,13 @@ msgstr ""
 "No hi ha cap candidat sobre el qual rebasar entre les referències que acabeu "
 "d'obtenir."
 
-#: builtin/pull.c:465
+#: builtin/pull.c:399
 msgid ""
 "There are no candidates for merging among the refs that you just fetched."
 msgstr ""
 "No hi ha candidats per a fusionar entre les referències que acabeu d'obtenir."
 
-#: builtin/pull.c:466
+#: builtin/pull.c:400
 msgid ""
 "Generally this means that you provided a wildcard refspec which had no\n"
 "matches on the remote end."
@@ -9805,7 +10508,7 @@ msgstr ""
 "Generalment això vol dir que heu proveït una especificació de\n"
 "referència de comodí que no tenia cap coincidència en el costat remot."
 
-#: builtin/pull.c:469
+#: builtin/pull.c:403
 #, c-format
 msgid ""
 "You asked to pull from the remote '%s', but did not specify\n"
@@ -9816,44 +10519,44 @@ msgstr ""
 "Perquè aquest no és el remot configurat per defecte per a la vostra\n"
 "branca actual, heu d'especificar una branca en la línia d'ordres."
 
-#: builtin/pull.c:474 git-parse-remote.sh:73
+#: builtin/pull.c:408 git-parse-remote.sh:73
 msgid "You are not currently on a branch."
 msgstr "Actualment no sou en cap branca."
 
-#: builtin/pull.c:476 builtin/pull.c:491 git-parse-remote.sh:79
+#: builtin/pull.c:410 builtin/pull.c:425 git-parse-remote.sh:79
 msgid "Please specify which branch you want to rebase against."
 msgstr "Si us plau, especifiqueu sobre què branca voleu rebasar."
 
-#: builtin/pull.c:478 builtin/pull.c:493 git-parse-remote.sh:82
+#: builtin/pull.c:412 builtin/pull.c:427 git-parse-remote.sh:82
 msgid "Please specify which branch you want to merge with."
 msgstr "Si us plau, especifiqueu amb què branca voleu fusionar."
 
-#: builtin/pull.c:479 builtin/pull.c:494
+#: builtin/pull.c:413 builtin/pull.c:428
 msgid "See git-pull(1) for details."
 msgstr "Vegeu git-pull(1) per detalls."
 
-#: builtin/pull.c:481 builtin/pull.c:487 builtin/pull.c:496
+#: builtin/pull.c:415 builtin/pull.c:421 builtin/pull.c:430
 #: git-parse-remote.sh:64
 msgid "<remote>"
 msgstr "<remot>"
 
-#: builtin/pull.c:481 builtin/pull.c:496 builtin/pull.c:501 git-rebase.sh:451
+#: builtin/pull.c:415 builtin/pull.c:430 builtin/pull.c:435 git-rebase.sh:451
 #: git-parse-remote.sh:65
 msgid "<branch>"
 msgstr "<branca>"
 
-#: builtin/pull.c:489 git-parse-remote.sh:75
+#: builtin/pull.c:423 git-parse-remote.sh:75
 msgid "There is no tracking information for the current branch."
 msgstr "No hi ha cap informació de seguiment per a la branca actual."
 
-#: builtin/pull.c:498 git-parse-remote.sh:95
+#: builtin/pull.c:432 git-parse-remote.sh:95
 msgid ""
 "If you wish to set tracking information for this branch you can do so with:"
 msgstr ""
 "Si voleu establir informació de seguiment per a aquesta branca, podeu fer-ho "
 "amb:"
 
-#: builtin/pull.c:503
+#: builtin/pull.c:437
 #, c-format
 msgid ""
 "Your configuration specifies to merge with the ref '%s'\n"
@@ -9862,20 +10565,28 @@ msgstr ""
 "La vostra configuració especifica fusionar amb la referència '%s'\n"
 "del remot, però no s'ha obtingut tal referència."
 
-#: builtin/pull.c:820
+#: builtin/pull.c:754
 msgid "ignoring --verify-signatures for rebase"
 msgstr "s'està ignorant --verify-signatures per a rebasar"
 
-#: builtin/pull.c:867
+#: builtin/pull.c:801
 msgid "--[no-]autostash option is only valid with --rebase."
 msgstr "l'opció --[no-]-autostash és vàlid només amb --rebase."
 
-#: builtin/pull.c:875
+#: builtin/pull.c:809
 msgid "Updating an unborn branch with changes added to the index."
 msgstr ""
 "S'està actualitzant una branca no nascuda amb canvis afegits a l'índex."
 
-#: builtin/pull.c:903
+#: builtin/pull.c:812
+msgid "pull with rebase"
+msgstr "baixar amb rebasament"
+
+#: builtin/pull.c:813
+msgid "please commit or stash them."
+msgstr "si us plau, cometeu-los o emmagatzemeu-los."
+
+#: builtin/pull.c:838
 #, c-format
 msgid ""
 "fetch updated the current branch head.\n"
@@ -9886,7 +10597,7 @@ msgstr ""
 "s'està avançant ràpidament el vostre arbre de treball des de\n"
 "la comissió %s."
 
-#: builtin/pull.c:908
+#: builtin/pull.c:843
 #, c-format
 msgid ""
 "Cannot fast-forward your working tree.\n"
@@ -9904,11 +10615,11 @@ msgstr ""
 "$ git reset --hard\n"
 "per a recuperar."
 
-#: builtin/pull.c:923
+#: builtin/pull.c:858
 msgid "Cannot merge multiple branches into empty head."
 msgstr "No es pot fusionar múltiples branques a un cap buit."
 
-#: builtin/pull.c:927
+#: builtin/pull.c:862
 msgid "Cannot rebase onto multiple branches."
 msgstr "No es pot rebasar sobre múltiples branques."
 
@@ -10286,15 +10997,68 @@ msgstr "salta l'aplicació del filtre d'agafament parcial"
 msgid "debug unpack-trees"
 msgstr "depura unpack-trees"
 
-#: builtin/receive-pack.c:25
+#: builtin/receive-pack.c:26
 msgid "git receive-pack <git-dir>"
 msgstr "git receive-pack <git-dir>"
 
-#: builtin/receive-pack.c:1843
+#: builtin/receive-pack.c:793
+msgid ""
+"By default, updating the current branch in a non-bare repository\n"
+"is denied, because it will make the index and work tree inconsistent\n"
+"with what you pushed, and will require 'git reset --hard' to match\n"
+"the work tree to HEAD.\n"
+"\n"
+"You can set 'receive.denyCurrentBranch' configuration variable to\n"
+"'ignore' or 'warn' in the remote repository to allow pushing into\n"
+"its current branch; however, this is not recommended unless you\n"
+"arranged to update its work tree to match what you pushed in some\n"
+"other way.\n"
+"\n"
+"To squelch this message and still keep the default behaviour, set\n"
+"'receive.denyCurrentBranch' configuration variable to 'refuse'."
+msgstr ""
+"Per defecte, es denega actualizar la branca actual en un dipòsit no\n"
+"nu, perquè feria l'índex i l'arbre de treball inconsistents amb el\n"
+"que hàgiu pujat, i requerria 'git reset --hard' per a fer que\n"
+"l'arbre de treball coincideixi amb HEAD.\n"
+"\n"
+"Podeu establir la variable de configuració\n"
+"'receive.denyCurrentBranch' a 'ignore' o 'warn' en el dipòsit remot\n"
+"per a permetre pujar a la seva branca actual; no obstant, no es\n"
+"recomana això a menys que hàgiu decidit actualitzar el seu arbre en\n"
+"alguna altra manera per a coincidar amb el que hàgiu pujat.\n"
+"\n"
+"Per a silenciar aquest missatge i encara retenir el comportament\n"
+"predeterminat, establiu la variable de configuració\n"
+"'receive.denyCurrentBranch' a 'refuse'."
+
+#: builtin/receive-pack.c:813
+msgid ""
+"By default, deleting the current branch is denied, because the next\n"
+"'git clone' won't result in any file checked out, causing confusion.\n"
+"\n"
+"You can set 'receive.denyDeleteCurrent' configuration variable to\n"
+"'warn' or 'ignore' in the remote repository to allow deleting the\n"
+"current branch, with or without a warning message.\n"
+"\n"
+"To squelch this message, you can set it to 'refuse'."
+msgstr ""
+"Per defecte, es denega suprimir la branca actual, perquè el\n"
+"'git clone' següent no resultarà en cap fitxer agafat, causant\n"
+"confusió.\n"
+"\n"
+"Podeu establir la variable de configuració\n"
+"'receive.denyDeleteCurrent' a 'warn' o 'ignore' en el dipòsit remot\n"
+"per a permetre suprimir la branca actual, amb o sense un missatge\n"
+"d'advertència.\n"
+"\n"
+"Per a silenciar aquest missatge, podeu establir-la a 'refuse'."
+
+#: builtin/receive-pack.c:1883
 msgid "quiet"
 msgstr "callat"
 
-#: builtin/receive-pack.c:1857
+#: builtin/receive-pack.c:1897
 msgid "You must specify a directory."
 msgstr "Heu d'especificar un directori."
 
@@ -10628,7 +11392,7 @@ msgstr "* remot %s"
 msgid "  Fetch URL: %s"
 msgstr "  URL d'obtenció: %s"
 
-#: builtin/remote.c:1143 builtin/remote.c:1156 builtin/remote.c:1296
+#: builtin/remote.c:1143 builtin/remote.c:1156 builtin/remote.c:1295
 msgid "(no URL)"
 msgstr "(sense URL)"
 
@@ -10666,7 +11430,7 @@ msgid_plural "  Remote branches:%s"
 msgstr[0] "  Branca remota:%s"
 msgstr[1] "  Branques remotes:%s"
 
-#: builtin/remote.c:1179 builtin/remote.c:1206
+#: builtin/remote.c:1179 builtin/remote.c:1205
 msgid " (status not queried)"
 msgstr " (estat no consultat)"
 
@@ -10680,140 +11444,145 @@ msgstr[1] "  Branques locals configurades per a 'git pull':"
 msgid "  Local refs will be mirrored by 'git push'"
 msgstr "  'git push' reflectirà les referències locals"
 
-#: builtin/remote.c:1203
+#: builtin/remote.c:1202
 #, c-format
 msgid "  Local ref configured for 'git push'%s:"
 msgid_plural "  Local refs configured for 'git push'%s:"
 msgstr[0] "  Referència local configurada per a 'git push'%s:"
 msgstr[1] "  Referències locals configurades per a 'git push'%s:"
 
-#: builtin/remote.c:1224
+#: builtin/remote.c:1223
 msgid "set refs/remotes/<name>/HEAD according to remote"
 msgstr "estableix refs/remotes/<name>/HEAD segons el remot"
 
-#: builtin/remote.c:1226
+#: builtin/remote.c:1225
 msgid "delete refs/remotes/<name>/HEAD"
 msgstr "suprimeix refs/remotes/<name>/HEAD"
 
-#: builtin/remote.c:1241
+#: builtin/remote.c:1240
 msgid "Cannot determine remote HEAD"
 msgstr "No es pot determinar el HEAD remot"
 
-#: builtin/remote.c:1243
+#: builtin/remote.c:1242
 msgid "Multiple remote HEAD branches. Please choose one explicitly with:"
 msgstr ""
 "Múltiples branques de HEAD remotes. Si us plau, trieu-ne una explícitament "
 "amb:"
 
-#: builtin/remote.c:1253
+#: builtin/remote.c:1252
 #, c-format
 msgid "Could not delete %s"
 msgstr "No s'ha pogut suprimir %s"
 
-#: builtin/remote.c:1261
+#: builtin/remote.c:1260
 #, c-format
 msgid "Not a valid ref: %s"
 msgstr "No és una referència vàlida: %s"
 
-#: builtin/remote.c:1263
+#: builtin/remote.c:1262
 #, c-format
 msgid "Could not setup %s"
 msgstr "No s'ha pogut configurar %s"
 
-#: builtin/remote.c:1281
+#: builtin/remote.c:1280
 #, c-format
 msgid " %s will become dangling!"
 msgstr " %s es tornarà penjant!"
 
-#: builtin/remote.c:1282
+#: builtin/remote.c:1281
 #, c-format
 msgid " %s has become dangling!"
 msgstr " %s s'ha tornat penjant!"
 
-#: builtin/remote.c:1292
+#: builtin/remote.c:1291
 #, c-format
 msgid "Pruning %s"
 msgstr "S'està podant %s"
 
-#: builtin/remote.c:1293
+#: builtin/remote.c:1292
 #, c-format
 msgid "URL: %s"
 msgstr "URL: %s"
 
-#: builtin/remote.c:1309
+#: builtin/remote.c:1308
 #, c-format
 msgid " * [would prune] %s"
 msgstr " * [podaria] %s"
 
-#: builtin/remote.c:1312
+#: builtin/remote.c:1311
 #, c-format
 msgid " * [pruned] %s"
 msgstr " * [podat] %s"
 
-#: builtin/remote.c:1357
+#: builtin/remote.c:1356
 msgid "prune remotes after fetching"
 msgstr "poda els remots després d'obtenir-los"
 
-#: builtin/remote.c:1420 builtin/remote.c:1474 builtin/remote.c:1542
+#: builtin/remote.c:1419 builtin/remote.c:1473 builtin/remote.c:1541
 #, c-format
 msgid "No such remote '%s'"
 msgstr "No hi ha tal remot '%s'"
 
-#: builtin/remote.c:1436
+#: builtin/remote.c:1435
 msgid "add branch"
 msgstr "afegeix branca"
 
-#: builtin/remote.c:1443
+#: builtin/remote.c:1442
 msgid "no remote specified"
 msgstr "cap remot especificat"
 
-#: builtin/remote.c:1460
+#: builtin/remote.c:1459
 msgid "query push URLs rather than fetch URLs"
-msgstr "consulta els URL de pujada en lloc dels URL d'obteniment"
+msgstr "consulta els URL de pujada en lloc dels URL d'obtenció"
 
-#: builtin/remote.c:1462
+#: builtin/remote.c:1461
 msgid "return all URLs"
 msgstr "retorna tots els URL"
 
-#: builtin/remote.c:1490
+#: builtin/remote.c:1489
 #, c-format
 msgid "no URLs configured for remote '%s'"
 msgstr "cap URL configurat per al remot '%s'"
 
-#: builtin/remote.c:1516
+#: builtin/remote.c:1515
 msgid "manipulate push URLs"
 msgstr "manipula els URL de pujada"
 
-#: builtin/remote.c:1518
+#: builtin/remote.c:1517
 msgid "add URL"
 msgstr "afegeix URL"
 
-#: builtin/remote.c:1520
+#: builtin/remote.c:1519
 msgid "delete URLs"
 msgstr "suprimeix URLs"
 
-#: builtin/remote.c:1527
+#: builtin/remote.c:1526
 msgid "--add --delete doesn't make sense"
 msgstr "--add --delete no té sentit"
 
-#: builtin/remote.c:1568
+#: builtin/remote.c:1567
 #, c-format
 msgid "Invalid old URL pattern: %s"
 msgstr "Patró d'URL antic no vàlid: %s"
 
-#: builtin/remote.c:1576
+#: builtin/remote.c:1575
 #, c-format
 msgid "No such URL found: %s"
 msgstr "No s'ha trobat tal URL: %s"
 
-#: builtin/remote.c:1578
+#: builtin/remote.c:1577
 msgid "Will not delete all non-push URLs"
 msgstr "No se suprimiran tots els URL no de pujada"
 
-#: builtin/remote.c:1592
+#: builtin/remote.c:1591
 msgid "be verbose; must be placed before a subcommand"
 msgstr "sigues detallat; s'ha de col·locar abans d'una subordre"
 
+#: builtin/remote.c:1622
+#, c-format
+msgid "Unknown subcommand: %s"
+msgstr "Subordre desconeguda: %s"
+
 #: builtin/repack.c:17
 msgid "git repack [<options>]"
 msgstr "git repack [<opcions>]"
@@ -11002,8 +11771,8 @@ msgstr ""
 "git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [<comissió>]"
 
 #: builtin/reset.c:27
-msgid "git reset [-q] <tree-ish> [--] <paths>..."
-msgstr "git reset [-q] <arbre> [--] <camins>..."
+msgid "git reset [-q] [<tree-ish>] [--] <paths>..."
+msgstr "git reset [-q] [<arbre>] [--] <camins>..."
 
 #: builtin/reset.c:28
 msgid "git reset --patch [<tree-ish>] [--] [<paths>...]"
@@ -11123,27 +11892,27 @@ msgstr "No s'ha pogut restablir el fitxer d'índex a la revisió '%s'."
 msgid "Could not write new index file."
 msgstr "No s'ha pogut escriure el fitxer d'índex nou."
 
-#: builtin/rev-list.c:362
+#: builtin/rev-list.c:354
 msgid "rev-list does not support display of notes"
 msgstr "el rev-list no permet mostrar notes"
 
-#: builtin/rev-parse.c:358
+#: builtin/rev-parse.c:386
 msgid "git rev-parse --parseopt [<options>] -- [<args>...]"
 msgstr "git rev-parse --parseopt [<opcions>] -- [<paràmetres>...]"
 
-#: builtin/rev-parse.c:363
+#: builtin/rev-parse.c:391
 msgid "keep the `--` passed as an arg"
 msgstr "retén el `--` passat com a paràmetre"
 
-#: builtin/rev-parse.c:365
+#: builtin/rev-parse.c:393
 msgid "stop parsing after the first non-option argument"
 msgstr "deixa d'analitzar després del primer paràmetre no d'opció"
 
-#: builtin/rev-parse.c:368
+#: builtin/rev-parse.c:396
 msgid "output in stuck long form"
 msgstr "emet en forma llarga enganxada"
 
-#: builtin/rev-parse.c:499
+#: builtin/rev-parse.c:527
 msgid ""
 "git rev-parse --parseopt [<options>] -- [<args>...]\n"
 "   or: git rev-parse --sq-quote [<arg>...]\n"
@@ -11235,7 +12004,7 @@ msgstr "retén les comissions redundants i buides"
 msgid "revert failed"
 msgstr "la reversió ha fallat"
 
-#: builtin/revert.c:207
+#: builtin/revert.c:205
 msgid "cherry-pick failed"
 msgstr "el recull de cireres ha fallat"
 
@@ -11406,70 +12175,125 @@ msgstr ""
 msgid "git show-branch (-g | --reflog)[=<n>[,<base>]] [--list] [<ref>]"
 msgstr "git show-branch (-g | --reflog)[=<n>[,<base>]] [--list] [<referència>]"
 
-#: builtin/show-branch.c:640
+#: builtin/show-branch.c:375
+#, c-format
+msgid "ignoring %s; cannot handle more than %d ref"
+msgid_plural "ignoring %s; cannot handle more than %d refs"
+msgstr[0] "s'està ignorant %s; no es pot gestionar més de %d referència"
+msgstr[1] "s'està ignorant %s; no es poden gestionar més de %d referències"
+
+#: builtin/show-branch.c:541
+#, c-format
+msgid "no matching refs with %s"
+msgstr "no hi ha referències coincidents amb %s"
+
+#: builtin/show-branch.c:639
 msgid "show remote-tracking and local branches"
 msgstr "mostra les branques amb seguiment remot i les locals"
 
-#: builtin/show-branch.c:642
+#: builtin/show-branch.c:641
 msgid "show remote-tracking branches"
 msgstr "mostra les branques amb seguiment remot"
 
-#: builtin/show-branch.c:644
+#: builtin/show-branch.c:643
 msgid "color '*!+-' corresponding to the branch"
 msgstr "colora '*!+-' corresponent a la branca"
 
-#: builtin/show-branch.c:646
+#: builtin/show-branch.c:645
 msgid "show <n> more commits after the common ancestor"
 msgstr "mostra <n> comissions després de l'avantpassat comú"
 
-#: builtin/show-branch.c:648
+#: builtin/show-branch.c:647
 msgid "synonym to more=-1"
 msgstr "sinònim de more=-1"
 
-#: builtin/show-branch.c:649
+#: builtin/show-branch.c:648
 msgid "suppress naming strings"
 msgstr "omet l'anomenament de cadenes"
 
-#: builtin/show-branch.c:651
+#: builtin/show-branch.c:650
 msgid "include the current branch"
 msgstr "inclou la branca actual"
 
-#: builtin/show-branch.c:653
+#: builtin/show-branch.c:652
 msgid "name commits with their object names"
 msgstr "anomena les comissions amb els seus noms d'objecte"
 
-#: builtin/show-branch.c:655
+#: builtin/show-branch.c:654
 msgid "show possible merge bases"
 msgstr "mostra les bases de fusió possibles"
 
-#: builtin/show-branch.c:657
+#: builtin/show-branch.c:656
 msgid "show refs unreachable from any other ref"
 msgstr "mostra les referències inabastables de qualsevulla altra referència"
 
-#: builtin/show-branch.c:659
+#: builtin/show-branch.c:658
 msgid "show commits in topological order"
 msgstr "mostra les comissions en ordre topològic"
 
-#: builtin/show-branch.c:662
+#: builtin/show-branch.c:661
 msgid "show only commits not on the first branch"
 msgstr "mostra només les comissions que no siguin en la primera branca"
 
-#: builtin/show-branch.c:664
+#: builtin/show-branch.c:663
 msgid "show merges reachable from only one tip"
 msgstr "mostra les fusions abastables de només una punta"
 
-#: builtin/show-branch.c:666
+#: builtin/show-branch.c:665
 msgid "topologically sort, maintaining date order where possible"
 msgstr "ordena topològicament, mantenint l'ordre de dates on sigui possible"
 
-#: builtin/show-branch.c:669
+#: builtin/show-branch.c:668
 msgid "<n>[,<base>]"
 msgstr "<n>[,<base>]"
 
-#: builtin/show-branch.c:670
+#: builtin/show-branch.c:669
 msgid "show <n> most recent ref-log entries starting at base"
 msgstr "mostra les <n> entrades més recents començant a la base"
 
+#: builtin/show-branch.c:703
+msgid ""
+"--reflog is incompatible with --all, --remotes, --independent or --merge-base"
+msgstr ""
+"--reflog és incompatible amb --all, --remotes, --independent o --merge-base"
+
+#: builtin/show-branch.c:727
+msgid "no branches given, and HEAD is not valid"
+msgstr "no s'ha donat cap branca, i HEAD no és vàlid"
+
+#: builtin/show-branch.c:730
+msgid "--reflog option needs one branch name"
+msgstr "l'opció --reflog necessita un nom de branca"
+
+#: builtin/show-branch.c:733
+#, c-format
+msgid "only %d entry can be shown at one time."
+msgid_plural "only %d entries can be shown at one time."
+msgstr[0] "es pot mostrar només %d entrada a la vegada."
+msgstr[1] "es poden mostrar només %d entrades a la vegada."
+
+#: builtin/show-branch.c:737
+#, c-format
+msgid "no such ref %s"
+msgstr "no hi ha tal referència %s"
+
+#: builtin/show-branch.c:829
+#, c-format
+msgid "cannot handle more than %d rev."
+msgid_plural "cannot handle more than %d revs."
+msgstr[0] "no es pot gestionar més d'%d revisió."
+msgstr[1] "no es poden gestionar més de %d revisions."
+
+#: builtin/show-branch.c:833
+#, c-format
+msgid "'%s' is not a valid ref."
+msgstr "'%s' no és una referència vàlida."
+
+#: builtin/show-branch.c:836
+#, c-format
+msgid "cannot find commit %s (%s)"
+msgstr "no es pot trobar la comissió %s (%s)"
+
 #: builtin/show-ref.c:10
 msgid ""
 "git show-ref [-q | --quiet] [--verify] [--head] [-d | --dereference] [-s | --"
@@ -11533,12 +12357,12 @@ msgstr ""
 msgid "prepend comment character and space to each line"
 msgstr "anteposa el caràcter de comentari i un espai a cada línia"
 
-#: builtin/submodule--helper.c:24 builtin/submodule--helper.c:923
+#: builtin/submodule--helper.c:24 builtin/submodule--helper.c:1046
 #, c-format
 msgid "No such ref: %s"
 msgstr "No hi ha tal referència: %s"
 
-#: builtin/submodule--helper.c:31 builtin/submodule--helper.c:932
+#: builtin/submodule--helper.c:31 builtin/submodule--helper.c:1055
 #, c-format
 msgid "Expecting a full ref name, got %s"
 msgstr "S'espera un nom de referència ple, s'ha rebut %s"
@@ -11548,77 +12372,96 @@ msgstr "S'espera un nom de referència ple, s'ha rebut %s"
 msgid "cannot strip one component off url '%s'"
 msgstr "no es pot despullar un component de l'url '%s'"
 
-#: builtin/submodule--helper.c:278 builtin/submodule--helper.c:403
-#: builtin/submodule--helper.c:483
+#: builtin/submodule--helper.c:282 builtin/submodule--helper.c:408
+#: builtin/submodule--helper.c:590
 msgid "alternative anchor for relative paths"
 msgstr "àncora alternativa per als camins relatius"
 
-#: builtin/submodule--helper.c:283
+#: builtin/submodule--helper.c:287
 msgid "git submodule--helper list [--prefix=<path>] [<path>...]"
 msgstr "git submodule--helper list [--prefix=<camí>] [<camí>...]"
 
-#: builtin/submodule--helper.c:324 builtin/submodule--helper.c:338
+#: builtin/submodule--helper.c:329 builtin/submodule--helper.c:343
 #, c-format
 msgid "No url found for submodule path '%s' in .gitmodules"
 msgstr "No s'ha trobat cap url per al camí de submòdul '%s' a .gitmodules"
 
-#: builtin/submodule--helper.c:364
+#: builtin/submodule--helper.c:369
 #, c-format
 msgid "Failed to register url for submodule path '%s'"
 msgstr "S'ha fallat en registrar l'url per al camí de submòdul '%s'"
 
-#: builtin/submodule--helper.c:368
+#: builtin/submodule--helper.c:373
 #, c-format
 msgid "Submodule '%s' (%s) registered for path '%s'\n"
 msgstr "S'ha registrat el submòdul '%s' (%s) per al camí '%s'\n"
 
-#: builtin/submodule--helper.c:378
+#: builtin/submodule--helper.c:383
 #, c-format
 msgid "warning: command update mode suggested for submodule '%s'\n"
 msgstr ""
 "advertència: se suggereix el mode d'actualització per ordre per al submòdul "
 "'%s'\n"
 
-#: builtin/submodule--helper.c:385
+#: builtin/submodule--helper.c:390
 #, c-format
 msgid "Failed to register update mode for submodule path '%s'"
 msgstr ""
 "S'ha fallat en registrar el mode d'actualització per al camí de submòdul '%s'"
 
-#: builtin/submodule--helper.c:404
+#: builtin/submodule--helper.c:409
 msgid "Suppress output for initializing a submodule"
 msgstr "Omet la sortida d'inicialitzar un submòdul"
 
-#: builtin/submodule--helper.c:409
+#: builtin/submodule--helper.c:414
 msgid "git submodule--helper init [<path>]"
 msgstr "git submodule--helper init [<camí>]"
 
-#: builtin/submodule--helper.c:430
+#: builtin/submodule--helper.c:435
 msgid "git submodule--helper name <path>"
 msgstr "git submodule--helper name <camí>"
 
-#: builtin/submodule--helper.c:436
+#: builtin/submodule--helper.c:441
 #, c-format
 msgid "no submodule mapping found in .gitmodules for path '%s'"
 msgstr "No s'ha trobat cap mapatge de submòdul a .gitmodules per al camí '%s'"
 
-#: builtin/submodule--helper.c:486
+#: builtin/submodule--helper.c:524 builtin/submodule--helper.c:527
+#, c-format
+msgid "submodule '%s' cannot add alternate: %s"
+msgstr "el submòdul '%s' no pot afegir un alternatiu: %s"
+
+#: builtin/submodule--helper.c:563
+#, c-format
+msgid "Value '%s' for submodule.alternateErrorStrategy is not recognized"
+msgstr "No es reconeix el valor '%s' per a submodule.alternateErrorStrategy"
+
+#: builtin/submodule--helper.c:570
+#, c-format
+msgid "Value '%s' for submodule.alternateLocation is not recognized"
+msgstr "No es reconeix el valor '%s' per a submodule.alternateLocation"
+
+#: builtin/submodule--helper.c:593
 msgid "where the new submodule will be cloned to"
 msgstr "a on es clonarà el submòdul nou"
 
-#: builtin/submodule--helper.c:489
+#: builtin/submodule--helper.c:596
 msgid "name of the new submodule"
 msgstr "nom del submòdul nou"
 
-#: builtin/submodule--helper.c:492
+#: builtin/submodule--helper.c:599
 msgid "url where to clone the submodule from"
 msgstr "url del qual clonar el submòdul"
 
-#: builtin/submodule--helper.c:498
+#: builtin/submodule--helper.c:605
 msgid "depth for shallow clones"
 msgstr "profunditat dels clons superficials"
 
-#: builtin/submodule--helper.c:504
+#: builtin/submodule--helper.c:608 builtin/submodule--helper.c:964
+msgid "force cloning progress"
+msgstr "força el progrés del clonatge"
+
+#: builtin/submodule--helper.c:613
 msgid ""
 "git submodule--helper clone [--prefix=<path>] [--quiet] [--reference "
 "<repository>] [--name <name>] [--depth <depth>] --url <url> --path <path>"
@@ -11626,97 +12469,97 @@ msgstr ""
 "git submodule--helper clone [--prefix=<camí>] [--quiet] [--reference "
 "<dipòsit>] [--name <nom>] [--depth <profunditat>] --url <url> --path <camí>"
 
-#: builtin/submodule--helper.c:529 builtin/submodule--helper.c:535
+#: builtin/submodule--helper.c:638 builtin/submodule--helper.c:648
 #, c-format
 msgid "could not create directory '%s'"
 msgstr "no s'ha pogut crear el directori '%s'"
 
-#: builtin/submodule--helper.c:531
+#: builtin/submodule--helper.c:644
 #, c-format
 msgid "clone of '%s' into submodule path '%s' failed"
 msgstr "el clonatge de '%s' al camí de submòdul '%s' ha fallat"
 
-#: builtin/submodule--helper.c:547
+#: builtin/submodule--helper.c:660
 #, c-format
 msgid "cannot open file '%s'"
 msgstr "no es pot obrir el fitxer '%s'"
 
-#: builtin/submodule--helper.c:552
+#: builtin/submodule--helper.c:665
 #, c-format
 msgid "could not close file %s"
 msgstr "no s'ha pogut tancar el fitxer %s"
 
-#: builtin/submodule--helper.c:559
+#: builtin/submodule--helper.c:672
 #, c-format
 msgid "could not get submodule directory for '%s'"
 msgstr "no s'ha pogut obtenir el directori de submòdul per a '%s'"
 
-#: builtin/submodule--helper.c:611
+#: builtin/submodule--helper.c:726
 #, c-format
 msgid "Submodule path '%s' not initialized"
 msgstr "El camí de submòdul '%s' no està inicialitzat"
 
-#: builtin/submodule--helper.c:615
+#: builtin/submodule--helper.c:730
 msgid "Maybe you want to use 'update --init'?"
 msgstr "Potser voleu usar 'update --init'?"
 
-#: builtin/submodule--helper.c:641
+#: builtin/submodule--helper.c:756
 #, c-format
 msgid "Skipping unmerged submodule %s"
 msgstr "S'està saltant el submòdul no fusionat %s"
 
-#: builtin/submodule--helper.c:662
+#: builtin/submodule--helper.c:777
 #, c-format
 msgid "Skipping submodule '%s'"
 msgstr "S'està saltant el submòdul '%s'"
 
-#: builtin/submodule--helper.c:792
+#: builtin/submodule--helper.c:913
 #, c-format
 msgid "Failed to clone '%s'. Retry scheduled"
 msgstr "S'ha fallat en clonar '%s'. S'ha programat un reintent"
 
-#: builtin/submodule--helper.c:803
+#: builtin/submodule--helper.c:924
 #, c-format
 msgid "Failed to clone '%s' a second time, aborting"
 msgstr "S'ha fallat una segona vegada en clonar '%s', s'està avortant"
 
-#: builtin/submodule--helper.c:824
+#: builtin/submodule--helper.c:945
 msgid "path into the working tree"
 msgstr "camí a l'arbre de treball"
 
-#: builtin/submodule--helper.c:827
+#: builtin/submodule--helper.c:948
 msgid "path into the working tree, across nested submodule boundaries"
 msgstr "camí a l'arbre de treball, a través de fronteres de submòduls niats"
 
-#: builtin/submodule--helper.c:831
+#: builtin/submodule--helper.c:952
 msgid "rebase, merge, checkout or none"
 msgstr "rebase, merge, checkout o none"
 
-#: builtin/submodule--helper.c:835
+#: builtin/submodule--helper.c:956
 msgid "Create a shallow clone truncated to the specified number of revisions"
 msgstr "Crea un clon superficial truncat al nombre de revisions especificat"
 
-#: builtin/submodule--helper.c:838
+#: builtin/submodule--helper.c:959
 msgid "parallel jobs"
 msgstr "tasques paral·leles"
 
-#: builtin/submodule--helper.c:840
+#: builtin/submodule--helper.c:961
 msgid "whether the initial clone should follow the shallow recommendation"
 msgstr "si el clonatge inicial ha de seguir la recomanació de superficialitat"
 
-#: builtin/submodule--helper.c:841
+#: builtin/submodule--helper.c:962
 msgid "don't print cloning progress"
 msgstr "no imprimeixis el progrés del clonatge"
 
-#: builtin/submodule--helper.c:846
+#: builtin/submodule--helper.c:969
 msgid "git submodule--helper update_clone [--prefix=<path>] [<path>...]"
 msgstr "git submodule--helper update_clone [--prefix=<camí>] [<camí>...]"
 
-#: builtin/submodule--helper.c:856
+#: builtin/submodule--helper.c:979
 msgid "bad value for update parameter"
 msgstr "valor dolent per al paràmetre update"
 
-#: builtin/submodule--helper.c:927
+#: builtin/submodule--helper.c:1050
 #, c-format
 msgid ""
 "Submodule (%s) branch configured to inherit branch from superproject, but "
@@ -11725,11 +12568,11 @@ msgstr ""
 "La branca de submòdul (%s) està configurada per a heretar la branca del "
 "superprojecte, però el superprojecte no és en cap branca"
 
-#: builtin/submodule--helper.c:977
+#: builtin/submodule--helper.c:1100
 msgid "submodule--helper subcommand must be called with a subcommand"
 msgstr "s'ha d'executar la subordre submodule--helper amb una subordre"
 
-#: builtin/submodule--helper.c:984
+#: builtin/submodule--helper.c:1107
 #, c-format
 msgid "'%s' is not a valid submodule--helper subcommand"
 msgstr "'%s' no és una subordre vàlida de submodule--helper"
@@ -11966,7 +12809,7 @@ msgstr "l'etiqueta '%s' ja existeix"
 msgid "Updated tag '%s' (was %s)\n"
 msgstr "Etiqueta '%s' actualitzada (era %s)\n"
 
-#: builtin/unpack-objects.c:490
+#: builtin/unpack-objects.c:493
 msgid "Unpacking objects"
 msgstr "S'estan desempaquetant els objectes"
 
@@ -12035,136 +12878,152 @@ msgstr ""
 msgid " OK"
 msgstr " D'acord"
 
-#: builtin/update-index.c:575
+#: builtin/update-index.c:564
 msgid "git update-index [<options>] [--] [<file>...]"
 msgstr "git update-index [<opcions>] [--] [<fitxer>...]"
 
-#: builtin/update-index.c:930
+#: builtin/update-index.c:919
 msgid "continue refresh even when index needs update"
 msgstr ""
 "continua l'actualització encara que l'índex necessiti una actualització"
 
-#: builtin/update-index.c:933
+#: builtin/update-index.c:922
 msgid "refresh: ignore submodules"
 msgstr "actualitza: ignora els submòduls"
 
-#: builtin/update-index.c:936
+#: builtin/update-index.c:925
 msgid "do not ignore new files"
 msgstr "no ignoris els fitxers nous"
 
-#: builtin/update-index.c:938
+#: builtin/update-index.c:927
 msgid "let files replace directories and vice-versa"
 msgstr "deixa que els fitxers reemplacin els directoris i viceversa"
 
-#: builtin/update-index.c:940
+#: builtin/update-index.c:929
 msgid "notice files missing from worktree"
 msgstr "tingues en compte els fitxers absents de l'arbre de treball"
 
-#: builtin/update-index.c:942
+#: builtin/update-index.c:931
 msgid "refresh even if index contains unmerged entries"
 msgstr "actualitza encara que l'índex contingui entrades no fusionades"
 
-#: builtin/update-index.c:945
+#: builtin/update-index.c:934
 msgid "refresh stat information"
 msgstr "actualitza la informació d'estadístiques"
 
-#: builtin/update-index.c:949
+#: builtin/update-index.c:938
 msgid "like --refresh, but ignore assume-unchanged setting"
 msgstr "com --refresh, però ignora l'ajust assume-unchanged"
 
-#: builtin/update-index.c:953
+#: builtin/update-index.c:942
 msgid "<mode>,<object>,<path>"
 msgstr "<mode>,<objecte>,<camí>"
 
-#: builtin/update-index.c:954
+#: builtin/update-index.c:943
 msgid "add the specified entry to the index"
 msgstr "afegeix l'entrada especificada a l'índex"
 
-#: builtin/update-index.c:963
+#: builtin/update-index.c:952
 msgid "mark files as \"not changing\""
 msgstr "marca els fitxers com a \"no canviant\""
 
-#: builtin/update-index.c:966
+#: builtin/update-index.c:955
 msgid "clear assumed-unchanged bit"
 msgstr "neteja el bit assumed-unchanged"
 
-#: builtin/update-index.c:969
+#: builtin/update-index.c:958
 msgid "mark files as \"index-only\""
 msgstr "marca els fitxers com a \"només índex\""
 
-#: builtin/update-index.c:972
+#: builtin/update-index.c:961
 msgid "clear skip-worktree bit"
 msgstr "neteja el bit skip-worktree"
 
-#: builtin/update-index.c:975
+#: builtin/update-index.c:964
 msgid "add to index only; do not add content to object database"
 msgstr ""
 "només afegeix a l'índex; no afegeixis el contingut a la base de dades "
 "d'objectes"
 
-#: builtin/update-index.c:977
+#: builtin/update-index.c:966
 msgid "remove named paths even if present in worktree"
 msgstr ""
 "elimina els camins anomenats encara que estiguin presents en l'arbre de "
 "treball"
 
-#: builtin/update-index.c:979
+#: builtin/update-index.c:968
 msgid "with --stdin: input lines are terminated by null bytes"
 msgstr "amb --stdin: les línies d'entrada acaben amb octets nuls"
 
-#: builtin/update-index.c:981
+#: builtin/update-index.c:970
 msgid "read list of paths to be updated from standard input"
 msgstr "llegeix la llista de camins a actualitzar des de l'entrada estàndard"
 
-#: builtin/update-index.c:985
+#: builtin/update-index.c:974
 msgid "add entries from standard input to the index"
 msgstr "afegeix les entrades de l'entrada estàndard a l'índex"
 
-#: builtin/update-index.c:989
+#: builtin/update-index.c:978
 msgid "repopulate stages #2 and #3 for the listed paths"
 msgstr "reemplena les etapes #2 i #3 per als camins llistats"
 
-#: builtin/update-index.c:993
+#: builtin/update-index.c:982
 msgid "only update entries that differ from HEAD"
 msgstr "només actualitza les entrades que difereixin de HEAD"
 
-#: builtin/update-index.c:997
+#: builtin/update-index.c:986
 msgid "ignore files missing from worktree"
 msgstr "ignora els fitxers absents de l'arbre de treball"
 
-#: builtin/update-index.c:1000
+#: builtin/update-index.c:989
 msgid "report actions to standard output"
 msgstr "informa de les accions en la sortida estàndard"
 
-#: builtin/update-index.c:1002
+#: builtin/update-index.c:991
 msgid "(for porcelains) forget saved unresolved conflicts"
 msgstr "(per a porcellanes) oblida't dels conflictes no resolts ni desats"
 
-#: builtin/update-index.c:1006
+#: builtin/update-index.c:995
 msgid "write index in this format"
 msgstr "escriu l'índex en aquest format"
 
-#: builtin/update-index.c:1008
+#: builtin/update-index.c:997
 msgid "enable or disable split index"
 msgstr "habilita o inhabilita l'índex dividit"
 
-#: builtin/update-index.c:1010
+#: builtin/update-index.c:999
 msgid "enable/disable untracked cache"
 msgstr "habilita/inhabilita la memòria cau no seguida"
 
-#: builtin/update-index.c:1012
+#: builtin/update-index.c:1001
 msgid "test if the filesystem supports untracked cache"
 msgstr "prova si el sistema de fitxers admet la memòria cau no seguida"
 
-#: builtin/update-index.c:1014
+#: builtin/update-index.c:1003
 msgid "enable untracked cache without testing the filesystem"
 msgstr "habilita la memòria cau no seguida sense provar el sistema de fitxers"
 
-#: builtin/update-index.c:1134
+#: builtin/update-index.c:1119
+msgid ""
+"core.untrackedCache is set to true; remove or change it, if you really want "
+"to disable the untracked cache"
+msgstr ""
+"core.untrackedCache està establert a veritable; elimineu-lo o canvieu-lo, si "
+"realment voleu inhabilitar el cau no seguit"
+
+#: builtin/update-index.c:1123
 msgid "Untracked cache disabled"
 msgstr "La memòria cau no seguida està inhabilitada"
 
-#: builtin/update-index.c:1146
+#: builtin/update-index.c:1131
+msgid ""
+"core.untrackedCache is set to false; remove or change it, if you really want "
+"to enable the untracked cache"
+msgstr ""
+"core.untrackedCache està establert a fals; elimineu-lo o canviar-lo, si "
+"realment voleu habilitar el cau no seguit"
+
+#: builtin/update-index.c:1135
 #, c-format
 msgid "Untracked cache enabled for '%s'"
 msgstr "La memòria cau no seguida està habilitada per a '%s'"
@@ -12364,27 +13223,41 @@ msgstr "escriu l'objecte d'arbre per a un subdirectori <prefix>"
 msgid "only useful for debugging"
 msgstr "només útil per a la depuració"
 
-#: upload-pack.c:20
+#: upload-pack.c:22
 msgid "git upload-pack [<options>] <dir>"
 msgstr "git upload-pack [<opcions>] <directori>"
 
-#: upload-pack.c:837
+#: upload-pack.c:1028
 msgid "quit after a single request/response exchange"
 msgstr "surt després d'un sol intercanvi de sol·licitud/resposta"
 
-#: upload-pack.c:839
+#: upload-pack.c:1030
 msgid "exit immediately after initial ref advertisement"
 msgstr "surt immediatament després del anunci inicial de referència"
 
-#: upload-pack.c:841
+#: upload-pack.c:1032
 msgid "do not try <directory>/.git/ if <directory> is no Git directory"
 msgstr ""
 "no intentis <directori>/.git/ si <directori> no és cap directori del Git"
 
-#: upload-pack.c:843
+#: upload-pack.c:1034
 msgid "interrupt transfer after <n> seconds of inactivity"
 msgstr "interromp la transferència després de <n> segons d'inactivitat"
 
+#: credential-cache--daemon.c:223
+#, c-format
+msgid ""
+"The permissions on your socket directory are too loose; other\n"
+"users may be able to read your cached credentials. Consider running:\n"
+"\n"
+"\tchmod 0700 %s"
+msgstr ""
+"Els permisos en el vostre directori de sòcol són massa liberals;\n"
+"potser que altres usuaris poden llegir els vostres credencials.\n"
+"Considereu executar:\n"
+"\n"
+"\tchmod 0700 %s"
+
 #: credential-cache--daemon.c:271
 msgid "print debugging messages to stderr"
 msgstr "imprimeix els missatges de depuració a stderr"
@@ -12400,7 +13273,11 @@ msgstr ""
 "'git help <concepte>' per a llegir sobre una subordre o concepte\n"
 "específic."
 
-#: http.c:323
+#: http.c:342
+msgid "Delegation control is not supported with cURL < 7.22.0"
+msgstr "No s'admet el control de delegació amb el cURL < 7.22.0"
+
+#: http.c:351
 msgid "Public key pinning not supported with cURL < 7.44.0"
 msgstr "No s'admet l'enganx de clau pública amb cURL < 7.44.0"
 
@@ -12519,15 +13396,15 @@ msgstr "data-de-caducitat"
 msgid "no-op (backward compatibility)"
 msgstr "operació nul·la (per a compatibilitat amb versions anteriors)"
 
-#: parse-options.h:237
+#: parse-options.h:238
 msgid "be more verbose"
 msgstr "sigues més detallat"
 
-#: parse-options.h:239
+#: parse-options.h:240
 msgid "be more quiet"
 msgstr "sigues més callat"
 
-#: parse-options.h:245
+#: parse-options.h:246
 msgid "use <n> digits to display SHA-1s"
 msgstr "usa <n> xifres per presentar els SHA-1"
 
@@ -12747,7 +13624,7 @@ msgid "Automated merge did not work."
 msgstr "La fusió automàtica no ha funcionat."
 
 #: git-merge-octopus.sh:62
-msgid "Should not be doing an Octopus."
+msgid "Should not be doing an octopus."
 msgstr "No s'ha de fer un pop."
 
 #: git-merge-octopus.sh:73
@@ -12938,6 +13815,10 @@ msgstr "Encara no teniu la comissió inicial"
 msgid "Cannot save the current index state"
 msgstr "No es pot desar l'estat d'índex actual"
 
+#: git-stash.sh:103
+msgid "Cannot save the untracked files"
+msgstr "No es pot desar els fitxers no seguits"
+
 #: git-stash.sh:123 git-stash.sh:136
 msgid "Cannot save the current worktree state"
 msgstr "No es pot desar l'estat d'arbre de treball actual"
@@ -12978,6 +13859,10 @@ msgstr ""
 "error: opció desconeguda de 'stash save': $option\n"
 "       Per a proveir un missatge, useu git stash save -- '$option'"
 
+#: git-stash.sh:251
+msgid "Can't use --patch and --include-untracked or --all at the same time"
+msgstr "No es poden usar --patch i --include-untracked o --all a la vegada."
+
 #: git-stash.sh:259
 msgid "No local changes to save"
 msgstr "No hi ha canvis locals a desar"
@@ -12999,98 +13884,102 @@ msgstr "S'han desat el directori de treball i l'estat d'ìndex $stash_msg"
 msgid "Cannot remove worktree changes"
 msgstr "No es pot eliminar els canvis de l'arbre de treball"
 
-#: git-stash.sh:404
+#: git-stash.sh:403
 #, sh-format
 msgid "unknown option: $opt"
 msgstr "opció desconeguda: $opt"
 
-#: git-stash.sh:414
+#: git-stash.sh:416
 msgid "No stash found."
 msgstr "No s'ha trobat cap magatzem."
 
-#: git-stash.sh:421
+#: git-stash.sh:423
 #, sh-format
 msgid "Too many revisions specified: $REV"
 msgstr "S'han especificat massa revisions: $REV"
 
-#: git-stash.sh:427
+#: git-stash.sh:438
 #, sh-format
 msgid "$reference is not a valid reference"
 msgstr "$reference no és una referència vàlida"
 
-#: git-stash.sh:455
+#: git-stash.sh:466
 #, sh-format
 msgid "'$args' is not a stash-like commit"
 msgstr "'$args' no és una comissió de tipus magatzem"
 
-#: git-stash.sh:466
+#: git-stash.sh:477
 #, sh-format
 msgid "'$args' is not a stash reference"
 msgstr "'$args' no és una referència de magatzem"
 
-#: git-stash.sh:474
+#: git-stash.sh:485
 msgid "unable to refresh index"
 msgstr "no s'ha pogut actualitzar l'índex"
 
-#: git-stash.sh:478
+#: git-stash.sh:489
 msgid "Cannot apply a stash in the middle of a merge"
 msgstr "No es pot aplicar un magatzem enmig d'una fusió"
 
-#: git-stash.sh:486
+#: git-stash.sh:497
 msgid "Conflicts in index. Try without --index."
 msgstr "Hi ha conflictes en l'índex. Proveu-ho sense --index."
 
-#: git-stash.sh:488
+#: git-stash.sh:499
 msgid "Could not save index tree"
 msgstr "No s'ha pogut desar l'arbre d'índex"
 
-#: git-stash.sh:522
+#: git-stash.sh:508
+msgid "Could not restore untracked files from stash"
+msgstr "No s'ha pogut restaurar els fitxers no seguits des d'emmagatzematge"
+
+#: git-stash.sh:533
 msgid "Cannot unstage modified files"
 msgstr "No es pot desallistar fitxers modificats"
 
-#: git-stash.sh:537
+#: git-stash.sh:548
 msgid "Index was not unstashed."
 msgstr "L'índex no estava sense emmagatzemar."
 
-#: git-stash.sh:551
+#: git-stash.sh:562
 msgid "The stash is kept in case you need it again."
 msgstr "Es conserva el magatzem en cas de que el necessiteu altra vegada."
 
-#: git-stash.sh:560
+#: git-stash.sh:571
 #, sh-format
 msgid "Dropped ${REV} ($s)"
 msgstr "${REV} ($s) descartada"
 
-#: git-stash.sh:561
+#: git-stash.sh:572
 #, sh-format
 msgid "${REV}: Could not drop stash entry"
 msgstr "${REV}: No s'ha pogut descartar l'entrada de magatzem"
 
-#: git-stash.sh:569
+#: git-stash.sh:580
 msgid "No branch name specified"
 msgstr "Cap nom de branca especificat"
 
-#: git-stash.sh:641
+#: git-stash.sh:652
 msgid "(To restore them type \"git stash apply\")"
 msgstr "(Per restaurar-les teclegeu \"git stash apply\")"
 
-#: git-submodule.sh:183
+#: git-submodule.sh:184
 msgid "Relative path can only be used from the toplevel of the working tree"
 msgstr ""
 "El camí relatiu només es pot usar des del nivell superior de l'arbre de "
 "treball"
 
-#: git-submodule.sh:193
+#: git-submodule.sh:194
 #, sh-format
 msgid "repo URL: '$repo' must be absolute or begin with ./|../"
 msgstr "URL de dipòsit: '$repo' ha de ser absolut o començar amb ./|../"
 
-#: git-submodule.sh:210
+#: git-submodule.sh:211
 #, sh-format
 msgid "'$sm_path' already exists in the index"
 msgstr "'$sm_path' ja existeix en l'índex"
 
-#: git-submodule.sh:214
+#: git-submodule.sh:215
 #, sh-format
 msgid ""
 "The following path is ignored by one of your .gitignore files:\n"
@@ -13101,23 +13990,23 @@ msgstr ""
 "$sm_path\n"
 "Useu -f si realment voleu afegir-lo."
 
-#: git-submodule.sh:232
+#: git-submodule.sh:233
 #, sh-format
 msgid "Adding existing repo at '$sm_path' to the index"
 msgstr "S'està afegint el dipòsit existent a '$sm_path' a l'índex"
 
-#: git-submodule.sh:234
+#: git-submodule.sh:235
 #, sh-format
 msgid "'$sm_path' already exists and is not a valid git repo"
 msgstr "'$sm_path' ja existeix i no és un dipòsit de git vàlid"
 
-#: git-submodule.sh:242
+#: git-submodule.sh:243
 #, sh-format
 msgid "A git directory for '$sm_name' is found locally with remote(s):"
 msgstr ""
 "Es troba un directori de git per a '$sm_name' localment amb els remots:"
 
-#: git-submodule.sh:244
+#: git-submodule.sh:245
 #, sh-format
 msgid ""
 "If you want to reuse this local git directory instead of cloning again from\n"
@@ -13134,49 +14023,49 @@ msgstr ""
 "o no esteu segur de què vol dir això, trieu un altre nom amb l'opció '--"
 "name'."
 
-#: git-submodule.sh:250
+#: git-submodule.sh:251
 #, sh-format
 msgid "Reactivating local git directory for submodule '$sm_name'."
 msgstr ""
 "S'està reactivant el directori de git local per al submòdul '$sm_name'."
 
-#: git-submodule.sh:262
+#: git-submodule.sh:263
 #, sh-format
 msgid "Unable to checkout submodule '$sm_path'"
 msgstr "no s'ha pogut agafar el submòdul '$sm_path'"
 
-#: git-submodule.sh:267
+#: git-submodule.sh:268
 #, sh-format
 msgid "Failed to add submodule '$sm_path'"
 msgstr "S'ha fallat en afegir el submòdul '$sm_path'"
 
-#: git-submodule.sh:276
+#: git-submodule.sh:277
 #, sh-format
 msgid "Failed to register submodule '$sm_path'"
 msgstr "S'ha fallat en registrar el submòdul '$sm_path'"
 
-#: git-submodule.sh:323
+#: git-submodule.sh:324
 #, sh-format
 msgid "Entering '$displaypath'"
 msgstr "S'està entrant '$displaypath'"
 
-#: git-submodule.sh:343
+#: git-submodule.sh:344
 #, sh-format
 msgid "Stopping at '$displaypath'; script returned non-zero status."
 msgstr ""
 "S'està aturant a '$displaypath'; l'script ha retornat un estat no zero."
 
-#: git-submodule.sh:414
+#: git-submodule.sh:415
 #, sh-format
 msgid "pathspec and --all are incompatible"
 msgstr "--pathspec i --all són incompatibles"
 
-#: git-submodule.sh:419
+#: git-submodule.sh:420
 #, sh-format
 msgid "Use '--all' if you really want to deinitialize all submodules"
 msgstr "Useu '--all' si realment voleu desinicialitzar tots els submòduls"
 
-#: git-submodule.sh:439
+#: git-submodule.sh:440
 #, sh-format
 msgid ""
 "Submodule work tree '$displaypath' contains a .git directory\n"
@@ -13185,7 +14074,7 @@ msgstr ""
 "L'arbre de treball de submòdul '$displaypath' conté un directori .git\n"
 "(useu 'rm -rf' si realment voleu eliminar-lo, incloent tota la seva història)"
 
-#: git-submodule.sh:447
+#: git-submodule.sh:448
 #, sh-format
 msgid ""
 "Submodule work tree '$displaypath' contains local modifications; use '-f' to "
@@ -13194,38 +14083,38 @@ msgstr ""
 "L'arbre de treball de submòdul '$displaypath' conté modificacions locals; "
 "useu '-f' per a descartar-les"
 
-#: git-submodule.sh:450
+#: git-submodule.sh:451
 #, sh-format
 msgid "Cleared directory '$displaypath'"
 msgstr "S'ha netejat el directori '$displaypath'"
 
-#: git-submodule.sh:451
+#: git-submodule.sh:452
 #, sh-format
 msgid "Could not remove submodule work tree '$displaypath'"
 msgstr "No s'ha pogut eliminar l'arbre de treball de submòdul '$displaypath'"
 
-#: git-submodule.sh:454
+#: git-submodule.sh:455
 #, sh-format
 msgid "Could not create empty submodule directory '$displaypath'"
 msgstr "No s'ha pogut crear el directori de submòdul buit '$displaypath'"
 
-#: git-submodule.sh:463
+#: git-submodule.sh:464
 #, sh-format
 msgid "Submodule '$name' ($url) unregistered for path '$displaypath'"
 msgstr "Submòdul '$name' ($url) no registrat per al camí '$displaypath'"
 
-#: git-submodule.sh:612
+#: git-submodule.sh:617
 #, sh-format
 msgid "Unable to find current revision in submodule path '$displaypath'"
 msgstr ""
 "No s'ha pogut trobar la revisió actual en el camí de submòdul '$displaypath'"
 
-#: git-submodule.sh:622
+#: git-submodule.sh:627
 #, sh-format
 msgid "Unable to fetch in submodule path '$sm_path'"
 msgstr "No s'ha pogut obtenir en el camí de submòdul '$sm_path'"
 
-#: git-submodule.sh:627
+#: git-submodule.sh:632
 #, sh-format
 msgid ""
 "Unable to find current ${remote_name}/${branch} revision in submodule path "
@@ -13234,101 +14123,97 @@ msgstr ""
 "No s'ha pogut trobar la revisió actual de ${remote_name}/${branch} en el "
 "camí de submòdul '$sm_path'"
 
-#: git-submodule.sh:645
+#: git-submodule.sh:650
 #, sh-format
 msgid "Unable to fetch in submodule path '$displaypath'"
 msgstr "No s'ha pogut obtenir en el camí de submòdul '$displaypath'"
 
-#: git-submodule.sh:651
+#: git-submodule.sh:656
 #, sh-format
 msgid ""
 "Fetched in submodule path '$displaypath', but it did not contain $sha1. "
 "Direct fetching of that commit failed."
 msgstr ""
 "S'ha obtingut en el camí de submòdul '$displaypath', però no contenia $sha1. "
-"L'obteniment directe d'aquella comissió ha fallat."
+"L'obtenció directa d'aquella comissió ha fallat."
 
-#: git-submodule.sh:658
+#: git-submodule.sh:663
 #, sh-format
 msgid "Unable to checkout '$sha1' in submodule path '$displaypath'"
 msgstr "No s'ha pogut agafar '$sha1' en el camí de submòdul '$displaypath'"
 
-#: git-submodule.sh:659
+#: git-submodule.sh:664
 #, sh-format
 msgid "Submodule path '$displaypath': checked out '$sha1'"
 msgstr "Camí de submòdul '$displaypath': s'ha agafat '$sha1'"
 
-#: git-submodule.sh:663
+#: git-submodule.sh:668
 #, sh-format
 msgid "Unable to rebase '$sha1' in submodule path '$displaypath'"
 msgstr "no s'ha pogut rebasar '$sha1' en el camí de submòdul '$displaypath'"
 
-#: git-submodule.sh:664
+#: git-submodule.sh:669
 #, sh-format
 msgid "Submodule path '$displaypath': rebased into '$sha1'"
 msgstr "Camí de submòdul '$displaypath': s'ha rebasat en '$sha1'"
 
-#: git-submodule.sh:669
+#: git-submodule.sh:674
 #, sh-format
 msgid "Unable to merge '$sha1' in submodule path '$displaypath'"
 msgstr "No s'ha pogut fusionar '$sha1' en el camí de submòdul '$displaypath'"
 
-#: git-submodule.sh:670
+#: git-submodule.sh:675
 #, sh-format
 msgid "Submodule path '$displaypath': merged in '$sha1'"
 msgstr "Camí de submòdul '$displaypath': s'ha fusionat en '$sha1'"
 
-#: git-submodule.sh:675
+#: git-submodule.sh:680
 #, sh-format
 msgid "Execution of '$command $sha1' failed in submodule path '$displaypath'"
 msgstr ""
 "L'execució de '$command $sha1' ha fallat en el camí de submòdul "
 "'$displaypath'"
 
-#: git-submodule.sh:676
+#: git-submodule.sh:681
 #, sh-format
 msgid "Submodule path '$displaypath': '$command $sha1'"
 msgstr "Camí de submòdul '$displaypath': '$command $sha1'"
 
-#: git-submodule.sh:707
+#: git-submodule.sh:712
 #, sh-format
 msgid "Failed to recurse into submodule path '$displaypath'"
 msgstr "S'ha fallat en recursar al camí de submòdul '$displaypath'"
 
-#: git-submodule.sh:815
+#: git-submodule.sh:820
 msgid "The --cached option cannot be used with the --files option"
 msgstr "L'opció --cached no es pot usar amb l'opció --files"
 
-#: git-submodule.sh:867
+#: git-submodule.sh:872
 #, sh-format
 msgid "unexpected mode $mod_dst"
 msgstr "mode inesperat $mod_dst"
 
-#: git-submodule.sh:887
+#: git-submodule.sh:892
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commit $sha1_src"
 msgstr "  Avís: $display_name no conté la comissió $sha1_src"
 
-#: git-submodule.sh:890
+#: git-submodule.sh:895
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commit $sha1_dst"
 msgstr "  Avís: $display_name no conté la comissió $sha1_dst"
 
-#: git-submodule.sh:893
+#: git-submodule.sh:898
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commits $sha1_src and $sha1_dst"
 msgstr "  Avís: $display_name no conté les comissions $sha1_src i $sha1_dst"
 
-#: git-submodule.sh:918
-msgid "blob"
-msgstr "blob"
-
-#: git-submodule.sh:1040
+#: git-submodule.sh:1045
 #, sh-format
 msgid "Failed to recurse into submodule path '$sm_path'"
 msgstr "S'ha fallat en recursar al camí de submòdul '$sm_path'"
 
-#: git-submodule.sh:1107
+#: git-submodule.sh:1112
 #, sh-format
 msgid "Synchronizing submodule url for '$displaypath'"
 msgstr "S'està sincronitzant l'url de submòdul per a '$displaypath'"
@@ -13338,12 +14223,12 @@ msgstr "S'està sincronitzant l'url de submòdul per a '$displaypath'"
 msgid "See git-${cmd}(1) for details."
 msgstr "Vegeu git-${cmd}(1) per detalls."
 
-#: git-rebase--interactive.sh:131
+#: git-rebase--interactive.sh:140
 #, sh-format
 msgid "Rebasing ($new_count/$total)"
 msgstr "S'està rebasant ($new_count/$total)"
 
-#: git-rebase--interactive.sh:147
+#: git-rebase--interactive.sh:156
 msgid ""
 "\n"
 "Commands:\n"
@@ -13371,7 +14256,7 @@ msgstr ""
 "\n"
 "Es pot canviar l'ordre d'aquestes línies; s'executen de dalt a baix.\n"
 
-#: git-rebase--interactive.sh:162
+#: git-rebase--interactive.sh:171
 msgid ""
 "\n"
 "Do not remove any line. Use 'drop' explicitly to remove a commit.\n"
@@ -13380,7 +14265,7 @@ msgstr ""
 "No elimineu cap línia. Useu 'drop' explícitament per a eliminar una "
 "comissió.\n"
 
-#: git-rebase--interactive.sh:166
+#: git-rebase--interactive.sh:175
 msgid ""
 "\n"
 "If you remove a line here THAT COMMIT WILL BE LOST.\n"
@@ -13388,7 +14273,7 @@ msgstr ""
 "\n"
 "Si elimineu una línia aquí, ES PERDRÀ AQUELLA COMISSIÓ.\n"
 
-#: git-rebase--interactive.sh:202
+#: git-rebase--interactive.sh:211
 #, sh-format
 msgid ""
 "You can amend the commit now, with\n"
@@ -13407,87 +14292,87 @@ msgstr ""
 "\n"
 "\tgit rebase --continue"
 
-#: git-rebase--interactive.sh:227
+#: git-rebase--interactive.sh:236
 #, sh-format
 msgid "$sha1: not a commit that can be picked"
 msgstr "$sha1: no és una comissió que es pugi escollir"
 
-#: git-rebase--interactive.sh:266
+#: git-rebase--interactive.sh:275
 #, sh-format
 msgid "Invalid commit name: $sha1"
 msgstr "Nom de comissió no vàlid: $sha1"
 
-#: git-rebase--interactive.sh:308
+#: git-rebase--interactive.sh:317
 msgid "Cannot write current commit's replacement sha1"
 msgstr "No es pot escriure el sha1 reemplaçant de la comissió actual"
 
-#: git-rebase--interactive.sh:360
+#: git-rebase--interactive.sh:369
 #, sh-format
 msgid "Fast-forward to $sha1"
 msgstr "Avanç ràpid a $sha1"
 
-#: git-rebase--interactive.sh:362
+#: git-rebase--interactive.sh:371
 #, sh-format
 msgid "Cannot fast-forward to $sha1"
 msgstr "No es pot avançar ràpidament a $sha1"
 
-#: git-rebase--interactive.sh:371
+#: git-rebase--interactive.sh:380
 #, sh-format
 msgid "Cannot move HEAD to $first_parent"
 msgstr "No es pot moure HEAD a $first_parent"
 
-#: git-rebase--interactive.sh:376
+#: git-rebase--interactive.sh:385
 #, sh-format
 msgid "Refusing to squash a merge: $sha1"
 msgstr "S'està refusant aixafar una fusió: $sha1"
 
-#: git-rebase--interactive.sh:390
+#: git-rebase--interactive.sh:399
 #, sh-format
 msgid "Error redoing merge $sha1"
 msgstr "Error en refer la fusió $sha1"
 
-#: git-rebase--interactive.sh:398
+#: git-rebase--interactive.sh:407
 #, sh-format
 msgid "Could not pick $sha1"
 msgstr "No s'ha pogut escollir $sha1"
 
-#: git-rebase--interactive.sh:407
+#: git-rebase--interactive.sh:416
 #, sh-format
 msgid "This is the commit message #${n}:"
 msgstr "Aquest és el missatge de comissió núm. ${n}:"
 
-#: git-rebase--interactive.sh:412
+#: git-rebase--interactive.sh:421
 #, sh-format
 msgid "The commit message #${n} will be skipped:"
 msgstr "El missatge de comissió núm. ${n} se saltarà:"
 
-#: git-rebase--interactive.sh:423
+#: git-rebase--interactive.sh:432
 #, sh-format
 msgid "This is a combination of $count commit."
 msgid_plural "This is a combination of $count commits."
 msgstr[0] "Això és una combinació de $count comissió."
 msgstr[1] "Això és una combinació de $count comissions."
 
-#: git-rebase--interactive.sh:431
+#: git-rebase--interactive.sh:440
 #, sh-format
 msgid "Cannot write $fixup_msg"
 msgstr "No es pot escriure $fixup_msg"
 
-#: git-rebase--interactive.sh:434
+#: git-rebase--interactive.sh:443
 msgid "This is a combination of 2 commits."
 msgstr "Això és una combinació de 2 comissions."
 
-#: git-rebase--interactive.sh:435
+#: git-rebase--interactive.sh:444
 msgid "This is the 1st commit message:"
 msgstr "Aquest és el 1er missatge de comissió:"
 
-#: git-rebase--interactive.sh:475 git-rebase--interactive.sh:518
-#: git-rebase--interactive.sh:521
+#: git-rebase--interactive.sh:484 git-rebase--interactive.sh:527
+#: git-rebase--interactive.sh:530
 #, sh-format
 msgid "Could not apply $sha1... $rest"
 msgstr "No s'ha pogut aplicar $sha1... $rest"
 
-#: git-rebase--interactive.sh:549
+#: git-rebase--interactive.sh:558
 #, sh-format
 msgid ""
 "Could not amend commit after successfully picking $sha1... $rest\n"
@@ -13503,31 +14388,31 @@ msgstr ""
 "necessiteu resoldre el problema abans que pugueu canviar el missatge de\n"
 "comissió."
 
-#: git-rebase--interactive.sh:564
+#: git-rebase--interactive.sh:573
 #, sh-format
 msgid "Stopped at $sha1_abbrev... $rest"
 msgstr "S'ha aturat a $sha1_abbrev... $rest"
 
-#: git-rebase--interactive.sh:579
+#: git-rebase--interactive.sh:588
 #, sh-format
 msgid "Cannot '$squash_style' without a previous commit"
 msgstr "No es pot '$squash_style' sense una comissió prèvia"
 
-#: git-rebase--interactive.sh:621
+#: git-rebase--interactive.sh:630
 #, sh-format
 msgid "Executing: $rest"
 msgstr "S'està executant: $rest"
 
-#: git-rebase--interactive.sh:629
+#: git-rebase--interactive.sh:638
 #, sh-format
 msgid "Execution failed: $rest"
 msgstr "L'execució ha fallat: $rest"
 
-#: git-rebase--interactive.sh:631
+#: git-rebase--interactive.sh:640
 msgid "and made changes to the index and/or the working tree"
 msgstr "i ha fet canvis a l'índex o l'arbre de treball"
 
-#: git-rebase--interactive.sh:633
+#: git-rebase--interactive.sh:642
 msgid ""
 "You can fix the problem, and then run\n"
 "\n"
@@ -13538,7 +14423,7 @@ msgstr ""
 "\tgit rebase --continue"
 
 #. TRANSLATORS: after these lines is a command to be issued by the user
-#: git-rebase--interactive.sh:646
+#: git-rebase--interactive.sh:655
 #, sh-format
 msgid ""
 "Execution succeeded: $rest\n"
@@ -13553,25 +14438,25 @@ msgstr ""
 "\n"
 "\tgit rebase --continue"
 
-#: git-rebase--interactive.sh:657
+#: git-rebase--interactive.sh:666
 #, sh-format
 msgid "Unknown command: $command $sha1 $rest"
 msgstr "Ordre desconeguda: $command $sha1 $rest"
 
-#: git-rebase--interactive.sh:658
+#: git-rebase--interactive.sh:667
 msgid "Please fix this using 'git rebase --edit-todo'."
 msgstr "Si us plau, arregleu això usant 'git rebase --edit-todo'."
 
-#: git-rebase--interactive.sh:693
+#: git-rebase--interactive.sh:702
 #, sh-format
 msgid "Successfully rebased and updated $head_name."
 msgstr "S'ha rebasat i actualitzat $head_name amb èxit."
 
-#: git-rebase--interactive.sh:740
+#: git-rebase--interactive.sh:749
 msgid "Could not skip unnecessary pick commands"
 msgstr "No s'ha pogut saltar ordres innecessaris d'elecció"
 
-#: git-rebase--interactive.sh:898
+#: git-rebase--interactive.sh:907
 #, sh-format
 msgid ""
 "Warning: the SHA-1 is missing or isn't a commit in the following line:\n"
@@ -13580,7 +14465,7 @@ msgstr ""
 "Advertència: manca el SHA-1 o no és una comissió en la línia següent:\n"
 " - $line"
 
-#: git-rebase--interactive.sh:931
+#: git-rebase--interactive.sh:940
 #, sh-format
 msgid ""
 "Warning: the command isn't recognized in the following line:\n"
@@ -13589,11 +14474,11 @@ msgstr ""
 "Advertència: no es reconeix l'ordre en la línia següent:\n"
 " - $line"
 
-#: git-rebase--interactive.sh:970
+#: git-rebase--interactive.sh:979
 msgid "could not detach HEAD"
 msgstr "no s'ha pogut separar HEAD"
 
-#: git-rebase--interactive.sh:1008
+#: git-rebase--interactive.sh:1017
 msgid ""
 "Warning: some commits may have been dropped accidentally.\n"
 "Dropped commits (newer to older):"
@@ -13602,7 +14487,7 @@ msgstr ""
 "accidentalment.\n"
 "Les comissions descartades (més nova a més vella):"
 
-#: git-rebase--interactive.sh:1016
+#: git-rebase--interactive.sh:1025
 msgid ""
 "To avoid this message, use \"drop\" to explicitly remove a commit.\n"
 "\n"
@@ -13617,7 +14502,7 @@ msgstr ""
 "d'advertències.\n"
 "Els comportaments possibles són: ignore, warn, error."
 
-#: git-rebase--interactive.sh:1027
+#: git-rebase--interactive.sh:1036
 #, sh-format
 msgid ""
 "Unrecognized setting $check_level for option rebase.missingCommitsCheck. "
@@ -13626,19 +14511,23 @@ msgstr ""
 "No s'ha reconegut l'ajust $check_level per a l'opció rebase."
 "missingCommitsCheck. S'està ignorant."
 
-#: git-rebase--interactive.sh:1044
-msgid "You can fix this with 'git rebase --edit-todo'."
-msgstr "Podeu arreglar això amb 'git rebase --edit-todo'."
+#: git-rebase--interactive.sh:1053
+msgid ""
+"You can fix this with 'git rebase --edit-todo' and then run 'git rebase --"
+"continue'."
+msgstr ""
+"Podeu arreglar això amb 'git rebase --edit-todo' i desprès 'git rebase --"
+"continue'."
 
-#: git-rebase--interactive.sh:1045
+#: git-rebase--interactive.sh:1054
 msgid "Or you can abort the rebase with 'git rebase --abort'."
 msgstr "O podeu avortar el rebasament amb 'git rebase --abort'."
 
-#: git-rebase--interactive.sh:1069
+#: git-rebase--interactive.sh:1078
 msgid "Could not remove CHERRY_PICK_HEAD"
 msgstr "No s'ha pogut eliminar CHERRY_PICK_HEAD"
 
-#: git-rebase--interactive.sh:1074
+#: git-rebase--interactive.sh:1083
 #, sh-format
 msgid ""
 "You have staged changes in your working tree.\n"
@@ -13651,7 +14540,7 @@ msgid ""
 "\n"
 "  git commit $gpg_sign_opt_quoted\n"
 "\n"
-"In both case, once you're done, continue with:\n"
+"In both cases, once you're done, continue with:\n"
 "\n"
 "  git rebase --continue\n"
 msgstr ""
@@ -13669,13 +14558,13 @@ msgstr ""
 "\n"
 "  git rebase --continue\n"
 
-#: git-rebase--interactive.sh:1091
+#: git-rebase--interactive.sh:1100
 msgid "Error trying to find the author identity to amend commit"
 msgstr ""
 "Ha hagut un error en intentar trobar la identitat d'autor per a esmenar la "
 "comissió"
 
-#: git-rebase--interactive.sh:1096
+#: git-rebase--interactive.sh:1105
 msgid ""
 "You have uncommitted changes in your working tree. Please commit them\n"
 "first and then run 'git rebase --continue' again."
@@ -13683,11 +14572,11 @@ msgstr ""
 "Teniu canvis no comessos en el vostre arbre de treball. Si us plau,\n"
 "primer cometeu-los i després executeu 'git rebase --continue' de nou."
 
-#: git-rebase--interactive.sh:1101 git-rebase--interactive.sh:1105
+#: git-rebase--interactive.sh:1110 git-rebase--interactive.sh:1114
 msgid "Could not commit staged changes."
 msgstr "No s'ha pogut cometre els canvis emmagatzemats."
 
-#: git-rebase--interactive.sh:1129
+#: git-rebase--interactive.sh:1138
 msgid ""
 "\n"
 "You are editing the todo file of an ongoing interactive rebase.\n"
@@ -13696,50 +14585,45 @@ msgid ""
 "\n"
 msgstr ""
 "\n"
-"Esteu editant el fitxer de cosses a fer d'un rebasament interactiu en "
-"marxa.\n"
+"Esteu editant el fitxer de coses a fer d'un rebasament interactiu en marxa.\n"
 "Per a continuar el rebasament després d'editar, executeu:\n"
 "    git rebase --continue\n"
 "\n"
 
-#: git-rebase--interactive.sh:1137 git-rebase--interactive.sh:1298
+#: git-rebase--interactive.sh:1146 git-rebase--interactive.sh:1304
 msgid "Could not execute editor"
 msgstr "No s'ha pogut executar l'editor"
 
-#: git-rebase--interactive.sh:1145
-msgid "You need to set your committer info first"
-msgstr "Heu de primer establir la vostra informació de cometent"
-
-#: git-rebase--interactive.sh:1153
+#: git-rebase--interactive.sh:1159
 #, sh-format
 msgid "Could not checkout $switch_to"
 msgstr "No s'ha pogut agafar $switch_to"
 
-#: git-rebase--interactive.sh:1158
+#: git-rebase--interactive.sh:1164
 msgid "No HEAD?"
 msgstr "No hi ha cap HEAD?"
 
-#: git-rebase--interactive.sh:1159
+#: git-rebase--interactive.sh:1165
 #, sh-format
 msgid "Could not create temporary $state_dir"
 msgstr "No s'ha pogut crear el $state_dir temporal"
 
-#: git-rebase--interactive.sh:1161
+#: git-rebase--interactive.sh:1167
 msgid "Could not mark as interactive"
 msgstr "No s'ha pogut marcar com a interactiu"
 
-#: git-rebase--interactive.sh:1171 git-rebase--interactive.sh:1176
+#: git-rebase--interactive.sh:1177 git-rebase--interactive.sh:1182
 msgid "Could not init rewritten commits"
 msgstr "No s'ha pogut iniciar les comissions reescrites"
 
-#: git-rebase--interactive.sh:1276
+#: git-rebase--interactive.sh:1282
 #, sh-format
 msgid "Rebase $shortrevisions onto $shortonto ($todocount command)"
 msgid_plural "Rebase $shortrevisions onto $shortonto ($todocount commands)"
 msgstr[0] "Rebasa $shortrevisions sobre $shortonto ($todocount ordre)"
 msgstr[1] "Rebasa $shortrevisions sobre $shortonto ($todocount ordres)"
 
-#: git-rebase--interactive.sh:1281
+#: git-rebase--interactive.sh:1287
 msgid ""
 "\n"
 "However, if you remove everything, the rebase will be aborted.\n"
@@ -13749,7 +14633,7 @@ msgstr ""
 "No obstant, si elimineu tot, s'avortarà el rebasament.\n"
 "\n"
 
-#: git-rebase--interactive.sh:1288
+#: git-rebase--interactive.sh:1294
 msgid "Note that empty commits are commented out"
 msgstr "Nota que les comissions buides estan comentades"
 
@@ -13778,6 +14662,10 @@ msgstr "No es pot rebasar: Teniu canvis no allistats."
 msgid "Cannot rewrite branches: You have unstaged changes."
 msgstr "No es pot reescriure branques: Teniu canvis no allistats."
 
+#: git-sh-setup.sh:226
+msgid "Cannot pull with rebase: You have unstaged changes."
+msgstr "No es pot baixar amb rebasament: Teniu canvis no allistats."
+
 #: git-sh-setup.sh:229
 #, sh-format
 msgid "Cannot $action: You have unstaged changes."
@@ -13787,15 +14675,24 @@ msgstr "No es pot $action: Teniu canvis no allistats."
 msgid "Cannot rebase: Your index contains uncommitted changes."
 msgstr "No es pot rebasar: El vostre índex conté canvis sense cometre."
 
+#: git-sh-setup.sh:245
+msgid "Cannot pull with rebase: Your index contains uncommitted changes."
+msgstr ""
+"No es pot baixar amb rebasament: El vostre índex conté canvis sense cometre."
+
 #: git-sh-setup.sh:248
 #, sh-format
 msgid "Cannot $action: Your index contains uncommitted changes."
 msgstr "No es pot $action: El vostre índex conté canvis sense cometre."
 
+#: git-sh-setup.sh:252
+msgid "Additionally, your index contains uncommitted changes."
+msgstr "Addicionalment, el vostre índex conté canvis sense cometre."
+
 #: git-sh-setup.sh:372
 msgid "You need to run this command from the toplevel of the working tree."
 msgstr ""
-"Heu d'executar aquesta ordre des del nivell superior de l'arbre de treball"
+"Heu d'executar aquesta ordre des del nivell superior de l'arbre de treball."
 
 #: git-sh-setup.sh:377
 msgid "Unable to determine absolute path of git directory"
index 0755cdf6cd214dfc0bb235c04a50a1387acc339d..f25bd91529a29343498b5d4ca0541ad2345be142 100644 (file)
--- a/po/de.po
+++ b/po/de.po
@@ -7,8 +7,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Git\n"
 "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2016-08-27 23:21+0800\n"
-"PO-Revision-Date: 2015-01-21 15:01+0800\n"
+"POT-Creation-Date: 2016-11-25 22:50+0800\n"
+"PO-Revision-Date: 2016-11-28 18:10+0100\n"
 "Last-Translator: Ralf Thielow <ralf.thielow@gmail.com>\n"
 "Language-Team: German <>\n"
 "Language: de\n"
@@ -24,23 +24,29 @@ msgstr "Hinweis: %.*s\n"
 
 #: advice.c:83
 msgid "Cherry-picking is not possible because you have unmerged files."
-msgstr "Cherry-Picken ist nicht möglich, weil Sie nicht zusammengeführte Dateien haben."
+msgstr ""
+"Cherry-Picken ist nicht möglich, weil Sie nicht zusammengeführte Dateien "
+"haben."
 
 #: advice.c:85
 msgid "Committing is not possible because you have unmerged files."
-msgstr "Committen ist nicht möglich, weil Sie nicht zusammengeführte Dateien haben."
+msgstr ""
+"Committen ist nicht möglich, weil Sie nicht zusammengeführte Dateien haben."
 
 #: advice.c:87
 msgid "Merging is not possible because you have unmerged files."
-msgstr "Mergen ist nicht möglich, weil Sie nicht zusammengeführte Dateien haben."
+msgstr ""
+"Mergen ist nicht möglich, weil Sie nicht zusammengeführte Dateien haben."
 
 #: advice.c:89
 msgid "Pulling is not possible because you have unmerged files."
-msgstr "Pullen ist nicht möglich, weil Sie nicht zusammengeführte Dateien haben."
+msgstr ""
+"Pullen ist nicht möglich, weil Sie nicht zusammengeführte Dateien haben."
 
 #: advice.c:91
 msgid "Reverting is not possible because you have unmerged files."
-msgstr "Reverten ist nicht möglich, weil Sie nicht zusammengeführte Dateien haben."
+msgstr ""
+"Reverten ist nicht möglich, weil Sie nicht zusammengeführte Dateien haben."
 
 #: advice.c:93
 #, c-format
@@ -96,4021 +102,4531 @@ msgstr ""
 "weiteren Checkout durchführen.\n"
 "\n"
 "Wenn Sie einen neuen Branch erstellen möchten, um Ihre erstellten Commits\n"
-"zu behalten, können Sie das (jetzt oder später) durch einen weiteren Checkout\n"
+"zu behalten, können Sie das (jetzt oder später) durch einen weiteren "
+"Checkout\n"
 "mit der Option -b tun. Beispiel:\n"
 "\n"
 "  git checkout -b <neuer-Branchname>\n"
 "\n"
 
-#: archive.c:12
-msgid "git archive [<options>] <tree-ish> [<path>...]"
-msgstr "git archive [<Optionen>] <Commit-Referenz> [<Pfad>...]"
+#: apply.c:57
+#, c-format
+msgid "unrecognized whitespace option '%s'"
+msgstr "nicht erkannte Whitespace-Option: '%s'"
 
-#: archive.c:13
-msgid "git archive --list"
-msgstr "git archive --list"
+#: apply.c:73
+#, c-format
+msgid "unrecognized whitespace ignore option '%s'"
+msgstr "nicht erkannte Option zum Ignorieren von Whitespace: '%s'"
 
-#: archive.c:14
-msgid ""
-"git archive --remote <repo> [--exec <cmd>] [<options>] <tree-ish> [<path>...]"
-msgstr ""
-"git archive --remote <Repository> [--exec <Programm>] [<Optionen>] <Commit-"
-"Referenz> [<Pfad>...]"
+#: apply.c:125
+msgid "--reject and --3way cannot be used together."
+msgstr "--reject und --3way können nicht gemeinsam verwendet werden."
 
-#: archive.c:15
-msgid "git archive --remote <repo> [--exec <cmd>] --list"
-msgstr "git archive --remote <Repository> [--exec <Programm>] --list"
+#: apply.c:127
+msgid "--cached and --3way cannot be used together."
+msgstr "--cached und --3way können nicht gemeinsam verwendet werden."
 
-#: archive.c:344 builtin/add.c:139 builtin/add.c:435 builtin/rm.c:327
-#, c-format
-msgid "pathspec '%s' did not match any files"
-msgstr "Pfadspezifikation '%s' stimmt mit keinen Dateien überein"
+#: apply.c:130
+msgid "--3way outside a repository"
+msgstr ""
+"Die Option --3way kann nicht außerhalb eines Repositories verwendet werden."
 
-#: archive.c:429
-msgid "fmt"
-msgstr "Format"
+#: apply.c:141
+msgid "--index outside a repository"
+msgstr ""
+"Die Option --index kann nicht außerhalb eines Repositories verwendet werden."
 
-#: archive.c:429
-msgid "archive format"
-msgstr "Archivformat"
+#: apply.c:144
+msgid "--cached outside a repository"
+msgstr ""
+"Die Option --cached kann nicht außerhalb eines Repositories verwendet werden."
 
-#: archive.c:430 builtin/log.c:1422
-msgid "prefix"
-msgstr "Präfix"
+#: apply.c:845
+#, c-format
+msgid "Cannot prepare timestamp regexp %s"
+msgstr "Kann regulären Ausdruck für Zeitstempel %s nicht verarbeiten"
 
-#: archive.c:431
-msgid "prepend prefix to each pathname in the archive"
-msgstr "einen Präfix vor jeden Pfadnamen in dem Archiv stellen"
+#: apply.c:854
+#, c-format
+msgid "regexec returned %d for input: %s"
+msgstr "Ausführung des regulären Ausdrucks gab %d zurück. Eingabe: %s"
 
-#: archive.c:432 builtin/archive.c:88 builtin/blame.c:2553 builtin/blame.c:2554
-#: builtin/config.c:59 builtin/fast-export.c:987 builtin/fast-export.c:989
-#: builtin/grep.c:722 builtin/hash-object.c:100 builtin/ls-files.c:460
-#: builtin/ls-files.c:463 builtin/notes.c:399 builtin/notes.c:562
-#: builtin/read-tree.c:109 parse-options.h:153
-msgid "file"
-msgstr "Datei"
+#: apply.c:938
+#, c-format
+msgid "unable to find filename in patch at line %d"
+msgstr "Konnte keinen Dateinamen in Zeile %d des Patches finden."
 
-#: archive.c:433 builtin/archive.c:89
-msgid "write the archive to this file"
-msgstr "das Archiv in diese Datei schreiben"
+#: apply.c:977
+#, c-format
+msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d"
+msgstr ""
+"git apply: ungültiges 'git-diff' - erwartete /dev/null, erhielt %s in Zeile "
+"%d"
 
-#: archive.c:435
-msgid "read .gitattributes in working directory"
-msgstr ".gitattributes aus dem Arbeitsverzeichnis lesen"
+#: apply.c:983
+#, c-format
+msgid "git apply: bad git-diff - inconsistent new filename on line %d"
+msgstr ""
+"git apply: ungültiges 'git-diff' - Inkonsistenter neuer Dateiname in Zeile %d"
 
-#: archive.c:436
-msgid "report archived files on stderr"
-msgstr "archivierte Dateien in der Standard-Fehlerausgabe ausgeben"
+#: apply.c:984
+#, c-format
+msgid "git apply: bad git-diff - inconsistent old filename on line %d"
+msgstr ""
+"git apply: ungültiges 'git-diff' - Inkonsistenter alter Dateiname in Zeile %d"
 
-#: archive.c:437
-msgid "store only"
-msgstr "nur speichern"
+#: apply.c:990
+#, c-format
+msgid "git apply: bad git-diff - expected /dev/null on line %d"
+msgstr "git apply: ungültiges 'git-diff' - erwartete /dev/null in Zeile %d"
 
-#: archive.c:438
-msgid "compress faster"
-msgstr "schneller komprimieren"
+#: apply.c:1488
+#, c-format
+msgid "recount: unexpected line: %.*s"
+msgstr "recount: unerwartete Zeile: %.*s"
 
-#: archive.c:446
-msgid "compress better"
-msgstr "besser komprimieren"
+#: apply.c:1557
+#, c-format
+msgid "patch fragment without header at line %d: %.*s"
+msgstr "Patch-Fragment ohne Kopfbereich bei Zeile %d: %.*s"
 
-#: archive.c:449
-msgid "list supported archive formats"
-msgstr "unterstützte Archivformate auflisten"
+#: apply.c:1577
+#, c-format
+msgid ""
+"git diff header lacks filename information when removing %d leading pathname "
+"component (line %d)"
+msgid_plural ""
+"git diff header lacks filename information when removing %d leading pathname "
+"components (line %d)"
+msgstr[0] ""
+"Dem Kopfbereich von \"git diff\" fehlen Informationen zum Dateinamen, wenn "
+"%d vorangestellter Teil des Pfades entfernt wird (Zeile %d)"
+msgstr[1] ""
+"Dem Kopfbereich von \"git diff\" fehlen Informationen zum Dateinamen, wenn "
+"%d vorangestellte Teile des Pfades entfernt werden (Zeile %d)"
 
-#: archive.c:451 builtin/archive.c:90 builtin/clone.c:82
-#: builtin/submodule--helper.c:832
-msgid "repo"
-msgstr "Repository"
+#: apply.c:1589
+#, c-format
+msgid "git diff header lacks filename information (line %d)"
+msgstr "Dem Kopfbereich von \"git diff\" fehlen Informationen zum Dateinamen (Zeile %d)"
 
-#: archive.c:452 builtin/archive.c:91
-msgid "retrieve the archive from remote repository <repo>"
-msgstr "Archiv vom Remote-Repository <Repository> abrufen"
+#: apply.c:1759
+msgid "new file depends on old contents"
+msgstr "neue Datei hängt von alten Inhalten ab"
 
-#: archive.c:453 builtin/archive.c:92 builtin/notes.c:483
-msgid "command"
-msgstr "Programm"
+#: apply.c:1761
+msgid "deleted file still has contents"
+msgstr "entfernte Datei hat noch Inhalte"
 
-#: archive.c:454 builtin/archive.c:93
-msgid "path to the remote git-upload-archive command"
-msgstr "Pfad zum externen \"git-upload-archive\"-Programm"
+#: apply.c:1795
+#, c-format
+msgid "corrupt patch at line %d"
+msgstr "fehlerhafter Patch bei Zeile %d"
 
-#: archive.c:461
-msgid "Unexpected option --remote"
-msgstr "Unerwartete Option --remote"
+#: apply.c:1832
+#, c-format
+msgid "new file %s depends on old contents"
+msgstr "neue Datei %s hängt von alten Inhalten ab"
 
-#: archive.c:463
-msgid "Option --exec can only be used together with --remote"
-msgstr "Die Option --exec kann nur zusammen mit --remote verwendet werden."
+#: apply.c:1834
+#, c-format
+msgid "deleted file %s still has contents"
+msgstr "entfernte Datei %s hat noch Inhalte"
 
-#: archive.c:465
-msgid "Unexpected option --output"
-msgstr "Unerwartete Option --output"
+#: apply.c:1837
+#, c-format
+msgid "** warning: file %s becomes empty but is not deleted"
+msgstr "** Warnung: Datei %s wird leer, aber nicht entfernt."
 
-#: archive.c:487
+#: apply.c:1984
 #, c-format
-msgid "Unknown archive format '%s'"
-msgstr "Unbekanntes Archivformat '%s'"
+msgid "corrupt binary patch at line %d: %.*s"
+msgstr "fehlerhafter Binär-Patch bei Zeile %d: %.*s"
 
-#: archive.c:494
+#: apply.c:2021
 #, c-format
-msgid "Argument not supported for format '%s': -%d"
-msgstr "Argument für Format '%s' nicht unterstützt: -%d"
+msgid "unrecognized binary patch at line %d"
+msgstr "nicht erkannter Binär-Patch bei Zeile %d"
 
-#: attr.c:263
-msgid ""
-"Negative patterns are ignored in git attributes\n"
-"Use '\\!' for literal leading exclamation."
-msgstr ""
-"Verneinende Muster werden in Git-Attributen ignoriert.\n"
-"Benutzen Sie '\\!' für führende Ausrufezeichen."
+#: apply.c:2182
+#, c-format
+msgid "patch with only garbage at line %d"
+msgstr "Patch mit nutzlosen Informationen bei Zeile %d"
 
-#: bisect.c:441
+#: apply.c:2274
 #, c-format
-msgid "Could not open file '%s'"
-msgstr "Konnte Datei '%s' nicht öffnen"
+msgid "unable to read symlink %s"
+msgstr "konnte symbolische Verknüpfung %s nicht lesen"
 
-#: bisect.c:446
+#: apply.c:2278
 #, c-format
-msgid "Badly quoted content in file '%s': %s"
-msgstr "Ungültiger Inhalt bzgl. Anführungsstriche in Datei '%s': %s"
+msgid "unable to open or read %s"
+msgstr "konnte %s nicht öffnen oder lesen"
 
-#: bisect.c:655
+#: apply.c:2931
 #, c-format
-msgid "We cannot bisect more!\n"
-msgstr "Keine binäre Suche mehr möglich!\n"
+msgid "invalid start of line: '%c'"
+msgstr "Ungültiger Zeilenanfang: '%c'"
 
-#: bisect.c:708
+#: apply.c:3050
 #, c-format
-msgid "Not a valid commit name %s"
-msgstr "%s ist kein gültiger Commit-Name"
+msgid "Hunk #%d succeeded at %d (offset %d line)."
+msgid_plural "Hunk #%d succeeded at %d (offset %d lines)."
+msgstr[0] "Patch-Bereich #%d erfolgreich angewendet bei %d (%d Zeile versetzt)"
+msgstr[1] ""
+"Patch-Bereich #%d erfolgreich angewendet bei %d (%d Zeilen versetzt)"
 
-#: bisect.c:732
+#: apply.c:3062
 #, c-format
-msgid ""
-"The merge base %s is bad.\n"
-"This means the bug has been fixed between %s and [%s].\n"
-msgstr ""
-"Die Merge-Basis %s ist fehlerhaft.\n"
-"Das bedeutet, der Fehler wurde zwischen %s und [%s] behoben.\n"
+msgid "Context reduced to (%ld/%ld) to apply fragment at %d"
+msgstr "Kontext reduziert zu (%ld/%ld), um Patch-Bereich bei %d anzuwenden"
 
-#: bisect.c:737
+#: apply.c:3068
 #, c-format
 msgid ""
-"The merge base %s is new.\n"
-"The property has changed between %s and [%s].\n"
+"while searching for:\n"
+"%.*s"
 msgstr ""
-"Die Merge-Basis %s ist neu.\n"
-"Das bedeutet, die Eigenschaft hat sich zwischen %s und [%s] geändert.\n"
+"bei der Suche nach:\n"
+"%.*s"
 
-#: bisect.c:742
+#: apply.c:3090
 #, c-format
-msgid ""
-"The merge base %s is %s.\n"
-"This means the first '%s' commit is between %s and [%s].\n"
-msgstr ""
-"Die Merge-Basis %s ist %s.\n"
-"Das bedeutet, der erste '%s' Commit befindet sich zwischen %s und [%s]\n"
+msgid "missing binary patch data for '%s'"
+msgstr "keine Daten in Binär-Patch für '%s'"
 
-#: bisect.c:750
+#: apply.c:3098
 #, c-format
-msgid ""
-"Some %s revs are not ancestor of the %s rev.\n"
-"git bisect cannot work properly in this case.\n"
-"Maybe you mistook %s and %s revs?\n"
+msgid "cannot reverse-apply a binary patch without the reverse hunk to '%s'"
 msgstr ""
-"Manche %s Commits sind keine Vorgänger des %s Commits.\n"
-"git bisect kann in diesem Fall nicht richtig arbeiten.\n"
-"Vielleicht verwechselten Sie %s und %s Commits?\n"
+"kann binären Patch nicht in umgekehrter Reihenfolge anwenden ohne einen\n"
+"umgekehrten Patch-Block auf '%s'"
 
-#: bisect.c:763
+#: apply.c:3144
+#, c-format
+msgid "cannot apply binary patch to '%s' without full index line"
+msgstr "kann binären Patch auf '%s' nicht ohne eine vollständige Index-Zeile anwenden"
+
+#: apply.c:3154
 #, c-format
 msgid ""
-"the merge base between %s and [%s] must be skipped.\n"
-"So we cannot be sure the first %s commit is between %s and %s.\n"
-"We continue anyway."
+"the patch applies to '%s' (%s), which does not match the current contents."
 msgstr ""
-"Die Merge-Basis zwischen %s und [%s] muss ausgelassen werden.\n"
-"Es kann daher nicht sichergestellt werden, dass sich der\n"
-"erste %s Commit zwischen %s und %s befindet.\n"
-"Es wird dennoch fortgesetzt."
+"der Patch wird angewendet auf '%s' (%s), was nicht den aktuellen Inhalten\n"
+"entspricht"
 
-#: bisect.c:798
+#: apply.c:3162
 #, c-format
-msgid "Bisecting: a merge base must be tested\n"
-msgstr "binäre Suche: eine Merge-Basis muss geprüft werden\n"
+msgid "the patch applies to an empty '%s' but it is not empty"
+msgstr "der Patch wird auf ein leeres '%s' angewendet, was aber nicht leer ist"
 
-#: bisect.c:849
+#: apply.c:3180
 #, c-format
-msgid "a %s revision is needed"
-msgstr "ein %s Commit wird benötigt"
+msgid "the necessary postimage %s for '%s' cannot be read"
+msgstr "das erforderliche Postimage %s für '%s' kann nicht gelesen werden"
 
-#: bisect.c:866 builtin/notes.c:174 builtin/tag.c:248
+#: apply.c:3193
 #, c-format
-msgid "could not create file '%s'"
-msgstr "konnte Datei '%s' nicht erstellen"
+msgid "binary patch does not apply to '%s'"
+msgstr "Konnte Binär-Patch nicht auf '%s' anwenden"
 
-#: bisect.c:917
+#: apply.c:3199
 #, c-format
-msgid "could not read file '%s'"
-msgstr "Konnte Datei '%s' nicht lesen"
-
-#: bisect.c:947
-msgid "reading bisect refs failed"
-msgstr "Lesen von Referenzen für binäre Suche fehlgeschlagen"
+msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)"
+msgstr ""
+"Binär-Patch für '%s' erzeugt falsches Ergebnis (erwartete %s, bekam %s)"
 
-#: bisect.c:967
+#: apply.c:3220
 #, c-format
-msgid "%s was both %s and %s\n"
-msgstr "%s war sowohl %s als auch %s\n"
+msgid "patch failed: %s:%ld"
+msgstr "Anwendung des Patches fehlgeschlagen: %s:%ld"
 
-#: bisect.c:975
+#: apply.c:3342
 #, c-format
-msgid ""
-"No testable commit found.\n"
-"Maybe you started with bad path parameters?\n"
-msgstr ""
-"Kein testbarer Commit gefunden.\n"
-"Vielleicht starteten Sie mit falschen Pfad-Parametern?\n"
+msgid "cannot checkout %s"
+msgstr "kann %s nicht auschecken"
 
-#: bisect.c:994
+#: apply.c:3390 apply.c:3401 apply.c:3447 setup.c:248
 #, c-format
-msgid "(roughly %d step)"
-msgid_plural "(roughly %d steps)"
-msgstr[0] "(ungefähr %d Schritt)"
-msgstr[1] "(ungefähr %d Schritte)"
+msgid "failed to read %s"
+msgstr "Fehler beim Lesen von %s"
 
-#. TRANSLATORS: the last %s will be replaced with
-#. "(roughly %d steps)" translation
-#: bisect.c:998
+#: apply.c:3398
 #, c-format
-msgid "Bisecting: %d revision left to test after this %s\n"
-msgid_plural "Bisecting: %d revisions left to test after this %s\n"
-msgstr[0] "binäre Suche: danach noch %d Commit zum Testen übrig %s\n"
-msgstr[1] "binäre Suche: danach noch %d Commits zum Testen übrig %s\n"
+msgid "reading from '%s' beyond a symbolic link"
+msgstr "'%s' ist hinter einer symbolischen Verknüpfung"
 
-#: branch.c:53
+#: apply.c:3427 apply.c:3667
 #, c-format
-msgid ""
-"\n"
-"After fixing the error cause you may try to fix up\n"
-"the remote tracking information by invoking\n"
-"\"git branch --set-upstream-to=%s%s%s\"."
-msgstr ""
-"\n"
-"Nachdem Sie die Fehlerursache behoben haben, können Sie\n"
-"die Tracking-Informationen mit\n"
-"\"git branch --set-upstream-to=%s%s%s\"\n"
-"erneut setzen."
+msgid "path %s has been renamed/deleted"
+msgstr "Pfad %s wurde umbenannt/gelöscht"
 
-#: branch.c:67
+#: apply.c:3510 apply.c:3681
 #, c-format
-msgid "Not setting branch %s as its own upstream."
-msgstr "Branch %s kann nicht sein eigener Upstream-Branch sein."
+msgid "%s: does not exist in index"
+msgstr "%s ist nicht im Index"
 
-#: branch.c:93
+#: apply.c:3519 apply.c:3689
 #, c-format
-msgid "Branch %s set up to track remote branch %s from %s by rebasing."
+msgid "%s: does not match index"
+msgstr "%s entspricht nicht der Version im Index"
+
+#: apply.c:3554
+msgid "repository lacks the necessary blob to fall back on 3-way merge."
 msgstr ""
-"Branch %s konfiguriert zum Folgen von Remote-Branch %s von %s durch Rebase."
+"Dem Repository fehlt der notwendige Blob, um auf einen 3-Wege-Merge\n"
+"zurückzufallen."
 
-#: branch.c:94
+#: apply.c:3557
 #, c-format
-msgid "Branch %s set up to track remote branch %s from %s."
-msgstr "Branch %s konfiguriert zum Folgen von Remote-Branch %s von %s."
+msgid "Falling back to three-way merge...\n"
+msgstr "Falle zurück auf 3-Wege-Merge ...\n"
 
-#: branch.c:98
+#: apply.c:3573 apply.c:3577
 #, c-format
-msgid "Branch %s set up to track local branch %s by rebasing."
-msgstr "Branch %s konfiguriert zum Folgen von lokalem Branch %s durch Rebase."
+msgid "cannot read the current contents of '%s'"
+msgstr "kann aktuelle Inhalte von '%s' nicht lesen"
 
-#: branch.c:99
+#: apply.c:3589
 #, c-format
-msgid "Branch %s set up to track local branch %s."
-msgstr "Branch %s konfiguriert zum Folgen von lokalem Branch %s."
+msgid "Failed to fall back on three-way merge...\n"
+msgstr "Fehler beim Zurückfallen auf 3-Wege-Merge...\n"
 
-#: branch.c:104
+#: apply.c:3603
 #, c-format
-msgid "Branch %s set up to track remote ref %s by rebasing."
-msgstr "Branch %s konfiguriert zum Folgen von Remote-Referenz %s durch Rebase."
+msgid "Applied patch to '%s' with conflicts.\n"
+msgstr "Patch auf '%s' mit Konflikten angewendet.\n"
 
-#: branch.c:105
+#: apply.c:3608
 #, c-format
-msgid "Branch %s set up to track remote ref %s."
-msgstr "Branch %s konfiguriert zum Folgen von Remote-Referenz %s."
+msgid "Applied patch to '%s' cleanly.\n"
+msgstr "Patch auf '%s' sauber angewendet.\n"
 
-#: branch.c:109
+#: apply.c:3634
+msgid "removal patch leaves file contents"
+msgstr "Lösch-Patch hinterlässt Dateiinhalte"
+
+#: apply.c:3706
 #, c-format
-msgid "Branch %s set up to track local ref %s by rebasing."
-msgstr ""
-"Branch %s konfiguriert zum Folgen von lokaler Referenz %s durch Rebase."
+msgid "%s: wrong type"
+msgstr "%s: falscher Typ"
 
-#: branch.c:110
+#: apply.c:3708
 #, c-format
-msgid "Branch %s set up to track local ref %s."
-msgstr "Branch %s konfiguriert zum Folgen von lokaler Referenz %s."
+msgid "%s has type %o, expected %o"
+msgstr "%s ist vom Typ %o, erwartete %o"
 
-#: branch.c:119
-msgid "Unable to write upstream branch configuration"
-msgstr "Konnte Konfiguration zu Upstream-Branch nicht schreiben."
+#: apply.c:3859 apply.c:3861
+#, c-format
+msgid "invalid path '%s'"
+msgstr "Ungültiger Pfad '%s'"
 
-#: branch.c:156
+#: apply.c:3917
 #, c-format
-msgid "Not tracking: ambiguous information for ref %s"
-msgstr ""
-"Konfiguration zum Folgen von Branch nicht eingerichtet. Referenz %s ist "
-"mehrdeutig."
+msgid "%s: already exists in index"
+msgstr "%s ist bereits bereitgestellt"
 
-#: branch.c:185
+#: apply.c:3920
 #, c-format
-msgid "'%s' is not a valid branch name."
-msgstr "'%s' ist kein gültiger Branchname."
+msgid "%s: already exists in working directory"
+msgstr "%s existiert bereits im Arbeitsverzeichnis"
 
-#: branch.c:190
+#: apply.c:3940
 #, c-format
-msgid "A branch named '%s' already exists."
-msgstr "Branch '%s' existiert bereits."
+msgid "new mode (%o) of %s does not match old mode (%o)"
+msgstr "neuer Modus (%o) von %s entspricht nicht dem alten Modus (%o)"
 
-#: branch.c:198
-msgid "Cannot force update the current branch."
-msgstr "Kann Aktualisierung des aktuellen Branches nicht erzwingen."
+#: apply.c:3945
+#, c-format
+msgid "new mode (%o) of %s does not match old mode (%o) of %s"
+msgstr "neuer Modus (%o) von %s entspricht nicht dem alten Modus (%o) von %s"
 
-#: branch.c:218
+#: apply.c:3965
 #, 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."
+msgid "affected file '%s' is beyond a symbolic link"
+msgstr "betroffene Datei '%s' ist hinter einer symbolischen Verknüpfung"
 
-#: branch.c:220
+#: apply.c:3969
 #, c-format
-msgid "the requested upstream branch '%s' does not exist"
-msgstr "der angeforderte Upstream-Branch '%s' existiert nicht"
+msgid "%s: patch does not apply"
+msgstr "%s: Patch konnte nicht angewendet werden"
 
-#: branch.c:222
-msgid ""
-"\n"
-"If you are planning on basing your work on an upstream\n"
-"branch that already exists at the remote, you may need to\n"
-"run \"git fetch\" to retrieve it.\n"
-"\n"
-"If you are planning to push out a new local branch that\n"
-"will track its remote counterpart, you may want to use\n"
-"\"git push -u\" to set the upstream config as you push."
-msgstr ""
-"\n"
-"Falls Sie vorhaben, Ihre Arbeit auf einem bereits existierenden\n"
-"Upstream-Branch aufzubauen, sollten Sie \"git fetch\"\n"
-"ausführen, um diesen abzurufen.\n"
-"\n"
-"Falls Sie vorhaben, einen neuen lokalen Branch zu versenden\n"
-"der seinem externen Gegenstück folgen soll, können Sie\n"
-"\"git push -u\" verwenden, um den Upstream-Branch beim \"push\"\n"
-"zu konfigurieren."
+#: apply.c:3984
+#, c-format
+msgid "Checking patch %s..."
+msgstr "Prüfe Patch %s ..."
 
-#: branch.c:266
+#: apply.c:4075
 #, c-format
-msgid "Not a valid object name: '%s'."
-msgstr "Ungültiger Objekt-Name: '%s'"
+msgid "sha1 information is lacking or useless for submodule %s"
+msgstr "SHA-1 Information fehlt oder ist unbrauchbar für Submodul %s"
 
-#: branch.c:286
+#: apply.c:4082
 #, c-format
-msgid "Ambiguous object name: '%s'."
-msgstr "mehrdeutiger Objekt-Name: '%s'"
+msgid "mode change for %s, which is not in current HEAD"
+msgstr "Modusänderung für %s, was sich nicht im aktuellen HEAD befindet"
 
-#: branch.c:291
+#: apply.c:4085
 #, c-format
-msgid "Not a valid branch point: '%s'."
-msgstr "Ungültiger Branchpunkt: '%s'"
+msgid "sha1 information is lacking or useless (%s)."
+msgstr "SHA-1 Information fehlt oder ist unbrauchbar (%s)."
 
-#: branch.c:345
+#: apply.c:4090 builtin/checkout.c:233 builtin/reset.c:135
 #, c-format
-msgid "'%s' is already checked out at '%s'"
-msgstr "'%s' ist bereits in '%s' ausgecheckt"
+msgid "make_cache_entry failed for path '%s'"
+msgstr "make_cache_entry für Pfad '%s' fehlgeschlagen"
 
-#: branch.c:364
+#: apply.c:4094
 #, c-format
-msgid "HEAD of working tree %s is not updated"
-msgstr "HEAD des Arbeitsverzeichnisses %s ist nicht aktualisiert."
+msgid "could not add %s to temporary index"
+msgstr "konnte %s nicht zum temporären Index hinzufügen"
 
-#: bundle.c:34
+#: apply.c:4104
 #, c-format
-msgid "'%s' does not look like a v2 bundle file"
-msgstr "'%s' sieht nicht wie eine v2 Paketdatei aus"
+msgid "could not write temporary index to %s"
+msgstr "konnte temporären Index nicht nach %s schreiben"
 
-#: bundle.c:61
+#: apply.c:4242
 #, c-format
-msgid "unrecognized header: %s%s (%d)"
-msgstr "nicht erkannter Kopfbereich: %s%s (%d)"
+msgid "unable to remove %s from index"
+msgstr "konnte %s nicht aus dem Index entfernen"
 
-#: bundle.c:87 builtin/commit.c:778
+#: apply.c:4277
 #, c-format
-msgid "could not open '%s'"
-msgstr "Konnte '%s' nicht öffnen"
+msgid "corrupt patch for submodule %s"
+msgstr "fehlerhafter Patch für Submodul %s"
 
-#: bundle.c:139
-msgid "Repository lacks these prerequisite commits:"
-msgstr "Dem Repository fehlen folgende vorausgesetzte Commits:"
+#: apply.c:4283
+#, c-format
+msgid "unable to stat newly created file '%s'"
+msgstr "konnte neu erstellte Datei '%s' nicht lesen"
 
-#: bundle.c:163 ref-filter.c:1462 sequencer.c:630 sequencer.c:1085
-#: builtin/blame.c:2763 builtin/commit.c:1057 builtin/log.c:348
-#: builtin/log.c:890 builtin/log.c:1336 builtin/log.c:1659 builtin/log.c:1901
-#: builtin/merge.c:356 builtin/shortlog.c:170
-msgid "revision walk setup failed"
-msgstr "Einrichtung des Revisionsgangs fehlgeschlagen"
+#: apply.c:4291
+#, c-format
+msgid "unable to create backing store for newly created file %s"
+msgstr "kann internen Speicher für eben erstellte Datei %s nicht erzeugen"
 
-#: bundle.c:185
+#: apply.c:4297 apply.c:4441
 #, c-format
-msgid "The bundle contains this ref:"
-msgid_plural "The bundle contains these %d refs:"
-msgstr[0] "Das Paket enthält diese Referenz:"
-msgstr[1] "Das Paket enthält diese %d Referenzen:"
+msgid "unable to add cache entry for %s"
+msgstr "kann für %s keinen Eintrag in den Zwischenspeicher hinzufügen"
 
-#: bundle.c:192
-msgid "The bundle records a complete history."
-msgstr "Das Paket speichert eine komplette Historie."
+#: apply.c:4338
+#, c-format
+msgid "failed to write to '%s'"
+msgstr "Fehler beim Schreiben nach '%s'"
 
-#: bundle.c:194
+#: apply.c:4342
 #, 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:"
+msgid "closing file '%s'"
+msgstr "schließe Datei '%s'"
 
-#: bundle.c:253
-msgid "Could not spawn pack-objects"
-msgstr "Konnte Paketobjekte nicht erstellen"
+#: apply.c:4412
+#, c-format
+msgid "unable to write file '%s' mode %o"
+msgstr "konnte Datei '%s' mit Modus %o nicht schreiben"
 
-#: bundle.c:264
-msgid "pack-objects died"
-msgstr "Erstellung der Paketobjekte abgebrochen"
+#: apply.c:4510
+#, c-format
+msgid "Applied patch %s cleanly."
+msgstr "Patch %s sauber angewendet"
 
-#: bundle.c:304
-msgid "rev-list died"
-msgstr "\"rev-list\" abgebrochen"
+#: apply.c:4518
+msgid "internal error"
+msgstr "interner Fehler"
 
-#: bundle.c:353
+#: apply.c:4521
 #, c-format
-msgid "ref '%s' is excluded by the rev-list options"
-msgstr "Referenz '%s' wird durch \"rev-list\" Optionen ausgeschlossen"
+msgid "Applying patch %%s with %d reject..."
+msgid_plural "Applying patch %%s with %d rejects..."
+msgstr[0] "Wende Patch %%s mit %d Zurückweisung an..."
+msgstr[1] "Wende Patch %%s mit %d Zurückweisungen an..."
 
-#: bundle.c:443 builtin/log.c:165 builtin/log.c:1565 builtin/shortlog.c:273
+#: apply.c:4532
 #, c-format
-msgid "unrecognized argument: %s"
-msgstr "nicht erkanntes Argument: %s"
-
-#: bundle.c:451
-msgid "Refusing to create empty bundle."
-msgstr "Erstellung eines leeren Pakets zurückgewiesen."
+msgid "truncating .rej filename to %.*s.rej"
+msgstr "Verkürze Name von .rej Datei zu %.*s.rej"
 
-#: bundle.c:463
+#: apply.c:4540 builtin/fetch.c:740 builtin/fetch.c:989
 #, c-format
-msgid "cannot create '%s'"
-msgstr "kann '%s' nicht erstellen"
+msgid "cannot open %s"
+msgstr "kann '%s' nicht öffnen"
 
-#: bundle.c:491
-msgid "index-pack died"
-msgstr "Erstellung der Paketindexdatei abgebrochen"
+#: apply.c:4554
+#, c-format
+msgid "Hunk #%d applied cleanly."
+msgstr "Patch-Bereich #%d sauber angewendet."
 
-#: color.c:290
+#: apply.c:4558
 #, c-format
-msgid "invalid color value: %.*s"
-msgstr "Ungültiger Farbwert: %.*s"
+msgid "Rejected hunk #%d."
+msgstr "Patch-Block #%d zurückgewiesen."
 
-#: commit.c:40 builtin/am.c:433 builtin/am.c:469 builtin/am.c:1505
-#: builtin/am.c:2119
+#: apply.c:4668
 #, c-format
-msgid "could not parse %s"
-msgstr "konnte %s nicht parsen"
-
-#: commit.c:42
-#, c-format
-msgid "%s %s is not a commit!"
-msgstr "%s %s ist kein Commit!"
+msgid "Skipped patch '%s'."
+msgstr "Patch '%s' ausgelassen."
 
-#: compat/obstack.c:406 compat/obstack.c:408
-msgid "memory exhausted"
-msgstr "Speicher verbraucht"
+#: apply.c:4676
+msgid "unrecognized input"
+msgstr "nicht erkannte Eingabe"
 
-#: config.c:516
-#, c-format
-msgid "bad config line %d in blob %s"
-msgstr "Ungültige Konfigurationszeile %d in Blob %s"
+#: apply.c:4695
+msgid "unable to read index file"
+msgstr "Konnte Index-Datei nicht lesen"
 
-#: config.c:520
+#: apply.c:4833
 #, c-format
-msgid "bad config line %d in file %s"
-msgstr "Ungültige Konfigurationszeile %d in Datei %s"
+msgid "can't open patch '%s': %s"
+msgstr "kann Patch '%s' nicht öffnen: %s"
 
-#: config.c:524
+#: apply.c:4858
 #, c-format
-msgid "bad config line %d in standard input"
-msgstr "Ungültige Konfigurationszeile %d in Standard-Eingabe"
+msgid "squelched %d whitespace error"
+msgid_plural "squelched %d whitespace errors"
+msgstr[0] "unterdrückte %d Whitespace-Fehler"
+msgstr[1] "unterdrückte %d Whitespace-Fehler"
 
-#: config.c:528
+#: apply.c:4864 apply.c:4879
 #, c-format
-msgid "bad config line %d in submodule-blob %s"
-msgstr "Ungültige Konfigurationszeile %d in Submodul-Blob %s"
+msgid "%d line adds whitespace errors."
+msgid_plural "%d lines add whitespace errors."
+msgstr[0] "%d Zeile fügt Whitespace-Fehler hinzu."
+msgstr[1] "%d Zeilen fügen Whitespace-Fehler hinzu."
 
-#: config.c:532
+#: apply.c:4872
 #, c-format
-msgid "bad config line %d in command line %s"
-msgstr "Ungültige Konfigurationszeile %d in Kommandozeile %s"
+msgid "%d line applied after fixing whitespace errors."
+msgid_plural "%d lines applied after fixing whitespace errors."
+msgstr[0] "%d Zeile nach Behebung von Whitespace-Fehlern angewendet."
+msgstr[1] "%d Zeilen nach Behebung von Whitespace-Fehlern angewendet."
 
-#: config.c:536
-#, c-format
-msgid "bad config line %d in %s"
-msgstr "Ungültige Konfigurationszeile %d in %s"
+#: apply.c:4888 builtin/add.c:463 builtin/mv.c:286 builtin/rm.c:431
+msgid "Unable to write new index file"
+msgstr "Konnte neue Index-Datei nicht schreiben."
 
-#: config.c:655
-msgid "out of range"
-msgstr "Außerhalb des Bereichs"
+#: apply.c:4919 apply.c:4922 builtin/am.c:2277 builtin/am.c:2280
+#: builtin/clone.c:95 builtin/fetch.c:98 builtin/pull.c:180
+#: builtin/submodule--helper.c:281 builtin/submodule--helper.c:407
+#: builtin/submodule--helper.c:589 builtin/submodule--helper.c:592
+#: builtin/submodule--helper.c:944 builtin/submodule--helper.c:947
+msgid "path"
+msgstr "Pfad"
 
-#: config.c:655
-msgid "invalid unit"
-msgstr "Ungültige Einheit"
+#: apply.c:4920
+msgid "don't apply changes matching the given path"
+msgstr "keine Änderungen im angegebenen Pfad anwenden"
 
-#: config.c:661
-#, c-format
-msgid "bad numeric config value '%s' for '%s': %s"
-msgstr "Ungültiger numerischer Wert '%s' für Konfiguration '%s': %s"
+#: apply.c:4923
+msgid "apply changes matching the given path"
+msgstr "Änderungen nur im angegebenen Pfad anwenden"
 
-#: config.c:666
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in blob %s: %s"
-msgstr "Ungültiger numerischer Wert '%s' für Konfiguration '%s' in Blob %s: %s"
+#: apply.c:4925 builtin/am.c:2286
+msgid "num"
+msgstr "Anzahl"
 
-#: config.c:669
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in file %s: %s"
-msgstr "Ungültiger numerischer Wert '%s' für Konfiguration '%s' in Datei %s: %s"
+#: apply.c:4926
+msgid "remove <num> leading slashes from traditional diff paths"
+msgstr ""
+"<Anzahl> vorangestellte Schrägstriche von herkömmlichen Differenzpfaden "
+"entfernen"
 
-#: config.c:672
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in standard input: %s"
-msgstr "Ungültiger numerischer Wert '%s' für Konfiguration '%s' in Standard-Eingabe: %s"
+#: apply.c:4929
+msgid "ignore additions made by the patch"
+msgstr "hinzugefügte Zeilen des Patches ignorieren"
 
-#: config.c:675
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in submodule-blob %s: %s"
-msgstr "Ungültiger numerischer Wert '%s' für Konfiguration '%s' in Submodul-Blob %s: %s"
+#: apply.c:4931
+msgid "instead of applying the patch, output diffstat for the input"
+msgstr ""
+"anstatt der Anwendung des Patches, den \"diffstat\" für die Eingabe "
+"ausgegeben"
 
-#: config.c:678
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in command line %s: %s"
-msgstr "Ungültiger numerischer Wert '%s' für Konfiguration '%s' in Befehlszeile %s: %s"
+#: apply.c:4935
+msgid "show number of added and deleted lines in decimal notation"
+msgstr ""
+"die Anzahl von hinzugefügten/entfernten Zeilen in Dezimalnotation anzeigen"
 
-#: config.c:681
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in %s: %s"
-msgstr "Ungültiger numerischer Wert '%s' für Konfiguration '%s' in %s: %s"
+#: apply.c:4937
+msgid "instead of applying the patch, output a summary for the input"
+msgstr ""
+"anstatt der Anwendung des Patches, eine Zusammenfassung für die Eingabe "
+"ausgeben"
 
-#: config.c:768
-#, c-format
-msgid "failed to expand user dir in: '%s'"
-msgstr "Fehler beim Erweitern des Nutzerverzeichnisses in: '%s'"
+#: apply.c:4939
+msgid "instead of applying the patch, see if the patch is applicable"
+msgstr ""
+"anstatt der Anwendung des Patches, zeige ob Patch angewendet werden kann"
 
-#: config.c:849 config.c:860
-#, c-format
-msgid "bad zlib compression level %d"
-msgstr "ungültiger zlib Komprimierungsgrad %d"
+#: apply.c:4941
+msgid "make sure the patch is applicable to the current index"
+msgstr ""
+"sicherstellen, dass der Patch mit dem aktuellen Index angewendet werden kann"
 
-#: config.c:978
-#, c-format
-msgid "invalid mode for object creation: %s"
-msgstr "Ungültiger Modus für Objekterstellung: %s"
+#: apply.c:4943
+msgid "apply a patch without touching the working tree"
+msgstr "Patch anwenden, ohne Änderungen im Arbeitsverzeichnis vorzunehmen"
 
-#: config.c:1312
-msgid "unable to parse command-line config"
+#: apply.c:4945
+msgid "accept a patch that touches outside the working area"
 msgstr ""
-"Konnte die über die Befehlszeile angegebene Konfiguration nicht parsen."
+"Patch anwenden, der Änderungen außerhalb des Arbeitsverzeichnisses vornimmt"
 
-#: config.c:1362
-msgid "unknown error occurred while reading the configuration files"
+#: apply.c:4947
+msgid "also apply the patch (use with --stat/--summary/--check)"
+msgstr "Patch anwenden (Benutzung mit --stat/--summary/--check)"
+
+#: apply.c:4949
+msgid "attempt three-way merge if a patch does not apply"
+msgstr "versuche 3-Wege-Merge, wenn der Patch nicht angewendet werden konnte"
+
+#: apply.c:4951
+msgid "build a temporary index based on embedded index information"
 msgstr ""
-"Es trat ein unbekannter Fehler beim Lesen der Konfigurationsdateien auf."
+"einen temporären Index, basierend auf den integrierten Index-Informationen, "
+"erstellen"
 
-#: config.c:1716
-#, c-format
-msgid "unable to parse '%s' from command-line config"
+#: apply.c:4954 builtin/checkout-index.c:169 builtin/ls-files.c:505
+msgid "paths are separated with NUL character"
+msgstr "Pfade sind getrennt durch NUL Zeichen"
+
+#: apply.c:4956
+msgid "ensure at least <n> lines of context match"
 msgstr ""
-"Konnte Wert '%s' aus der über die Befehlszeile angegebenen Konfiguration\n"
-"nicht parsen."
+"sicher stellen, dass mindestens <n> Zeilen des Kontextes übereinstimmen"
 
-#: config.c:1718
-#, c-format
-msgid "bad config variable '%s' in file '%s' at line %d"
-msgstr "ungültige Konfigurationsvariable '%s' in Datei '%s' bei Zeile %d"
+#: apply.c:4957 builtin/am.c:2265
+msgid "action"
+msgstr "Aktion"
 
-#: config.c:1777
-#, c-format
-msgid "%s has multiple values"
-msgstr "%s hat mehrere Werte"
+#: apply.c:4958
+msgid "detect new or modified lines that have whitespace errors"
+msgstr "neue oder geänderte Zeilen, die Whitespace-Fehler haben, ermitteln"
 
-#: config.c:2311
-#, c-format
-msgid "could not set '%s' to '%s'"
-msgstr "Konnte '%s' nicht zu '%s' setzen."
+#: apply.c:4961 apply.c:4964
+msgid "ignore changes in whitespace when finding context"
+msgstr "Änderungen im Whitespace bei der Suche des Kontextes ignorieren"
 
-#: config.c:2313
-#, c-format
-msgid "could not unset '%s'"
-msgstr "Konnte '%s' nicht aufheben."
+#: apply.c:4967
+msgid "apply the patch in reverse"
+msgstr "den Patch in umgekehrter Reihenfolge anwenden"
 
-#: connected.c:63 builtin/fsck.c:173 builtin/prune.c:140
-msgid "Checking connectivity"
-msgstr "Prüfe Konnektivität"
+#: apply.c:4969
+msgid "don't expect at least one line of context"
+msgstr "keinen Kontext erwarten"
 
-#: connected.c:74
-msgid "Could not run 'git rev-list'"
-msgstr "Konnte 'git rev-list' nicht ausführen"
+#: apply.c:4971
+msgid "leave the rejected hunks in corresponding *.rej files"
+msgstr ""
+"zurückgewiesene Patch-Blöcke in entsprechenden *.rej Dateien hinterlassen"
 
-#: connected.c:94
-msgid "failed write to rev-list"
-msgstr "Fehler beim Schreiben nach rev-list"
+#: apply.c:4973
+msgid "allow overlapping hunks"
+msgstr "sich überlappende Patch-Blöcke erlauben"
 
-#: connected.c:101
-msgid "failed to close rev-list's stdin"
-msgstr "Fehler beim Schließen von rev-list's Standard-Eingabe"
+#: apply.c:4974 builtin/add.c:267 builtin/check-ignore.c:19
+#: builtin/commit.c:1339 builtin/count-objects.c:94 builtin/fsck.c:593
+#: builtin/log.c:1860 builtin/mv.c:110 builtin/read-tree.c:114
+msgid "be verbose"
+msgstr "erweiterte Ausgaben"
 
-#: date.c:97
-msgid "in the future"
-msgstr "in der Zukunft"
+#: apply.c:4976
+msgid "tolerate incorrectly detected missing new-line at the end of file"
+msgstr "fehlerhaft erkannten fehlenden Zeilenumbruch am Dateiende tolerieren"
 
-#: date.c:103
-#, c-format
-msgid "%lu second ago"
-msgid_plural "%lu seconds ago"
-msgstr[0] "vor %lu Sekunde"
-msgstr[1] "vor %lu Sekunden"
+#: apply.c:4979
+msgid "do not trust the line counts in the hunk headers"
+msgstr "den Zeilennummern im Kopf des Patch-Blocks nicht vertrauen"
 
-#: date.c:110
-#, c-format
-msgid "%lu minute ago"
-msgid_plural "%lu minutes ago"
-msgstr[0] "vor %lu Minute"
-msgstr[1] "vor %lu Minuten"
+#: apply.c:4981 builtin/am.c:2274
+msgid "root"
+msgstr "Wurzelverzeichnis"
 
-#: date.c:117
-#, c-format
-msgid "%lu hour ago"
-msgid_plural "%lu hours ago"
-msgstr[0] "vor %lu Stunde"
-msgstr[1] "vor %lu Stunden"
+#: apply.c:4982
+msgid "prepend <root> to all filenames"
+msgstr "<Wurzelverzeichnis> vor alle Dateinamen stellen"
 
-#: date.c:124
-#, c-format
-msgid "%lu day ago"
-msgid_plural "%lu days ago"
-msgstr[0] "vor %lu Tag"
-msgstr[1] "vor %lu Tagen"
+#: archive.c:12
+msgid "git archive [<options>] <tree-ish> [<path>...]"
+msgstr "git archive [<Optionen>] <Commit-Referenz> [<Pfad>...]"
 
-#: date.c:130
-#, c-format
-msgid "%lu week ago"
-msgid_plural "%lu weeks ago"
-msgstr[0] "vor %lu Woche"
-msgstr[1] "vor %lu Wochen"
+#: archive.c:13
+msgid "git archive --list"
+msgstr "git archive --list"
 
-#: date.c:137
-#, c-format
-msgid "%lu month ago"
-msgid_plural "%lu months ago"
-msgstr[0] "vor %lu Monat"
-msgstr[1] "vor %lu Monaten"
+#: archive.c:14
+msgid ""
+"git archive --remote <repo> [--exec <cmd>] [<options>] <tree-ish> [<path>...]"
+msgstr ""
+"git archive --remote <Repository> [--exec <Programm>] [<Optionen>] <Commit-"
+"Referenz> [<Pfad>...]"
 
-#: date.c:148
+#: archive.c:15
+msgid "git archive --remote <repo> [--exec <cmd>] --list"
+msgstr "git archive --remote <Repository> [--exec <Programm>] --list"
+
+#: archive.c:344 builtin/add.c:152 builtin/add.c:442 builtin/rm.c:327
 #, c-format
-msgid "%lu year"
-msgid_plural "%lu years"
-msgstr[0] "vor %lu Jahr"
-msgstr[1] "vor %lu Jahren"
+msgid "pathspec '%s' did not match any files"
+msgstr "Pfadspezifikation '%s' stimmt mit keinen Dateien überein"
 
-#. TRANSLATORS: "%s" is "<n> years"
-#: date.c:151
-#, c-format
-msgid "%s, %lu month ago"
-msgid_plural "%s, %lu months ago"
-msgstr[0] "%s, und %lu Monat"
-msgstr[1] "%s, und %lu Monaten"
+#: archive.c:429
+msgid "fmt"
+msgstr "Format"
 
-#: date.c:156 date.c:161
-#, c-format
-msgid "%lu year ago"
-msgid_plural "%lu years ago"
-msgstr[0] "vor %lu Jahr"
-msgstr[1] "vor %lu Jahren"
+#: archive.c:429
+msgid "archive format"
+msgstr "Archivformat"
 
-#: diffcore-order.c:24
-#, c-format
-msgid "failed to read orderfile '%s'"
-msgstr "Fehler beim Lesen der Reihenfolgedatei '%s'."
+#: archive.c:430 builtin/log.c:1429
+msgid "prefix"
+msgstr "Präfix"
 
-#: diffcore-rename.c:540
-msgid "Performing inexact rename detection"
-msgstr "Führe Erkennung für ungenaue Umbenennung aus"
+#: archive.c:431
+msgid "prepend prefix to each pathname in the archive"
+msgstr "einen Präfix vor jeden Pfadnamen in dem Archiv stellen"
 
-#: diff.c:116
-#, c-format
-msgid "  Failed to parse dirstat cut-off percentage '%s'\n"
-msgstr ""
-"  Fehler beim Parsen des abgeschnittenen \"dirstat\" Prozentsatzes '%s'\n"
+#: archive.c:432 builtin/blame.c:2603 builtin/blame.c:2604 builtin/config.c:59
+#: builtin/fast-export.c:987 builtin/fast-export.c:989 builtin/grep.c:723
+#: builtin/hash-object.c:101 builtin/ls-files.c:539 builtin/ls-files.c:542
+#: builtin/notes.c:401 builtin/notes.c:564 builtin/read-tree.c:109
+#: parse-options.h:153
+msgid "file"
+msgstr "Datei"
 
-#: diff.c:121
-#, c-format
-msgid "  Unknown dirstat parameter '%s'\n"
-msgstr "  Unbekannter \"dirstat\" Parameter '%s'\n"
+#: archive.c:433 builtin/archive.c:89
+msgid "write the archive to this file"
+msgstr "das Archiv in diese Datei schreiben"
 
-#: diff.c:225
-#, c-format
-msgid "Unknown value for 'diff.submodule' config variable: '%s'"
-msgstr "Unbekannter Wert in Konfigurationsvariable 'diff.dirstat': '%s'"
+#: archive.c:435
+msgid "read .gitattributes in working directory"
+msgstr ".gitattributes aus dem Arbeitsverzeichnis lesen"
 
-#: diff.c:277
-#, c-format
-msgid ""
-"Found errors in 'diff.dirstat' config variable:\n"
-"%s"
-msgstr ""
-"Fehler in 'diff.dirstat' Konfigurationsvariable gefunden:\n"
-"%s"
+#: archive.c:436
+msgid "report archived files on stderr"
+msgstr "archivierte Dateien in der Standard-Fehlerausgabe ausgeben"
 
-#: diff.c:3017
-#, c-format
-msgid "external diff died, stopping at %s"
-msgstr "externes Diff-Programm unerwartet beendet, angehalten bei %s"
+#: archive.c:437
+msgid "store only"
+msgstr "nur speichern"
 
-#: diff.c:3415
-msgid "--follow requires exactly one pathspec"
-msgstr "--follow erfordert genau eine Pfadspezifikation"
+#: archive.c:438
+msgid "compress faster"
+msgstr "schneller komprimieren"
 
-#: diff.c:3578
-#, c-format
-msgid ""
-"Failed to parse --dirstat/-X option parameter:\n"
-"%s"
-msgstr ""
-"Fehler beim Parsen des --dirstat/-X Optionsparameters:\n"
-"%s"
+#: archive.c:446
+msgid "compress better"
+msgstr "besser komprimieren"
 
-#: diff.c:3592
-#, c-format
-msgid "Failed to parse --submodule option parameter: '%s'"
-msgstr "Fehler beim Parsen des --submodule Optionsparameters: '%s'"
+#: archive.c:449
+msgid "list supported archive formats"
+msgstr "unterstützte Archivformate auflisten"
 
-#: dir.c:1823
-msgid "failed to get kernel name and information"
-msgstr "Fehler beim Sammeln von Namen und Informationen zum Kernel"
+#: archive.c:451 builtin/archive.c:90 builtin/clone.c:85 builtin/clone.c:88
+#: builtin/submodule--helper.c:601 builtin/submodule--helper.c:953
+msgid "repo"
+msgstr "Repository"
 
-#: dir.c:1942
-msgid "Untracked cache is disabled on this system or location."
-msgstr ""
-"Cache für unversionierte Dateien ist auf diesem System oder\n"
-"für dieses Verzeichnis deaktiviert."
+#: archive.c:452 builtin/archive.c:91
+msgid "retrieve the archive from remote repository <repo>"
+msgstr "Archiv vom Remote-Repository <Repository> abrufen"
 
-#: gpg-interface.c:178
-msgid "gpg failed to sign the data"
-msgstr "gpg beim Signieren der Daten fehlgeschlagen"
+#: archive.c:453 builtin/archive.c:92 builtin/notes.c:485
+msgid "command"
+msgstr "Programm"
 
-#: gpg-interface.c:208
-msgid "could not create temporary file"
-msgstr "konnte temporäre Datei nicht erstellen"
+#: archive.c:454 builtin/archive.c:93
+msgid "path to the remote git-upload-archive command"
+msgstr "Pfad zum externen \"git-upload-archive\"-Programm"
 
-#: gpg-interface.c:210
-#, c-format
-msgid "failed writing detached signature to '%s'"
-msgstr "Fehler beim Schreiben der losgelösten Signatur nach '%s'"
+#: archive.c:461
+msgid "Unexpected option --remote"
+msgstr "Unerwartete Option --remote"
+
+#: archive.c:463
+msgid "Option --exec can only be used together with --remote"
+msgstr "Die Option --exec kann nur zusammen mit --remote verwendet werden."
+
+#: archive.c:465
+msgid "Unexpected option --output"
+msgstr "Unerwartete Option --output"
 
-#: grep.c:1792
+#: archive.c:487
 #, c-format
-msgid "'%s': unable to read %s"
-msgstr "'%s': konnte %s nicht lesen"
+msgid "Unknown archive format '%s'"
+msgstr "Unbekanntes Archivformat '%s'"
 
-#: grep.c:1809 builtin/clone.c:382 builtin/diff.c:84 builtin/rm.c:155
+#: archive.c:494
 #, c-format
-msgid "failed to stat '%s'"
-msgstr "Konnte '%s' nicht lesen"
+msgid "Argument not supported for format '%s': -%d"
+msgstr "Argument für Format '%s' nicht unterstützt: -%d"
+
+#: attr.c:263
+msgid ""
+"Negative patterns are ignored in git attributes\n"
+"Use '\\!' for literal leading exclamation."
+msgstr ""
+"Verneinende Muster werden in Git-Attributen ignoriert.\n"
+"Benutzen Sie '\\!' für führende Ausrufezeichen."
 
-#: grep.c:1820
+#: bisect.c:441
 #, c-format
-msgid "'%s': short read"
-msgstr "'%s': read() zu kurz"
+msgid "Could not open file '%s'"
+msgstr "Konnte Datei '%s' nicht öffnen"
 
-#: help.c:205
+#: bisect.c:446
 #, c-format
-msgid "available git commands in '%s'"
-msgstr "Vorhandene Git-Befehle in '%s'"
+msgid "Badly quoted content in file '%s': %s"
+msgstr "Ungültiger Inhalt bzgl. Anführungsstriche in Datei '%s': %s"
 
-#: help.c:212
-msgid "git commands available from elsewhere on your $PATH"
-msgstr "Vorhandene Git-Befehle anderswo in Ihrem $PATH"
+#: bisect.c:655
+#, c-format
+msgid "We cannot bisect more!\n"
+msgstr "Keine binäre Suche mehr möglich!\n"
 
-#: help.c:244
-msgid "These are common Git commands used in various situations:"
-msgstr "Allgemeine Git-Befehle, verwendet in verschiedenen Situationen:"
+#: bisect.c:708
+#, c-format
+msgid "Not a valid commit name %s"
+msgstr "%s ist kein gültiger Commit-Name"
 
-#: help.c:309
+#: bisect.c:732
 #, c-format
 msgid ""
-"'%s' appears to be a git command, but we were not\n"
-"able to execute it. Maybe git-%s is broken?"
+"The merge base %s is bad.\n"
+"This means the bug has been fixed between %s and [%s].\n"
 msgstr ""
-"'%s' scheint ein git-Befehl zu sein, konnte aber\n"
-"nicht ausgeführt werden. Vielleicht ist git-%s fehlerhaft?"
-
-#: help.c:366
-msgid "Uh oh. Your system reports no Git commands at all."
-msgstr "Uh oh. Keine Git-Befehle auf Ihrem System vorhanden."
+"Die Merge-Basis %s ist fehlerhaft.\n"
+"Das bedeutet, der Fehler wurde zwischen %s und [%s] behoben.\n"
 
-#: help.c:388
+#: bisect.c:737
 #, c-format
 msgid ""
-"WARNING: You called a Git command named '%s', which does not exist.\n"
-"Continuing under the assumption that you meant '%s'"
+"The merge base %s is new.\n"
+"The property has changed between %s and [%s].\n"
 msgstr ""
-"Warnung: Sie haben den nicht existierenden Git-Befehl '%s' ausgeführt.\n"
-"Setze fort unter der Annahme, dass Sie '%s' gemeint haben."
-
-#: help.c:393
-#, c-format
-msgid "in %0.1f seconds automatically..."
-msgstr "Automatische Ausführung in %0.1f Sekunden ..."
+"Die Merge-Basis %s ist neu.\n"
+"Das bedeutet, die Eigenschaft hat sich zwischen %s und [%s] geändert.\n"
 
-#: help.c:400
+#: bisect.c:742
 #, c-format
-msgid "git: '%s' is not a git command. See 'git --help'."
-msgstr "git: '%s' ist kein Git-Befehl. Siehe 'git --help'."
-
-#: help.c:404 help.c:470
 msgid ""
-"\n"
-"Did you mean this?"
-msgid_plural ""
-"\n"
-"Did you mean one of these?"
-msgstr[0] ""
-"\n"
-"Haben Sie das gemeint?"
-msgstr[1] ""
-"\n"
-"Haben Sie eines von diesen gemeint?"
+"The merge base %s is %s.\n"
+"This means the first '%s' commit is between %s and [%s].\n"
+msgstr ""
+"Die Merge-Basis %s ist %s.\n"
+"Das bedeutet, der erste '%s' Commit befindet sich zwischen %s und [%s]\n"
 
-#: help.c:466
+#: bisect.c:750
 #, c-format
-msgid "%s: %s - %s"
-msgstr "%s: %s - %s"
+msgid ""
+"Some %s revs are not ancestor of the %s rev.\n"
+"git bisect cannot work properly in this case.\n"
+"Maybe you mistook %s and %s revs?\n"
+msgstr ""
+"Manche %s Commits sind keine Vorgänger des %s Commits.\n"
+"git bisect kann in diesem Fall nicht richtig arbeiten.\n"
+"Vielleicht verwechselten Sie %s und %s Commits?\n"
 
-#: lockfile.c:152
+#: bisect.c:763
 #, c-format
 msgid ""
-"Unable to create '%s.lock': %s.\n"
-"\n"
-"Another git process seems to be running in this repository, e.g.\n"
-"an editor opened by 'git commit'. Please make sure all processes\n"
-"are terminated then try again. If it still fails, a git process\n"
-"may have crashed in this repository earlier:\n"
-"remove the file manually to continue."
+"the merge base between %s and [%s] must be skipped.\n"
+"So we cannot be sure the first %s commit is between %s and %s.\n"
+"We continue anyway."
 msgstr ""
-"Konnte '%s.lock' nicht erstellen: %s.\n"
-"\n"
-"Ein anderer Git-Prozess scheint in diesem Repository ausgeführt\n"
-"zu werden, zum Beispiel ein noch offener Editor von 'git commit'.\n"
-"Bitte stellen Sie sicher, dass alle Prozesse beendet wurden und\n"
-"versuchen Sie es erneut. Falls es immer noch fehlschlägt, könnte\n"
-"ein früherer Git-Prozess in diesem Repository abgestürzt sein:\n"
-"Löschen Sie die Datei manuell um fortzufahren."
+"Die Merge-Basis zwischen %s und [%s] muss ausgelassen werden.\n"
+"Es kann daher nicht sichergestellt werden, dass sich der\n"
+"erste %s Commit zwischen %s und %s befindet.\n"
+"Es wird dennoch fortgesetzt."
 
-#: lockfile.c:160
+#: bisect.c:798
 #, c-format
-msgid "Unable to create '%s.lock': %s"
-msgstr "Konnte '%s.lock' nicht erstellen: %s"
+msgid "Bisecting: a merge base must be tested\n"
+msgstr "binäre Suche: eine Merge-Basis muss geprüft werden\n"
 
-#: merge.c:41
-msgid "failed to read the cache"
-msgstr "Lesen des Zwischenspeichers fehlgeschlagen"
+#: bisect.c:849
+#, c-format
+msgid "a %s revision is needed"
+msgstr "ein %s Commit wird benötigt"
 
-#: merge.c:94 builtin/am.c:1992 builtin/am.c:2027 builtin/checkout.c:375
-#: builtin/checkout.c:589 builtin/clone.c:732
-msgid "unable to write new index file"
-msgstr "Konnte neue Index-Datei nicht schreiben."
-
-#: merge-recursive.c:209
-msgid "(bad commit)\n"
-msgstr "(ungültiger Commit)\n"
+#: bisect.c:866 builtin/notes.c:174 builtin/tag.c:248
+#, c-format
+msgid "could not create file '%s'"
+msgstr "konnte Datei '%s' nicht erstellen"
 
-#: merge-recursive.c:231
+#: bisect.c:917
 #, c-format
-msgid "addinfo_cache failed for path '%s'"
-msgstr "addinfo_cache für Pfad '%s' fehlgeschlagen"
+msgid "could not read file '%s'"
+msgstr "Konnte Datei '%s' nicht lesen"
 
-#: merge-recursive.c:301
-msgid "error building trees"
-msgstr "Fehler beim Erstellen der \"Tree\"-Objekte"
+#: bisect.c:947
+msgid "reading bisect refs failed"
+msgstr "Lesen von Referenzen für binäre Suche fehlgeschlagen"
 
-#: merge-recursive.c:720
+#: bisect.c:967
 #, c-format
-msgid "failed to create path '%s'%s"
-msgstr "Fehler beim Erstellen des Pfades '%s'%s"
+msgid "%s was both %s and %s\n"
+msgstr "%s war sowohl %s als auch %s\n"
 
-#: merge-recursive.c:731
+#: bisect.c:975
 #, c-format
-msgid "Removing %s to make room for subdirectory\n"
-msgstr "Entferne %s, um Platz für Unterverzeichnis zu schaffen\n"
+msgid ""
+"No testable commit found.\n"
+"Maybe you started with bad path parameters?\n"
+msgstr ""
+"Kein testbarer Commit gefunden.\n"
+"Vielleicht starteten Sie mit falschen Pfad-Parametern?\n"
 
-#: merge-recursive.c:745 merge-recursive.c:764
-msgid ": perhaps a D/F conflict?"
-msgstr ": vielleicht ein Verzeichnis/Datei-Konflikt?"
+#: bisect.c:994
+#, c-format
+msgid "(roughly %d step)"
+msgid_plural "(roughly %d steps)"
+msgstr[0] "(ungefähr %d Schritt)"
+msgstr[1] "(ungefähr %d Schritte)"
 
-#: merge-recursive.c:754
+#. TRANSLATORS: the last %s will be replaced with
+#. "(roughly %d steps)" translation
+#: bisect.c:998
 #, c-format
-msgid "refusing to lose untracked file at '%s'"
-msgstr "verweigere, da unversionierte Dateien in '%s' verloren gehen würden"
+msgid "Bisecting: %d revision left to test after this %s\n"
+msgid_plural "Bisecting: %d revisions left to test after this %s\n"
+msgstr[0] "binäre Suche: danach noch %d Commit zum Testen übrig %s\n"
+msgstr[1] "binäre Suche: danach noch %d Commits zum Testen übrig %s\n"
 
-#: merge-recursive.c:796
+#: branch.c:53
 #, c-format
-msgid "cannot read object %s '%s'"
-msgstr "kann Objekt %s '%s' nicht lesen"
+msgid ""
+"\n"
+"After fixing the error cause you may try to fix up\n"
+"the remote tracking information by invoking\n"
+"\"git branch --set-upstream-to=%s%s%s\"."
+msgstr ""
+"\n"
+"Nachdem Sie die Fehlerursache behoben haben, können Sie\n"
+"die Tracking-Informationen mit\n"
+"\"git branch --set-upstream-to=%s%s%s\"\n"
+"erneut setzen."
 
-#: merge-recursive.c:798
+#: branch.c:67
 #, c-format
-msgid "blob expected for %s '%s'"
-msgstr "Blob erwartet für %s '%s'"
+msgid "Not setting branch %s as its own upstream."
+msgstr "Branch %s kann nicht sein eigener Upstream-Branch sein."
 
-#: merge-recursive.c:822
+#: branch.c:93
 #, c-format
-msgid "failed to open '%s': %s"
-msgstr "Fehler beim Öffnen von '%s': %s"
+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."
 
-#: merge-recursive.c:833
+#: branch.c:94
 #, c-format
-msgid "failed to symlink '%s': %s"
-msgstr "Fehler beim Erstellen einer symbolischen Verknüpfung für '%s': %s"
+msgid "Branch %s set up to track remote branch %s from %s."
+msgstr "Branch %s konfiguriert zum Folgen von Remote-Branch %s von %s."
 
-#: merge-recursive.c:838
+#: branch.c:98
 #, c-format
-msgid "do not know what to do with %06o %s '%s'"
-msgstr "weiß nicht was mit %06o %s '%s' zu machen ist"
+msgid "Branch %s set up to track local branch %s by rebasing."
+msgstr "Branch %s konfiguriert zum Folgen von lokalem Branch %s durch Rebase."
 
-#: merge-recursive.c:978
-msgid "Failed to execute internal merge"
-msgstr "Fehler bei Ausführung des internen Merges"
+#: branch.c:99
+#, c-format
+msgid "Branch %s set up to track local branch %s."
+msgstr "Branch %s konfiguriert zum Folgen von lokalem Branch %s."
 
-#: merge-recursive.c:982
+#: branch.c:104
 #, c-format
-msgid "Unable to add %s to database"
-msgstr "Konnte %s nicht zur Datenbank hinzufügen"
+msgid "Branch %s set up to track remote ref %s by rebasing."
+msgstr "Branch %s konfiguriert zum Folgen von Remote-Referenz %s durch Rebase."
 
-#: merge-recursive.c:1081 merge-recursive.c:1095
+#: branch.c:105
 #, c-format
-msgid ""
-"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
-"in tree."
-msgstr ""
-"KONFLIKT (%s/löschen): %s gelöscht in %s und %s in %s. Stand %s von %s wurde "
-"im Arbeitsbereich gelassen."
+msgid "Branch %s set up to track remote ref %s."
+msgstr "Branch %s konfiguriert zum Folgen von Remote-Referenz %s."
 
-#: merge-recursive.c:1087 merge-recursive.c:1100
+#: branch.c:109
 #, c-format
-msgid ""
-"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
-"in tree at %s."
+msgid "Branch %s set up to track local ref %s by rebasing."
 msgstr ""
-"KONFLIKT (%s/löschen): %s gelöscht in %s und %s in %s. Stand %s von %s wurde "
-"im Arbeitsbereich bei %s gelassen."
+"Branch %s konfiguriert zum Folgen von lokaler Referenz %s durch Rebase."
 
-#: merge-recursive.c:1143
-msgid "rename"
-msgstr "umbenennen"
+#: branch.c:110
+#, c-format
+msgid "Branch %s set up to track local ref %s."
+msgstr "Branch %s konfiguriert zum Folgen von lokaler Referenz %s."
 
-#: merge-recursive.c:1143
-msgid "renamed"
-msgstr "umbenannt"
+#: branch.c:119
+msgid "Unable to write upstream branch configuration"
+msgstr "Konnte Konfiguration zu Upstream-Branch nicht schreiben."
 
-#: merge-recursive.c:1200
+#: branch.c:156
 #, 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"
+msgid "Not tracking: ambiguous information for ref %s"
+msgstr ""
+"Konfiguration zum Folgen von Branch nicht eingerichtet. Referenz %s ist "
+"mehrdeutig."
 
-#: merge-recursive.c:1225
+#: branch.c:185
 #, c-format
-msgid ""
-"CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
-"\"->\"%s\" in \"%s\"%s"
-msgstr ""
-"KONFLIKT (umbenennen/umbenennen): Benenne um \"%s\"->\"%s\" in Branch \"%s\" "
-"und \"%s\"->\"%s\" in Branch \"%s\"%s"
+msgid "'%s' is not a valid branch name."
+msgstr "'%s' ist kein gültiger Branchname."
 
-#: merge-recursive.c:1230
-msgid " (left unresolved)"
-msgstr " (bleibt unaufgelöst)"
+#: branch.c:190
+#, c-format
+msgid "A branch named '%s' already exists."
+msgstr "Branch '%s' existiert bereits."
 
-#: merge-recursive.c:1292
+#: branch.c:198
+msgid "Cannot force update the current branch."
+msgstr "Kann Aktualisierung des aktuellen Branches nicht erzwingen."
+
+#: branch.c:218
 #, c-format
-msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s"
+msgid "Cannot setup tracking information; starting point '%s' is not a branch."
 msgstr ""
-"KONFLIKT (umbenennen/umbenennen): Benenne um %s->%s in %s. Benenne um %s->%s "
-"in %s"
+"Kann Tracking-Informationen nicht einrichten; Startpunkt '%s' ist kein "
+"Branch."
 
-#: merge-recursive.c:1325
+#: branch.c:220
 #, c-format
-msgid "Renaming %s to %s and %s to %s instead"
-msgstr "Benenne stattdessen %s nach %s und %s nach %s um"
+msgid "the requested upstream branch '%s' does not exist"
+msgstr "der angeforderte Upstream-Branch '%s' existiert nicht"
 
-#: merge-recursive.c:1531
-#, c-format
-msgid "CONFLICT (rename/add): Rename %s->%s in %s. %s added in %s"
+#: branch.c:222
+msgid ""
+"\n"
+"If you are planning on basing your work on an upstream\n"
+"branch that already exists at the remote, you may need to\n"
+"run \"git fetch\" to retrieve it.\n"
+"\n"
+"If you are planning to push out a new local branch that\n"
+"will track its remote counterpart, you may want to use\n"
+"\"git push -u\" to set the upstream config as you push."
 msgstr ""
-"KONFLIKT (umbenennen/hinzufügen): Benenne um %s->%s in %s. %s hinzugefügt in "
-"%s"
+"\n"
+"Falls Sie vorhaben, Ihre Arbeit auf einem bereits existierenden\n"
+"Upstream-Branch aufzubauen, sollten Sie \"git fetch\"\n"
+"ausführen, um diesen abzurufen.\n"
+"\n"
+"Falls Sie vorhaben, einen neuen lokalen Branch zu versenden\n"
+"der seinem externen Gegenstück folgen soll, können Sie\n"
+"\"git push -u\" verwenden, um den Upstream-Branch beim \"push\"\n"
+"zu konfigurieren."
 
-#: merge-recursive.c:1546
+#: branch.c:265
 #, c-format
-msgid "Adding merged %s"
-msgstr "Füge zusammengeführte Datei %s hinzu"
+msgid "Not a valid object name: '%s'."
+msgstr "Ungültiger Objekt-Name: '%s'"
 
-#: merge-recursive.c:1553 merge-recursive.c:1766
+#: branch.c:285
 #, c-format
-msgid "Adding as %s instead"
-msgstr "Füge stattdessen als %s hinzu"
+msgid "Ambiguous object name: '%s'."
+msgstr "mehrdeutiger Objekt-Name: '%s'"
 
-#: merge-recursive.c:1610
+#: branch.c:290
 #, c-format
-msgid "cannot read object %s"
-msgstr "kann Objekt %s nicht lesen"
+msgid "Not a valid branch point: '%s'."
+msgstr "Ungültiger Branchpunkt: '%s'"
 
-#: merge-recursive.c:1613
+#: branch.c:344
 #, c-format
-msgid "object %s is not a blob"
-msgstr "Objekt %s ist kein Blob"
-
-#: merge-recursive.c:1666
-msgid "modify"
-msgstr "ändern"
-
-#: merge-recursive.c:1666
-msgid "modified"
-msgstr "geändert"
+msgid "'%s' is already checked out at '%s'"
+msgstr "'%s' ist bereits in '%s' ausgecheckt"
 
-#: merge-recursive.c:1676
-msgid "content"
-msgstr "Inhalt"
+#: branch.c:363
+#, c-format
+msgid "HEAD of working tree %s is not updated"
+msgstr "HEAD des Arbeitsverzeichnisses %s ist nicht aktualisiert."
 
-#: merge-recursive.c:1683
-msgid "add/add"
-msgstr "hinzufügen/hinzufügen"
+#: bundle.c:34
+#, c-format
+msgid "'%s' does not look like a v2 bundle file"
+msgstr "'%s' sieht nicht wie eine v2 Paketdatei aus"
 
-#: merge-recursive.c:1718
+#: bundle.c:61
 #, c-format
-msgid "Skipped %s (merged same as existing)"
-msgstr "%s ausgelassen (Ergebnis des Merges existiert bereits)"
+msgid "unrecognized header: %s%s (%d)"
+msgstr "nicht erkannter Kopfbereich: %s%s (%d)"
 
-#: merge-recursive.c:1732
+#: bundle.c:87 sequencer.c:963 builtin/commit.c:777
 #, c-format
-msgid "Auto-merging %s"
-msgstr "automatischer Merge von %s"
+msgid "could not open '%s'"
+msgstr "Konnte '%s' nicht öffnen"
 
-#: merge-recursive.c:1736 git-submodule.sh:919
-msgid "submodule"
-msgstr "Submodul"
+#: bundle.c:139
+msgid "Repository lacks these prerequisite commits:"
+msgstr "Dem Repository fehlen folgende vorausgesetzte Commits:"
 
-#: merge-recursive.c:1737
+#: bundle.c:163 ref-filter.c:1462 sequencer.c:830 sequencer.c:1374
+#: builtin/blame.c:2814 builtin/commit.c:1061 builtin/log.c:348
+#: builtin/log.c:890 builtin/log.c:1340 builtin/log.c:1666 builtin/log.c:1909
+#: builtin/merge.c:356 builtin/shortlog.c:170
+msgid "revision walk setup failed"
+msgstr "Einrichtung des Revisionsgangs fehlgeschlagen"
+
+#: bundle.c:185
 #, c-format
-msgid "CONFLICT (%s): Merge conflict in %s"
-msgstr "KONFLIKT (%s): Merge-Konflikt in %s"
+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:"
 
-#: merge-recursive.c:1831
+#: bundle.c:192
+msgid "The bundle records a complete history."
+msgstr "Das Paket speichert eine komplette Historie."
+
+#: bundle.c:194
 #, c-format
-msgid "Removing %s"
-msgstr "Entferne %s"
+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:"
 
-#: merge-recursive.c:1857
-msgid "file/directory"
-msgstr "Datei/Verzeichnis"
+#: bundle.c:253
+msgid "Could not spawn pack-objects"
+msgstr "Konnte Paketobjekte nicht erstellen"
 
-#: merge-recursive.c:1863
-msgid "directory/file"
-msgstr "Verzeichnis/Datei"
+#: bundle.c:264
+msgid "pack-objects died"
+msgstr "Erstellung der Paketobjekte abgebrochen"
 
-#: merge-recursive.c:1868
+#: bundle.c:304
+msgid "rev-list died"
+msgstr "\"rev-list\" abgebrochen"
+
+#: bundle.c:353
 #, 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."
+msgid "ref '%s' is excluded by the rev-list options"
+msgstr "Referenz '%s' wird durch \"rev-list\" Optionen ausgeschlossen"
 
-#: merge-recursive.c:1877
+#: bundle.c:443 builtin/log.c:165 builtin/log.c:1572 builtin/shortlog.c:273
 #, c-format
-msgid "Adding %s"
-msgstr "Füge %s hinzu"
+msgid "unrecognized argument: %s"
+msgstr "nicht erkanntes Argument: %s"
 
-#: merge-recursive.c:1914
-msgid "Already up-to-date!"
-msgstr "Bereits aktuell!"
+#: bundle.c:451
+msgid "Refusing to create empty bundle."
+msgstr "Erstellung eines leeren Pakets zurückgewiesen."
 
-#: merge-recursive.c:1923
+#: bundle.c:463
 #, c-format
-msgid "merging of trees %s and %s failed"
-msgstr "Zusammenführen der \"Tree\"-Objekte %s und %s fehlgeschlagen"
+msgid "cannot create '%s'"
+msgstr "kann '%s' nicht erstellen"
 
-#: merge-recursive.c:2006
-msgid "Merging:"
-msgstr "Merge:"
+#: bundle.c:491
+msgid "index-pack died"
+msgstr "Erstellung der Paketindexdatei abgebrochen"
 
-#: merge-recursive.c:2019
+#: color.c:290
 #, 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:2058
-msgid "merge returned no commit"
-msgstr "Merge hat keinen Commit zurückgegeben"
+msgid "invalid color value: %.*s"
+msgstr "Ungültiger Farbwert: %.*s"
 
-#: merge-recursive.c:2121
+#: commit.c:40 builtin/am.c:421 builtin/am.c:457 builtin/am.c:1493
+#: builtin/am.c:2127
 #, c-format
-msgid "Could not parse object '%s'"
-msgstr "Konnte Objekt '%s' nicht parsen."
+msgid "could not parse %s"
+msgstr "konnte %s nicht parsen"
 
-#: merge-recursive.c:2135 builtin/merge.c:641 builtin/merge.c:788
-msgid "Unable to write index."
-msgstr "Konnte Index nicht schreiben."
+#: commit.c:42
+#, c-format
+msgid "%s %s is not a commit!"
+msgstr "%s %s ist kein Commit!"
 
-#: notes-utils.c:41
-msgid "Cannot commit uninitialized/unreferenced notes tree"
+#: commit.c:1514
+msgid ""
+"Warning: commit message did not conform to UTF-8.\n"
+"You may want to amend it after fixing the message, or set the config\n"
+"variable i18n.commitencoding to the encoding your project uses.\n"
 msgstr ""
-"Kann uninitialisiertes/unreferenzierte Notiz-Verzeichnis nicht committen."
+"Warnung: Die Commit-Beschreibung ist nicht UTF-8 konform.\n"
+"Sie können das Nachbessern, nachdem Sie die Beschreibung korrigiert haben,\n"
+"oder Sie setzen die Konfigurationsvariable i18n.commitencoding auf das Encoding,\n"
+"welches von ihrem Projekt verwendet wird.\n"
 
-#: notes-utils.c:100
-#, c-format
-msgid "Bad notes.rewriteMode value: '%s'"
-msgstr "Ungültiger notes.rewriteMode Wert: '%s'"
+#: compat/obstack.c:406 compat/obstack.c:408
+msgid "memory exhausted"
+msgstr "Speicher verbraucht"
 
-#: notes-utils.c:110
+#: config.c:516
 #, c-format
-msgid "Refusing to rewrite notes in %s (outside of refs/notes/)"
-msgstr ""
-"Umschreiben der Notizen in %s zurückgewiesen (außerhalb von refs/notes/)"
+msgid "bad config line %d in blob %s"
+msgstr "Ungültige Konfigurationszeile %d in Blob %s"
 
-#. TRANSLATORS: The first %s is the name of the
-#. environment variable, the second %s is its value
-#: notes-utils.c:137
+#: config.c:520
 #, c-format
-msgid "Bad %s value: '%s'"
-msgstr "Ungültiger %s Wert: '%s'"
+msgid "bad config line %d in file %s"
+msgstr "Ungültige Konfigurationszeile %d in Datei %s"
 
-#: object.c:242
+#: config.c:524
 #, c-format
-msgid "unable to parse object: %s"
-msgstr "Konnte Objekt '%s' nicht parsen."
-
-#: parse-options.c:572
-msgid "..."
-msgstr "..."
+msgid "bad config line %d in standard input"
+msgstr "Ungültige Konfigurationszeile %d in Standard-Eingabe"
 
-#: parse-options.c:590
+#: config.c:528
 #, c-format
-msgid "usage: %s"
-msgstr "Verwendung: %s"
+msgid "bad config line %d in submodule-blob %s"
+msgstr "Ungültige Konfigurationszeile %d in Submodul-Blob %s"
 
-#. TRANSLATORS: the colon here should align with the
-#. one in "usage: %s" translation
-#: parse-options.c:594
+#: config.c:532
 #, c-format
-msgid "   or: %s"
-msgstr "      oder: %s"
+msgid "bad config line %d in command line %s"
+msgstr "Ungültige Konfigurationszeile %d in Kommandozeile %s"
 
-#: parse-options.c:597
+#: config.c:536
 #, c-format
-msgid "    %s"
-msgstr "    %s"
+msgid "bad config line %d in %s"
+msgstr "Ungültige Konfigurationszeile %d in %s"
 
-#: parse-options.c:631
-msgid "-NUM"
-msgstr "-NUM"
+#: config.c:655
+msgid "out of range"
+msgstr "Außerhalb des Bereichs"
 
-#: parse-options-cb.c:108
+#: config.c:655
+msgid "invalid unit"
+msgstr "Ungültige Einheit"
+
+#: config.c:661
 #, c-format
-msgid "malformed object name '%s'"
-msgstr "fehlerhafter Objekt-Name '%s'"
+msgid "bad numeric config value '%s' for '%s': %s"
+msgstr "Ungültiger numerischer Wert '%s' für Konfiguration '%s': %s"
 
-#: path.c:798
+#: config.c:666
 #, c-format
-msgid "Could not make %s writable by group"
-msgstr "Konnte Gruppenschreibrecht für %s nicht setzen."
+msgid "bad numeric config value '%s' for '%s' in blob %s: %s"
+msgstr "Ungültiger numerischer Wert '%s' für Konfiguration '%s' in Blob %s: %s"
 
-#: pathspec.c:133
-msgid "global 'glob' and 'noglob' pathspec settings are incompatible"
+#: config.c:669
+#, c-format
+msgid "bad numeric config value '%s' for '%s' in file %s: %s"
 msgstr ""
-"Globale Einstellungen zur Pfadspezifikation 'glob' und 'noglob' sind "
-"inkompatibel."
+"Ungültiger numerischer Wert '%s' für Konfiguration '%s' in Datei %s: %s"
 
-#: pathspec.c:143
-msgid ""
-"global 'literal' pathspec setting is incompatible with all other global "
-"pathspec settings"
+#: config.c:672
+#, c-format
+msgid "bad numeric config value '%s' for '%s' in standard input: %s"
 msgstr ""
-"Globale Einstellung zur Pfadspezifikation 'literal' ist inkompatibel\n"
-"mit allen anderen Optionen."
-
-#: pathspec.c:177
-msgid "invalid parameter for pathspec magic 'prefix'"
-msgstr "ungültiger Parameter für Pfadspezifikationsangabe 'prefix'"
+"Ungültiger numerischer Wert '%s' für Konfiguration '%s' in Standard-Eingabe: "
+"%s"
 
-#: pathspec.c:183
+#: config.c:675
 #, c-format
-msgid "Invalid pathspec magic '%.*s' in '%s'"
-msgstr "ungültige Pfadspezifikationsangabe '%.*s' in '%s'"
+msgid "bad numeric config value '%s' for '%s' in submodule-blob %s: %s"
+msgstr ""
+"Ungültiger numerischer Wert '%s' für Konfiguration '%s' in Submodul-Blob %s: "
+"%s"
 
-#: pathspec.c:187
+#: config.c:678
 #, c-format
-msgid "Missing ')' at the end of pathspec magic in '%s'"
-msgstr "Fehlendes ')' am Ende der Pfadspezifikationsangabe in '%s'"
+msgid "bad numeric config value '%s' for '%s' in command line %s: %s"
+msgstr ""
+"Ungültiger numerischer Wert '%s' für Konfiguration '%s' in Befehlszeile %s: "
+"%s"
 
-#: pathspec.c:205
+#: config.c:681
 #, c-format
-msgid "Unimplemented pathspec magic '%c' in '%s'"
-msgstr "nicht unterstützte Pfadspezifikationsangabe '%c' in '%s'"
+msgid "bad numeric config value '%s' for '%s' in %s: %s"
+msgstr "Ungültiger numerischer Wert '%s' für Konfiguration '%s' in %s: %s"
 
-#: pathspec.c:230
+#: config.c:768
 #, c-format
-msgid "%s: 'literal' and 'glob' are incompatible"
-msgstr "%s: 'literal' und 'glob' sind inkompatibel"
+msgid "failed to expand user dir in: '%s'"
+msgstr "Fehler beim Erweitern des Nutzerverzeichnisses in: '%s'"
 
-#: pathspec.c:241
+#: config.c:852 config.c:863
 #, c-format
-msgid "%s: '%s' is outside repository"
-msgstr "%s: '%s' liegt außerhalb des Repositories"
+msgid "bad zlib compression level %d"
+msgstr "ungültiger zlib Komprimierungsgrad %d"
 
-#: pathspec.c:291
+#: config.c:978
 #, c-format
-msgid "Pathspec '%s' is in submodule '%.*s'"
-msgstr "Pfadspezifikation '%s' befindet sich in Submodul '%.*s'"
+msgid "invalid mode for object creation: %s"
+msgstr "Ungültiger Modus für Objekterstellung: %s"
 
-#: pathspec.c:353
-#, c-format
-msgid "%s: pathspec magic not supported by this command: %s"
+#: config.c:1312
+msgid "unable to parse command-line config"
 msgstr ""
-"%s: Pfadspezifikationsangabe wird von diesem Befehl nicht unterstützt: %s"
-
-#: pathspec.c:433
-#, c-format
-msgid "pathspec '%s' is beyond a symbolic link"
-msgstr "Pfadspezifikation '%s' ist hinter einer symbolischen Verknüpfung"
+"Konnte die über die Befehlszeile angegebene Konfiguration nicht parsen."
 
-#: pathspec.c:442
-msgid ""
-"There is nothing to exclude from by :(exclude) patterns.\n"
-"Perhaps you forgot to add either ':/' or '.' ?"
+#: config.c:1362
+msgid "unknown error occurred while reading the configuration files"
 msgstr ""
-":(exclude) Muster, aber keine anderen Pfadspezifikationen angegeben.\n"
-"Vielleicht haben Sie vergessen entweder ':/' oder '.' hinzuzufügen?"
+"Es trat ein unbekannter Fehler beim Lesen der Konfigurationsdateien auf."
 
-#: pretty.c:973
-msgid "unable to parse --pretty format"
-msgstr "Konnte --pretty Format nicht parsen."
+#: config.c:1716
+#, c-format
+msgid "unable to parse '%s' from command-line config"
+msgstr ""
+"Konnte Wert '%s' aus der über die Befehlszeile angegebenen Konfiguration\n"
+"nicht parsen."
 
-#: progress.c:235
-msgid "done"
-msgstr "Fertig"
+#: config.c:1718
+#, c-format
+msgid "bad config variable '%s' in file '%s' at line %d"
+msgstr "ungültige Konfigurationsvariable '%s' in Datei '%s' bei Zeile %d"
 
-#: read-cache.c:1281
+#: config.c:1777
+#, c-format
+msgid "%s has multiple values"
+msgstr "%s hat mehrere Werte"
+
+#: config.c:2311
+#, c-format
+msgid "could not set '%s' to '%s'"
+msgstr "Konnte '%s' nicht zu '%s' setzen."
+
+#: config.c:2313
 #, c-format
+msgid "could not unset '%s'"
+msgstr "Konnte '%s' nicht aufheben."
+
+#: connect.c:49
+msgid "The remote end hung up upon initial contact"
+msgstr "Die Gegenseite hat sich nach dem erstmaligen Kontakt aufgehangen."
+
+#: connect.c:51
 msgid ""
-"index.version set, but the value is invalid.\n"
-"Using version %i"
+"Could not read from remote repository.\n"
+"\n"
+"Please make sure you have the correct access rights\n"
+"and the repository exists."
 msgstr ""
-"index.version gesetzt, aber Wert ungültig.\n"
-"Verwende Version %i"
+"Konnte nicht vom Remote-Repository lesen.\n"
+"\n"
+"Bitte stellen Sie sicher, dass die korrekten Zugriffsberechtigungen bestehen\n"
+"und das Repository existiert."
+
+#: connected.c:63 builtin/fsck.c:173 builtin/prune.c:140
+msgid "Checking connectivity"
+msgstr "Prüfe Konnektivität"
+
+#: connected.c:75
+msgid "Could not run 'git rev-list'"
+msgstr "Konnte 'git rev-list' nicht ausführen"
+
+#: connected.c:95
+msgid "failed write to rev-list"
+msgstr "Fehler beim Schreiben nach rev-list"
+
+#: connected.c:102
+msgid "failed to close rev-list's stdin"
+msgstr "Fehler beim Schließen von rev-list's Standard-Eingabe"
 
-#: read-cache.c:1291
+#: convert.c:201
 #, c-format
 msgid ""
-"GIT_INDEX_VERSION set, but the value is invalid.\n"
-"Using version %i"
+"CRLF will be replaced by LF in %s.\n"
+"The file will have its original line endings in your working directory."
 msgstr ""
-"GIT_INDEX_VERSION gesetzt, aber Wert ungültig.\n"
-"Verwende Version %i"
+"CRLF wird in %s durch LF ersetzt.\n"
+"Die Datei wird ihre ursprünglichen Zeilenenden im Arbeitsverzeichnis behalten."
 
-#: refs.c:551 builtin/merge.c:840
+#: convert.c:205
 #, c-format
-msgid "Could not open '%s' for writing"
-msgstr "Konnte '%s' nicht zum Schreiben öffnen."
+msgid "CRLF would be replaced by LF in %s."
+msgstr "CRLF würde in %s durch LF ersetzt werden."
 
-#: refs/files-backend.c:2534
+#: convert.c:211
 #, c-format
-msgid "could not delete reference %s: %s"
-msgstr "Konnte Referenz %s nicht entfernen: %s"
+msgid ""
+"LF will be replaced by CRLF in %s.\n"
+"The file will have its original line endings in your working directory."
+msgstr ""
+"LF wird in %s durch CRLF ersetzt.\n"
+"Die Datei wird ihre ursprünglichen Zeilenenden im Arbeitsverzeichnis behalten."
 
-#: refs/files-backend.c:2537
+#: convert.c:215
 #, c-format
-msgid "could not delete references: %s"
-msgstr "Konnte Referenzen nicht entfernen: %s"
+msgid "LF would be replaced by CRLF in %s"
+msgstr "LF würde in %s durch CRLF ersetzt werden."
+
+#: date.c:97
+msgid "in the future"
+msgstr "in der Zukunft"
 
-#: refs/files-backend.c:2546
+#: date.c:103
 #, c-format
-msgid "could not remove reference %s"
-msgstr "Konnte Referenz %s nicht löschen"
+msgid "%lu second ago"
+msgid_plural "%lu seconds ago"
+msgstr[0] "vor %lu Sekunde"
+msgstr[1] "vor %lu Sekunden"
 
-#: ref-filter.c:55
+#: date.c:110
 #, c-format
-msgid "expected format: %%(color:<color>)"
-msgstr "Erwartetes Format: %%(color:<Farbe>)"
+msgid "%lu minute ago"
+msgid_plural "%lu minutes ago"
+msgstr[0] "vor %lu Minute"
+msgstr[1] "vor %lu Minuten"
 
-#: ref-filter.c:57
+#: date.c:117
 #, c-format
-msgid "unrecognized color: %%(color:%s)"
-msgstr "nicht erkannte Farbe: %%(color:%s)"
+msgid "%lu hour ago"
+msgid_plural "%lu hours ago"
+msgstr[0] "vor %lu Stunde"
+msgstr[1] "vor %lu Stunden"
 
-#: ref-filter.c:71
+#: date.c:124
 #, c-format
-msgid "unrecognized format: %%(%s)"
-msgstr "nicht erkanntes Format: %%(%s)"
+msgid "%lu day ago"
+msgid_plural "%lu days ago"
+msgstr[0] "vor %lu Tag"
+msgstr[1] "vor %lu Tagen"
 
-#: ref-filter.c:77
+#: date.c:130
 #, c-format
-msgid "%%(body) does not take arguments"
-msgstr "%%(body) akzeptiert keine Argumente"
+msgid "%lu week ago"
+msgid_plural "%lu weeks ago"
+msgstr[0] "vor %lu Woche"
+msgstr[1] "vor %lu Wochen"
 
-#: ref-filter.c:84
+#: date.c:137
 #, c-format
-msgid "%%(subject) does not take arguments"
-msgstr "%%(subject) akzeptiert keine Argumente"
+msgid "%lu month ago"
+msgid_plural "%lu months ago"
+msgstr[0] "vor %lu Monat"
+msgstr[1] "vor %lu Monaten"
 
-#: ref-filter.c:101
+#: date.c:148
 #, c-format
-msgid "positive value expected contents:lines=%s"
-msgstr "Positiver Wert erwartet contents:lines=%s"
+msgid "%lu year"
+msgid_plural "%lu years"
+msgstr[0] "vor %lu Jahr"
+msgstr[1] "vor %lu Jahren"
 
-#: ref-filter.c:103
+#. TRANSLATORS: "%s" is "<n> years"
+#: date.c:151
 #, c-format
-msgid "unrecognized %%(contents) argument: %s"
-msgstr "nicht erkanntes %%(contents) Argument: %s"
+msgid "%s, %lu month ago"
+msgid_plural "%s, %lu months ago"
+msgstr[0] "%s, und %lu Monat"
+msgstr[1] "%s, und %lu Monaten"
 
-#: ref-filter.c:113
+#: date.c:156 date.c:161
 #, c-format
-msgid "unrecognized %%(objectname) argument: %s"
-msgstr "nicht erkanntes %%(objectname) Argument: %s"
+msgid "%lu year ago"
+msgid_plural "%lu years ago"
+msgstr[0] "vor %lu Jahr"
+msgstr[1] "vor %lu Jahren"
 
-#: ref-filter.c:135
+#: diffcore-order.c:24
 #, c-format
-msgid "expected format: %%(align:<width>,<position>)"
-msgstr "Erwartetes Format: %%(align:<Breite>,<Position>)"
+msgid "failed to read orderfile '%s'"
+msgstr "Fehler beim Lesen der Reihenfolgedatei '%s'."
 
-#: ref-filter.c:147
+#: diffcore-rename.c:536
+msgid "Performing inexact rename detection"
+msgstr "Führe Erkennung für ungenaue Umbenennung aus"
+
+#: diff.c:62
 #, c-format
-msgid "unrecognized position:%s"
-msgstr "nicht erkannte Position:%s"
+msgid "option '%s' requires a value"
+msgstr "Option '%s' erfordert einen Wert."
 
-#: ref-filter.c:151
+#: diff.c:124
 #, c-format
-msgid "unrecognized width:%s"
-msgstr "nicht erkannte Breite:%s"
+msgid "  Failed to parse dirstat cut-off percentage '%s'\n"
+msgstr ""
+"  Fehler beim Parsen des abgeschnittenen \"dirstat\" Prozentsatzes '%s'\n"
 
-#: ref-filter.c:157
+#: diff.c:129
 #, c-format
-msgid "unrecognized %%(align) argument: %s"
-msgstr "nicht erkanntes %%(align) Argument: %s"
+msgid "  Unknown dirstat parameter '%s'\n"
+msgstr "  Unbekannter \"dirstat\" Parameter '%s'\n"
 
-#: ref-filter.c:161
+#: diff.c:283
 #, c-format
-msgid "positive width expected with the %%(align) atom"
-msgstr "Positive Breitenangabe für %%(align) erwartet"
+msgid "Unknown value for 'diff.submodule' config variable: '%s'"
+msgstr "Unbekannter Wert in Konfigurationsvariable 'diff.dirstat': '%s'"
 
-#: ref-filter.c:244
+#: diff.c:346
 #, c-format
-msgid "malformed field name: %.*s"
-msgstr "Fehlerhafter Feldname: %.*s"
+msgid ""
+"Found errors in 'diff.dirstat' config variable:\n"
+"%s"
+msgstr ""
+"Fehler in 'diff.dirstat' Konfigurationsvariable gefunden:\n"
+"%s"
 
-#: ref-filter.c:270
+#: diff.c:3087
 #, c-format
-msgid "unknown field name: %.*s"
-msgstr "Unbekannter Feldname: %.*s"
+msgid "external diff died, stopping at %s"
+msgstr "externes Diff-Programm unerwartet beendet, angehalten bei %s"
 
-#: ref-filter.c:372
+#: diff.c:3412
+msgid "--name-only, --name-status, --check and -s are mutually exclusive"
+msgstr "--name-only, --name-status, --check und -s schließen sich gegenseitig aus"
+
+#: diff.c:3502
+msgid "--follow requires exactly one pathspec"
+msgstr "--follow erfordert genau eine Pfadspezifikation"
+
+#: diff.c:3665
 #, c-format
-msgid "format: %%(end) atom used without corresponding atom"
-msgstr "Format: %%(end) Atom ohne zugehöriges Atom verwendet"
+msgid ""
+"Failed to parse --dirstat/-X option parameter:\n"
+"%s"
+msgstr ""
+"Fehler beim Parsen des --dirstat/-X Optionsparameters:\n"
+"%s"
 
-#: ref-filter.c:424
+#: diff.c:3679
 #, c-format
-msgid "malformed format string %s"
-msgstr "Fehlerhafter Formatierungsstring %s"
+msgid "Failed to parse --submodule option parameter: '%s'"
+msgstr "Fehler beim Parsen des --submodule Optionsparameters: '%s'"
 
-#: ref-filter.c:878
-msgid ":strip= requires a positive integer argument"
-msgstr ":strip= erfordert eine positive Ganzzahl als Argument"
+#: diff.c:4700
+msgid "inexact rename detection was skipped due to too many files."
+msgstr ""
+"Ungenaue Erkennung für Umbenennungen wurde aufgrund zu vieler Dateien\n"
+"übersprungen."
 
-#: ref-filter.c:883
+#: diff.c:4703
+msgid "only found copies from modified paths due to too many files."
+msgstr "nur Kopien von geänderten Pfaden, aufgrund zu vieler Dateien, gefunden"
+
+#: diff.c:4706
 #, c-format
-msgid "ref '%s' does not have %ld components to :strip"
-msgstr "Referenz '%s' hat keine %ld Komponenten für :strip"
+msgid ""
+"you may want to set your %s variable to at least %d and retry the command."
+msgstr ""
+"Sie könnten die Variable %s auf mindestens %d setzen und den Befehl\n"
+"erneut versuchen."
 
-#: ref-filter.c:1046
+#: dir.c:1866
+msgid "failed to get kernel name and information"
+msgstr "Fehler beim Sammeln von Namen und Informationen zum Kernel"
+
+#: dir.c:1985
+msgid "Untracked cache is disabled on this system or location."
+msgstr ""
+"Cache für unversionierte Dateien ist auf diesem System oder\n"
+"für dieses Verzeichnis deaktiviert."
+
+#: fetch-pack.c:213
+msgid "git fetch-pack: expected shallow list"
+msgstr "git fetch-pack: erwartete shallow-Liste"
+
+#: fetch-pack.c:225
+msgid "git fetch-pack: expected ACK/NAK, got EOF"
+msgstr "git fetch-pack: ACK/NAK erwartet, EOF bekommen"
+
+#: fetch-pack.c:243
 #, c-format
-msgid "unknown %.*s format %s"
-msgstr "Unbekanntes %.*s Format %s"
+msgid "git fetch-pack: expected ACK/NAK, got '%s'"
+msgstr "git fetch-pack: ACK/NAK erwartet, '%s' bekommen"
 
-#: ref-filter.c:1066 ref-filter.c:1097
+#: fetch-pack.c:295
+msgid "--stateless-rpc requires multi_ack_detailed"
+msgstr "--stateless-rpc benötigt multi_ack_detailed"
+
+#: fetch-pack.c:381
 #, c-format
-msgid "missing object %s for %s"
-msgstr "Objekt %s fehlt für %s"
+msgid "invalid shallow line: %s"
+msgstr "Ungültige shallow-Zeile: %s"
 
-#: ref-filter.c:1069 ref-filter.c:1100
+#: fetch-pack.c:387
 #, c-format
-msgid "parse_object_buffer failed on %s for %s"
-msgstr "parse_object_buffer bei %s für %s fehlgeschlagen"
+msgid "invalid unshallow line: %s"
+msgstr "Ungültige unshallow-Zeile: %s"
 
-#: ref-filter.c:1311
+#: fetch-pack.c:389
 #, c-format
-msgid "malformed object at '%s'"
-msgstr "fehlerhaftes Objekt bei '%s'"
+msgid "object not found: %s"
+msgstr "Objekt nicht gefunden: %s"
 
-#: ref-filter.c:1373
+#: fetch-pack.c:392
 #, c-format
-msgid "ignoring ref with broken name %s"
-msgstr "Ignoriere Referenz mit fehlerhaftem Namen %s"
+msgid "error in object: %s"
+msgstr "Fehler in Objekt: %s"
 
-#: ref-filter.c:1378
+#: fetch-pack.c:394
 #, c-format
-msgid "ignoring broken ref %s"
-msgstr "Ignoriere fehlerhafte Referenz %s"
+msgid "no shallow found: %s"
+msgstr "Kein shallow-Objekt gefunden: %s"
 
-#: ref-filter.c:1651
+#: fetch-pack.c:397
 #, c-format
-msgid "format: %%(end) atom missing"
-msgstr "Format: %%(end) Atom fehlt"
+msgid "expected shallow/unshallow, got %s"
+msgstr "shallow/unshallow erwartet, %s bekommen"
 
-#: ref-filter.c:1705
+#: fetch-pack.c:436
 #, c-format
-msgid "malformed object name %s"
-msgstr "Missgebildeter Objektname %s"
+msgid "got %s %d %s"
+msgstr "%s %d %s bekommen"
 
-#: remote.c:746
+#: fetch-pack.c:450
 #, 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."
+msgid "invalid commit %s"
+msgstr "Ungültiger Commit %s"
 
-#: remote.c:750
+#: fetch-pack.c:483
+msgid "giving up"
+msgstr "Gebe auf"
+
+#: fetch-pack.c:493 progress.c:235
+msgid "done"
+msgstr "Fertig"
+
+#: fetch-pack.c:505
 #, c-format
-msgid "%s usually tracks %s, not %s"
-msgstr "%s folgt üblicherweise %s, nicht %s"
+msgid "got %s (%d) %s"
+msgstr "%s (%d) %s bekommen"
 
-#: remote.c:754
+#: fetch-pack.c:551
 #, c-format
-msgid "%s tracks both %s and %s"
-msgstr "%s folgt sowohl %s als auch %s"
+msgid "Marking %s as complete"
+msgstr "Markiere %s als vollständig"
 
-#: remote.c:762
-msgid "Internal error"
-msgstr "Interner Fehler"
+#: fetch-pack.c:697
+#, c-format
+msgid "already have %s (%s)"
+msgstr "habe %s (%s) bereits"
 
-#: remote.c:1677 remote.c:1720
-msgid "HEAD does not point to a branch"
-msgstr "HEAD zeigt auf keinen Branch"
+#: fetch-pack.c:735
+msgid "fetch-pack: unable to fork off sideband demultiplexer"
+msgstr "fetch-pack: Fehler beim Starten des sideband demultiplexer"
 
-#: remote.c:1686
-#, c-format
-msgid "no such branch: '%s'"
-msgstr "Kein solcher Branch: '%s'"
+#: fetch-pack.c:743
+msgid "protocol error: bad pack header"
+msgstr "Protokollfehler: ungültiger Pack-Header"
 
-#: remote.c:1689
+#: fetch-pack.c:799
 #, c-format
-msgid "no upstream configured for branch '%s'"
-msgstr "Kein Upstream-Branch für Branch '%s' konfiguriert."
+msgid "fetch-pack: unable to fork off %s"
+msgstr "fetch-pack: konnte %s nicht starten"
 
-#: remote.c:1695
+#: fetch-pack.c:815
 #, c-format
-msgid "upstream branch '%s' not stored as a remote-tracking branch"
-msgstr "Upstream-Branch '%s' nicht als Remote-Tracking-Branch gespeichert"
+msgid "%s failed"
+msgstr "%s fehlgeschlagen"
 
-#: remote.c:1710
-#, c-format
-msgid "push destination '%s' on remote '%s' has no local tracking branch"
-msgstr ""
-"Ziel für \"push\" '%s' auf Remote-Repository '%s' hat keinen lokal gefolgten "
-"Branch"
+#: fetch-pack.c:817
+msgid "error in sideband demultiplexer"
+msgstr "Fehler in sideband demultiplexer"
 
-#: remote.c:1725
-#, c-format
-msgid "branch '%s' has no remote for pushing"
-msgstr "Branch '%s' hat keinen Upstream-Branch gesetzt"
+#: fetch-pack.c:844
+msgid "Server does not support shallow clients"
+msgstr "Server unterstützt keine shallow-Clients"
 
-#: remote.c:1736
-#, c-format
-msgid "push refspecs for '%s' do not include '%s'"
-msgstr "Push-Refspecs für '%s' beinhalten nicht '%s'"
+#: fetch-pack.c:848
+msgid "Server supports multi_ack_detailed"
+msgstr "Server unterstützt multi_ack_detailed"
 
-#: remote.c:1749
-msgid "push has no destination (push.default is 'nothing')"
-msgstr "kein Ziel für \"push\" (push.default ist 'nothing')"
+#: fetch-pack.c:851
+msgid "Server supports no-done"
+msgstr "Server unterstützt no-done"
 
-#: remote.c:1771
-msgid "cannot resolve 'simple' push to a single destination"
-msgstr "kann einzelnes Ziel für \"push\" im Modus 'simple' nicht auflösen"
+#: fetch-pack.c:857
+msgid "Server supports multi_ack"
+msgstr "Server unterstützt multi_ack"
 
-#: remote.c:2073
-#, c-format
-msgid "Your branch is based on '%s', but the upstream is gone.\n"
-msgstr ""
-"Ihr Branch basiert auf '%s', aber der Upstream-Branch wurde entfernt.\n"
+#: fetch-pack.c:861
+msgid "Server supports side-band-64k"
+msgstr "Server unterstützt side-band-64k"
 
-#: remote.c:2077
-msgid "  (use \"git branch --unset-upstream\" to fixup)\n"
-msgstr "  (benutzen Sie \"git branch --unset-upstream\" zum Beheben)\n"
+#: fetch-pack.c:865
+msgid "Server supports side-band"
+msgstr "Server unterstützt side-band"
 
-#: remote.c:2080
-#, c-format
-msgid "Your branch is up-to-date with '%s'.\n"
-msgstr "Ihr Branch ist auf dem selben Stand wie '%s'.\n"
+#: fetch-pack.c:869
+msgid "Server supports allow-tip-sha1-in-want"
+msgstr "Server unterstützt allow-tip-sha1-in-want"
 
-#: remote.c:2084
-#, c-format
-msgid "Your branch is ahead of '%s' by %d commit.\n"
-msgid_plural "Your branch is ahead of '%s' by %d commits.\n"
-msgstr[0] "Ihr Branch ist vor '%s' um %d Commit.\n"
-msgstr[1] "Ihr Branch ist vor '%s' um %d Commits.\n"
+#: fetch-pack.c:873
+msgid "Server supports allow-reachable-sha1-in-want"
+msgstr "Server unterstützt allow-reachable-sha1-in-want"
 
-#: remote.c:2090
-msgid "  (use \"git push\" to publish your local commits)\n"
-msgstr "  (benutzen Sie \"git push\", um lokale Commits zu publizieren)\n"
+#: fetch-pack.c:883
+msgid "Server supports ofs-delta"
+msgstr "Server unterstützt ofs-delta"
 
-#: remote.c:2093
+#: fetch-pack.c:890
 #, c-format
-msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n"
-msgid_plural ""
-"Your branch is behind '%s' by %d commits, and can be fast-forwarded.\n"
-msgstr[0] ""
-"Ihr Branch ist zu '%s' um %d Commit hinterher, und kann vorgespult werden.\n"
-msgstr[1] ""
-"Ihr Branch ist zu '%s' um %d Commits hinterher, und kann vorgespult werden.\n"
+msgid "Server version is %.*s"
+msgstr "Server-Version ist %.*s"
 
-#: remote.c:2101
-msgid "  (use \"git pull\" to update your local branch)\n"
-msgstr ""
-"  (benutzen Sie \"git pull\", um Ihren lokalen Branch zu aktualisieren)\n"
+#: fetch-pack.c:896
+msgid "Server does not support --shallow-since"
+msgstr "Server unterstützt kein --shallow-since"
 
-#: remote.c:2104
-#, c-format
-msgid ""
-"Your branch and '%s' have diverged,\n"
-"and have %d and %d different commit each, respectively.\n"
-msgid_plural ""
-"Your branch and '%s' have diverged,\n"
-"and have %d and %d different commits each, respectively.\n"
-msgstr[0] ""
-"Ihr Branch und '%s' sind divergiert,\n"
-"und haben jeweils %d und %d unterschiedliche Commits.\n"
-msgstr[1] ""
-"Ihr Branch und '%s' sind divergiert,\n"
-"und haben jeweils %d und %d unterschiedliche Commits.\n"
+#: fetch-pack.c:900
+msgid "Server does not support --shallow-exclude"
+msgstr "Server unterstützt kein --shallow-exclude"
 
-#: remote.c:2114
-msgid "  (use \"git pull\" to merge the remote branch into yours)\n"
-msgstr ""
-"  (benutzen Sie \"git pull\", um Ihren Branch mit dem Remote-Branch "
-"zusammenzuführen)\n"
+#: fetch-pack.c:902
+msgid "Server does not support --deepen"
+msgstr "Server unterstützt kein --deepen"
 
-#: revision.c:2132
-msgid "your current branch appears to be broken"
-msgstr "Ihr aktueller Branch scheint fehlerhaft zu sein."
+#: fetch-pack.c:913
+msgid "no common commits"
+msgstr "keine gemeinsamen Commits"
 
-#: revision.c:2135
-#, c-format
-msgid "your current branch '%s' does not have any commits yet"
-msgstr "Ihr aktueller Branch '%s' hat noch keine Commits."
+#: fetch-pack.c:925
+msgid "git fetch-pack: fetch failed."
+msgstr "git fetch-pack: Abholen fehlgeschlagen."
 
-#: revision.c:2329
-msgid "--first-parent is incompatible with --bisect"
-msgstr "Die Optionen --first-parent und --bisect sind inkompatibel."
+#: fetch-pack.c:1087
+msgid "no matching remote head"
+msgstr "kein übereinstimmender Remote-Branch"
 
-#: run-command.c:92
-msgid "open /dev/null failed"
-msgstr "Öffnen von /dev/null fehlgeschlagen"
+#: gpg-interface.c:185
+msgid "gpg failed to sign the data"
+msgstr "gpg beim Signieren der Daten fehlgeschlagen"
+
+#: gpg-interface.c:215
+msgid "could not create temporary file"
+msgstr "konnte temporäre Datei nicht erstellen"
 
-#: run-command.c:94
+#: gpg-interface.c:217
 #, c-format
-msgid "dup2(%d,%d) failed"
-msgstr "dup2(%d,%d) fehlgeschlagen"
+msgid "failed writing detached signature to '%s'"
+msgstr "Fehler beim Schreiben der losgelösten Signatur nach '%s'"
 
-#: send-pack.c:298
-msgid "failed to sign the push certificate"
-msgstr "Fehler beim Signieren des \"push\"-Zertifikates"
+#: grep.c:1782
+#, c-format
+msgid "'%s': unable to read %s"
+msgstr "'%s': konnte %s nicht lesen"
 
-#: send-pack.c:411
-msgid "the receiving end does not support --signed push"
-msgstr ""
-"die Gegenseite unterstützt keinen signierten Versand (\"--signed push\")"
+#: grep.c:1799 builtin/clone.c:381 builtin/diff.c:84 builtin/rm.c:155
+#, c-format
+msgid "failed to stat '%s'"
+msgstr "Konnte '%s' nicht lesen"
 
-#: send-pack.c:413
-msgid ""
-"not sending a push certificate since the receiving end does not support --"
-"signed push"
-msgstr ""
-"kein Versand des \"push\"-Zertifikates, da die Gegenseite keinen signierten\n"
-"Versand (\"--signed push\") unterstützt"
+#: grep.c:1810
+#, c-format
+msgid "'%s': short read"
+msgstr "'%s': read() zu kurz"
 
-#: send-pack.c:425
-msgid "the receiving end does not support --atomic push"
-msgstr "die Gegenseite unterstützt keinen atomaren Versand (\"--atomic push\")"
+#: help.c:203
+#, c-format
+msgid "available git commands in '%s'"
+msgstr "Vorhandene Git-Befehle in '%s'"
 
-#: send-pack.c:430
-msgid "the receiving end does not support push options"
-msgstr "die Gegenseite unterstützt keine Push-Optionen"
+#: help.c:210
+msgid "git commands available from elsewhere on your $PATH"
+msgstr "Vorhandene Git-Befehle anderswo in Ihrem $PATH"
+
+#: help.c:241
+msgid "These are common Git commands used in various situations:"
+msgstr "Allgemeine Git-Befehle, verwendet in verschiedenen Situationen:"
 
-#: sequencer.c:174
+#: help.c:306
+#, c-format
 msgid ""
-"after resolving the conflicts, mark the corrected paths\n"
-"with 'git add <paths>' or 'git rm <paths>'"
+"'%s' appears to be a git command, but we were not\n"
+"able to execute it. Maybe git-%s is broken?"
 msgstr ""
-"nach Auflösung der Konflikte, markieren Sie die korrigierten Pfade\n"
-"mit 'git add <Pfade>' oder 'git rm <Pfade>'"
+"'%s' scheint ein git-Befehl zu sein, konnte aber\n"
+"nicht ausgeführt werden. Vielleicht ist git-%s fehlerhaft?"
+
+#: help.c:361
+msgid "Uh oh. Your system reports no Git commands at all."
+msgstr "Uh oh. Keine Git-Befehle auf Ihrem System vorhanden."
 
-#: sequencer.c:177
+#: help.c:383
+#, c-format
 msgid ""
-"after resolving the conflicts, mark the corrected paths\n"
-"with 'git add <paths>' or 'git rm <paths>'\n"
-"and commit the result with 'git commit'"
+"WARNING: You called a Git command named '%s', which does not exist.\n"
+"Continuing under the assumption that you meant '%s'"
 msgstr ""
-"nach Auflösung der Konflikte, markieren Sie die korrigierten Pfade\n"
-"mit 'git add <Pfade>' oder 'git rm <Pfade>'und tragen Sie das Ergebnis mit\n"
-"'git commit' ein"
+"Warnung: Sie haben den nicht existierenden Git-Befehl '%s' ausgeführt.\n"
+"Setze fort unter der Annahme, dass Sie '%s' gemeint haben."
 
-#: sequencer.c:190 sequencer.c:841 sequencer.c:924
+#: help.c:388
 #, c-format
-msgid "Could not write to %s"
-msgstr "Konnte nicht nach %s schreiben"
+msgid "in %0.1f seconds automatically..."
+msgstr "Automatische Ausführung in %0.1f Sekunden ..."
 
-#: sequencer.c:193 sequencer.c:843 sequencer.c:928
+#: help.c:395
 #, c-format
-msgid "Error wrapping up %s."
-msgstr "Fehler beim Einpacken von %s."
+msgid "git: '%s' is not a git command. See 'git --help'."
+msgstr "git: '%s' ist kein Git-Befehl. Siehe 'git --help'."
 
-#: sequencer.c:208
-msgid "Your local changes would be overwritten by cherry-pick."
-msgstr ""
-"Ihre lokalen Änderungen würden durch den Cherry-Pick überschrieben werden."
+#: help.c:399 help.c:465
+msgid ""
+"\n"
+"Did you mean this?"
+msgid_plural ""
+"\n"
+"Did you mean one of these?"
+msgstr[0] ""
+"\n"
+"Haben Sie das gemeint?"
+msgstr[1] ""
+"\n"
+"Haben Sie eines von diesen gemeint?"
 
-#: sequencer.c:210
-msgid "Your local changes would be overwritten by revert."
-msgstr "Ihre lokalen Änderungen würden durch den Revert überschrieben werden."
+#: help.c:461
+#, c-format
+msgid "%s: %s - %s"
+msgstr "%s: %s - %s"
 
-#: sequencer.c:213
-msgid "Commit your changes or stash them to proceed."
+#: ident.c:334
+msgid ""
+"\n"
+"*** Please tell me who you are.\n"
+"\n"
+"Run\n"
+"\n"
+"  git config --global user.email \"you@example.com\"\n"
+"  git config --global user.name \"Your Name\"\n"
+"\n"
+"to set your account's default identity.\n"
+"Omit --global to set the identity only in this repository.\n"
+"\n"
 msgstr ""
-"Committen Sie Ihre Änderungen oder benutzen Sie \"stash\", um fortzufahren."
+"\n"
+"*** Bitte geben Sie an, wer Sie sind.\n"
+"\n"
+"Führen Sie\n"
+"\n"
+"  git config --global user.email \"you@example.com\"\n"
+"  git config --global user.name \"Your Name\"\n"
+"\n"
+"aus, um das als Ihre standardmäßige Identität zu setzen.\n"
+"Lassen Sie die Option \"--global\" weg, um die Identität nur\n"
+"für dieses Repository zu setzen.\n"
 
-#: sequencer.c:228
+#: lockfile.c:152
 #, c-format
-msgid "%s: fast-forward"
-msgstr "%s: Vorspulen"
+msgid ""
+"Unable to create '%s.lock': %s.\n"
+"\n"
+"Another git process seems to be running in this repository, e.g.\n"
+"an editor opened by 'git commit'. Please make sure all processes\n"
+"are terminated then try again. If it still fails, a git process\n"
+"may have crashed in this repository earlier:\n"
+"remove the file manually to continue."
+msgstr ""
+"Konnte '%s.lock' nicht erstellen: %s.\n"
+"\n"
+"Ein anderer Git-Prozess scheint in diesem Repository ausgeführt\n"
+"zu werden, zum Beispiel ein noch offener Editor von 'git commit'.\n"
+"Bitte stellen Sie sicher, dass alle Prozesse beendet wurden und\n"
+"versuchen Sie es erneut. Falls es immer noch fehlschlägt, könnte\n"
+"ein früherer Git-Prozess in diesem Repository abgestürzt sein:\n"
+"Löschen Sie die Datei manuell um fortzufahren."
 
-#. TRANSLATORS: %s will be "revert" or "cherry-pick"
-#: sequencer.c:303
+#: lockfile.c:160
 #, c-format
-msgid "%s: Unable to write new index file"
-msgstr "%s: Konnte neue Index-Datei nicht schreiben"
+msgid "Unable to create '%s.lock': %s"
+msgstr "Konnte '%s.lock' nicht erstellen: %s"
 
-#: sequencer.c:321
-msgid "Could not resolve HEAD commit\n"
-msgstr "Konnte Commit von HEAD nicht auflösen\n"
+#: merge.c:41
+msgid "failed to read the cache"
+msgstr "Lesen des Zwischenspeichers fehlgeschlagen"
 
-#: sequencer.c:341
-msgid "Unable to update cache tree\n"
-msgstr "Konnte Cache-Verzeichnis nicht aktualisieren\n"
+#: merge.c:96 builtin/am.c:2000 builtin/am.c:2035 builtin/checkout.c:374
+#: builtin/checkout.c:588 builtin/clone.c:731
+msgid "unable to write new index file"
+msgstr "Konnte neue Index-Datei nicht schreiben."
 
-#: sequencer.c:393
-#, c-format
-msgid "Could not parse commit %s\n"
-msgstr "Konnte Commit %s nicht parsen\n"
+#: merge-recursive.c:209
+msgid "(bad commit)\n"
+msgstr "(ungültiger Commit)\n"
 
-#: sequencer.c:398
+#: merge-recursive.c:231
 #, c-format
-msgid "Could not parse parent commit %s\n"
-msgstr "Konnte Eltern-Commit %s nicht parsen\n"
+msgid "addinfo_cache failed for path '%s'"
+msgstr "addinfo_cache für Pfad '%s' fehlgeschlagen"
 
-#: sequencer.c:463
-msgid "Your index file is unmerged."
-msgstr "Ihre Index-Datei ist nicht zusammengeführt."
+#: merge-recursive.c:301
+msgid "error building trees"
+msgstr "Fehler beim Erstellen der \"Tree\"-Objekte"
 
-#: sequencer.c:482
+#: merge-recursive.c:720
 #, 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."
+msgid "failed to create path '%s'%s"
+msgstr "Fehler beim Erstellen des Pfades '%s'%s"
 
-#: sequencer.c:490
+#: merge-recursive.c:731
 #, c-format
-msgid "Commit %s does not have parent %d"
-msgstr "Commit %s hat keinen Elternteil %d"
+msgid "Removing %s to make room for subdirectory\n"
+msgstr "Entferne %s, um Platz für Unterverzeichnis zu schaffen\n"
 
-#: sequencer.c:494
-#, c-format
-msgid "Mainline was specified but commit %s is not a merge."
-msgstr "Hauptlinie wurde spezifiziert, aber Commit %s ist kein Merge."
+#: merge-recursive.c:745 merge-recursive.c:764
+msgid ": perhaps a D/F conflict?"
+msgstr ": vielleicht ein Verzeichnis/Datei-Konflikt?"
 
-#. TRANSLATORS: The first %s will be "revert" or
-#. "cherry-pick", the second %s a SHA1
-#: sequencer.c:507
+#: merge-recursive.c:754
 #, c-format
-msgid "%s: cannot parse parent commit %s"
-msgstr "%s: kann Eltern-Commit %s nicht parsen"
+msgid "refusing to lose untracked file at '%s'"
+msgstr "verweigere, da unversionierte Dateien in '%s' verloren gehen würden"
 
-#: sequencer.c:511
+#: merge-recursive.c:796 builtin/cat-file.c:34
 #, c-format
-msgid "Cannot get commit message for %s"
-msgstr "Kann keine Commit-Beschreibung für %s bekommen"
-
-#: sequencer.c:597
-#, c-format
-msgid "could not revert %s... %s"
-msgstr "Konnte \"revert\" nicht auf %s... (%s) ausführen"
+msgid "cannot read object %s '%s'"
+msgstr "kann Objekt %s '%s' nicht lesen"
 
-#: sequencer.c:598
+#: merge-recursive.c:798
 #, c-format
-msgid "could not apply %s... %s"
-msgstr "Konnte %s... (%s) nicht anwenden"
-
-#: sequencer.c:633
-msgid "empty commit set passed"
-msgstr "leere Menge von Commits übergeben"
+msgid "blob expected for %s '%s'"
+msgstr "Blob erwartet für %s '%s'"
 
-#: sequencer.c:641
+#: merge-recursive.c:822
 #, c-format
-msgid "git %s: failed to read the index"
-msgstr "git %s: Fehler beim Lesen des Index"
+msgid "failed to open '%s': %s"
+msgstr "Fehler beim Öffnen von '%s': %s"
 
-#: sequencer.c:645
+#: merge-recursive.c:833
 #, c-format
-msgid "git %s: failed to refresh the index"
-msgstr "git %s: Fehler beim Aktualisieren des Index"
+msgid "failed to symlink '%s': %s"
+msgstr "Fehler beim Erstellen einer symbolischen Verknüpfung für '%s': %s"
 
-#: sequencer.c:705
-msgid "Cannot revert during another revert."
-msgstr "Kann Revert nicht während eines anderen Reverts ausführen."
+#: merge-recursive.c:838
+#, c-format
+msgid "do not know what to do with %06o %s '%s'"
+msgstr "weiß nicht was mit %06o %s '%s' zu machen ist"
 
-#: sequencer.c:706
-msgid "Cannot revert during a cherry-pick."
-msgstr "Kann Revert nicht während eines Cherry-Picks ausführen."
+#: merge-recursive.c:978
+msgid "Failed to execute internal merge"
+msgstr "Fehler bei Ausführung des internen Merges"
 
-#: sequencer.c:709
-msgid "Cannot cherry-pick during a revert."
-msgstr "Kann Cherry-Pick nicht während eines Reverts ausführen."
+#: merge-recursive.c:982
+#, c-format
+msgid "Unable to add %s to database"
+msgstr "Konnte %s nicht zur Datenbank hinzufügen"
 
-#: sequencer.c:710
-msgid "Cannot cherry-pick during another cherry-pick."
-msgstr "Kann Cherry-Pick nicht während eines anderen Cherry-Picks ausführen."
+#: merge-recursive.c:1081 merge-recursive.c:1095
+#, c-format
+msgid ""
+"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
+"in tree."
+msgstr ""
+"KONFLIKT (%s/löschen): %s gelöscht in %s und %s in %s. Stand %s von %s wurde "
+"im Arbeitsbereich gelassen."
 
-#: sequencer.c:732
+#: merge-recursive.c:1087 merge-recursive.c:1100
 #, c-format
-msgid "Could not parse line %d."
-msgstr "Konnte Zeile %d nicht parsen."
+msgid ""
+"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
+"in tree at %s."
+msgstr ""
+"KONFLIKT (%s/löschen): %s gelöscht in %s und %s in %s. Stand %s von %s wurde "
+"im Arbeitsbereich bei %s gelassen."
 
-#: sequencer.c:737
-msgid "No commits parsed."
-msgstr "Keine Commits geparst."
+#: merge-recursive.c:1143
+msgid "rename"
+msgstr "umbenennen"
 
-#: sequencer.c:749
+#: merge-recursive.c:1143
+msgid "renamed"
+msgstr "umbenannt"
+
+#: merge-recursive.c:1200
 #, c-format
-msgid "Could not open %s"
-msgstr "Konnte %s nicht öffnen"
+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"
 
-#: sequencer.c:753
+#: merge-recursive.c:1225
 #, c-format
-msgid "Could not read %s."
-msgstr "Konnte %s nicht lesen."
+msgid ""
+"CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
+"\"->\"%s\" in \"%s\"%s"
+msgstr ""
+"KONFLIKT (umbenennen/umbenennen): Benenne um \"%s\"->\"%s\" in Branch \"%s\" "
+"und \"%s\"->\"%s\" in Branch \"%s\"%s"
+
+#: merge-recursive.c:1230
+msgid " (left unresolved)"
+msgstr " (bleibt unaufgelöst)"
 
-#: sequencer.c:760
+#: merge-recursive.c:1292
 #, c-format
-msgid "Unusable instruction sheet: %s"
-msgstr "Unbenutzbares Instruktionsblatt: %s"
+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"
 
-#: sequencer.c:790
+#: merge-recursive.c:1325
 #, c-format
-msgid "Invalid key: %s"
-msgstr "Ungültiger Schlüssel: %s"
+msgid "Renaming %s to %s and %s to %s instead"
+msgstr "Benenne stattdessen %s nach %s und %s nach %s um"
 
-#: sequencer.c:793 builtin/pull.c:50 builtin/pull.c:52
+#: merge-recursive.c:1531
 #, c-format
-msgid "Invalid value for %s: %s"
-msgstr "Ungültiger Wert für %s: %s"
+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"
 
-#: sequencer.c:803
+#: merge-recursive.c:1546
 #, c-format
-msgid "Malformed options sheet: %s"
-msgstr "Fehlerhaftes Optionsblatt: %s"
+msgid "Adding merged %s"
+msgstr "Füge zusammengeführte Datei %s hinzu"
 
-#: sequencer.c:822
-msgid "a cherry-pick or revert is already in progress"
-msgstr "\"cherry-pick\" oder \"revert\" ist bereits im Gang"
+#: merge-recursive.c:1553 merge-recursive.c:1766
+#, c-format
+msgid "Adding as %s instead"
+msgstr "Füge stattdessen als %s hinzu"
 
-#: sequencer.c:823
-msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
-msgstr "versuchen Sie \"git cherry-pick (--continue | --quit | --abort)\""
+#: merge-recursive.c:1610
+#, c-format
+msgid "cannot read object %s"
+msgstr "kann Objekt %s nicht lesen"
 
-#: sequencer.c:827
+#: merge-recursive.c:1613
 #, c-format
-msgid "Could not create sequencer directory %s"
-msgstr "Konnte \"sequencer\"-Verzeichnis %s nicht erstellen"
+msgid "object %s is not a blob"
+msgstr "Objekt %s ist kein Blob"
 
-#: sequencer.c:862 sequencer.c:998
-msgid "no cherry-pick or revert in progress"
-msgstr "kein \"cherry-pick\" oder \"revert\" im Gang"
+#: merge-recursive.c:1666
+msgid "modify"
+msgstr "ändern"
 
-#: sequencer.c:864
-msgid "cannot resolve HEAD"
-msgstr "kann HEAD nicht auflösen"
+#: merge-recursive.c:1666
+msgid "modified"
+msgstr "geändert"
 
-#: sequencer.c:866 sequencer.c:900
-msgid "cannot abort from a branch yet to be born"
-msgstr "kann nicht abbrechen: bin auf einem Branch, der noch geboren wird"
+#: merge-recursive.c:1676
+msgid "content"
+msgstr "Inhalt"
 
-#: sequencer.c:886 builtin/fetch.c:724 builtin/fetch.c:970
-#, c-format
-msgid "cannot open %s"
-msgstr "kann '%s' nicht öffnen"
+#: merge-recursive.c:1683
+msgid "add/add"
+msgstr "hinzufügen/hinzufügen"
 
-#: sequencer.c:888
+#: merge-recursive.c:1718
 #, c-format
-msgid "cannot read %s: %s"
-msgstr "Kann %s nicht lesen: %s"
-
-#: sequencer.c:889
-msgid "unexpected end of file"
-msgstr "Unerwartetes Dateiende"
+msgid "Skipped %s (merged same as existing)"
+msgstr "%s ausgelassen (Ergebnis des Merges existiert bereits)"
 
-#: sequencer.c:895
+#: merge-recursive.c:1732
 #, c-format
-msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
-msgstr "gespeicherte \"pre-cherry-pick\" HEAD Datei '%s' ist beschädigt"
+msgid "Auto-merging %s"
+msgstr "automatischer Merge von %s"
 
-#: sequencer.c:921
-#, c-format
-msgid "Could not format %s."
-msgstr "Konnte %s nicht formatieren."
+#: merge-recursive.c:1736 git-submodule.sh:924
+msgid "submodule"
+msgstr "Submodul"
 
-#: sequencer.c:1066
+#: merge-recursive.c:1737
 #, c-format
-msgid "%s: can't cherry-pick a %s"
-msgstr "%s: %s kann nicht in \"cherry-pick\" benutzt werden"
+msgid "CONFLICT (%s): Merge conflict in %s"
+msgstr "KONFLIKT (%s): Merge-Konflikt in %s"
 
-#: sequencer.c:1069
+#: merge-recursive.c:1831
 #, c-format
-msgid "%s: bad revision"
-msgstr "%s: ungültiger Commit"
+msgid "Removing %s"
+msgstr "Entferne %s"
 
-#: sequencer.c:1102
-msgid "Can't revert as initial commit"
-msgstr "Kann nicht als allerersten Commit einen Revert ausführen."
+#: merge-recursive.c:1857
+msgid "file/directory"
+msgstr "Datei/Verzeichnis"
 
-#: setup.c:160
-#, c-format
-msgid ""
-"%s: no such path in the working tree.\n"
-"Use 'git <command> -- <path>...' to specify paths that do not exist locally."
-msgstr ""
-"%s: kein solcher Pfad im Arbeitsverzeichnis.\n"
-"Benutzen Sie 'git <Befehl> -- <Pfad>...' zur Angabe von Pfaden, die lokal\n"
-"nicht existieren."
+#: merge-recursive.c:1863
+msgid "directory/file"
+msgstr "Verzeichnis/Datei"
 
-#: setup.c:173
+#: merge-recursive.c:1868
 #, c-format
-msgid ""
-"ambiguous argument '%s': unknown revision or path not in the working tree.\n"
-"Use '--' to separate paths from revisions, like this:\n"
-"'git <command> [<revision>...] -- [<file>...]'"
+msgid "CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s"
 msgstr ""
-"mehrdeutiges Argument '%s': unbekannter Commit oder Pfad existiert nicht\n"
-"im Arbeitsverzeichnis\n"
-"Benutzen Sie '--', um Pfade und Commits zu trennen, ähnlich wie:\n"
-"'git <Befehl> [<Commit>...] -- [<Datei>...]'"
+"KONFLIKT (%s): Es existiert bereits ein Verzeichnis %s in %s. Füge %s als %s "
+"hinzu."
 
-#: setup.c:223
+#: merge-recursive.c:1877
 #, c-format
-msgid ""
-"ambiguous argument '%s': both revision and filename\n"
-"Use '--' to separate paths from revisions, like this:\n"
-"'git <command> [<revision>...] -- [<file>...]'"
-msgstr ""
-"mehrdeutiges Argument '%s': sowohl Commit als auch Dateiname\n"
-"Benutzen Sie '--', um Pfade und Commits zu trennen, ähnlich wie:\n"
-"'git <Befehl> [<Commit>...] -- [<Datei>...]'"
+msgid "Adding %s"
+msgstr "Füge %s hinzu"
 
-#: setup.c:248 builtin/apply.c:3362 builtin/apply.c:3373 builtin/apply.c:3419
-#, c-format
-msgid "failed to read %s"
-msgstr "Fehler beim Lesen von %s"
+#: merge-recursive.c:1914
+msgid "Already up-to-date!"
+msgstr "Bereits aktuell!"
 
-#: setup.c:468
+#: merge-recursive.c:1923
 #, c-format
-msgid "Expected git repo version <= %d, found %d"
-msgstr "Erwartete Git-Repository-Version <= %d, %d gefunden"
+msgid "merging of trees %s and %s failed"
+msgstr "Zusammenführen der \"Tree\"-Objekte %s und %s fehlgeschlagen"
 
-#: setup.c:476
-msgid "unknown repository extensions found:"
-msgstr "Unbekannte Repository-Erweiterungen gefunden:"
+#: merge-recursive.c:2006
+msgid "Merging:"
+msgstr "Merge:"
 
-#: setup.c:762
+#: merge-recursive.c:2019
 #, c-format
-msgid "Not a git repository (or any of the parent directories): %s"
-msgstr "Kein Git-Repository (oder irgendein Elternverzeichnis): %s"
+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"
 
-#: setup.c:764 setup.c:915 builtin/index-pack.c:1641
-msgid "Cannot come back to cwd"
-msgstr "Kann nicht zurück zu Arbeitsverzeichnis wechseln"
+#: merge-recursive.c:2058
+msgid "merge returned no commit"
+msgstr "Merge hat keinen Commit zurückgegeben"
 
-#: setup.c:845
-msgid "Unable to read current working directory"
-msgstr "Konnte aktuelles Arbeitsverzeichnis nicht lesen."
+#: merge-recursive.c:2121
+#, c-format
+msgid "Could not parse object '%s'"
+msgstr "Konnte Objekt '%s' nicht parsen."
 
-#: setup.c:920
+#: merge-recursive.c:2135 builtin/merge.c:641 builtin/merge.c:788
+msgid "Unable to write index."
+msgstr "Konnte Index nicht schreiben."
+
+#: notes-merge.c:273
 #, c-format
 msgid ""
-"Not a git repository (or any parent up to mount point %s)\n"
-"Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set)."
+"You have not concluded your previous notes merge (%s exists).\n"
+"Please, use 'git notes merge --commit' or 'git notes merge --abort' to "
+"commit/abort the previous merge before you start a new notes merge."
 msgstr ""
-"Kein Git-Repository (oder irgendein Elternverzeichnis bis zum Einhängepunkt %s)\n"
-"Stoppe bei Dateisystemgrenze (GIT_DISCOVERY_ACROSS_FILESYSTEM nicht gesetzt)."
+"Sie haben Ihren vorherigen Merge von Notizen nicht abgeschlossen (%s existiert).\n"
+"Bitte benutzen Sie 'git notes merge --commit' oder 'git notes merge --abort', um\n"
+"den vorherigen Merge zu committen bzw. abzubrechen, bevor Sie einen neuen Merge\n"
+"von Notizen beginnen."
 
-#: setup.c:927
+#: notes-merge.c:280
 #, c-format
-msgid "Cannot change to '%s/..'"
-msgstr "Kann nicht in Verzeichnis '%s/..' wechseln"
+msgid "You have not concluded your notes merge (%s exists)."
+msgstr "Sie haben Ihren Merge von Notizen nicht abgeschlossen (%s existiert)."
 
-#: setup.c:989
-#, c-format
-msgid ""
-"Problem with core.sharedRepository filemode value (0%.3o).\n"
-"The owner of files must always have read and write permissions."
+#: notes-utils.c:41
+msgid "Cannot commit uninitialized/unreferenced notes tree"
 msgstr ""
-"Problem mit Wert für Dateimodus (0%.3o) von core.sharedRepository.\n"
-"Der Besitzer der Dateien muss immer Lese- und Schreibrechte haben."
+"Kann uninitialisiertes/unreferenzierte Notiz-Verzeichnis nicht committen."
 
-#: sha1_file.c:1046
-msgid "offset before end of packfile (broken .idx?)"
-msgstr "Offset vor Ende der Packdatei (fehlerhafte Indexdatei?)"
-
-#: sha1_file.c:2434
+#: notes-utils.c:100
 #, c-format
-msgid "offset before start of pack index for %s (corrupt index?)"
-msgstr "Offset vor Beginn des Pack-Index für %s (beschädigter Index?)"
+msgid "Bad notes.rewriteMode value: '%s'"
+msgstr "Ungültiger notes.rewriteMode Wert: '%s'"
 
-#: sha1_file.c:2438
+#: notes-utils.c:110
 #, c-format
-msgid "offset beyond end of pack index for %s (truncated index?)"
-msgstr "Offset hinter Ende des Pack-Index für %s (abgeschnittener Index?)"
-
-#: sha1_name.c:462
-msgid ""
-"Git normally never creates a ref that ends with 40 hex characters\n"
-"because it will be ignored when you just specify 40-hex. These refs\n"
-"may be created by mistake. For example,\n"
-"\n"
-"  git checkout -b $br $(git rev-parse ...)\n"
-"\n"
-"where \"$br\" is somehow empty and a 40-hex ref is created. Please\n"
-"examine these refs and maybe delete them. Turn this message off by\n"
-"running \"git config advice.objectNameWarning false\""
-msgstr ""
-"Git erzeugt normalerweise keine Referenzen die mit\n"
-"40 Hex-Zeichen enden, da diese ignoriert werden wenn\n"
-"Sie diese angeben. Diese Referenzen könnten aus Versehen\n"
-"erzeugt worden sein. Zum Beispiel,\n"
-"\n"
-"  git checkout -b $br $(git rev-parse ...)\n"
-"\n"
-"wobei \"$br\" leer ist und eine 40-Hex-Referenz erzeugt\n"
-"wurde. Bitte prüfen Sie diese Referenzen und löschen\n"
-"Sie sie gegebenenfalls. Unterdrücken Sie diese Meldung\n"
-"indem Sie \"git config advice.objectNameWarning false\"\n"
-"ausführen."
-
-#: submodule.c:64 submodule.c:98
-msgid "Cannot change unmerged .gitmodules, resolve merge conflicts first"
+msgid "Refusing to rewrite notes in %s (outside of refs/notes/)"
 msgstr ""
-"Kann nicht zusammengeführte .gitmodules-Datei nicht ändern, lösen\n"
-"Sie zuerst die Konflikte auf"
-
-#: submodule.c:68 submodule.c:102
-#, c-format
-msgid "Could not find section in .gitmodules where path=%s"
-msgstr "Konnte keine Sektion in .gitmodules mit Pfad \"%s\" finden"
+"Umschreiben der Notizen in %s zurückgewiesen (außerhalb von refs/notes/)"
 
-#: submodule.c:76
+#. TRANSLATORS: The first %s is the name of the
+#. environment variable, the second %s is its value
+#: notes-utils.c:137
 #, c-format
-msgid "Could not update .gitmodules entry %s"
-msgstr "Konnte Eintrag '%s' in .gitmodules nicht aktualisieren"
+msgid "Bad %s value: '%s'"
+msgstr "Ungültiger %s Wert: '%s'"
 
-#: submodule.c:109
+#: object.c:242
 #, c-format
-msgid "Could not remove .gitmodules entry for %s"
-msgstr "Konnte Eintrag '%s' nicht aus .gitmodules entfernen"
-
-#: submodule.c:120
-msgid "staging updated .gitmodules failed"
-msgstr "Konnte aktualisierte .gitmodules-Datei nicht zum Commit vormerken"
+msgid "unable to parse object: %s"
+msgstr "Konnte Objekt '%s' nicht parsen."
 
-#: submodule.c:177
-msgid "negative values not allowed for submodule.fetchJobs"
-msgstr "Negative Werte für submodule.fetchJobs nicht erlaubt"
+#: parse-options.c:572
+msgid "..."
+msgstr "..."
 
-#: submodule-config.c:358
+#: parse-options.c:590
 #, c-format
-msgid "invalid value for %s"
-msgstr "Ungültiger Wert für %s"
+msgid "usage: %s"
+msgstr "Verwendung: %s"
 
-#: trailer.c:237
+#. TRANSLATORS: the colon here should align with the
+#. one in "usage: %s" translation
+#: parse-options.c:594
 #, c-format
-msgid "running trailer command '%s' failed"
-msgstr "Ausführen des Anhang-Befehls '%s' fehlgeschlagen"
+msgid "   or: %s"
+msgstr "      oder: %s"
 
-#: trailer.c:492 trailer.c:496 trailer.c:500 trailer.c:554 trailer.c:558
-#: trailer.c:562
+#: parse-options.c:597
 #, c-format
-msgid "unknown value '%s' for key '%s'"
-msgstr "unbekannter Wert '%s' für Schlüssel %s"
+msgid "    %s"
+msgstr "    %s"
 
-#: trailer.c:544 trailer.c:549 builtin/remote.c:289
-#, c-format
-msgid "more than one %s"
-msgstr "mehr als ein %s"
+#: parse-options.c:631
+msgid "-NUM"
+msgstr "-NUM"
 
-#: trailer.c:582
+#: parse-options-cb.c:108
 #, c-format
-msgid "empty trailer token in trailer '%.*s'"
-msgstr "leerer Anhang-Token in Anhang '%.*s'"
+msgid "malformed object name '%s'"
+msgstr "fehlerhafter Objekt-Name '%s'"
 
-#: trailer.c:702
+#: path.c:826
 #, c-format
-msgid "could not read input file '%s'"
-msgstr "Konnte Eingabe-Datei '%s' nicht lesen"
+msgid "Could not make %s writable by group"
+msgstr "Konnte Gruppenschreibrecht für %s nicht setzen."
 
-#: trailer.c:705
-msgid "could not read from stdin"
-msgstr "konnte nicht von der Standard-Eingabe lesen"
+#: pathspec.c:133
+msgid "global 'glob' and 'noglob' pathspec settings are incompatible"
+msgstr ""
+"Globale Einstellungen zur Pfadspezifikation 'glob' und 'noglob' sind "
+"inkompatibel."
 
-#: trailer.c:857 builtin/am.c:42
-#, c-format
-msgid "could not stat %s"
-msgstr "Konnte '%s' nicht lesen"
+#: pathspec.c:143
+msgid ""
+"global 'literal' pathspec setting is incompatible with all other global "
+"pathspec settings"
+msgstr ""
+"Globale Einstellung zur Pfadspezifikation 'literal' ist inkompatibel\n"
+"mit allen anderen Optionen."
+
+#: pathspec.c:177
+msgid "invalid parameter for pathspec magic 'prefix'"
+msgstr "ungültiger Parameter für Pfadspezifikationsangabe 'prefix'"
 
-#: trailer.c:859
+#: pathspec.c:183
 #, c-format
-msgid "file %s is not a regular file"
-msgstr "Datei '%s' ist keine reguläre Datei"
+msgid "Invalid pathspec magic '%.*s' in '%s'"
+msgstr "ungültige Pfadspezifikationsangabe '%.*s' in '%s'"
 
-#: trailer.c:861
+#: pathspec.c:187
 #, c-format
-msgid "file %s is not writable by user"
-msgstr "Datei %s ist vom Benutzer nicht beschreibbar."
+msgid "Missing ')' at the end of pathspec magic in '%s'"
+msgstr "Fehlendes ')' am Ende der Pfadspezifikationsangabe in '%s'"
 
-#: trailer.c:873
-msgid "could not open temporary file"
-msgstr "konnte temporäre Datei '%s' nicht öffnen"
+#: pathspec.c:205
+#, c-format
+msgid "Unimplemented pathspec magic '%c' in '%s'"
+msgstr "nicht unterstützte Pfadspezifikationsangabe '%c' in '%s'"
 
-#: trailer.c:912
+#: pathspec.c:230
 #, c-format
-msgid "could not rename temporary file to %s"
-msgstr "konnte temporäre Datei nicht zu %s umbenennen"
+msgid "%s: 'literal' and 'glob' are incompatible"
+msgstr "%s: 'literal' und 'glob' sind inkompatibel"
 
-#: transport.c:62
+#: pathspec.c:241
 #, c-format
-msgid "Would set upstream of '%s' to '%s' of '%s'\n"
-msgstr "Würde Upstream-Branch von '%s' zu '%s' von '%s' setzen\n"
+msgid "%s: '%s' is outside repository"
+msgstr "%s: '%s' liegt außerhalb des Repositories"
 
-#: transport.c:151
+#: pathspec.c:291
 #, c-format
-msgid "transport: invalid depth option '%s'"
-msgstr "transport: ungültige --depth Option '%s'"
+msgid "Pathspec '%s' is in submodule '%.*s'"
+msgstr "Pfadspezifikation '%s' befindet sich in Submodul '%.*s'"
 
-#: transport.c:771
+#: pathspec.c:353
 #, c-format
-msgid ""
-"The following submodule paths contain changes that can\n"
-"not be found on any remote:\n"
+msgid "%s: pathspec magic not supported by this command: %s"
 msgstr ""
-"Die folgenden Submodul-Pfade enthalten Änderungen, die in keinem\n"
-"Remote-Repository gefunden wurden:\n"
+"%s: Pfadspezifikationsangabe wird von diesem Befehl nicht unterstützt: %s"
 
-#: transport.c:775
-#, c-format
+#: pathspec.c:408
 msgid ""
-"\n"
-"Please try\n"
-"\n"
-"\tgit push --recurse-submodules=on-demand\n"
-"\n"
-"or cd to the path and use\n"
-"\n"
-"\tgit push\n"
-"\n"
-"to push them to a remote.\n"
-"\n"
+"empty strings as pathspecs will be made invalid in upcoming releases. please "
+"use . instead if you meant to match all paths"
 msgstr ""
-"\n"
-"Bitte versuchen Sie\n"
-"\n"
-"\tgit push --recurse-submodules=on-demand\n"
-"\n"
-"oder wechseln Sie in das Verzeichnis und benutzen Sie\n"
-"\n"
-"\tgit push\n"
-"\n"
-"zum Versenden zu einem Remote-Repository.\n"
-"\n"
-
-#: transport.c:783
-msgid "Aborting."
-msgstr "Abbruch."
+"Leere Strings als Pfadspezifikationen werden in kommenden Releases ungültig.\n"
+"Bitte benutzen Sie stattdessen . wenn Sie alle Pfade meinen."
 
-#: transport-helper.c:1041
+#: pathspec.c:440
 #, c-format
-msgid "Could not read ref %s"
-msgstr "Konnte Referenz %s nicht lesen."
+msgid "pathspec '%s' is beyond a symbolic link"
+msgstr "Pfadspezifikation '%s' ist hinter einer symbolischen Verknüpfung"
 
-#: unpack-trees.c:64
-#, c-format
+#: pathspec.c:449
 msgid ""
-"Your local changes to the following files would be overwritten by checkout:\n"
-"%%sPlease commit your changes or stash them before you switch branches."
+"There is nothing to exclude from by :(exclude) patterns.\n"
+"Perhaps you forgot to add either ':/' or '.' ?"
 msgstr ""
-"Ihre lokalen Änderungen in den folgenden Dateien würden beim Auschecken\n"
-"überschrieben werden:\n"
-"%%sBitte committen oder stashen Sie Ihre Änderungen, bevor Sie Branches\n"
-"wechseln."
+":(exclude) Muster, aber keine anderen Pfadspezifikationen angegeben.\n"
+"Vielleicht haben Sie vergessen entweder ':/' oder '.' hinzuzufügen?"
 
-#: unpack-trees.c:66
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by checkout:\n"
-"%%s"
-msgstr ""
-"Ihre lokalen Änderungen in den folgenden Dateien würden beim Auschecken\n"
-"überschrieben werden:\n"
-"%%s"
+#: pretty.c:971
+msgid "unable to parse --pretty format"
+msgstr "Konnte --pretty Format nicht parsen."
 
-#: unpack-trees.c:69
+#: read-cache.c:1315
 #, c-format
 msgid ""
-"Your local changes to the following files would be overwritten by merge:\n"
-"%%sPlease commit your changes or stash them before you merge."
+"index.version set, but the value is invalid.\n"
+"Using version %i"
 msgstr ""
-"Ihre lokalen Änderungen in den folgenden Dateien würden durch den Merge\n"
-"überschrieben werden:\n"
-"%%sBitte committen oder stashen Sie Ihre Änderungen, bevor sie mergen."
+"index.version gesetzt, aber Wert ungültig.\n"
+"Verwende Version %i"
 
-#: unpack-trees.c:71
+#: read-cache.c:1325
 #, c-format
 msgid ""
-"Your local changes to the following files would be overwritten by merge:\n"
-"%%s"
+"GIT_INDEX_VERSION set, but the value is invalid.\n"
+"Using version %i"
 msgstr ""
-"Ihre lokalen Änderungen in den folgenden Dateien würden durch den Merge\n"
-"überschrieben werden:\n"
-"%%s"
+"GIT_INDEX_VERSION gesetzt, aber Wert ungültig.\n"
+"Verwende Version %i"
 
-#: unpack-trees.c:74
+#: refs.c:576 builtin/merge.c:840
 #, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by %s:\n"
-"%%sPlease commit your changes or stash them before you %s."
-msgstr ""
-"Ihre lokalen Änderungen in den folgenden Dateien würden durch %s\n"
-"überschrieben werden:\n"
-"%%sBitte committen oder stashen Sie Ihre Änderungen, bevor Sie %s ausführen."
+msgid "Could not open '%s' for writing"
+msgstr "Konnte '%s' nicht zum Schreiben öffnen."
 
-#: unpack-trees.c:76
+#: refs/files-backend.c:2481
 #, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by %s:\n"
-"%%s"
-msgstr ""
-"Ihre lokalen Änderungen würden durch %s überschrieben werden.\n"
-"%%s"
+msgid "could not delete reference %s: %s"
+msgstr "Konnte Referenz %s nicht entfernen: %s"
 
-#: unpack-trees.c:81
+#: refs/files-backend.c:2484
 #, c-format
-msgid ""
-"Updating the following directories would lose untracked files in it:\n"
-"%s"
-msgstr ""
-"Durch die Aktualisierung der folgenden Verzeichnisse würden unversionierte\n"
-"Dateien in diesen Verzeichnissen verloren gehen:\n"
-"%s"
+msgid "could not delete references: %s"
+msgstr "Konnte Referenzen nicht entfernen: %s"
 
-#: unpack-trees.c:85
+#: refs/files-backend.c:2493
 #, c-format
-msgid ""
-"The following untracked working tree files would be removed by checkout:\n"
-"%%sPlease move or remove them before you switch branches."
-msgstr ""
-"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch\n"
-"den Checkout entfernt werden:\n"
-"%%sBitte verschieben oder entfernen Sie diese, bevor Sie Branches wechseln."
+msgid "could not remove reference %s"
+msgstr "Konnte Referenz %s nicht löschen"
 
-#: unpack-trees.c:87
+#: ref-filter.c:55
 #, c-format
-msgid ""
-"The following untracked working tree files would be removed by checkout:\n"
-"%%s"
-msgstr ""
-"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch "
-"den\n"
-"Checkout entfernt werden:\n"
-"%%s"
+msgid "expected format: %%(color:<color>)"
+msgstr "Erwartetes Format: %%(color:<Farbe>)"
 
-#: unpack-trees.c:90
+#: ref-filter.c:57
 #, c-format
-msgid ""
-"The following untracked working tree files would be removed by merge:\n"
-"%%sPlease move or remove them before you merge."
-msgstr ""
-"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch\n"
-"den Merge entfernt werden:\n"
-"%%sBitte verschieben oder entfernen Sie diese, bevor sie mergen."
+msgid "unrecognized color: %%(color:%s)"
+msgstr "nicht erkannte Farbe: %%(color:%s)"
 
-#: unpack-trees.c:92
+#: ref-filter.c:71
 #, c-format
-msgid ""
-"The following untracked working tree files would be removed by merge:\n"
-"%%s"
-msgstr ""
-"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch "
-"den\n"
-"Merge entfernt werden:\n"
-"%%s"
+msgid "unrecognized format: %%(%s)"
+msgstr "nicht erkanntes Format: %%(%s)"
 
-#: unpack-trees.c:95
+#: ref-filter.c:77
 #, c-format
-msgid ""
-"The following untracked working tree files would be removed by %s:\n"
-"%%sPlease move or remove them before you %s."
-msgstr ""
-"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch\n"
-"den %s entfernt werden:\n"
-"%%sBitte verschieben oder entfernen Sie diese, bevor sie %s ausführen."
+msgid "%%(body) does not take arguments"
+msgstr "%%(body) akzeptiert keine Argumente"
 
-#: unpack-trees.c:97
+#: ref-filter.c:84
 #, c-format
-msgid ""
-"The following untracked working tree files would be removed by %s:\n"
-"%%s"
-msgstr ""
-"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch\n"
-"den %s entfernt werden:\n"
-"%%s"
+msgid "%%(subject) does not take arguments"
+msgstr "%%(subject) akzeptiert keine Argumente"
 
-#: unpack-trees.c:102
+#: ref-filter.c:101
 #, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by "
-"checkout:\n"
-"%%sPlease move or remove them before you switch branches."
-msgstr ""
-"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch\n"
-"den Checkout überschrieben werden:\n"
-"%%sBitte verschieben oder entfernen Sie diese, bevor Sie Branches wechseln."
+msgid "positive value expected contents:lines=%s"
+msgstr "Positiver Wert erwartet contents:lines=%s"
 
-#: unpack-trees.c:104
+#: ref-filter.c:103
 #, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by "
-"checkout:\n"
-"%%s"
-msgstr ""
-"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch "
-"den\n"
-"Checkout überschrieben werden:\n"
-"%%s"
+msgid "unrecognized %%(contents) argument: %s"
+msgstr "nicht erkanntes %%(contents) Argument: %s"
 
-#: unpack-trees.c:107
+#: ref-filter.c:113
 #, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by merge:\n"
-"%%sPlease move or remove them before you merge."
-msgstr ""
-"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch\n"
-"den Merge überschrieben werden:\n"
-"%%sBitte verschieben oder entfernen Sie diese, bevor Sie mergen."
+msgid "unrecognized %%(objectname) argument: %s"
+msgstr "nicht erkanntes %%(objectname) Argument: %s"
 
-#: unpack-trees.c:109
+#: ref-filter.c:135
 #, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by merge:\n"
-"%%s"
-msgstr ""
-"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch\n"
-"den Merge überschrieben werden:\n"
-"%%s"
+msgid "expected format: %%(align:<width>,<position>)"
+msgstr "Erwartetes Format: %%(align:<Breite>,<Position>)"
 
-#: unpack-trees.c:112
+#: ref-filter.c:147
 #, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by %s:\n"
-"%%sPlease move or remove them before you %s."
-msgstr ""
-"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch\n"
-"den %s überschrieben werden:\n"
-"%%sBitte verschieben oder entfernen Sie diese, bevor sie %s ausführen."
+msgid "unrecognized position:%s"
+msgstr "nicht erkannte Position:%s"
 
-#: unpack-trees.c:114
+#: ref-filter.c:151
 #, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by %s:\n"
-"%%s"
-msgstr ""
-"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch "
-"den\n"
-"%s überschrieben werden:\n"
-"%%s"
+msgid "unrecognized width:%s"
+msgstr "nicht erkannte Breite:%s"
 
-#: unpack-trees.c:121
+#: ref-filter.c:157
 #, c-format
-msgid "Entry '%s' overlaps with '%s'.  Cannot bind."
-msgstr "Eintrag '%s' überschneidet sich mit '%s'. Kann nicht verbinden."
+msgid "unrecognized %%(align) argument: %s"
+msgstr "nicht erkanntes %%(align) Argument: %s"
 
-#: unpack-trees.c:124
+#: ref-filter.c:161
 #, c-format
-msgid ""
-"Cannot update sparse checkout: the following entries are not up-to-date:\n"
-"%s"
-msgstr ""
-"Kann partiellen Checkout nicht aktualisieren: die folgenden Einträge sind "
-"nicht\n"
-"aktuell:\n"
-"%s"
+msgid "positive width expected with the %%(align) atom"
+msgstr "Positive Breitenangabe für %%(align) erwartet"
 
-#: unpack-trees.c:126
+#: ref-filter.c:244
 #, c-format
-msgid ""
-"The following Working tree files would be overwritten by sparse checkout "
-"update:\n"
-"%s"
-msgstr ""
-"Die folgenden Dateien im Arbeitsbereich würden durch die Aktualisierung\n"
-"des partiellen Checkouts überschrieben werden:\n"
-"%s"
+msgid "malformed field name: %.*s"
+msgstr "Fehlerhafter Feldname: %.*s"
 
-#: unpack-trees.c:128
+#: ref-filter.c:270
 #, c-format
-msgid ""
-"The following Working tree files would be removed by sparse checkout "
-"update:\n"
-"%s"
-msgstr ""
-"Die folgenden Dateien im Arbeitsbereich würden durch die Aktualisierung\n"
-"des partiellen Checkouts entfernt werden:\n"
-"%s"
+msgid "unknown field name: %.*s"
+msgstr "Unbekannter Feldname: %.*s"
 
-#: unpack-trees.c:205
+#: ref-filter.c:372
 #, c-format
-msgid "Aborting\n"
-msgstr "Abbruch\n"
+msgid "format: %%(end) atom used without corresponding atom"
+msgstr "Format: %%(end) Atom ohne zugehöriges Atom verwendet"
 
-#: unpack-trees.c:237
-msgid "Checking out files"
-msgstr "Checke Dateien aus"
+#: ref-filter.c:424
+#, c-format
+msgid "malformed format string %s"
+msgstr "Fehlerhafter Formatierungsstring %s"
 
-#: urlmatch.c:120
-msgid "invalid URL scheme name or missing '://' suffix"
-msgstr "Ungültiges URL-Schema oder Suffix '://' fehlt"
+#: ref-filter.c:878
+msgid ":strip= requires a positive integer argument"
+msgstr ":strip= erfordert eine positive Ganzzahl als Argument"
 
-#: urlmatch.c:144 urlmatch.c:297 urlmatch.c:356
+#: ref-filter.c:883
 #, c-format
-msgid "invalid %XX escape sequence"
-msgstr "ungültige Escape-Sequenz %XX"
-
-#: urlmatch.c:172
-msgid "missing host and scheme is not 'file:'"
-msgstr "fehlender Host und Schema ist nicht 'file:'"
+msgid "ref '%s' does not have %ld components to :strip"
+msgstr "Referenz '%s' hat keine %ld Komponenten für :strip"
 
-#: urlmatch.c:189
-msgid "a 'file:' URL may not have a port number"
-msgstr "eine 'file:' URL darf keine Portnummer enthalten"
+#: ref-filter.c:1046
+#, c-format
+msgid "unknown %.*s format %s"
+msgstr "Unbekanntes %.*s Format %s"
 
-#: urlmatch.c:199
-msgid "invalid characters in host name"
-msgstr "Hostname enthält ungültige Zeichen"
+#: ref-filter.c:1066 ref-filter.c:1097
+#, c-format
+msgid "missing object %s for %s"
+msgstr "Objekt %s fehlt für %s"
 
-#: urlmatch.c:244 urlmatch.c:255
-msgid "invalid port number"
-msgstr "ungültige Portnummer"
+#: ref-filter.c:1069 ref-filter.c:1100
+#, c-format
+msgid "parse_object_buffer failed on %s for %s"
+msgstr "parse_object_buffer bei %s für %s fehlgeschlagen"
 
-#: urlmatch.c:322
-msgid "invalid '..' path segment"
-msgstr "ungültiges '..' Pfadsegment"
+#: ref-filter.c:1311
+#, c-format
+msgid "malformed object at '%s'"
+msgstr "fehlerhaftes Objekt bei '%s'"
 
-#: worktree.c:282
+#: ref-filter.c:1373
 #, c-format
-msgid "failed to read '%s'"
-msgstr "Fehler beim Lesen von '%s'"
+msgid "ignoring ref with broken name %s"
+msgstr "Ignoriere Referenz mit fehlerhaftem Namen %s"
 
-#: wrapper.c:222 wrapper.c:392
+#: ref-filter.c:1378
 #, c-format
-msgid "could not open '%s' for reading and writing"
-msgstr "Konnte '%s' nicht zum Lesen und Schreiben öffnen."
+msgid "ignoring broken ref %s"
+msgstr "Ignoriere fehlerhafte Referenz %s"
 
-#: wrapper.c:224 wrapper.c:394 builtin/am.c:778
+#: ref-filter.c:1633
 #, c-format
-msgid "could not open '%s' for writing"
-msgstr "Konnte '%s' nicht zum Schreiben öffnen."
+msgid "format: %%(end) atom missing"
+msgstr "Format: %%(end) Atom fehlt"
 
-#: wrapper.c:226 wrapper.c:396 builtin/am.c:324 builtin/am.c:771
-#: builtin/am.c:859 builtin/commit.c:1712 builtin/merge.c:1029
-#: builtin/pull.c:407
+#: ref-filter.c:1687
 #, c-format
-msgid "could not open '%s' for reading"
-msgstr "Konnte '%s' nicht zum Lesen öffnen."
+msgid "malformed object name %s"
+msgstr "Missgebildeter Objektname %s"
 
-#: wrapper.c:605 wrapper.c:626
+#: remote.c:746
 #, c-format
-msgid "unable to access '%s'"
-msgstr "konnte nicht auf '%s' zugreifen"
+msgid "Cannot fetch both %s and %s to %s"
+msgstr "Kann 'fetch' nicht für sowohl %s als auch %s nach %s ausführen."
 
-#: wrapper.c:634
-msgid "unable to get current working directory"
-msgstr "Konnte aktuelles Arbeitsverzeichnis nicht bekommen."
+#: remote.c:750
+#, c-format
+msgid "%s usually tracks %s, not %s"
+msgstr "%s folgt üblicherweise %s, nicht %s"
 
-#: wrapper.c:658
+#: remote.c:754
 #, c-format
-msgid "could not write to %s"
-msgstr "Konnte nicht nach '%s' schreiben."
+msgid "%s tracks both %s and %s"
+msgstr "%s folgt sowohl %s als auch %s"
 
-#: wrapper.c:660
+#: remote.c:762
+msgid "Internal error"
+msgstr "Interner Fehler"
+
+#: remote.c:1677 remote.c:1720
+msgid "HEAD does not point to a branch"
+msgstr "HEAD zeigt auf keinen Branch"
+
+#: remote.c:1686
 #, c-format
-msgid "could not close %s"
-msgstr "Konnte '%s' nicht schließen."
+msgid "no such branch: '%s'"
+msgstr "Kein solcher Branch: '%s'"
 
-#: wt-status.c:150
-msgid "Unmerged paths:"
-msgstr "Nicht zusammengeführte Pfade:"
+#: remote.c:1689
+#, c-format
+msgid "no upstream configured for branch '%s'"
+msgstr "Kein Upstream-Branch für Branch '%s' konfiguriert."
 
-#: wt-status.c:177 wt-status.c:204
+#: remote.c:1695
 #, c-format
-msgid "  (use \"git reset %s <file>...\" to unstage)"
-msgstr ""
-"  (benutzen Sie \"git reset %s <Datei>...\" zum Entfernen aus der Staging-"
-"Area)"
+msgid "upstream branch '%s' not stored as a remote-tracking branch"
+msgstr "Upstream-Branch '%s' nicht als Remote-Tracking-Branch gespeichert"
 
-#: wt-status.c:179 wt-status.c:206
-msgid "  (use \"git rm --cached <file>...\" to unstage)"
+#: remote.c:1710
+#, c-format
+msgid "push destination '%s' on remote '%s' has no local tracking branch"
 msgstr ""
-"  (benutzen Sie \"git rm --cached <Datei>...\" zum Entfernen aus der Staging-"
-"Area)"
+"Ziel für \"push\" '%s' auf Remote-Repository '%s' hat keinen lokal gefolgten "
+"Branch"
 
-#: wt-status.c:183
-msgid "  (use \"git add <file>...\" to mark resolution)"
-msgstr ""
-"  (benutzen Sie \"git add/rm <Datei>...\", um die Auflösung zu markieren)"
+#: remote.c:1725
+#, c-format
+msgid "branch '%s' has no remote for pushing"
+msgstr "Branch '%s' hat keinen Upstream-Branch gesetzt"
 
-#: wt-status.c:185 wt-status.c:189
-msgid "  (use \"git add/rm <file>...\" as appropriate to mark resolution)"
-msgstr ""
-"  (benutzen Sie \"git add/rm <Datei>...\", um die Auflösung entsprechend zu "
-"markieren)"
+#: remote.c:1736
+#, c-format
+msgid "push refspecs for '%s' do not include '%s'"
+msgstr "Push-Refspecs für '%s' beinhalten nicht '%s'"
 
-#: wt-status.c:187
-msgid "  (use \"git rm <file>...\" to mark resolution)"
+#: remote.c:1749
+msgid "push has no destination (push.default is 'nothing')"
+msgstr "kein Ziel für \"push\" (push.default ist 'nothing')"
+
+#: remote.c:1771
+msgid "cannot resolve 'simple' push to a single destination"
+msgstr "kann einzelnes Ziel für \"push\" im Modus 'simple' nicht auflösen"
+
+#: remote.c:2073
+#, c-format
+msgid "Your branch is based on '%s', but the upstream is gone.\n"
 msgstr ""
-"  (benutzen Sie \"git add/rm <Datei>...\", um die Auflösung zu markieren)"
+"Ihr Branch basiert auf '%s', aber der Upstream-Branch wurde entfernt.\n"
 
-#: wt-status.c:198 wt-status.c:882
-msgid "Changes to be committed:"
-msgstr "zum Commit vorgemerkte Änderungen:"
+#: remote.c:2077
+msgid "  (use \"git branch --unset-upstream\" to fixup)\n"
+msgstr "  (benutzen Sie \"git branch --unset-upstream\" zum Beheben)\n"
 
-#: wt-status.c:216 wt-status.c:891
-msgid "Changes not staged for commit:"
-msgstr "Änderungen, die nicht zum Commit vorgemerkt sind:"
+#: remote.c:2080
+#, c-format
+msgid "Your branch is up-to-date with '%s'.\n"
+msgstr "Ihr Branch ist auf dem selben Stand wie '%s'.\n"
 
-#: wt-status.c:220
-msgid "  (use \"git add <file>...\" to update what will be committed)"
-msgstr ""
-"  (benutzen Sie \"git add <Datei>...\", um die Änderungen zum Commit "
-"vorzumerken)"
+#: remote.c:2084
+#, c-format
+msgid "Your branch is ahead of '%s' by %d commit.\n"
+msgid_plural "Your branch is ahead of '%s' by %d commits.\n"
+msgstr[0] "Ihr Branch ist vor '%s' um %d Commit.\n"
+msgstr[1] "Ihr Branch ist vor '%s' um %d Commits.\n"
 
-#: wt-status.c:222
-msgid "  (use \"git add/rm <file>...\" to update what will be committed)"
-msgstr ""
-"  (benutzen Sie \"git add/rm <Datei>...\", um die Änderungen zum Commit "
-"vorzumerken)"
+#: remote.c:2090
+msgid "  (use \"git push\" to publish your local commits)\n"
+msgstr "  (benutzen Sie \"git push\", um lokale Commits zu publizieren)\n"
 
-#: wt-status.c:223
-msgid ""
-"  (use \"git checkout -- <file>...\" to discard changes in working directory)"
-msgstr ""
-"  (benutzen Sie \"git checkout -- <Datei>...\", um die Änderungen im "
-"Arbeitsverzeichnis zu verwerfen)"
+#: remote.c:2093
+#, c-format
+msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n"
+msgid_plural ""
+"Your branch is behind '%s' by %d commits, and can be fast-forwarded.\n"
+msgstr[0] ""
+"Ihr Branch ist zu '%s' um %d Commit hinterher, und kann vorgespult werden.\n"
+msgstr[1] ""
+"Ihr Branch ist zu '%s' um %d Commits hinterher, und kann vorgespult werden.\n"
 
-#: wt-status.c:225
-msgid "  (commit or discard the untracked or modified content in submodules)"
+#: remote.c:2101
+msgid "  (use \"git pull\" to update your local branch)\n"
 msgstr ""
-"  (committen oder verwerfen Sie den unversionierten oder geänderten Inhalt "
-"in den Submodulen)"
+"  (benutzen Sie \"git pull\", um Ihren lokalen Branch zu aktualisieren)\n"
 
-#: wt-status.c:237
+#: remote.c:2104
 #, c-format
-msgid "  (use \"git %s <file>...\" to include in what will be committed)"
+msgid ""
+"Your branch and '%s' have diverged,\n"
+"and have %d and %d different commit each, respectively.\n"
+msgid_plural ""
+"Your branch and '%s' have diverged,\n"
+"and have %d and %d different commits each, respectively.\n"
+msgstr[0] ""
+"Ihr Branch und '%s' sind divergiert,\n"
+"und haben jeweils %d und %d unterschiedliche Commits.\n"
+msgstr[1] ""
+"Ihr Branch und '%s' sind divergiert,\n"
+"und haben jeweils %d und %d unterschiedliche Commits.\n"
+
+#: remote.c:2114
+msgid "  (use \"git pull\" to merge the remote branch into yours)\n"
 msgstr ""
-"  (benutzen Sie \"git %s <Datei>...\", um die Änderungen zum Commit "
-"vorzumerken)"
+"  (benutzen Sie \"git pull\", um Ihren Branch mit dem Remote-Branch "
+"zusammenzuführen)\n"
 
-#: wt-status.c:252
-msgid "both deleted:"
-msgstr "beide gelöscht:"
+#: revision.c:2158
+msgid "your current branch appears to be broken"
+msgstr "Ihr aktueller Branch scheint fehlerhaft zu sein."
 
-#: wt-status.c:254
-msgid "added by us:"
-msgstr "von uns hinzugefügt:"
+#: revision.c:2161
+#, c-format
+msgid "your current branch '%s' does not have any commits yet"
+msgstr "Ihr aktueller Branch '%s' hat noch keine Commits."
 
-#: wt-status.c:256
-msgid "deleted by them:"
-msgstr "von denen gelöscht:"
+#: revision.c:2355
+msgid "--first-parent is incompatible with --bisect"
+msgstr "Die Optionen --first-parent und --bisect sind inkompatibel."
 
-#: wt-status.c:258
-msgid "added by them:"
-msgstr "von denen hinzugefügt:"
+#: run-command.c:106
+msgid "open /dev/null failed"
+msgstr "Öffnen von /dev/null fehlgeschlagen"
 
-#: wt-status.c:260
-msgid "deleted by us:"
-msgstr "von uns gelöscht:"
+#: run-command.c:108
+#, c-format
+msgid "dup2(%d,%d) failed"
+msgstr "dup2(%d,%d) fehlgeschlagen"
 
-#: wt-status.c:262
-msgid "both added:"
-msgstr "von beiden hinzugefügt:"
+#: send-pack.c:297
+msgid "failed to sign the push certificate"
+msgstr "Fehler beim Signieren des \"push\"-Zertifikates"
 
-#: wt-status.c:264
-msgid "both modified:"
-msgstr "von beiden geändert:"
+#: send-pack.c:410
+msgid "the receiving end does not support --signed push"
+msgstr ""
+"die Gegenseite unterstützt keinen signierten Versand (\"--signed push\")"
 
-#: wt-status.c:274
-msgid "new file:"
-msgstr "neue Datei:"
+#: send-pack.c:412
+msgid ""
+"not sending a push certificate since the receiving end does not support --"
+"signed push"
+msgstr ""
+"kein Versand des \"push\"-Zertifikates, da die Gegenseite keinen signierten\n"
+"Versand (\"--signed push\") unterstützt"
 
-#: wt-status.c:276
-msgid "copied:"
-msgstr "kopiert:"
+#: send-pack.c:424
+msgid "the receiving end does not support --atomic push"
+msgstr "die Gegenseite unterstützt keinen atomaren Versand (\"--atomic push\")"
 
-#: wt-status.c:278
-msgid "deleted:"
-msgstr "gelöscht:"
+#: send-pack.c:429
+msgid "the receiving end does not support push options"
+msgstr "die Gegenseite unterstützt keine Push-Optionen"
 
-#: wt-status.c:280
-msgid "modified:"
-msgstr "geändert:"
+#: sequencer.c:171
+msgid "revert"
+msgstr "Revert"
 
-#: wt-status.c:282
-msgid "renamed:"
-msgstr "umbenannt:"
+#: sequencer.c:171
+msgid "cherry-pick"
+msgstr "Cherry-Pick"
 
-#: wt-status.c:284
-msgid "typechange:"
-msgstr "Typänderung:"
+#: sequencer.c:228
+msgid ""
+"after resolving the conflicts, mark the corrected paths\n"
+"with 'git add <paths>' or 'git rm <paths>'"
+msgstr ""
+"nach Auflösung der Konflikte, markieren Sie die korrigierten Pfade\n"
+"mit 'git add <Pfade>' oder 'git rm <Pfade>'"
 
-#: wt-status.c:286
-msgid "unknown:"
-msgstr "unbekannt:"
+#: sequencer.c:231
+msgid ""
+"after resolving the conflicts, mark the corrected paths\n"
+"with 'git add <paths>' or 'git rm <paths>'\n"
+"and commit the result with 'git commit'"
+msgstr ""
+"nach Auflösung der Konflikte, markieren Sie die korrigierten Pfade\n"
+"mit 'git add <Pfade>' oder 'git rm <Pfade>'und tragen Sie das Ergebnis mit\n"
+"'git commit' ein"
 
-#: wt-status.c:288
-msgid "unmerged:"
-msgstr "nicht gemerged:"
+#: sequencer.c:244 sequencer.c:1209
+#, c-format
+msgid "could not lock '%s'"
+msgstr "Konnte '%s' nicht sperren"
 
-#: wt-status.c:370
-msgid "new commits, "
-msgstr "neue Commits, "
+#: sequencer.c:247 sequencer.c:1125 sequencer.c:1214
+#, c-format
+msgid "could not write to '%s'"
+msgstr "Konnte nicht nach '%s' schreiben."
 
-#: wt-status.c:372
-msgid "modified content, "
-msgstr "geänderter Inhalt, "
+#: sequencer.c:251
+#, c-format
+msgid "could not write eol to '%s'"
+msgstr "Konnte EOL nicht nach '%s' schreiben."
 
-#: wt-status.c:374
-msgid "untracked content, "
-msgstr "unversionierter Inhalt, "
+#: sequencer.c:255 sequencer.c:1130 sequencer.c:1216
+#, c-format
+msgid "failed to finalize '%s'."
+msgstr "Fehler beim Fertigstellen von '%s'."
 
-#: wt-status.c:756
-msgid "Submodules changed but not updated:"
-msgstr "Submodule geändert, aber nicht aktualisiert:"
+#: sequencer.c:279 builtin/am.c:259 builtin/commit.c:749 builtin/merge.c:1032
+#, c-format
+msgid "could not read '%s'"
+msgstr "Konnte '%s' nicht lesen"
 
-#: wt-status.c:758
-msgid "Submodule changes to be committed:"
-msgstr "Änderungen in Submodul zum Committen:"
+#: sequencer.c:305
+#, c-format
+msgid "your local changes would be overwritten by %s."
+msgstr "Ihre lokalen Änderungen würden durch den %s überschrieben werden."
 
-#: wt-status.c:839
-msgid ""
-"Do not touch the line above.\n"
-"Everything below will be removed."
+#: sequencer.c:309
+msgid "commit your changes or stash them to proceed."
 msgstr ""
-"Ändern Sie nicht die obige Zeile.\n"
-"Alles unterhalb von ihr wird entfernt."
+"Committen Sie Ihre Änderungen oder benutzen Sie \"stash\", um fortzufahren."
 
-#: wt-status.c:950
-msgid "You have unmerged paths."
-msgstr "Sie haben nicht zusammengeführte Pfade."
-
-#: wt-status.c:953
-msgid "  (fix conflicts and run \"git commit\")"
-msgstr " (beheben Sie die Konflikte und führen Sie \"git commit\" aus)"
-
-#: wt-status.c:955
-msgid "  (use \"git merge --abort\" to abort the merge)"
-msgstr "  (benutzen Sie \"git merge --abort\", um den Merge abzubrechen)"
-
-#: wt-status.c:960
-msgid "All conflicts fixed but you are still merging."
-msgstr "Alle Konflikte sind behoben, aber Sie sind immer noch beim Merge."
+#: sequencer.c:324
+#, c-format
+msgid "%s: fast-forward"
+msgstr "%s: Vorspulen"
 
-#: wt-status.c:963
-msgid "  (use \"git commit\" to conclude merge)"
-msgstr "  (benutzen Sie \"git commit\", um den Merge abzuschließen)"
+#. TRANSLATORS: %s will be "revert" or "cherry-pick"
+#: sequencer.c:399
+#, c-format
+msgid "%s: Unable to write new index file"
+msgstr "%s: Konnte neue Index-Datei nicht schreiben"
 
-#: wt-status.c:973
-msgid "You are in the middle of an am session."
-msgstr "Eine \"am\"-Sitzung ist im Gange."
+#: sequencer.c:418
+msgid "could not resolve HEAD commit\n"
+msgstr "Konnte HEAD-Commit nicht auflösen\n"
 
-#: wt-status.c:976
-msgid "The current patch is empty."
-msgstr "Der aktuelle Patch ist leer."
+#: sequencer.c:438
+msgid "unable to update cache tree\n"
+msgstr "Konnte Cache-Verzeichnis nicht aktualisieren\n"
 
-#: wt-status.c:980
-msgid "  (fix conflicts and then run \"git am --continue\")"
+#: sequencer.c:483
+#, c-format
+msgid ""
+"you have staged changes in your working tree\n"
+"If these changes are meant to be squashed into the previous commit, run:\n"
+"\n"
+"  git commit --amend %s\n"
+"\n"
+"If they are meant to go into a new commit, run:\n"
+"\n"
+"  git commit %s\n"
+"\n"
+"In both cases, once you're done, continue with:\n"
+"\n"
+"  git rebase --continue\n"
 msgstr ""
-"  (beheben Sie die Konflikte und führen Sie dann \"git am --continue\" aus)"
+"Es befinden sich zum Commit vorgemerkte Änderungen in Ihrem Arbeitsverzeichnis.\n"
+"Wenn diese Änderungen in den vorherigen Commit aufgenommen werden sollen,\n"
+"führen Sie aus:\n"
+"\n"
+"  git commit --amend %s\n"
+"\n"
+"Wenn daraus ein neuer Commit erzeugt werden soll, führen Sie aus:\n"
+"\n"
+"  git commit %s\n"
+"\n"
+"Im Anschluss führen Sie zum Fortfahren aus:\n"
+"\n"
+"  git rebase --continue\n"
 
-#: wt-status.c:982
-msgid "  (use \"git am --skip\" to skip this patch)"
-msgstr "  (benutzen Sie \"git am --skip\", um diesen Patch auszulassen)"
+#: sequencer.c:567
+#, c-format
+msgid "could not parse commit %s\n"
+msgstr "Konnte Commit %s nicht parsen\n"
 
-#: wt-status.c:984
-msgid "  (use \"git am --abort\" to restore the original branch)"
-msgstr ""
-"  (benutzen Sie \"git am --abort\", um den ursprünglichen Branch "
-"wiederherzustellen)"
+#: sequencer.c:572
+#, c-format
+msgid "could not parse parent commit %s\n"
+msgstr "Konnte Eltern-Commit %s nicht parsen\n"
 
-#: wt-status.c:1109
-msgid "No commands done."
-msgstr "Keine Befehle ausgeführt."
+#: sequencer.c:656
+msgid "your index file is unmerged."
+msgstr "Ihre Index-Datei ist nicht zusammengeführt."
 
-#: wt-status.c:1112
+#: sequencer.c:675
 #, c-format
-msgid "Last command done (%d command done):"
-msgid_plural "Last commands done (%d commands done):"
-msgstr[0] "Zuletzt ausgeführter Befehl (%d Befehl ausgeführt):"
-msgstr[1] "Zuletzt ausgeführte Befehle (%d Befehle ausgeführt):"
+msgid "commit %s is a merge but no -m option was given."
+msgstr "Commit %s ist ein Merge, aber die Option -m wurde nicht angegeben."
 
-#: wt-status.c:1123
+#: sequencer.c:683
 #, c-format
-msgid "  (see more in file %s)"
-msgstr "  (mehr Informationen in Datei %s)"
-
-#: wt-status.c:1128
-msgid "No commands remaining."
-msgstr "Keine Befehle verbleibend."
+msgid "commit %s does not have parent %d"
+msgstr "Commit %s hat keinen Eltern-Commit %d"
 
-#: wt-status.c:1131
+#: sequencer.c:687
 #, c-format
-msgid "Next command to do (%d remaining command):"
-msgid_plural "Next commands to do (%d remaining commands):"
-msgstr[0] "Nächster auszuführender Befehl (%d Befehle verbleibend):"
-msgstr[1] "Nächste auszuführende Befehle (%d Befehle verbleibend):"
+msgid "mainline was specified but commit %s is not a merge."
+msgstr "Hauptlinie wurde spezifiziert, aber Commit %s ist kein Merge."
 
-#: wt-status.c:1139
-msgid "  (use \"git rebase --edit-todo\" to view and edit)"
-msgstr "  (benutzen Sie \"git rebase --edit-todo\" zum Ansehen und Bearbeiten)"
+#. TRANSLATORS: The first %s will be a "todo" command like
+#. "revert" or "pick", the second %s a SHA1.
+#: sequencer.c:700
+#, c-format
+msgid "%s: cannot parse parent commit %s"
+msgstr "%s: kann Eltern-Commit %s nicht parsen"
 
-#: wt-status.c:1152
+#: sequencer.c:705
 #, c-format
-msgid "You are currently rebasing branch '%s' on '%s'."
-msgstr "Sie sind gerade beim Rebase von Branch '%s' auf '%s'."
+msgid "cannot get commit message for %s"
+msgstr "Kann keine Commit-Beschreibung für %s bekommen."
 
-#: wt-status.c:1157
-msgid "You are currently rebasing."
-msgstr "Sie sind gerade beim Rebase."
+#: sequencer.c:797
+#, c-format
+msgid "could not revert %s... %s"
+msgstr "Konnte \"revert\" nicht auf %s... (%s) ausführen"
 
-#: wt-status.c:1171
-msgid "  (fix conflicts and then run \"git rebase --continue\")"
-msgstr ""
-"  (beheben Sie die Konflikte und führen Sie dann \"git rebase --continue\" "
-"aus)"
+#: sequencer.c:798
+#, c-format
+msgid "could not apply %s... %s"
+msgstr "Konnte %s... (%s) nicht anwenden"
 
-#: wt-status.c:1173
-msgid "  (use \"git rebase --skip\" to skip this patch)"
-msgstr "  (benutzen Sie \"git rebase --skip\", um diesen Patch auszulassen)"
+#: sequencer.c:833
+msgid "empty commit set passed"
+msgstr "leere Menge von Commits übergeben"
 
-#: wt-status.c:1175
-msgid "  (use \"git rebase --abort\" to check out the original branch)"
-msgstr ""
-"  (benutzen Sie \"git rebase --abort\", um den ursprünglichen Branch "
-"auszuchecken)"
+#: sequencer.c:843
+#, c-format
+msgid "git %s: failed to read the index"
+msgstr "git %s: Fehler beim Lesen des Index"
 
-#: wt-status.c:1181
-msgid "  (all conflicts fixed: run \"git rebase --continue\")"
-msgstr "  (alle Konflikte behoben: führen Sie \"git rebase --continue\" aus)"
+#: sequencer.c:850
+#, c-format
+msgid "git %s: failed to refresh the index"
+msgstr "git %s: Fehler beim Aktualisieren des Index"
 
-#: wt-status.c:1185
+#: sequencer.c:944
 #, c-format
-msgid ""
-"You are currently splitting a commit while rebasing branch '%s' on '%s'."
-msgstr ""
-"Sie teilen gerade einen Commit auf, während ein Rebase von Branch '%s' auf "
-"'%s' im Gange ist."
+msgid "invalid line %d: %.*s"
+msgstr "Ungültige Zeile %d: %.*s"
 
-#: wt-status.c:1190
-msgid "You are currently splitting a commit during a rebase."
-msgstr "Sie teilen gerade einen Commit während eines Rebase auf."
+#: sequencer.c:950
+msgid "no commits parsed."
+msgstr "Keine Commits geparst."
 
-#: wt-status.c:1193
-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)"
+#: sequencer.c:966
+#, c-format
+msgid "could not read '%s'."
+msgstr "Konnte '%s' nicht lesen."
 
-#: wt-status.c:1197
+#: sequencer.c:972
 #, c-format
-msgid "You are currently editing a commit while rebasing branch '%s' on '%s'."
-msgstr ""
-"Sie editieren gerade einen Commit während eines Rebase von Branch '%s' auf "
-"'%s'."
+msgid "unusable instruction sheet: '%s'"
+msgstr "Unbenutzbares Instruktionsblatt: '%s'"
 
-#: wt-status.c:1202
-msgid "You are currently editing a commit during a rebase."
-msgstr "Sie editieren gerade einen Commit während eines Rebase."
+#: sequencer.c:983
+msgid "cannot cherry-pick during a revert."
+msgstr "Kann Cherry-Pick nicht während eines Reverts ausführen."
 
-#: wt-status.c:1205
-msgid "  (use \"git commit --amend\" to amend the current commit)"
-msgstr ""
-"  (benutzen Sie \"git commit --amend\", um den aktuellen Commit "
-"nachzubessern)"
+#: sequencer.c:985
+msgid "cannot revert during a cherry-pick."
+msgstr "Kann Revert nicht während eines Cherry-Picks ausführen."
 
-#: wt-status.c:1207
-msgid ""
-"  (use \"git rebase --continue\" once you are satisfied with your changes)"
-msgstr ""
-"  (benutzen Sie \"git rebase --continue\" sobald Ihre Änderungen "
-"abgeschlossen sind)"
+#: sequencer.c:1028
+#, c-format
+msgid "invalid key: %s"
+msgstr "Ungültiger Schlüssel: %s"
 
-#: wt-status.c:1217
+#: sequencer.c:1031
 #, c-format
-msgid "You are currently cherry-picking commit %s."
-msgstr "Sie führen gerade \"cherry-pick\" von Commit %s aus."
+msgid "invalid value for %s: %s"
+msgstr "Ungültiger Wert für %s: %s"
 
-#: wt-status.c:1222
-msgid "  (fix conflicts and run \"git cherry-pick --continue\")"
-msgstr ""
-"  (beheben Sie die Konflikte und führen Sie dann \"git cherry-pick --continue"
-"\" aus)"
+#: sequencer.c:1063
+#, c-format
+msgid "malformed options sheet: '%s'"
+msgstr "Fehlerhaftes Optionsblatt: '%s'"
 
-#: wt-status.c:1225
-msgid "  (all conflicts fixed: run \"git cherry-pick --continue\")"
-msgstr ""
-"  (alle Konflikte behoben: führen Sie \"git cherry-pick --continue\" aus)"
+#: sequencer.c:1101
+msgid "a cherry-pick or revert is already in progress"
+msgstr "\"cherry-pick\" oder \"revert\" ist bereits im Gang"
 
-#: wt-status.c:1227
-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)"
+#: sequencer.c:1102
+msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
+msgstr "versuchen Sie \"git cherry-pick (--continue | --quit | --abort)\""
 
-#: wt-status.c:1236
+#: sequencer.c:1106
 #, c-format
-msgid "You are currently reverting commit %s."
-msgstr "Sie sind gerade an einem Revert von Commit '%s'."
+msgid "could not create sequencer directory '%s'"
+msgstr "Konnte \"sequencer\"-Verzeichnis '%s' nicht erstellen."
 
-#: wt-status.c:1241
-msgid "  (fix conflicts and run \"git revert --continue\")"
-msgstr ""
-"  (beheben Sie die Konflikte und führen Sie dann \"git revert --continue\" "
-"aus)"
+#: sequencer.c:1120
+msgid "could not lock HEAD"
+msgstr "Konnte HEAD nicht sperren"
 
-#: wt-status.c:1244
-msgid "  (all conflicts fixed: run \"git revert --continue\")"
-msgstr "  (alle Konflikte behoben: führen Sie \"git revert --continue\" aus)"
+#: sequencer.c:1151 sequencer.c:1289
+msgid "no cherry-pick or revert in progress"
+msgstr "kein \"cherry-pick\" oder \"revert\" im Gang"
 
-#: wt-status.c:1246
-msgid "  (use \"git revert --abort\" to cancel the revert operation)"
-msgstr ""
-"  (benutzen Sie \"git revert --abort\", um die Revert-Operation abzubrechen)"
+#: sequencer.c:1153
+msgid "cannot resolve HEAD"
+msgstr "kann HEAD nicht auflösen"
 
-#: wt-status.c:1257
+#: sequencer.c:1155 sequencer.c:1189
+msgid "cannot abort from a branch yet to be born"
+msgstr "kann nicht abbrechen: bin auf einem Branch, der noch geboren wird"
+
+#: sequencer.c:1175 builtin/grep.c:578
 #, c-format
-msgid "You are currently bisecting, started from branch '%s'."
-msgstr "Sie sind gerade bei einer binären Suche, gestartet von Branch '%s'."
+msgid "cannot open '%s'"
+msgstr "kann '%s' nicht öffnen"
 
-#: wt-status.c:1261
-msgid "You are currently bisecting."
-msgstr "Sie sind gerade bei einer binären Suche."
+#: sequencer.c:1177
+#, c-format
+msgid "cannot read '%s': %s"
+msgstr "Kann '%s' nicht lesen: %s"
 
-#: wt-status.c:1264
-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)"
+#: sequencer.c:1178
+msgid "unexpected end of file"
+msgstr "Unerwartetes Dateiende"
 
-#: wt-status.c:1464
-msgid "On branch "
-msgstr "Auf Branch "
+#: sequencer.c:1184
+#, c-format
+msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
+msgstr "gespeicherte \"pre-cherry-pick\" HEAD Datei '%s' ist beschädigt"
 
-#: wt-status.c:1470
-msgid "interactive rebase in progress; onto "
-msgstr "interaktives Rebase im Gange; auf "
+#: sequencer.c:1354
+#, c-format
+msgid "%s: can't cherry-pick a %s"
+msgstr "%s: %s kann nicht in \"cherry-pick\" benutzt werden"
 
-#: wt-status.c:1472
-msgid "rebase in progress; onto "
-msgstr "Rebase im Gange; auf "
+#: sequencer.c:1358
+#, c-format
+msgid "%s: bad revision"
+msgstr "%s: ungültiger Commit"
 
-#: wt-status.c:1477
-msgid "HEAD detached at "
-msgstr "HEAD losgelöst bei "
+#: sequencer.c:1391
+msgid "can't revert as initial commit"
+msgstr "Kann nicht als allerersten Commit einen Revert ausführen."
 
-#: wt-status.c:1479
-msgid "HEAD detached from "
-msgstr "HEAD losgelöst von "
+#: setup.c:160
+#, c-format
+msgid ""
+"%s: no such path in the working tree.\n"
+"Use 'git <command> -- <path>...' to specify paths that do not exist locally."
+msgstr ""
+"%s: kein solcher Pfad im Arbeitsverzeichnis.\n"
+"Benutzen Sie 'git <Befehl> -- <Pfad>...' zur Angabe von Pfaden, die lokal\n"
+"nicht existieren."
 
-#: wt-status.c:1482
-msgid "Not currently on any branch."
-msgstr "Im Moment auf keinem Branch."
+#: setup.c:173
+#, c-format
+msgid ""
+"ambiguous argument '%s': unknown revision or path not in the working tree.\n"
+"Use '--' to separate paths from revisions, like this:\n"
+"'git <command> [<revision>...] -- [<file>...]'"
+msgstr ""
+"mehrdeutiges Argument '%s': unbekannter Commit oder Pfad existiert nicht\n"
+"im Arbeitsverzeichnis\n"
+"Benutzen Sie '--', um Pfade und Commits zu trennen, ähnlich wie:\n"
+"'git <Befehl> [<Commit>...] -- [<Datei>...]'"
 
-#: wt-status.c:1500
-msgid "Initial commit"
-msgstr "Initialer Commit"
+#: setup.c:223
+#, c-format
+msgid ""
+"ambiguous argument '%s': both revision and filename\n"
+"Use '--' to separate paths from revisions, like this:\n"
+"'git <command> [<revision>...] -- [<file>...]'"
+msgstr ""
+"mehrdeutiges Argument '%s': sowohl Commit als auch Dateiname\n"
+"Benutzen Sie '--', um Pfade und Commits zu trennen, ähnlich wie:\n"
+"'git <Befehl> [<Commit>...] -- [<Datei>...]'"
 
-#: wt-status.c:1514
-msgid "Untracked files"
-msgstr "Unversionierte Dateien"
+#: setup.c:468
+#, c-format
+msgid "Expected git repo version <= %d, found %d"
+msgstr "Erwartete Git-Repository-Version <= %d, %d gefunden"
 
-#: wt-status.c:1516
-msgid "Ignored files"
-msgstr "Ignorierte Dateien"
+#: setup.c:476
+msgid "unknown repository extensions found:"
+msgstr "Unbekannte Repository-Erweiterungen gefunden:"
+
+#: setup.c:762
+#, c-format
+msgid "Not a git repository (or any of the parent directories): %s"
+msgstr "Kein Git-Repository (oder irgendein Elternverzeichnis): %s"
+
+#: setup.c:764 setup.c:915 builtin/index-pack.c:1641
+msgid "Cannot come back to cwd"
+msgstr "Kann nicht zurück zu Arbeitsverzeichnis wechseln"
+
+#: setup.c:845
+msgid "Unable to read current working directory"
+msgstr "Konnte aktuelles Arbeitsverzeichnis nicht lesen."
+
+#: setup.c:920
+#, c-format
+msgid ""
+"Not a git repository (or any parent up to mount point %s)\n"
+"Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set)."
+msgstr ""
+"Kein Git-Repository (oder irgendein Elternverzeichnis bis zum Einhängepunkt "
+"%s)\n"
+"Stoppe bei Dateisystemgrenze (GIT_DISCOVERY_ACROSS_FILESYSTEM nicht gesetzt)."
+
+#: setup.c:927
+#, c-format
+msgid "Cannot change to '%s/..'"
+msgstr "Kann nicht in Verzeichnis '%s/..' wechseln"
+
+#: setup.c:989
+#, c-format
+msgid ""
+"Problem with core.sharedRepository filemode value (0%.3o).\n"
+"The owner of files must always have read and write permissions."
+msgstr ""
+"Problem mit Wert für Dateimodus (0%.3o) von core.sharedRepository.\n"
+"Der Besitzer der Dateien muss immer Lese- und Schreibrechte haben."
+
+#: sha1_file.c:473
+#, c-format
+msgid "path '%s' does not exist"
+msgstr "Pfad '%s' existiert nicht"
+
+#: sha1_file.c:499
+#, c-format
+msgid "reference repository '%s' as a linked checkout is not supported yet."
+msgstr ""
+"Referenziertes Repository '%s' wird noch nicht als verknüpftes\n"
+"Arbeitsverzeichnis unterstützt."
+
+#: sha1_file.c:505
+#, c-format
+msgid "reference repository '%s' is not a local repository."
+msgstr "Referenziertes Repository '%s' ist kein lokales Repository."
+
+#: sha1_file.c:511
+#, c-format
+msgid "reference repository '%s' is shallow"
+msgstr ""
+"Referenziertes Repository '%s' hat eine unvollständige Historie (shallow)."
+
+#: sha1_file.c:519
+#, c-format
+msgid "reference repository '%s' is grafted"
+msgstr ""
+"Referenziertes Repository '%s' ist mit künstlichen Vorgängern (\"grafts\") "
+"eingehängt."
+
+#: sha1_file.c:1159
+msgid "offset before end of packfile (broken .idx?)"
+msgstr "Offset vor Ende der Packdatei (fehlerhafte Indexdatei?)"
+
+#: sha1_file.c:2592
+#, c-format
+msgid "offset before start of pack index for %s (corrupt index?)"
+msgstr "Offset vor Beginn des Pack-Index für %s (beschädigter Index?)"
+
+#: sha1_file.c:2596
+#, c-format
+msgid "offset beyond end of pack index for %s (truncated index?)"
+msgstr "Offset hinter Ende des Pack-Index für %s (abgeschnittener Index?)"
+
+#: sha1_name.c:407
+#, c-format
+msgid "short SHA1 %s is ambiguous"
+msgstr "Kurzer SHA-1 %s ist mehrdeutig."
+
+#: sha1_name.c:418
+msgid "The candidates are:"
+msgstr "Die Kandidaten sind:"
+
+#: sha1_name.c:578
+msgid ""
+"Git normally never creates a ref that ends with 40 hex characters\n"
+"because it will be ignored when you just specify 40-hex. These refs\n"
+"may be created by mistake. For example,\n"
+"\n"
+"  git checkout -b $br $(git rev-parse ...)\n"
+"\n"
+"where \"$br\" is somehow empty and a 40-hex ref is created. Please\n"
+"examine these refs and maybe delete them. Turn this message off by\n"
+"running \"git config advice.objectNameWarning false\""
+msgstr ""
+"Git erzeugt normalerweise keine Referenzen die mit\n"
+"40 Hex-Zeichen enden, da diese ignoriert werden wenn\n"
+"Sie diese angeben. Diese Referenzen könnten aus Versehen\n"
+"erzeugt worden sein. Zum Beispiel,\n"
+"\n"
+"  git checkout -b $br $(git rev-parse ...)\n"
+"\n"
+"wobei \"$br\" leer ist und eine 40-Hex-Referenz erzeugt\n"
+"wurde. Bitte prüfen Sie diese Referenzen und löschen\n"
+"Sie sie gegebenenfalls. Unterdrücken Sie diese Meldung\n"
+"indem Sie \"git config advice.objectNameWarning false\"\n"
+"ausführen."
+
+#: submodule.c:64 submodule.c:98
+msgid "Cannot change unmerged .gitmodules, resolve merge conflicts first"
+msgstr ""
+"Kann nicht zusammengeführte .gitmodules-Datei nicht ändern, lösen\n"
+"Sie zuerst die Konflikte auf"
+
+#: submodule.c:68 submodule.c:102
+#, c-format
+msgid "Could not find section in .gitmodules where path=%s"
+msgstr "Konnte keine Sektion in .gitmodules mit Pfad \"%s\" finden"
+
+#: submodule.c:76
+#, c-format
+msgid "Could not update .gitmodules entry %s"
+msgstr "Konnte Eintrag '%s' in .gitmodules nicht aktualisieren"
+
+#: submodule.c:109
+#, c-format
+msgid "Could not remove .gitmodules entry for %s"
+msgstr "Konnte Eintrag '%s' nicht aus .gitmodules entfernen"
+
+#: submodule.c:120
+msgid "staging updated .gitmodules failed"
+msgstr "Konnte aktualisierte .gitmodules-Datei nicht zum Commit vormerken"
+
+#: submodule.c:158
+msgid "negative values not allowed for submodule.fetchJobs"
+msgstr "Negative Werte für submodule.fetchJobs nicht erlaubt"
+
+#: submodule-config.c:358
+#, c-format
+msgid "invalid value for %s"
+msgstr "Ungültiger Wert für %s"
+
+#: trailer.c:238
+#, c-format
+msgid "running trailer command '%s' failed"
+msgstr "Ausführen des Anhang-Befehls '%s' fehlgeschlagen"
+
+#: trailer.c:471 trailer.c:475 trailer.c:479 trailer.c:533 trailer.c:537
+#: trailer.c:541
+#, c-format
+msgid "unknown value '%s' for key '%s'"
+msgstr "unbekannter Wert '%s' für Schlüssel %s"
+
+#: trailer.c:523 trailer.c:528 builtin/remote.c:289
+#, c-format
+msgid "more than one %s"
+msgstr "mehr als ein %s"
+
+#: trailer.c:672
+#, c-format
+msgid "empty trailer token in trailer '%.*s'"
+msgstr "leerer Anhang-Token in Anhang '%.*s'"
+
+#: trailer.c:695
+#, c-format
+msgid "could not read input file '%s'"
+msgstr "Konnte Eingabe-Datei '%s' nicht lesen"
+
+#: trailer.c:698
+msgid "could not read from stdin"
+msgstr "konnte nicht von der Standard-Eingabe lesen"
+
+#: trailer.c:929 builtin/am.c:44
+#, c-format
+msgid "could not stat %s"
+msgstr "Konnte '%s' nicht lesen"
+
+#: trailer.c:931
+#, c-format
+msgid "file %s is not a regular file"
+msgstr "Datei '%s' ist keine reguläre Datei"
+
+#: trailer.c:933
+#, c-format
+msgid "file %s is not writable by user"
+msgstr "Datei %s ist vom Benutzer nicht beschreibbar."
+
+#: trailer.c:945
+msgid "could not open temporary file"
+msgstr "konnte temporäre Datei '%s' nicht öffnen"
+
+#: trailer.c:983
+#, c-format
+msgid "could not rename temporary file to %s"
+msgstr "konnte temporäre Datei nicht zu %s umbenennen"
+
+#: transport.c:62
+#, c-format
+msgid "Would set upstream of '%s' to '%s' of '%s'\n"
+msgstr "Würde Upstream-Branch von '%s' zu '%s' von '%s' setzen\n"
+
+#: transport.c:151
+#, c-format
+msgid "transport: invalid depth option '%s'"
+msgstr "transport: ungültige --depth Option '%s'"
+
+#: transport.c:817
+#, c-format
+msgid ""
+"The following submodule paths contain changes that can\n"
+"not be found on any remote:\n"
+msgstr ""
+"Die folgenden Submodul-Pfade enthalten Änderungen, die in keinem\n"
+"Remote-Repository gefunden wurden:\n"
+
+#: transport.c:821
+#, c-format
+msgid ""
+"\n"
+"Please try\n"
+"\n"
+"\tgit push --recurse-submodules=on-demand\n"
+"\n"
+"or cd to the path and use\n"
+"\n"
+"\tgit push\n"
+"\n"
+"to push them to a remote.\n"
+"\n"
+msgstr ""
+"\n"
+"Bitte versuchen Sie\n"
+"\n"
+"\tgit push --recurse-submodules=on-demand\n"
+"\n"
+"oder wechseln Sie in das Verzeichnis und benutzen Sie\n"
+"\n"
+"\tgit push\n"
+"\n"
+"zum Versenden zu einem Remote-Repository.\n"
+"\n"
+
+#: transport.c:829
+msgid "Aborting."
+msgstr "Abbruch."
+
+#: transport-helper.c:1075
+#, c-format
+msgid "Could not read ref %s"
+msgstr "Konnte Referenz %s nicht lesen."
+
+#: tree-walk.c:31
+msgid "too-short tree object"
+msgstr "zu kurzes Tree-Objekt"
+
+#: tree-walk.c:37
+msgid "malformed mode in tree entry"
+msgstr "fehlerhafter Modus in Tree-Eintrag"
+
+#: tree-walk.c:41
+msgid "empty filename in tree entry"
+msgstr "leerer Dateiname in Tree-Eintrag"
+
+#: tree-walk.c:113
+msgid "too-short tree file"
+msgstr "zu kurze Tree-Datei"
+
+#: unpack-trees.c:64
+#, c-format
+msgid ""
+"Your local changes to the following files would be overwritten by checkout:\n"
+"%%sPlease commit your changes or stash them before you switch branches."
+msgstr ""
+"Ihre lokalen Änderungen in den folgenden Dateien würden beim Auschecken\n"
+"überschrieben werden:\n"
+"%%sBitte committen oder stashen Sie Ihre Änderungen, bevor Sie Branches\n"
+"wechseln."
+
+#: unpack-trees.c:66
+#, c-format
+msgid ""
+"Your local changes to the following files would be overwritten by checkout:\n"
+"%%s"
+msgstr ""
+"Ihre lokalen Änderungen in den folgenden Dateien würden beim Auschecken\n"
+"überschrieben werden:\n"
+"%%s"
+
+#: unpack-trees.c:69
+#, c-format
+msgid ""
+"Your local changes to the following files would be overwritten by merge:\n"
+"%%sPlease commit your changes or stash them before you merge."
+msgstr ""
+"Ihre lokalen Änderungen in den folgenden Dateien würden durch den Merge\n"
+"überschrieben werden:\n"
+"%%sBitte committen oder stashen Sie Ihre Änderungen, bevor sie mergen."
+
+#: unpack-trees.c:71
+#, c-format
+msgid ""
+"Your local changes to the following files would be overwritten by merge:\n"
+"%%s"
+msgstr ""
+"Ihre lokalen Änderungen in den folgenden Dateien würden durch den Merge\n"
+"überschrieben werden:\n"
+"%%s"
+
+#: unpack-trees.c:74
+#, c-format
+msgid ""
+"Your local changes to the following files would be overwritten by %s:\n"
+"%%sPlease commit your changes or stash them before you %s."
+msgstr ""
+"Ihre lokalen Änderungen in den folgenden Dateien würden durch %s\n"
+"überschrieben werden:\n"
+"%%sBitte committen oder stashen Sie Ihre Änderungen, bevor Sie %s ausführen."
+
+#: unpack-trees.c:76
+#, c-format
+msgid ""
+"Your local changes to the following files would be overwritten by %s:\n"
+"%%s"
+msgstr ""
+"Ihre lokalen Änderungen würden durch %s überschrieben werden.\n"
+"%%s"
+
+#: unpack-trees.c:81
+#, c-format
+msgid ""
+"Updating the following directories would lose untracked files in it:\n"
+"%s"
+msgstr ""
+"Durch die Aktualisierung der folgenden Verzeichnisse würden unversionierte\n"
+"Dateien in diesen Verzeichnissen verloren gehen:\n"
+"%s"
+
+#: unpack-trees.c:85
+#, c-format
+msgid ""
+"The following untracked working tree files would be removed by checkout:\n"
+"%%sPlease move or remove them before you switch branches."
+msgstr ""
+"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch\n"
+"den Checkout entfernt werden:\n"
+"%%sBitte verschieben oder entfernen Sie diese, bevor Sie Branches wechseln."
+
+#: unpack-trees.c:87
+#, c-format
+msgid ""
+"The following untracked working tree files would be removed by checkout:\n"
+"%%s"
+msgstr ""
+"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch "
+"den\n"
+"Checkout entfernt werden:\n"
+"%%s"
+
+#: unpack-trees.c:90
+#, c-format
+msgid ""
+"The following untracked working tree files would be removed by merge:\n"
+"%%sPlease move or remove them before you merge."
+msgstr ""
+"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch\n"
+"den Merge entfernt werden:\n"
+"%%sBitte verschieben oder entfernen Sie diese, bevor sie mergen."
+
+#: unpack-trees.c:92
+#, c-format
+msgid ""
+"The following untracked working tree files would be removed by merge:\n"
+"%%s"
+msgstr ""
+"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch "
+"den\n"
+"Merge entfernt werden:\n"
+"%%s"
+
+#: unpack-trees.c:95
+#, c-format
+msgid ""
+"The following untracked working tree files would be removed by %s:\n"
+"%%sPlease move or remove them before you %s."
+msgstr ""
+"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch\n"
+"den %s entfernt werden:\n"
+"%%sBitte verschieben oder entfernen Sie diese, bevor sie %s ausführen."
+
+#: unpack-trees.c:97
+#, c-format
+msgid ""
+"The following untracked working tree files would be removed by %s:\n"
+"%%s"
+msgstr ""
+"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch\n"
+"den %s entfernt werden:\n"
+"%%s"
+
+#: unpack-trees.c:102
+#, c-format
+msgid ""
+"The following untracked working tree files would be overwritten by "
+"checkout:\n"
+"%%sPlease move or remove them before you switch branches."
+msgstr ""
+"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch\n"
+"den Checkout überschrieben werden:\n"
+"%%sBitte verschieben oder entfernen Sie diese, bevor Sie Branches wechseln."
+
+#: unpack-trees.c:104
+#, c-format
+msgid ""
+"The following untracked working tree files would be overwritten by "
+"checkout:\n"
+"%%s"
+msgstr ""
+"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch "
+"den\n"
+"Checkout überschrieben werden:\n"
+"%%s"
+
+#: unpack-trees.c:107
+#, c-format
+msgid ""
+"The following untracked working tree files would be overwritten by merge:\n"
+"%%sPlease move or remove them before you merge."
+msgstr ""
+"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch\n"
+"den Merge überschrieben werden:\n"
+"%%sBitte verschieben oder entfernen Sie diese, bevor Sie mergen."
 
-#: wt-status.c:1520
+#: unpack-trees.c:109
 #, c-format
 msgid ""
-"It took %.2f seconds to enumerate untracked files. 'status -uno'\n"
-"may speed it up, but you have to be careful not to forget to add\n"
-"new files yourself (see 'git help status')."
+"The following untracked working tree files would be overwritten by merge:\n"
+"%%s"
 msgstr ""
-"Es dauerte %.2f Sekunden die unversionierten Dateien zu bestimmen.\n"
-"'status -uno' könnte das beschleunigen, aber Sie müssen darauf achten,\n"
-"neue Dateien selbstständig hinzuzufügen (siehe 'git help status')."
+"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch\n"
+"den Merge überschrieben werden:\n"
+"%%s"
 
-#: wt-status.c:1526
+#: unpack-trees.c:112
 #, c-format
-msgid "Untracked files not listed%s"
-msgstr "Unversionierte Dateien nicht aufgelistet%s"
-
-#: wt-status.c:1528
-msgid " (use -u option to show untracked files)"
-msgstr " (benutzen Sie die Option -u, um unversionierte Dateien anzuzeigen)"
-
-#: wt-status.c:1534
-msgid "No changes"
-msgstr "Keine Änderungen"
+msgid ""
+"The following untracked working tree files would be overwritten by %s:\n"
+"%%sPlease move or remove them before you %s."
+msgstr ""
+"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch\n"
+"den %s überschrieben werden:\n"
+"%%sBitte verschieben oder entfernen Sie diese, bevor sie %s ausführen."
 
-#: wt-status.c:1539
+#: unpack-trees.c:114
 #, c-format
-msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n"
+msgid ""
+"The following untracked working tree files would be overwritten by %s:\n"
+"%%s"
 msgstr ""
-"keine Änderungen zum Commit vorgemerkt (benutzen Sie \"git add\" und/oder "
-"\"git commit -a\")\n"
+"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch "
+"den\n"
+"%s überschrieben werden:\n"
+"%%s"
 
-#: wt-status.c:1542
+#: unpack-trees.c:121
 #, c-format
-msgid "no changes added to commit\n"
-msgstr "keine Änderungen zum Commit vorgemerkt\n"
+msgid "Entry '%s' overlaps with '%s'.  Cannot bind."
+msgstr "Eintrag '%s' überschneidet sich mit '%s'. Kann nicht verbinden."
 
-#: wt-status.c:1545
+#: unpack-trees.c:124
 #, c-format
 msgid ""
-"nothing added to commit but untracked files present (use \"git add\" to "
-"track)\n"
+"Cannot update sparse checkout: the following entries are not up-to-date:\n"
+"%s"
 msgstr ""
-"nichts zum Commit vorgemerkt, aber es gibt unversionierte Dateien (benutzen "
-"Sie \"git add\" zum Versionieren)\n"
+"Kann partiellen Checkout nicht aktualisieren: die folgenden Einträge sind "
+"nicht\n"
+"aktuell:\n"
+"%s"
 
-#: wt-status.c:1548
+#: unpack-trees.c:126
 #, c-format
-msgid "nothing added to commit but untracked files present\n"
-msgstr "nichts zum Commit vorgemerkt, aber es gibt unversionierte Dateien\n"
+msgid ""
+"The following working tree files would be overwritten by sparse checkout "
+"update:\n"
+"%s"
+msgstr ""
+"Die folgenden Dateien im Arbeitsverzeichnis würden durch die Aktualisierung\n"
+"über einen partiellen Checkout überschrieben werden:\n"
+"%s"
 
-#: wt-status.c:1551
+#: unpack-trees.c:128
 #, c-format
-msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
+msgid ""
+"The following working tree files would be removed by sparse checkout "
+"update:\n"
+"%s"
 msgstr ""
-"nichts zu committen (Erstellen/Kopieren Sie Dateien und benutzen Sie \"git "
-"add\" zum Versionieren)\n"
+"Die folgenden Dateien im Arbeitsverzeichnis würden durch die Aktualisierung\n"
+"über einen partiellen Checkout entfernt werden:\n"
+"%s"
 
-#: wt-status.c:1554 wt-status.c:1559
+#: unpack-trees.c:205
 #, c-format
-msgid "nothing to commit\n"
-msgstr "nichts zu committen\n"
+msgid "Aborting\n"
+msgstr "Abbruch\n"
 
-#: wt-status.c:1557
-#, c-format
-msgid "nothing to commit (use -u to show untracked files)\n"
-msgstr ""
-"nichts zu committen (benutzen Sie die Option -u, um unversionierte Dateien "
-"anzuzeigen)\n"
+#: unpack-trees.c:237
+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"
 
-#: wt-status.c:1561
+#: urlmatch.c:144 urlmatch.c:297 urlmatch.c:356
 #, c-format
-msgid "nothing to commit, working tree clean\n"
-msgstr "nichts zu committen, Arbeitsverzeichnis unverändert\n"
+msgid "invalid %XX escape sequence"
+msgstr "ungültige Escape-Sequenz %XX"
 
-#: wt-status.c:1668
-msgid "Initial commit on "
-msgstr "Initialer Commit auf "
+#: urlmatch.c:172
+msgid "missing host and scheme is not 'file:'"
+msgstr "fehlender Host und Schema ist nicht 'file:'"
 
-#: wt-status.c:1672
-msgid "HEAD (no branch)"
-msgstr "HEAD (kein Branch)"
+#: urlmatch.c:189
+msgid "a 'file:' URL may not have a port number"
+msgstr "eine 'file:' URL darf keine Portnummer enthalten"
 
-#: wt-status.c:1701
-msgid "gone"
-msgstr "entfernt"
+#: urlmatch.c:199
+msgid "invalid characters in host name"
+msgstr "Hostname enthält ungültige Zeichen"
 
-#: wt-status.c:1703 wt-status.c:1711
-msgid "behind "
-msgstr "hinterher "
+#: urlmatch.c:244 urlmatch.c:255
+msgid "invalid port number"
+msgstr "ungültige Portnummer"
 
-#: wt-status.c:1706 wt-status.c:1709
-msgid "ahead "
-msgstr "voraus "
+#: urlmatch.c:322
+msgid "invalid '..' path segment"
+msgstr "ungültiges '..' Pfadsegment"
 
-#: compat/precompose_utf8.c:57 builtin/clone.c:415
+#: worktree.c:282
 #, c-format
-msgid "failed to unlink '%s'"
-msgstr "Konnte '%s' nicht entfernen."
-
-#: builtin/add.c:22
-msgid "git add [<options>] [--] <pathspec>..."
-msgstr "git add [<Optionen>] [--] <Pfadspezifikation>..."
+msgid "failed to read '%s'"
+msgstr "Fehler beim Lesen von '%s'"
 
-#: builtin/add.c:65
+#: wrapper.c:222 wrapper.c:392
 #, c-format
-msgid "unexpected diff status %c"
-msgstr "unerwarteter Differenz-Status %c"
-
-#: builtin/add.c:71 builtin/commit.c:281
-msgid "updating files failed"
-msgstr "Aktualisierung der Dateien fehlgeschlagen"
+msgid "could not open '%s' for reading and writing"
+msgstr "Konnte '%s' nicht zum Lesen und Schreiben öffnen."
 
-#: builtin/add.c:81
+#: wrapper.c:224 wrapper.c:394 builtin/am.c:766
 #, c-format
-msgid "remove '%s'\n"
-msgstr "lösche '%s'\n"
-
-#: builtin/add.c:136
-msgid "Unstaged changes after refreshing the index:"
-msgstr ""
-"Nicht zum Commit vorgemerkte Änderungen nach Aktualisierung der Staging-Area:"
+msgid "could not open '%s' for writing"
+msgstr "Konnte '%s' nicht zum Schreiben öffnen."
 
-#: builtin/add.c:196 builtin/rev-parse.c:811
-msgid "Could not read the index"
-msgstr "Konnte den Index nicht lesen"
+#: wrapper.c:226 wrapper.c:396 builtin/am.c:320 builtin/am.c:759
+#: builtin/am.c:847 builtin/commit.c:1705 builtin/merge.c:1029
+#: builtin/pull.c:341
+#, c-format
+msgid "could not open '%s' for reading"
+msgstr "Konnte '%s' nicht zum Lesen öffnen."
 
-#: builtin/add.c:207
+#: wrapper.c:605 wrapper.c:626
 #, c-format
-msgid "Could not open '%s' for writing."
-msgstr "Konnte '%s' nicht zum Schreiben öffnen."
+msgid "unable to access '%s'"
+msgstr "konnte nicht auf '%s' zugreifen"
 
-#: builtin/add.c:211
-msgid "Could not write patch"
-msgstr "Konnte Patch nicht schreiben"
+#: wrapper.c:634
+msgid "unable to get current working directory"
+msgstr "Konnte aktuelles Arbeitsverzeichnis nicht bekommen."
 
-#: builtin/add.c:214
-msgid "editing patch failed"
-msgstr "Bearbeitung des Patches fehlgeschlagen"
+#: wrapper.c:658
+#, c-format
+msgid "could not write to %s"
+msgstr "Konnte nicht nach '%s' schreiben."
 
-#: builtin/add.c:217
+#: wrapper.c:660
 #, c-format
-msgid "Could not stat '%s'"
-msgstr "Konnte Verzeichnis '%s' nicht lesen"
+msgid "could not close %s"
+msgstr "Konnte '%s' nicht schließen."
 
-#: builtin/add.c:219
-msgid "Empty patch. Aborted."
-msgstr "Leerer Patch. Abgebrochen."
+#: wt-status.c:151
+msgid "Unmerged paths:"
+msgstr "Nicht zusammengeführte Pfade:"
 
-#: builtin/add.c:224
+#: wt-status.c:178 wt-status.c:205
 #, c-format
-msgid "Could not apply '%s'"
-msgstr "Konnte '%s' nicht anwenden."
+msgid "  (use \"git reset %s <file>...\" to unstage)"
+msgstr ""
+"  (benutzen Sie \"git reset %s <Datei>...\" zum Entfernen aus der Staging-"
+"Area)"
 
-#: builtin/add.c:234
-msgid "The following paths are ignored by one of your .gitignore files:\n"
+#: wt-status.c:180 wt-status.c:207
+msgid "  (use \"git rm --cached <file>...\" to unstage)"
 msgstr ""
-"Die folgenden Pfade werden durch eine Ihrer \".gitignore\" Dateien "
-"ignoriert:\n"
+"  (benutzen Sie \"git rm --cached <Datei>...\" zum Entfernen aus der Staging-"
+"Area)"
 
-#: builtin/add.c:253 builtin/clean.c:870 builtin/fetch.c:113 builtin/mv.c:111
-#: builtin/prune-packed.c:55 builtin/pull.c:197 builtin/push.c:521
-#: builtin/remote.c:1327 builtin/rm.c:268 builtin/send-pack.c:162
-msgid "dry run"
-msgstr "Probelauf"
+#: wt-status.c:184
+msgid "  (use \"git add <file>...\" to mark resolution)"
+msgstr ""
+"  (benutzen Sie \"git add/rm <Datei>...\", um die Auflösung zu markieren)"
 
-#: builtin/add.c:254 builtin/apply.c:4854 builtin/check-ignore.c:19
-#: builtin/commit.c:1334 builtin/count-objects.c:85 builtin/fsck.c:593
-#: builtin/log.c:1852 builtin/mv.c:110 builtin/read-tree.c:114
-msgid "be verbose"
-msgstr "erweiterte Ausgaben"
+#: wt-status.c:186 wt-status.c:190
+msgid "  (use \"git add/rm <file>...\" as appropriate to mark resolution)"
+msgstr ""
+"  (benutzen Sie \"git add/rm <Datei>...\", um die Auflösung entsprechend zu "
+"markieren)"
 
-#: builtin/add.c:256
-msgid "interactive picking"
-msgstr "interaktives Auswählen"
+#: wt-status.c:188
+msgid "  (use \"git rm <file>...\" to mark resolution)"
+msgstr ""
+"  (benutzen Sie \"git add/rm <Datei>...\", um die Auflösung zu markieren)"
 
-#: builtin/add.c:257 builtin/checkout.c:1157 builtin/reset.c:286
-msgid "select hunks interactively"
-msgstr "Blöcke interaktiv auswählen"
+#: wt-status.c:199 wt-status.c:945
+msgid "Changes to be committed:"
+msgstr "zum Commit vorgemerkte Änderungen:"
 
-#: builtin/add.c:258
-msgid "edit current diff and apply"
-msgstr "aktuelle Unterschiede editieren und anwenden"
+#: wt-status.c:217 wt-status.c:954
+msgid "Changes not staged for commit:"
+msgstr "Änderungen, die nicht zum Commit vorgemerkt sind:"
 
-#: builtin/add.c:259
-msgid "allow adding otherwise ignored files"
-msgstr "das Hinzufügen andernfalls ignorierter Dateien erlauben"
+#: wt-status.c:221
+msgid "  (use \"git add <file>...\" to update what will be committed)"
+msgstr ""
+"  (benutzen Sie \"git add <Datei>...\", um die Änderungen zum Commit "
+"vorzumerken)"
 
-#: builtin/add.c:260
-msgid "update tracked files"
-msgstr "versionierte Dateien aktualisieren"
+#: wt-status.c:223
+msgid "  (use \"git add/rm <file>...\" to update what will be committed)"
+msgstr ""
+"  (benutzen Sie \"git add/rm <Datei>...\", um die Änderungen zum Commit "
+"vorzumerken)"
 
-#: builtin/add.c:261
-msgid "record only the fact that the path will be added later"
-msgstr "nur speichern, dass der Pfad später hinzugefügt werden soll"
+#: wt-status.c:224
+msgid ""
+"  (use \"git checkout -- <file>...\" to discard changes in working directory)"
+msgstr ""
+"  (benutzen Sie \"git checkout -- <Datei>...\", um die Änderungen im "
+"Arbeitsverzeichnis zu verwerfen)"
 
-#: builtin/add.c:262
-msgid "add changes from all tracked and untracked files"
+#: wt-status.c:226
+msgid "  (commit or discard the untracked or modified content in submodules)"
 msgstr ""
-"Änderungen von allen versionierten und unversionierten Dateien hinzufügen"
+"  (committen oder verwerfen Sie den unversionierten oder geänderten Inhalt "
+"in den Submodulen)"
 
-#: builtin/add.c:265
-msgid "ignore paths removed in the working tree (same as --no-all)"
-msgstr "gelöschte Pfade im Arbeitsverzeichnis ignorieren (genau wie --no-all)"
+#: wt-status.c:238
+#, c-format
+msgid "  (use \"git %s <file>...\" to include in what will be committed)"
+msgstr ""
+"  (benutzen Sie \"git %s <Datei>...\", um die Änderungen zum Commit "
+"vorzumerken)"
 
-#: builtin/add.c:267
-msgid "don't add, only refresh the index"
-msgstr "nichts hinzufügen, nur den Index aktualisieren"
+#: wt-status.c:253
+msgid "both deleted:"
+msgstr "beide gelöscht:"
+
+#: wt-status.c:255
+msgid "added by us:"
+msgstr "von uns hinzugefügt:"
 
-#: builtin/add.c:268
-msgid "just skip files which cannot be added because of errors"
-msgstr ""
-"Dateien überspringen, die aufgrund von Fehlern nicht hinzugefügt werden "
-"konnten"
+#: wt-status.c:257
+msgid "deleted by them:"
+msgstr "von denen gelöscht:"
 
-#: builtin/add.c:269
-msgid "check if - even missing - files are ignored in dry run"
-msgstr "prüfen ob - auch fehlende - Dateien im Probelauf ignoriert werden"
+#: wt-status.c:259
+msgid "added by them:"
+msgstr "von denen hinzugefügt:"
 
-#: builtin/add.c:270 builtin/update-index.c:958
-msgid "(+/-)x"
-msgstr "(+/-)x"
+#: wt-status.c:261
+msgid "deleted by us:"
+msgstr "von uns gelöscht:"
 
-#: builtin/add.c:270 builtin/update-index.c:959
-msgid "override the executable bit of the listed files"
-msgstr "das \"ausführbar\"-Bit der aufgelisteten Dateien überschreiben"
+#: wt-status.c:263
+msgid "both added:"
+msgstr "von beiden hinzugefügt:"
 
-#: builtin/add.c:292
-#, c-format
-msgid "Use -f if you really want to add them.\n"
-msgstr "Verwenden Sie -f wenn Sie diese wirklich hinzufügen möchten.\n"
+#: wt-status.c:265
+msgid "both modified:"
+msgstr "von beiden geändert:"
 
-#: builtin/add.c:300
-msgid "adding files failed"
-msgstr "Hinzufügen von Dateien fehlgeschlagen"
+#: wt-status.c:275
+msgid "new file:"
+msgstr "neue Datei:"
 
-#: builtin/add.c:336
-msgid "-A and -u are mutually incompatible"
-msgstr "Die Optionen -A und -u sind zueinander inkompatibel."
+#: wt-status.c:277
+msgid "copied:"
+msgstr "kopiert:"
 
-#: builtin/add.c:343
-msgid "Option --ignore-missing can only be used together with --dry-run"
-msgstr ""
-"Die Option --ignore-missing kann nur zusammen mit --dry-run verwendet werden."
+#: wt-status.c:279
+msgid "deleted:"
+msgstr "gelöscht:"
 
-#: builtin/add.c:352
-#, c-format
-msgid "--chmod param '%s' must be either -x or +x"
-msgstr "--chmod Parameter '%s' muss entweder -x oder +x sein"
+#: wt-status.c:281
+msgid "modified:"
+msgstr "geändert:"
 
-#: builtin/add.c:367
-#, c-format
-msgid "Nothing specified, nothing added.\n"
-msgstr "Nichts spezifiziert, nichts hinzugefügt.\n"
+#: wt-status.c:283
+msgid "renamed:"
+msgstr "umbenannt:"
 
-#: builtin/add.c:368
-#, c-format
-msgid "Maybe you wanted to say 'git add .'?\n"
-msgstr "Meinten Sie vielleicht 'git add .'?\n"
+#: wt-status.c:285
+msgid "typechange:"
+msgstr "Typänderung:"
 
-#: builtin/add.c:373 builtin/check-ignore.c:172 builtin/checkout.c:279
-#: builtin/checkout.c:473 builtin/clean.c:914 builtin/commit.c:340
-#: builtin/mv.c:131 builtin/reset.c:235 builtin/rm.c:298
-#: builtin/submodule--helper.c:240
-msgid "index file corrupt"
-msgstr "Index-Datei beschädigt"
+#: wt-status.c:287
+msgid "unknown:"
+msgstr "unbekannt:"
 
-#: builtin/add.c:454 builtin/apply.c:4784 builtin/mv.c:286 builtin/rm.c:431
-msgid "Unable to write new index file"
-msgstr "Konnte neue Index-Datei nicht schreiben."
+#: wt-status.c:289
+msgid "unmerged:"
+msgstr "nicht gemerged:"
 
-#: builtin/am.c:257 builtin/commit.c:750 builtin/merge.c:1032
-#, c-format
-msgid "could not read '%s'"
-msgstr "Konnte '%s' nicht lesen"
+#: wt-status.c:371
+msgid "new commits, "
+msgstr "neue Commits, "
 
-#: builtin/am.c:426
-msgid "could not parse author script"
-msgstr "konnte Autor-Skript nicht parsen"
+#: wt-status.c:373
+msgid "modified content, "
+msgstr "geänderter Inhalt, "
 
-#: builtin/am.c:503
-#, c-format
-msgid "'%s' was deleted by the applypatch-msg hook"
-msgstr "'%s' wurde durch den applypatch-msg Hook entfernt"
+#: wt-status.c:375
+msgid "untracked content, "
+msgstr "unversionierter Inhalt, "
 
-#: builtin/am.c:544 builtin/notes.c:301
-#, c-format
-msgid "Malformed input line: '%s'."
-msgstr "Fehlerhafte Eingabezeile: '%s'."
+#: wt-status.c:818
+msgid "Submodules changed but not updated:"
+msgstr "Submodule geändert, aber nicht aktualisiert:"
 
-#: builtin/am.c:581 builtin/notes.c:316
-#, c-format
-msgid "Failed to copy notes from '%s' to '%s'"
-msgstr "Fehler beim Kopieren der Notizen von '%s' nach '%s'"
+#: wt-status.c:820
+msgid "Submodule changes to be committed:"
+msgstr "Änderungen in Submodul zum Committen:"
 
-#: builtin/am.c:607
-msgid "fseek failed"
-msgstr "\"fseek\" fehlgeschlagen"
+#: wt-status.c:901
+msgid ""
+"Do not touch the line above.\n"
+"Everything below will be removed."
+msgstr ""
+"Ändern Sie nicht die obige Zeile.\n"
+"Alles unterhalb von ihr wird entfernt."
 
-#: builtin/am.c:787
-#, c-format
-msgid "could not parse patch '%s'"
-msgstr "konnte Patch '%s' nicht parsen"
+#: wt-status.c:1013
+msgid "You have unmerged paths."
+msgstr "Sie haben nicht zusammengeführte Pfade."
 
-#: builtin/am.c:852
-msgid "Only one StGIT patch series can be applied at once"
-msgstr "Es kann nur eine StGIT Patch-Serie auf einmal angewendet werden."
+#: wt-status.c:1016
+msgid "  (fix conflicts and run \"git commit\")"
+msgstr " (beheben Sie die Konflikte und führen Sie \"git commit\" aus)"
 
-#: builtin/am.c:899
-msgid "invalid timestamp"
-msgstr "ungültiger Zeitstempel"
+#: wt-status.c:1018
+msgid "  (use \"git merge --abort\" to abort the merge)"
+msgstr "  (benutzen Sie \"git merge --abort\", um den Merge abzubrechen)"
 
-#: builtin/am.c:902 builtin/am.c:910
-msgid "invalid Date line"
-msgstr "Ungültige \"Date\"-Zeile"
+#: wt-status.c:1023
+msgid "All conflicts fixed but you are still merging."
+msgstr "Alle Konflikte sind behoben, aber Sie sind immer noch beim Merge."
 
-#: builtin/am.c:907
-msgid "invalid timezone offset"
-msgstr "Ungültiger Offset in der Zeitzone"
+#: wt-status.c:1026
+msgid "  (use \"git commit\" to conclude merge)"
+msgstr "  (benutzen Sie \"git commit\", um den Merge abzuschließen)"
 
-#: builtin/am.c:996
-msgid "Patch format detection failed."
-msgstr "Patch-Formaterkennung fehlgeschlagen."
+#: wt-status.c:1036
+msgid "You are in the middle of an am session."
+msgstr "Eine \"am\"-Sitzung ist im Gange."
 
-#: builtin/am.c:1001 builtin/clone.c:380
-#, c-format
-msgid "failed to create directory '%s'"
-msgstr "Fehler beim Erstellen von Verzeichnis '%s'"
+#: wt-status.c:1039
+msgid "The current patch is empty."
+msgstr "Der aktuelle Patch ist leer."
 
-#: builtin/am.c:1005
-msgid "Failed to split patches."
-msgstr "Fehler beim Aufteilen der Patches."
+#: wt-status.c:1043
+msgid "  (fix conflicts and then run \"git am --continue\")"
+msgstr ""
+"  (beheben Sie die Konflikte und führen Sie dann \"git am --continue\" aus)"
 
-#: builtin/am.c:1137 builtin/commit.c:366
-msgid "unable to write index file"
-msgstr "Konnte Index-Datei nicht schreiben."
+#: wt-status.c:1045
+msgid "  (use \"git am --skip\" to skip this patch)"
+msgstr "  (benutzen Sie \"git am --skip\", um diesen Patch auszulassen)"
 
-#: builtin/am.c:1188
-#, c-format
-msgid "When you have resolved this problem, run \"%s --continue\"."
+#: wt-status.c:1047
+msgid "  (use \"git am --abort\" to restore the original branch)"
 msgstr ""
-"Wenn Sie das Problem aufgelöst haben, führen Sie \"%s --continue\" aus."
+"  (benutzen Sie \"git am --abort\", um den ursprünglichen Branch "
+"wiederherzustellen)"
+
+#: wt-status.c:1172
+msgid "No commands done."
+msgstr "Keine Befehle ausgeführt."
 
-#: builtin/am.c:1189
+#: wt-status.c:1175
 #, c-format
-msgid "If you prefer to skip this patch, run \"%s --skip\" instead."
-msgstr ""
-"Falls Sie diesen Patch auslassen möchten, führen Sie stattdessen \"%s --skip"
-"\" aus."
+msgid "Last command done (%d command done):"
+msgid_plural "Last commands done (%d commands done):"
+msgstr[0] "Zuletzt ausgeführter Befehl (%d Befehl ausgeführt):"
+msgstr[1] "Zuletzt ausgeführte Befehle (%d Befehle ausgeführt):"
 
-#: builtin/am.c:1190
+#: wt-status.c:1186
 #, c-format
-msgid "To restore the original branch and stop patching, run \"%s --abort\"."
-msgstr ""
-"Um den ursprünglichen Branch wiederherzustellen und die Anwendung der "
-"Patches abzubrechen, führen Sie \"%s --abort\" aus."
+msgid "  (see more in file %s)"
+msgstr "  (mehr Informationen in Datei %s)"
 
-#: builtin/am.c:1328
-msgid "Patch is empty. Was it split wrong?"
-msgstr "Patch ist leer. War dessen Aufteilung falsch?"
+#: wt-status.c:1191
+msgid "No commands remaining."
+msgstr "Keine Befehle verbleibend."
 
-#: builtin/am.c:1402 builtin/log.c:1543
+#: wt-status.c:1194
 #, c-format
-msgid "invalid ident line: %s"
-msgstr "Ungültige Identifikationszeile: %s"
+msgid "Next command to do (%d remaining command):"
+msgid_plural "Next commands to do (%d remaining commands):"
+msgstr[0] "Nächster auszuführender Befehl (%d Befehle verbleibend):"
+msgstr[1] "Nächste auszuführende Befehle (%d Befehle verbleibend):"
+
+#: wt-status.c:1202
+msgid "  (use \"git rebase --edit-todo\" to view and edit)"
+msgstr "  (benutzen Sie \"git rebase --edit-todo\" zum Ansehen und Bearbeiten)"
 
-#: builtin/am.c:1429
+#: wt-status.c:1215
 #, c-format
-msgid "unable to parse commit %s"
-msgstr "Konnte Commit '%s' nicht parsen."
+msgid "You are currently rebasing branch '%s' on '%s'."
+msgstr "Sie sind gerade beim Rebase von Branch '%s' auf '%s'."
 
-#: builtin/am.c:1602
-msgid "Repository lacks necessary blobs to fall back on 3-way merge."
-msgstr ""
-"Dem Repository fehlen notwendige Blobs um auf einen 3-Wege-Merge "
-"zurückzufallen."
+#: wt-status.c:1220
+msgid "You are currently rebasing."
+msgstr "Sie sind gerade beim Rebase."
 
-#: builtin/am.c:1604
-msgid "Using index info to reconstruct a base tree..."
+#: wt-status.c:1234
+msgid "  (fix conflicts and then run \"git rebase --continue\")"
 msgstr ""
-"Verwende Informationen aus der Staging-Area, um ein Basisverzeichnis "
-"nachzustellen ..."
+"  (beheben Sie die Konflikte und führen Sie dann \"git rebase --continue\" "
+"aus)"
 
-#: builtin/am.c:1623
-msgid ""
-"Did you hand edit your patch?\n"
-"It does not apply to blobs recorded in its index."
-msgstr ""
-"Haben Sie den Patch per Hand editiert?\n"
-"Er kann nicht auf die Blobs in seiner 'index' Zeile angewendet werden."
+#: wt-status.c:1236
+msgid "  (use \"git rebase --skip\" to skip this patch)"
+msgstr "  (benutzen Sie \"git rebase --skip\", um diesen Patch auszulassen)"
 
-#: builtin/am.c:1629
-msgid "Falling back to patching base and 3-way merge..."
-msgstr "Falle zurück zum Patchen der Basis und zum 3-Wege-Merge ..."
+#: wt-status.c:1238
+msgid "  (use \"git rebase --abort\" to check out the original branch)"
+msgstr ""
+"  (benutzen Sie \"git rebase --abort\", um den ursprünglichen Branch "
+"auszuchecken)"
 
-#: builtin/am.c:1654
-msgid "Failed to merge in the changes."
-msgstr "Merge der Änderungen fehlgeschlagen."
+#: wt-status.c:1244
+msgid "  (all conflicts fixed: run \"git rebase --continue\")"
+msgstr "  (alle Konflikte behoben: führen Sie \"git rebase --continue\" aus)"
 
-#: builtin/am.c:1679 builtin/merge.c:628
-msgid "git write-tree failed to write a tree"
-msgstr "\"git write-tree\" schlug beim Schreiben eines \"Tree\"-Objektes fehl"
+#: wt-status.c:1248
+#, c-format
+msgid ""
+"You are currently splitting a commit while rebasing branch '%s' on '%s'."
+msgstr ""
+"Sie teilen gerade einen Commit auf, während ein Rebase von Branch '%s' auf "
+"'%s' im Gange ist."
 
-#: builtin/am.c:1686
-msgid "applying to an empty history"
-msgstr "auf leere Historie anwenden"
+#: wt-status.c:1253
+msgid "You are currently splitting a commit during a rebase."
+msgstr "Sie teilen gerade einen Commit während eines Rebase auf."
 
-#: builtin/am.c:1699 builtin/commit.c:1776 builtin/merge.c:798
-#: builtin/merge.c:823
-msgid "failed to write commit object"
-msgstr "Fehler beim Schreiben des Commit-Objektes."
+#: wt-status.c:1256
+msgid "  (Once your working directory is clean, run \"git rebase --continue\")"
+msgstr ""
+"  (Sobald Ihr Arbeitsverzeichnis unverändert ist, führen Sie \"git rebase --"
+"continue\" aus)"
 
-#: builtin/am.c:1731 builtin/am.c:1735
+#: wt-status.c:1260
 #, c-format
-msgid "cannot resume: %s does not exist."
-msgstr "Kann nicht fortsetzen: %s existiert nicht"
-
-#: builtin/am.c:1751
-msgid "cannot be interactive without stdin connected to a terminal."
+msgid "You are currently editing a commit while rebasing branch '%s' on '%s'."
 msgstr ""
-"Kann nicht interaktiv sein, ohne dass die Standard-Eingabe mit einem "
-"Terminal verbunden ist."
+"Sie editieren gerade einen Commit während eines Rebase von Branch '%s' auf "
+"'%s'."
 
-#: builtin/am.c:1756
-msgid "Commit Body is:"
-msgstr "Commit-Beschreibung ist:"
+#: wt-status.c:1265
+msgid "You are currently editing a commit during a rebase."
+msgstr "Sie editieren gerade einen Commit während eines Rebase."
 
-#. TRANSLATORS: Make sure to include [y], [n], [e], [v] and [a]
-#. in your translation. The program will only accept English
-#. input at this point.
-#.
-#: builtin/am.c:1766
-msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all: "
-msgstr "Anwenden? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all: "
+#: wt-status.c:1268
+msgid "  (use \"git commit --amend\" to amend the current commit)"
+msgstr ""
+"  (benutzen Sie \"git commit --amend\", um den aktuellen Commit "
+"nachzubessern)"
 
-#: builtin/am.c:1816
-#, c-format
-msgid "Dirty index: cannot apply patches (dirty: %s)"
-msgstr "Geänderter Index: kann Patches nicht anwenden (geändert: %s)"
+#: wt-status.c:1270
+msgid ""
+"  (use \"git rebase --continue\" once you are satisfied with your changes)"
+msgstr ""
+"  (benutzen Sie \"git rebase --continue\" sobald Ihre Änderungen "
+"abgeschlossen sind)"
 
-#: builtin/am.c:1853 builtin/am.c:1925
+#: wt-status.c:1280
 #, c-format
-msgid "Applying: %.*s"
-msgstr "Wende an: %.*s"
+msgid "You are currently cherry-picking commit %s."
+msgstr "Sie führen gerade \"cherry-pick\" von Commit %s aus."
 
-#: builtin/am.c:1869
-msgid "No changes -- Patch already applied."
-msgstr "Keine Änderungen -- Patches bereits angewendet."
+#: wt-status.c:1285
+msgid "  (fix conflicts and run \"git cherry-pick --continue\")"
+msgstr ""
+"  (beheben Sie die Konflikte und führen Sie dann \"git cherry-pick --continue"
+"\" aus)"
 
-#: builtin/am.c:1877
-#, c-format
-msgid "Patch failed at %s %.*s"
-msgstr "Anwendung des Patches fehlgeschlagen bei %s %.*s"
+#: wt-status.c:1288
+msgid "  (all conflicts fixed: run \"git cherry-pick --continue\")"
+msgstr ""
+"  (alle Konflikte behoben: führen Sie \"git cherry-pick --continue\" aus)"
+
+#: wt-status.c:1290
+msgid "  (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)"
+msgstr ""
+"  (benutzen Sie \"git cherry-pick --abort\", um die Cherry-Pick-Operation "
+"abzubrechen)"
 
-#: builtin/am.c:1883
+#: wt-status.c:1299
 #, c-format
-msgid "The copy of the patch that failed is found in: %s"
-msgstr "Die Kopie des fehlgeschlagenen Patches befindet sich in: %s"
+msgid "You are currently reverting commit %s."
+msgstr "Sie sind gerade an einem Revert von Commit '%s'."
 
-#: builtin/am.c:1928
-msgid ""
-"No changes - did you forget to use 'git add'?\n"
-"If there is nothing left to stage, chances are that something else\n"
-"already introduced the same changes; you might want to skip this patch."
+#: wt-status.c:1304
+msgid "  (fix conflicts and run \"git revert --continue\")"
 msgstr ""
-"Keine Änderungen - haben Sie vergessen 'git add' zu benutzen?\n"
-"Wenn keine Änderungen mehr zum Commit vorzumerken sind, könnten\n"
-"diese bereits anderweitig eingefügt worden sein; Sie könnten diesen Patch\n"
-"auslassen."
+"  (beheben Sie die Konflikte und führen Sie dann \"git revert --continue\" "
+"aus)"
 
-#: builtin/am.c:1935
-msgid ""
-"You still have unmerged paths in your index.\n"
-"Did you forget to use 'git add'?"
+#: wt-status.c:1307
+msgid "  (all conflicts fixed: run \"git revert --continue\")"
+msgstr "  (alle Konflikte behoben: führen Sie \"git revert --continue\" aus)"
+
+#: wt-status.c:1309
+msgid "  (use \"git revert --abort\" to cancel the revert operation)"
 msgstr ""
-"Sie haben immer noch nicht zusammengeführte Pfade im Index.\n"
-"Haben Sie vergessen 'git add' zu benutzen?"
+"  (benutzen Sie \"git revert --abort\", um die Revert-Operation abzubrechen)"
 
-#: builtin/am.c:2043 builtin/am.c:2047 builtin/am.c:2059 builtin/reset.c:308
-#: builtin/reset.c:316
+#: wt-status.c:1320
 #, c-format
-msgid "Could not parse object '%s'."
-msgstr "Konnte Objekt '%s' nicht parsen."
+msgid "You are currently bisecting, started from branch '%s'."
+msgstr "Sie sind gerade bei einer binären Suche, gestartet von Branch '%s'."
 
-#: builtin/am.c:2095
-msgid "failed to clean index"
-msgstr "Fehler beim Bereinigen des Index"
+#: wt-status.c:1324
+msgid "You are currently bisecting."
+msgstr "Sie sind gerade bei einer binären Suche."
 
-#: builtin/am.c:2129
-msgid ""
-"You seem to have moved HEAD since the last 'am' failure.\n"
-"Not rewinding to ORIG_HEAD"
+#: wt-status.c:1327
+msgid "  (use \"git bisect reset\" to get back to the original branch)"
 msgstr ""
-"Sie scheinen seit dem letzten gescheiterten 'am' HEAD geändert zu haben.\n"
-"Keine Zurücksetzung zu ORIG_HEAD."
+"  (benutzen Sie \"git bisect reset\", um zum ursprünglichen Branch "
+"zurückzukehren)"
 
-#: builtin/am.c:2192
-#, c-format
-msgid "Invalid value for --patch-format: %s"
-msgstr "Ungültiger Wert für --patch-format: %s"
+#: wt-status.c:1524
+msgid "On branch "
+msgstr "Auf Branch "
 
-#: builtin/am.c:2225
-msgid "git am [<options>] [(<mbox>|<Maildir>)...]"
-msgstr "git am [<Optionen>] [(<mbox>|<E-Mail-Verzeichnis>)...]"
+#: wt-status.c:1530
+msgid "interactive rebase in progress; onto "
+msgstr "interaktives Rebase im Gange; auf "
 
-#: builtin/am.c:2226
-msgid "git am [<options>] (--continue | --skip | --abort)"
-msgstr "git am [<Optionen>] (--continue | --skip | --abort)"
+#: wt-status.c:1532
+msgid "rebase in progress; onto "
+msgstr "Rebase im Gange; auf "
 
-#: builtin/am.c:2232
-msgid "run interactively"
-msgstr "interaktiv ausführen"
+#: wt-status.c:1537
+msgid "HEAD detached at "
+msgstr "HEAD losgelöst bei "
 
-#: builtin/am.c:2234
-msgid "historical option -- no-op"
-msgstr "historische Option -- kein Effekt"
+#: wt-status.c:1539
+msgid "HEAD detached from "
+msgstr "HEAD losgelöst von "
 
-#: builtin/am.c:2236
-msgid "allow fall back on 3way merging if needed"
-msgstr "erlaube, falls notwendig, das Zurückfallen auf einen 3-Wege-Merge"
+#: wt-status.c:1542
+msgid "Not currently on any branch."
+msgstr "Im Moment auf keinem Branch."
 
-#: builtin/am.c:2237 builtin/init-db.c:481 builtin/prune-packed.c:57
-#: builtin/repack.c:172
-msgid "be quiet"
-msgstr "weniger Ausgaben"
+#: wt-status.c:1560
+msgid "Initial commit"
+msgstr "Initialer Commit"
 
-#: builtin/am.c:2239
-msgid "add a Signed-off-by line to the commit message"
-msgstr "der Commit-Beschreibung eine Signed-off-by Zeile hinzufügen"
+#: wt-status.c:1574
+msgid "Untracked files"
+msgstr "Unversionierte Dateien"
 
-#: builtin/am.c:2242
-msgid "recode into utf8 (default)"
-msgstr "nach UTF-8 umkodieren (Standard)"
+#: wt-status.c:1576
+msgid "Ignored files"
+msgstr "Ignorierte Dateien"
 
-#: builtin/am.c:2244
-msgid "pass -k flag to git-mailinfo"
-msgstr "-k an git-mailinfo übergeben"
+#: wt-status.c:1580
+#, c-format
+msgid ""
+"It took %.2f seconds to enumerate untracked files. 'status -uno'\n"
+"may speed it up, but you have to be careful not to forget to add\n"
+"new files yourself (see 'git help status')."
+msgstr ""
+"Es dauerte %.2f Sekunden die unversionierten Dateien zu bestimmen.\n"
+"'status -uno' könnte das beschleunigen, aber Sie müssen darauf achten,\n"
+"neue Dateien selbstständig hinzuzufügen (siehe 'git help status')."
 
-#: builtin/am.c:2246
-msgid "pass -b flag to git-mailinfo"
-msgstr "-b an git-mailinfo übergeben"
+#: wt-status.c:1586
+#, c-format
+msgid "Untracked files not listed%s"
+msgstr "Unversionierte Dateien nicht aufgelistet%s"
 
-#: builtin/am.c:2248
-msgid "pass -m flag to git-mailinfo"
-msgstr "-m an git-mailinfo übergeben"
+#: wt-status.c:1588
+msgid " (use -u option to show untracked files)"
+msgstr " (benutzen Sie die Option -u, um unversionierte Dateien anzuzeigen)"
 
-#: builtin/am.c:2250
-msgid "pass --keep-cr flag to git-mailsplit for mbox format"
-msgstr "--keep-cr an git-mailsplit für mbox-Format übergeben"
+#: wt-status.c:1594
+msgid "No changes"
+msgstr "Keine Änderungen"
 
-#: builtin/am.c:2253
-msgid "do not pass --keep-cr flag to git-mailsplit independent of am.keepcr"
-msgstr "kein --keep-cr an git-mailsplit übergeben, unabhängig von am.keepcr"
+#: wt-status.c:1599
+#, c-format
+msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n"
+msgstr ""
+"keine Änderungen zum Commit vorgemerkt (benutzen Sie \"git add\" und/oder "
+"\"git commit -a\")\n"
 
-#: builtin/am.c:2256
-msgid "strip everything before a scissors line"
-msgstr "alles vor einer Scheren-Zeile entfernen"
+#: wt-status.c:1602
+#, c-format
+msgid "no changes added to commit\n"
+msgstr "keine Änderungen zum Commit vorgemerkt\n"
 
-#: builtin/am.c:2257 builtin/apply.c:4837
-msgid "action"
-msgstr "Aktion"
+#: wt-status.c:1605
+#, c-format
+msgid ""
+"nothing added to commit but untracked files present (use \"git add\" to "
+"track)\n"
+msgstr ""
+"nichts zum Commit vorgemerkt, aber es gibt unversionierte Dateien (benutzen "
+"Sie \"git add\" zum Versionieren)\n"
 
-#: builtin/am.c:2258 builtin/am.c:2261 builtin/am.c:2264 builtin/am.c:2267
-#: builtin/am.c:2270 builtin/am.c:2273 builtin/am.c:2276 builtin/am.c:2279
-#: builtin/am.c:2285
-msgid "pass it through git-apply"
-msgstr "an git-apply übergeben"
+#: wt-status.c:1608
+#, c-format
+msgid "nothing added to commit but untracked files present\n"
+msgstr "nichts zum Commit vorgemerkt, aber es gibt unversionierte Dateien\n"
 
-#: builtin/am.c:2266 builtin/apply.c:4861
-msgid "root"
-msgstr "Wurzelverzeichnis"
+#: wt-status.c:1611
+#, c-format
+msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
+msgstr ""
+"nichts zu committen (Erstellen/Kopieren Sie Dateien und benutzen Sie \"git "
+"add\" zum Versionieren)\n"
 
-#: builtin/am.c:2269 builtin/am.c:2272 builtin/apply.c:4799
-#: builtin/apply.c:4802 builtin/clone.c:90 builtin/fetch.c:96
-#: builtin/pull.c:179 builtin/submodule--helper.c:277
-#: builtin/submodule--helper.c:402 builtin/submodule--helper.c:482
-#: builtin/submodule--helper.c:485 builtin/submodule--helper.c:823
-#: builtin/submodule--helper.c:826
-msgid "path"
-msgstr "Pfad"
+#: wt-status.c:1614 wt-status.c:1619
+#, c-format
+msgid "nothing to commit\n"
+msgstr "nichts zu committen\n"
 
-#: builtin/am.c:2275 builtin/fmt-merge-msg.c:666 builtin/fmt-merge-msg.c:669
-#: builtin/grep.c:706 builtin/merge.c:200 builtin/pull.c:134 builtin/pull.c:193
-#: builtin/repack.c:181 builtin/repack.c:185 builtin/show-branch.c:645
-#: builtin/show-ref.c:175 builtin/tag.c:340 parse-options.h:132
-#: parse-options.h:134 parse-options.h:244
-msgid "n"
-msgstr "Anzahl"
+#: wt-status.c:1617
+#, c-format
+msgid "nothing to commit (use -u to show untracked files)\n"
+msgstr ""
+"nichts zu committen (benutzen Sie die Option -u, um unversionierte Dateien "
+"anzuzeigen)\n"
 
-#: builtin/am.c:2278 builtin/apply.c:4805
-msgid "num"
-msgstr "Anzahl"
+#: wt-status.c:1621
+#, c-format
+msgid "nothing to commit, working tree clean\n"
+msgstr "nichts zu committen, Arbeitsverzeichnis unverändert\n"
 
-#: builtin/am.c:2281 builtin/for-each-ref.c:37 builtin/replace.c:438
-#: builtin/tag.c:372
-msgid "format"
-msgstr "Format"
+#: wt-status.c:1728
+msgid "Initial commit on "
+msgstr "Initialer Commit auf "
 
-#: builtin/am.c:2282
-msgid "format the patch(es) are in"
-msgstr "Patch-Format"
+#: wt-status.c:1732
+msgid "HEAD (no branch)"
+msgstr "HEAD (kein Branch)"
 
-#: builtin/am.c:2288
-msgid "override error message when patch failure occurs"
-msgstr "Meldung bei fehlerhafter Patch-Anwendung überschreiben"
+#: wt-status.c:1761
+msgid "gone"
+msgstr "entfernt"
 
-#: builtin/am.c:2290
-msgid "continue applying patches after resolving a conflict"
-msgstr "Anwendung der Patches nach Auflösung eines Konfliktes fortsetzen"
+#: wt-status.c:1763 wt-status.c:1771
+msgid "behind "
+msgstr "hinterher "
 
-#: builtin/am.c:2293
-msgid "synonyms for --continue"
-msgstr "Synonyme für --continue"
+#: wt-status.c:1766 wt-status.c:1769
+msgid "ahead "
+msgstr "voraus "
 
-#: builtin/am.c:2296
-msgid "skip the current patch"
-msgstr "den aktuellen Patch auslassen"
+#. TRANSLATORS: the action is e.g. "pull with rebase"
+#: wt-status.c:2270
+#, c-format
+msgid "cannot %s: You have unstaged changes."
+msgstr "%s nicht möglich: Sie haben Änderungen, die nicht zum Commit vorgemerkt sind."
 
-#: builtin/am.c:2299
-msgid "restore the original branch and abort the patching operation."
-msgstr ""
-"ursprünglichen Branch wiederherstellen und Anwendung der Patches abbrechen"
+#: wt-status.c:2276
+msgid "additionally, your index contains uncommitted changes."
+msgstr "Zusätzlich enthält die Staging-Area nicht committete Änderungen."
 
-#: builtin/am.c:2303
-msgid "lie about committer date"
-msgstr "Autor-Datum als Commit-Datum verwenden"
+#: wt-status.c:2278
+#, c-format
+msgid "cannot %s: Your index contains uncommitted changes."
+msgstr "%s nicht möglich: Die Staging-Area enthält nicht committete Änderungen."
 
-#: builtin/am.c:2305
-msgid "use current timestamp for author date"
-msgstr "aktuellen Zeitstempel als Autor-Datum verwenden"
+#: compat/precompose_utf8.c:57 builtin/clone.c:414
+#, c-format
+msgid "failed to unlink '%s'"
+msgstr "Konnte '%s' nicht entfernen."
 
-#: builtin/am.c:2307 builtin/commit.c:1610 builtin/merge.c:229
-#: builtin/pull.c:164 builtin/revert.c:92 builtin/tag.c:355
-msgid "key-id"
-msgstr "GPG-Schlüsselkennung"
+#: builtin/add.c:22
+msgid "git add [<options>] [--] <pathspec>..."
+msgstr "git add [<Optionen>] [--] <Pfadspezifikation>..."
 
-#: builtin/am.c:2308
-msgid "GPG-sign commits"
-msgstr "Commits mit GPG signieren"
+#: builtin/add.c:80
+#, c-format
+msgid "unexpected diff status %c"
+msgstr "unerwarteter Differenz-Status %c"
 
-#: builtin/am.c:2311
-msgid "(internal use for git-rebase)"
-msgstr "(intern für git-rebase verwendet)"
+#: builtin/add.c:85 builtin/commit.c:291
+msgid "updating files failed"
+msgstr "Aktualisierung der Dateien fehlgeschlagen"
 
-#: builtin/am.c:2326
-msgid ""
-"The -b/--binary option has been a no-op for long time, and\n"
-"it will be removed. Please do not use it anymore."
+#: builtin/add.c:95
+#, c-format
+msgid "remove '%s'\n"
+msgstr "lösche '%s'\n"
+
+#: builtin/add.c:149
+msgid "Unstaged changes after refreshing the index:"
 msgstr ""
-"Die -b/--binary Option hat seit Langem keinen Effekt und wird\n"
-"entfernt. Bitte verwenden Sie diese nicht mehr."
+"Nicht zum Commit vorgemerkte Änderungen nach Aktualisierung der Staging-Area:"
+
+#: builtin/add.c:209 builtin/rev-parse.c:840
+msgid "Could not read the index"
+msgstr "Konnte den Index nicht lesen"
+
+#: builtin/add.c:220
+#, c-format
+msgid "Could not open '%s' for writing."
+msgstr "Konnte '%s' nicht zum Schreiben öffnen."
+
+#: builtin/add.c:224
+msgid "Could not write patch"
+msgstr "Konnte Patch nicht schreiben"
 
-#: builtin/am.c:2333
-msgid "failed to read the index"
-msgstr "Fehler beim Lesen des Index"
+#: builtin/add.c:227
+msgid "editing patch failed"
+msgstr "Bearbeitung des Patches fehlgeschlagen"
 
-#: builtin/am.c:2348
+#: builtin/add.c:230
 #, c-format
-msgid "previous rebase directory %s still exists but mbox given."
-msgstr "Vorheriges Rebase-Verzeichnis %s existiert noch, aber mbox gegeben."
+msgid "Could not stat '%s'"
+msgstr "Konnte Verzeichnis '%s' nicht lesen"
+
+#: builtin/add.c:232
+msgid "Empty patch. Aborted."
+msgstr "Leerer Patch. Abgebrochen."
 
-#: builtin/am.c:2372
+#: builtin/add.c:237
 #, c-format
-msgid ""
-"Stray %s directory found.\n"
-"Use \"git am --abort\" to remove it."
+msgid "Could not apply '%s'"
+msgstr "Konnte '%s' nicht anwenden."
+
+#: builtin/add.c:247
+msgid "The following paths are ignored by one of your .gitignore files:\n"
 msgstr ""
-"Stray %s Verzeichnis gefunden.\n"
-"Benutzen Sie \"git am --abort\", um es zu entfernen."
+"Die folgenden Pfade werden durch eine Ihrer \".gitignore\" Dateien "
+"ignoriert:\n"
 
-#: builtin/am.c:2378
-msgid "Resolve operation not in progress, we are not resuming."
-msgstr "Es ist keine Auflösung im Gange, es wird nicht fortgesetzt."
+#: builtin/add.c:266 builtin/clean.c:870 builtin/fetch.c:115 builtin/mv.c:111
+#: builtin/prune-packed.c:55 builtin/pull.c:198 builtin/push.c:521
+#: builtin/remote.c:1326 builtin/rm.c:268 builtin/send-pack.c:162
+msgid "dry run"
+msgstr "Probelauf"
 
-#: builtin/apply.c:122
-msgid "git apply [<options>] [<patch>...]"
-msgstr "git apply [<Optionen>] [<Patch>...]"
+#: builtin/add.c:269
+msgid "interactive picking"
+msgstr "interaktives Auswählen"
 
-#: builtin/apply.c:153
-#, c-format
-msgid "unrecognized whitespace option '%s'"
-msgstr "nicht erkannte Whitespace-Option: '%s'"
+#: builtin/add.c:270 builtin/checkout.c:1156 builtin/reset.c:286
+msgid "select hunks interactively"
+msgstr "Blöcke interaktiv auswählen"
 
-#: builtin/apply.c:169
-#, c-format
-msgid "unrecognized whitespace ignore option '%s'"
-msgstr "nicht erkannte Option zum Ignorieren von Whitespace: '%s'"
+#: builtin/add.c:271
+msgid "edit current diff and apply"
+msgstr "aktuelle Unterschiede editieren und anwenden"
 
-#: builtin/apply.c:854
-#, c-format
-msgid "Cannot prepare timestamp regexp %s"
-msgstr "Kann regulären Ausdruck für Zeitstempel %s nicht verarbeiten"
+#: builtin/add.c:272
+msgid "allow adding otherwise ignored files"
+msgstr "das Hinzufügen andernfalls ignorierter Dateien erlauben"
 
-#: builtin/apply.c:863
-#, c-format
-msgid "regexec returned %d for input: %s"
-msgstr "Ausführung des regulären Ausdrucks gab %d zurück. Eingabe: %s"
+#: builtin/add.c:273
+msgid "update tracked files"
+msgstr "versionierte Dateien aktualisieren"
 
-#: builtin/apply.c:947
-#, c-format
-msgid "unable to find filename in patch at line %d"
-msgstr "Konnte keinen Dateinamen in Zeile %d des Patches finden."
+#: builtin/add.c:274
+msgid "record only the fact that the path will be added later"
+msgstr "nur speichern, dass der Pfad später hinzugefügt werden soll"
 
-#: builtin/apply.c:984
-#, c-format
-msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d"
+#: builtin/add.c:275
+msgid "add changes from all tracked and untracked files"
 msgstr ""
-"git apply: ungültiges 'git-diff' - erwartete /dev/null, erhielt %s in Zeile "
-"%d"
+"Änderungen von allen versionierten und unversionierten Dateien hinzufügen"
 
-#: builtin/apply.c:989
-#, c-format
-msgid "git apply: bad git-diff - inconsistent new filename on line %d"
-msgstr ""
-"git apply: ungültiges 'git-diff' - Inkonsistenter neuer Dateiname in Zeile %d"
+#: builtin/add.c:278
+msgid "ignore paths removed in the working tree (same as --no-all)"
+msgstr "gelöschte Pfade im Arbeitsverzeichnis ignorieren (genau wie --no-all)"
 
-#: builtin/apply.c:990
-#, c-format
-msgid "git apply: bad git-diff - inconsistent old filename on line %d"
+#: builtin/add.c:280
+msgid "don't add, only refresh the index"
+msgstr "nichts hinzufügen, nur den Index aktualisieren"
+
+#: builtin/add.c:281
+msgid "just skip files which cannot be added because of errors"
 msgstr ""
-"git apply: ungültiges 'git-diff' - Inkonsistenter alter Dateiname in Zeile %d"
+"Dateien überspringen, die aufgrund von Fehlern nicht hinzugefügt werden "
+"konnten"
 
-#: builtin/apply.c:995
-#, c-format
-msgid "git apply: bad git-diff - expected /dev/null on line %d"
-msgstr "git apply: ungültiges 'git-diff' - erwartete /dev/null in Zeile %d"
+#: builtin/add.c:282
+msgid "check if - even missing - files are ignored in dry run"
+msgstr "prüfen ob - auch fehlende - Dateien im Probelauf ignoriert werden"
 
-#: builtin/apply.c:1489
-#, c-format
-msgid "recount: unexpected line: %.*s"
-msgstr "recount: unerwartete Zeile: %.*s"
+#: builtin/add.c:283 builtin/update-index.c:947
+msgid "(+/-)x"
+msgstr "(+/-)x"
 
-#: builtin/apply.c:1550
-#, c-format
-msgid "patch fragment without header at line %d: %.*s"
-msgstr "Patch-Fragment ohne Kopfbereich bei Zeile %d: %.*s"
+#: builtin/add.c:283 builtin/update-index.c:948
+msgid "override the executable bit of the listed files"
+msgstr "das \"ausführbar\"-Bit der aufgelisteten Dateien überschreiben"
 
-#: builtin/apply.c:1567
+#: builtin/add.c:305
 #, c-format
-msgid ""
-"git diff header lacks filename information when removing %d leading pathname "
-"component (line %d)"
-msgid_plural ""
-"git diff header lacks filename information when removing %d leading pathname "
-"components (line %d)"
-msgstr[0] ""
-"Dem Kopfbereich von \"git diff\" fehlen Informationen zum Dateinamen, wenn "
-"%d vorangestellter Teil des Pfades entfernt wird (Zeile %d)"
-msgstr[1] ""
-"Dem Kopfbereich von \"git diff\" fehlen Informationen zum Dateinamen, wenn "
-"%d vorangestellte Teile des Pfades entfernt werden (Zeile %d)"
-
-#: builtin/apply.c:1743
-msgid "new file depends on old contents"
-msgstr "neue Datei hängt von alten Inhalten ab"
+msgid "Use -f if you really want to add them.\n"
+msgstr "Verwenden Sie -f wenn Sie diese wirklich hinzufügen möchten.\n"
 
-#: builtin/apply.c:1745
-msgid "deleted file still has contents"
-msgstr "entfernte Datei hat noch Inhalte"
+#: builtin/add.c:312
+msgid "adding files failed"
+msgstr "Hinzufügen von Dateien fehlgeschlagen"
 
-#: builtin/apply.c:1774
-#, c-format
-msgid "corrupt patch at line %d"
-msgstr "fehlerhafter Patch bei Zeile %d"
+#: builtin/add.c:348
+msgid "-A and -u are mutually incompatible"
+msgstr "Die Optionen -A und -u sind zueinander inkompatibel."
 
-#: builtin/apply.c:1810
-#, c-format
-msgid "new file %s depends on old contents"
-msgstr "neue Datei %s hängt von alten Inhalten ab"
+#: builtin/add.c:355
+msgid "Option --ignore-missing can only be used together with --dry-run"
+msgstr ""
+"Die Option --ignore-missing kann nur zusammen mit --dry-run verwendet werden."
 
-#: builtin/apply.c:1812
+#: builtin/add.c:359
 #, c-format
-msgid "deleted file %s still has contents"
-msgstr "entfernte Datei %s hat noch Inhalte"
+msgid "--chmod param '%s' must be either -x or +x"
+msgstr "--chmod Parameter '%s' muss entweder -x oder +x sein"
 
-#: builtin/apply.c:1815
+#: builtin/add.c:374
 #, c-format
-msgid "** warning: file %s becomes empty but is not deleted"
-msgstr "** Warnung: Datei %s wird leer, aber nicht entfernt."
+msgid "Nothing specified, nothing added.\n"
+msgstr "Nichts spezifiziert, nichts hinzugefügt.\n"
 
-#: builtin/apply.c:1962
+#: builtin/add.c:375
 #, c-format
-msgid "corrupt binary patch at line %d: %.*s"
-msgstr "fehlerhafter Binär-Patch bei Zeile %d: %.*s"
+msgid "Maybe you wanted to say 'git add .'?\n"
+msgstr "Meinten Sie vielleicht 'git add .'?\n"
 
-#: builtin/apply.c:1999
-#, c-format
-msgid "unrecognized binary patch at line %d"
-msgstr "nicht erkannter Binär-Patch bei Zeile %d"
+#: builtin/add.c:380 builtin/check-ignore.c:172 builtin/checkout.c:279
+#: builtin/checkout.c:472 builtin/clean.c:914 builtin/commit.c:350
+#: builtin/mv.c:131 builtin/reset.c:235 builtin/rm.c:298
+#: builtin/submodule--helper.c:244
+msgid "index file corrupt"
+msgstr "Index-Datei beschädigt"
 
-#: builtin/apply.c:2154
-#, c-format
-msgid "patch with only garbage at line %d"
-msgstr "Patch mit nutzlosen Informationen bei Zeile %d"
+#: builtin/am.c:414
+msgid "could not parse author script"
+msgstr "konnte Autor-Skript nicht parsen"
 
-#: builtin/apply.c:2244
+#: builtin/am.c:491
 #, c-format
-msgid "unable to read symlink %s"
-msgstr "konnte symbolische Verknüpfung %s nicht lesen"
+msgid "'%s' was deleted by the applypatch-msg hook"
+msgstr "'%s' wurde durch den applypatch-msg Hook entfernt"
 
-#: builtin/apply.c:2248
+#: builtin/am.c:532
 #, c-format
-msgid "unable to open or read %s"
-msgstr "konnte %s nicht öffnen oder lesen"
+msgid "Malformed input line: '%s'."
+msgstr "Fehlerhafte Eingabezeile: '%s'."
 
-#: builtin/apply.c:2901
+#: builtin/am.c:569
 #, c-format
-msgid "invalid start of line: '%c'"
-msgstr "Ungültiger Zeilenanfang: '%c'"
+msgid "Failed to copy notes from '%s' to '%s'"
+msgstr "Fehler beim Kopieren der Notizen von '%s' nach '%s'"
 
-#: builtin/apply.c:3020
-#, c-format
-msgid "Hunk #%d succeeded at %d (offset %d line)."
-msgid_plural "Hunk #%d succeeded at %d (offset %d lines)."
-msgstr[0] "Patch-Bereich #%d erfolgreich angewendet bei %d (%d Zeile versetzt)"
-msgstr[1] ""
-"Patch-Bereich #%d erfolgreich angewendet bei %d (%d Zeilen versetzt)"
+#: builtin/am.c:595
+msgid "fseek failed"
+msgstr "\"fseek\" fehlgeschlagen"
 
-#: builtin/apply.c:3032
+#: builtin/am.c:775
 #, c-format
-msgid "Context reduced to (%ld/%ld) to apply fragment at %d"
-msgstr "Kontext reduziert zu (%ld/%ld), um Patch-Bereich bei %d anzuwenden"
+msgid "could not parse patch '%s'"
+msgstr "konnte Patch '%s' nicht parsen"
 
-#: builtin/apply.c:3038
-#, c-format
-msgid ""
-"while searching for:\n"
-"%.*s"
-msgstr ""
-"bei der Suche nach:\n"
-"%.*s"
+#: builtin/am.c:840
+msgid "Only one StGIT patch series can be applied at once"
+msgstr "Es kann nur eine StGIT Patch-Serie auf einmal angewendet werden."
 
-#: builtin/apply.c:3060
-#, c-format
-msgid "missing binary patch data for '%s'"
-msgstr "keine Daten in Binär-Patch für '%s'"
+#: builtin/am.c:887
+msgid "invalid timestamp"
+msgstr "ungültiger Zeitstempel"
 
-#: builtin/apply.c:3163
-#, c-format
-msgid "binary patch does not apply to '%s'"
-msgstr "Konnte Binär-Patch nicht auf '%s' anwenden"
+#: builtin/am.c:890 builtin/am.c:898
+msgid "invalid Date line"
+msgstr "Ungültige \"Date\"-Zeile"
 
-#: builtin/apply.c:3169
-#, c-format
-msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)"
-msgstr ""
-"Binär-Patch für '%s' erzeugt falsches Ergebnis (erwartete %s, bekam %s)"
+#: builtin/am.c:895
+msgid "invalid timezone offset"
+msgstr "Ungültiger Offset in der Zeitzone"
 
-#: builtin/apply.c:3190
-#, c-format
-msgid "patch failed: %s:%ld"
-msgstr "Anwendung des Patches fehlgeschlagen: %s:%ld"
+#: builtin/am.c:984
+msgid "Patch format detection failed."
+msgstr "Patch-Formaterkennung fehlgeschlagen."
 
-#: builtin/apply.c:3314
+#: builtin/am.c:989 builtin/clone.c:379
 #, c-format
-msgid "cannot checkout %s"
-msgstr "kann %s nicht auschecken"
+msgid "failed to create directory '%s'"
+msgstr "Fehler beim Erstellen von Verzeichnis '%s'"
 
-#: builtin/apply.c:3370
-#, c-format
-msgid "reading from '%s' beyond a symbolic link"
-msgstr "'%s' ist hinter einer symbolischen Verknüpfung"
+#: builtin/am.c:993
+msgid "Failed to split patches."
+msgstr "Fehler beim Aufteilen der Patches."
 
-#: builtin/apply.c:3399 builtin/apply.c:3630
-#, c-format
-msgid "path %s has been renamed/deleted"
-msgstr "Pfad %s wurde umbenannt/gelöscht"
+#: builtin/am.c:1125 builtin/commit.c:376
+msgid "unable to write index file"
+msgstr "Konnte Index-Datei nicht schreiben."
 
-#: builtin/apply.c:3482 builtin/apply.c:3644
+#: builtin/am.c:1176
 #, c-format
-msgid "%s: does not exist in index"
-msgstr "%s ist nicht im Index"
+msgid "When you have resolved this problem, run \"%s --continue\"."
+msgstr ""
+"Wenn Sie das Problem aufgelöst haben, führen Sie \"%s --continue\" aus."
 
-#: builtin/apply.c:3486 builtin/apply.c:3636 builtin/apply.c:3658
+#: builtin/am.c:1177
 #, c-format
-msgid "%s: %s"
-msgstr "%s: %s"
+msgid "If you prefer to skip this patch, run \"%s --skip\" instead."
+msgstr ""
+"Falls Sie diesen Patch auslassen möchten, führen Sie stattdessen \"%s --skip"
+"\" aus."
 
-#: builtin/apply.c:3491 builtin/apply.c:3652
+#: builtin/am.c:1178
 #, c-format
-msgid "%s: does not match index"
-msgstr "%s entspricht nicht der Version im Index"
+msgid "To restore the original branch and stop patching, run \"%s --abort\"."
+msgstr ""
+"Um den ursprünglichen Branch wiederherzustellen und die Anwendung der "
+"Patches abzubrechen, führen Sie \"%s --abort\" aus."
 
-#: builtin/apply.c:3597
-msgid "removal patch leaves file contents"
-msgstr "Lösch-Patch hinterlässt Dateiinhalte"
+#: builtin/am.c:1316
+msgid "Patch is empty. Was it split wrong?"
+msgstr "Patch ist leer. War dessen Aufteilung falsch?"
 
-#: builtin/apply.c:3669
+#: builtin/am.c:1390 builtin/log.c:1550
 #, c-format
-msgid "%s: wrong type"
-msgstr "%s: falscher Typ"
+msgid "invalid ident line: %s"
+msgstr "Ungültige Identifikationszeile: %s"
 
-#: builtin/apply.c:3671
+#: builtin/am.c:1417
 #, c-format
-msgid "%s has type %o, expected %o"
-msgstr "%s ist vom Typ %o, erwartete %o"
+msgid "unable to parse commit %s"
+msgstr "Konnte Commit '%s' nicht parsen."
 
-#: builtin/apply.c:3822 builtin/apply.c:3824
-#, c-format
-msgid "invalid path '%s'"
-msgstr "Ungültiger Pfad '%s'"
+#: builtin/am.c:1610
+msgid "Repository lacks necessary blobs to fall back on 3-way merge."
+msgstr ""
+"Dem Repository fehlen notwendige Blobs um auf einen 3-Wege-Merge "
+"zurückzufallen."
 
-#: builtin/apply.c:3879
-#, c-format
-msgid "%s: already exists in index"
-msgstr "%s ist bereits bereitgestellt"
+#: builtin/am.c:1612
+msgid "Using index info to reconstruct a base tree..."
+msgstr ""
+"Verwende Informationen aus der Staging-Area, um ein Basisverzeichnis "
+"nachzustellen ..."
 
-#: builtin/apply.c:3882
-#, c-format
-msgid "%s: already exists in working directory"
-msgstr "%s existiert bereits im Arbeitsverzeichnis"
+#: builtin/am.c:1631
+msgid ""
+"Did you hand edit your patch?\n"
+"It does not apply to blobs recorded in its index."
+msgstr ""
+"Haben Sie den Patch per Hand editiert?\n"
+"Er kann nicht auf die Blobs in seiner 'index' Zeile angewendet werden."
 
-#: builtin/apply.c:3902
-#, c-format
-msgid "new mode (%o) of %s does not match old mode (%o)"
-msgstr "neuer Modus (%o) von %s entspricht nicht dem alten Modus (%o)"
+#: builtin/am.c:1637
+msgid "Falling back to patching base and 3-way merge..."
+msgstr "Falle zurück zum Patchen der Basis und zum 3-Wege-Merge ..."
 
-#: builtin/apply.c:3907
-#, c-format
-msgid "new mode (%o) of %s does not match old mode (%o) of %s"
-msgstr "neuer Modus (%o) von %s entspricht nicht dem alten Modus (%o) von %s"
+#: builtin/am.c:1662
+msgid "Failed to merge in the changes."
+msgstr "Merge der Änderungen fehlgeschlagen."
 
-#: builtin/apply.c:3927
-#, c-format
-msgid "affected file '%s' is beyond a symbolic link"
-msgstr "betroffene Datei '%s' ist hinter einer symbolischen Verknüpfung"
+#: builtin/am.c:1686 builtin/merge.c:628
+msgid "git write-tree failed to write a tree"
+msgstr "\"git write-tree\" schlug beim Schreiben eines \"Tree\"-Objektes fehl"
 
-#: builtin/apply.c:3931
-#, c-format
-msgid "%s: patch does not apply"
-msgstr "%s: Patch konnte nicht angewendet werden"
+#: builtin/am.c:1693
+msgid "applying to an empty history"
+msgstr "auf leere Historie anwenden"
 
-#: builtin/apply.c:3945
-#, c-format
-msgid "Checking patch %s..."
-msgstr "Prüfe Patch %s ..."
+#: builtin/am.c:1706 builtin/commit.c:1769 builtin/merge.c:798
+#: builtin/merge.c:823
+msgid "failed to write commit object"
+msgstr "Fehler beim Schreiben des Commit-Objektes."
 
-#: builtin/apply.c:4038 builtin/checkout.c:233 builtin/reset.c:135
+#: builtin/am.c:1739 builtin/am.c:1743
 #, c-format
-msgid "make_cache_entry failed for path '%s'"
-msgstr "make_cache_entry für Pfad '%s' fehlgeschlagen"
+msgid "cannot resume: %s does not exist."
+msgstr "Kann nicht fortsetzen: %s existiert nicht"
 
-#: builtin/apply.c:4182
-#, c-format
-msgid "unable to remove %s from index"
-msgstr "konnte %s nicht aus dem Index entfernen"
+#: builtin/am.c:1759
+msgid "cannot be interactive without stdin connected to a terminal."
+msgstr ""
+"Kann nicht interaktiv sein, ohne dass die Standard-Eingabe mit einem "
+"Terminal verbunden ist."
 
-#: builtin/apply.c:4215
-#, c-format
-msgid "corrupt patch for submodule %s"
-msgstr "fehlerhafter Patch für Submodul %s"
+#: builtin/am.c:1764
+msgid "Commit Body is:"
+msgstr "Commit-Beschreibung ist:"
 
-#: builtin/apply.c:4219
-#, c-format
-msgid "unable to stat newly created file '%s'"
-msgstr "konnte neu erstellte Datei '%s' nicht lesen"
+#. TRANSLATORS: Make sure to include [y], [n], [e], [v] and [a]
+#. in your translation. The program will only accept English
+#. input at this point.
+#.
+#: builtin/am.c:1774
+msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all: "
+msgstr "Anwenden? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all: "
 
-#: builtin/apply.c:4224
+#: builtin/am.c:1824
 #, c-format
-msgid "unable to create backing store for newly created file %s"
-msgstr "kann internen Speicher für eben erstellte Datei %s nicht erzeugen"
+msgid "Dirty index: cannot apply patches (dirty: %s)"
+msgstr "Geänderter Index: kann Patches nicht anwenden (geändert: %s)"
 
-#: builtin/apply.c:4227 builtin/apply.c:4340
+#: builtin/am.c:1861 builtin/am.c:1933
 #, c-format
-msgid "unable to add cache entry for %s"
-msgstr "kann für %s keinen Eintrag in den Zwischenspeicher hinzufügen"
+msgid "Applying: %.*s"
+msgstr "Wende an: %.*s"
 
-#: builtin/apply.c:4260
-#, c-format
-msgid "closing file '%s'"
-msgstr "schließe Datei '%s'"
+#: builtin/am.c:1877
+msgid "No changes -- Patch already applied."
+msgstr "Keine Änderungen -- Patches bereits angewendet."
 
-#: builtin/apply.c:4313
+#: builtin/am.c:1885
 #, c-format
-msgid "unable to write file '%s' mode %o"
-msgstr "konnte Datei '%s' mit Modus %o nicht schreiben"
+msgid "Patch failed at %s %.*s"
+msgstr "Anwendung des Patches fehlgeschlagen bei %s %.*s"
 
-#: builtin/apply.c:4403
+#: builtin/am.c:1891
 #, c-format
-msgid "Applied patch %s cleanly."
-msgstr "Patch %s sauber angewendet"
+msgid "The copy of the patch that failed is found in: %s"
+msgstr "Die Kopie des fehlgeschlagenen Patches befindet sich in: %s"
 
-#: builtin/apply.c:4411
-msgid "internal error"
-msgstr "interner Fehler"
+#: builtin/am.c:1936
+msgid ""
+"No changes - did you forget to use 'git add'?\n"
+"If there is nothing left to stage, chances are that something else\n"
+"already introduced the same changes; you might want to skip this patch."
+msgstr ""
+"Keine Änderungen - haben Sie vergessen 'git add' zu benutzen?\n"
+"Wenn keine Änderungen mehr zum Commit vorzumerken sind, könnten\n"
+"diese bereits anderweitig eingefügt worden sein; Sie könnten diesen Patch\n"
+"auslassen."
 
-#: builtin/apply.c:4414
-#, c-format
-msgid "Applying patch %%s with %d reject..."
-msgid_plural "Applying patch %%s with %d rejects..."
-msgstr[0] "Wende Patch %%s mit %d Zurückweisung an..."
-msgstr[1] "Wende Patch %%s mit %d Zurückweisungen an..."
+#: builtin/am.c:1943
+msgid ""
+"You still have unmerged paths in your index.\n"
+"Did you forget to use 'git add'?"
+msgstr ""
+"Sie haben immer noch nicht zusammengeführte Pfade im Index.\n"
+"Haben Sie vergessen 'git add' zu benutzen?"
 
-#: builtin/apply.c:4424
+#: builtin/am.c:2051 builtin/am.c:2055 builtin/am.c:2067 builtin/reset.c:308
+#: builtin/reset.c:316
 #, c-format
-msgid "truncating .rej filename to %.*s.rej"
-msgstr "Verkürze Name von .rej Datei zu %.*s.rej"
+msgid "Could not parse object '%s'."
+msgstr "Konnte Objekt '%s' nicht parsen."
 
-#: builtin/apply.c:4432
-#, c-format
-msgid "cannot open %s: %s"
-msgstr "Kann %s nicht öffnen: %s"
+#: builtin/am.c:2103
+msgid "failed to clean index"
+msgstr "Fehler beim Bereinigen des Index"
 
-#: builtin/apply.c:4445
-#, c-format
-msgid "Hunk #%d applied cleanly."
-msgstr "Patch-Bereich #%d sauber angewendet."
+#: builtin/am.c:2137
+msgid ""
+"You seem to have moved HEAD since the last 'am' failure.\n"
+"Not rewinding to ORIG_HEAD"
+msgstr ""
+"Sie scheinen seit dem letzten gescheiterten 'am' HEAD geändert zu haben.\n"
+"Keine Zurücksetzung zu ORIG_HEAD."
 
-#: builtin/apply.c:4448
+#: builtin/am.c:2200
 #, c-format
-msgid "Rejected hunk #%d."
-msgstr "Patch-Block #%d zurückgewiesen."
+msgid "Invalid value for --patch-format: %s"
+msgstr "Ungültiger Wert für --patch-format: %s"
 
-#: builtin/apply.c:4537
-#, c-format
-msgid "Skipped patch '%s'."
-msgstr "Patch '%s' ausgelassen."
+#: builtin/am.c:2233
+msgid "git am [<options>] [(<mbox> | <Maildir>)...]"
+msgstr "git am [<Optionen>] [(<mbox> | <E-Mail-Verzeichnis>)...]"
 
-#: builtin/apply.c:4545
-msgid "unrecognized input"
-msgstr "nicht erkannte Eingabe"
+#: builtin/am.c:2234
+msgid "git am [<options>] (--continue | --skip | --abort)"
+msgstr "git am [<Optionen>] (--continue | --skip | --abort)"
 
-#: builtin/apply.c:4556
-msgid "unable to read index file"
-msgstr "Konnte Index-Datei nicht lesen"
+#: builtin/am.c:2240
+msgid "run interactively"
+msgstr "interaktiv ausführen"
 
-#: builtin/apply.c:4701
-msgid "--3way outside a repository"
-msgstr ""
-"Die Option --3way kann nicht außerhalb eines Repositories verwendet werden."
+#: builtin/am.c:2242
+msgid "historical option -- no-op"
+msgstr "historische Option -- kein Effekt"
 
-#: builtin/apply.c:4709
-msgid "--index outside a repository"
-msgstr ""
-"Die Option --index kann nicht außerhalb eines Repositories verwendet werden."
+#: builtin/am.c:2244
+msgid "allow fall back on 3way merging if needed"
+msgstr "erlaube, falls notwendig, das Zurückfallen auf einen 3-Wege-Merge"
 
-#: builtin/apply.c:4712
-msgid "--cached outside a repository"
-msgstr ""
-"Die Option --cached kann nicht außerhalb eines Repositories verwendet werden."
+#: builtin/am.c:2245 builtin/init-db.c:483 builtin/prune-packed.c:57
+#: builtin/repack.c:172
+msgid "be quiet"
+msgstr "weniger Ausgaben"
 
-#: builtin/apply.c:4745
-#, c-format
-msgid "can't open patch '%s'"
-msgstr "kann Patch '%s' nicht öffnen"
+#: builtin/am.c:2247
+msgid "add a Signed-off-by line to the commit message"
+msgstr "der Commit-Beschreibung eine Signed-off-by Zeile hinzufügen"
 
-#: builtin/apply.c:4760
-#, c-format
-msgid "squelched %d whitespace error"
-msgid_plural "squelched %d whitespace errors"
-msgstr[0] "unterdrückte %d Whitespace-Fehler"
-msgstr[1] "unterdrückte %d Whitespace-Fehler"
+#: builtin/am.c:2250
+msgid "recode into utf8 (default)"
+msgstr "nach UTF-8 umkodieren (Standard)"
 
-#: builtin/apply.c:4766 builtin/apply.c:4776
-#, c-format
-msgid "%d line adds whitespace errors."
-msgid_plural "%d lines add whitespace errors."
-msgstr[0] "%d Zeile fügt Whitespace-Fehler hinzu."
-msgstr[1] "%d Zeilen fügen Whitespace-Fehler hinzu."
+#: builtin/am.c:2252
+msgid "pass -k flag to git-mailinfo"
+msgstr "-k an git-mailinfo übergeben"
 
-#: builtin/apply.c:4800
-msgid "don't apply changes matching the given path"
-msgstr "keine Änderungen im angegebenen Pfad anwenden"
+#: builtin/am.c:2254
+msgid "pass -b flag to git-mailinfo"
+msgstr "-b an git-mailinfo übergeben"
 
-#: builtin/apply.c:4803
-msgid "apply changes matching the given path"
-msgstr "Änderungen nur im angegebenen Pfad anwenden"
+#: builtin/am.c:2256
+msgid "pass -m flag to git-mailinfo"
+msgstr "-m an git-mailinfo übergeben"
 
-#: builtin/apply.c:4806
-msgid "remove <num> leading slashes from traditional diff paths"
-msgstr ""
-"<Anzahl> vorangestellte Schrägstriche von herkömmlichen Differenzpfaden "
-"entfernen"
+#: builtin/am.c:2258
+msgid "pass --keep-cr flag to git-mailsplit for mbox format"
+msgstr "--keep-cr an git-mailsplit für mbox-Format übergeben"
 
-#: builtin/apply.c:4809
-msgid "ignore additions made by the patch"
-msgstr "hinzugefügte Zeilen des Patches ignorieren"
+#: builtin/am.c:2261
+msgid "do not pass --keep-cr flag to git-mailsplit independent of am.keepcr"
+msgstr "kein --keep-cr an git-mailsplit übergeben, unabhängig von am.keepcr"
 
-#: builtin/apply.c:4811
-msgid "instead of applying the patch, output diffstat for the input"
-msgstr ""
-"anstatt der Anwendung des Patches, den \"diffstat\" für die Eingabe "
-"ausgegeben"
+#: builtin/am.c:2264
+msgid "strip everything before a scissors line"
+msgstr "alles vor einer Scheren-Zeile entfernen"
 
-#: builtin/apply.c:4815
-msgid "show number of added and deleted lines in decimal notation"
-msgstr ""
-"die Anzahl von hinzugefügten/entfernten Zeilen in Dezimalnotation anzeigen"
+#: builtin/am.c:2266 builtin/am.c:2269 builtin/am.c:2272 builtin/am.c:2275
+#: builtin/am.c:2278 builtin/am.c:2281 builtin/am.c:2284 builtin/am.c:2287
+#: builtin/am.c:2293
+msgid "pass it through git-apply"
+msgstr "an git-apply übergeben"
 
-#: builtin/apply.c:4817
-msgid "instead of applying the patch, output a summary for the input"
-msgstr ""
-"anstatt der Anwendung des Patches, eine Zusammenfassung für die Eingabe "
-"ausgeben"
+#: builtin/am.c:2283 builtin/fmt-merge-msg.c:662 builtin/fmt-merge-msg.c:665
+#: builtin/grep.c:707 builtin/merge.c:200 builtin/pull.c:135 builtin/pull.c:194
+#: builtin/repack.c:181 builtin/repack.c:185 builtin/show-branch.c:644
+#: builtin/show-ref.c:175 builtin/tag.c:340 parse-options.h:132
+#: parse-options.h:134 parse-options.h:245
+msgid "n"
+msgstr "Anzahl"
 
-#: builtin/apply.c:4819
-msgid "instead of applying the patch, see if the patch is applicable"
-msgstr ""
-"anstatt der Anwendung des Patches, zeige ob Patch angewendet werden kann"
+#: builtin/am.c:2289 builtin/for-each-ref.c:37 builtin/replace.c:438
+#: builtin/tag.c:372
+msgid "format"
+msgstr "Format"
 
-#: builtin/apply.c:4821
-msgid "make sure the patch is applicable to the current index"
-msgstr ""
-"sicherstellen, dass der Patch mit dem aktuellen Index angewendet werden kann"
+#: builtin/am.c:2290
+msgid "format the patch(es) are in"
+msgstr "Patch-Format"
 
-#: builtin/apply.c:4823
-msgid "apply a patch without touching the working tree"
-msgstr "Patch anwenden, ohne Änderungen im Arbeitsverzeichnis vorzunehmen"
+#: builtin/am.c:2296
+msgid "override error message when patch failure occurs"
+msgstr "Meldung bei fehlerhafter Patch-Anwendung überschreiben"
 
-#: builtin/apply.c:4825
-msgid "accept a patch that touches outside the working area"
-msgstr ""
-"Patch anwenden, der Änderungen außerhalb des Arbeitsverzeichnisses vornimmt"
+#: builtin/am.c:2298
+msgid "continue applying patches after resolving a conflict"
+msgstr "Anwendung der Patches nach Auflösung eines Konfliktes fortsetzen"
 
-#: builtin/apply.c:4827
-msgid "also apply the patch (use with --stat/--summary/--check)"
-msgstr "Patch anwenden (Benutzung mit --stat/--summary/--check)"
+#: builtin/am.c:2301
+msgid "synonyms for --continue"
+msgstr "Synonyme für --continue"
 
-#: builtin/apply.c:4829
-msgid "attempt three-way merge if a patch does not apply"
-msgstr "versuche 3-Wege-Merge, wenn der Patch nicht angewendet werden konnte"
+#: builtin/am.c:2304
+msgid "skip the current patch"
+msgstr "den aktuellen Patch auslassen"
 
-#: builtin/apply.c:4831
-msgid "build a temporary index based on embedded index information"
+#: builtin/am.c:2307
+msgid "restore the original branch and abort the patching operation."
 msgstr ""
-"einen temporären Index, basierend auf den integrierten Index-Informationen, "
-"erstellen"
-
-#: builtin/apply.c:4834 builtin/checkout-index.c:169 builtin/ls-files.c:426
-msgid "paths are separated with NUL character"
-msgstr "Pfade sind getrennt durch NUL Zeichen"
+"ursprünglichen Branch wiederherstellen und Anwendung der Patches abbrechen"
 
-#: builtin/apply.c:4836
-msgid "ensure at least <n> lines of context match"
-msgstr ""
-"sicher stellen, dass mindestens <n> Zeilen des Kontextes übereinstimmen"
+#: builtin/am.c:2311
+msgid "lie about committer date"
+msgstr "Autor-Datum als Commit-Datum verwenden"
 
-#: builtin/apply.c:4838
-msgid "detect new or modified lines that have whitespace errors"
-msgstr "neue oder geänderte Zeilen, die Whitespace-Fehler haben, ermitteln"
+#: builtin/am.c:2313
+msgid "use current timestamp for author date"
+msgstr "aktuellen Zeitstempel als Autor-Datum verwenden"
 
-#: builtin/apply.c:4841 builtin/apply.c:4844
-msgid "ignore changes in whitespace when finding context"
-msgstr "Änderungen im Whitespace bei der Suche des Kontextes ignorieren"
+#: builtin/am.c:2315 builtin/commit.c:1605 builtin/merge.c:229
+#: builtin/pull.c:165 builtin/revert.c:92 builtin/tag.c:355
+msgid "key-id"
+msgstr "GPG-Schlüsselkennung"
 
-#: builtin/apply.c:4847
-msgid "apply the patch in reverse"
-msgstr "den Patch in umgekehrter Reihenfolge anwenden"
+#: builtin/am.c:2316
+msgid "GPG-sign commits"
+msgstr "Commits mit GPG signieren"
 
-#: builtin/apply.c:4849
-msgid "don't expect at least one line of context"
-msgstr "keinen Kontext erwarten"
+#: builtin/am.c:2319
+msgid "(internal use for git-rebase)"
+msgstr "(intern für git-rebase verwendet)"
 
-#: builtin/apply.c:4851
-msgid "leave the rejected hunks in corresponding *.rej files"
+#: builtin/am.c:2334
+msgid ""
+"The -b/--binary option has been a no-op for long time, and\n"
+"it will be removed. Please do not use it anymore."
 msgstr ""
-"zurückgewiesene Patch-Blöcke in entsprechenden *.rej Dateien hinterlassen"
+"Die -b/--binary Option hat seit Langem keinen Effekt und wird\n"
+"entfernt. Bitte verwenden Sie diese nicht mehr."
 
-#: builtin/apply.c:4853
-msgid "allow overlapping hunks"
-msgstr "sich überlappende Patch-Blöcke erlauben"
+#: builtin/am.c:2341
+msgid "failed to read the index"
+msgstr "Fehler beim Lesen des Index"
 
-#: builtin/apply.c:4856
-msgid "tolerate incorrectly detected missing new-line at the end of file"
-msgstr "fehlerhaft erkannten fehlenden Zeilenumbruch am Dateiende tolerieren"
+#: builtin/am.c:2356
+#, c-format
+msgid "previous rebase directory %s still exists but mbox given."
+msgstr "Vorheriges Rebase-Verzeichnis %s existiert noch, aber mbox gegeben."
 
-#: builtin/apply.c:4859
-msgid "do not trust the line counts in the hunk headers"
-msgstr "den Zeilennummern im Kopf des Patch-Blocks nicht vertrauen"
+#: builtin/am.c:2380
+#, c-format
+msgid ""
+"Stray %s directory found.\n"
+"Use \"git am --abort\" to remove it."
+msgstr ""
+"Stray %s Verzeichnis gefunden.\n"
+"Benutzen Sie \"git am --abort\", um es zu entfernen."
 
-#: builtin/apply.c:4862
-msgid "prepend <root> to all filenames"
-msgstr "<Wurzelverzeichnis> vor alle Dateinamen stellen"
+#: builtin/am.c:2386
+msgid "Resolve operation not in progress, we are not resuming."
+msgstr "Es ist keine Auflösung im Gange, es wird nicht fortgesetzt."
+
+#: builtin/apply.c:8
+msgid "git apply [<options>] [<patch>...]"
+msgstr "git apply [<Optionen>] [<Patch>...]"
 
 #: builtin/archive.c:17
 #, c-format
@@ -4171,115 +4687,171 @@ msgstr "<rev-opts> sind dokumentiert in git-rev-list(1)"
 msgid "Blaming lines"
 msgstr "Verarbeite Zeilen"
 
-#: builtin/blame.c:2536
+#: builtin/blame.c:2577
 msgid "Show blame entries as we find them, incrementally"
 msgstr "\"blame\"-Einträge schrittweise anzeigen, während wir sie generieren"
 
-#: builtin/blame.c:2537
+#: builtin/blame.c:2578
 msgid "Show blank SHA-1 for boundary commits (Default: off)"
 msgstr "leere SHA-1 für Grenz-Commits anzeigen (Standard: aus)"
 
-#: builtin/blame.c:2538
+#: builtin/blame.c:2579
 msgid "Do not treat root commits as boundaries (Default: off)"
 msgstr "Ursprungs-Commit nicht als Grenzen behandeln (Standard: aus)"
 
-#: builtin/blame.c:2539
+#: builtin/blame.c:2580
 msgid "Show work cost statistics"
 msgstr "Statistiken zum Arbeitsaufwand anzeigen"
 
-#: builtin/blame.c:2540
+#: builtin/blame.c:2581
 msgid "Force progress reporting"
 msgstr "Fortschrittsanzeige erzwingen"
 
-#: builtin/blame.c:2541
+#: builtin/blame.c:2582
 msgid "Show output score for blame entries"
 msgstr "Ausgabebewertung für \"blame\"-Einträge anzeigen"
 
-#: builtin/blame.c:2542
+#: builtin/blame.c:2583
 msgid "Show original filename (Default: auto)"
 msgstr "ursprünglichen Dateinamen anzeigen (Standard: auto)"
 
-#: builtin/blame.c:2543
+#: builtin/blame.c:2584
 msgid "Show original linenumber (Default: off)"
 msgstr "ursprüngliche Zeilennummer anzeigen (Standard: aus)"
 
-#: builtin/blame.c:2544
+#: builtin/blame.c:2585
 msgid "Show in a format designed for machine consumption"
 msgstr "Anzeige in einem Format für maschinelle Auswertung"
 
-#: builtin/blame.c:2545
+#: builtin/blame.c:2586
 msgid "Show porcelain format with per-line commit information"
 msgstr ""
 "Anzeige in Format für Fremdprogramme mit Commit-Informationen pro Zeile"
 
-#: builtin/blame.c:2546
+#: builtin/blame.c:2587
 msgid "Use the same output mode as git-annotate (Default: off)"
 msgstr ""
 "Den gleichen Ausgabemodus benutzen wie \"git-annotate\" (Standard: aus)"
 
-#: builtin/blame.c:2547
+#: builtin/blame.c:2588
 msgid "Show raw timestamp (Default: off)"
 msgstr "Unbearbeiteten Zeitstempel anzeigen (Standard: aus)"
 
-#: builtin/blame.c:2548
+#: builtin/blame.c:2589
 msgid "Show long commit SHA1 (Default: off)"
 msgstr "Langen Commit-SHA1 anzeigen (Standard: aus)"
 
-#: builtin/blame.c:2549
+#: builtin/blame.c:2590
 msgid "Suppress author name and timestamp (Default: off)"
 msgstr "Den Namen des Autors und den Zeitstempel unterdrücken (Standard: aus)"
 
-#: builtin/blame.c:2550
+#: builtin/blame.c:2591
 msgid "Show author email instead of name (Default: off)"
 msgstr ""
 "Anstatt des Namens die E-Mail-Adresse des Autors anzeigen (Standard: aus)"
 
-#: builtin/blame.c:2551
+#: builtin/blame.c:2592
 msgid "Ignore whitespace differences"
 msgstr "Unterschiede im Whitespace ignorieren"
 
-#: builtin/blame.c:2552
+#: builtin/blame.c:2599
+msgid "Use an experimental indent-based heuristic to improve diffs"
+msgstr ""
+"eine experimentelle, auf Einrückungen basierende Heuristik zur Verbesserung\n"
+"der Darstellung von Unterschieden verwenden"
+
+#: builtin/blame.c:2600
+msgid "Use an experimental blank-line-based heuristic to improve diffs"
+msgstr ""
+"eine experimentelle, auf Leerzeilen basierende Heuristik zur Verbesserung\n"
+"der Darstellung von Unterschieden verwenden"
+
+#: builtin/blame.c:2602
 msgid "Spend extra cycles to find better match"
 msgstr "Länger arbeiten, um bessere Übereinstimmungen zu finden"
 
-#: builtin/blame.c:2553
+#: builtin/blame.c:2603
 msgid "Use revisions from <file> instead of calling git-rev-list"
 msgstr "Commits von <Datei> benutzen, anstatt \"git-rev-list\" aufzurufen"
 
-#: builtin/blame.c:2554
+#: builtin/blame.c:2604
 msgid "Use <file>'s contents as the final image"
 msgstr "Inhalte der <Datei>en als endgültiges Abbild benutzen"
 
-#: builtin/blame.c:2555 builtin/blame.c:2556
+#: builtin/blame.c:2605 builtin/blame.c:2606
 msgid "score"
 msgstr "Bewertung"
 
-#: builtin/blame.c:2555
+#: builtin/blame.c:2605
 msgid "Find line copies within and across files"
 msgstr "kopierte Zeilen innerhalb oder zwischen Dateien finden"
 
-#: builtin/blame.c:2556
+#: builtin/blame.c:2606
 msgid "Find line movements within and across files"
 msgstr "verschobene Zeilen innerhalb oder zwischen Dateien finden"
 
-#: builtin/blame.c:2557
+#: builtin/blame.c:2607
 msgid "n,m"
 msgstr "n,m"
 
-#: builtin/blame.c:2557
+#: builtin/blame.c:2607
 msgid "Process only line range n,m, counting from 1"
 msgstr "nur Zeilen im Bereich n,m verarbeiten, gezählt von 1"
 
+#: builtin/blame.c:2654
+msgid "--progress can't be used with --incremental or porcelain formats"
+msgstr ""
+"--progress kann nicht mit --incremental oder Formaten für Fremdprogramme\n"
+"verwendet werden"
+
 #. TRANSLATORS: This string is used to tell us the maximum
 #. display width for a relative timestamp in "git blame"
 #. output.  For C locale, "4 years, 11 months ago", which
 #. takes 22 places, is the longest among various forms of
 #. relative timestamps, but your language may need more or
 #. fewer display columns.
-#: builtin/blame.c:2649
+#: builtin/blame.c:2700
 msgid "4 years, 11 months ago"
 msgstr "vor 4 Jahren, und 11 Monaten"
 
+#: builtin/blame.c:2780
+msgid "--contents and --reverse do not blend well."
+msgstr "--contents und --reverse funktionieren gemeinsam nicht."
+
+#: builtin/blame.c:2800
+msgid "cannot use --contents with final commit object name"
+msgstr "kann --contents nicht mit endgültigem Namen des Commit-Objektes benutzen"
+
+#: builtin/blame.c:2805
+msgid "--reverse and --first-parent together require specified latest commit"
+msgstr ""
+"--reverse und --first-parent zusammen erfordern die Angabe eines endgültigen\n"
+"Commits"
+
+#: builtin/blame.c:2832
+msgid ""
+"--reverse --first-parent together require range along first-parent chain"
+msgstr ""
+"--reverse und --first-parent zusammen erfordern einen Bereich entlang der\n"
+"\"first-parent\"-Kette"
+
+#: builtin/blame.c:2843
+#, c-format
+msgid "no such path %s in %s"
+msgstr "Pfad %s nicht in %s"
+
+#: builtin/blame.c:2854
+#, c-format
+msgid "cannot read blob %s for path %s"
+msgstr "kann Blob %s für Pfad '%s' nicht lesen"
+
+#: builtin/blame.c:2873
+#, c-format
+msgid "file %s has only %lu line"
+msgid_plural "file %s has only %lu lines"
+msgstr[0] "Datei %s hat nur %lu Zeile"
+msgstr[1] "Datei %s hat nur %lu Zeilen"
+
 #: builtin/branch.c:26
 msgid "git branch [<options>] [-r | -a] [--merged | --no-merged]"
 msgstr "git branch [<Optionen>] [-r | -a] [--merged | --no-merged]"
@@ -4531,6 +5103,10 @@ msgstr "Upstream"
 msgid "change the upstream info"
 msgstr "Informationen zum Upstream-Branch ändern"
 
+#: builtin/branch.c:660
+msgid "Unset the upstream info"
+msgstr "Informationen zum Upstream-Branch entfernen"
+
 #: builtin/branch.c:661
 msgid "use colored output"
 msgstr "farbige Ausgaben verwenden"
@@ -4604,8 +5180,8 @@ msgstr "Schüssel"
 msgid "field name to sort on"
 msgstr "sortiere nach diesem Feld"
 
-#: builtin/branch.c:686 builtin/for-each-ref.c:41 builtin/notes.c:402
-#: builtin/notes.c:405 builtin/notes.c:565 builtin/notes.c:568
+#: builtin/branch.c:686 builtin/for-each-ref.c:41 builtin/notes.c:404
+#: builtin/notes.c:407 builtin/notes.c:567 builtin/notes.c:570
 #: builtin/tag.c:369
 msgid "object"
 msgstr "Objekt"
@@ -4618,7 +5194,7 @@ msgstr "nur Branches von diesem Objekt ausgeben"
 msgid "Failed to resolve HEAD as a valid ref."
 msgstr "Konnte HEAD nicht als gültige Referenz auflösen."
 
-#: builtin/branch.c:709 builtin/clone.c:707
+#: builtin/branch.c:709 builtin/clone.c:706
 msgid "HEAD not found below refs/heads!"
 msgstr "HEAD wurde nicht unter \"refs/heads\" gefunden!"
 
@@ -4733,68 +5309,80 @@ msgstr "Um ein Paket zu erstellen wird ein Repository benötigt."
 msgid "Need a repository to unbundle."
 msgstr "Zum Entpacken wird ein Repository benötigt."
 
-#: builtin/cat-file.c:443
+#: builtin/cat-file.c:513
 msgid ""
-"git cat-file (-t [--allow-unknown-type]|-s [--allow-unknown-type]|-e|-p|"
-"<type>|--textconv) <object>"
-msgstr ""
-"git cat-file (-t [--allow-unknown-type]|-s [--allow-unknown-type]|-e|-p|"
-"<Art>|--textconv) <Objekt>"
+"git cat-file (-t [--allow-unknown-type] | -s [--allow-unknown-type] | -e | -"
+"p | <type> | --textconv | --filters) [--path=<path>] <object>"
+msgstr "git cat-file (-t [--allow-unknown-type] | -s [--allow-unknown-type] | -e | -p | <Art> | --textconv | --filters) [--path=<Pfad>] <Objekt>"
 
-#: builtin/cat-file.c:444
-msgid "git cat-file (--batch | --batch-check) [--follow-symlinks]"
-msgstr "git cat-file (--batch | --batch-check) [--follow-symlinks]"
+#: builtin/cat-file.c:514
+msgid ""
+"git cat-file (--batch | --batch-check) [--follow-symlinks] [--textconv | --"
+"filters]"
+msgstr "git cat-file (--batch | --batch-check) [--follow-symlinks] [--textconv | --filters]"
 
-#: builtin/cat-file.c:481
+#: builtin/cat-file.c:551
 msgid "<type> can be one of: blob, tree, commit, tag"
 msgstr "<Art> kann sein: blob, tree, commit, tag"
 
-#: builtin/cat-file.c:482
+#: builtin/cat-file.c:552
 msgid "show object type"
 msgstr "Objektart anzeigen"
 
-#: builtin/cat-file.c:483
+#: builtin/cat-file.c:553
 msgid "show object size"
 msgstr "Objektgröße anzeigen"
 
-#: builtin/cat-file.c:485
+#: builtin/cat-file.c:555
 msgid "exit with zero when there's no error"
 msgstr "mit Rückgabewert 0 beenden, wenn kein Fehler aufgetreten ist"
 
-#: builtin/cat-file.c:486
+#: builtin/cat-file.c:556
 msgid "pretty-print object's content"
 msgstr "ansprechende Anzeige des Objektinhaltes"
 
-#: builtin/cat-file.c:488
+#: builtin/cat-file.c:558
 msgid "for blob objects, run textconv on object's content"
 msgstr "eine Textkonvertierung auf den Inhalt von Blob-Objekten ausführen"
 
-#: builtin/cat-file.c:490
+#: builtin/cat-file.c:560
+msgid "for blob objects, run filters on object's content"
+msgstr "für Blob-Objekte, Filter auf Objekt-Inhalte ausführen"
+
+#: builtin/cat-file.c:561 git-submodule.sh:923
+msgid "blob"
+msgstr "Blob"
+
+#: builtin/cat-file.c:562
+msgid "use a specific path for --textconv/--filters"
+msgstr "einen bestimmten Pfad für --textconv/--filters verwenden"
+
+#: builtin/cat-file.c:564
 msgid "allow -s and -t to work with broken/corrupt objects"
 msgstr "-s und -t mit beschädigten Objekten erlauben"
 
-#: builtin/cat-file.c:491
+#: builtin/cat-file.c:565
 msgid "buffer --batch output"
 msgstr "Ausgabe von --batch puffern"
 
-#: builtin/cat-file.c:493
+#: builtin/cat-file.c:567
 msgid "show info and content of objects fed from the standard input"
 msgstr ""
 "Anzeige von Informationen und Inhalt von Objekten, gelesen von der Standard-"
 "Eingabe"
 
-#: builtin/cat-file.c:496
+#: builtin/cat-file.c:570
 msgid "show info about objects fed from the standard input"
 msgstr ""
 "Anzeige von Informationen über Objekte, gelesen von der Standard-Eingabe"
 
-#: builtin/cat-file.c:499
+#: builtin/cat-file.c:573
 msgid "follow in-tree symlinks (used with --batch or --batch-check)"
 msgstr ""
 "symbolischen Verknüpfungen innerhalb des Repositories folgen (verwendet mit "
 "--batch oder --batch-check)"
 
-#: builtin/cat-file.c:501
+#: builtin/cat-file.c:575
 msgid "show all objects with --batch or --batch-check"
 msgstr "alle Objekte mit --batch oder --batch-check anzeigen"
 
@@ -4814,7 +5402,7 @@ msgstr "alle Attribute einer Datei ausgeben"
 msgid "use .gitattributes only from the index"
 msgstr "nur .gitattributes vom Index verwenden"
 
-#: builtin/check-attr.c:21 builtin/check-ignore.c:22 builtin/hash-object.c:97
+#: builtin/check-attr.c:21 builtin/check-ignore.c:22 builtin/hash-object.c:98
 msgid "read file names from stdin"
 msgstr "Dateinamen von der Standard-Eingabe lesen"
 
@@ -4822,7 +5410,7 @@ msgstr "Dateinamen von der Standard-Eingabe lesen"
 msgid "terminate input and output records by a NUL character"
 msgstr "Einträge von Ein- und Ausgabe mit NUL-Zeichen abschließen"
 
-#: builtin/check-ignore.c:18 builtin/checkout.c:1138 builtin/gc.c:325
+#: builtin/check-ignore.c:18 builtin/checkout.c:1137 builtin/gc.c:325
 msgid "suppress progress reporting"
 msgstr "Fortschrittsanzeige unterdrücken"
 
@@ -4915,9 +5503,9 @@ msgid "write the content to temporary files"
 msgstr "den Inhalt in temporäre Dateien schreiben"
 
 #: builtin/checkout-index.c:174 builtin/column.c:30
-#: builtin/submodule--helper.c:488 builtin/submodule--helper.c:491
-#: builtin/submodule--helper.c:494 builtin/submodule--helper.c:497
-#: builtin/submodule--helper.c:830 builtin/worktree.c:469
+#: builtin/submodule--helper.c:595 builtin/submodule--helper.c:598
+#: builtin/submodule--helper.c:604 builtin/submodule--helper.c:951
+#: builtin/worktree.c:469
 msgid "string"
 msgstr "Zeichenkette"
 
@@ -4990,54 +5578,54 @@ msgstr ""
 msgid "path '%s' is unmerged"
 msgstr "Pfad '%s' ist nicht zusammengeführt."
 
-#: builtin/checkout.c:495
+#: builtin/checkout.c:494
 msgid "you need to resolve your current index first"
 msgstr "Sie müssen zuerst die Konflikte in Ihrem aktuellen Index auflösen."
 
-#: builtin/checkout.c:625
+#: builtin/checkout.c:624
 #, c-format
 msgid "Can not do reflog for '%s': %s\n"
 msgstr "Kann \"reflog\" für '%s' nicht durchführen: %s\n"
 
-#: builtin/checkout.c:664
+#: builtin/checkout.c:663
 msgid "HEAD is now at"
 msgstr "HEAD ist jetzt bei"
 
-#: builtin/checkout.c:668 builtin/clone.c:661
+#: builtin/checkout.c:667 builtin/clone.c:660
 msgid "unable to update HEAD"
 msgstr "Konnte HEAD nicht aktualisieren."
 
-#: builtin/checkout.c:672
+#: builtin/checkout.c:671
 #, c-format
 msgid "Reset branch '%s'\n"
 msgstr "Setze Branch '%s' neu\n"
 
-#: builtin/checkout.c:675
+#: builtin/checkout.c:674
 #, c-format
 msgid "Already on '%s'\n"
 msgstr "Bereits auf '%s'\n"
 
-#: builtin/checkout.c:679
+#: builtin/checkout.c:678
 #, c-format
 msgid "Switched to and reset branch '%s'\n"
 msgstr "Zu umgesetztem Branch '%s' gewechselt\n"
 
-#: builtin/checkout.c:681 builtin/checkout.c:1070
+#: builtin/checkout.c:680 builtin/checkout.c:1069
 #, c-format
 msgid "Switched to a new branch '%s'\n"
 msgstr "Zu neuem Branch '%s' gewechselt\n"
 
-#: builtin/checkout.c:683
+#: builtin/checkout.c:682
 #, c-format
 msgid "Switched to branch '%s'\n"
 msgstr "Zu Branch '%s' gewechselt\n"
 
-#: builtin/checkout.c:734
+#: builtin/checkout.c:733
 #, c-format
 msgid " ... and %d more.\n"
 msgstr " ... und %d weitere.\n"
 
-#: builtin/checkout.c:740
+#: builtin/checkout.c:739
 #, c-format
 msgid ""
 "Warning: you are leaving %d commit behind, not connected to\n"
@@ -5060,7 +5648,7 @@ msgstr[1] ""
 "\n"
 "%s\n"
 
-#: builtin/checkout.c:759
+#: builtin/checkout.c:758
 #, c-format
 msgid ""
 "If you want to keep it by creating a new branch, this may be a good time\n"
@@ -5087,152 +5675,152 @@ msgstr[1] ""
 " git branch <neuer-Branchname> %s\n"
 "\n"
 
-#: builtin/checkout.c:795
+#: builtin/checkout.c:794
 msgid "internal error in revision walk"
 msgstr "interner Fehler im Revisionsgang"
 
-#: builtin/checkout.c:799
+#: builtin/checkout.c:798
 msgid "Previous HEAD position was"
 msgstr "Vorherige Position von HEAD war"
 
-#: builtin/checkout.c:826 builtin/checkout.c:1065
+#: builtin/checkout.c:825 builtin/checkout.c:1064
 msgid "You are on a branch yet to be born"
 msgstr "Sie sind auf einem Branch, der noch geboren wird"
 
-#: builtin/checkout.c:971
+#: builtin/checkout.c:970
 #, c-format
 msgid "only one reference expected, %d given."
 msgstr "nur eine Referenz erwartet, %d gegeben."
 
-#: builtin/checkout.c:1011 builtin/worktree.c:214
+#: builtin/checkout.c:1010 builtin/worktree.c:214
 #, c-format
 msgid "invalid reference: %s"
 msgstr "Ungültige Referenz: %s"
 
-#: builtin/checkout.c:1040
+#: builtin/checkout.c:1039
 #, c-format
 msgid "reference is not a tree: %s"
 msgstr "Referenz ist kein \"Tree\"-Objekt: %s"
 
-#: builtin/checkout.c:1079
+#: builtin/checkout.c:1078
 msgid "paths cannot be used with switching branches"
 msgstr "Pfade können nicht beim Wechseln von Branches verwendet werden"
 
-#: builtin/checkout.c:1082 builtin/checkout.c:1086
+#: builtin/checkout.c:1081 builtin/checkout.c:1085
 #, c-format
 msgid "'%s' cannot be used with switching branches"
 msgstr "'%s' kann nicht beim Wechseln von Branches verwendet werden"
 
-#: builtin/checkout.c:1090 builtin/checkout.c:1093 builtin/checkout.c:1098
-#: builtin/checkout.c:1101
+#: builtin/checkout.c:1089 builtin/checkout.c:1092 builtin/checkout.c:1097
+#: builtin/checkout.c:1100
 #, c-format
 msgid "'%s' cannot be used with '%s'"
 msgstr "'%s' kann nicht mit '%s' verwendet werden"
 
-#: builtin/checkout.c:1106
+#: builtin/checkout.c:1105
 #, c-format
 msgid "Cannot switch branch to a non-commit '%s'"
 msgstr "Kann Branch nicht zu Nicht-Commit '%s' wechseln"
 
-#: builtin/checkout.c:1139 builtin/checkout.c:1141 builtin/clone.c:88
+#: builtin/checkout.c:1138 builtin/checkout.c:1140 builtin/clone.c:93
 #: builtin/remote.c:165 builtin/remote.c:167 builtin/worktree.c:324
 #: builtin/worktree.c:326
 msgid "branch"
 msgstr "Branch"
 
-#: builtin/checkout.c:1140
+#: builtin/checkout.c:1139
 msgid "create and checkout a new branch"
 msgstr "einen neuen Branch erzeugen und auschecken"
 
-#: builtin/checkout.c:1142
+#: builtin/checkout.c:1141
 msgid "create/reset and checkout a branch"
 msgstr "einen Branch erstellen/umsetzen und auschecken"
 
-#: builtin/checkout.c:1143
+#: builtin/checkout.c:1142
 msgid "create reflog for new branch"
 msgstr "das Reflog für den neuen Branch erzeugen"
 
-#: builtin/checkout.c:1144 builtin/worktree.c:328
+#: builtin/checkout.c:1143 builtin/worktree.c:328
 msgid "detach HEAD at named commit"
 msgstr "HEAD bei benanntem Commit loslösen"
 
-#: builtin/checkout.c:1145
+#: builtin/checkout.c:1144
 msgid "set upstream info for new branch"
 msgstr "Informationen zum Upstream-Branch für den neuen Branch setzen"
 
-#: builtin/checkout.c:1147
+#: builtin/checkout.c:1146
 msgid "new-branch"
 msgstr "neuer Branch"
 
-#: builtin/checkout.c:1147
+#: builtin/checkout.c:1146
 msgid "new unparented branch"
 msgstr "neuer Branch ohne Eltern-Commit"
 
-#: builtin/checkout.c:1148
+#: builtin/checkout.c:1147
 msgid "checkout our version for unmerged files"
 msgstr "unsere Variante für nicht zusammengeführte Dateien auschecken"
 
-#: builtin/checkout.c:1150
+#: builtin/checkout.c:1149
 msgid "checkout their version for unmerged files"
 msgstr "ihre Variante für nicht zusammengeführte Dateien auschecken"
 
-#: builtin/checkout.c:1152
+#: builtin/checkout.c:1151
 msgid "force checkout (throw away local modifications)"
 msgstr "Auschecken erzwingen (verwirft lokale Änderungen)"
 
-#: builtin/checkout.c:1153
+#: builtin/checkout.c:1152
 msgid "perform a 3-way merge with the new branch"
 msgstr "einen 3-Wege-Merge mit dem neuen Branch ausführen"
 
-#: builtin/checkout.c:1154 builtin/merge.c:231
+#: builtin/checkout.c:1153 builtin/merge.c:231
 msgid "update ignored files (default)"
 msgstr "ignorierte Dateien aktualisieren (Standard)"
 
-#: builtin/checkout.c:1155 builtin/log.c:1459 parse-options.h:250
+#: builtin/checkout.c:1154 builtin/log.c:1466 parse-options.h:251
 msgid "style"
 msgstr "Stil"
 
-#: builtin/checkout.c:1156
+#: builtin/checkout.c:1155
 msgid "conflict style (merge or diff3)"
 msgstr "Konfliktstil (merge oder diff3)"
 
-#: builtin/checkout.c:1159
+#: builtin/checkout.c:1158
 msgid "do not limit pathspecs to sparse entries only"
 msgstr "keine Einschränkung bei Pfadspezifikationen zum partiellen Auschecken"
 
-#: builtin/checkout.c:1161
+#: builtin/checkout.c:1160
 msgid "second guess 'git checkout <no-such-branch>'"
 msgstr "second guess 'git checkout <no-such-branch>'"
 
-#: builtin/checkout.c:1163
+#: builtin/checkout.c:1162
 msgid "do not check if another worktree is holding the given ref"
 msgstr ""
 "Prüfung, ob die Referenz bereits in einem anderen Arbeitsverzeichnis "
 "ausgecheckt wurde, deaktivieren"
 
-#: builtin/checkout.c:1164 builtin/clone.c:60 builtin/fetch.c:117
-#: builtin/merge.c:228 builtin/pull.c:116 builtin/push.c:536
+#: builtin/checkout.c:1163 builtin/clone.c:63 builtin/fetch.c:119
+#: builtin/merge.c:228 builtin/pull.c:117 builtin/push.c:536
 #: builtin/send-pack.c:168
 msgid "force progress reporting"
 msgstr "Fortschrittsanzeige erzwingen"
 
-#: builtin/checkout.c:1195
+#: builtin/checkout.c:1194
 msgid "-b, -B and --orphan are mutually exclusive"
 msgstr "Die Optionen -b, -B und --orphan schließen sich gegenseitig aus."
 
-#: builtin/checkout.c:1212
+#: builtin/checkout.c:1211
 msgid "--track needs a branch name"
 msgstr "Bei der Option --track muss ein Branchname angegeben werden."
 
-#: builtin/checkout.c:1217
+#: builtin/checkout.c:1216
 msgid "Missing branch name; try -b"
 msgstr "Vermisse Branchnamen; versuchen Sie -b"
 
-#: builtin/checkout.c:1253
+#: builtin/checkout.c:1252
 msgid "invalid path specification"
 msgstr "ungültige Pfadspezifikation"
 
-#: builtin/checkout.c:1260
+#: builtin/checkout.c:1259
 #, c-format
 msgid ""
 "Cannot update paths and switch to branch '%s' at the same time.\n"
@@ -5242,12 +5830,12 @@ msgstr ""
 "Haben Sie beabsichtigt '%s' auszuchecken, welcher nicht als Commit aufgelöst "
 "werden kann?"
 
-#: builtin/checkout.c:1265
+#: builtin/checkout.c:1264
 #, c-format
 msgid "git checkout: --detach does not take a path argument '%s'"
 msgstr "git checkout: --detach nimmt kein Pfad-Argument '%s'"
 
-#: builtin/checkout.c:1269
+#: builtin/checkout.c:1268
 msgid ""
 "git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
 "checking out of the index."
@@ -5399,8 +5987,8 @@ msgstr "interaktives Clean"
 msgid "remove whole directories"
 msgstr "ganze Verzeichnisse löschen"
 
-#: builtin/clean.c:875 builtin/describe.c:407 builtin/grep.c:724
-#: builtin/ls-files.c:457 builtin/name-rev.c:314 builtin/show-ref.c:182
+#: builtin/clean.c:875 builtin/describe.c:407 builtin/grep.c:725
+#: builtin/ls-files.c:536 builtin/name-rev.c:313 builtin/show-ref.c:182
 msgid "pattern"
 msgstr "Muster"
 
@@ -5440,113 +6028,134 @@ msgstr ""
 msgid "git clone [<options>] [--] <repo> [<dir>]"
 msgstr "git clone [<Optionen>] [--] <Repository> [<Verzeichnis>]"
 
-#: builtin/clone.c:62
+#: builtin/clone.c:65
 msgid "don't create a checkout"
 msgstr "kein Auschecken"
 
-#: builtin/clone.c:63 builtin/clone.c:65 builtin/init-db.c:476
+#: builtin/clone.c:66 builtin/clone.c:68 builtin/init-db.c:478
 msgid "create a bare repository"
 msgstr "ein Bare-Repository erstellen"
 
-#: builtin/clone.c:67
+#: builtin/clone.c:70
 msgid "create a mirror repository (implies bare)"
 msgstr "ein Spiegelarchiv erstellen (impliziert --bare)"
 
-#: builtin/clone.c:69
+#: builtin/clone.c:72
 msgid "to clone from a local repository"
 msgstr "von einem lokalen Repository klonen"
 
-#: builtin/clone.c:71
+#: builtin/clone.c:74
 msgid "don't use local hardlinks, always copy"
 msgstr "lokal keine harten Verweise verwenden, immer Kopien"
 
-#: builtin/clone.c:73
+#: builtin/clone.c:76
 msgid "setup as shared repository"
 msgstr "als verteiltes Repository einrichten"
 
-#: builtin/clone.c:75 builtin/clone.c:77
+#: builtin/clone.c:78 builtin/clone.c:80
 msgid "initialize submodules in the clone"
 msgstr "Submodule im Klon initialisieren"
 
-#: builtin/clone.c:79
+#: builtin/clone.c:82
 msgid "number of submodules cloned in parallel"
 msgstr "Anzahl der parallel zu klonenden Submodule"
 
-#: builtin/clone.c:80 builtin/init-db.c:473
+#: builtin/clone.c:83 builtin/init-db.c:475
 msgid "template-directory"
 msgstr "Vorlagenverzeichnis"
 
-#: builtin/clone.c:81 builtin/init-db.c:474
+#: builtin/clone.c:84 builtin/init-db.c:476
 msgid "directory from which templates will be used"
 msgstr "Verzeichnis, von welchem die Vorlagen verwendet werden"
 
-#: builtin/clone.c:83 builtin/submodule--helper.c:495
-#: builtin/submodule--helper.c:833
+#: builtin/clone.c:86 builtin/clone.c:88 builtin/submodule--helper.c:602
+#: builtin/submodule--helper.c:954
 msgid "reference repository"
 msgstr "Repository referenzieren"
 
-#: builtin/clone.c:85
+#: builtin/clone.c:90
 msgid "use --reference only while cloning"
 msgstr "--reference nur während des Klonens benutzen"
 
-#: builtin/clone.c:86 builtin/column.c:26 builtin/merge-file.c:44
+#: builtin/clone.c:91 builtin/column.c:26 builtin/merge-file.c:44
 msgid "name"
 msgstr "Name"
 
-#: builtin/clone.c:87
+#: builtin/clone.c:92
 msgid "use <name> instead of 'origin' to track upstream"
 msgstr "<Name> statt 'origin' für Upstream-Repository verwenden"
 
-#: builtin/clone.c:89
+#: builtin/clone.c:94
 msgid "checkout <branch> instead of the remote's HEAD"
 msgstr "<Branch> auschecken, anstatt HEAD des Remote-Repositories"
 
-#: builtin/clone.c:91
+#: builtin/clone.c:96
 msgid "path to git-upload-pack on the remote"
 msgstr "Pfad zu \"git-upload-pack\" auf der Gegenseite"
 
-#: builtin/clone.c:92 builtin/fetch.c:118 builtin/grep.c:667 builtin/pull.c:201
+#: builtin/clone.c:97 builtin/fetch.c:120 builtin/grep.c:668 builtin/pull.c:202
 msgid "depth"
 msgstr "Tiefe"
 
-#: builtin/clone.c:93
+#: builtin/clone.c:98
 msgid "create a shallow clone of that depth"
 msgstr ""
 "einen Klon mit unvollständiger Historie (shallow) in dieser Tiefe erstellen"
 
-#: builtin/clone.c:95
+#: builtin/clone.c:99 builtin/fetch.c:122 builtin/pack-objects.c:2848
+#: parse-options.h:142
+msgid "time"
+msgstr "Zeit"
+
+#: builtin/clone.c:100
+msgid "create a shallow clone since a specific time"
+msgstr ""
+"einen Klon mit unvollständiger Historie (shallow) seit einer bestimmten Zeit\n"
+"erstellen"
+
+#: builtin/clone.c:101 builtin/fetch.c:124
+msgid "revision"
+msgstr "Commit"
+
+#: builtin/clone.c:102 builtin/fetch.c:125
+msgid "deepen history of shallow clone by excluding rev"
+msgstr ""
+"die Historie eines Klons mit unvollständiger Historie (shallow) mittels\n"
+"Ausschluss eines Commits vertiefen"
+
+#: builtin/clone.c:104
 msgid "clone only one branch, HEAD or --branch"
 msgstr "nur einen Branch klonen, HEAD oder --branch"
 
-#: builtin/clone.c:97
+#: builtin/clone.c:106
 msgid "any cloned submodules will be shallow"
 msgstr "jedes geklonte Submodul mit unvollständiger Historie (shallow)"
 
-#: builtin/clone.c:98 builtin/init-db.c:482
+#: builtin/clone.c:107 builtin/init-db.c:484
 msgid "gitdir"
 msgstr ".git-Verzeichnis"
 
-#: builtin/clone.c:99 builtin/init-db.c:483
+#: builtin/clone.c:108 builtin/init-db.c:485
 msgid "separate git dir from working tree"
 msgstr "Git-Verzeichnis vom Arbeitsverzeichnis separieren"
 
-#: builtin/clone.c:100
+#: builtin/clone.c:109
 msgid "key=value"
 msgstr "Schlüssel=Wert"
 
-#: builtin/clone.c:101
+#: builtin/clone.c:110
 msgid "set config inside the new repository"
 msgstr "Konfiguration innerhalb des neuen Repositories setzen"
 
-#: builtin/clone.c:102 builtin/fetch.c:132 builtin/push.c:547
+#: builtin/clone.c:111 builtin/fetch.c:140 builtin/push.c:547
 msgid "use IPv4 addresses only"
 msgstr "nur IPv4-Adressen benutzen"
 
-#: builtin/clone.c:104 builtin/fetch.c:134 builtin/push.c:549
+#: builtin/clone.c:113 builtin/fetch.c:142 builtin/push.c:549
 msgid "use IPv6 addresses only"
 msgstr "nur IPv6-Adressen benutzen"
 
-#: builtin/clone.c:241
+#: builtin/clone.c:250
 msgid ""
 "No directory name could be guessed.\n"
 "Please specify a directory on the command line"
@@ -5554,62 +6163,42 @@ msgstr ""
 "Konnte keinen Verzeichnisnamen erraten.\n"
 "Bitte geben Sie ein Verzeichnis auf der Befehlszeile an."
 
-#: builtin/clone.c:307
-#, c-format
-msgid "reference repository '%s' as a linked checkout is not supported yet."
-msgstr ""
-"Referenziertes Repository '%s' wird noch nicht als verknüpftes\n"
-"Arbeitsverzeichnis unterstützt."
-
-#: builtin/clone.c:309
-#, c-format
-msgid "reference repository '%s' is not a local repository."
-msgstr "Referenziertes Repository '%s' ist kein lokales Repository."
-
-#: builtin/clone.c:314
-#, c-format
-msgid "reference repository '%s' is shallow"
-msgstr ""
-"Referenziertes Repository '%s' hat eine unvollständige Historie (shallow)."
-
-#: builtin/clone.c:317
+#: builtin/clone.c:303
 #, c-format
-msgid "reference repository '%s' is grafted"
-msgstr ""
-"Referenziertes Repository '%s' ist mit künstlichen Vorgängern (\"grafts\") "
-"eingehängt."
+msgid "info: Could not add alternate for '%s': %s\n"
+msgstr "info: Konnte Alternative für '%s' nicht hinzufügen: %s\n"
 
-#: builtin/clone.c:376
+#: builtin/clone.c:375
 #, c-format
 msgid "failed to open '%s'"
 msgstr "Fehler beim Öffnen von '%s'"
 
-#: builtin/clone.c:384
+#: builtin/clone.c:383
 #, c-format
 msgid "%s exists and is not a directory"
 msgstr "%s existiert und ist kein Verzeichnis"
 
-#: builtin/clone.c:398
+#: builtin/clone.c:397
 #, c-format
 msgid "failed to stat %s\n"
 msgstr "Konnte %s nicht lesen\n"
 
-#: builtin/clone.c:420
+#: builtin/clone.c:419
 #, c-format
 msgid "failed to create link '%s'"
 msgstr "Konnte Verweis '%s' nicht erstellen"
 
-#: builtin/clone.c:424
+#: builtin/clone.c:423
 #, c-format
 msgid "failed to copy file to '%s'"
 msgstr "Konnte Datei nicht nach '%s' kopieren"
 
-#: builtin/clone.c:449
+#: builtin/clone.c:448
 #, c-format
 msgid "done.\n"
 msgstr "Fertig.\n"
 
-#: builtin/clone.c:461
+#: builtin/clone.c:460
 msgid ""
 "Clone succeeded, but checkout failed.\n"
 "You can inspect what was checked out with 'git status'\n"
@@ -5619,127 +6208,141 @@ msgstr ""
 "Sie können mit 'git status' prüfen, was ausgecheckt worden ist\n"
 "und das Auschecken mit 'git checkout -f HEAD' erneut versuchen.\n"
 
-#: builtin/clone.c:538
+#: builtin/clone.c:537
 #, c-format
 msgid "Could not find remote branch %s to clone."
 msgstr "Konnte zu klonenden Remote-Branch %s nicht finden."
 
-#: builtin/clone.c:633
+#: builtin/clone.c:632
 msgid "remote did not send all necessary objects"
 msgstr "Remote-Repository hat nicht alle erforderlichen Objekte gesendet."
 
-#: builtin/clone.c:649
+#: builtin/clone.c:648
 #, c-format
 msgid "unable to update %s"
 msgstr "kann %s nicht aktualisieren"
 
-#: builtin/clone.c:698
+#: builtin/clone.c:697
 msgid "remote HEAD refers to nonexistent ref, unable to checkout.\n"
 msgstr ""
 "Externer HEAD bezieht sich auf eine nicht existierende Referenz und kann "
 "nicht ausgecheckt werden.\n"
 
-#: builtin/clone.c:729
+#: builtin/clone.c:728
 msgid "unable to checkout working tree"
 msgstr "Arbeitsverzeichnis konnte nicht ausgecheckt werden"
 
-#: builtin/clone.c:766
+#: builtin/clone.c:768
 msgid "unable to write parameters to config file"
 msgstr "konnte Parameter nicht in Konfigurationsdatei schreiben"
 
-#: builtin/clone.c:829
+#: builtin/clone.c:831
 msgid "cannot repack to clean up"
 msgstr "Kann \"repack\" zum Aufräumen nicht aufrufen"
 
-#: builtin/clone.c:831
+#: builtin/clone.c:833
 msgid "cannot unlink temporary alternates file"
 msgstr "Kann temporäre \"alternates\"-Datei nicht entfernen"
 
-#: builtin/clone.c:863 builtin/receive-pack.c:1855
+#: builtin/clone.c:866 builtin/receive-pack.c:1895
 msgid "Too many arguments."
 msgstr "Zu viele Argumente."
 
-#: builtin/clone.c:867
+#: builtin/clone.c:870
 msgid "You must specify a repository to clone."
 msgstr "Sie müssen ein Repository zum Klonen angeben."
 
-#: builtin/clone.c:878
+#: builtin/clone.c:883
 #, c-format
 msgid "--bare and --origin %s options are incompatible."
 msgstr "Die Optionen --bare und --origin %s sind inkompatibel."
 
-#: builtin/clone.c:881
+#: builtin/clone.c:886
 msgid "--bare and --separate-git-dir are incompatible."
 msgstr "Die Optionen --bare und --separate-git-dir sind inkompatibel."
 
-#: builtin/clone.c:894
+#: builtin/clone.c:899
 #, c-format
 msgid "repository '%s' does not exist"
 msgstr "Repository '%s' existiert nicht."
 
-#: builtin/clone.c:900 builtin/fetch.c:1293
+#: builtin/clone.c:905 builtin/fetch.c:1338
 #, c-format
 msgid "depth %s is not a positive number"
 msgstr "Tiefe %s ist keine positive Zahl"
 
-#: builtin/clone.c:910
+#: builtin/clone.c:915
 #, c-format
 msgid "destination path '%s' already exists and is not an empty directory."
 msgstr "Zielpfad '%s' existiert bereits und ist kein leeres Verzeichnis."
 
-#: builtin/clone.c:920
+#: builtin/clone.c:925
 #, c-format
 msgid "working tree '%s' already exists."
 msgstr "Arbeitsverzeichnis '%s' existiert bereits."
 
-#: builtin/clone.c:935 builtin/clone.c:946 builtin/submodule--helper.c:544
+#: builtin/clone.c:940 builtin/clone.c:951 builtin/submodule--helper.c:657
 #: builtin/worktree.c:222 builtin/worktree.c:249
 #, c-format
 msgid "could not create leading directories of '%s'"
 msgstr "Konnte führende Verzeichnisse von '%s' nicht erstellen."
 
-#: builtin/clone.c:938
+#: builtin/clone.c:943
 #, c-format
 msgid "could not create work tree dir '%s'"
 msgstr "Konnte Arbeitsverzeichnis '%s' nicht erstellen"
 
-#: builtin/clone.c:956
+#: builtin/clone.c:955
 #, c-format
 msgid "Cloning into bare repository '%s'...\n"
 msgstr "Klone in Bare-Repository '%s' ...\n"
 
-#: builtin/clone.c:958
+#: builtin/clone.c:957
 #, c-format
 msgid "Cloning into '%s'...\n"
 msgstr "Klone nach '%s' ...\n"
 
-#: builtin/clone.c:997
+#: builtin/clone.c:963
+msgid ""
+"clone --recursive is not compatible with both --reference and --reference-if-"
+"able"
+msgstr "'clone --recursive' ist nicht kompatibel mit --reference und --reference-if-able"
+
+#: builtin/clone.c:1019
 msgid "--depth is ignored in local clones; use file:// instead."
 msgstr ""
 "Die Option --depth wird in lokalen Klonen ignoriert; benutzen Sie "
 "stattdessen file://"
 
-#: builtin/clone.c:1000
+#: builtin/clone.c:1021
+msgid "--shallow-since is ignored in local clones; use file:// instead."
+msgstr "--shallow-since wird in lokalen Klonen ignoriert; benutzen Sie stattdessen file://"
+
+#: builtin/clone.c:1023
+msgid "--shallow-exclude is ignored in local clones; use file:// instead."
+msgstr "--shallow-exclude wird in lokalen Klonen ignoriert; benutzen Sie stattdessen file://"
+
+#: builtin/clone.c:1026
 msgid "source repository is shallow, ignoring --local"
 msgstr ""
 "Quelle ist ein Repository mit unvollständiger Historie (shallow),ignoriere --"
 "local"
 
-#: builtin/clone.c:1005
+#: builtin/clone.c:1031
 msgid "--local is ignored"
 msgstr "--local wird ignoriert"
 
-#: builtin/clone.c:1009
+#: builtin/clone.c:1035
 #, c-format
 msgid "Don't know how to clone %s"
 msgstr "Weiß nicht wie %s zu klonen ist."
 
-#: builtin/clone.c:1058 builtin/clone.c:1066
+#: builtin/clone.c:1090 builtin/clone.c:1098
 #, c-format
 msgid "Remote branch %s not found in upstream %s"
 msgstr "Remote-Branch %s nicht im Upstream-Repository %s gefunden"
 
-#: builtin/clone.c:1069
+#: builtin/clone.c:1101
 msgid "You appear to have cloned an empty repository."
 msgstr "Sie scheinen ein leeres Repository geklont zu haben."
 
@@ -5882,67 +6485,67 @@ msgstr ""
 "Benutzen Sie anschließend \"git cherry-pick --continue\", um die\n"
 "Cherry-Pick-Operation mit den verbleibenden Commits fortzusetzen.\n"
 
-#: builtin/commit.c:308
+#: builtin/commit.c:318
 msgid "failed to unpack HEAD tree object"
 msgstr "Fehler beim Entpacken des \"Tree\"-Objektes von HEAD."
 
-#: builtin/commit.c:349
+#: builtin/commit.c:359
 msgid "unable to create temporary index"
 msgstr "Konnte temporären Index nicht erstellen."
 
-#: builtin/commit.c:355
+#: builtin/commit.c:365
 msgid "interactive add failed"
 msgstr "interaktives Hinzufügen fehlgeschlagen"
 
-#: builtin/commit.c:368
+#: builtin/commit.c:378
 msgid "unable to update temporary index"
 msgstr "Konnte temporären Index nicht aktualisieren."
 
-#: builtin/commit.c:370
+#: builtin/commit.c:380
 msgid "Failed to update main cache tree"
 msgstr "Konnte Haupt-Cache-Verzeichnis nicht aktualisieren"
 
-#: builtin/commit.c:394 builtin/commit.c:417 builtin/commit.c:466
+#: builtin/commit.c:404 builtin/commit.c:427 builtin/commit.c:476
 msgid "unable to write new_index file"
 msgstr "Konnte new_index Datei nicht schreiben"
 
-#: builtin/commit.c:448
+#: builtin/commit.c:458
 msgid "cannot do a partial commit during a merge."
 msgstr "Kann keinen Teil-Commit durchführen, während ein Merge im Gange ist."
 
-#: builtin/commit.c:450
+#: builtin/commit.c:460
 msgid "cannot do a partial commit during a cherry-pick."
 msgstr ""
 "Kann keinen Teil-Commit durchführen, während \"cherry-pick\" im Gange ist."
 
-#: builtin/commit.c:459
+#: builtin/commit.c:469
 msgid "cannot read the index"
 msgstr "Kann Index nicht lesen"
 
-#: builtin/commit.c:478
+#: builtin/commit.c:488
 msgid "unable to write temporary index file"
 msgstr "Konnte temporäre Index-Datei nicht schreiben."
 
-#: builtin/commit.c:583
+#: builtin/commit.c:582
 #, c-format
 msgid "commit '%s' lacks author header"
 msgstr "Commit '%s' fehlt Autor-Kopfbereich"
 
-#: builtin/commit.c:585
+#: builtin/commit.c:584
 #, c-format
 msgid "commit '%s' has malformed author line"
 msgstr "Commit '%s' hat fehlerhafte Autor-Zeile"
 
-#: builtin/commit.c:604
+#: builtin/commit.c:603
 msgid "malformed --author parameter"
 msgstr "Fehlerhafter --author Parameter"
 
-#: builtin/commit.c:612
+#: builtin/commit.c:611
 #, c-format
 msgid "invalid date format: %s"
 msgstr "Ungültiges Datumsformat: %s"
 
-#: builtin/commit.c:656
+#: builtin/commit.c:655
 msgid ""
 "unable to select a comment character that is not used\n"
 "in the current commit message"
@@ -5950,38 +6553,38 @@ msgstr ""
 "Konnte kein Kommentar-Zeichen auswählen, das nicht in\n"
 "der aktuellen Commit-Beschreibung verwendet wird."
 
-#: builtin/commit.c:693 builtin/commit.c:726 builtin/commit.c:1092
+#: builtin/commit.c:692 builtin/commit.c:725 builtin/commit.c:1096
 #, c-format
 msgid "could not lookup commit %s"
 msgstr "Konnte Commit %s nicht nachschlagen"
 
-#: builtin/commit.c:705 builtin/shortlog.c:286
+#: builtin/commit.c:704 builtin/shortlog.c:286
 #, c-format
 msgid "(reading log message from standard input)\n"
 msgstr "(lese Log-Nachricht von Standard-Eingabe)\n"
 
-#: builtin/commit.c:707
+#: builtin/commit.c:706
 msgid "could not read log from standard input"
 msgstr "Konnte Log nicht von Standard-Eingabe lesen."
 
-#: builtin/commit.c:711
+#: builtin/commit.c:710
 #, c-format
 msgid "could not read log file '%s'"
 msgstr "Konnte Log-Datei '%s' nicht lesen"
 
-#: builtin/commit.c:738 builtin/commit.c:746
+#: builtin/commit.c:737 builtin/commit.c:745
 msgid "could not read SQUASH_MSG"
 msgstr "Konnte SQUASH_MSG nicht lesen"
 
-#: builtin/commit.c:743
+#: builtin/commit.c:742
 msgid "could not read MERGE_MSG"
 msgstr "Konnte MERGE_MSG nicht lesen"
 
-#: builtin/commit.c:797
+#: builtin/commit.c:796
 msgid "could not write commit template"
 msgstr "Konnte Commit-Vorlage nicht schreiben"
 
-#: builtin/commit.c:815
+#: builtin/commit.c:814
 #, c-format
 msgid ""
 "\n"
@@ -5996,7 +6599,7 @@ msgstr ""
 "\t%s\n"
 "und versuchen Sie es erneut.\n"
 
-#: builtin/commit.c:820
+#: builtin/commit.c:819
 #, c-format
 msgid ""
 "\n"
@@ -6011,7 +6614,7 @@ msgstr ""
 "\t%s\n"
 "und versuchen Sie es erneut.\n"
 
-#: builtin/commit.c:833
+#: builtin/commit.c:832
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
@@ -6021,7 +6624,7 @@ msgstr ""
 "die mit '%c' beginnen, werden ignoriert, und eine leere Beschreibung\n"
 "bricht den Commit ab.\n"
 
-#: builtin/commit.c:840
+#: builtin/commit.c:839
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
@@ -6034,157 +6637,161 @@ msgstr ""
 "entfernen.\n"
 "Eine leere Beschreibung bricht den Commit ab.\n"
 
-#: builtin/commit.c:860
+#: builtin/commit.c:859
 #, c-format
 msgid "%sAuthor:    %.*s <%.*s>"
 msgstr "%sAutor:           %.*s <%.*s>"
 
-#: builtin/commit.c:868
+#: builtin/commit.c:867
 #, c-format
 msgid "%sDate:      %s"
 msgstr "%sDatum:            %s"
 
-#: builtin/commit.c:875
+#: builtin/commit.c:874
 #, c-format
 msgid "%sCommitter: %.*s <%.*s>"
 msgstr "%sCommit-Ersteller: %.*s <%.*s>"
 
-#: builtin/commit.c:893
+#: builtin/commit.c:892
 msgid "Cannot read index"
 msgstr "Kann Index nicht lesen"
 
-#: builtin/commit.c:950
+#: builtin/commit.c:954
 msgid "Error building trees"
 msgstr "Fehler beim Erzeugen der \"Tree\"-Objekte"
 
-#: builtin/commit.c:965 builtin/tag.c:266
+#: builtin/commit.c:969 builtin/tag.c:266
 #, c-format
 msgid "Please supply the message using either -m or -F option.\n"
 msgstr ""
 "Bitte liefern Sie eine Beschreibung entweder mit der Option -m oder -F.\n"
 
-#: builtin/commit.c:1067
+#: builtin/commit.c:1071
 #, c-format
 msgid "--author '%s' is not 'Name <email>' and matches no existing author"
 msgstr ""
 "--author '%s' ist nicht im Format 'Name <E-Mail>' und stimmt mit keinem "
 "vorhandenen Autor überein"
 
-#: builtin/commit.c:1082 builtin/commit.c:1322
+#: builtin/commit.c:1086 builtin/commit.c:1327
 #, c-format
 msgid "Invalid untracked files mode '%s'"
 msgstr "Ungültiger Modus '%s' für unversionierte Dateien"
 
-#: builtin/commit.c:1119
+#: builtin/commit.c:1124
 msgid "--long and -z are incompatible"
 msgstr "Die Optionen --long und -z sind inkompatibel."
 
-#: builtin/commit.c:1149
+#: builtin/commit.c:1154
 msgid "Using both --reset-author and --author does not make sense"
 msgstr ""
 "Die Optionen --reset-author und --author können nicht gemeinsam verwendet "
 "werden."
 
-#: builtin/commit.c:1158
+#: builtin/commit.c:1163
 msgid "You have nothing to amend."
 msgstr "Sie haben nichts für \"--amend\"."
 
-#: builtin/commit.c:1161
+#: builtin/commit.c:1166
 msgid "You are in the middle of a merge -- cannot amend."
 msgstr "Ein Merge ist im Gange -- kann \"--amend\" nicht ausführen."
 
-#: builtin/commit.c:1163
+#: builtin/commit.c:1168
 msgid "You are in the middle of a cherry-pick -- cannot amend."
 msgstr "\"cherry-pick\" ist im Gange -- kann \"--amend\" nicht ausführen."
 
-#: builtin/commit.c:1166
+#: builtin/commit.c:1171
 msgid "Options --squash and --fixup cannot be used together"
 msgstr ""
 "Die Optionen --squash und --fixup können nicht gemeinsam verwendet werden."
 
-#: builtin/commit.c:1176
+#: builtin/commit.c:1181
 msgid "Only one of -c/-C/-F/--fixup can be used."
 msgstr "Es kann nur eine Option von -c/-C/-F/--fixup verwendet werden."
 
-#: builtin/commit.c:1178
+#: builtin/commit.c:1183
 msgid "Option -m cannot be combined with -c/-C/-F/--fixup."
 msgstr "Die Option -m kann nicht mit -c/-C/-F/--fixup kombiniert werden."
 
-#: builtin/commit.c:1186
+#: builtin/commit.c:1191
 msgid "--reset-author can be used only with -C, -c or --amend."
 msgstr ""
 "Die Option --reset--author kann nur mit -C, -c oder --amend verwendet werden."
 
-#: builtin/commit.c:1203
+#: builtin/commit.c:1208
 msgid "Only one of --include/--only/--all/--interactive/--patch can be used."
 msgstr ""
 "Es kann nur eine Option von --include/--only/--all/--interactive/--patch "
 "verwendet werden."
 
-#: builtin/commit.c:1205
+#: builtin/commit.c:1210
 msgid "No paths with --include/--only does not make sense."
 msgstr ""
 "Die Optionen --include und --only können nur mit der Angabe von Pfaden "
 "verwendet werden."
 
-#: builtin/commit.c:1207
+#: builtin/commit.c:1212
 msgid "Clever... amending the last one with dirty index."
 msgstr "Klug ... den letzten Commit mit einem geänderten Index nachbessern."
 
-#: builtin/commit.c:1209
+#: builtin/commit.c:1214
 msgid "Explicit paths specified without -i or -o; assuming --only paths..."
 msgstr "Explizite Pfade ohne -i oder -o angegeben; nehme --only an"
 
-#: builtin/commit.c:1221 builtin/tag.c:474
+#: builtin/commit.c:1226 builtin/tag.c:474
 #, c-format
 msgid "Invalid cleanup mode %s"
 msgstr "Ungültiger \"cleanup\" Modus %s"
 
-#: builtin/commit.c:1226
+#: builtin/commit.c:1231
 msgid "Paths with -a does not make sense."
 msgstr "Die Option -a kann nicht mit der Angabe von Pfaden verwendet werden."
 
-#: builtin/commit.c:1336 builtin/commit.c:1622
+#: builtin/commit.c:1341 builtin/commit.c:1617
 msgid "show status concisely"
 msgstr "Status im Kurzformat anzeigen"
 
-#: builtin/commit.c:1338 builtin/commit.c:1624
+#: builtin/commit.c:1343 builtin/commit.c:1619
 msgid "show branch information"
 msgstr "Branchinformationen anzeigen"
 
-#: builtin/commit.c:1340 builtin/commit.c:1626 builtin/push.c:522
+#: builtin/commit.c:1345
+msgid "version"
+msgstr "Version"
+
+#: builtin/commit.c:1345 builtin/commit.c:1621 builtin/push.c:522
 #: builtin/worktree.c:440
 msgid "machine-readable output"
 msgstr "maschinenlesbare Ausgabe"
 
-#: builtin/commit.c:1343 builtin/commit.c:1628
+#: builtin/commit.c:1348 builtin/commit.c:1623
 msgid "show status in long format (default)"
 msgstr "Status im Langformat anzeigen (Standard)"
 
-#: builtin/commit.c:1346 builtin/commit.c:1631
+#: builtin/commit.c:1351 builtin/commit.c:1626
 msgid "terminate entries with NUL"
 msgstr "Einträge mit NUL-Zeichen abschließen"
 
-#: builtin/commit.c:1348 builtin/commit.c:1634 builtin/fast-export.c:981
+#: builtin/commit.c:1353 builtin/commit.c:1629 builtin/fast-export.c:981
 #: builtin/fast-export.c:984 builtin/tag.c:353
 msgid "mode"
 msgstr "Modus"
 
-#: builtin/commit.c:1349 builtin/commit.c:1634
+#: builtin/commit.c:1354 builtin/commit.c:1629
 msgid "show untracked files, optional modes: all, normal, no. (Default: all)"
 msgstr ""
 "unversionierte Dateien anzeigen, optionale Modi: all, normal, no. (Standard: "
 "all)"
 
-#: builtin/commit.c:1352
+#: builtin/commit.c:1357
 msgid "show ignored files"
 msgstr "ignorierte Dateien anzeigen"
 
-#: builtin/commit.c:1353 parse-options.h:155
+#: builtin/commit.c:1358 parse-options.h:155
 msgid "when"
 msgstr "wann"
 
-#: builtin/commit.c:1354
+#: builtin/commit.c:1359
 msgid ""
 "ignore changes to submodules, optional when: all, dirty, untracked. "
 "(Default: all)"
@@ -6192,203 +6799,203 @@ msgstr ""
 "Änderungen in Submodulen ignorieren, optional wenn: all, dirty, untracked. "
 "(Standard: all)"
 
-#: builtin/commit.c:1356
+#: builtin/commit.c:1361
 msgid "list untracked files in columns"
 msgstr "unversionierte Dateien in Spalten auflisten"
 
-#: builtin/commit.c:1442
+#: builtin/commit.c:1437
 msgid "couldn't look up newly created commit"
 msgstr "Konnte neu erstellten Commit nicht nachschlagen."
 
-#: builtin/commit.c:1444
+#: builtin/commit.c:1439
 msgid "could not parse newly created commit"
 msgstr "Konnte neulich erstellten Commit nicht analysieren."
 
-#: builtin/commit.c:1489
+#: builtin/commit.c:1484
 msgid "detached HEAD"
 msgstr "losgelöster HEAD"
 
-#: builtin/commit.c:1492
+#: builtin/commit.c:1487
 msgid " (root-commit)"
 msgstr " (Basis-Commit)"
 
-#: builtin/commit.c:1592
+#: builtin/commit.c:1587
 msgid "suppress summary after successful commit"
 msgstr "Zusammenfassung nach erfolgreichem Commit unterdrücken"
 
-#: builtin/commit.c:1593
+#: builtin/commit.c:1588
 msgid "show diff in commit message template"
 msgstr "Unterschiede in Commit-Beschreibungsvorlage anzeigen"
 
-#: builtin/commit.c:1595
+#: builtin/commit.c:1590
 msgid "Commit message options"
 msgstr "Optionen für Commit-Beschreibung"
 
-#: builtin/commit.c:1596 builtin/tag.c:351
+#: builtin/commit.c:1591 builtin/tag.c:351
 msgid "read message from file"
 msgstr "Beschreibung von Datei lesen"
 
-#: builtin/commit.c:1597
+#: builtin/commit.c:1592
 msgid "author"
 msgstr "Autor"
 
-#: builtin/commit.c:1597
+#: builtin/commit.c:1592
 msgid "override author for commit"
 msgstr "Autor eines Commits überschreiben"
 
-#: builtin/commit.c:1598 builtin/gc.c:326
+#: builtin/commit.c:1593 builtin/gc.c:326
 msgid "date"
 msgstr "Datum"
 
-#: builtin/commit.c:1598
+#: builtin/commit.c:1593
 msgid "override date for commit"
 msgstr "Datum eines Commits überschreiben"
 
-#: builtin/commit.c:1599 builtin/merge.c:220 builtin/notes.c:396
-#: builtin/notes.c:559 builtin/tag.c:349
+#: builtin/commit.c:1594 builtin/merge.c:220 builtin/notes.c:398
+#: builtin/notes.c:561 builtin/tag.c:349
 msgid "message"
 msgstr "Beschreibung"
 
-#: builtin/commit.c:1599
+#: builtin/commit.c:1594
 msgid "commit message"
 msgstr "Commit-Beschreibung"
 
-#: builtin/commit.c:1600 builtin/commit.c:1601 builtin/commit.c:1602
-#: builtin/commit.c:1603 parse-options.h:256 ref-filter.h:79
+#: builtin/commit.c:1595 builtin/commit.c:1596 builtin/commit.c:1597
+#: builtin/commit.c:1598 parse-options.h:257 ref-filter.h:79
 msgid "commit"
 msgstr "Commit"
 
-#: builtin/commit.c:1600
+#: builtin/commit.c:1595
 msgid "reuse and edit message from specified commit"
 msgstr "Beschreibung des angegebenen Commits wiederverwenden und editieren"
 
-#: builtin/commit.c:1601
+#: builtin/commit.c:1596
 msgid "reuse message from specified commit"
 msgstr "Beschreibung des angegebenen Commits wiederverwenden"
 
-#: builtin/commit.c:1602
+#: builtin/commit.c:1597
 msgid "use autosquash formatted message to fixup specified commit"
 msgstr ""
 "eine automatisch zusammengesetzte Beschreibung zum Nachbessern des "
 "angegebenen Commits verwenden"
 
-#: builtin/commit.c:1603
+#: builtin/commit.c:1598
 msgid "use autosquash formatted message to squash specified commit"
 msgstr ""
 "eine automatisch zusammengesetzte Beschreibung beim \"squash\" des "
 "angegebenen Commits verwenden"
 
-#: builtin/commit.c:1604
+#: builtin/commit.c:1599
 msgid "the commit is authored by me now (used with -C/-c/--amend)"
 msgstr "Sie als Autor des Commits setzen (verwendet mit -C/-c/--amend)"
 
-#: builtin/commit.c:1605 builtin/log.c:1409 builtin/revert.c:86
+#: builtin/commit.c:1600 builtin/log.c:1413 builtin/revert.c:86
 msgid "add Signed-off-by:"
 msgstr "'Signed-off-by:'-Zeile hinzufügen"
 
-#: builtin/commit.c:1606
+#: builtin/commit.c:1601
 msgid "use specified template file"
 msgstr "angegebene Vorlagendatei verwenden"
 
-#: builtin/commit.c:1607
+#: builtin/commit.c:1602
 msgid "force edit of commit"
 msgstr "Bearbeitung des Commits erzwingen"
 
-#: builtin/commit.c:1608
+#: builtin/commit.c:1603
 msgid "default"
 msgstr "Standard"
 
-#: builtin/commit.c:1608 builtin/tag.c:354
+#: builtin/commit.c:1603 builtin/tag.c:354
 msgid "how to strip spaces and #comments from message"
 msgstr ""
 "wie Leerzeichen und #Kommentare von der Beschreibung getrennt werden sollen"
 
-#: builtin/commit.c:1609
+#: builtin/commit.c:1604
 msgid "include status in commit message template"
 msgstr "Status in die Commit-Beschreibungsvorlage einfügen"
 
-#: builtin/commit.c:1611 builtin/merge.c:230 builtin/pull.c:165
+#: builtin/commit.c:1606 builtin/merge.c:230 builtin/pull.c:166
 #: builtin/revert.c:93
 msgid "GPG sign commit"
 msgstr "Commit mit GPG signieren"
 
-#: builtin/commit.c:1614
+#: builtin/commit.c:1609
 msgid "Commit contents options"
 msgstr "Optionen für Commit-Inhalt"
 
-#: builtin/commit.c:1615
+#: builtin/commit.c:1610
 msgid "commit all changed files"
 msgstr "alle geänderten Dateien committen"
 
-#: builtin/commit.c:1616
+#: builtin/commit.c:1611
 msgid "add specified files to index for commit"
 msgstr "die angegebenen Dateien zusätzlich zum Commit vormerken"
 
-#: builtin/commit.c:1617
+#: builtin/commit.c:1612
 msgid "interactively add files"
 msgstr "interaktives Hinzufügen von Dateien"
 
-#: builtin/commit.c:1618
+#: builtin/commit.c:1613
 msgid "interactively add changes"
 msgstr "interaktives Hinzufügen von Änderungen"
 
-#: builtin/commit.c:1619
+#: builtin/commit.c:1614
 msgid "commit only specified files"
 msgstr "nur die angegebenen Dateien committen"
 
-#: builtin/commit.c:1620
+#: builtin/commit.c:1615
 msgid "bypass pre-commit and commit-msg hooks"
 msgstr "Hooks pre-commit und commit-msg umgehen"
 
-#: builtin/commit.c:1621
+#: builtin/commit.c:1616
 msgid "show what would be committed"
 msgstr "anzeigen, was committet werden würde"
 
-#: builtin/commit.c:1632
+#: builtin/commit.c:1627
 msgid "amend previous commit"
 msgstr "vorherigen Commit ändern"
 
-#: builtin/commit.c:1633
+#: builtin/commit.c:1628
 msgid "bypass post-rewrite hook"
 msgstr "\"post-rewrite hook\" umgehen"
 
-#: builtin/commit.c:1638
+#: builtin/commit.c:1633
 msgid "ok to record an empty change"
 msgstr "Aufzeichnung einer leeren Änderung erlauben"
 
-#: builtin/commit.c:1640
+#: builtin/commit.c:1635
 msgid "ok to record a change with an empty message"
 msgstr "Aufzeichnung einer Änderung mit einer leeren Beschreibung erlauben"
 
-#: builtin/commit.c:1669
+#: builtin/commit.c:1664
 msgid "could not parse HEAD commit"
 msgstr "Konnte Commit von HEAD nicht analysieren."
 
-#: builtin/commit.c:1719
+#: builtin/commit.c:1712
 #, c-format
 msgid "Corrupt MERGE_HEAD file (%s)"
 msgstr "Beschädigte MERGE_HEAD-Datei (%s)"
 
-#: builtin/commit.c:1726
+#: builtin/commit.c:1719
 msgid "could not read MERGE_MODE"
 msgstr "Konnte MERGE_MODE nicht lesen"
 
-#: builtin/commit.c:1745
+#: builtin/commit.c:1738
 #, c-format
 msgid "could not read commit message: %s"
 msgstr "Konnte Commit-Beschreibung nicht lesen: %s"
 
-#: builtin/commit.c:1756
+#: builtin/commit.c:1749
 #, c-format
 msgid "Aborting commit; you did not edit the message.\n"
 msgstr "Commit abgebrochen; Sie haben die Beschreibung nicht editiert.\n"
 
-#: builtin/commit.c:1761
+#: builtin/commit.c:1754
 #, c-format
 msgid "Aborting commit due to empty commit message.\n"
 msgstr "Commit aufgrund leerer Beschreibung abgebrochen.\n"
 
-#: builtin/commit.c:1809
+#: builtin/commit.c:1802
 msgid ""
 "Repository has been updated, but unable to write\n"
 "new_index file. Check that disk is not full and quota is\n"
@@ -6557,11 +7164,21 @@ msgstr ""
 msgid "cannot create configuration file %s"
 msgstr "Konnte Konfigurationsdatei '%s' nicht erstellen."
 
-#: builtin/count-objects.c:77
+#: builtin/config.c:625
+#, c-format
+msgid ""
+"cannot overwrite multiple values with a single value\n"
+"       Use a regexp, --add or --replace-all to change %s."
+msgstr ""
+"kann nicht mehrere Werte mit einem einzigen Wert überschreiben\n"
+"       Benutzen Sie einen regulären Ausdruck, --add oder --replace, um %s\n"
+"       zu ändern."
+
+#: builtin/count-objects.c:86
 msgid "git count-objects [-v] [-H | --human-readable]"
 msgstr "git count-objects [-v] [-H | --human-readable]"
 
-#: builtin/count-objects.c:87
+#: builtin/count-objects.c:96
 msgid "print sizes in human readable format"
 msgstr "gibt Größenangaben in menschenlesbaren Format aus"
 
@@ -6681,7 +7298,7 @@ msgstr "die jüngsten <n> Tags betrachten (Standard: 10)"
 msgid "only consider tags matching <pattern>"
 msgstr "nur Tags, die <Muster> entsprechen, betrachten"
 
-#: builtin/describe.c:410 builtin/name-rev.c:321
+#: builtin/describe.c:410 builtin/name-rev.c:320
 msgid "show abbreviated commit object as fallback"
 msgstr "gekürztes Commit-Objekt anzeigen, wenn sonst nichts zutrifft"
 
@@ -6717,21 +7334,21 @@ msgstr "'%s': keine reguläre Datei oder symbolische Verknüpfung"
 msgid "invalid option: %s"
 msgstr "Ungültige Option: %s"
 
-#: builtin/diff.c:360
+#: builtin/diff.c:361
 msgid "Not a git repository"
 msgstr "Kein Git-Repository"
 
-#: builtin/diff.c:403
+#: builtin/diff.c:404
 #, c-format
 msgid "invalid object '%s' given."
 msgstr "Objekt '%s' ist ungültig."
 
-#: builtin/diff.c:412
+#: builtin/diff.c:413
 #, c-format
 msgid "more than two blobs given: '%s'"
 msgstr "Mehr als zwei Blobs angegeben: '%s'"
 
-#: builtin/diff.c:419
+#: builtin/diff.c:420
 #, c-format
 msgid "unhandled object '%s' given."
 msgstr "unbehandeltes Objekt '%s' angegeben"
@@ -6804,166 +7421,172 @@ msgstr "git fetch --multiple [<Optionen>] [(<Repository> | <Gruppe>)...]"
 msgid "git fetch --all [<options>]"
 msgstr "git fetch --all [<Optionen>]"
 
-#: builtin/fetch.c:93 builtin/pull.c:174
+#: builtin/fetch.c:95 builtin/pull.c:175
 msgid "fetch from all remotes"
 msgstr "fordert von allen Remote-Repositories an"
 
-#: builtin/fetch.c:95 builtin/pull.c:177
+#: builtin/fetch.c:97 builtin/pull.c:178
 msgid "append to .git/FETCH_HEAD instead of overwriting"
 msgstr "an .git/FETCH_HEAD anhängen, anstatt zu überschreiben"
 
-#: builtin/fetch.c:97 builtin/pull.c:180
+#: builtin/fetch.c:99 builtin/pull.c:181
 msgid "path to upload pack on remote end"
 msgstr "Pfad des Programms zum Hochladen von Paketen auf der Gegenseite"
 
-#: builtin/fetch.c:98 builtin/pull.c:182
+#: builtin/fetch.c:100 builtin/pull.c:183
 msgid "force overwrite of local branch"
 msgstr "das Überschreiben von lokalen Branches erzwingen"
 
-#: builtin/fetch.c:100
+#: builtin/fetch.c:102
 msgid "fetch from multiple remotes"
 msgstr "von mehreren Remote-Repositories anfordern"
 
-#: builtin/fetch.c:102 builtin/pull.c:184
+#: builtin/fetch.c:104 builtin/pull.c:185
 msgid "fetch all tags and associated objects"
 msgstr "alle Tags und verbundene Objekte anfordern"
 
-#: builtin/fetch.c:104
+#: builtin/fetch.c:106
 msgid "do not fetch all tags (--no-tags)"
 msgstr "nicht alle Tags anfordern (--no-tags)"
 
-#: builtin/fetch.c:106
+#: builtin/fetch.c:108
 msgid "number of submodules fetched in parallel"
 msgstr "Anzahl der parallel anzufordernden Submodule"
 
-#: builtin/fetch.c:108 builtin/pull.c:187
+#: builtin/fetch.c:110 builtin/pull.c:188
 msgid "prune remote-tracking branches no longer on remote"
 msgstr ""
 "Remote-Tracking-Branches entfernen, die sich nicht mehr im Remote-Repository "
 "befinden"
 
-#: builtin/fetch.c:109 builtin/pull.c:190
+#: builtin/fetch.c:111 builtin/pull.c:191
 msgid "on-demand"
 msgstr "bei-Bedarf"
 
-#: builtin/fetch.c:110 builtin/pull.c:191
+#: builtin/fetch.c:112 builtin/pull.c:192
 msgid "control recursive fetching of submodules"
 msgstr "rekursive Anforderungen von Submodulen kontrollieren"
 
-#: builtin/fetch.c:114 builtin/pull.c:199
+#: builtin/fetch.c:116 builtin/pull.c:200
 msgid "keep downloaded pack"
 msgstr "heruntergeladenes Paket behalten"
 
-#: builtin/fetch.c:116
+#: builtin/fetch.c:118
 msgid "allow updating of HEAD ref"
 msgstr "Aktualisierung der \"HEAD\"-Referenz erlauben"
 
-#: builtin/fetch.c:119 builtin/pull.c:202
+#: builtin/fetch.c:121 builtin/fetch.c:127 builtin/pull.c:203
 msgid "deepen history of shallow clone"
 msgstr ""
 "die Historie eines Klons mit unvollständiger Historie (shallow) vertiefen"
 
-#: builtin/fetch.c:121 builtin/pull.c:205
+#: builtin/fetch.c:123
+msgid "deepen history of shallow repository based on time"
+msgstr ""
+"die Historie eines Klons mit unvollständiger Historie (shallow) auf Zeitbasis\n"
+"vertiefen"
+
+#: builtin/fetch.c:129 builtin/pull.c:206
 msgid "convert to a complete repository"
 msgstr "zu einem vollständigen Repository konvertieren"
 
-#: builtin/fetch.c:123 builtin/log.c:1426
+#: builtin/fetch.c:131 builtin/log.c:1433
 msgid "dir"
 msgstr "Verzeichnis"
 
-#: builtin/fetch.c:124
+#: builtin/fetch.c:132
 msgid "prepend this to submodule path output"
 msgstr "dies an die Ausgabe der Submodul-Pfade voranstellen"
 
-#: builtin/fetch.c:127
+#: builtin/fetch.c:135
 msgid "default mode for recursion"
 msgstr "Standard-Modus für Rekursion"
 
-#: builtin/fetch.c:129 builtin/pull.c:208
+#: builtin/fetch.c:137 builtin/pull.c:209
 msgid "accept refs that update .git/shallow"
 msgstr "Referenzen, die .git/shallow aktualisieren, akzeptieren"
 
-#: builtin/fetch.c:130 builtin/pull.c:210
+#: builtin/fetch.c:138 builtin/pull.c:211
 msgid "refmap"
 msgstr "Refmap"
 
-#: builtin/fetch.c:131 builtin/pull.c:211
+#: builtin/fetch.c:139 builtin/pull.c:212
 msgid "specify fetch refmap"
 msgstr "Refmap für 'fetch' angeben"
 
-#: builtin/fetch.c:387
+#: builtin/fetch.c:398
 msgid "Couldn't find remote ref HEAD"
 msgstr "Konnte Remote-Referenz von HEAD nicht finden."
 
-#: builtin/fetch.c:503
+#: builtin/fetch.c:514
 #, c-format
 msgid "configuration fetch.output contains invalid value %s"
 msgstr "Konfiguration fetch.output enthält ungültigen Wert %s"
 
-#: builtin/fetch.c:592
+#: builtin/fetch.c:607
 #, c-format
 msgid "object %s not found"
 msgstr "Objekt %s nicht gefunden"
 
-#: builtin/fetch.c:596
+#: builtin/fetch.c:611
 msgid "[up to date]"
 msgstr "[aktuell]"
 
-#: builtin/fetch.c:609 builtin/fetch.c:689
+#: builtin/fetch.c:624 builtin/fetch.c:704
 msgid "[rejected]"
 msgstr "[zurückgewiesen]"
 
-#: builtin/fetch.c:610
+#: builtin/fetch.c:625
 msgid "can't fetch in current branch"
 msgstr "kann \"fetch\" im aktuellen Branch nicht ausführen"
 
-#: builtin/fetch.c:619
+#: builtin/fetch.c:634
 msgid "[tag update]"
 msgstr "[Tag Aktualisierung]"
 
-#: builtin/fetch.c:620 builtin/fetch.c:653 builtin/fetch.c:669
-#: builtin/fetch.c:684
+#: builtin/fetch.c:635 builtin/fetch.c:668 builtin/fetch.c:684
+#: builtin/fetch.c:699
 msgid "unable to update local ref"
 msgstr "kann lokale Referenz nicht aktualisieren"
 
-#: builtin/fetch.c:639
+#: builtin/fetch.c:654
 msgid "[new tag]"
 msgstr "[neues Tag]"
 
-#: builtin/fetch.c:642
+#: builtin/fetch.c:657
 msgid "[new branch]"
 msgstr "[neuer Branch]"
 
-#: builtin/fetch.c:645
+#: builtin/fetch.c:660
 msgid "[new ref]"
 msgstr "[neue Referenz]"
 
-#: builtin/fetch.c:684
+#: builtin/fetch.c:699
 msgid "forced update"
 msgstr "Aktualisierung erzwungen"
 
-#: builtin/fetch.c:689
+#: builtin/fetch.c:704
 msgid "non-fast-forward"
 msgstr "kein Vorspulen"
 
-#: builtin/fetch.c:733
+#: builtin/fetch.c:749
 #, c-format
 msgid "%s did not send all necessary objects\n"
 msgstr "%s hat nicht alle erforderlichen Objekte gesendet\n"
 
-#: builtin/fetch.c:753
+#: builtin/fetch.c:769
 #, c-format
 msgid "reject %s because shallow roots are not allowed to be updated"
 msgstr ""
 "%s wurde zurückgewiesen, da Ursprungs-Commits von Repositoriesmit "
 "unvollständiger Historie (shallow) nicht aktualisiert werden dürfen."
 
-#: builtin/fetch.c:839 builtin/fetch.c:934
+#: builtin/fetch.c:856 builtin/fetch.c:952
 #, c-format
 msgid "From %.*s\n"
 msgstr "Von %.*s\n"
 
-#: builtin/fetch.c:850
+#: builtin/fetch.c:867
 #, c-format
 msgid ""
 "some local refs could not be updated; try running\n"
@@ -6972,57 +7595,57 @@ msgstr ""
 "Einige lokale Referenzen konnten nicht aktualisiert werden; versuchen Sie\n"
 "'git remote prune %s', um jeden älteren, widersprüchlichen Branch zu löschen."
 
-#: builtin/fetch.c:904
+#: builtin/fetch.c:922
 #, c-format
 msgid "   (%s will become dangling)"
 msgstr "   (%s wird unreferenziert)"
 
-#: builtin/fetch.c:905
+#: builtin/fetch.c:923
 #, c-format
 msgid "   (%s has become dangling)"
 msgstr "   (%s wurde unreferenziert)"
 
-#: builtin/fetch.c:937
+#: builtin/fetch.c:955
 msgid "[deleted]"
 msgstr "[gelöscht]"
 
-#: builtin/fetch.c:938 builtin/remote.c:1020
+#: builtin/fetch.c:956 builtin/remote.c:1020
 msgid "(none)"
 msgstr "(nichts)"
 
-#: builtin/fetch.c:960
+#: builtin/fetch.c:979
 #, c-format
 msgid "Refusing to fetch into current branch %s of non-bare repository"
 msgstr ""
 "Der \"fetch\" in den aktuellen Branch %s von einem nicht-Bare-Repository "
 "wurde verweigert."
 
-#: builtin/fetch.c:979
+#: builtin/fetch.c:998
 #, c-format
 msgid "Option \"%s\" value \"%s\" is not valid for %s"
 msgstr "Option \"%s\" Wert \"%s\" ist nicht gültig für %s"
 
-#: builtin/fetch.c:982
+#: builtin/fetch.c:1001
 #, c-format
 msgid "Option \"%s\" is ignored for %s\n"
 msgstr "Option \"%s\" wird ignoriert für %s\n"
 
-#: builtin/fetch.c:1039
+#: builtin/fetch.c:1077
 #, c-format
 msgid "Don't know how to fetch from %s"
 msgstr "Weiß nicht wie von %s angefordert wird."
 
-#: builtin/fetch.c:1199
+#: builtin/fetch.c:1237
 #, c-format
 msgid "Fetching %s\n"
 msgstr "Fordere an von %s\n"
 
-#: builtin/fetch.c:1201 builtin/remote.c:96
+#: builtin/fetch.c:1239 builtin/remote.c:96
 #, c-format
 msgid "Could not fetch %s"
 msgstr "Konnte nicht von %s anfordern"
 
-#: builtin/fetch.c:1219
+#: builtin/fetch.c:1257
 msgid ""
 "No remote repository specified.  Please, specify either a URL or a\n"
 "remote name from which new revisions should be fetched."
@@ -7031,35 +7654,43 @@ msgstr ""
 "oder den Namen des Remote-Repositories an, von welchem neue\n"
 "Commits angefordert werden sollen."
 
-#: builtin/fetch.c:1242
+#: builtin/fetch.c:1280
 msgid "You need to specify a tag name."
 msgstr "Sie müssen den Namen des Tags angeben."
 
-#: builtin/fetch.c:1284
+#: builtin/fetch.c:1322
+msgid "Negative depth in --deepen is not supported"
+msgstr "Negative Tiefe wird von --deepen nicht unterstützt."
+
+#: builtin/fetch.c:1324
+msgid "--deepen and --depth are mutually exclusive"
+msgstr "--deepen und --depth schließen sich gegenseitig aus"
+
+#: builtin/fetch.c:1329
 msgid "--depth and --unshallow cannot be used together"
 msgstr ""
 "Die Optionen --depth und --unshallow können nicht gemeinsam verwendet werden."
 
-#: builtin/fetch.c:1286
+#: builtin/fetch.c:1331
 msgid "--unshallow on a complete repository does not make sense"
 msgstr ""
 "Die Option --unshallow kann nicht in einem Repository mit unvollständiger "
 "Historie verwendet werden."
 
-#: builtin/fetch.c:1306
+#: builtin/fetch.c:1353
 msgid "fetch --all does not take a repository argument"
 msgstr "fetch --all akzeptiert kein Repository als Argument"
 
-#: builtin/fetch.c:1308
+#: builtin/fetch.c:1355
 msgid "fetch --all does not make sense with refspecs"
 msgstr "fetch --all kann nicht mit Refspecs verwendet werden."
 
-#: builtin/fetch.c:1319
+#: builtin/fetch.c:1366
 #, c-format
 msgid "No such remote or remote group: %s"
 msgstr "Kein Remote-Repository (einzeln oder Gruppe): %s"
 
-#: builtin/fetch.c:1327
+#: builtin/fetch.c:1374
 msgid "Fetching a group and specifying refspecs does not make sense"
 msgstr ""
 "Das Abholen einer Gruppe von Remote-Repositories kann nicht mit der Angabe\n"
@@ -7072,23 +7703,23 @@ msgstr ""
 "git fmt-merge-msg [-m <Beschreibung>] [--log[=<n>] | --no-log] [--file "
 "<Datei>]"
 
-#: builtin/fmt-merge-msg.c:667
+#: builtin/fmt-merge-msg.c:663
 msgid "populate log with at most <n> entries from shortlog"
 msgstr "Historie mit höchstens <n> Einträgen von \"shortlog\" hinzufügen"
 
-#: builtin/fmt-merge-msg.c:670
+#: builtin/fmt-merge-msg.c:666
 msgid "alias for --log (deprecated)"
 msgstr "Alias für --log (veraltet)"
 
-#: builtin/fmt-merge-msg.c:673
+#: builtin/fmt-merge-msg.c:669
 msgid "text"
 msgstr "Text"
 
-#: builtin/fmt-merge-msg.c:674
+#: builtin/fmt-merge-msg.c:670
 msgid "use <text> as start of message"
 msgstr "<Text> als Beschreibungsanfang verwenden"
 
-#: builtin/fmt-merge-msg.c:675
+#: builtin/fmt-merge-msg.c:671
 msgid "file to read from"
 msgstr "Datei zum Einlesen"
 
@@ -7204,7 +7835,7 @@ msgstr "Fortschrittsanzeige anzeigen"
 msgid "show verbose names for reachable objects"
 msgstr "ausführliche Namen für erreichbare Objekte anzeigen"
 
-#: builtin/fsck.c:671
+#: builtin/fsck.c:665
 msgid "Checking objects"
 msgstr "Prüfe Objekte"
 
@@ -7304,236 +7935,231 @@ msgstr "grep: Fehler beim Erzeugen eines Thread: %s"
 msgid "invalid number of threads specified (%d) for %s"
 msgstr "ungültige Anzahl von Threads (%d) für %s angegeben"
 
-#: builtin/grep.c:452 builtin/grep.c:487
+#: builtin/grep.c:453 builtin/grep.c:488
 #, c-format
 msgid "unable to read tree (%s)"
 msgstr "konnte \"Tree\"-Objekt (%s) nicht lesen"
 
-#: builtin/grep.c:502
+#: builtin/grep.c:503
 #, c-format
 msgid "unable to grep from object of type %s"
 msgstr "kann \"grep\" nicht mit Objekten des Typs %s durchführen"
 
-#: builtin/grep.c:560
+#: builtin/grep.c:561
 #, c-format
 msgid "switch `%c' expects a numerical value"
 msgstr "Schalter '%c' erwartet einen numerischen Wert"
 
-#: builtin/grep.c:577
-#, c-format
-msgid "cannot open '%s'"
-msgstr "kann '%s' nicht öffnen"
-
-#: builtin/grep.c:646
+#: builtin/grep.c:647
 msgid "search in index instead of in the work tree"
 msgstr "im Index anstatt im Arbeitsverzeichnis suchen"
 
-#: builtin/grep.c:648
+#: builtin/grep.c:649
 msgid "find in contents not managed by git"
 msgstr "auch in Inhalten finden, die nicht von Git verwaltet werden"
 
-#: builtin/grep.c:650
+#: builtin/grep.c:651
 msgid "search in both tracked and untracked files"
 msgstr "in versionierten und unversionierten Dateien suchen"
 
-#: builtin/grep.c:652
+#: builtin/grep.c:653
 msgid "ignore files specified via '.gitignore'"
 msgstr "Dateien, die über '.gitignore' angegeben sind, ignorieren"
 
-#: builtin/grep.c:655
+#: builtin/grep.c:656
 msgid "show non-matching lines"
 msgstr "Zeilen ohne Übereinstimmungen anzeigen"
 
-#: builtin/grep.c:657
+#: builtin/grep.c:658
 msgid "case insensitive matching"
 msgstr "Übereinstimmungen unabhängig von Groß- und Kleinschreibung finden"
 
-#: builtin/grep.c:659
+#: builtin/grep.c:660
 msgid "match patterns only at word boundaries"
 msgstr "nur ganze Wörter suchen"
 
-#: builtin/grep.c:661
+#: builtin/grep.c:662
 msgid "process binary files as text"
 msgstr "binäre Dateien als Text verarbeiten"
 
-#: builtin/grep.c:663
+#: builtin/grep.c:664
 msgid "don't match patterns in binary files"
 msgstr "keine Muster in Binärdateien finden"
 
-#: builtin/grep.c:666
+#: builtin/grep.c:667
 msgid "process binary files with textconv filters"
 msgstr "binäre Dateien mit \"textconv\"-Filtern verarbeiten"
 
-#: builtin/grep.c:668
+#: builtin/grep.c:669
 msgid "descend at most <depth> levels"
 msgstr "höchstens <Tiefe> Ebenen durchlaufen"
 
-#: builtin/grep.c:672
+#: builtin/grep.c:673
 msgid "use extended POSIX regular expressions"
 msgstr "erweiterte reguläre Ausdrücke aus POSIX verwenden"
 
-#: builtin/grep.c:675
+#: builtin/grep.c:676
 msgid "use basic POSIX regular expressions (default)"
 msgstr "grundlegende reguläre Ausdrücke aus POSIX verwenden (Standard)"
 
-#: builtin/grep.c:678
+#: builtin/grep.c:679
 msgid "interpret patterns as fixed strings"
 msgstr "Muster als feste Zeichenketten interpretieren"
 
-#: builtin/grep.c:681
+#: builtin/grep.c:682
 msgid "use Perl-compatible regular expressions"
 msgstr "Perl-kompatible reguläre Ausdrücke verwenden"
 
-#: builtin/grep.c:684
+#: builtin/grep.c:685
 msgid "show line numbers"
 msgstr "Zeilennummern anzeigen"
 
-#: builtin/grep.c:685
+#: builtin/grep.c:686
 msgid "don't show filenames"
 msgstr "keine Dateinamen anzeigen"
 
-#: builtin/grep.c:686
+#: builtin/grep.c:687
 msgid "show filenames"
 msgstr "Dateinamen anzeigen"
 
-#: builtin/grep.c:688
+#: builtin/grep.c:689
 msgid "show filenames relative to top directory"
 msgstr "Dateinamen relativ zum Projektverzeichnis anzeigen"
 
-#: builtin/grep.c:690
+#: builtin/grep.c:691
 msgid "show only filenames instead of matching lines"
 msgstr "nur Dateinamen anzeigen anstatt übereinstimmende Zeilen"
 
-#: builtin/grep.c:692
+#: builtin/grep.c:693
 msgid "synonym for --files-with-matches"
 msgstr "Synonym für --files-with-matches"
 
-#: builtin/grep.c:695
+#: builtin/grep.c:696
 msgid "show only the names of files without match"
 msgstr "nur die Dateinamen ohne Übereinstimmungen anzeigen"
 
-#: builtin/grep.c:697
+#: builtin/grep.c:698
 msgid "print NUL after filenames"
 msgstr "NUL-Zeichen nach Dateinamen ausgeben"
 
-#: builtin/grep.c:699
+#: builtin/grep.c:700
 msgid "show the number of matches instead of matching lines"
 msgstr "anstatt der Zeilen, die Anzahl der übereinstimmenden Zeilen anzeigen"
 
-#: builtin/grep.c:700
+#: builtin/grep.c:701
 msgid "highlight matches"
 msgstr "Übereinstimmungen hervorheben"
 
-#: builtin/grep.c:702
+#: builtin/grep.c:703
 msgid "print empty line between matches from different files"
 msgstr ""
 "eine Leerzeile zwischen Übereinstimmungen in verschiedenen Dateien ausgeben"
 
-#: builtin/grep.c:704
+#: builtin/grep.c:705
 msgid "show filename only once above matches from same file"
 msgstr ""
 "den Dateinamen nur einmal oberhalb der Übereinstimmungen aus dieser Datei "
 "anzeigen"
 
-#: builtin/grep.c:707
+#: builtin/grep.c:708
 msgid "show <n> context lines before and after matches"
 msgstr "<n> Zeilen vor und nach den Übereinstimmungen anzeigen"
 
-#: builtin/grep.c:710
+#: builtin/grep.c:711
 msgid "show <n> context lines before matches"
 msgstr "<n> Zeilen vor den Übereinstimmungen anzeigen"
 
-#: builtin/grep.c:712
+#: builtin/grep.c:713
 msgid "show <n> context lines after matches"
 msgstr "<n> Zeilen nach den Übereinstimmungen anzeigen"
 
-#: builtin/grep.c:714
+#: builtin/grep.c:715
 msgid "use <n> worker threads"
 msgstr "<n> Threads benutzen"
 
-#: builtin/grep.c:715
+#: builtin/grep.c:716
 msgid "shortcut for -C NUM"
 msgstr "Kurzform für -C NUM"
 
-#: builtin/grep.c:718
+#: builtin/grep.c:719
 msgid "show a line with the function name before matches"
 msgstr "eine Zeile mit dem Funktionsnamen vor Übereinstimmungen anzeigen"
 
-#: builtin/grep.c:720
+#: builtin/grep.c:721
 msgid "show the surrounding function"
 msgstr "die umgebende Funktion anzeigen"
 
-#: builtin/grep.c:723
+#: builtin/grep.c:724
 msgid "read patterns from file"
 msgstr "Muster von einer Datei lesen"
 
-#: builtin/grep.c:725
+#: builtin/grep.c:726
 msgid "match <pattern>"
 msgstr "<Muster> finden"
 
-#: builtin/grep.c:727
+#: builtin/grep.c:728
 msgid "combine patterns specified with -e"
 msgstr "Muster kombinieren, die mit -e angegeben wurden"
 
-#: builtin/grep.c:739
+#: builtin/grep.c:740
 msgid "indicate hit with exit status without output"
 msgstr "Übereinstimmungen nur durch Beendigungsstatus anzeigen"
 
-#: builtin/grep.c:741
+#: builtin/grep.c:742
 msgid "show only matches from files that match all patterns"
 msgstr ""
 "nur Übereinstimmungen von Dateien anzeigen, die allen Mustern entsprechen"
 
-#: builtin/grep.c:743
+#: builtin/grep.c:744
 msgid "show parse tree for grep expression"
 msgstr "geparstes Verzeichnis für \"grep\"-Ausdruck anzeigen"
 
-#: builtin/grep.c:747
+#: builtin/grep.c:748
 msgid "pager"
 msgstr "Anzeigeprogramm"
 
-#: builtin/grep.c:747
+#: builtin/grep.c:748
 msgid "show matching files in the pager"
 msgstr "Dateien mit Übereinstimmungen im Anzeigeprogramm anzeigen"
 
-#: builtin/grep.c:750
+#: builtin/grep.c:751
 msgid "allow calling of grep(1) (ignored by this build)"
 msgstr "den Aufruf von grep(1) erlauben (von dieser Programmversion ignoriert)"
 
-#: builtin/grep.c:813
+#: builtin/grep.c:814
 msgid "no pattern given."
 msgstr "keine Muster angegeben"
 
-#: builtin/grep.c:845 builtin/index-pack.c:1479
+#: builtin/grep.c:846 builtin/index-pack.c:1480
 #, c-format
 msgid "invalid number of threads specified (%d)"
 msgstr "ungültige Anzahl von Threads angegeben (%d)"
 
-#: builtin/grep.c:875
+#: builtin/grep.c:876
 msgid "--open-files-in-pager only works on the worktree"
 msgstr ""
 "Die Option --open-files-in-pager kann nur innerhalb des "
 "Arbeitsverzeichnisses verwendet werden."
 
-#: builtin/grep.c:901
+#: builtin/grep.c:902
 msgid "--cached or --untracked cannot be used with --no-index."
 msgstr ""
 "Die Optionen --cached und --untracked können nicht mit --no-index verwendet "
 "werden."
 
-#: builtin/grep.c:906
+#: builtin/grep.c:907
 msgid "--no-index or --untracked cannot be used with revs."
 msgstr ""
 "Die Optionen --no-index und --untracked können nicht mit Commits verwendet "
 "werden."
 
-#: builtin/grep.c:909
+#: builtin/grep.c:910
 msgid "--[no-]exclude-standard cannot be used for tracked contents."
 msgstr ""
 "Die Option --[no-]exclude-standard kann nicht mit versionierten Inhalten "
 "verwendet werden."
 
-#: builtin/grep.c:917
+#: builtin/grep.c:918
 msgid "both --cached and trees are given."
 msgstr "Die Option --cached kann nicht mit \"Tree\"-Objekten verwendet werden."
 
@@ -7549,85 +8175,89 @@ msgstr ""
 msgid "git hash-object  --stdin-paths"
 msgstr "git hash-object  --stdin-paths"
 
-#: builtin/hash-object.c:93
+#: builtin/hash-object.c:94
 msgid "type"
 msgstr "Art"
 
-#: builtin/hash-object.c:93
+#: builtin/hash-object.c:94
 msgid "object type"
 msgstr "Art des Objektes"
 
-#: builtin/hash-object.c:94
+#: builtin/hash-object.c:95
 msgid "write the object into the object database"
 msgstr "das Objekt in die Objektdatenbank schreiben"
 
-#: builtin/hash-object.c:96
+#: builtin/hash-object.c:97
 msgid "read the object from stdin"
 msgstr "das Objekt von der Standard-Eingabe lesen"
 
-#: builtin/hash-object.c:98
+#: builtin/hash-object.c:99
 msgid "store file as is without filters"
 msgstr "Datei wie sie ist speichern, ohne Filter"
 
-#: builtin/hash-object.c:99
+#: builtin/hash-object.c:100
 msgid ""
 "just hash any random garbage to create corrupt objects for debugging Git"
 msgstr ""
 "Hash über zufällige Daten, zur Erzeugung von beschädigten Objekten zur\n"
 "Fehlersuche in Git, erzeugen"
 
-#: builtin/hash-object.c:100
+#: builtin/hash-object.c:101
 msgid "process file as it were from this path"
 msgstr "Datei verarbeiten, als ob sie von diesem Pfad wäre"
 
-#: builtin/help.c:41
+#: builtin/help.c:42
 msgid "print all available commands"
 msgstr "alle vorhandenen Befehle anzeigen"
 
-#: builtin/help.c:42
+#: builtin/help.c:43
+msgid "exclude guides"
+msgstr "Anleitungen ausschließen"
+
+#: builtin/help.c:44
 msgid "print list of useful guides"
 msgstr "Liste von allgemein verwendeten Anleitungen anzeigen"
 
-#: builtin/help.c:43
+#: builtin/help.c:45
 msgid "show man page"
 msgstr "Handbuch anzeigen"
 
-#: builtin/help.c:44
+#: builtin/help.c:46
 msgid "show manual in web browser"
 msgstr "Handbuch in einem Webbrowser anzeigen"
 
-#: builtin/help.c:46
+#: builtin/help.c:48
 msgid "show info page"
 msgstr "Info-Seite anzeigen"
 
-#: builtin/help.c:52
+#: builtin/help.c:54
 msgid "git help [--all] [--guides] [--man | --web | --info] [<command>]"
 msgstr "git help [--all] [--guides] [--man | --web | --info] [<Befehl>]"
 
-#: builtin/help.c:64
+#: builtin/help.c:66
 #, c-format
 msgid "unrecognized help format '%s'"
 msgstr "nicht erkanntes Hilfeformat: %s"
 
-#: builtin/help.c:91
+#: builtin/help.c:93
 msgid "Failed to start emacsclient."
 msgstr "Konnte emacsclient nicht starten."
 
-#: builtin/help.c:104
+#: builtin/help.c:106
 msgid "Failed to parse emacsclient version."
 msgstr "Konnte Version des emacsclient nicht parsen."
 
-#: builtin/help.c:112
+#: builtin/help.c:114
 #, c-format
 msgid "emacsclient version '%d' too old (< 22)."
 msgstr "Version des emacsclient '%d' ist zu alt (< 22)."
 
-#: builtin/help.c:130 builtin/help.c:151 builtin/help.c:160 builtin/help.c:168
+#: builtin/help.c:132 builtin/help.c:153 builtin/help.c:162 builtin/help.c:170
 #, c-format
 msgid "failed to exec '%s'"
 msgstr "Fehler beim Ausführen von '%s'"
 
-#: builtin/help.c:205
+#: builtin/help.c:207
 #, c-format
 msgid ""
 "'%s': path for unsupported man viewer.\n"
@@ -7636,7 +8266,7 @@ msgstr ""
 "'%s': Pfad für nicht unterstützten Handbuchbetrachter.\n"
 "Sie könnten stattdessen 'man.<Werkzeug>.cmd' benutzen."
 
-#: builtin/help.c:217
+#: builtin/help.c:219
 #, c-format
 msgid ""
 "'%s': cmd for supported man viewer.\n"
@@ -7645,300 +8275,304 @@ msgstr ""
 "'%s': Programm für unterstützten Handbuchbetrachter.\n"
 "Sie könnten stattdessen 'man.<Werkzeug>.path' benutzen."
 
-#: builtin/help.c:334
+#: builtin/help.c:336
 #, c-format
 msgid "'%s': unknown man viewer."
 msgstr "'%s': unbekannter Handbuch-Betrachter."
 
-#: builtin/help.c:351
+#: builtin/help.c:353
 msgid "no man viewer handled the request"
 msgstr "kein Handbuch-Betrachter konnte mit dieser Anfrage umgehen"
 
-#: builtin/help.c:359
+#: builtin/help.c:361
 msgid "no info viewer handled the request"
 msgstr "kein Informations-Betrachter konnte mit dieser Anfrage umgehen"
 
-#: builtin/help.c:401
+#: builtin/help.c:403
 msgid "Defining attributes per path"
 msgstr "Definition von Attributen pro Pfad"
 
-#: builtin/help.c:402
+#: builtin/help.c:404
 msgid "Everyday Git With 20 Commands Or So"
 msgstr "Tägliche Benutzung von Git mit ungefähr 20 Befehlen"
 
-#: builtin/help.c:403
+#: builtin/help.c:405
 msgid "A Git glossary"
 msgstr "Ein Git-Glossar"
 
-#: builtin/help.c:404
+#: builtin/help.c:406
 msgid "Specifies intentionally untracked files to ignore"
 msgstr "Spezifikation von bewusst ignorierten, unversionierten Dateien"
 
-#: builtin/help.c:405
+#: builtin/help.c:407
 msgid "Defining submodule properties"
 msgstr "Definition von Submodul-Eigenschaften"
 
-#: builtin/help.c:406
+#: builtin/help.c:408
 msgid "Specifying revisions and ranges for Git"
 msgstr "Spezifikation von Commits und Bereichen für Git"
 
-#: builtin/help.c:407
+#: builtin/help.c:409
 msgid "A tutorial introduction to Git (for version 1.5.1 or newer)"
 msgstr "Eine einführende Anleitung zu Git (für Version 1.5.1 oder neuer)"
 
-#: builtin/help.c:408
+#: builtin/help.c:410
 msgid "An overview of recommended workflows with Git"
 msgstr "Eine Übersicht über empfohlene Arbeitsabläufe mit Git"
 
-#: builtin/help.c:420
+#: builtin/help.c:422
 msgid "The common Git guides are:\n"
 msgstr "Die allgemein verwendeten Git-Anleitungen sind:\n"
 
-#: builtin/help.c:441 builtin/help.c:458
-#, c-format
-msgid "usage: %s%s"
-msgstr "Verwendung: %s%s"
-
-#: builtin/help.c:474
+#: builtin/help.c:440
 #, c-format
 msgid "`git %s' is aliased to `%s'"
 msgstr "für `git %s' wurde der Alias `%s' angelegt"
 
-#: builtin/index-pack.c:153
+#: builtin/help.c:462 builtin/help.c:479
+#, c-format
+msgid "usage: %s%s"
+msgstr "Verwendung: %s%s"
+
+#: builtin/index-pack.c:154
 #, c-format
 msgid "unable to open %s"
 msgstr "kann %s nicht öffnen"
 
-#: builtin/index-pack.c:203
+#: builtin/index-pack.c:204
 #, c-format
 msgid "object type mismatch at %s"
 msgstr "Objekt-Typen passen bei %s nicht zusammen"
 
-#: builtin/index-pack.c:223
+#: builtin/index-pack.c:224
 #, c-format
 msgid "did not receive expected object %s"
 msgstr "konnte erwartetes Objekt %s nicht empfangen"
 
-#: builtin/index-pack.c:226
+#: builtin/index-pack.c:227
 #, c-format
 msgid "object %s: expected type %s, found %s"
 msgstr "Objekt %s: erwarteter Typ %s, %s gefunden"
 
-#: builtin/index-pack.c:268
+#: builtin/index-pack.c:269
 #, c-format
 msgid "cannot fill %d byte"
 msgid_plural "cannot fill %d bytes"
 msgstr[0] "kann %d Byte nicht lesen"
 msgstr[1] "kann %d Bytes nicht lesen"
 
-#: builtin/index-pack.c:278
+#: builtin/index-pack.c:279
 msgid "early EOF"
 msgstr "zu frühes Dateiende"
 
-#: builtin/index-pack.c:279
+#: builtin/index-pack.c:280
 msgid "read error on input"
 msgstr "Fehler beim Lesen der Eingabe"
 
-#: builtin/index-pack.c:291
+#: builtin/index-pack.c:292
 msgid "used more bytes than were available"
 msgstr "verwendete mehr Bytes als verfügbar waren"
 
-#: builtin/index-pack.c:298
+#: builtin/index-pack.c:299
 msgid "pack too large for current definition of off_t"
 msgstr "Paket ist zu groß für die aktuelle Definition von off_t"
 
-#: builtin/index-pack.c:314
+#: builtin/index-pack.c:302 builtin/unpack-objects.c:92
+msgid "pack exceeds maximum allowed size"
+msgstr "Paket überschreitet die maximal erlaubte Größe"
+
+#: builtin/index-pack.c:317
 #, c-format
 msgid "unable to create '%s'"
 msgstr "konnte '%s' nicht erstellen"
 
-#: builtin/index-pack.c:319
+#: builtin/index-pack.c:322
 #, c-format
 msgid "cannot open packfile '%s'"
 msgstr "Kann Paketdatei '%s' nicht öffnen"
 
-#: builtin/index-pack.c:333
+#: builtin/index-pack.c:336
 msgid "pack signature mismatch"
 msgstr "Paketsignatur stimmt nicht überein"
 
-#: builtin/index-pack.c:335
+#: builtin/index-pack.c:338
 #, c-format
 msgid "pack version %<PRIu32> unsupported"
 msgstr "Paketversion %<PRIu32> nicht unterstützt"
 
-#: builtin/index-pack.c:353
+#: builtin/index-pack.c:356
 #, c-format
 msgid "pack has bad object at offset %<PRIuMAX>: %s"
 msgstr "Paket hat ein ungültiges Objekt bei Versatz %<PRIuMAX>: %s"
 
-#: builtin/index-pack.c:475
+#: builtin/index-pack.c:478
 #, c-format
 msgid "inflate returned %d"
 msgstr "Dekomprimierung gab %d zurück"
 
-#: builtin/index-pack.c:524
+#: builtin/index-pack.c:527
 msgid "offset value overflow for delta base object"
 msgstr "Wert für Versatz bei Differenzobjekt übergelaufen"
 
-#: builtin/index-pack.c:532
+#: builtin/index-pack.c:535
 msgid "delta base offset is out of bound"
 msgstr ""
 "Wert für Versatz bei Differenzobjekt liegt außerhalb des gültigen Bereichs"
 
-#: builtin/index-pack.c:540
+#: builtin/index-pack.c:543
 #, c-format
 msgid "unknown object type %d"
 msgstr "Unbekannter Objekt-Typ %d"
 
-#: builtin/index-pack.c:571
+#: builtin/index-pack.c:574
 msgid "cannot pread pack file"
 msgstr "Kann Paketdatei %s nicht lesen"
 
-#: builtin/index-pack.c:573
+#: builtin/index-pack.c:576
 #, c-format
 msgid "premature end of pack file, %<PRIuMAX> byte missing"
 msgid_plural "premature end of pack file, %<PRIuMAX> bytes missing"
 msgstr[0] "frühzeitiges Ende der Paketdatei, vermisse %<PRIuMAX> Byte"
 msgstr[1] "frühzeitiges Ende der Paketdatei, vermisse %<PRIuMAX> Bytes"
 
-#: builtin/index-pack.c:599
+#: builtin/index-pack.c:602
 msgid "serious inflate inconsistency"
 msgstr "ernsthafte Inkonsistenz nach Dekomprimierung"
 
-#: builtin/index-pack.c:745 builtin/index-pack.c:751 builtin/index-pack.c:774
-#: builtin/index-pack.c:808 builtin/index-pack.c:817
+#: builtin/index-pack.c:748 builtin/index-pack.c:754 builtin/index-pack.c:777
+#: builtin/index-pack.c:811 builtin/index-pack.c:820
 #, c-format
 msgid "SHA1 COLLISION FOUND WITH %s !"
 msgstr "SHA1 KOLLISION MIT %s GEFUNDEN !"
 
-#: builtin/index-pack.c:748 builtin/pack-objects.c:164
-#: builtin/pack-objects.c:256
+#: builtin/index-pack.c:751 builtin/pack-objects.c:166
+#: builtin/pack-objects.c:258
 #, c-format
 msgid "unable to read %s"
 msgstr "kann %s nicht lesen"
 
-#: builtin/index-pack.c:814
+#: builtin/index-pack.c:817
 #, c-format
 msgid "cannot read existing object %s"
 msgstr "Kann existierendes Objekt %s nicht lesen."
 
-#: builtin/index-pack.c:828
+#: builtin/index-pack.c:831
 #, c-format
 msgid "invalid blob object %s"
 msgstr "ungültiges Blob-Objekt %s"
 
-#: builtin/index-pack.c:842
+#: builtin/index-pack.c:845
 #, c-format
 msgid "invalid %s"
 msgstr "Ungültiger Objekt-Typ %s"
 
-#: builtin/index-pack.c:845
+#: builtin/index-pack.c:848
 msgid "Error in object"
 msgstr "Fehler in Objekt"
 
-#: builtin/index-pack.c:847
+#: builtin/index-pack.c:850
 #, c-format
 msgid "Not all child objects of %s are reachable"
 msgstr "Nicht alle Kind-Objekte von %s sind erreichbar"
 
-#: builtin/index-pack.c:919 builtin/index-pack.c:950
+#: builtin/index-pack.c:922 builtin/index-pack.c:953
 msgid "failed to apply delta"
 msgstr "Konnte Dateiunterschied nicht anwenden"
 
-#: builtin/index-pack.c:1120
+#: builtin/index-pack.c:1123
 msgid "Receiving objects"
 msgstr "Empfange Objekte"
 
-#: builtin/index-pack.c:1120
+#: builtin/index-pack.c:1123
 msgid "Indexing objects"
 msgstr "Indiziere Objekte"
 
-#: builtin/index-pack.c:1152
+#: builtin/index-pack.c:1155
 msgid "pack is corrupted (SHA1 mismatch)"
 msgstr "Paket ist beschädigt (SHA1 unterschiedlich)"
 
-#: builtin/index-pack.c:1157
+#: builtin/index-pack.c:1160
 msgid "cannot fstat packfile"
 msgstr "kann Paketdatei nicht lesen"
 
-#: builtin/index-pack.c:1160
+#: builtin/index-pack.c:1163
 msgid "pack has junk at the end"
 msgstr "Paketende enthält nicht verwendbaren Inhalt"
 
-#: builtin/index-pack.c:1171
+#: builtin/index-pack.c:1174
 msgid "confusion beyond insanity in parse_pack_objects()"
 msgstr "Fehler beim Ausführen von \"parse_pack_objects()\""
 
-#: builtin/index-pack.c:1196
+#: builtin/index-pack.c:1197
 msgid "Resolving deltas"
 msgstr "Löse Unterschiede auf"
 
-#: builtin/index-pack.c:1207
+#: builtin/index-pack.c:1208
 #, c-format
 msgid "unable to create thread: %s"
 msgstr "kann Thread nicht erzeugen: %s"
 
-#: builtin/index-pack.c:1249
+#: builtin/index-pack.c:1250
 msgid "confusion beyond insanity"
 msgstr "Fehler beim Auflösen der Unterschiede"
 
-#: builtin/index-pack.c:1255
+#: builtin/index-pack.c:1256
 #, c-format
 msgid "completed with %d local object"
 msgid_plural "completed with %d local objects"
 msgstr[0] "abgeschlossen mit %d lokalem Objekt"
 msgstr[1] "abgeschlossen mit %d lokalen Objekten"
 
-#: builtin/index-pack.c:1267
+#: builtin/index-pack.c:1268
 #, c-format
 msgid "Unexpected tail checksum for %s (disk corruption?)"
 msgstr "Unerwartete Prüfsumme für %s (Festplattenfehler?)"
 
-#: builtin/index-pack.c:1271
+#: builtin/index-pack.c:1272
 #, c-format
 msgid "pack has %d unresolved delta"
 msgid_plural "pack has %d unresolved deltas"
 msgstr[0] "Paket hat %d unaufgelöste Unterschied"
 msgstr[1] "Paket hat %d unaufgelöste Unterschiede"
 
-#: builtin/index-pack.c:1295
+#: builtin/index-pack.c:1296
 #, c-format
 msgid "unable to deflate appended object (%d)"
 msgstr "Konnte angehängtes Objekt (%d) nicht komprimieren"
 
-#: builtin/index-pack.c:1371
+#: builtin/index-pack.c:1372
 #, c-format
 msgid "local object %s is corrupt"
 msgstr "lokales Objekt %s ist beschädigt"
 
-#: builtin/index-pack.c:1395
+#: builtin/index-pack.c:1396
 msgid "error while closing pack file"
 msgstr "Fehler beim Schließen der Paketdatei"
 
-#: builtin/index-pack.c:1408
+#: builtin/index-pack.c:1409
 #, c-format
 msgid "cannot write keep file '%s'"
 msgstr "Kann Paketbeschreibungsdatei '%s' nicht schreiben"
 
-#: builtin/index-pack.c:1416
+#: builtin/index-pack.c:1417
 #, c-format
 msgid "cannot close written keep file '%s'"
 msgstr "Kann eben erstellte Paketbeschreibungsdatei '%s' nicht schließen"
 
-#: builtin/index-pack.c:1429
+#: builtin/index-pack.c:1430
 msgid "cannot store pack file"
 msgstr "Kann Paketdatei nicht speichern"
 
-#: builtin/index-pack.c:1440
+#: builtin/index-pack.c:1441
 msgid "cannot store index file"
 msgstr "Kann Indexdatei nicht speichern"
 
-#: builtin/index-pack.c:1473
+#: builtin/index-pack.c:1474
 #, c-format
 msgid "bad pack.indexversion=%<PRIu32>"
 msgstr "\"pack.indexversion=%<PRIu32>\" ist ungültig"
 
-#: builtin/index-pack.c:1483 builtin/index-pack.c:1681
+#: builtin/index-pack.c:1484 builtin/index-pack.c:1681
 #, c-format
 msgid "no threads support, ignoring %s"
 msgstr "keine Unterstützung von Threads, '%s' wird ignoriert"
@@ -7978,95 +8612,95 @@ msgstr "Name der Paketdatei '%s' endet nicht mit '.pack'"
 msgid "bad %s"
 msgstr "%s ist ungültig"
 
-#: builtin/index-pack.c:1730
+#: builtin/index-pack.c:1732
 msgid "--fix-thin cannot be used without --stdin"
 msgstr "Die Option --fix-thin kann nicht ohne --stdin verwendet werden."
 
-#: builtin/index-pack.c:1738
+#: builtin/index-pack.c:1740
 msgid "--verify with no packfile name given"
 msgstr "Die Option --verify wurde ohne Namen der Paketdatei angegeben."
 
-#: builtin/init-db.c:55
+#: builtin/init-db.c:54
 #, c-format
 msgid "cannot stat '%s'"
 msgstr "Kann '%s' nicht lesen"
 
-#: builtin/init-db.c:61
+#: builtin/init-db.c:60
 #, c-format
 msgid "cannot stat template '%s'"
 msgstr "kann Vorlage '%s' nicht lesen"
 
-#: builtin/init-db.c:66
+#: builtin/init-db.c:65
 #, c-format
 msgid "cannot opendir '%s'"
 msgstr "kann Verzeichnis '%s' nicht öffnen"
 
-#: builtin/init-db.c:77
+#: builtin/init-db.c:76
 #, c-format
 msgid "cannot readlink '%s'"
 msgstr "kann Verweis '%s' nicht lesen"
 
-#: builtin/init-db.c:79
+#: builtin/init-db.c:78
 #, c-format
 msgid "cannot symlink '%s' '%s'"
 msgstr "kann symbolische Verknüpfung '%s' auf '%s' nicht erstellen"
 
-#: builtin/init-db.c:85
+#: builtin/init-db.c:84
 #, c-format
 msgid "cannot copy '%s' to '%s'"
 msgstr "kann '%s' nicht nach '%s' kopieren"
 
-#: builtin/init-db.c:89
+#: builtin/init-db.c:88
 #, c-format
 msgid "ignoring template %s"
 msgstr "ignoriere Vorlage %s"
 
-#: builtin/init-db.c:120
+#: builtin/init-db.c:119
 #, c-format
 msgid "templates not found %s"
 msgstr "keine Vorlagen in '%s' gefunden"
 
-#: builtin/init-db.c:135
+#: builtin/init-db.c:134
 #, c-format
 msgid "not copying templates from '%s': %s"
 msgstr "kopiere keine Vorlagen von '%s': %s"
 
-#: builtin/init-db.c:312 builtin/init-db.c:315
-#, c-format
-msgid "%s already exists"
-msgstr "%s existiert bereits"
-
-#: builtin/init-db.c:344
+#: builtin/init-db.c:327
 #, c-format
 msgid "unable to handle file type %d"
 msgstr "kann nicht mit Dateityp %d umgehen"
 
-#: builtin/init-db.c:347
+#: builtin/init-db.c:330
 #, c-format
 msgid "unable to move %s to %s"
 msgstr "Konnte %s nicht nach %s verschieben"
 
-#: builtin/init-db.c:402
+#: builtin/init-db.c:347 builtin/init-db.c:350
+#, c-format
+msgid "%s already exists"
+msgstr "%s existiert bereits"
+
+#: builtin/init-db.c:403
 #, c-format
 msgid "Reinitialized existing shared Git repository in %s%s\n"
 msgstr "Bestehendes verteiltes Git-Repository in %s%s neuinitialisiert\n"
 
-#: builtin/init-db.c:403
+#: builtin/init-db.c:404
 #, c-format
 msgid "Reinitialized existing Git repository in %s%s\n"
 msgstr "Bestehendes Git-Repository in %s%s neuinitialisiert\n"
 
-#: builtin/init-db.c:407
+#: builtin/init-db.c:408
 #, c-format
 msgid "Initialized empty shared Git repository in %s%s\n"
 msgstr "Leeres verteiltes Git-Repository in %s%s initialisiert\n"
 
-#: builtin/init-db.c:408
+#: builtin/init-db.c:409
 #, c-format
 msgid "Initialized empty Git repository in %s%s\n"
 msgstr "Leeres Git-Repository in %s%s initialisiert\n"
 
-#: builtin/init-db.c:455
+#: builtin/init-db.c:457
 msgid ""
 "git init [-q | --quiet] [--bare] [--template=<template-directory>] [--"
 "shared[=<permissions>]] [<directory>]"
@@ -8074,25 +8708,25 @@ msgstr ""
 "git init [-q | --quiet] [--bare] [--template=<Vorlagenverzeichnis>] [--"
 "shared[=<Berechtigungen>]] [<Verzeichnis>]"
 
-#: builtin/init-db.c:478
+#: builtin/init-db.c:480
 msgid "permissions"
 msgstr "Berechtigungen"
 
-#: builtin/init-db.c:479
+#: builtin/init-db.c:481
 msgid "specify that the git repository is to be shared amongst several users"
 msgstr "angeben, dass das Git-Repository mit mehreren Benutzern geteilt wird"
 
-#: builtin/init-db.c:513 builtin/init-db.c:518
+#: builtin/init-db.c:515 builtin/init-db.c:520
 #, c-format
 msgid "cannot mkdir %s"
 msgstr "kann Verzeichnis %s nicht erstellen"
 
-#: builtin/init-db.c:522
+#: builtin/init-db.c:524
 #, c-format
 msgid "cannot chdir to %s"
 msgstr "kann nicht in Verzeichnis %s wechseln"
 
-#: builtin/init-db.c:543
+#: builtin/init-db.c:545
 #, c-format
 msgid ""
 "%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-"
@@ -8101,7 +8735,7 @@ msgstr ""
 "%s (oder --work-tree=<Verzeichnis>) nicht erlaubt ohne Spezifizierung von %s "
 "(oder --git-dir=<Verzeichnis>)"
 
-#: builtin/init-db.c:571
+#: builtin/init-db.c:573
 #, c-format
 msgid "Cannot access work tree '%s'"
 msgstr "Kann nicht auf Arbeitsverzeichnis '%s' zugreifen."
@@ -8212,37 +8846,34 @@ msgstr "Kein Commit-Bereich."
 msgid "Cover letter needs email format"
 msgstr "Anschreiben benötigt E-Mail-Format"
 
-#: builtin/log.c:1064
+#: builtin/log.c:1063
 #, c-format
 msgid "insane in-reply-to: %s"
 msgstr "ungültiges in-reply-to: %s"
 
-#: builtin/log.c:1092
+#: builtin/log.c:1091
 msgid "git format-patch [<options>] [<since> | <revision-range>]"
 msgstr "git format-patch [<Optionen>] [<seit> | <Commitbereich>]"
 
-#: builtin/log.c:1137
+#: builtin/log.c:1141
 msgid "Two output directories?"
 msgstr "Zwei Ausgabeverzeichnisse?"
 
-#: builtin/log.c:1244 builtin/log.c:1883 builtin/log.c:1885 builtin/log.c:1897
+#: builtin/log.c:1248 builtin/log.c:1891 builtin/log.c:1893 builtin/log.c:1905
 #, c-format
 msgid "Unknown commit %s"
 msgstr "Unbekannter Commit %s"
 
-#: builtin/log.c:1254 builtin/notes.c:254 builtin/notes.c:305
-#: builtin/notes.c:307 builtin/notes.c:370 builtin/notes.c:425
-#: builtin/notes.c:511 builtin/notes.c:516 builtin/notes.c:594
-#: builtin/notes.c:657 builtin/notes.c:882 builtin/tag.c:455
+#: builtin/log.c:1258 builtin/notes.c:884 builtin/tag.c:455
 #, c-format
 msgid "Failed to resolve '%s' as a valid ref."
 msgstr "Konnte '%s' nicht als gültige Referenz auflösen."
 
-#: builtin/log.c:1259
+#: builtin/log.c:1263
 msgid "Could not find exact merge base."
 msgstr "Konnte keine exakte Merge-Basis finden."
 
-#: builtin/log.c:1263
+#: builtin/log.c:1267
 msgid ""
 "Failed to get upstream, if you want to record base commit automatically,\n"
 "please use git branch --set-upstream-to to track a remote branch.\n"
@@ -8253,212 +8884,216 @@ msgstr ""
 "'git branch --set-upstream-to', um einem Remote-Branch zu folgen.\n"
 "Oder geben Sie den Basis-Commit mit '--base=<Basis-Commit-Id>' manuell an."
 
-#: builtin/log.c:1283
+#: builtin/log.c:1287
 msgid "Failed to find exact merge base"
 msgstr "Fehler beim Finden einer exakten Merge-Basis."
 
-#: builtin/log.c:1294
+#: builtin/log.c:1298
 msgid "base commit should be the ancestor of revision list"
 msgstr "Basis-Commit sollte der Vorgänger der Revisionsliste sein."
 
-#: builtin/log.c:1298
+#: builtin/log.c:1302
 msgid "base commit shouldn't be in revision list"
 msgstr "Basis-Commit sollte nicht in der Revisionsliste enthalten sein."
 
-#: builtin/log.c:1347
+#: builtin/log.c:1351
 msgid "cannot get patch id"
 msgstr "kann Patch-Id nicht lesen"
 
-#: builtin/log.c:1404
+#: builtin/log.c:1408
 msgid "use [PATCH n/m] even with a single patch"
 msgstr "[PATCH n/m] auch mit einzelnem Patch verwenden"
 
-#: builtin/log.c:1407
+#: builtin/log.c:1411
 msgid "use [PATCH] even with multiple patches"
 msgstr "[PATCH] auch mit mehreren Patches verwenden"
 
-#: builtin/log.c:1411
+#: builtin/log.c:1415
 msgid "print patches to standard out"
 msgstr "Ausgabe der Patches in Standard-Ausgabe"
 
-#: builtin/log.c:1413
+#: builtin/log.c:1417
 msgid "generate a cover letter"
 msgstr "ein Deckblatt erzeugen"
 
-#: builtin/log.c:1415
+#: builtin/log.c:1419
 msgid "use simple number sequence for output file names"
 msgstr "einfache Nummernfolge für die Namen der Ausgabedateien verwenden"
 
-#: builtin/log.c:1416
+#: builtin/log.c:1420
 msgid "sfx"
 msgstr "Dateiendung"
 
-#: builtin/log.c:1417
+#: builtin/log.c:1421
 msgid "use <sfx> instead of '.patch'"
 msgstr "<Dateiendung> anstatt '.patch' verwenden"
 
-#: builtin/log.c:1419
+#: builtin/log.c:1423
 msgid "start numbering patches at <n> instead of 1"
 msgstr "die Nummerierung der Patches bei <n> anstatt bei 1 beginnen"
 
-#: builtin/log.c:1421
+#: builtin/log.c:1425
 msgid "mark the series as Nth re-roll"
 msgstr "die Serie als n-te Fassung kennzeichnen"
 
-#: builtin/log.c:1423
+#: builtin/log.c:1427
+msgid "Use [RFC PATCH] instead of [PATCH]"
+msgstr "[RFC PATCH] anstatt [PATCH] verwenden"
+
+#: builtin/log.c:1430
 msgid "Use [<prefix>] instead of [PATCH]"
 msgstr "[<Präfix>] anstatt [PATCH] verwenden"
 
-#: builtin/log.c:1426
+#: builtin/log.c:1433
 msgid "store resulting files in <dir>"
 msgstr "erzeugte Dateien in <Verzeichnis> speichern"
 
-#: builtin/log.c:1429
+#: builtin/log.c:1436
 msgid "don't strip/add [PATCH]"
 msgstr "[PATCH] nicht entfernen/hinzufügen"
 
-#: builtin/log.c:1432
+#: builtin/log.c:1439
 msgid "don't output binary diffs"
 msgstr "keine binären Unterschiede ausgeben"
 
-#: builtin/log.c:1434
+#: builtin/log.c:1441
 msgid "output all-zero hash in From header"
 msgstr "Hash mit Nullen in \"From\"-Header ausgeben"
 
-#: builtin/log.c:1436
+#: builtin/log.c:1443
 msgid "don't include a patch matching a commit upstream"
 msgstr ""
 "keine Patches einschließen, die einem Commit im Upstream-Branch entsprechen"
 
-#: builtin/log.c:1438
+#: builtin/log.c:1445
 msgid "show patch format instead of default (patch + stat)"
 msgstr "Patchformat anstatt des Standards anzeigen (Patch + Zusammenfassung)"
 
-#: builtin/log.c:1440
+#: builtin/log.c:1447
 msgid "Messaging"
 msgstr "E-Mail-Einstellungen"
 
-#: builtin/log.c:1441
+#: builtin/log.c:1448
 msgid "header"
 msgstr "Header"
 
-#: builtin/log.c:1442
+#: builtin/log.c:1449
 msgid "add email header"
 msgstr "E-Mail-Header hinzufügen"
 
-#: builtin/log.c:1443 builtin/log.c:1445
+#: builtin/log.c:1450 builtin/log.c:1452
 msgid "email"
 msgstr "E-Mail"
 
-#: builtin/log.c:1443
+#: builtin/log.c:1450
 msgid "add To: header"
 msgstr "\"To:\"-Header hinzufügen"
 
-#: builtin/log.c:1445
+#: builtin/log.c:1452
 msgid "add Cc: header"
 msgstr "\"Cc:\"-Header hinzufügen"
 
-#: builtin/log.c:1447
+#: builtin/log.c:1454
 msgid "ident"
 msgstr "Ident"
 
-#: builtin/log.c:1448
+#: builtin/log.c:1455
 msgid "set From address to <ident> (or committer ident if absent)"
 msgstr ""
 "\"From\"-Adresse auf <Ident> setzen (oder Ident des Commit-Erstellers, wenn "
 "fehlend)"
 
-#: builtin/log.c:1450
+#: builtin/log.c:1457
 msgid "message-id"
 msgstr "message-id"
 
-#: builtin/log.c:1451
+#: builtin/log.c:1458
 msgid "make first mail a reply to <message-id>"
 msgstr "aus erster E-Mail eine Antwort zu <message-id> machen"
 
-#: builtin/log.c:1452 builtin/log.c:1455
+#: builtin/log.c:1459 builtin/log.c:1462
 msgid "boundary"
 msgstr "Grenze"
 
-#: builtin/log.c:1453
+#: builtin/log.c:1460
 msgid "attach the patch"
 msgstr "den Patch anhängen"
 
-#: builtin/log.c:1456
+#: builtin/log.c:1463
 msgid "inline the patch"
 msgstr "den Patch direkt in die Nachricht einfügen"
 
-#: builtin/log.c:1460
+#: builtin/log.c:1467
 msgid "enable message threading, styles: shallow, deep"
 msgstr "Nachrichtenverkettung aktivieren, Stile: shallow, deep"
 
-#: builtin/log.c:1462
+#: builtin/log.c:1469
 msgid "signature"
 msgstr "Signatur"
 
-#: builtin/log.c:1463
+#: builtin/log.c:1470
 msgid "add a signature"
 msgstr "eine Signatur hinzufügen"
 
-#: builtin/log.c:1464
+#: builtin/log.c:1471
 msgid "base-commit"
 msgstr "Basis-Commit"
 
-#: builtin/log.c:1465
+#: builtin/log.c:1472
 msgid "add prerequisite tree info to the patch series"
 msgstr "erforderliche Revisions-Informationen der Patch-Serie hinzufügen"
 
-#: builtin/log.c:1467
+#: builtin/log.c:1474
 msgid "add a signature from a file"
 msgstr "eine Signatur aus einer Datei hinzufügen"
 
-#: builtin/log.c:1468
+#: builtin/log.c:1475
 msgid "don't print the patch filenames"
 msgstr "keine Dateinamen der Patches anzeigen"
 
-#: builtin/log.c:1558
+#: builtin/log.c:1565
 msgid "-n and -k are mutually exclusive."
 msgstr "Die Optionen -n und -k schließen sich gegenseitig aus."
 
-#: builtin/log.c:1560
-msgid "--subject-prefix and -k are mutually exclusive."
-msgstr "Die Optionen --subject-prefix und -k schließen sich gegenseitig aus."
+#: builtin/log.c:1567
+msgid "--subject-prefix/--rfc and -k are mutually exclusive."
+msgstr "--subject-prefix/--rfc und -k schließen sich gegenseitig aus."
 
-#: builtin/log.c:1568
+#: builtin/log.c:1575
 msgid "--name-only does not make sense"
 msgstr "Die Option --name-only kann nicht verwendet werden."
 
-#: builtin/log.c:1570
+#: builtin/log.c:1577
 msgid "--name-status does not make sense"
 msgstr "Die Option --name-status kann nicht verwendet werden."
 
-#: builtin/log.c:1572
+#: builtin/log.c:1579
 msgid "--check does not make sense"
 msgstr "Die Option --check kann nicht verwendet werden."
 
-#: builtin/log.c:1602
+#: builtin/log.c:1609
 msgid "standard output, or directory, which one?"
 msgstr "Standard-Ausgabe oder Verzeichnis, welches von beidem?"
 
-#: builtin/log.c:1604
+#: builtin/log.c:1611
 #, c-format
 msgid "Could not create directory '%s'"
 msgstr "Konnte Verzeichnis '%s' nicht erstellen."
 
-#: builtin/log.c:1698
+#: builtin/log.c:1705
 #, c-format
 msgid "unable to read signature file '%s'"
 msgstr "Konnte Signatur-Datei '%s' nicht lesen"
 
-#: builtin/log.c:1769
+#: builtin/log.c:1777
 msgid "Failed to create output files"
 msgstr "Fehler beim Erstellen der Ausgabedateien."
 
-#: builtin/log.c:1818
+#: builtin/log.c:1826
 msgid "git cherry [-v] [<upstream> [<head> [<limit>]]]"
 msgstr "git cherry [-v] [<Upstream> [<Branch> [<Limit>]]]"
 
-#: builtin/log.c:1872
+#: builtin/log.c:1880
 #, c-format
 msgid ""
 "Could not find a tracked remote branch, please specify <upstream> manually.\n"
@@ -8466,104 +9101,108 @@ msgstr ""
 "Konnte gefolgten Remote-Branch nicht finden, bitte geben Sie <Upstream> "
 "manuell an.\n"
 
-#: builtin/ls-files.c:379
+#: builtin/ls-files.c:458
 msgid "git ls-files [<options>] [<file>...]"
 msgstr "git ls-files [<Optionen>] [<Datei>...]"
 
-#: builtin/ls-files.c:428
+#: builtin/ls-files.c:507
 msgid "identify the file status with tags"
 msgstr "den Dateistatus mit Tags anzeigen"
 
-#: builtin/ls-files.c:430
+#: builtin/ls-files.c:509
 msgid "use lowercase letters for 'assume unchanged' files"
 msgstr ""
 "Kleinbuchstaben für Dateien mit 'assume unchanged' Markierung verwenden"
 
-#: builtin/ls-files.c:432
+#: builtin/ls-files.c:511
 msgid "show cached files in the output (default)"
 msgstr "zwischengespeicherte Dateien in der Ausgabe anzeigen (Standard)"
 
-#: builtin/ls-files.c:434
+#: builtin/ls-files.c:513
 msgid "show deleted files in the output"
 msgstr "entfernte Dateien in der Ausgabe anzeigen"
 
-#: builtin/ls-files.c:436
+#: builtin/ls-files.c:515
 msgid "show modified files in the output"
 msgstr "geänderte Dateien in der Ausgabe anzeigen"
 
-#: builtin/ls-files.c:438
+#: builtin/ls-files.c:517
 msgid "show other files in the output"
 msgstr "sonstige Dateien in der Ausgabe anzeigen"
 
-#: builtin/ls-files.c:440
+#: builtin/ls-files.c:519
 msgid "show ignored files in the output"
 msgstr "ignorierte Dateien in der Ausgabe anzeigen"
 
-#: builtin/ls-files.c:443
+#: builtin/ls-files.c:522
 msgid "show staged contents' object name in the output"
 msgstr ""
 "Objektnamen von Inhalten, die zum Commit vorgemerkt sind, in der Ausgabe "
 "anzeigen"
 
-#: builtin/ls-files.c:445
+#: builtin/ls-files.c:524
 msgid "show files on the filesystem that need to be removed"
 msgstr "Dateien im Dateisystem, die gelöscht werden müssen, anzeigen"
 
-#: builtin/ls-files.c:447
+#: builtin/ls-files.c:526
 msgid "show 'other' directories' names only"
 msgstr "nur Namen von 'sonstigen' Verzeichnissen anzeigen"
 
-#: builtin/ls-files.c:449
+#: builtin/ls-files.c:528
 msgid "show line endings of files"
 msgstr "Zeilenenden von Dateien anzeigen"
 
-#: builtin/ls-files.c:451
+#: builtin/ls-files.c:530
 msgid "don't show empty directories"
 msgstr "keine leeren Verzeichnisse anzeigen"
 
-#: builtin/ls-files.c:454
+#: builtin/ls-files.c:533
 msgid "show unmerged files in the output"
 msgstr "nicht zusammengeführte Dateien in der Ausgabe anzeigen"
 
-#: builtin/ls-files.c:456
+#: builtin/ls-files.c:535
 msgid "show resolve-undo information"
 msgstr "'resolve-undo' Informationen anzeigen"
 
-#: builtin/ls-files.c:458
+#: builtin/ls-files.c:537
 msgid "skip files matching pattern"
 msgstr "Dateien auslassen, die einem Muster entsprechen"
 
-#: builtin/ls-files.c:461
+#: builtin/ls-files.c:540
 msgid "exclude patterns are read from <file>"
 msgstr "Muster, gelesen von <Datei>, ausschließen"
 
-#: builtin/ls-files.c:464
+#: builtin/ls-files.c:543
 msgid "read additional per-directory exclude patterns in <file>"
 msgstr "zusätzliche pro-Verzeichnis Auschlussmuster aus <Datei> auslesen"
 
-#: builtin/ls-files.c:466
+#: builtin/ls-files.c:545
 msgid "add the standard git exclusions"
 msgstr "die standardmäßigen Git-Ausschlüsse hinzufügen"
 
-#: builtin/ls-files.c:469
+#: builtin/ls-files.c:548
 msgid "make the output relative to the project top directory"
 msgstr "Ausgabe relativ zum Projektverzeichnis"
 
-#: builtin/ls-files.c:472
+#: builtin/ls-files.c:551
+msgid "recurse through submodules"
+msgstr "Rekursion in Submodulen durchführen"
+
+#: builtin/ls-files.c:553
 msgid "if any <file> is not in the index, treat this as an error"
 msgstr "als Fehler behandeln, wenn sich eine <Datei> nicht im Index befindet"
 
-#: builtin/ls-files.c:473
+#: builtin/ls-files.c:554
 msgid "tree-ish"
 msgstr "Commit-Referenz"
 
-#: builtin/ls-files.c:474
+#: builtin/ls-files.c:555
 msgid "pretend that paths removed since <tree-ish> are still present"
 msgstr ""
 "vorgeben, dass Pfade, die seit <Commit-Referenz> gelöscht wurden, immer noch "
 "vorhanden sind"
 
-#: builtin/ls-files.c:476
+#: builtin/ls-files.c:557
 msgid "show debugging data"
 msgstr "Ausgaben zur Fehlersuche anzeigen"
 
@@ -8684,33 +9323,33 @@ msgstr "Verfügbare Strategien sind:"
 msgid "Available custom strategies are:"
 msgstr "Verfügbare benutzerdefinierte Strategien sind:"
 
-#: builtin/merge.c:195 builtin/pull.c:126
+#: builtin/merge.c:195 builtin/pull.c:127
 msgid "do not show a diffstat at the end of the merge"
 msgstr "keine Zusammenfassung der Unterschiede am Schluss des Merges anzeigen"
 
-#: builtin/merge.c:198 builtin/pull.c:129
+#: builtin/merge.c:198 builtin/pull.c:130
 msgid "show a diffstat at the end of the merge"
 msgstr "eine Zusammenfassung der Unterschiede am Schluss des Merges anzeigen"
 
-#: builtin/merge.c:199 builtin/pull.c:132
+#: builtin/merge.c:199 builtin/pull.c:133
 msgid "(synonym to --stat)"
 msgstr "(Synonym für --stat)"
 
-#: builtin/merge.c:201 builtin/pull.c:135
+#: builtin/merge.c:201 builtin/pull.c:136
 msgid "add (at most <n>) entries from shortlog to merge commit message"
 msgstr ""
 "(höchstens <n>) Einträge von \"shortlog\" zur Beschreibung des Merge-Commits "
 "hinzufügen"
 
-#: builtin/merge.c:204 builtin/pull.c:138
+#: builtin/merge.c:204 builtin/pull.c:139
 msgid "create a single commit instead of doing a merge"
 msgstr "einen einzelnen Commit anstatt eines Merges erzeugen"
 
-#: builtin/merge.c:206 builtin/pull.c:141
+#: builtin/merge.c:206 builtin/pull.c:142
 msgid "perform a commit if the merge succeeds (default)"
 msgstr "einen Commit durchführen, wenn der Merge erfolgreich war (Standard)"
 
-#: builtin/merge.c:208 builtin/pull.c:144
+#: builtin/merge.c:208 builtin/pull.c:145
 msgid "edit message before committing"
 msgstr "Bearbeitung der Beschreibung vor dem Commit"
 
@@ -8718,28 +9357,28 @@ msgstr "Bearbeitung der Beschreibung vor dem Commit"
 msgid "allow fast-forward (default)"
 msgstr "Vorspulen erlauben (Standard)"
 
-#: builtin/merge.c:211 builtin/pull.c:150
+#: builtin/merge.c:211 builtin/pull.c:151
 msgid "abort if fast-forward is not possible"
 msgstr "abbrechen, wenn kein Vorspulen möglich ist"
 
-#: builtin/merge.c:215 builtin/pull.c:153
+#: builtin/merge.c:215 builtin/pull.c:154
 msgid "verify that the named commit has a valid GPG signature"
 msgstr "den genannten Commit auf eine gültige GPG-Signatur überprüfen"
 
-#: builtin/merge.c:216 builtin/notes.c:772 builtin/pull.c:157
+#: builtin/merge.c:216 builtin/notes.c:774 builtin/pull.c:158
 #: builtin/revert.c:89
 msgid "strategy"
 msgstr "Strategie"
 
-#: builtin/merge.c:217 builtin/pull.c:158
+#: builtin/merge.c:217 builtin/pull.c:159
 msgid "merge strategy to use"
 msgstr "zu verwendende Merge-Strategie"
 
-#: builtin/merge.c:218 builtin/pull.c:161
+#: builtin/merge.c:218 builtin/pull.c:162
 msgid "option=value"
 msgstr "Option=Wert"
 
-#: builtin/merge.c:219 builtin/pull.c:162
+#: builtin/merge.c:219 builtin/pull.c:163
 msgid "option for selected merge strategy"
 msgstr "Option für ausgewählte Merge-Strategie"
 
@@ -8752,7 +9391,7 @@ msgstr ""
 msgid "abort the current in-progress merge"
 msgstr "den sich im Gange befindlichen Merge abbrechen"
 
-#: builtin/merge.c:227 builtin/pull.c:169
+#: builtin/merge.c:227 builtin/pull.c:170
 msgid "allow merging unrelated histories"
 msgstr "erlaube das Zusammenführen von nicht zusammenhängenden Historien"
 
@@ -8979,55 +9618,55 @@ msgstr "Verweigere den Merge von nicht zusammenhängenden Historien."
 msgid "Already up-to-date."
 msgstr "Bereits aktuell."
 
-#: builtin/merge.c:1382
+#: builtin/merge.c:1377
 #, c-format
 msgid "Updating %s..%s\n"
 msgstr "Aktualisiere %s..%s\n"
 
-#: builtin/merge.c:1419
+#: builtin/merge.c:1418
 #, c-format
 msgid "Trying really trivial in-index merge...\n"
 msgstr "Probiere wirklich trivialen \"in-index\"-Merge ...\n"
 
-#: builtin/merge.c:1426
+#: builtin/merge.c:1425
 #, c-format
 msgid "Nope.\n"
 msgstr "Nein.\n"
 
-#: builtin/merge.c:1451
+#: builtin/merge.c:1450
 msgid "Already up-to-date. Yeeah!"
 msgstr "Bereits aktuell."
 
-#: builtin/merge.c:1457
+#: builtin/merge.c:1456
 msgid "Not possible to fast-forward, aborting."
 msgstr "Vorspulen nicht möglich, breche ab."
 
-#: builtin/merge.c:1480 builtin/merge.c:1559
+#: builtin/merge.c:1479 builtin/merge.c:1558
 #, c-format
 msgid "Rewinding the tree to pristine...\n"
 msgstr "Rücklauf des Verzeichnisses bis zum Ursprung ...\n"
 
-#: builtin/merge.c:1484
+#: builtin/merge.c:1483
 #, c-format
 msgid "Trying merge strategy %s...\n"
 msgstr "Probiere Merge-Strategie %s ...\n"
 
-#: builtin/merge.c:1550
+#: builtin/merge.c:1549
 #, c-format
 msgid "No merge strategy handled the merge.\n"
 msgstr "Keine Merge-Strategie behandelt diesen Merge.\n"
 
-#: builtin/merge.c:1552
+#: builtin/merge.c:1551
 #, c-format
 msgid "Merge with strategy %s failed.\n"
 msgstr "Merge mit Strategie %s fehlgeschlagen.\n"
 
-#: builtin/merge.c:1561
+#: builtin/merge.c:1560
 #, c-format
 msgid "Using the %s to prepare resolving by hand.\n"
 msgstr "Benutzen Sie \"%s\", um die Auflösung per Hand vorzubereiten.\n"
 
-#: builtin/merge.c:1573
+#: builtin/merge.c:1572
 #, c-format
 msgid "Automatic merge went well; stopped before committing as requested\n"
 msgstr ""
@@ -9053,23 +9692,23 @@ msgstr "git merge-base --is-ancestor <Commit> <Commit>"
 msgid "git merge-base --fork-point <ref> [<commit>]"
 msgstr "git merge-base --fork-point <Referenz> [<Commit>]"
 
-#: builtin/merge-base.c:214
+#: builtin/merge-base.c:217
 msgid "output all common ancestors"
 msgstr "Ausgabe aller gemeinsamen Vorgänger-Commits"
 
-#: builtin/merge-base.c:216
+#: builtin/merge-base.c:219
 msgid "find ancestors for a single n-way merge"
 msgstr "Vorgänger-Commits für einen einzelnen n-Wege-Merge finden"
 
-#: builtin/merge-base.c:218
+#: builtin/merge-base.c:221
 msgid "list revs not reachable from others"
 msgstr "Commits auflisten, die nicht durch Andere erreichbar sind"
 
-#: builtin/merge-base.c:220
+#: builtin/merge-base.c:223
 msgid "is the first one ancestor of the other?"
 msgstr "ist der Erste ein Vorgänger-Commit von dem Anderen?"
 
-#: builtin/merge-base.c:222
+#: builtin/merge-base.c:225
 msgid "find where <commit> forked from reflog of <ref>"
 msgstr "<Commit> finden, von wo Reflog von <Referenz> abgespalten wurde"
 
@@ -9113,6 +9752,37 @@ msgstr "keine Warnung bei Konflikten"
 msgid "set labels for file1/orig-file/file2"
 msgstr "Beschriftung für Datei1/orig-Datei/Datei2 setzen"
 
+#: builtin/merge-recursive.c:45
+#, c-format
+msgid "unknown option %s"
+msgstr "unbekannte Option: %s"
+
+#: builtin/merge-recursive.c:51
+#, c-format
+msgid "could not parse object '%s'"
+msgstr "Konnte Objekt '%s' nicht parsen."
+
+#: builtin/merge-recursive.c:55
+#, c-format
+msgid "cannot handle more than %d base. Ignoring %s."
+msgid_plural "cannot handle more than %d bases. Ignoring %s."
+msgstr[0] "kann nicht mit mehr als %d Merge-Basis umgehen. Ignoriere %s."
+msgstr[1] "kann nicht mit mehr als %d Merge-Basen umgehen. Ignoriere %s."
+
+#: builtin/merge-recursive.c:63
+msgid "not handling anything other than two heads merge."
+msgstr "Es wird nur der Merge von zwei Branches behandelt."
+
+#: builtin/merge-recursive.c:69 builtin/merge-recursive.c:71
+#, c-format
+msgid "could not resolve ref '%s'"
+msgstr "Konnte Referenz '%s' nicht auflösen"
+
+#: builtin/merge-recursive.c:77
+#, c-format
+msgid "Merging %s with %s\n"
+msgstr "Führe %s mit %s zusammen\n"
+
 #: builtin/mktree.c:65
 msgid "git mktree [-z] [--missing] [--batch]"
 msgstr "git mktree [-z] [--missing] [--batch]"
@@ -9224,43 +9894,43 @@ msgstr "Benenne %s nach %s um\n"
 msgid "renaming '%s' failed"
 msgstr "Umbenennung von '%s' fehlgeschlagen"
 
-#: builtin/name-rev.c:258
+#: builtin/name-rev.c:257
 msgid "git name-rev [<options>] <commit>..."
 msgstr "git name-rev [<Optionen>] <Commit>..."
 
-#: builtin/name-rev.c:259
+#: builtin/name-rev.c:258
 msgid "git name-rev [<options>] --all"
 msgstr "git name-rev [<Optionen>] --all"
 
-#: builtin/name-rev.c:260
+#: builtin/name-rev.c:259
 msgid "git name-rev [<options>] --stdin"
 msgstr "git name-rev [<Optionen>] --stdin"
 
-#: builtin/name-rev.c:312
+#: builtin/name-rev.c:311
 msgid "print only names (no SHA-1)"
 msgstr "nur Namen anzeigen (keine SHA-1)"
 
-#: builtin/name-rev.c:313
+#: builtin/name-rev.c:312
 msgid "only use tags to name the commits"
 msgstr "nur Tags verwenden, um die Commits zu benennen"
 
-#: builtin/name-rev.c:315
+#: builtin/name-rev.c:314
 msgid "only use refs matching <pattern>"
 msgstr "nur Referenzen verwenden die <Muster> entsprechen"
 
-#: builtin/name-rev.c:317
+#: builtin/name-rev.c:316
 msgid "list all commits reachable from all refs"
 msgstr "alle Commits auflisten, die von allen Referenzen erreichbar sind"
 
-#: builtin/name-rev.c:318
+#: builtin/name-rev.c:317
 msgid "read from stdin"
 msgstr "von der Standard-Eingabe lesen"
 
-#: builtin/name-rev.c:319
+#: builtin/name-rev.c:318
 msgid "allow to print `undefined` names (default)"
 msgstr "Ausgabe von `undefinierten` Namen erlauben (Standard)"
 
-#: builtin/name-rev.c:325
+#: builtin/name-rev.c:324
 msgid "dereference tags in the input (internal use)"
 msgstr "Tags in der Eingabe dereferenzieren (interne Verwendung)"
 
@@ -9395,9 +10065,8 @@ msgid "failed to finish 'show' for object '%s'"
 msgstr "konnte 'show' für Objekt '%s' nicht abschließen"
 
 #: builtin/notes.c:194
-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."
+msgid "please supply the note contents using either -m or -F option"
+msgstr "Bitte liefern Sie die Notiz-Inhalte unter Verwendung der Option -m oder -F."
 
 #: builtin/notes.c:203
 msgid "unable to write note object"
@@ -9405,8 +10074,8 @@ msgstr "Konnte Notiz-Objekt nicht schreiben"
 
 #: builtin/notes.c:205
 #, c-format
-msgid "The note contents have been left in %s"
-msgstr "Die Notiz-Inhalte wurden in %s belassen"
+msgid "the note contents have been left in %s"
+msgstr "Die Notiz-Inhalte wurden in %s belassen."
 
 #: builtin/notes.c:233 builtin/tag.c:439
 #, c-format
@@ -9418,52 +10087,76 @@ msgstr "kann '%s' nicht lesen"
 msgid "could not open or read '%s'"
 msgstr "konnte '%s' nicht öffnen oder lesen"
 
+#: builtin/notes.c:254 builtin/notes.c:305 builtin/notes.c:307
+#: builtin/notes.c:372 builtin/notes.c:427 builtin/notes.c:513
+#: builtin/notes.c:518 builtin/notes.c:596 builtin/notes.c:659
+#, c-format
+msgid "failed to resolve '%s' as a valid ref."
+msgstr "Konnte '%s' nicht als gültige Referenz auflösen."
+
 #: builtin/notes.c:257
 #, c-format
-msgid "Failed to read object '%s'."
+msgid "failed to read object '%s'."
 msgstr "Fehler beim Lesen des Objektes '%s'."
 
 #: builtin/notes.c:261
 #, c-format
-msgid "Cannot read note data from non-blob object '%s'."
+msgid "cannot read note data from non-blob object '%s'."
 msgstr "Kann Notiz-Daten nicht von Nicht-Blob Objekt '%s' lesen."
 
-#: builtin/notes.c:363 builtin/notes.c:418 builtin/notes.c:494
-#: builtin/notes.c:506 builtin/notes.c:582 builtin/notes.c:650
-#: builtin/notes.c:800 builtin/notes.c:947 builtin/notes.c:968
+#: builtin/notes.c:301
+#, c-format
+msgid "malformed input line: '%s'."
+msgstr "Fehlerhafte Eingabezeile: '%s'."
+
+#: builtin/notes.c:316
+#, c-format
+msgid "failed to copy notes from '%s' to '%s'"
+msgstr "Fehler beim Kopieren der Notizen von '%s' nach '%s'"
+
+#. TRANSLATORS: the first %s will be replaced by a
+#. git notes command: 'add', 'merge', 'remove', etc.
+#: builtin/notes.c:345
+#, c-format
+msgid "refusing to %s notes in %s (outside of refs/notes/)"
+msgstr "Ausführung von %s auf Notizen in %s (außerhalb von refs/notes/) zurückgewiesen"
+
+#: builtin/notes.c:365 builtin/notes.c:420 builtin/notes.c:496
+#: builtin/notes.c:508 builtin/notes.c:584 builtin/notes.c:652
+#: builtin/notes.c:802 builtin/notes.c:949 builtin/notes.c:970
 msgid "too many parameters"
 msgstr "zu viele Parameter"
 
-#: builtin/notes.c:376 builtin/notes.c:663
+#: builtin/notes.c:378 builtin/notes.c:665
 #, c-format
-msgid "No note found for object %s."
+msgid "no note found for object %s."
 msgstr "Keine Notiz für Objekt %s gefunden."
 
-#: builtin/notes.c:397 builtin/notes.c:560
+#: builtin/notes.c:399 builtin/notes.c:562
 msgid "note contents as a string"
 msgstr "Notizinhalte als Zeichenkette"
 
-#: builtin/notes.c:400 builtin/notes.c:563
+#: builtin/notes.c:402 builtin/notes.c:565
 msgid "note contents in a file"
 msgstr "Notizinhalte in einer Datei"
 
-#: builtin/notes.c:403 builtin/notes.c:566
+#: builtin/notes.c:405 builtin/notes.c:568
 msgid "reuse and edit specified note object"
 msgstr "Wiederverwendung und Bearbeitung des angegebenen Notiz-Objektes"
 
-#: builtin/notes.c:406 builtin/notes.c:569
+#: builtin/notes.c:408 builtin/notes.c:571
 msgid "reuse specified note object"
 msgstr "Wiederverwendung des angegebenen Notiz-Objektes"
 
-#: builtin/notes.c:409 builtin/notes.c:572
+#: builtin/notes.c:411 builtin/notes.c:574
 msgid "allow storing empty note"
 msgstr "Speichern leerer Notiz erlauben"
 
-#: builtin/notes.c:410 builtin/notes.c:481
+#: builtin/notes.c:412 builtin/notes.c:483
 msgid "replace existing notes"
 msgstr "existierende Notizen ersetzen"
 
-#: builtin/notes.c:435
+#: builtin/notes.c:437
 #, c-format
 msgid ""
 "Cannot add notes. Found existing notes for object %s. Use '-f' to overwrite "
@@ -9472,31 +10165,31 @@ msgstr ""
 "Konnte Notizen nicht hinzufügen. Existierende Notizen für Objekt %s "
 "gefunden. Verwenden Sie '-f', um die existierenden Notizen zu überschreiben."
 
-#: builtin/notes.c:450 builtin/notes.c:529
+#: builtin/notes.c:452 builtin/notes.c:531
 #, c-format
 msgid "Overwriting existing notes for object %s\n"
 msgstr "Überschreibe existierende Notizen für Objekt %s\n"
 
-#: builtin/notes.c:461 builtin/notes.c:622 builtin/notes.c:887
+#: builtin/notes.c:463 builtin/notes.c:624 builtin/notes.c:889
 #, c-format
 msgid "Removing note for object %s\n"
 msgstr "Entferne Notiz für Objekt %s\n"
 
-#: builtin/notes.c:482
+#: builtin/notes.c:484
 msgid "read objects from stdin"
 msgstr "Objekte von der Standard-Eingabe lesen"
 
-#: builtin/notes.c:484
+#: builtin/notes.c:486
 msgid "load rewriting config for <command> (implies --stdin)"
 msgstr ""
 "Konfiguration für <Befehl> zum Umschreiben von Commits laden (impliziert --"
 "stdin)"
 
-#: builtin/notes.c:502
+#: builtin/notes.c:504
 msgid "too few parameters"
 msgstr "zu wenig Parameter"
 
-#: builtin/notes.c:523
+#: builtin/notes.c:525
 #, c-format
 msgid ""
 "Cannot copy notes. Found existing notes for object %s. Use '-f' to overwrite "
@@ -9505,12 +10198,12 @@ msgstr ""
 "Kann Notizen nicht kopieren. Existierende Notizen für Objekt %s gefunden. "
 "Verwenden Sie '-f', um die existierenden Notizen zu überschreiben."
 
-#: builtin/notes.c:535
+#: builtin/notes.c:537
 #, c-format
-msgid "Missing notes on source object %s. Cannot copy."
+msgid "missing notes on source object %s. Cannot copy."
 msgstr "Keine Notizen für Quell-Objekt %s. Kopie nicht möglich."
 
-#: builtin/notes.c:587
+#: builtin/notes.c:589
 #, c-format
 msgid ""
 "The -m/-F/-c/-C options have been deprecated for the 'edit' subcommand.\n"
@@ -9519,20 +10212,52 @@ msgstr ""
 "Die Optionen -m/-F/-c/-C sind für den Unterbefehl 'edit' veraltet.\n"
 "Bitte benutzen Sie stattdessen 'git notes add -f -m/-F/-c/-C'.\n"
 
-#: builtin/notes.c:753
+#: builtin/notes.c:685
+msgid "failed to delete ref NOTES_MERGE_PARTIAL"
+msgstr "Fehler beim Löschen der Referenz NOTES_MERGE_PARTIAL"
+
+#: builtin/notes.c:687
+msgid "failed to delete ref NOTES_MERGE_REF"
+msgstr "Fehler beim Löschen der Referenz NOTES_MERGE_REF"
+
+#: builtin/notes.c:689
+msgid "failed to remove 'git notes merge' worktree"
+msgstr "Fehler beim Löschen des Arbeitsverzeichnisses von 'git notes merge'."
+
+#: builtin/notes.c:709
+msgid "failed to read ref NOTES_MERGE_PARTIAL"
+msgstr "Fehler beim Lesen der Referenz NOTES_MERGE_PARTIAL"
+
+#: builtin/notes.c:711
+msgid "could not find commit from NOTES_MERGE_PARTIAL."
+msgstr "Konnte Commit von NOTES_MERGE_PARTIAL nicht finden."
+
+#: builtin/notes.c:713
+msgid "could not parse commit from NOTES_MERGE_PARTIAL."
+msgstr "Konnte Commit von NOTES_MERGE_PARTIAL nicht parsen."
+
+#: builtin/notes.c:726
+msgid "failed to resolve NOTES_MERGE_REF"
+msgstr "Fehler beim Auflösen von NOTES_MERGE_REF"
+
+#: builtin/notes.c:729
+msgid "failed to finalize notes merge"
+msgstr "Fehler beim Abschließen der Zusammenführung der Notizen."
+
+#: builtin/notes.c:755
 #, c-format
 msgid "unknown notes merge strategy %s"
 msgstr "unbekannte Merge-Strategie '%s' für Notizen"
 
-#: builtin/notes.c:769
+#: builtin/notes.c:771
 msgid "General options"
 msgstr "Allgemeine Optionen"
 
-#: builtin/notes.c:771
+#: builtin/notes.c:773
 msgid "Merge options"
 msgstr "Merge-Optionen"
 
-#: builtin/notes.c:773
+#: builtin/notes.c:775
 msgid ""
 "resolve notes conflicts using the given strategy (manual/ours/theirs/union/"
 "cat_sort_uniq)"
@@ -9540,48 +10265,49 @@ msgstr ""
 "löst Konflikte bei Notizen mit der angegebenen Strategie auf (manual/ours/"
 "theirs/union/cat_sort_uniq)"
 
-#: builtin/notes.c:775
+#: builtin/notes.c:777
 msgid "Committing unmerged notes"
 msgstr "nicht zusammengeführte Notizen eintragen"
 
-#: builtin/notes.c:777
+#: builtin/notes.c:779
 msgid "finalize notes merge by committing unmerged notes"
 msgstr ""
 "Merge von Notizen abschließen, in dem nicht zusammengeführte Notizen "
 "committet werden"
 
-#: builtin/notes.c:779
+#: builtin/notes.c:781
 msgid "Aborting notes merge resolution"
 msgstr "Konfliktauflösung beim Merge von Notizen abbrechen"
 
-#: builtin/notes.c:781
+#: builtin/notes.c:783
 msgid "abort notes merge"
 msgstr "Merge von Notizen abbrechen"
 
-#: builtin/notes.c:792
+#: builtin/notes.c:794
 msgid "cannot mix --commit, --abort or -s/--strategy"
 msgstr "Kann --commit, --abort oder -s/--strategy nicht kombinieren."
 
-#: builtin/notes.c:797
-msgid "Must specify a notes ref to merge"
+#: builtin/notes.c:799
+msgid "must specify a notes ref to merge"
 msgstr "Sie müssen eine Notiz-Referenz zum Mergen angeben."
 
-#: builtin/notes.c:821
+#: builtin/notes.c:823
 #, c-format
-msgid "Unknown -s/--strategy: %s"
+msgid "unknown -s/--strategy: %s"
 msgstr "Unbekannter Wert für -s/--strategy: %s"
 
-#: builtin/notes.c:858
+#: builtin/notes.c:860
 #, c-format
-msgid "A notes merge into %s is already in-progress at %s"
+msgid "a notes merge into %s is already in-progress at %s"
 msgstr "Ein Merge von Notizen nach %s ist bereits im Gange bei %s"
 
-#: builtin/notes.c:861
+#: builtin/notes.c:863
 #, c-format
-msgid "Failed to store link to current notes ref (%s)"
-msgstr "Fehler beim Speichern der Verknüpfung zur aktuellen Notes-Referenz (%s)"
+msgid "failed to store link to current notes ref (%s)"
+msgstr ""
+"Fehler beim Speichern der Verknüpfung zur aktuellen Notes-Referenz (%s)"
 
-#: builtin/notes.c:863
+#: builtin/notes.c:865
 #, c-format
 msgid ""
 "Automatic notes merge failed. Fix conflicts in %s and commit the result with "
@@ -9589,243 +10315,240 @@ msgid ""
 "abort'.\n"
 msgstr ""
 "Automatisches Zusammenführen der Notizen fehlgeschlagen. Beheben Sie die\n"
-"Konflikte in %s und committen Sie das Ergebnis mit 'git notes merge --commit',\n"
+"Konflikte in %s und committen Sie das Ergebnis mit 'git notes merge --"
+"commit',\n"
 "oder brechen Sie den Merge mit 'git notes merge --abort' ab.\n"
 
-#: builtin/notes.c:885
+#: builtin/notes.c:887
 #, c-format
 msgid "Object %s has no note\n"
 msgstr "Objekt %s hat keine Notiz\n"
 
-#: builtin/notes.c:897
+#: builtin/notes.c:899
 msgid "attempt to remove non-existent note is not an error"
 msgstr "der Versuch, eine nicht existierende Notiz zu löschen, ist kein Fehler"
 
-#: builtin/notes.c:900
+#: builtin/notes.c:902
 msgid "read object names from the standard input"
 msgstr "Objektnamen von der Standard-Eingabe lesen"
 
-#: builtin/notes.c:938 builtin/prune.c:105 builtin/worktree.c:127
+#: builtin/notes.c:940 builtin/prune.c:105 builtin/worktree.c:127
 msgid "do not remove, show only"
 msgstr "nicht löschen, nur anzeigen"
 
-#: builtin/notes.c:939
+#: builtin/notes.c:941
 msgid "report pruned notes"
 msgstr "gelöschte Notizen melden"
 
-#: builtin/notes.c:981
+#: builtin/notes.c:983
 msgid "notes-ref"
 msgstr "Notiz-Referenz"
 
-#: builtin/notes.c:982
+#: builtin/notes.c:984
 msgid "use notes from <notes-ref>"
 msgstr "Notizen von <Notiz-Referenz> verwenden"
 
-#: builtin/notes.c:1017 builtin/remote.c:1623
+#: builtin/notes.c:1019
 #, c-format
-msgid "Unknown subcommand: %s"
+msgid "unknown subcommand: %s"
 msgstr "Unbekannter Unterbefehl: %s"
 
-#: builtin/pack-objects.c:28
+#: builtin/pack-objects.c:29
 msgid ""
 "git pack-objects --stdout [<options>...] [< <ref-list> | < <object-list>]"
 msgstr ""
 "git pack-objects --stdout [<Optionen>...] [< <Referenzliste> | < "
 "<Objektliste>]"
 
-#: builtin/pack-objects.c:29
+#: builtin/pack-objects.c:30
 msgid ""
 "git pack-objects [<options>...] <base-name> [< <ref-list> | < <object-list>]"
 msgstr ""
 "git pack-objects [<Optionen>...] <Basis-Name> [< <Referenzliste> | < "
 "<Objektliste>]"
 
-#: builtin/pack-objects.c:177 builtin/pack-objects.c:180
+#: builtin/pack-objects.c:179 builtin/pack-objects.c:182
 #, c-format
 msgid "deflate error (%d)"
 msgstr "Fehler beim Komprimieren (%d)"
 
-#: builtin/pack-objects.c:766
+#: builtin/pack-objects.c:768
 msgid "disabling bitmap writing, packs are split due to pack.packSizeLimit"
 msgstr ""
 "Deaktiviere Schreiben der Bitmap, Pakete wurden durch pack.packSizeLimit\n"
 "aufgetrennt."
 
-#: builtin/pack-objects.c:779
+#: builtin/pack-objects.c:781
 msgid "Writing objects"
 msgstr "Schreibe Objekte"
 
-#: builtin/pack-objects.c:1037
+#: builtin/pack-objects.c:1070
 msgid "disabling bitmap writing, as some objects are not being packed"
 msgstr ""
 "Deaktiviere Schreiben der Bitmap, da einige Objekte nicht in eine Pack-"
 "Datei\n"
 "geschrieben wurden."
 
-#: builtin/pack-objects.c:2197
+#: builtin/pack-objects.c:2346
 msgid "Compressing objects"
 msgstr "Komprimiere Objekte"
 
-#: builtin/pack-objects.c:2611
+#: builtin/pack-objects.c:2759
 #, c-format
 msgid "unsupported index version %s"
 msgstr "Nicht unterstützte Index-Version %s"
 
-#: builtin/pack-objects.c:2615
+#: builtin/pack-objects.c:2763
 #, c-format
 msgid "bad index version '%s'"
 msgstr "Ungültige Index-Version '%s'"
 
-#: builtin/pack-objects.c:2645
+#: builtin/pack-objects.c:2793
 msgid "do not show progress meter"
 msgstr "keine Fortschrittsanzeige anzeigen"
 
-#: builtin/pack-objects.c:2647
+#: builtin/pack-objects.c:2795
 msgid "show progress meter"
 msgstr "Fortschrittsanzeige anzeigen"
 
-#: builtin/pack-objects.c:2649
+#: builtin/pack-objects.c:2797
 msgid "show progress meter during object writing phase"
 msgstr ""
 "Forschrittsanzeige während der Phase des Schreibens der Objekte anzeigen"
 
-#: builtin/pack-objects.c:2652
+#: builtin/pack-objects.c:2800
 msgid "similar to --all-progress when progress meter is shown"
 msgstr "ähnlich zu --all-progress wenn Fortschrittsanzeige darstellt wird"
 
-#: builtin/pack-objects.c:2653
+#: builtin/pack-objects.c:2801
 msgid "version[,offset]"
 msgstr "version[,offset]"
 
-#: builtin/pack-objects.c:2654
+#: builtin/pack-objects.c:2802
 msgid "write the pack index file in the specified idx format version"
 msgstr ""
 "die Index-Datei des Paketes in der angegebenen Indexformat-Version schreiben"
 
-#: builtin/pack-objects.c:2657
+#: builtin/pack-objects.c:2805
 msgid "maximum size of each output pack file"
 msgstr "maximale Größe für jede ausgegebene Paketdatei"
 
-#: builtin/pack-objects.c:2659
+#: builtin/pack-objects.c:2807
 msgid "ignore borrowed objects from alternate object store"
 msgstr "geliehene Objekte von alternativem Objektspeicher ignorieren"
 
-#: builtin/pack-objects.c:2661
+#: builtin/pack-objects.c:2809
 msgid "ignore packed objects"
 msgstr "gepackte Objekte ignorieren"
 
-#: builtin/pack-objects.c:2663
+#: builtin/pack-objects.c:2811
 msgid "limit pack window by objects"
 msgstr "Paketfenster durch Objekte begrenzen"
 
-#: builtin/pack-objects.c:2665
+#: builtin/pack-objects.c:2813
 msgid "limit pack window by memory in addition to object limit"
 msgstr ""
 "Paketfenster, zusätzlich zur Objektbegrenzung, durch Speicher begrenzen"
 
-#: builtin/pack-objects.c:2667
+#: builtin/pack-objects.c:2815
 msgid "maximum length of delta chain allowed in the resulting pack"
 msgstr ""
 "maximale Länge der erlaubten Differenzverkettung im resultierenden Paket"
 
-#: builtin/pack-objects.c:2669
+#: builtin/pack-objects.c:2817
 msgid "reuse existing deltas"
 msgstr "existierende Unterschiede wiederverwenden"
 
-#: builtin/pack-objects.c:2671
+#: builtin/pack-objects.c:2819
 msgid "reuse existing objects"
 msgstr "existierende Objekte wiederverwenden"
 
-#: builtin/pack-objects.c:2673
+#: builtin/pack-objects.c:2821
 msgid "use OFS_DELTA objects"
 msgstr "OFS_DELTA Objekte verwenden"
 
-#: builtin/pack-objects.c:2675
+#: builtin/pack-objects.c:2823
 msgid "use threads when searching for best delta matches"
 msgstr ""
 "Threads bei der Suche nach den besten Übereinstimmungen bei Unterschieden "
 "verwenden"
 
-#: builtin/pack-objects.c:2677
+#: builtin/pack-objects.c:2825
 msgid "do not create an empty pack output"
 msgstr "keine leeren Pakete erzeugen"
 
-#: builtin/pack-objects.c:2679
+#: builtin/pack-objects.c:2827
 msgid "read revision arguments from standard input"
 msgstr "Argumente bezüglich Commits von der Standard-Eingabe lesen"
 
-#: builtin/pack-objects.c:2681
+#: builtin/pack-objects.c:2829
 msgid "limit the objects to those that are not yet packed"
 msgstr "die Objekte zu solchen, die noch nicht gepackt wurden, begrenzen"
 
-#: builtin/pack-objects.c:2684
+#: builtin/pack-objects.c:2832
 msgid "include objects reachable from any reference"
 msgstr "Objekte einschließen, die von jeder Referenz erreichbar sind"
 
-#: builtin/pack-objects.c:2687
+#: builtin/pack-objects.c:2835
 msgid "include objects referred by reflog entries"
 msgstr ""
 "Objekte einschließen, die von Einträgen des Reflogs referenziert werden"
 
-#: builtin/pack-objects.c:2690
+#: builtin/pack-objects.c:2838
 msgid "include objects referred to by the index"
 msgstr "Objekte einschließen, die vom Index referenziert werden"
 
-#: builtin/pack-objects.c:2693
+#: builtin/pack-objects.c:2841
 msgid "output pack to stdout"
 msgstr "Paket in die Standard-Ausgabe schreiben"
 
-#: builtin/pack-objects.c:2695
+#: builtin/pack-objects.c:2843
 msgid "include tag objects that refer to objects to be packed"
 msgstr "Tag-Objekte einschließen, die auf gepackte Objekte referenzieren"
 
-#: builtin/pack-objects.c:2697
+#: builtin/pack-objects.c:2845
 msgid "keep unreachable objects"
 msgstr "nicht erreichbare Objekte behalten"
 
-#: builtin/pack-objects.c:2699
+#: builtin/pack-objects.c:2847
 msgid "pack loose unreachable objects"
 msgstr "nicht erreichbare lose Objekte packen"
 
-#: builtin/pack-objects.c:2700 parse-options.h:142
-msgid "time"
-msgstr "Zeit"
-
-#: builtin/pack-objects.c:2701
+#: builtin/pack-objects.c:2849
 msgid "unpack unreachable objects newer than <time>"
 msgstr "nicht erreichbare Objekte entpacken, die neuer als <Zeit> sind"
 
-#: builtin/pack-objects.c:2704
+#: builtin/pack-objects.c:2852
 msgid "create thin packs"
 msgstr "dünnere Pakete erzeugen"
 
-#: builtin/pack-objects.c:2706
+#: builtin/pack-objects.c:2854
 msgid "create packs suitable for shallow fetches"
 msgstr ""
 "Pakete geeignet für Abholung mit unvollständiger Historie (shallow) erzeugen"
 
-#: builtin/pack-objects.c:2708
+#: builtin/pack-objects.c:2856
 msgid "ignore packs that have companion .keep file"
 msgstr "Pakete ignorieren, die .keep Dateien haben"
 
-#: builtin/pack-objects.c:2710
+#: builtin/pack-objects.c:2858
 msgid "pack compression level"
 msgstr "Komprimierungsgrad für Paketierung"
 
-#: builtin/pack-objects.c:2712
+#: builtin/pack-objects.c:2860
 msgid "do not hide commits by grafts"
 msgstr "keine künstlichen Vorgänger-Commits (\"grafts\") verbergen"
 
-#: builtin/pack-objects.c:2714
+#: builtin/pack-objects.c:2862
 msgid "use a bitmap index if available to speed up counting objects"
 msgstr ""
 "Bitmap-Index (falls verfügbar) zur Optimierung der Objektzählung benutzen"
 
-#: builtin/pack-objects.c:2716
+#: builtin/pack-objects.c:2864
 msgid "write a bitmap index together with the pack index"
 msgstr "Bitmap-Index zusammen mit Pack-Index schreiben"
 
-#: builtin/pack-objects.c:2829
+#: builtin/pack-objects.c:2993
 msgid "Counting objects"
 msgstr "Zähle Objekte"
 
@@ -9865,56 +10588,45 @@ msgstr "Objekte älter als <Zeit> verfallen lassen"
 msgid "cannot prune in a precious-objects repo"
 msgstr "kann \"prune\" in precious-objects Repository nicht ausführen"
 
-#: builtin/pull.c:72
+#: builtin/pull.c:51 builtin/pull.c:53
+#, c-format
+msgid "Invalid value for %s: %s"
+msgstr "Ungültiger Wert für %s: %s"
+
+#: builtin/pull.c:73
 msgid "git pull [<options>] [<repository> [<refspec>...]]"
 msgstr "git pull [<Optionen>] [<Repository> [<Refspec>...]]"
 
-#: builtin/pull.c:120
+#: builtin/pull.c:121
 msgid "Options related to merging"
 msgstr "Optionen bezogen auf Merge"
 
-#: builtin/pull.c:123
+#: builtin/pull.c:124
 msgid "incorporate changes by rebasing rather than merging"
 msgstr "Integration von Änderungen durch Rebase statt Merge"
 
-#: builtin/pull.c:147 builtin/revert.c:101
+#: builtin/pull.c:148 builtin/revert.c:101
 msgid "allow fast-forward"
 msgstr "Vorspulen erlauben"
 
-#: builtin/pull.c:156
+#: builtin/pull.c:157
 msgid "automatically stash/stash pop before and after rebase"
 msgstr "automatischer Stash/Stash-Pop vor und nach eines Rebase"
 
-#: builtin/pull.c:172
+#: builtin/pull.c:173
 msgid "Options related to fetching"
 msgstr "Optionen bezogen auf Fetch"
 
-#: builtin/pull.c:194
+#: builtin/pull.c:195
 msgid "number of submodules pulled in parallel"
 msgstr "Anzahl der parallel mit 'pull' zu verarbeitenden Submodule"
 
-#: builtin/pull.c:283
+#: builtin/pull.c:284
 #, c-format
 msgid "Invalid value for pull.ff: %s"
 msgstr "Ungültiger Wert für pull.ff: %s"
 
-#: builtin/pull.c:379 git-sh-setup.sh:226
-msgid "Cannot pull with rebase: You have unstaged changes."
-msgstr ""
-"Kann \"pull\" mit \"rebase\" nicht ausführen: Sie haben Änderungen, die "
-"nicht zum Commit vorgemerkt sind."
-
-#: builtin/pull.c:385 git-sh-setup.sh:252
-msgid "Additionally, your index contains uncommitted changes."
-msgstr "Zusätzlich beinhaltet die Staging-Area nicht committete Änderungen."
-
-#: builtin/pull.c:387 git-sh-setup.sh:245
-msgid "Cannot pull with rebase: Your index contains uncommitted changes."
-msgstr ""
-"Kann \"pull\" mit \"rebase\" nicht ausführen: Die Staging-Area beinhaltet "
-"nicht committete Änderungen."
-
-#: builtin/pull.c:463
+#: builtin/pull.c:397
 msgid ""
 "There is no candidate for rebasing against among the refs that you just "
 "fetched."
@@ -9922,14 +10634,14 @@ msgstr ""
 "Es gibt keinen Kandidaten für Rebase innerhalb der Referenzen, die eben "
 "angefordert wurden."
 
-#: builtin/pull.c:465
+#: builtin/pull.c:399
 msgid ""
 "There are no candidates for merging among the refs that you just fetched."
 msgstr ""
 "Es gibt keine Kandidaten für Merge innerhalb der Referenzen, die eben "
 "angefordert wurden."
 
-#: builtin/pull.c:466
+#: builtin/pull.c:400
 msgid ""
 "Generally this means that you provided a wildcard refspec which had no\n"
 "matches on the remote end."
@@ -9937,7 +10649,7 @@ msgstr ""
 "Im Allgemeinen bedeutet das, dass Sie einen Refspec mit Wildcards angegeben\n"
 "haben, der auf der Gegenseite mit keinen Referenzen übereinstimmt."
 
-#: builtin/pull.c:469
+#: builtin/pull.c:403
 #, c-format
 msgid ""
 "You asked to pull from the remote '%s', but did not specify\n"
@@ -9949,39 +10661,39 @@ msgstr ""
 "Repository für den aktuellen Branch ist, müssen Sie einen Branch auf\n"
 "der Befehlszeile angeben."
 
-#: builtin/pull.c:474 git-parse-remote.sh:73
+#: builtin/pull.c:408 git-parse-remote.sh:73
 msgid "You are not currently on a branch."
 msgstr "Im Moment auf keinem Branch."
 
-#: builtin/pull.c:476 builtin/pull.c:491 git-parse-remote.sh:79
+#: builtin/pull.c:410 builtin/pull.c:425 git-parse-remote.sh:79
 msgid "Please specify which branch you want to rebase against."
 msgstr ""
 "Bitte geben Sie den Branch an, gegen welchen Sie \"rebase\" ausführen "
 "möchten."
 
-#: builtin/pull.c:478 builtin/pull.c:493 git-parse-remote.sh:82
+#: builtin/pull.c:412 builtin/pull.c:427 git-parse-remote.sh:82
 msgid "Please specify which branch you want to merge with."
 msgstr "Bitte geben Sie den Branch an, welchen Sie zusammenführen möchten."
 
-#: builtin/pull.c:479 builtin/pull.c:494
+#: builtin/pull.c:413 builtin/pull.c:428
 msgid "See git-pull(1) for details."
 msgstr "Siehe git-pull(1) für weitere Details."
 
-#: builtin/pull.c:481 builtin/pull.c:487 builtin/pull.c:496
+#: builtin/pull.c:415 builtin/pull.c:421 builtin/pull.c:430
 #: git-parse-remote.sh:64
 msgid "<remote>"
 msgstr "<Remote-Repository>"
 
-#: builtin/pull.c:481 builtin/pull.c:496 builtin/pull.c:501 git-rebase.sh:451
+#: builtin/pull.c:415 builtin/pull.c:430 builtin/pull.c:435 git-rebase.sh:451
 #: git-parse-remote.sh:65
 msgid "<branch>"
 msgstr "<Branch>"
 
-#: builtin/pull.c:489 git-parse-remote.sh:75
+#: builtin/pull.c:423 git-parse-remote.sh:75
 msgid "There is no tracking information for the current branch."
 msgstr "Es gibt keine Tracking-Informationen für den aktuellen Branch."
 
-#: builtin/pull.c:498 git-parse-remote.sh:95
+#: builtin/pull.c:432 git-parse-remote.sh:95
 msgid ""
 "If you wish to set tracking information for this branch you can do so with:"
 msgstr ""
@@ -9989,7 +10701,7 @@ msgstr ""
 "Sie\n"
 "dies tun mit:"
 
-#: builtin/pull.c:503
+#: builtin/pull.c:437
 #, c-format
 msgid ""
 "Your configuration specifies to merge with the ref '%s'\n"
@@ -9999,21 +10711,29 @@ msgstr ""
 "des Remote-Repositories durchzuführen, aber diese Referenz\n"
 "wurde nicht angefordert."
 
-#: builtin/pull.c:820
+#: builtin/pull.c:754
 msgid "ignoring --verify-signatures for rebase"
 msgstr "Ignoriere --verify-signatures für Rebase"
 
-#: builtin/pull.c:867
+#: builtin/pull.c:801
 msgid "--[no-]autostash option is only valid with --rebase."
 msgstr "--[no-]autostash ist nur mit --rebase zulässig."
 
-#: builtin/pull.c:875
+#: builtin/pull.c:809
 msgid "Updating an unborn branch with changes added to the index."
 msgstr ""
 "Aktualisiere einen ungeborenen Branch mit Änderungen, die zum Commit "
 "vorgemerkt sind."
 
-#: builtin/pull.c:903
+#: builtin/pull.c:812
+msgid "pull with rebase"
+msgstr "Pull mit Rebase"
+
+#: builtin/pull.c:813
+msgid "please commit or stash them."
+msgstr "Bitte committen Sie die Änderungen oder benutzen Sie \"stash\"."
+
+#: builtin/pull.c:838
 #, c-format
 msgid ""
 "fetch updated the current branch head.\n"
@@ -10023,7 +10743,7 @@ msgstr ""
 "\"fetch\" aktualisierte die Spitze des aktuellen Branches.\n"
 "Spule Ihr Arbeitsverzeichnis von Commit %s vor."
 
-#: builtin/pull.c:908
+#: builtin/pull.c:843
 #, c-format
 msgid ""
 "Cannot fast-forward your working tree.\n"
@@ -10040,11 +10760,11 @@ msgstr ""
 "$ git reset --hard\n"
 "zur Wiederherstellung aus."
 
-#: builtin/pull.c:923
+#: builtin/pull.c:858
 msgid "Cannot merge multiple branches into empty head."
 msgstr "Kann nicht mehrere Branches in einen leeren Branch zusammenführen."
 
-#: builtin/pull.c:927
+#: builtin/pull.c:862
 msgid "Cannot rebase onto multiple branches."
 msgstr "Kann Rebase nicht auf mehrere Branches ausführen."
 
@@ -10430,17 +11150,70 @@ msgstr "Anwendung des Filters für partielles Auschecken überspringen"
 
 #: builtin/read-tree.c:139
 msgid "debug unpack-trees"
-msgstr "Entpacken der Bäume protokollieren"
+msgstr "unpack-trees protokollieren"
 
-#: builtin/receive-pack.c:25
+#: builtin/receive-pack.c:26
 msgid "git receive-pack <git-dir>"
 msgstr "git receive-pack <Git-Verzeichnis>"
 
-#: builtin/receive-pack.c:1843
+#: builtin/receive-pack.c:793
+msgid ""
+"By default, updating the current branch in a non-bare repository\n"
+"is denied, because it will make the index and work tree inconsistent\n"
+"with what you pushed, and will require 'git reset --hard' to match\n"
+"the work tree to HEAD.\n"
+"\n"
+"You can set 'receive.denyCurrentBranch' configuration variable to\n"
+"'ignore' or 'warn' in the remote repository to allow pushing into\n"
+"its current branch; however, this is not recommended unless you\n"
+"arranged to update its work tree to match what you pushed in some\n"
+"other way.\n"
+"\n"
+"To squelch this message and still keep the default behaviour, set\n"
+"'receive.denyCurrentBranch' configuration variable to 'refuse'."
+msgstr ""
+"Standardmäßig wird die Aktualisierung des aktuellen Branches in einem\n"
+"nicht-Bare-Repository zurückgewiesen, da dies den Index und das Arbeits-\n"
+"verzeichnis inkonsistent zu dem machen würde, was Sie gepushed haben, und\n"
+"'git reset --hard' erforderlich wäre, damit das Arbeitsverzeichnis HEAD\n"
+"entspricht.\n"
+"\n"
+"Sie könnten die Konfigurationsvariable 'receive.denyCurrentBranch' im\n"
+"Remote-Repository zu 'ignore' oder 'warn' setzen, um den Push in den\n"
+"aktuellen Branch zu erlauben; dies wird jedoch nicht empfohlen außer\n"
+"Sie stellen durch andere Wege die Aktualität des Arbeitsverzeichnisses\n"
+"gegenüber dem gepushten Stand sicher.\n"
+"\n"
+"Um diese Meldung zu unterdrücken und das Standardverhalten zu behalten,\n"
+"setzen Sie die Konfigurationsvariable 'receive.denyCurrentBranch' auf\n"
+"'refuse'."
+
+#: builtin/receive-pack.c:813
+msgid ""
+"By default, deleting the current branch is denied, because the next\n"
+"'git clone' won't result in any file checked out, causing confusion.\n"
+"\n"
+"You can set 'receive.denyDeleteCurrent' configuration variable to\n"
+"'warn' or 'ignore' in the remote repository to allow deleting the\n"
+"current branch, with or without a warning message.\n"
+"\n"
+"To squelch this message, you can set it to 'refuse'."
+msgstr ""
+"Standardmäßig wird das Löschen des aktuellen Branches zurückgewiesen,\n"
+"da beim nächsten 'git clone' keine Dateien ausgecheckt werden würden,\n"
+"was zu Verwunderung führt.\n"
+"\n"
+"Sie können die Konfigurationsvariable 'receive.denyDeleteCurrent' im\n"
+"Remote-Repository auf 'warn' oder 'ignore' setzen, um das Löschen des\n"
+"aktuellen Branch mit oder ohne Warnung zu erlauben.\n"
+"\n"
+"Um diese Meldung zu unterdrücken, setzen Sie die Variable auf 'refuse'."
+
+#: builtin/receive-pack.c:1883
 msgid "quiet"
 msgstr "weniger Ausgaben"
 
-#: builtin/receive-pack.c:1857
+#: builtin/receive-pack.c:1897
 msgid "You must specify a directory."
 msgstr "Sie müssen ein Repository angeben."
 
@@ -10777,7 +11550,7 @@ msgstr "* Remote-Repository %s"
 msgid "  Fetch URL: %s"
 msgstr "  URL zum Abholen: %s"
 
-#: builtin/remote.c:1143 builtin/remote.c:1156 builtin/remote.c:1296
+#: builtin/remote.c:1143 builtin/remote.c:1156 builtin/remote.c:1295
 msgid "(no URL)"
 msgstr "(keine URL)"
 
@@ -10816,7 +11589,7 @@ msgid_plural "  Remote branches:%s"
 msgstr[0] "  Remote-Branch:%s"
 msgstr[1] "  Remote-Branches:%s"
 
-#: builtin/remote.c:1179 builtin/remote.c:1206
+#: builtin/remote.c:1179 builtin/remote.c:1205
 msgid " (status not queried)"
 msgstr " (Zustand nicht abgefragt)"
 
@@ -10830,141 +11603,146 @@ msgstr[1] "  Lokale Branches konfiguriert für 'git pull':"
 msgid "  Local refs will be mirrored by 'git push'"
 msgstr "  Lokale Referenzen werden von 'git push' gespiegelt"
 
-#: builtin/remote.c:1203
+#: builtin/remote.c:1202
 #, c-format
 msgid "  Local ref configured for 'git push'%s:"
 msgid_plural "  Local refs configured for 'git push'%s:"
 msgstr[0] "  Lokale Referenz konfiguriert für 'git push'%s:"
 msgstr[1] "  Lokale Referenzen konfiguriert für 'git push'%s:"
 
-#: builtin/remote.c:1224
+#: builtin/remote.c:1223
 msgid "set refs/remotes/<name>/HEAD according to remote"
 msgstr "setzt refs/remotes/<Name>/HEAD gemäß dem Remote-Repository"
 
-#: builtin/remote.c:1226
+#: builtin/remote.c:1225
 msgid "delete refs/remotes/<name>/HEAD"
 msgstr "entfernt refs/remotes/<Name>/HEAD"
 
-#: builtin/remote.c:1241
+#: builtin/remote.c:1240
 msgid "Cannot determine remote HEAD"
 msgstr "Kann HEAD des Remote-Repositories nicht bestimmen"
 
-#: builtin/remote.c:1243
+#: builtin/remote.c:1242
 msgid "Multiple remote HEAD branches. Please choose one explicitly with:"
 msgstr ""
 "Mehrere Hauptbranches im Remote-Repository. Bitte wählen Sie explizit einen "
 "aus mit:"
 
-#: builtin/remote.c:1253
+#: builtin/remote.c:1252
 #, c-format
 msgid "Could not delete %s"
 msgstr "Konnte %s nicht entfernen"
 
-#: builtin/remote.c:1261
+#: builtin/remote.c:1260
 #, c-format
 msgid "Not a valid ref: %s"
 msgstr "keine gültige Referenz: %s"
 
-#: builtin/remote.c:1263
+#: builtin/remote.c:1262
 #, c-format
 msgid "Could not setup %s"
 msgstr "Konnte %s nicht einrichten"
 
-#: builtin/remote.c:1281
+#: builtin/remote.c:1280
 #, c-format
 msgid " %s will become dangling!"
 msgstr " %s wird unreferenziert!"
 
-#: builtin/remote.c:1282
+#: builtin/remote.c:1281
 #, c-format
 msgid " %s has become dangling!"
 msgstr " %s wurde unreferenziert!"
 
-#: builtin/remote.c:1292
+#: builtin/remote.c:1291
 #, c-format
 msgid "Pruning %s"
 msgstr "entferne veraltete Branches von %s"
 
-#: builtin/remote.c:1293
+#: builtin/remote.c:1292
 #, c-format
 msgid "URL: %s"
 msgstr "URL: %s"
 
-#: builtin/remote.c:1309
+#: builtin/remote.c:1308
 #, c-format
 msgid " * [would prune] %s"
 msgstr " * [würde veralteten Branch entfernen] %s"
 
-#: builtin/remote.c:1312
+#: builtin/remote.c:1311
 #, c-format
 msgid " * [pruned] %s"
 msgstr "* [veralteten Branch entfernt] %s"
 
-#: builtin/remote.c:1357
+#: builtin/remote.c:1356
 msgid "prune remotes after fetching"
 msgstr "entferne veraltete Branches im Remote-Repository nach \"fetch\""
 
-#: builtin/remote.c:1420 builtin/remote.c:1474 builtin/remote.c:1542
+#: builtin/remote.c:1419 builtin/remote.c:1473 builtin/remote.c:1541
 #, c-format
 msgid "No such remote '%s'"
 msgstr "Kein solches Remote-Repository '%s'"
 
-#: builtin/remote.c:1436
+#: builtin/remote.c:1435
 msgid "add branch"
 msgstr "Branch hinzufügen"
 
-#: builtin/remote.c:1443
+#: builtin/remote.c:1442
 msgid "no remote specified"
 msgstr "kein Remote-Repository angegeben"
 
-#: builtin/remote.c:1460
+#: builtin/remote.c:1459
 msgid "query push URLs rather than fetch URLs"
 msgstr "nur URLs für Push ausgeben"
 
-#: builtin/remote.c:1462
+#: builtin/remote.c:1461
 msgid "return all URLs"
 msgstr "alle URLs ausgeben"
 
-#: builtin/remote.c:1490
+#: builtin/remote.c:1489
 #, c-format
 msgid "no URLs configured for remote '%s'"
 msgstr "Keine URLs für Remote-Repository '%s' konfiguriert."
 
-#: builtin/remote.c:1516
+#: builtin/remote.c:1515
 msgid "manipulate push URLs"
 msgstr "URLs für \"push\" manipulieren"
 
-#: builtin/remote.c:1518
+#: builtin/remote.c:1517
 msgid "add URL"
 msgstr "URL hinzufügen"
 
-#: builtin/remote.c:1520
+#: builtin/remote.c:1519
 msgid "delete URLs"
 msgstr "URLs löschen"
 
-#: builtin/remote.c:1527
+#: builtin/remote.c:1526
 msgid "--add --delete doesn't make sense"
 msgstr ""
 "Die Optionen --add und --delete können nicht gemeinsam verwendet werden."
 
-#: builtin/remote.c:1568
+#: builtin/remote.c:1567
 #, c-format
 msgid "Invalid old URL pattern: %s"
 msgstr "ungültiges altes URL Format: %s"
 
-#: builtin/remote.c:1576
+#: builtin/remote.c:1575
 #, c-format
 msgid "No such URL found: %s"
 msgstr "Keine solche URL gefunden: %s"
 
-#: builtin/remote.c:1578
+#: builtin/remote.c:1577
 msgid "Will not delete all non-push URLs"
 msgstr "Werde keine URLs entfernen, die nicht für \"push\" bestimmt sind"
 
-#: builtin/remote.c:1592
+#: builtin/remote.c:1591
 msgid "be verbose; must be placed before a subcommand"
 msgstr "erweiterte Ausgaben; muss vor einem Unterbefehl angegeben werden"
 
+#: builtin/remote.c:1622
+#, c-format
+msgid "Unknown subcommand: %s"
+msgstr "Unbekannter Unterbefehl: %s"
+
 #: builtin/repack.c:17
 msgid "git repack [<options>]"
 msgstr "git repack [<Optionen>]"
@@ -11154,8 +11932,8 @@ msgstr ""
 "git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [<Commit>]"
 
 #: builtin/reset.c:27
-msgid "git reset [-q] <tree-ish> [--] <paths>..."
-msgstr "git reset [-q] <Commit-Referenz> [--] <Pfade>..."
+msgid "git reset [-q] [<tree-ish>] [--] <paths>..."
+msgstr "git reset [-q] [<Commit-Referenz>] [--] <Pfade>..."
 
 #: builtin/reset.c:28
 msgid "git reset --patch [<tree-ish>] [--] [<paths>...]"
@@ -11275,28 +12053,28 @@ msgstr "Konnte Index-Datei nicht zu Commit '%s' setzen."
 msgid "Could not write new index file."
 msgstr "Konnte neue Index-Datei nicht schreiben."
 
-#: builtin/rev-list.c:362
+#: builtin/rev-list.c:354
 msgid "rev-list does not support display of notes"
 msgstr "rev-list unterstützt keine Anzeige von Notizen"
 
-#: builtin/rev-parse.c:358
+#: builtin/rev-parse.c:386
 msgid "git rev-parse --parseopt [<options>] -- [<args>...]"
 msgstr "git rev-parse --parseopt [<Optionen>] -- [<Argumente>...]"
 
-#: builtin/rev-parse.c:363
+#: builtin/rev-parse.c:391
 msgid "keep the `--` passed as an arg"
 msgstr "`--` als Argument lassen"
 
-#: builtin/rev-parse.c:365
+#: builtin/rev-parse.c:393
 msgid "stop parsing after the first non-option argument"
 msgstr "das Parsen nach dem ersten Argument, was keine Option ist, stoppen"
 
-#: builtin/rev-parse.c:368
+#: builtin/rev-parse.c:396
 msgid "output in stuck long form"
 msgstr ""
 "Ausgabe in Langform mit Argumenten an den Optionen (getrennt durch '=')"
 
-#: builtin/rev-parse.c:499
+#: builtin/rev-parse.c:527
 msgid ""
 "git rev-parse --parseopt [<options>] -- [<args>...]\n"
 "   or: git rev-parse --sq-quote [<arg>...]\n"
@@ -11388,7 +12166,7 @@ msgstr "redundante, leere Commits behalten"
 msgid "revert failed"
 msgstr "\"revert\" fehlgeschlagen"
 
-#: builtin/revert.c:207
+#: builtin/revert.c:205
 msgid "cherry-pick failed"
 msgstr "\"cherry-pick\" fehlgeschlagen"
 
@@ -11562,71 +12340,125 @@ msgstr ""
 msgid "git show-branch (-g | --reflog)[=<n>[,<base>]] [--list] [<ref>]"
 msgstr "git show-branch (-g | --reflog)[=<n>[,<Basis>]] [--list] [<Referenz>]"
 
-#: builtin/show-branch.c:640
+#: builtin/show-branch.c:375
+#, c-format
+msgid "ignoring %s; cannot handle more than %d ref"
+msgid_plural "ignoring %s; cannot handle more than %d refs"
+msgstr[0] "ignoriere %s; kann nicht mehr als %d Referenz behandeln"
+msgstr[1] "ignoriere %s; kann nicht mehr als %d Referenzen behandeln"
+
+#: builtin/show-branch.c:541
+#, c-format
+msgid "no matching refs with %s"
+msgstr "keine übereinstimmenden Referenzen mit %s"
+
+#: builtin/show-branch.c:639
 msgid "show remote-tracking and local branches"
 msgstr "Remote-Tracking und lokale Branches anzeigen"
 
-#: builtin/show-branch.c:642
+#: builtin/show-branch.c:641
 msgid "show remote-tracking branches"
 msgstr "Remote-Tracking-Branches anzeigen"
 
-#: builtin/show-branch.c:644
+#: builtin/show-branch.c:643
 msgid "color '*!+-' corresponding to the branch"
 msgstr "'*!+-' entsprechend des Branches einfärben"
 
-#: builtin/show-branch.c:646
+#: builtin/show-branch.c:645
 msgid "show <n> more commits after the common ancestor"
 msgstr "<n> weitere Commits nach dem gemeinsamen Vorgänger-Commit anzeigen"
 
-#: builtin/show-branch.c:648
+#: builtin/show-branch.c:647
 msgid "synonym to more=-1"
 msgstr "Synonym für more=-1"
 
-#: builtin/show-branch.c:649
+#: builtin/show-branch.c:648
 msgid "suppress naming strings"
 msgstr "Namen unterdrücken"
 
-#: builtin/show-branch.c:651
+#: builtin/show-branch.c:650
 msgid "include the current branch"
 msgstr "den aktuellen Branch einbeziehen"
 
-#: builtin/show-branch.c:653
+#: builtin/show-branch.c:652
 msgid "name commits with their object names"
 msgstr "Commits nach ihren Objektnamen benennen"
 
-#: builtin/show-branch.c:655
+#: builtin/show-branch.c:654
 msgid "show possible merge bases"
 msgstr "mögliche Merge-Basen anzeigen"
 
-#: builtin/show-branch.c:657
+#: builtin/show-branch.c:656
 msgid "show refs unreachable from any other ref"
 msgstr ""
 "Referenzen, die unerreichbar von allen anderen Referenzen sind, anzeigen"
 
-#: builtin/show-branch.c:659
+#: builtin/show-branch.c:658
 msgid "show commits in topological order"
 msgstr "Commits in topologischer Ordnung anzeigen"
 
-#: builtin/show-branch.c:662
+#: builtin/show-branch.c:661
 msgid "show only commits not on the first branch"
 msgstr "nur Commits anzeigen, die sich nicht im ersten Branch befinden"
 
-#: builtin/show-branch.c:664
+#: builtin/show-branch.c:663
 msgid "show merges reachable from only one tip"
 msgstr "Merges anzeigen, die nur von einem Branch aus erreichbar sind"
 
-#: builtin/show-branch.c:666
+#: builtin/show-branch.c:665
 msgid "topologically sort, maintaining date order where possible"
 msgstr "topologische Sortierung, Beibehaltung Datumsordnung wo möglich"
 
-#: builtin/show-branch.c:669
+#: builtin/show-branch.c:668
 msgid "<n>[,<base>]"
 msgstr "<n>[,<Basis>]"
 
-#: builtin/show-branch.c:670
+#: builtin/show-branch.c:669
 msgid "show <n> most recent ref-log entries starting at base"
 msgstr "die <n> jüngsten Einträge im Reflog, beginnend an der Basis, anzeigen"
 
+#: builtin/show-branch.c:703
+msgid ""
+"--reflog is incompatible with --all, --remotes, --independent or --merge-base"
+msgstr "--reflog ist inkompatibel mit --all, --remotes, --independent oder --merge-base"
+
+#: builtin/show-branch.c:727
+msgid "no branches given, and HEAD is not valid"
+msgstr "keine Branches angegeben, und HEAD ist ungültig"
+
+#: builtin/show-branch.c:730
+msgid "--reflog option needs one branch name"
+msgstr "Die Option --reflog benötigt einen Branchnamen."
+
+#: builtin/show-branch.c:733
+#, c-format
+msgid "only %d entry can be shown at one time."
+msgid_plural "only %d entries can be shown at one time."
+msgstr[0] "nur %d Eintrag kann zur selben Zeit angezeigt werden"
+msgstr[1] "nur %d Einträge können zur selben Zeit angezeigt werden"
+
+#: builtin/show-branch.c:737
+#, c-format
+msgid "no such ref %s"
+msgstr "Referenz nicht gefunden: %s"
+
+#: builtin/show-branch.c:829
+#, c-format
+msgid "cannot handle more than %d rev."
+msgid_plural "cannot handle more than %d revs."
+msgstr[0] "Kann nicht mehr als %d Commit behandeln."
+msgstr[1] "Kann nicht mehr als %d Commits behandeln."
+
+#: builtin/show-branch.c:833
+#, c-format
+msgid "'%s' is not a valid ref."
+msgstr "'%s' ist keine gültige Referenz."
+
+#: builtin/show-branch.c:836
+#, c-format
+msgid "cannot find commit %s (%s)"
+msgstr "kann Commit %s (%s) nicht finden"
+
 #: builtin/show-ref.c:10
 msgid ""
 "git show-ref [-q | --quiet] [--verify] [--head] [-d | --dereference] [-s | --"
@@ -11693,12 +12525,12 @@ msgstr ""
 msgid "prepend comment character and space to each line"
 msgstr "Kommentarzeichen mit Leerzeichen an jede Zeile voranstellen"
 
-#: builtin/submodule--helper.c:24 builtin/submodule--helper.c:923
+#: builtin/submodule--helper.c:24 builtin/submodule--helper.c:1046
 #, c-format
 msgid "No such ref: %s"
 msgstr "Referenz nicht gefunden: %s"
 
-#: builtin/submodule--helper.c:31 builtin/submodule--helper.c:932
+#: builtin/submodule--helper.c:31 builtin/submodule--helper.c:1055
 #, c-format
 msgid "Expecting a full ref name, got %s"
 msgstr "Vollständiger Referenzname erwartet, %s erhalten"
@@ -11708,77 +12540,96 @@ msgstr "Vollständiger Referenzname erwartet, %s erhalten"
 msgid "cannot strip one component off url '%s'"
 msgstr "Kann eine Komponente von URL '%s' nicht extrahieren"
 
-#: builtin/submodule--helper.c:278 builtin/submodule--helper.c:403
-#: builtin/submodule--helper.c:483
+#: builtin/submodule--helper.c:282 builtin/submodule--helper.c:408
+#: builtin/submodule--helper.c:590
 msgid "alternative anchor for relative paths"
 msgstr "Alternativer Anker für relative Pfade"
 
-#: builtin/submodule--helper.c:283
+#: builtin/submodule--helper.c:287
 msgid "git submodule--helper list [--prefix=<path>] [<path>...]"
 msgstr "git submodule--helper list [--prefix=<Pfad>] [<Pfad>...]"
 
-#: builtin/submodule--helper.c:324 builtin/submodule--helper.c:338
+#: builtin/submodule--helper.c:329 builtin/submodule--helper.c:343
 #, c-format
 msgid "No url found for submodule path '%s' in .gitmodules"
 msgstr "Keine URL für Submodul-Pfad '%s' in .gitmodules gefunden"
 
-#: builtin/submodule--helper.c:364
+#: builtin/submodule--helper.c:369
 #, c-format
 msgid "Failed to register url for submodule path '%s'"
 msgstr ""
 "Fehler beim Eintragen der URL für Submodul-Pfad '%s' in die Konfiguration."
 
-#: builtin/submodule--helper.c:368
+#: builtin/submodule--helper.c:373
 #, c-format
 msgid "Submodule '%s' (%s) registered for path '%s'\n"
 msgstr "Submodul '%s' (%s) für Pfad '%s' in die Konfiguration eingetragen.\n"
 
-#: builtin/submodule--helper.c:378
+#: builtin/submodule--helper.c:383
 #, c-format
 msgid "warning: command update mode suggested for submodule '%s'\n"
 msgstr "Warnung: 'update'-Modus für Submodul '%s' vorgeschlagen\n"
 
-#: builtin/submodule--helper.c:385
+#: builtin/submodule--helper.c:390
 #, c-format
 msgid "Failed to register update mode for submodule path '%s'"
 msgstr ""
 "Fehler bei Änderung des Aktualisierungsmodus für Submodul-Pfad '%s' in der\n"
 "Konfiguration."
 
-#: builtin/submodule--helper.c:404
+#: builtin/submodule--helper.c:409
 msgid "Suppress output for initializing a submodule"
 msgstr "Ausgaben bei Initialisierung eines Submoduls unterdrücken"
 
-#: builtin/submodule--helper.c:409
+#: builtin/submodule--helper.c:414
 msgid "git submodule--helper init [<path>]"
 msgstr "git submodule--helper init [<Pfad>]"
 
-#: builtin/submodule--helper.c:430
+#: builtin/submodule--helper.c:435
 msgid "git submodule--helper name <path>"
 msgstr "git submodule--helper name <Pfad>"
 
-#: builtin/submodule--helper.c:436
+#: builtin/submodule--helper.c:441
 #, c-format
 msgid "no submodule mapping found in .gitmodules for path '%s'"
 msgstr "Keine Submodul-Zuordnung in .gitmodules für Pfad '%s' gefunden"
 
-#: builtin/submodule--helper.c:486
+#: builtin/submodule--helper.c:524 builtin/submodule--helper.c:527
+#, c-format
+msgid "submodule '%s' cannot add alternate: %s"
+msgstr "Submodul '%s' kann Alternative nicht hinzufügen: %s"
+
+#: builtin/submodule--helper.c:563
+#, c-format
+msgid "Value '%s' for submodule.alternateErrorStrategy is not recognized"
+msgstr "Wert '%s' für submodule.alternateErrorStrategy wird nicht erkannt"
+
+#: builtin/submodule--helper.c:570
+#, c-format
+msgid "Value '%s' for submodule.alternateLocation is not recognized"
+msgstr "Wert '%s' für submodule.alternateLocation wird nicht erkannt."
+
+#: builtin/submodule--helper.c:593
 msgid "where the new submodule will be cloned to"
 msgstr "Pfad für neues Submodul"
 
-#: builtin/submodule--helper.c:489
+#: builtin/submodule--helper.c:596
 msgid "name of the new submodule"
 msgstr "Name des neuen Submoduls"
 
-#: builtin/submodule--helper.c:492
+#: builtin/submodule--helper.c:599
 msgid "url where to clone the submodule from"
 msgstr "URL von der das Submodul geklont wird"
 
-#: builtin/submodule--helper.c:498
+#: builtin/submodule--helper.c:605
 msgid "depth for shallow clones"
 msgstr "Tiefe des Klons mit unvollständiger Historie (shallow)"
 
-#: builtin/submodule--helper.c:504
+#: builtin/submodule--helper.c:608 builtin/submodule--helper.c:964
+msgid "force cloning progress"
+msgstr "Fortschrittsanzeige beim Klonen erzwingen"
+
+#: builtin/submodule--helper.c:613
 msgid ""
 "git submodule--helper clone [--prefix=<path>] [--quiet] [--reference "
 "<repository>] [--name <name>] [--depth <depth>] --url <url> --path <path>"
@@ -11787,103 +12638,103 @@ msgstr ""
 "<Repository>] [--name <Name>] [--url <URL>] [--name <Name>] [--depth "
 "<Tiefe>] --url <URL> --path <Pfad>"
 
-#: builtin/submodule--helper.c:529 builtin/submodule--helper.c:535
+#: builtin/submodule--helper.c:638 builtin/submodule--helper.c:648
 #, c-format
 msgid "could not create directory '%s'"
 msgstr "Konnte Verzeichnis '%s' nicht erstellen."
 
-#: builtin/submodule--helper.c:531
+#: builtin/submodule--helper.c:644
 #, c-format
 msgid "clone of '%s' into submodule path '%s' failed"
 msgstr "Klonen von '%s' in Submodul-Pfad '%s' fehlgeschlagen"
 
-#: builtin/submodule--helper.c:547
+#: builtin/submodule--helper.c:660
 #, c-format
 msgid "cannot open file '%s'"
 msgstr "Kann Datei '%s' nicht öffnen"
 
-#: builtin/submodule--helper.c:552
+#: builtin/submodule--helper.c:665
 #, c-format
 msgid "could not close file %s"
 msgstr "Konnte Datei '%s' nicht schließen."
 
-#: builtin/submodule--helper.c:559
+#: builtin/submodule--helper.c:672
 #, c-format
 msgid "could not get submodule directory for '%s'"
 msgstr "Konnte Submodul-Verzeichnis '%s' nicht finden."
 
-#: builtin/submodule--helper.c:611
+#: builtin/submodule--helper.c:726
 #, c-format
 msgid "Submodule path '%s' not initialized"
 msgstr "Submodul-Pfad '%s' nicht initialisiert"
 
-#: builtin/submodule--helper.c:615
+#: builtin/submodule--helper.c:730
 msgid "Maybe you want to use 'update --init'?"
 msgstr "Meinten Sie vielleicht 'update --init'?"
 
-#: builtin/submodule--helper.c:641
+#: builtin/submodule--helper.c:756
 #, c-format
 msgid "Skipping unmerged submodule %s"
 msgstr "Überspringe nicht zusammengeführtes Submodul %s"
 
-#: builtin/submodule--helper.c:662
+#: builtin/submodule--helper.c:777
 #, c-format
 msgid "Skipping submodule '%s'"
 msgstr "Überspringe Submodul '%s'"
 
-#: builtin/submodule--helper.c:792
+#: builtin/submodule--helper.c:913
 #, c-format
 msgid "Failed to clone '%s'. Retry scheduled"
 msgstr "Fehler beim Klonen von '%s'. Weiterer Versuch geplant"
 
-#: builtin/submodule--helper.c:803
+#: builtin/submodule--helper.c:924
 #, c-format
 msgid "Failed to clone '%s' a second time, aborting"
 msgstr "Zweiter Versuch '%s' zu klonen fehlgeschlagen, breche ab."
 
-#: builtin/submodule--helper.c:824
+#: builtin/submodule--helper.c:945
 msgid "path into the working tree"
 msgstr "Pfad zum Arbeitsverzeichnis"
 
-#: builtin/submodule--helper.c:827
+#: builtin/submodule--helper.c:948
 msgid "path into the working tree, across nested submodule boundaries"
 msgstr ""
 "Pfad zum Arbeitsverzeichnis, über verschachtelte Submodul-Grenzen hinweg"
 
-#: builtin/submodule--helper.c:831
+#: builtin/submodule--helper.c:952
 msgid "rebase, merge, checkout or none"
 msgstr "rebase, merge, checkout oder none"
 
-#: builtin/submodule--helper.c:835
+#: builtin/submodule--helper.c:956
 msgid "Create a shallow clone truncated to the specified number of revisions"
 msgstr ""
 "Erstellung eines Klons mit unvollständiger Historie (shallow), abgeschnitten "
 "bei\n"
 "der angegebenen Anzahl von Commits."
 
-#: builtin/submodule--helper.c:838
+#: builtin/submodule--helper.c:959
 msgid "parallel jobs"
 msgstr "Parallele Ausführungen"
 
-#: builtin/submodule--helper.c:840
+#: builtin/submodule--helper.c:961
 msgid "whether the initial clone should follow the shallow recommendation"
 msgstr ""
 "ob das initiale Klonen den Empfehlungen für eine unvollständige\n"
 "Historie (shallow) folgen soll"
 
-#: builtin/submodule--helper.c:841
+#: builtin/submodule--helper.c:962
 msgid "don't print cloning progress"
 msgstr "keine Fortschrittsanzeige beim Klonen"
 
-#: builtin/submodule--helper.c:846
+#: builtin/submodule--helper.c:969
 msgid "git submodule--helper update_clone [--prefix=<path>] [<path>...]"
 msgstr "git submodule--helper update_clone [--prefix=<Pfad>] [<Pfad>...]"
 
-#: builtin/submodule--helper.c:856
+#: builtin/submodule--helper.c:979
 msgid "bad value for update parameter"
 msgstr "Fehlerhafter Wert für --update Parameter"
 
-#: builtin/submodule--helper.c:927
+#: builtin/submodule--helper.c:1050
 #, c-format
 msgid ""
 "Submodule (%s) branch configured to inherit branch from superproject, but "
@@ -11892,11 +12743,11 @@ msgstr ""
 "Branch von Submodul (%s) ist konfiguriert, den Branch des Hauptprojektes\n"
 "zu erben, aber das Hauptprojekt befindet sich auf keinem Branch."
 
-#: builtin/submodule--helper.c:977
+#: builtin/submodule--helper.c:1100
 msgid "submodule--helper subcommand must be called with a subcommand"
 msgstr "submodule--helper muss mit einem Unterbefehl aufgerufen werden"
 
-#: builtin/submodule--helper.c:984
+#: builtin/submodule--helper.c:1107
 #, c-format
 msgid "'%s' is not a valid submodule--helper subcommand"
 msgstr "'%s' ist kein gültiger Unterbefehl von submodule--helper"
@@ -12133,7 +12984,7 @@ msgstr "Tag '%s' existiert bereits"
 msgid "Updated tag '%s' (was %s)\n"
 msgstr "Tag '%s' aktualisiert (war %s)\n"
 
-#: builtin/unpack-objects.c:490
+#: builtin/unpack-objects.c:493
 msgid "Unpacking objects"
 msgstr "Entpacke Objekte"
 
@@ -12206,139 +13057,155 @@ msgstr ""
 msgid " OK"
 msgstr " OK"
 
-#: builtin/update-index.c:575
+#: builtin/update-index.c:564
 msgid "git update-index [<options>] [--] [<file>...]"
 msgstr "git update-index [<Optionen>] [--] [<Datei>...]"
 
-#: builtin/update-index.c:930
+#: builtin/update-index.c:919
 msgid "continue refresh even when index needs update"
 msgstr ""
 "Aktualisierung fortsetzen, auch wenn der Index aktualisiert werden muss"
 
-#: builtin/update-index.c:933
+#: builtin/update-index.c:922
 msgid "refresh: ignore submodules"
 msgstr "Aktualisierung: ignoriert Submodule"
 
-#: builtin/update-index.c:936
+#: builtin/update-index.c:925
 msgid "do not ignore new files"
 msgstr "keine neuen Dateien ignorieren"
 
-#: builtin/update-index.c:938
+#: builtin/update-index.c:927
 msgid "let files replace directories and vice-versa"
 msgstr "Dateien Verzeichnisse ersetzen lassen, und umgedreht"
 
-#: builtin/update-index.c:940
+#: builtin/update-index.c:929
 msgid "notice files missing from worktree"
 msgstr "fehlende Dateien im Arbeitsverzeichnis beachten"
 
-#: builtin/update-index.c:942
+#: builtin/update-index.c:931
 msgid "refresh even if index contains unmerged entries"
 msgstr ""
 "aktualisieren, auch wenn der Index nicht zusammengeführte Einträge beinhaltet"
 
-#: builtin/update-index.c:945
+#: builtin/update-index.c:934
 msgid "refresh stat information"
 msgstr "Dateiinformationen aktualisieren"
 
-#: builtin/update-index.c:949
+#: builtin/update-index.c:938
 msgid "like --refresh, but ignore assume-unchanged setting"
 msgstr "wie --refresh, ignoriert aber \"assume-unchanged\" Einstellung"
 
-#: builtin/update-index.c:953
+#: builtin/update-index.c:942
 msgid "<mode>,<object>,<path>"
 msgstr "<Modus>,<Objekt>,<Pfad>"
 
-#: builtin/update-index.c:954
+#: builtin/update-index.c:943
 msgid "add the specified entry to the index"
 msgstr "den angegebenen Eintrag zum Commit vormerken"
 
-#: builtin/update-index.c:963
+#: builtin/update-index.c:952
 msgid "mark files as \"not changing\""
 msgstr "diese Datei immer als unverändert betrachten"
 
-#: builtin/update-index.c:966
+#: builtin/update-index.c:955
 msgid "clear assumed-unchanged bit"
 msgstr "\"assumed-unchanged\"-Bit löschen"
 
-#: builtin/update-index.c:969
+#: builtin/update-index.c:958
 msgid "mark files as \"index-only\""
 msgstr "Dateien als \"index-only\" markieren"
 
-#: builtin/update-index.c:972
+#: builtin/update-index.c:961
 msgid "clear skip-worktree bit"
 msgstr "\"skip-worktree\"-Bit löschen"
 
-#: builtin/update-index.c:975
+#: builtin/update-index.c:964
 msgid "add to index only; do not add content to object database"
 msgstr ""
 "die Änderungen nur zum Commit vormerken; Inhalt wird nicht der Objekt-"
 "Datenbank hinzugefügt"
 
-#: builtin/update-index.c:977
+#: builtin/update-index.c:966
 msgid "remove named paths even if present in worktree"
 msgstr ""
 "benannte Pfade löschen, auch wenn sie sich im Arbeitsverzeichnis befinden"
 
-#: builtin/update-index.c:979
+#: builtin/update-index.c:968
 msgid "with --stdin: input lines are terminated by null bytes"
 msgstr "mit --stdin: eingegebene Zeilen sind durch NUL-Bytes abgeschlossen"
 
-#: builtin/update-index.c:981
+#: builtin/update-index.c:970
 msgid "read list of paths to be updated from standard input"
 msgstr "Liste der zu aktualisierenden Pfade von der Standard-Eingabe lesen"
 
-#: builtin/update-index.c:985
+#: builtin/update-index.c:974
 msgid "add entries from standard input to the index"
 msgstr "Einträge von der Standard-Eingabe zum Commit vormerken"
 
-#: builtin/update-index.c:989
+#: builtin/update-index.c:978
 msgid "repopulate stages #2 and #3 for the listed paths"
 msgstr ""
 "wiederholtes Einpflegen der Zustände #2 und #3 für die aufgelisteten Pfade"
 
-#: builtin/update-index.c:993
+#: builtin/update-index.c:982
 msgid "only update entries that differ from HEAD"
 msgstr "nur Einträge aktualisieren, die unterschiedlich zu HEAD sind"
 
-#: builtin/update-index.c:997
+#: builtin/update-index.c:986
 msgid "ignore files missing from worktree"
 msgstr "fehlende Dateien im Arbeitsverzeichnis ignorieren"
 
-#: builtin/update-index.c:1000
+#: builtin/update-index.c:989
 msgid "report actions to standard output"
 msgstr "die Aktionen in der Standard-Ausgabe ausgeben"
 
-#: builtin/update-index.c:1002
+#: builtin/update-index.c:991
 msgid "(for porcelains) forget saved unresolved conflicts"
 msgstr "(für Fremdprogramme) keine gespeicherten, nicht aufgelöste Konflikte"
 
-#: builtin/update-index.c:1006
+#: builtin/update-index.c:995
 msgid "write index in this format"
 msgstr "Index-Datei in diesem Format schreiben"
 
-#: builtin/update-index.c:1008
+#: builtin/update-index.c:997
 msgid "enable or disable split index"
 msgstr "Splitting des Index aktivieren oder deaktivieren"
 
-#: builtin/update-index.c:1010
+#: builtin/update-index.c:999
 msgid "enable/disable untracked cache"
 msgstr "Cache für unversionierte Dateien aktivieren oder deaktivieren"
 
-#: builtin/update-index.c:1012
+#: builtin/update-index.c:1001
 msgid "test if the filesystem supports untracked cache"
 msgstr ""
 "prüfen ob das Dateisystem einen Cache für unversionierte Dateien unterstützt"
 
-#: builtin/update-index.c:1014
+#: builtin/update-index.c:1003
 msgid "enable untracked cache without testing the filesystem"
 msgstr ""
 "Cache für unversionierte Dateien ohne Prüfung des Dateisystems aktivieren"
 
-#: builtin/update-index.c:1134
+#: builtin/update-index.c:1119
+msgid ""
+"core.untrackedCache is set to true; remove or change it, if you really want "
+"to disable the untracked cache"
+msgstr ""
+"core.untrackedCache ist auf 'true' gesetzt. Entfernen oder ändern Sie dies,\n"
+"wenn Sie wirklich den Cache für unversionierte Dateien deaktivieren möchten."
+
+#: builtin/update-index.c:1123
 msgid "Untracked cache disabled"
 msgstr "Cache für unversionierte Dateien deaktiviert"
 
-#: builtin/update-index.c:1146
+#: builtin/update-index.c:1131
+msgid ""
+"core.untrackedCache is set to false; remove or change it, if you really want "
+"to enable the untracked cache"
+msgstr ""
+"core.untrackedCache ist auf 'false' gesetzt. Entfernen oder ändern Sie dies,\n"
+"wenn sie wirklich den Cache für unversionierte Dateien aktivieren möchten."
+
+#: builtin/update-index.c:1135
 #, c-format
 msgid "Untracked cache enabled for '%s'"
 msgstr "Cache für unversionierte Dateien für '%s' aktiviert"
@@ -12538,26 +13405,44 @@ msgstr "das \"Tree\"-Objekt für ein Unterverzeichnis <Präfix> schreiben"
 msgid "only useful for debugging"
 msgstr "nur nützlich für Fehlersuche"
 
-#: upload-pack.c:20
+#: upload-pack.c:22
 msgid "git upload-pack [<options>] <dir>"
 msgstr "git upload-pack [<Optionen>] <Verzeichnis>"
 
-#: upload-pack.c:837
+#: upload-pack.c:1028
 msgid "quit after a single request/response exchange"
 msgstr "nach einem einzigen Request/Response-Austausch beenden"
 
-#: upload-pack.c:839
+#: upload-pack.c:1030
 msgid "exit immediately after initial ref advertisement"
 msgstr "direkt nach der initialen Angabe der Commits beenden"
 
-#: upload-pack.c:841
+#: upload-pack.c:1032
 msgid "do not try <directory>/.git/ if <directory> is no Git directory"
-msgstr "kein Versuch in <Verzeichnis>/.git/ wenn <Verzeichnis> kein Git-Verzeichnis ist"
+msgstr ""
+"kein Versuch in <Verzeichnis>/.git/ wenn <Verzeichnis> kein Git-Verzeichnis "
+"ist"
 
-#: upload-pack.c:843
+#: upload-pack.c:1034
 msgid "interrupt transfer after <n> seconds of inactivity"
 msgstr "Übertragung nach <n> Sekunden Inaktivität unterbrechen"
 
+#: credential-cache--daemon.c:223
+#, c-format
+msgid ""
+"The permissions on your socket directory are too loose; other\n"
+"users may be able to read your cached credentials. Consider running:\n"
+"\n"
+"\tchmod 0700 %s"
+msgstr ""
+"Die Berechtigungen auf Ihr Socket-Verzeichnis sind zu schwach; andere\n"
+"Nutzer könnten Ihre zwischengespeicherten Anmeldeinformationen lesen.\n"
+"Ziehen Sie in Betracht\n"
+"\n"
+"\tchmod 0700 %s\n"
+"\n"
+"auszuführen."
+
 #: credential-cache--daemon.c:271
 msgid "print debugging messages to stderr"
 msgstr "Meldungen zur Fehlersuche in Standard-Fehlerausgabe ausgeben"
@@ -12573,7 +13458,11 @@ msgstr ""
 "oder 'git help <Konzept>', um mehr über einen spezifischen Befehl oder\n"
 "Konzept zu erfahren."
 
-#: http.c:323
+#: http.c:342
+msgid "Delegation control is not supported with cURL < 7.22.0"
+msgstr "Kontrolle über Delegation wird mit cURL < 7.22.0 nicht unterstützt"
+
+#: http.c:351
 msgid "Public key pinning not supported with cURL < 7.44.0"
 msgstr ""
 "Das Anheften des öffentlichen Schlüssels wird mit cURL < 7.44.0\n"
@@ -12701,15 +13590,15 @@ msgstr "Verfallsdatum"
 msgid "no-op (backward compatibility)"
 msgstr "Kein Effekt (Rückwärtskompatibilität)"
 
-#: parse-options.h:237
+#: parse-options.h:238
 msgid "be more verbose"
 msgstr "erweiterte Ausgaben"
 
-#: parse-options.h:239
+#: parse-options.h:240
 msgid "be more quiet"
 msgstr "weniger Ausgaben"
 
-#: parse-options.h:245
+#: parse-options.h:246
 msgid "use <n> digits to display SHA-1s"
 msgstr "benutze <n> Ziffern zur Anzeige von SHA-1s"
 
@@ -12927,7 +13816,8 @@ msgid ""
 "Error: Your local changes to the following files would be overwritten by "
 "merge"
 msgstr ""
-"Fehler Ihre lokalen Änderungen in den folgenden Dateien würden durch den Merge\n"
+"Fehler Ihre lokalen Änderungen in den folgenden Dateien würden durch den "
+"Merge\n"
 "überschrieben werden"
 
 #: git-merge-octopus.sh:61
@@ -12935,7 +13825,7 @@ msgid "Automated merge did not work."
 msgstr "Automatischer Merge hat nicht funktioniert."
 
 #: git-merge-octopus.sh:62
-msgid "Should not be doing an Octopus."
+msgid "Should not be doing an octopus."
 msgstr "Sollte keinen Octopus-Merge ausführen."
 
 #: git-merge-octopus.sh:73
@@ -13128,6 +14018,10 @@ msgstr "Sie haben bisher noch keinen initialen Commit"
 msgid "Cannot save the current index state"
 msgstr "Kann den aktuellen Zustand des Index nicht speichern"
 
+#: git-stash.sh:103
+msgid "Cannot save the untracked files"
+msgstr "Kann die unversionierten Dateien nicht speichern"
+
 #: git-stash.sh:123 git-stash.sh:136
 msgid "Cannot save the current worktree state"
 msgstr "Kann den aktuellen Zustand des Arbeitsverzeichnisses nicht speichern"
@@ -13169,6 +14063,10 @@ msgstr ""
 "        Um eine Beschreibung anzugeben, benutzen Sie \"git stash save -- "
 "'$option'\""
 
+#: git-stash.sh:251
+msgid "Can't use --patch and --include-untracked or --all at the same time"
+msgstr "Kann nicht gleichzeitig --patch und --include-untracked oder --all verwenden"
+
 #: git-stash.sh:259
 msgid "No local changes to save"
 msgstr "Keine lokalen Änderungen zum Speichern"
@@ -13190,98 +14088,102 @@ msgstr "Speicherte Arbeitsverzeichnis und Index-Status $stash_msg"
 msgid "Cannot remove worktree changes"
 msgstr "Kann Änderungen im Arbeitsverzeichnis nicht löschen"
 
-#: git-stash.sh:404
+#: git-stash.sh:403
 #, sh-format
 msgid "unknown option: $opt"
 msgstr "unbekannte Option: $opt"
 
-#: git-stash.sh:414
+#: git-stash.sh:416
 msgid "No stash found."
 msgstr "Kein Stash-Eintrag gefunden."
 
-#: git-stash.sh:421
+#: git-stash.sh:423
 #, sh-format
 msgid "Too many revisions specified: $REV"
 msgstr "Zu viele Commits angegeben: $REV"
 
-#: git-stash.sh:427
+#: git-stash.sh:438
 #, sh-format
 msgid "$reference is not a valid reference"
 msgstr "$reference ist keine gültige Referenz"
 
-#: git-stash.sh:455
+#: git-stash.sh:466
 #, sh-format
 msgid "'$args' is not a stash-like commit"
 msgstr "'$args' ist kein \"stash\"-artiger Commit"
 
-#: git-stash.sh:466
+#: git-stash.sh:477
 #, sh-format
 msgid "'$args' is not a stash reference"
 msgstr "'$args' ist keine \"stash\"-Referenz"
 
-#: git-stash.sh:474
+#: git-stash.sh:485
 msgid "unable to refresh index"
 msgstr "Konnte den Index nicht aktualisieren."
 
-#: git-stash.sh:478
+#: git-stash.sh:489
 msgid "Cannot apply a stash in the middle of a merge"
 msgstr "Kann \"stash\" nicht anwenden, solang ein Merge im Gange ist"
 
-#: git-stash.sh:486
+#: git-stash.sh:497
 msgid "Conflicts in index. Try without --index."
 msgstr "Konflikte im Index. Versuchen Sie es ohne --index."
 
-#: git-stash.sh:488
+#: git-stash.sh:499
 msgid "Could not save index tree"
 msgstr "Konnte Index-Verzeichnis nicht speichern"
 
-#: git-stash.sh:522
+#: git-stash.sh:508
+msgid "Could not restore untracked files from stash"
+msgstr "Konnte unversionierte Dateien vom Stash nicht wiederherstellen"
+
+#: git-stash.sh:533
 msgid "Cannot unstage modified files"
 msgstr "Kann geänderte Dateien nicht aus dem Index entfernen"
 
-#: git-stash.sh:537
+#: git-stash.sh:548
 msgid "Index was not unstashed."
 msgstr "Index wurde nicht aus dem Stash zurückgeladen."
 
-#: git-stash.sh:551
+#: git-stash.sh:562
 msgid "The stash is kept in case you need it again."
 msgstr "Der Stash wird behalten, im Falle Sie benötigen diesen nochmal."
 
-#: git-stash.sh:560
+#: git-stash.sh:571
 #, sh-format
 msgid "Dropped ${REV} ($s)"
 msgstr "Gelöscht ${REV} ($s)"
 
-#: git-stash.sh:561
+#: git-stash.sh:572
 #, sh-format
 msgid "${REV}: Could not drop stash entry"
 msgstr "${REV}: Konnte \"stash\"-Eintrag nicht löschen"
 
-#: git-stash.sh:569
+#: git-stash.sh:580
 msgid "No branch name specified"
 msgstr "Kein Branchname spezifiziert"
 
-#: git-stash.sh:641
+#: git-stash.sh:652
 msgid "(To restore them type \"git stash apply\")"
 msgstr "(Zur Wiederherstellung geben Sie \"git stash apply\" ein)"
 
-#: git-submodule.sh:183
+#: git-submodule.sh:184
 msgid "Relative path can only be used from the toplevel of the working tree"
 msgstr ""
 "Relative Pfade können nur von der obersten Ebene des Arbeitsverzeichnisses "
 "benutzt werden."
 
-#: git-submodule.sh:193
+#: git-submodule.sh:194
 #, sh-format
 msgid "repo URL: '$repo' must be absolute or begin with ./|../"
 msgstr "repo URL: '$repo' muss absolut sein oder mit ./|../ beginnen"
 
-#: git-submodule.sh:210
+#: git-submodule.sh:211
 #, sh-format
 msgid "'$sm_path' already exists in the index"
 msgstr "'$sm_path' ist bereits zum Commit vorgemerkt"
 
-#: git-submodule.sh:214
+#: git-submodule.sh:215
 #, sh-format
 msgid ""
 "The following path is ignored by one of your .gitignore files:\n"
@@ -13292,24 +14194,24 @@ msgstr ""
 "$sm_path\n"
 "Benutzen Sie -f wenn Sie diesen wirklich hinzufügen möchten."
 
-#: git-submodule.sh:232
+#: git-submodule.sh:233
 #, sh-format
 msgid "Adding existing repo at '$sm_path' to the index"
 msgstr "Füge existierendes Repository in '$sm_path' dem Index hinzu."
 
-#: git-submodule.sh:234
+#: git-submodule.sh:235
 #, sh-format
 msgid "'$sm_path' already exists and is not a valid git repo"
 msgstr "'$sm_path' existiert bereits und ist kein gültiges Git-Repository"
 
-#: git-submodule.sh:242
+#: git-submodule.sh:243
 #, sh-format
 msgid "A git directory for '$sm_name' is found locally with remote(s):"
 msgstr ""
 "Ein Git-Verzeichnis für '$sm_name' wurde lokal gefunden mit den Remote-"
 "Repositories:"
 
-#: git-submodule.sh:244
+#: git-submodule.sh:245
 #, sh-format
 msgid ""
 "If you want to reuse this local git directory instead of cloning again from\n"
@@ -13319,65 +14221,69 @@ msgid ""
 "or you are unsure what this means choose another name with the '--name' "
 "option."
 msgstr ""
-"Wenn Sie das lokale Git-Verzeichnis wiederverwenden wollen, anstatt erneut von\n"
+"Wenn Sie das lokale Git-Verzeichnis wiederverwenden wollen, anstatt erneut "
+"von\n"
 "  $realrepo\n"
-"zu klonen, benutzen Sie die Option '--force'. Wenn das lokale Git-Verzeichnis\n"
+"zu klonen, benutzen Sie die Option '--force'. Wenn das lokale Git-"
+"Verzeichnis\n"
 "nicht das korrekte Repository ist oder Sie unsicher sind, was das bedeutet,\n"
 "wählen Sie einen anderen Namen mit der Option '--name'."
 
-#: git-submodule.sh:250
+#: git-submodule.sh:251
 #, sh-format
 msgid "Reactivating local git directory for submodule '$sm_name'."
 msgstr "Reaktiviere lokales Git-Verzeichnis für Submodul '$sm_name'."
 
-#: git-submodule.sh:262
+#: git-submodule.sh:263
 #, sh-format
 msgid "Unable to checkout submodule '$sm_path'"
 msgstr "Kann Submodul '$sm_path' nicht auschecken"
 
-#: git-submodule.sh:267
+#: git-submodule.sh:268
 #, sh-format
 msgid "Failed to add submodule '$sm_path'"
 msgstr "Hinzufügen von Submodul '$sm_path' fehlgeschlagen"
 
-#: git-submodule.sh:276
+#: git-submodule.sh:277
 #, sh-format
 msgid "Failed to register submodule '$sm_path'"
 msgstr "Fehler beim Eintragen von Submodul '$sm_path' in die Konfiguration."
 
-#: git-submodule.sh:323
+#: git-submodule.sh:324
 #, sh-format
 msgid "Entering '$displaypath'"
 msgstr "Betrete '$displaypath'"
 
-#: git-submodule.sh:343
+#: git-submodule.sh:344
 #, sh-format
 msgid "Stopping at '$displaypath'; script returned non-zero status."
 msgstr "Stoppe bei '$displaypath'; Skript gab nicht-Null Status zurück."
 
-#: git-submodule.sh:414
+#: git-submodule.sh:415
 #, sh-format
 msgid "pathspec and --all are incompatible"
 msgstr "Pfadspezifikationen und --all sind inkompatibel."
 
-#: git-submodule.sh:419
+#: git-submodule.sh:420
 #, sh-format
 msgid "Use '--all' if you really want to deinitialize all submodules"
 msgstr ""
 "Verwenden Sie '--all', wenn Sie wirklich alle Submodule deinitialisieren\n"
 "möchten."
 
-#: git-submodule.sh:439
+#: git-submodule.sh:440
 #, sh-format
 msgid ""
 "Submodule work tree '$displaypath' contains a .git directory\n"
 "(use 'rm -rf' if you really want to remove it including all of its history)"
 msgstr ""
-"Arbeitsverzeichnis von Submodul in '$displaypath' enthält ein .git-Verzeichnis\n"
-"(benutzen Sie 'rm -rf' wenn Sie dieses wirklich mitsamt seiner Historie löschen\n"
+"Arbeitsverzeichnis von Submodul in '$displaypath' enthält ein .git-"
+"Verzeichnis\n"
+"(benutzen Sie 'rm -rf' wenn Sie dieses wirklich mitsamt seiner Historie "
+"löschen\n"
 "möchten)"
 
-#: git-submodule.sh:447
+#: git-submodule.sh:448
 #, sh-format
 msgid ""
 "Submodule work tree '$displaypath' contains local modifications; use '-f' to "
@@ -13386,41 +14292,41 @@ msgstr ""
 "Arbeitsverzeichnis von Submodul in '$displaypath' enthält lokale Änderungen; "
 "verwenden Sie '-f', um diese zu verwerfen"
 
-#: git-submodule.sh:450
+#: git-submodule.sh:451
 #, sh-format
 msgid "Cleared directory '$displaypath'"
 msgstr "Verzeichnis '$displaypath' bereinigt."
 
-#: git-submodule.sh:451
+#: git-submodule.sh:452
 #, sh-format
 msgid "Could not remove submodule work tree '$displaypath'"
 msgstr ""
 "Konnte Arbeitsverzeichnis des Submoduls in '$displaypath' nicht löschen."
 
-#: git-submodule.sh:454
+#: git-submodule.sh:455
 #, sh-format
 msgid "Could not create empty submodule directory '$displaypath'"
 msgstr ""
 "Konnte kein leeres Verzeichnis für Submodul in '$displaypath' erstellen."
 
-#: git-submodule.sh:463
+#: git-submodule.sh:464
 #, sh-format
 msgid "Submodule '$name' ($url) unregistered for path '$displaypath'"
 msgstr ""
 "Submodul '$name' ($url) für Pfad '$displaypath' wurde aus der Konfiguration "
 "entfernt."
 
-#: git-submodule.sh:612
+#: git-submodule.sh:617
 #, sh-format
 msgid "Unable to find current revision in submodule path '$displaypath'"
 msgstr "Konnte aktuellen Commit in Submodul-Pfad '$displaypath' nicht finden."
 
-#: git-submodule.sh:622
+#: git-submodule.sh:627
 #, sh-format
 msgid "Unable to fetch in submodule path '$sm_path'"
 msgstr "Konnte \"fetch\" in Submodul-Pfad '$sm_path' nicht ausführen"
 
-#: git-submodule.sh:627
+#: git-submodule.sh:632
 #, sh-format
 msgid ""
 "Unable to find current ${remote_name}/${branch} revision in submodule path "
@@ -13429,12 +14335,12 @@ msgstr ""
 "Konnte aktuellen Commit von ${remote_name}/${branch} in Submodul-Pfad\n"
 "'$sm_path' nicht finden."
 
-#: git-submodule.sh:645
+#: git-submodule.sh:650
 #, sh-format
 msgid "Unable to fetch in submodule path '$displaypath'"
 msgstr "Konnte \"fetch\" in Submodul-Pfad '$displaypath' nicht ausführen"
 
-#: git-submodule.sh:651
+#: git-submodule.sh:656
 #, sh-format
 msgid ""
 "Fetched in submodule path '$displaypath', but it did not contain $sha1. "
@@ -13443,89 +14349,85 @@ msgstr ""
 "\"fetch\" in Submodul-Pfad '$displaypath' ausgeführt, aber $sha1 nicht\n"
 "enthalten. Direktes Anfordern dieses Commits ist fehlgeschlagen."
 
-#: git-submodule.sh:658
+#: git-submodule.sh:663
 #, sh-format
 msgid "Unable to checkout '$sha1' in submodule path '$displaypath'"
 msgstr "Konnte '$sha1' in Submodul-Pfad '$displaypath' nicht auschecken."
 
-#: git-submodule.sh:659
+#: git-submodule.sh:664
 #, sh-format
 msgid "Submodule path '$displaypath': checked out '$sha1'"
 msgstr "Submodul-Pfad: '$displaypath': '$sha1' ausgecheckt"
 
-#: git-submodule.sh:663
+#: git-submodule.sh:668
 #, sh-format
 msgid "Unable to rebase '$sha1' in submodule path '$displaypath'"
 msgstr "Rebase auf '$sha1' in Submodul-Pfad '$displaypath' nicht möglich"
 
-#: git-submodule.sh:664
+#: git-submodule.sh:669
 #, sh-format
 msgid "Submodule path '$displaypath': rebased into '$sha1'"
 msgstr "Submodul-Pfad '$displaypath': Rebase auf '$sha1'"
 
-#: git-submodule.sh:669
+#: git-submodule.sh:674
 #, sh-format
 msgid "Unable to merge '$sha1' in submodule path '$displaypath'"
 msgstr "Merge von '$sha1' in Submodul-Pfad '$displaypath' fehlgeschlagen"
 
-#: git-submodule.sh:670
+#: git-submodule.sh:675
 #, sh-format
 msgid "Submodule path '$displaypath': merged in '$sha1'"
 msgstr "Submodul-Pfad '$displaypath': zusammengeführt in '$sha1'"
 
-#: git-submodule.sh:675
+#: git-submodule.sh:680
 #, sh-format
 msgid "Execution of '$command $sha1' failed in submodule path '$displaypath'"
 msgstr ""
 "Ausführung von '$command $sha1' in Submodul-Pfad '$displaypath' "
 "fehlgeschlagen"
 
-#: git-submodule.sh:676
+#: git-submodule.sh:681
 #, sh-format
 msgid "Submodule path '$displaypath': '$command $sha1'"
 msgstr "Submodul-Pfad '$displaypath': '$command $sha1'"
 
-#: git-submodule.sh:707
+#: git-submodule.sh:712
 #, sh-format
 msgid "Failed to recurse into submodule path '$displaypath'"
 msgstr "Fehler bei Rekursion in Submodul-Pfad '$displaypath'"
 
-#: git-submodule.sh:815
+#: git-submodule.sh:820
 msgid "The --cached option cannot be used with the --files option"
 msgstr ""
 "Die Optionen --cached und --files können nicht gemeinsam verwendet werden."
 
-#: git-submodule.sh:867
+#: git-submodule.sh:872
 #, sh-format
 msgid "unexpected mode $mod_dst"
 msgstr "unerwarteter Modus $mod_dst"
 
-#: git-submodule.sh:887
+#: git-submodule.sh:892
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commit $sha1_src"
 msgstr "  Warnung: $display_name beinhaltet nicht Commit $sha1_src"
 
-#: git-submodule.sh:890
+#: git-submodule.sh:895
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commit $sha1_dst"
 msgstr "  Warnung: $display_name beinhaltet nicht Commit $sha1_dst"
 
-#: git-submodule.sh:893
+#: git-submodule.sh:898
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commits $sha1_src and $sha1_dst"
 msgstr ""
 "  Warnung: $display_name beinhaltet nicht die Commits $sha1_src und $sha1_dst"
 
-#: git-submodule.sh:918
-msgid "blob"
-msgstr "Blob"
-
-#: git-submodule.sh:1040
+#: git-submodule.sh:1045
 #, sh-format
 msgid "Failed to recurse into submodule path '$sm_path'"
 msgstr "Fehler bei Rekursion in Submodul-Pfad '$sm_path'"
 
-#: git-submodule.sh:1107
+#: git-submodule.sh:1112
 #, sh-format
 msgid "Synchronizing submodule url for '$displaypath'"
 msgstr "Synchronisiere Submodul-URL für '$displaypath'"
@@ -13535,12 +14437,12 @@ msgstr "Synchronisiere Submodul-URL für '$displaypath'"
 msgid "See git-${cmd}(1) for details."
 msgstr "Siehe git-${cmd}(1) für weitere Details."
 
-#: git-rebase--interactive.sh:131
+#: git-rebase--interactive.sh:140
 #, sh-format
 msgid "Rebasing ($new_count/$total)"
 msgstr "Führe Rebase aus ($new_count/$total)"
 
-#: git-rebase--interactive.sh:147
+#: git-rebase--interactive.sh:156
 msgid ""
 "\n"
 "Commands:\n"
@@ -13567,7 +14469,7 @@ msgstr ""
 "Diese Zeilen können umsortiert werden; Sie werden von oben nach unten\n"
 "ausgeführt.\n"
 
-#: git-rebase--interactive.sh:162
+#: git-rebase--interactive.sh:171
 msgid ""
 "\n"
 "Do not remove any line. Use 'drop' explicitly to remove a commit.\n"
@@ -13576,13 +14478,15 @@ msgstr ""
 "Keine Zeile entfernen. Benutzen Sie 'drop', um explizit einen Commit zu\n"
 "entfernen.\n"
 
-#: git-rebase--interactive.sh:166
+#: git-rebase--interactive.sh:175
 msgid ""
 "\n"
 "If you remove a line here THAT COMMIT WILL BE LOST.\n"
-msgstr "\nWenn Sie hier eine Zeile entfernen, wird DIESER COMMIT VERLOREN GEHEN.\n"
+msgstr ""
+"\n"
+"Wenn Sie hier eine Zeile entfernen, wird DIESER COMMIT VERLOREN GEHEN.\n"
 
-#: git-rebase--interactive.sh:202
+#: git-rebase--interactive.sh:211
 #, sh-format
 msgid ""
 "You can amend the commit now, with\n"
@@ -13601,87 +14505,87 @@ msgstr ""
 "\n"
 "\tgit rebase --continue"
 
-#: git-rebase--interactive.sh:227
+#: git-rebase--interactive.sh:236
 #, sh-format
 msgid "$sha1: not a commit that can be picked"
 msgstr "$sha1: kein Commit der gepickt werden kann"
 
-#: git-rebase--interactive.sh:266
+#: git-rebase--interactive.sh:275
 #, sh-format
 msgid "Invalid commit name: $sha1"
 msgstr "Ungültiger Commit-Name: $sha1"
 
-#: git-rebase--interactive.sh:308
+#: git-rebase--interactive.sh:317
 msgid "Cannot write current commit's replacement sha1"
 msgstr "Kann ersetzenden SHA-1 des aktuellen Commits nicht schreiben"
 
-#: git-rebase--interactive.sh:360
+#: git-rebase--interactive.sh:369
 #, sh-format
 msgid "Fast-forward to $sha1"
 msgstr "Spule vor zu $sha1"
 
-#: git-rebase--interactive.sh:362
+#: git-rebase--interactive.sh:371
 #, sh-format
 msgid "Cannot fast-forward to $sha1"
 msgstr "Kann nicht zu $sha1 vorspulen"
 
-#: git-rebase--interactive.sh:371
+#: git-rebase--interactive.sh:380
 #, sh-format
 msgid "Cannot move HEAD to $first_parent"
 msgstr "Kann HEAD nicht auf $first_parent setzen"
 
-#: git-rebase--interactive.sh:376
+#: git-rebase--interactive.sh:385
 #, sh-format
 msgid "Refusing to squash a merge: $sha1"
 msgstr "\"squash\" eines Merges ($sha1) zurückgewiesen."
 
-#: git-rebase--interactive.sh:390
+#: git-rebase--interactive.sh:399
 #, sh-format
 msgid "Error redoing merge $sha1"
 msgstr "Fehler beim Wiederholen des Merges von $sha1"
 
-#: git-rebase--interactive.sh:398
+#: git-rebase--interactive.sh:407
 #, sh-format
 msgid "Could not pick $sha1"
 msgstr "Konnte $sha1 nicht picken"
 
-#: git-rebase--interactive.sh:407
+#: git-rebase--interactive.sh:416
 #, sh-format
 msgid "This is the commit message #${n}:"
 msgstr "Das ist Commit-Beschreibung #${n}:"
 
-#: git-rebase--interactive.sh:412
+#: git-rebase--interactive.sh:421
 #, sh-format
 msgid "The commit message #${n} will be skipped:"
 msgstr "Commit-Beschreibung #${n} wird ausgelassen:"
 
-#: git-rebase--interactive.sh:423
+#: git-rebase--interactive.sh:432
 #, sh-format
 msgid "This is a combination of $count commit."
 msgid_plural "This is a combination of $count commits."
 msgstr[0] "Das ist eine Kombination aus $count Commit."
 msgstr[1] "Das ist eine Kombination aus $count Commits."
 
-#: git-rebase--interactive.sh:431
+#: git-rebase--interactive.sh:440
 #, sh-format
 msgid "Cannot write $fixup_msg"
 msgstr "Kann $fixup_msg nicht schreiben"
 
-#: git-rebase--interactive.sh:434
+#: git-rebase--interactive.sh:443
 msgid "This is a combination of 2 commits."
 msgstr "Das ist eine Kombination aus 2 Commits."
 
-#: git-rebase--interactive.sh:435
+#: git-rebase--interactive.sh:444
 msgid "This is the 1st commit message:"
 msgstr "Das ist die erste Commit-Beschreibung:"
 
-#: git-rebase--interactive.sh:475 git-rebase--interactive.sh:518
-#: git-rebase--interactive.sh:521
+#: git-rebase--interactive.sh:484 git-rebase--interactive.sh:527
+#: git-rebase--interactive.sh:530
 #, sh-format
 msgid "Could not apply $sha1... $rest"
 msgstr "Konnte $sha1... ($rest) nicht anwenden"
 
-#: git-rebase--interactive.sh:549
+#: git-rebase--interactive.sh:558
 #, sh-format
 msgid ""
 "Could not amend commit after successfully picking $sha1... $rest\n"
@@ -13690,36 +14594,39 @@ msgid ""
 "before\n"
 "you are able to reword the commit."
 msgstr ""
-"Konnte Commit nicht nachbessern, nachdem dieser verwendet wurde: $sha1... $rest\n"
-"Das passierte sehr wahrscheinlich wegen einer leeren Commit-Beschreibung, oder\n"
+"Konnte Commit nicht nachbessern, nachdem dieser verwendet wurde: $sha1... "
+"$rest\n"
+"Das passierte sehr wahrscheinlich wegen einer leeren Commit-Beschreibung, "
+"oder\n"
 "weil der pre-commit Hook fehlschlug. Falls der pre-commit Hook fehlschlug,\n"
-"sollten Sie das Problem beheben, bevor Sie die Commit-Beschreibung ändern können."
+"sollten Sie das Problem beheben, bevor Sie die Commit-Beschreibung ändern "
+"können."
 
-#: git-rebase--interactive.sh:564
+#: git-rebase--interactive.sh:573
 #, sh-format
 msgid "Stopped at $sha1_abbrev... $rest"
 msgstr "Angehalten bei $sha1_abbrev... $rest"
 
-#: git-rebase--interactive.sh:579
+#: git-rebase--interactive.sh:588
 #, sh-format
 msgid "Cannot '$squash_style' without a previous commit"
 msgstr "Kann nicht '$squash_style' ohne vorherigen Commit"
 
-#: git-rebase--interactive.sh:621
+#: git-rebase--interactive.sh:630
 #, sh-format
 msgid "Executing: $rest"
 msgstr "Führe aus: $rest"
 
-#: git-rebase--interactive.sh:629
+#: git-rebase--interactive.sh:638
 #, sh-format
 msgid "Execution failed: $rest"
 msgstr "Ausführung fehlgeschlagen: $rest"
 
-#: git-rebase--interactive.sh:631
+#: git-rebase--interactive.sh:640
 msgid "and made changes to the index and/or the working tree"
 msgstr "Der Index und/oder das Arbeitsverzeichnis wurde geändert."
 
-#: git-rebase--interactive.sh:633
+#: git-rebase--interactive.sh:642
 msgid ""
 "You can fix the problem, and then run\n"
 "\n"
@@ -13732,7 +14639,7 @@ msgstr ""
 "ausführen."
 
 #. TRANSLATORS: after these lines is a command to be issued by the user
-#: git-rebase--interactive.sh:646
+#: git-rebase--interactive.sh:655
 #, sh-format
 msgid ""
 "Execution succeeded: $rest\n"
@@ -13748,25 +14655,25 @@ msgstr ""
 "\n"
 "\tgit rebase --continue"
 
-#: git-rebase--interactive.sh:657
+#: git-rebase--interactive.sh:666
 #, sh-format
 msgid "Unknown command: $command $sha1 $rest"
 msgstr "Unbekannter Befehl: $command $sha1 $rest"
 
-#: git-rebase--interactive.sh:658
+#: git-rebase--interactive.sh:667
 msgid "Please fix this using 'git rebase --edit-todo'."
 msgstr "Bitte beheben Sie das, indem Sie 'git rebase --edit-todo' ausführen."
 
-#: git-rebase--interactive.sh:693
+#: git-rebase--interactive.sh:702
 #, sh-format
 msgid "Successfully rebased and updated $head_name."
 msgstr "Erfolgreich Rebase ausgeführt und $head_name aktualisiert."
 
-#: git-rebase--interactive.sh:740
+#: git-rebase--interactive.sh:749
 msgid "Could not skip unnecessary pick commands"
 msgstr "Fehler beim Auslassen von nicht erforderlichen \"pick\"-Befehlen."
 
-#: git-rebase--interactive.sh:898
+#: git-rebase--interactive.sh:907
 #, sh-format
 msgid ""
 "Warning: the SHA-1 is missing or isn't a commit in the following line:\n"
@@ -13775,7 +14682,7 @@ msgstr ""
 "Warnung: Der SHA-1 in der folgenden Zeile fehlt oder ist kein Commit:\n"
 " - $line"
 
-#: git-rebase--interactive.sh:931
+#: git-rebase--interactive.sh:940
 #, sh-format
 msgid ""
 "Warning: the command isn't recognized in the following line:\n"
@@ -13784,11 +14691,11 @@ msgstr ""
 "Warnung: Das Kommando in der folgenden Zeile wurde nicht erkannt:\n"
 " - $line"
 
-#: git-rebase--interactive.sh:970
+#: git-rebase--interactive.sh:979
 msgid "could not detach HEAD"
 msgstr "Konnte HEAD nicht loslösen"
 
-#: git-rebase--interactive.sh:1008
+#: git-rebase--interactive.sh:1017
 msgid ""
 "Warning: some commits may have been dropped accidentally.\n"
 "Dropped commits (newer to older):"
@@ -13796,7 +14703,7 @@ msgstr ""
 "Warnung: Einige Commits könnten aus Versehen entfernt worden sein.\n"
 "Entfernte Commits (neu zu alt):"
 
-#: git-rebase--interactive.sh:1016
+#: git-rebase--interactive.sh:1025
 msgid ""
 "To avoid this message, use \"drop\" to explicitly remove a commit.\n"
 "\n"
@@ -13807,32 +14714,38 @@ msgstr ""
 "Um diese Meldung zu vermeiden, benutzen Sie \"drop\", um exlizit Commits zu\n"
 "entfernen.\n"
 "\n"
-"Benutzen Sie 'git config rebase.missingCommitsCheck', um die Stufe der Warnungen\n"
+"Benutzen Sie 'git config rebase.missingCommitsCheck', um die Stufe der "
+"Warnungen\n"
 "zu ändern.\n"
 "Die möglichen Verhaltensweisen sind: ignore, warn, error."
 
-#: git-rebase--interactive.sh:1027
+#: git-rebase--interactive.sh:1036
 #, sh-format
 msgid ""
 "Unrecognized setting $check_level for option rebase.missingCommitsCheck. "
 "Ignoring."
 msgstr ""
-"Nicht erkannte Einstellung $check_level für Option rebase.missingCommitsCheck.\n"
+"Nicht erkannte Einstellung $check_level für Option rebase."
+"missingCommitsCheck.\n"
 "Ignoriere."
 
-#: git-rebase--interactive.sh:1044
-msgid "You can fix this with 'git rebase --edit-todo'."
-msgstr "Sie können das mit 'git rebase --edit-todo' beheben."
+#: git-rebase--interactive.sh:1053
+msgid ""
+"You can fix this with 'git rebase --edit-todo' and then run 'git rebase --"
+"continue'."
+msgstr ""
+"Sie können das mit 'git rebase --edit-todo' beheben. Führen Sie danach\n"
+"'git rebase --continue' aus."
 
-#: git-rebase--interactive.sh:1045
+#: git-rebase--interactive.sh:1054
 msgid "Or you can abort the rebase with 'git rebase --abort'."
 msgstr "Oder Sie können den Rebase mit 'git rebase --abort' abbrechen."
 
-#: git-rebase--interactive.sh:1069
+#: git-rebase--interactive.sh:1078
 msgid "Could not remove CHERRY_PICK_HEAD"
 msgstr "Konnte CHERRY_PICK_HEAD nicht löschen"
 
-#: git-rebase--interactive.sh:1074
+#: git-rebase--interactive.sh:1083
 #, sh-format
 msgid ""
 "You have staged changes in your working tree.\n"
@@ -13845,7 +14758,7 @@ msgid ""
 "\n"
 "  git commit $gpg_sign_opt_quoted\n"
 "\n"
-"In both case, once you're done, continue with:\n"
+"In both cases, once you're done, continue with:\n"
 "\n"
 "  git rebase --continue\n"
 msgstr ""
@@ -13863,26 +14776,27 @@ msgstr ""
 "\n"
 "  git rebase --continue\n"
 
-#: git-rebase--interactive.sh:1091
+#: git-rebase--interactive.sh:1100
 msgid "Error trying to find the author identity to amend commit"
 msgstr ""
 "Fehler beim Versuch die Identität des Authors zum Verbessern des Commits zu\n"
 "finden"
 
-#: git-rebase--interactive.sh:1096
+#: git-rebase--interactive.sh:1105
 msgid ""
 "You have uncommitted changes in your working tree. Please commit them\n"
 "first and then run 'git rebase --continue' again."
 msgstr ""
 "Sie haben nicht committete Änderungen in Ihrem Arbeitsverzeichnis. Bitte\n"
-"committen Sie diese zuerst und führen Sie dann 'git rebase --continue' erneut\n"
+"committen Sie diese zuerst und führen Sie dann 'git rebase --continue' "
+"erneut\n"
 "aus."
 
-#: git-rebase--interactive.sh:1101 git-rebase--interactive.sh:1105
+#: git-rebase--interactive.sh:1110 git-rebase--interactive.sh:1114
 msgid "Could not commit staged changes."
 msgstr "Konnte Änderungen aus der Staging-Area nicht committen."
 
-#: git-rebase--interactive.sh:1129
+#: git-rebase--interactive.sh:1138
 msgid ""
 "\n"
 "You are editing the todo file of an ongoing interactive rebase.\n"
@@ -13896,51 +14810,50 @@ msgstr ""
 "    git rebase --continue\n"
 "\n"
 
-#: git-rebase--interactive.sh:1137 git-rebase--interactive.sh:1298
+#: git-rebase--interactive.sh:1146 git-rebase--interactive.sh:1304
 msgid "Could not execute editor"
 msgstr "Konnte Editor nicht ausführen."
 
-#: git-rebase--interactive.sh:1145
-msgid "You need to set your committer info first"
-msgstr "Sie müssen zuerst die Informationen zum Commit-Ersteller setzen."
-
-#: git-rebase--interactive.sh:1153
+#: git-rebase--interactive.sh:1159
 #, sh-format
 msgid "Could not checkout $switch_to"
 msgstr "Konnte $switch_to nicht auschecken."
 
-#: git-rebase--interactive.sh:1158
+#: git-rebase--interactive.sh:1164
 msgid "No HEAD?"
 msgstr "Kein HEAD?"
 
-#: git-rebase--interactive.sh:1159
+#: git-rebase--interactive.sh:1165
 #, sh-format
 msgid "Could not create temporary $state_dir"
 msgstr "Konnte temporäres Verzeichnis $state_dir nicht erstellen."
 
-#: git-rebase--interactive.sh:1161
+#: git-rebase--interactive.sh:1167
 msgid "Could not mark as interactive"
 msgstr "Konnte nicht als interaktiven Rebase markieren."
 
-#: git-rebase--interactive.sh:1171 git-rebase--interactive.sh:1176
+#: git-rebase--interactive.sh:1177 git-rebase--interactive.sh:1182
 msgid "Could not init rewritten commits"
 msgstr "Konnte neu geschriebene Commits nicht initialisieren."
 
-#: git-rebase--interactive.sh:1276
+#: git-rebase--interactive.sh:1282
 #, sh-format
 msgid "Rebase $shortrevisions onto $shortonto ($todocount command)"
 msgid_plural "Rebase $shortrevisions onto $shortonto ($todocount commands)"
 msgstr[0] "Rebase von $shortrevisions auf $shortonto ($todocount Kommando)"
 msgstr[1] "Rebase von $shortrevisions auf $shortonto ($todocount Kommandos)"
 
-#: git-rebase--interactive.sh:1281
+#: git-rebase--interactive.sh:1287
 msgid ""
 "\n"
 "However, if you remove everything, the rebase will be aborted.\n"
 "\n"
-msgstr "\nWenn Sie jedoch alles löschen, wird der Rebase abgebrochen.\n\n"
+msgstr ""
+"\n"
+"Wenn Sie jedoch alles löschen, wird der Rebase abgebrochen.\n"
+"\n"
 
-#: git-rebase--interactive.sh:1288
+#: git-rebase--interactive.sh:1294
 msgid "Note that empty commits are commented out"
 msgstr "Leere Commits sind auskommentiert."
 
@@ -13959,18 +14872,28 @@ msgstr ""
 #: git-sh-setup.sh:199 git-sh-setup.sh:206
 #, sh-format
 msgid "fatal: $program_name cannot be used without a working tree."
-msgstr "fatal: $program_name kann ohne ein Arbeitsverzeichnis nicht verwendet werden."
+msgstr ""
+"fatal: $program_name kann ohne ein Arbeitsverzeichnis nicht verwendet werden."
 
 #: git-sh-setup.sh:220
 msgid "Cannot rebase: You have unstaged changes."
-msgstr "Rebase nicht möglich: Sie haben Änderungen, die nicht zum Commit vorgemerkt sind."
+msgstr ""
+"Rebase nicht möglich: Sie haben Änderungen, die nicht zum Commit vorgemerkt "
+"sind."
 
 #: git-sh-setup.sh:223
 msgid "Cannot rewrite branches: You have unstaged changes."
 msgstr ""
-"Kann Branches nicht neu schreiben: Sie haben Änderungen, die nicht zum Commit\n"
+"Kann Branches nicht neu schreiben: Sie haben Änderungen, die nicht zum "
+"Commit\n"
 "vorgemerkt sind."
 
+#: git-sh-setup.sh:226
+msgid "Cannot pull with rebase: You have unstaged changes."
+msgstr ""
+"Kann \"pull\" mit \"rebase\" nicht ausführen: Sie haben Änderungen, die "
+"nicht zum Commit vorgemerkt sind."
+
 #: git-sh-setup.sh:229
 #, sh-format
 msgid "Cannot $action: You have unstaged changes."
@@ -13980,7 +14903,15 @@ msgstr ""
 
 #: git-sh-setup.sh:242
 msgid "Cannot rebase: Your index contains uncommitted changes."
-msgstr "Rebase nicht möglich: Die Staging-Area beinhaltet nicht committete Änderungen."
+msgstr ""
+"Rebase nicht möglich: Die Staging-Area beinhaltet nicht committete "
+"Änderungen."
+
+#: git-sh-setup.sh:245
+msgid "Cannot pull with rebase: Your index contains uncommitted changes."
+msgstr ""
+"Kann \"pull\" mit \"rebase\" nicht ausführen: Die Staging-Area beinhaltet "
+"nicht committete Änderungen."
 
 #: git-sh-setup.sh:248
 #, sh-format
@@ -13989,11 +14920,54 @@ msgstr ""
 "Kann $action nicht ausführen: Die Staging-Area beinhaltet nicht committete\n"
 "Änderungen."
 
+#: git-sh-setup.sh:252
+msgid "Additionally, your index contains uncommitted changes."
+msgstr "Zusätzlich beinhaltet die Staging-Area nicht committete Änderungen."
+
 #: git-sh-setup.sh:372
 msgid "You need to run this command from the toplevel of the working tree."
-msgstr "Sie müssen den Befehl von der obersten Ebene des Arbeitsverzeichnisses ausführen."
+msgstr ""
+"Sie müssen den Befehl von der obersten Ebene des Arbeitsverzeichnisses "
+"ausführen."
 
 #: git-sh-setup.sh:377
 msgid "Unable to determine absolute path of git directory"
 msgstr "Konnte absoluten Pfad des Git-Verzeichnisses nicht bestimmen."
 
+#~ msgid "Could not write to %s"
+#~ msgstr "Konnte nicht nach %s schreiben"
+
+#~ msgid "Error wrapping up %s."
+#~ msgstr "Fehler beim Einpacken von %s."
+
+#~ msgid "Your local changes would be overwritten by cherry-pick."
+#~ msgstr ""
+#~ "Ihre lokalen Änderungen würden durch den Cherry-Pick überschrieben werden."
+
+#~ msgid "Cannot revert during another revert."
+#~ msgstr "Kann Revert nicht während eines anderen Reverts ausführen."
+
+#~ msgid "Cannot cherry-pick during another cherry-pick."
+#~ msgstr ""
+#~ "Kann Cherry-Pick nicht während eines anderen Cherry-Picks ausführen."
+
+#~ msgid "Could not parse line %d."
+#~ msgstr "Konnte Zeile %d nicht parsen."
+
+#~ msgid "Could not open %s"
+#~ msgstr "Konnte %s nicht öffnen"
+
+#~ msgid "Could not read %s."
+#~ msgstr "Konnte %s nicht lesen."
+
+#~ msgid "Could not format %s."
+#~ msgstr "Konnte %s nicht formatieren."
+
+#~ msgid "%s: %s"
+#~ msgstr "%s: %s"
+
+#~ msgid "cannot open %s: %s"
+#~ msgstr "Kann %s nicht öffnen: %s"
+
+#~ msgid "You need to set your committer info first"
+#~ msgstr "Sie müssen zuerst die Informationen zum Commit-Ersteller setzen."
index 6db68932b3ee080903195836c4bd489c48fd19e9..c06fb40f8280a5036f15d0f06337159a1f552a18 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: 2016-11-22 22:10+0800\n"
-"PO-Revision-Date: 2016-11-22 22:16+0800\n"
+"POT-Creation-Date: 2016-11-25 22:50+0800\n"
+"PO-Revision-Date: 2016-11-25 22:55+0800\n"
 "Last-Translator: Jean-Noël Avila <jn.avila@free.fr>\n"
 "Language-Team: Jean-Noël Avila <jn.avila@free.fr>\n"
 "Language: fr\n"
@@ -2763,7 +2763,7 @@ msgstr "impossible d'écrire dans '%s'"
 
 #: sequencer.c:251
 #, c-format
-msgid "could not write eol to '%s"
+msgid "could not write eol to '%s'"
 msgstr "impossible d'écrire la fin de ligne dans '%s'"
 
 #: sequencer.c:255 sequencer.c:1130 sequencer.c:1216
index 19bccb46240261cec9032b29723a411c2f29cbf4..e4e29ebfd8ce4495fcab8895133c7ce103be0e18 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2016-11-22 22:10+0800\n"
+"POT-Creation-Date: 2016-11-25 22:50+0800\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -726,11 +726,11 @@ msgstr ""
 msgid "prepend prefix to each pathname in the archive"
 msgstr ""
 
-#: archive.c:432 builtin/archive.c:88 builtin/blame.c:2603
-#: builtin/blame.c:2604 builtin/config.c:59 builtin/fast-export.c:987
-#: builtin/fast-export.c:989 builtin/grep.c:723 builtin/hash-object.c:101
-#: builtin/ls-files.c:539 builtin/ls-files.c:542 builtin/notes.c:401
-#: builtin/notes.c:564 builtin/read-tree.c:109 parse-options.h:153
+#: archive.c:432 builtin/blame.c:2603 builtin/blame.c:2604 builtin/config.c:59
+#: builtin/fast-export.c:987 builtin/fast-export.c:989 builtin/grep.c:723
+#: builtin/hash-object.c:101 builtin/ls-files.c:539 builtin/ls-files.c:542
+#: builtin/notes.c:401 builtin/notes.c:564 builtin/read-tree.c:109
+#: parse-options.h:153
 msgid "file"
 msgstr ""
 
@@ -2494,7 +2494,7 @@ msgstr ""
 
 #: sequencer.c:251
 #, c-format
-msgid "could not write eol to '%s"
+msgid "could not write eol to '%s'"
 msgstr ""
 
 #: sequencer.c:255 sequencer.c:1130 sequencer.c:1216
@@ -13269,12 +13269,12 @@ msgstr ""
 msgid "See git-${cmd}(1) for details."
 msgstr ""
 
-#: git-rebase--interactive.sh:131
+#: git-rebase--interactive.sh:140
 #, sh-format
 msgid "Rebasing ($new_count/$total)"
 msgstr ""
 
-#: git-rebase--interactive.sh:147
+#: git-rebase--interactive.sh:156
 msgid ""
 "\n"
 "Commands:\n"
@@ -13289,19 +13289,19 @@ msgid ""
 "These lines can be re-ordered; they are executed from top to bottom.\n"
 msgstr ""
 
-#: git-rebase--interactive.sh:162
+#: git-rebase--interactive.sh:171
 msgid ""
 "\n"
 "Do not remove any line. Use 'drop' explicitly to remove a commit.\n"
 msgstr ""
 
-#: git-rebase--interactive.sh:166
+#: git-rebase--interactive.sh:175
 msgid ""
 "\n"
 "If you remove a line here THAT COMMIT WILL BE LOST.\n"
 msgstr ""
 
-#: git-rebase--interactive.sh:202
+#: git-rebase--interactive.sh:211
 #, sh-format
 msgid ""
 "You can amend the commit now, with\n"
@@ -13313,87 +13313,87 @@ msgid ""
 "\tgit rebase --continue"
 msgstr ""
 
-#: git-rebase--interactive.sh:227
+#: git-rebase--interactive.sh:236
 #, sh-format
 msgid "$sha1: not a commit that can be picked"
 msgstr ""
 
-#: git-rebase--interactive.sh:266
+#: git-rebase--interactive.sh:275
 #, sh-format
 msgid "Invalid commit name: $sha1"
 msgstr ""
 
-#: git-rebase--interactive.sh:308
+#: git-rebase--interactive.sh:317
 msgid "Cannot write current commit's replacement sha1"
 msgstr ""
 
-#: git-rebase--interactive.sh:360
+#: git-rebase--interactive.sh:369
 #, sh-format
 msgid "Fast-forward to $sha1"
 msgstr ""
 
-#: git-rebase--interactive.sh:362
+#: git-rebase--interactive.sh:371
 #, sh-format
 msgid "Cannot fast-forward to $sha1"
 msgstr ""
 
-#: git-rebase--interactive.sh:371
+#: git-rebase--interactive.sh:380
 #, sh-format
 msgid "Cannot move HEAD to $first_parent"
 msgstr ""
 
-#: git-rebase--interactive.sh:376
+#: git-rebase--interactive.sh:385
 #, sh-format
 msgid "Refusing to squash a merge: $sha1"
 msgstr ""
 
-#: git-rebase--interactive.sh:390
+#: git-rebase--interactive.sh:399
 #, sh-format
 msgid "Error redoing merge $sha1"
 msgstr ""
 
-#: git-rebase--interactive.sh:398
+#: git-rebase--interactive.sh:407
 #, sh-format
 msgid "Could not pick $sha1"
 msgstr ""
 
-#: git-rebase--interactive.sh:407
+#: git-rebase--interactive.sh:416
 #, sh-format
 msgid "This is the commit message #${n}:"
 msgstr ""
 
-#: git-rebase--interactive.sh:412
+#: git-rebase--interactive.sh:421
 #, sh-format
 msgid "The commit message #${n} will be skipped:"
 msgstr ""
 
-#: git-rebase--interactive.sh:423
+#: git-rebase--interactive.sh:432
 #, sh-format
 msgid "This is a combination of $count commit."
 msgid_plural "This is a combination of $count commits."
 msgstr[0] ""
 msgstr[1] ""
 
-#: git-rebase--interactive.sh:431
+#: git-rebase--interactive.sh:440
 #, sh-format
 msgid "Cannot write $fixup_msg"
 msgstr ""
 
-#: git-rebase--interactive.sh:434
+#: git-rebase--interactive.sh:443
 msgid "This is a combination of 2 commits."
 msgstr ""
 
-#: git-rebase--interactive.sh:435
+#: git-rebase--interactive.sh:444
 msgid "This is the 1st commit message:"
 msgstr ""
 
-#: git-rebase--interactive.sh:475 git-rebase--interactive.sh:518
-#: git-rebase--interactive.sh:521
+#: git-rebase--interactive.sh:484 git-rebase--interactive.sh:527
+#: git-rebase--interactive.sh:530
 #, sh-format
 msgid "Could not apply $sha1... $rest"
 msgstr ""
 
-#: git-rebase--interactive.sh:549
+#: git-rebase--interactive.sh:558
 #, sh-format
 msgid ""
 "Could not amend commit after successfully picking $sha1... $rest\n"
@@ -13403,31 +13403,31 @@ msgid ""
 "you are able to reword the commit."
 msgstr ""
 
-#: git-rebase--interactive.sh:564
+#: git-rebase--interactive.sh:573
 #, sh-format
 msgid "Stopped at $sha1_abbrev... $rest"
 msgstr ""
 
-#: git-rebase--interactive.sh:579
+#: git-rebase--interactive.sh:588
 #, sh-format
 msgid "Cannot '$squash_style' without a previous commit"
 msgstr ""
 
-#: git-rebase--interactive.sh:621
+#: git-rebase--interactive.sh:630
 #, sh-format
 msgid "Executing: $rest"
 msgstr ""
 
-#: git-rebase--interactive.sh:629
+#: git-rebase--interactive.sh:638
 #, sh-format
 msgid "Execution failed: $rest"
 msgstr ""
 
-#: git-rebase--interactive.sh:631
+#: git-rebase--interactive.sh:640
 msgid "and made changes to the index and/or the working tree"
 msgstr ""
 
-#: git-rebase--interactive.sh:633
+#: git-rebase--interactive.sh:642
 msgid ""
 "You can fix the problem, and then run\n"
 "\n"
@@ -13435,7 +13435,7 @@ msgid ""
 msgstr ""
 
 #. TRANSLATORS: after these lines is a command to be issued by the user
-#: git-rebase--interactive.sh:646
+#: git-rebase--interactive.sh:655
 #, sh-format
 msgid ""
 "Execution succeeded: $rest\n"
@@ -13445,49 +13445,49 @@ msgid ""
 "\tgit rebase --continue"
 msgstr ""
 
-#: git-rebase--interactive.sh:657
+#: git-rebase--interactive.sh:666
 #, sh-format
 msgid "Unknown command: $command $sha1 $rest"
 msgstr ""
 
-#: git-rebase--interactive.sh:658
+#: git-rebase--interactive.sh:667
 msgid "Please fix this using 'git rebase --edit-todo'."
 msgstr ""
 
-#: git-rebase--interactive.sh:693
+#: git-rebase--interactive.sh:702
 #, sh-format
 msgid "Successfully rebased and updated $head_name."
 msgstr ""
 
-#: git-rebase--interactive.sh:740
+#: git-rebase--interactive.sh:749
 msgid "Could not skip unnecessary pick commands"
 msgstr ""
 
-#: git-rebase--interactive.sh:898
+#: git-rebase--interactive.sh:907
 #, sh-format
 msgid ""
 "Warning: the SHA-1 is missing or isn't a commit in the following line:\n"
 " - $line"
 msgstr ""
 
-#: git-rebase--interactive.sh:931
+#: git-rebase--interactive.sh:940
 #, sh-format
 msgid ""
 "Warning: the command isn't recognized in the following line:\n"
 " - $line"
 msgstr ""
 
-#: git-rebase--interactive.sh:970
+#: git-rebase--interactive.sh:979
 msgid "could not detach HEAD"
 msgstr ""
 
-#: git-rebase--interactive.sh:1008
+#: git-rebase--interactive.sh:1017
 msgid ""
 "Warning: some commits may have been dropped accidentally.\n"
 "Dropped commits (newer to older):"
 msgstr ""
 
-#: git-rebase--interactive.sh:1016
+#: git-rebase--interactive.sh:1025
 msgid ""
 "To avoid this message, use \"drop\" to explicitly remove a commit.\n"
 "\n"
@@ -13496,28 +13496,28 @@ msgid ""
 "The possible behaviours are: ignore, warn, error."
 msgstr ""
 
-#: git-rebase--interactive.sh:1027
+#: git-rebase--interactive.sh:1036
 #, sh-format
 msgid ""
 "Unrecognized setting $check_level for option rebase.missingCommitsCheck. "
 "Ignoring."
 msgstr ""
 
-#: git-rebase--interactive.sh:1044
+#: git-rebase--interactive.sh:1053
 msgid ""
 "You can fix this with 'git rebase --edit-todo' and then run 'git rebase --"
 "continue'."
 msgstr ""
 
-#: git-rebase--interactive.sh:1045
+#: git-rebase--interactive.sh:1054
 msgid "Or you can abort the rebase with 'git rebase --abort'."
 msgstr ""
 
-#: git-rebase--interactive.sh:1069
+#: git-rebase--interactive.sh:1078
 msgid "Could not remove CHERRY_PICK_HEAD"
 msgstr ""
 
-#: git-rebase--interactive.sh:1074
+#: git-rebase--interactive.sh:1083
 #, sh-format
 msgid ""
 "You have staged changes in your working tree.\n"
@@ -13535,21 +13535,21 @@ msgid ""
 "  git rebase --continue\n"
 msgstr ""
 
-#: git-rebase--interactive.sh:1091
+#: git-rebase--interactive.sh:1100
 msgid "Error trying to find the author identity to amend commit"
 msgstr ""
 
-#: git-rebase--interactive.sh:1096
+#: git-rebase--interactive.sh:1105
 msgid ""
 "You have uncommitted changes in your working tree. Please commit them\n"
 "first and then run 'git rebase --continue' again."
 msgstr ""
 
-#: git-rebase--interactive.sh:1101 git-rebase--interactive.sh:1105
+#: git-rebase--interactive.sh:1110 git-rebase--interactive.sh:1114
 msgid "Could not commit staged changes."
 msgstr ""
 
-#: git-rebase--interactive.sh:1129
+#: git-rebase--interactive.sh:1138
 msgid ""
 "\n"
 "You are editing the todo file of an ongoing interactive rebase.\n"
@@ -13558,47 +13558,47 @@ msgid ""
 "\n"
 msgstr ""
 
-#: git-rebase--interactive.sh:1137 git-rebase--interactive.sh:1295
+#: git-rebase--interactive.sh:1146 git-rebase--interactive.sh:1304
 msgid "Could not execute editor"
 msgstr ""
 
-#: git-rebase--interactive.sh:1150
+#: git-rebase--interactive.sh:1159
 #, sh-format
 msgid "Could not checkout $switch_to"
 msgstr ""
 
-#: git-rebase--interactive.sh:1155
+#: git-rebase--interactive.sh:1164
 msgid "No HEAD?"
 msgstr ""
 
-#: git-rebase--interactive.sh:1156
+#: git-rebase--interactive.sh:1165
 #, sh-format
 msgid "Could not create temporary $state_dir"
 msgstr ""
 
-#: git-rebase--interactive.sh:1158
+#: git-rebase--interactive.sh:1167
 msgid "Could not mark as interactive"
 msgstr ""
 
-#: git-rebase--interactive.sh:1168 git-rebase--interactive.sh:1173
+#: git-rebase--interactive.sh:1177 git-rebase--interactive.sh:1182
 msgid "Could not init rewritten commits"
 msgstr ""
 
-#: git-rebase--interactive.sh:1273
+#: git-rebase--interactive.sh:1282
 #, sh-format
 msgid "Rebase $shortrevisions onto $shortonto ($todocount command)"
 msgid_plural "Rebase $shortrevisions onto $shortonto ($todocount commands)"
 msgstr[0] ""
 msgstr[1] ""
 
-#: git-rebase--interactive.sh:1278
+#: git-rebase--interactive.sh:1287
 msgid ""
 "\n"
 "However, if you remove everything, the rebase will be aborted.\n"
 "\n"
 msgstr ""
 
-#: git-rebase--interactive.sh:1285
+#: git-rebase--interactive.sh:1294
 msgid "Note that empty commits are commented out"
 msgstr ""
 
index 41c016e2803dc56d9f4824588a902e976cf8e63f..ee64355d812f426e5053864f6b9425c748c018c4 100644 (file)
--- a/po/ko.po
+++ b/po/ko.po
@@ -58,8 +58,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: git\n"
 "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2016-11-22 22:10+0800\n"
-"PO-Revision-Date: 2016-11-22 22:16+0800\n"
+"POT-Creation-Date: 2016-11-25 22:50+0800\n"
+"PO-Revision-Date: 2016-11-25 22:56+0800\n"
 "Last-Translator: Changwoo Ryu <cwryu@debian.org>\n"
 "Language-Team: Git Korean translation <http://github.com/changwoo/git-l10n-"
 "ko>\n"
@@ -2650,7 +2650,7 @@ msgstr "'%s'에 쓸 수 없습니다"
 
 #: sequencer.c:251
 #, c-format
-msgid "could not write eol to '%s"
+msgid "could not write eol to '%s'"
 msgstr "'%s'에 줄바꿈을 쓸 수 없습니다"
 
 #: sequencer.c:255 sequencer.c:1130 sequencer.c:1216
index 59d8ef1eec1bda70c02d4c4fe9b32148d2085497..c8e096e858a813f3040c228ca6c1a96366c4a186 100644 (file)
@@ -9,8 +9,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Git\n"
 "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2016-11-22 22:10+0800\n"
-"PO-Revision-Date: 2016-11-13 16:37+0000\n"
+"POT-Creation-Date: 2016-11-25 22:50+0800\n"
+"PO-Revision-Date: 2016-11-25 22:58+0800\n"
 "Last-Translator: Vasco Almeida <vascomalmeida@sapo.pt>\n"
 "Language-Team: Portuguese\n"
 "Language: pt\n"
@@ -2665,7 +2665,7 @@ msgstr "não foi possível escrever em '%s'"
 
 #: sequencer.c:251
 #, c-format
-msgid "could not write eol to '%s"
+msgid "could not write eol to '%s'"
 msgstr "não foi possível escrever fim de linha em '%s'"
 
 #: sequencer.c:255 sequencer.c:1130 sequencer.c:1216
index 760f7ab35691312725e0da007196975d810e81d4..a92ddcf08df3ea4a47105c281a10ba83d8c1468f 100644 (file)
--- a/po/ru.po
+++ b/po/ru.po
@@ -10,8 +10,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Git Russian Localization Project\n"
 "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2016-08-27 23:21+0800\n"
-"PO-Revision-Date: 2016-10-16 17:25+0000\n"
+"POT-Creation-Date: 2016-11-25 22:50+0800\n"
+"PO-Revision-Date: 2016-11-28 23:58+0000\n"
 "Last-Translator: Dimitriy Ryazantcev <DJm00n@mail.ru>\n"
 "Language-Team: Russian (http://www.transifex.com/djm00n/git-po-ru/language/ru/)\n"
 "MIME-Version: 1.0\n"
@@ -88,3718 +88,4164 @@ msgid ""
 "\n"
 msgstr "Примечание: переход на «%s».\n\nВы сейчас в состоянии «отделённого HEAD». Вы можете осмотреться, сделать\nэкспериментальные изменения и закоммитить их, также вы можете отменить\nизменения любых коммитов в этом состоянии не затрагивая любые ветки и\nне переходя на них.\n\nЕсли вы хотите создать новую ветку и сохранить свои коммиты, то вы\nможете сделать это (сейчас или позже) вызвав команду checkout снова,\nно с параметром -b. Например:\n\n  git checkout -b <имя-новой-ветки>\n\n"
 
-#: archive.c:12
-msgid "git archive [<options>] <tree-ish> [<path>...]"
-msgstr "git archive [<опции>] <указатель-дерева> [<путь>…]"
+#: apply.c:57
+#, c-format
+msgid "unrecognized whitespace option '%s'"
+msgstr "неопознанная опция для пробелов «%s»"
 
-#: archive.c:13
-msgid "git archive --list"
-msgstr "git archive --list"
+#: apply.c:73
+#, c-format
+msgid "unrecognized whitespace ignore option '%s'"
+msgstr "неопознанная опция для игнорирования пробелов «%s»"
 
-#: archive.c:14
-msgid ""
-"git archive --remote <repo> [--exec <cmd>] [<options>] <tree-ish> "
-"[<path>...]"
-msgstr "git archive --remote <репозиторий> [--exec <команда>] [<опции>] <указатель-дерева> [<путь>…]"
+#: apply.c:125
+msgid "--reject and --3way cannot be used together."
+msgstr "--reject и --3way нельзя использовать одновременно."
 
-#: archive.c:15
-msgid "git archive --remote <repo> [--exec <cmd>] --list"
-msgstr "git archive --remote <репозиторий> [--exec <команда>] --list"
+#: apply.c:127
+msgid "--cached and --3way cannot be used together."
+msgstr "--cached и --3way нельзя использовать одновременно."
 
-#: archive.c:344 builtin/add.c:139 builtin/add.c:435 builtin/rm.c:327
-#, c-format
-msgid "pathspec '%s' did not match any files"
-msgstr "спецификация пути «%s» не соответствует ни одному файлу"
+#: apply.c:130
+msgid "--3way outside a repository"
+msgstr "--3way вне репозитория"
 
-#: archive.c:429
-msgid "fmt"
-msgstr "формат"
+#: apply.c:141
+msgid "--index outside a repository"
+msgstr "--index вне репозитория"
 
-#: archive.c:429
-msgid "archive format"
-msgstr "формат архива"
+#: apply.c:144
+msgid "--cached outside a repository"
+msgstr "--cached вне репозитория"
 
-#: archive.c:430 builtin/log.c:1422
-msgid "prefix"
-msgstr "префикс"
+#: apply.c:845
+#, c-format
+msgid "Cannot prepare timestamp regexp %s"
+msgstr "Не удалось подготовить регулярное выражение для метки времени %s"
 
-#: archive.c:431
-msgid "prepend prefix to each pathname in the archive"
-msgstr "добавлять префикс перед каждым путем файла в архиве"
+#: apply.c:854
+#, c-format
+msgid "regexec returned %d for input: %s"
+msgstr "regexec возвратил %d для ввода: %s"
 
-#: archive.c:432 builtin/archive.c:88 builtin/blame.c:2553
-#: builtin/blame.c:2554 builtin/config.c:59 builtin/fast-export.c:987
-#: builtin/fast-export.c:989 builtin/grep.c:722 builtin/hash-object.c:100
-#: builtin/ls-files.c:460 builtin/ls-files.c:463 builtin/notes.c:399
-#: builtin/notes.c:562 builtin/read-tree.c:109 parse-options.h:153
-msgid "file"
-msgstr "файл"
+#: apply.c:938
+#, c-format
+msgid "unable to find filename in patch at line %d"
+msgstr "не удалось найти имя файла в строке патча %d"
 
-#: archive.c:433 builtin/archive.c:89
-msgid "write the archive to this file"
-msgstr "запись архива в этот файл"
+#: apply.c:977
+#, c-format
+msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d"
+msgstr "git apply: плохой git-diff — ожидалось /dev/null, получено %s на строке %d"
 
-#: archive.c:435
-msgid "read .gitattributes in working directory"
-msgstr "читать .gitattributes в рабочем каталоге"
+#: apply.c:983
+#, c-format
+msgid "git apply: bad git-diff - inconsistent new filename on line %d"
+msgstr "git apply: плохой git-diff — не согласующееся новое имя файла на строке %d"
 
-#: archive.c:436
-msgid "report archived files on stderr"
-msgstr "отчет об архивированных файлах в stderr"
+#: apply.c:984
+#, c-format
+msgid "git apply: bad git-diff - inconsistent old filename on line %d"
+msgstr "git apply: плохой git-diff — не согласующееся старое имя файла на строке %d"
 
-#: archive.c:437
-msgid "store only"
-msgstr "только хранение"
+#: apply.c:990
+#, c-format
+msgid "git apply: bad git-diff - expected /dev/null on line %d"
+msgstr "git apply: плохой git-diff  — ожидалось /dev/null на строке %d"
 
-#: archive.c:438
-msgid "compress faster"
-msgstr "сжимать быстрее"
+#: apply.c:1488
+#, c-format
+msgid "recount: unexpected line: %.*s"
+msgstr "recount: не ожидаемая строка: %.*s"
 
-#: archive.c:446
-msgid "compress better"
-msgstr "сжимать лучше"
+#: apply.c:1557
+#, c-format
+msgid "patch fragment without header at line %d: %.*s"
+msgstr "фрагмент изменений без заголовка на строке %d: %.*s"
 
-#: archive.c:449
-msgid "list supported archive formats"
-msgstr "перечислить поддерживаемые форматы архивов"
+#: apply.c:1577
+#, c-format
+msgid ""
+"git diff header lacks filename information when removing %d leading pathname"
+" component (line %d)"
+msgid_plural ""
+"git diff header lacks filename information when removing %d leading pathname"
+" components (line %d)"
+msgstr[0] "заголовок git diff не нашел информацию об имени файла при удалении %d ведущего компонента пути к файлу (строка %d)"
+msgstr[1] "заголовок git diff не нашел информацию об имени файла при удалении %d ведущих компонент пути к файлу (строка %d)"
+msgstr[2] "заголовок git diff не нашел информацию об имени файла при удалении %d ведущих компонент пути к файлу (строка %d)"
+msgstr[3] "заголовок git diff не нашел информацию об имени файла при удалении %d ведущих компонент пути к файлу (строка %d)"
 
-#: archive.c:451 builtin/archive.c:90 builtin/clone.c:82
-#: builtin/submodule--helper.c:832
-msgid "repo"
-msgstr "репозиторий"
+#: apply.c:1589
+#, c-format
+msgid "git diff header lacks filename information (line %d)"
+msgstr "заголовок git diff не содержит информации об имени файла (строка %d)"
 
-#: archive.c:452 builtin/archive.c:91
-msgid "retrieve the archive from remote repository <repo>"
-msgstr "полÑ\83Ñ\87иÑ\82Ñ\8c Ð°Ñ\80Ñ\85ив Ð¸Ð· Ð²Ð½ÐµÑ\88него <Ñ\80епозиÑ\82оÑ\80иÑ\8f>"
+#: apply.c:1759
+msgid "new file depends on old contents"
+msgstr "новÑ\8bй Ñ\84айл Ð·Ð°Ð²Ð¸Ñ\81иÑ\82 Ð¾Ñ\82 Ñ\81Ñ\82аÑ\80ого Ñ\81одеÑ\80жимого"
 
-#: archive.c:453 builtin/archive.c:92 builtin/notes.c:483
-msgid "command"
-msgstr "команда"
+#: apply.c:1761
+msgid "deleted file still has contents"
+msgstr "удаленный файл все еще имеет содержимое"
 
-#: archive.c:454 builtin/archive.c:93
-msgid "path to the remote git-upload-archive command"
-msgstr "путь к команде git-upload-archive на машине с внешним репозиторием"
+#: apply.c:1795
+#, c-format
+msgid "corrupt patch at line %d"
+msgstr "патч поврежден на строке %d"
 
-#: archive.c:461
-msgid "Unexpected option --remote"
-msgstr "Неожиданная опция --remote"
+#: apply.c:1832
+#, c-format
+msgid "new file %s depends on old contents"
+msgstr "новый файл %s зависит от старого содержимого"
 
-#: archive.c:463
-msgid "Option --exec can only be used together with --remote"
-msgstr "Опция --exec может использоваться только вместе с --remote"
+#: apply.c:1834
+#, c-format
+msgid "deleted file %s still has contents"
+msgstr "удаленный файл %s все еще имеет содержимое"
 
-#: archive.c:465
-msgid "Unexpected option --output"
-msgstr "Неожиданная опция --output"
+#: apply.c:1837
+#, c-format
+msgid "** warning: file %s becomes empty but is not deleted"
+msgstr "** предупреждение: файл %s становится пустым, но не удаляется"
 
-#: archive.c:487
+#: apply.c:1984
 #, c-format
-msgid "Unknown archive format '%s'"
-msgstr "Ð\9dеизвеÑ\81Ñ\82нÑ\8bй Ñ\84оÑ\80маÑ\82 Ð°Ñ\80Ñ\85ива Â«%s»"
+msgid "corrupt binary patch at line %d: %.*s"
+msgstr "повÑ\80ежденнÑ\8bй Ð´Ð²Ð¾Ð¸Ñ\87нÑ\8bй Ð¿Ð°Ñ\82Ñ\87 Ð½Ð° Ñ\81Ñ\82Ñ\80оке %d: %.*s"
 
-#: archive.c:494
+#: apply.c:2021
 #, c-format
-msgid "Argument not supported for format '%s': -%d"
-msgstr "Ð\90Ñ\80гÑ\83менÑ\82 Ð½Ðµ Ð¿Ð¾Ð´Ð´ÐµÑ\80живаеÑ\82Ñ\81Ñ\8f Ð´Ð»Ñ\8f Ñ\84оÑ\80маÑ\82а Â«%s»: -%d"
+msgid "unrecognized binary patch at line %d"
+msgstr "неопознаннÑ\8bй Ð´Ð²Ð¾Ð¸Ñ\87нÑ\8bй Ð¿Ð°Ñ\82Ñ\87 Ð½Ð° Ñ\81Ñ\82Ñ\80оке %d"
 
-#: attr.c:263
-msgid ""
-"Negative patterns are ignored in git attributes\n"
-"Use '\\!' for literal leading exclamation."
-msgstr "Отрицающие шаблоны в атрибутах git игнорируются.\nИспользуйте «\\!» для буквального использования символа в значении «восклицательный знак»."
+#: apply.c:2182
+#, c-format
+msgid "patch with only garbage at line %d"
+msgstr "патч с мусором на строке %d"
 
-#: bisect.c:441
+#: apply.c:2274
 #, c-format
-msgid "Could not open file '%s'"
-msgstr "Ð\9dе Ñ\83далоÑ\81Ñ\8c Ð¾Ñ\82кÑ\80Ñ\8bÑ\82Ñ\8c Ñ\84айл Â«%s»"
+msgid "unable to read symlink %s"
+msgstr "не Ñ\83далоÑ\81Ñ\8c Ð¿Ñ\80оÑ\87иÑ\82аÑ\82Ñ\8c Ñ\81имволÑ\8cнÑ\83Ñ\8e Ñ\81Ñ\81Ñ\8bлкÑ\83 %s"
 
-#: bisect.c:446
+#: apply.c:2278
 #, c-format
-msgid "Badly quoted content in file '%s': %s"
-msgstr "Ð\9fлоÑ\85ое Ñ\81одеÑ\80жимое Ñ\84айла Â«%s»: %s"
+msgid "unable to open or read %s"
+msgstr "не Ñ\83далоÑ\81Ñ\8c Ð¾Ñ\82кÑ\80Ñ\8bÑ\82Ñ\8c Ð¸Ð»Ð¸ Ð¿Ñ\80оÑ\87еÑ\81Ñ\82Ñ\8c %s"
 
-#: bisect.c:655
+#: apply.c:2931
 #, c-format
-msgid "We cannot bisect more!\n"
-msgstr "Ð\9dевозможно Ð¿Ñ\80одолжиÑ\82Ñ\8c Ð±Ð¸Ð½Ð°Ñ\80нÑ\8bй Ð¿Ð¾Ð¸Ñ\81к!\n"
+msgid "invalid start of line: '%c'"
+msgstr "непÑ\80авилÑ\8cное Ð½Ð°Ñ\87ало Ñ\81Ñ\82Ñ\80оки: Â«%c»"
 
-#: bisect.c:708
+#: apply.c:3050
 #, c-format
-msgid "Not a valid commit name %s"
-msgstr "Недопустимое имя коммита %s"
+msgid "Hunk #%d succeeded at %d (offset %d line)."
+msgid_plural "Hunk #%d succeeded at %d (offset %d lines)."
+msgstr[0] "Часть #%d успешно применена на %d (со сдвигом в %d строку)."
+msgstr[1] "Часть #%d успешно применена на %d (со сдвигом в %d строки)."
+msgstr[2] "Часть #%d успешно применена на %d (со сдвигом в %d строк)."
+msgstr[3] "Часть #%d успешно применена на %d (со сдвигом в %d строк)."
 
-#: bisect.c:732
+#: apply.c:3062
 #, c-format
-msgid ""
-"The merge base %s is bad.\n"
-"This means the bug has been fixed between %s and [%s].\n"
-msgstr "База слияния %s является плохим коммитом.\nЭто значит, что ошибка была исправлена где-то между %s и [%s].\n"
+msgid "Context reduced to (%ld/%ld) to apply fragment at %d"
+msgstr "Контекст сужен до (%ld/%ld), чтобы применить фрагмент на %d строке"
 
-#: bisect.c:737
+#: apply.c:3068
 #, c-format
 msgid ""
-"The merge base %s is new.\n"
-"The property has changed between %s and [%s].\n"
-msgstr "Ð\91аза Ñ\81лиÑ\8fниÑ\8f %s Ñ\8fвлÑ\8fеÑ\82Ñ\81Ñ\8f Ð½Ð¾Ð²Ð¾Ð¹.\nСвойÑ\81Ñ\82во Ð±Ñ\8bло Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¾ Ð³Ð´Ðµ-Ñ\82о Ð¼ÐµÐ¶Ð´Ñ\83 %s Ð¸ [%s].\n"
+"while searching for:\n"
+"%.*s"
+msgstr "пÑ\80и Ð¿Ð¾Ð¸Ñ\81ке:\n%.*s"
 
-#: bisect.c:742
+#: apply.c:3090
 #, c-format
-msgid ""
-"The merge base %s is %s.\n"
-"This means the first '%s' commit is between %s and [%s].\n"
-msgstr "База слияния %s является %s.\nЭто значит, что «%s» коммит находится где-то между %s и [%s].\n"
+msgid "missing binary patch data for '%s'"
+msgstr "пропущены данные двоичного патча для «%s»"
 
-#: bisect.c:750
+#: apply.c:3098
 #, c-format
-msgid ""
-"Some %s revs are not ancestor of the %s rev.\n"
-"git bisect cannot work properly in this case.\n"
-"Maybe you mistook %s and %s revs?\n"
-msgstr "Несколько %s коммитов не являются предками %s коммита.\nВ этом случае git bisect не может работать правильно.\nВозможно, вы перепутали редакции %s и %s местами?\n"
+msgid "cannot reverse-apply a binary patch without the reverse hunk to '%s'"
+msgstr "невозможно выполнить reverse-apply для двоичного патча, без обращения изменений блока «%s»"
 
-#: bisect.c:763
+#: apply.c:3144
+#, c-format
+msgid "cannot apply binary patch to '%s' without full index line"
+msgstr "невозможно применить двоичный патч «%s» без строки с указанной полной версией индекса"
+
+#: apply.c:3154
 #, c-format
 msgid ""
-"the merge base between %s and [%s] must be skipped.\n"
-"So we cannot be sure the first %s commit is between %s and %s.\n"
-"We continue anyway."
-msgstr "База слияния между %s и [%s] должно быть пропущена.\nПоэтому мы не можем быть уверены, что первый %s коммит находится между %s и %s.\nНо все же продолжаем поиск."
+"the patch applies to '%s' (%s), which does not match the current contents."
+msgstr "патч применятся к файлу «%s» (%s), но его текущее содержимое не соотвествует ожидаемому."
 
-#: bisect.c:798
+#: apply.c:3162
 #, c-format
-msgid "Bisecting: a merge base must be tested\n"
-msgstr "Ð\91инаÑ\80нÑ\8bй Ð¿Ð¾Ð¸Ñ\81к: Ð±Ð°Ð·Ð° Ñ\81лиÑ\8fниÑ\8f Ð´Ð¾Ð»Ð¶Ð½Ð° Ð±Ñ\8bÑ\82Ñ\8c Ð¿Ñ\80овеÑ\80ена\n"
+msgid "the patch applies to an empty '%s' but it is not empty"
+msgstr "паÑ\82Ñ\87 Ð¿Ñ\80именÑ\8fеÑ\82Ñ\81Ñ\8f Ðº Ð¿Ñ\83Ñ\81Ñ\82омÑ\83 Ñ\84айлÑ\83 Â«%s», Ð½Ð¾ Ñ\84айл Ð½Ðµ Ð¿Ñ\83Ñ\81Ñ\82ой"
 
-#: bisect.c:849
+#: apply.c:3180
 #, c-format
-msgid "a %s revision is needed"
-msgstr "нужно указать %s редакцию"
+msgid "the necessary postimage %s for '%s' cannot be read"
+msgstr "не удалось прочитать необходимую посылку %s для «%s»"
 
-#: bisect.c:866 builtin/notes.c:174 builtin/tag.c:248
+#: apply.c:3193
 #, c-format
-msgid "could not create file '%s'"
-msgstr "не удалось создать файл «%s»"
+msgid "binary patch does not apply to '%s'"
+msgstr "не удалось применить двоичный патч к «%s»"
 
-#: bisect.c:917
+#: apply.c:3199
 #, c-format
-msgid "could not read file '%s'"
-msgstr "не Ñ\83далоÑ\81Ñ\8c Ð¿Ñ\80оÑ\87иÑ\82аÑ\82Ñ\8c Ñ\84айл Â«%s»"
+msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)"
+msgstr "поÑ\81ле Ð¿Ñ\80именениÑ\8f Ð´Ð²Ð¾Ð¸Ñ\87ного Ð¿Ð°Ñ\82Ñ\87а Ð´Ð»Ñ\8f Â«%s» Ð±Ñ\8bл Ð¿Ð¾Ð»Ñ\83Ñ\87ен Ð½ÐµÐ¿Ñ\80авилÑ\8cнÑ\8bй Ñ\80езÑ\83лÑ\8cÑ\82аÑ\82 (ожидалоÑ\81Ñ\8c %s, Ð¿Ð¾Ð»Ñ\83Ñ\87ено %s)"
 
-#: bisect.c:947
-msgid "reading bisect refs failed"
-msgstr "сбой при чтении ссылок двоичного поиска"
+#: apply.c:3220
+#, c-format
+msgid "patch failed: %s:%ld"
+msgstr "ошибка применения изменений: %s:%ld"
 
-#: bisect.c:967
+#: apply.c:3342
 #, c-format
-msgid "%s was both %s and %s\n"
-msgstr "%s была одновременно и %s и %s\n"
+msgid "cannot checkout %s"
+msgstr "не удалось переключить состояние на %s"
 
-#: bisect.c:975
+#: apply.c:3390 apply.c:3401 apply.c:3447 setup.c:248
 #, c-format
-msgid ""
-"No testable commit found.\n"
-"Maybe you started with bad path parameters?\n"
-msgstr "Тестируемый коммит не найден.\nВозможно, вы начали поиск с указанием неправильного параметра пути?\n"
+msgid "failed to read %s"
+msgstr "не удалось прочитать %s"
 
-#: bisect.c:994
+#: apply.c:3398
 #, c-format
-msgid "(roughly %d step)"
-msgid_plural "(roughly %d steps)"
-msgstr[0] "(примерно %d шаг)"
-msgstr[1] "(примерно %d шага)"
-msgstr[2] "(примерно %d шагов)"
-msgstr[3] "(примерно %d шагов)"
+msgid "reading from '%s' beyond a symbolic link"
+msgstr "чтение из «%s» за символической ссылкой"
 
-#. TRANSLATORS: the last %s will be replaced with
-#. "(roughly %d steps)" translation
-#: bisect.c:998
+#: apply.c:3427 apply.c:3667
 #, c-format
-msgid "Bisecting: %d revision left to test after this %s\n"
-msgid_plural "Bisecting: %d revisions left to test after this %s\n"
-msgstr[0] "Бинарный поиск: %d редакцию осталось проверить после этой %s\n"
-msgstr[1] "Бинарный поиск: %d редакции осталось проверить после этой %s\n"
-msgstr[2] "Бинарный поиск: %d редакций осталось проверить после этой %s\n"
-msgstr[3] "Бинарный поиск: %d редакций осталось проверить после этой %s\n"
+msgid "path %s has been renamed/deleted"
+msgstr "путь %s был переименован/удален"
 
-#: branch.c:53
+#: apply.c:3510 apply.c:3681
 #, c-format
-msgid ""
-"\n"
-"After fixing the error cause you may try to fix up\n"
-"the remote tracking information by invoking\n"
-"\"git branch --set-upstream-to=%s%s%s\"."
-msgstr "\nПосле исправления причины ошибки,\nвы можете исправить информацию об отслеживаемой\nвнешней ветке, с помощью команды\n«git branch --set-upstream-to=%s%s%s»."
+msgid "%s: does not exist in index"
+msgstr "%s: нет в индексе"
 
-#: branch.c:67
+#: apply.c:3519 apply.c:3689
 #, c-format
-msgid "Not setting branch %s as its own upstream."
-msgstr "Не устанавливаю ветку %s, так так она принадлежит вышестоящему репозиторию."
+msgid "%s: does not match index"
+msgstr "%s: не совпадает с индексом"
 
-#: branch.c:93
-#, c-format
-msgid "Branch %s set up to track remote branch %s from %s by rebasing."
-msgstr "Ветка %s отслеживает внешнюю ветку %s из %s перемещением."
+#: apply.c:3554
+msgid "repository lacks the necessary blob to fall back on 3-way merge."
+msgstr "в репозитории отсутствует необходимый двоичный объект для отката к трёхходовому слиянию."
 
-#: branch.c:94
+#: apply.c:3557
 #, c-format
-msgid "Branch %s set up to track remote branch %s from %s."
-msgstr "Ð\92еÑ\82ка %s Ð¾Ñ\82Ñ\81леживаеÑ\82 Ð²Ð½ÐµÑ\88нÑ\8eÑ\8e Ð²ÐµÑ\82кÑ\83 %s Ð¸Ð· %s."
+msgid "Falling back to three-way merge...\n"
+msgstr "Ð\9eÑ\82каÑ\82 Ðº Ñ\82Ñ\80Ñ\91Ñ\85Ñ\85одовомÑ\83 Ñ\81лиÑ\8fниÑ\8eâ\80¦\n"
 
-#: branch.c:98
+#: apply.c:3573 apply.c:3577
 #, c-format
-msgid "Branch %s set up to track local branch %s by rebasing."
-msgstr "Ð\92еÑ\82ка %s Ð¾Ñ\82Ñ\81леживаеÑ\82 Ð»Ð¾ÐºÐ°Ð»Ñ\8cнÑ\83Ñ\8e Ð²ÐµÑ\82кÑ\83 %s Ð¿ÐµÑ\80емеÑ\89ением."
+msgid "cannot read the current contents of '%s'"
+msgstr "не Ñ\83далоÑ\81Ñ\8c Ð¿Ñ\80оÑ\87иÑ\82аÑ\82Ñ\8c Ñ\82екÑ\83Ñ\89ее Ñ\81одеÑ\80жимое Â«%s»"
 
-#: branch.c:99
+#: apply.c:3589
 #, c-format
-msgid "Branch %s set up to track local branch %s."
-msgstr "Ð\92еÑ\82ка %s Ð¾Ñ\82Ñ\81леживаеÑ\82 Ð»Ð¾ÐºÐ°Ð»Ñ\8cнÑ\83Ñ\8e Ð²ÐµÑ\82кÑ\83 %s."
+msgid "Failed to fall back on three-way merge...\n"
+msgstr "Ð\9dе Ñ\83далоÑ\81Ñ\8c Ð¾Ñ\82каÑ\82иÑ\82Ñ\8cÑ\81Ñ\8f Ðº Ñ\82Ñ\80Ñ\91Ñ\85Ñ\85одовомÑ\83 Ñ\81лиÑ\8fниÑ\8eâ\80¦\n"
 
-#: branch.c:104
+#: apply.c:3603
 #, c-format
-msgid "Branch %s set up to track remote ref %s by rebasing."
-msgstr "Ð\92еÑ\82ка %s Ð¾Ñ\82Ñ\81леживаеÑ\82 Ð²Ð½ÐµÑ\88нÑ\8eÑ\8e Ñ\81Ñ\81Ñ\8bлкÑ\83 %s Ð¿ÐµÑ\80емеÑ\89ением."
+msgid "Applied patch to '%s' with conflicts.\n"
+msgstr "Ð\9fаÑ\82Ñ\87 Ð¿Ñ\80именен Ðº Â«%s» Ñ\81 ÐºÐ¾Ð½Ñ\84ликÑ\82ами.\n"
 
-#: branch.c:105
+#: apply.c:3608
 #, c-format
-msgid "Branch %s set up to track remote ref %s."
-msgstr "Ð\92еÑ\82ка %s Ð¾Ñ\82Ñ\81леживаеÑ\82 Ð²Ð½ÐµÑ\88нÑ\8eÑ\8e Ñ\81Ñ\81Ñ\8bлкÑ\83 %s."
+msgid "Applied patch to '%s' cleanly.\n"
+msgstr "Ð\9fаÑ\82Ñ\87 Ð¿Ñ\80именен Ðº Â«%s» Ð±ÐµÐ· Ð¾Ñ\88ибок.\n"
 
-#: branch.c:109
+#: apply.c:3634
+msgid "removal patch leaves file contents"
+msgstr "патч удаления не удалил содержимое файла"
+
+#: apply.c:3706
 #, c-format
-msgid "Branch %s set up to track local ref %s by rebasing."
-msgstr "Ветка %s отслеживает локальную ссылку %s перемещением."
+msgid "%s: wrong type"
+msgstr "%s: неправильный тип"
 
-#: branch.c:110
+#: apply.c:3708
 #, c-format
-msgid "Branch %s set up to track local ref %s."
-msgstr "Ветка %s отслеживает локальную ссылку %s."
+msgid "%s has type %o, expected %o"
+msgstr "%s имеет тип %o, а ожидался %o"
 
-#: branch.c:119
-msgid "Unable to write upstream branch configuration"
-msgstr "Не удалось записать настройки вышестоящей ветки"
+#: apply.c:3859 apply.c:3861
+#, c-format
+msgid "invalid path '%s'"
+msgstr "неправильный путь «%s»"
 
-#: branch.c:156
+#: apply.c:3917
 #, c-format
-msgid "Not tracking: ambiguous information for ref %s"
-msgstr "Не отслеживается: неоднозначная информация для ссылки %s"
+msgid "%s: already exists in index"
+msgstr "%s: уже содержится в индексе"
 
-#: branch.c:185
+#: apply.c:3920
 #, c-format
-msgid "'%s' is not a valid branch name."
-msgstr "«%s» не является действительным именем ветки."
+msgid "%s: already exists in working directory"
+msgstr "%s: уже содержится в рабочем каталоге"
 
-#: branch.c:190
+#: apply.c:3940
 #, c-format
-msgid "A branch named '%s' already exists."
-msgstr "Ð\92еÑ\82ка Ñ\81 Ð¸Ð¼ÐµÐ½ÐµÐ¼ Â«%s» Ñ\83же Ñ\81Ñ\83Ñ\89еÑ\81Ñ\82вÑ\83еÑ\82."
+msgid "new mode (%o) of %s does not match old mode (%o)"
+msgstr "новÑ\8bй Ñ\80ежим Ð´Ð¾Ñ\81Ñ\82Ñ\83па (%o) Ð´Ð»Ñ\8f %s Ð½Ðµ Ñ\81ооÑ\82веÑ\82Ñ\81Ñ\82вÑ\83еÑ\82 Ñ\81Ñ\82аÑ\80омÑ\83 Ñ\80ежимÑ\83 Ð´Ð¾Ñ\81Ñ\82Ñ\83па (%o)"
 
-#: branch.c:198
-msgid "Cannot force update the current branch."
-msgstr "Не удалось принудительно обновить текущую ветку."
+#: apply.c:3945
+#, c-format
+msgid "new mode (%o) of %s does not match old mode (%o) of %s"
+msgstr "новый режим доступа (%o) для %s не соответствует старому режиму доступа (%o) для %s"
 
-#: branch.c:218
+#: apply.c:3965
 #, c-format
-msgid ""
-"Cannot setup tracking information; starting point '%s' is not a branch."
-msgstr "Не удалось настроить информацию отслеживания; стартовая точка «%s» не является веткой."
+msgid "affected file '%s' is beyond a symbolic link"
+msgstr "затронутый файл «%s» находится за символической ссылкой"
 
-#: branch.c:220
+#: apply.c:3969
 #, c-format
-msgid "the requested upstream branch '%s' does not exist"
-msgstr "запрошенная ветка вышестоящего репозитория «%s» не существует"
+msgid "%s: patch does not apply"
+msgstr "%s: не удалось применить патч"
 
-#: branch.c:222
-msgid ""
-"\n"
-"If you are planning on basing your work on an upstream\n"
-"branch that already exists at the remote, you may need to\n"
-"run \"git fetch\" to retrieve it.\n"
-"\n"
-"If you are planning to push out a new local branch that\n"
-"will track its remote counterpart, you may want to use\n"
-"\"git push -u\" to set the upstream config as you push."
-msgstr "\nЕсли вы планируете основывать свою работу на вышестоящей ветке, которая уже существует во внешнем репозитории, вам может потребоваться запустить «git fetch» для ее получения.\n\nЕсли вы планируете отправить новую локальную ветку, которая будет отслеживаться, во внешний репозиторий, вам может потребоваться запустить «git push -u» — чтобы сохранить настройку вышестоящего репозитория для отправки."
+#: apply.c:3984
+#, c-format
+msgid "Checking patch %s..."
+msgstr "Проверка патча %s…"
 
-#: branch.c:266
+#: apply.c:4075
 #, c-format
-msgid "Not a valid object name: '%s'."
-msgstr "Ð\9dедопÑ\83Ñ\81Ñ\82имое Ð¸Ð¼Ñ\8f Ð¾Ð±Ñ\8aекÑ\82а: Â«%s»."
+msgid "sha1 information is lacking or useless for submodule %s"
+msgstr "инÑ\84оÑ\80маÑ\86иÑ\8f Ð¾Ð± sha1 Ð¾Ñ\82Ñ\81Ñ\83Ñ\82Ñ\81Ñ\82вÑ\83еÑ\82 Ð¸Ð»Ð¸ Ð±ÐµÑ\81полезна Ð´Ð»Ñ\8f Ð¿Ð¾Ð´Ð¼Ð¾Ð´Ñ\83лÑ\8f %s"
 
-#: branch.c:286
+#: apply.c:4082
 #, c-format
-msgid "Ambiguous object name: '%s'."
-msgstr "Ð\9dеоднознаÑ\87ное Ð¸Ð¼Ñ\8f Ð¾Ð±Ñ\8aекÑ\82а: Â«%s»."
+msgid "mode change for %s, which is not in current HEAD"
+msgstr "изменен Ñ\80ежим Ð´Ð»Ñ\8f %s, ÐºÐ¾Ñ\82оÑ\80Ñ\8bй Ð½Ðµ Ð½Ð°Ñ\85одиÑ\82Ñ\81Ñ\8f Ð² Ñ\82екÑ\83Ñ\89ем HEAD"
 
-#: branch.c:291
+#: apply.c:4085
 #, c-format
-msgid "Not a valid branch point: '%s'."
-msgstr "Ð\9dедопÑ\83Ñ\81Ñ\82имаÑ\8f Ñ\82оÑ\87ка Ð²ÐµÑ\82ки: Â«%s»."
+msgid "sha1 information is lacking or useless (%s)."
+msgstr "инÑ\84оÑ\80маÑ\86иÑ\8f Ð¾Ð± sha1 Ð¾Ñ\82Ñ\81Ñ\83Ñ\82Ñ\81Ñ\82вÑ\83еÑ\82 Ð¸Ð»Ð¸ Ð±ÐµÑ\81полезна (%s)."
 
-#: branch.c:345
+#: apply.c:4090 builtin/checkout.c:233 builtin/reset.c:135
 #, c-format
-msgid "'%s' is already checked out at '%s'"
-msgstr "«%s» уже находится на «%s»"
+msgid "make_cache_entry failed for path '%s'"
+msgstr "сбой make_cache_entry для пути «%s»"
 
-#: branch.c:364
+#: apply.c:4094
 #, c-format
-msgid "HEAD of working tree %s is not updated"
-msgstr "HEAD рабочего каталога %s не обновлён"
+msgid "could not add %s to temporary index"
+msgstr "не удалось добавить %s во временный индекс"
 
-#: bundle.c:34
+#: apply.c:4104
 #, c-format
-msgid "'%s' does not look like a v2 bundle file"
-msgstr "«%s» не похож на файл пакета версии 2"
+msgid "could not write temporary index to %s"
+msgstr "не удалось записать временный индкекс в %s"
 
-#: bundle.c:61
+#: apply.c:4242
 #, c-format
-msgid "unrecognized header: %s%s (%d)"
-msgstr "неопознанный заголовок: %s%s (%d)"
+msgid "unable to remove %s from index"
+msgstr "не удалось удалить %s из индекса"
 
-#: bundle.c:87 builtin/commit.c:778
+#: apply.c:4277
 #, c-format
-msgid "could not open '%s'"
-msgstr "не Ñ\83далоÑ\81Ñ\8c Ð¾Ñ\82кÑ\80Ñ\8bÑ\82Ñ\8c Â«%s»"
+msgid "corrupt patch for submodule %s"
+msgstr "повÑ\80ежденнÑ\8bй Ð¿Ð°Ñ\82Ñ\87 Ð´Ð»Ñ\8f Ð¿Ð¾Ð´Ð¼Ð¾Ð´Ñ\83лÑ\8f %s"
 
-#: bundle.c:139
-msgid "Repository lacks these prerequisite commits:"
-msgstr "В репозитории отсутствуют необходимые коммиты:"
+#: apply.c:4283
+#, c-format
+msgid "unable to stat newly created file '%s'"
+msgstr "не удалось выполнить stat для созданного файла «%s»"
 
-#: bundle.c:163 ref-filter.c:1462 sequencer.c:630 sequencer.c:1085
-#: builtin/blame.c:2763 builtin/commit.c:1057 builtin/log.c:348
-#: builtin/log.c:890 builtin/log.c:1336 builtin/log.c:1659 builtin/log.c:1901
-#: builtin/merge.c:356 builtin/shortlog.c:170
-msgid "revision walk setup failed"
-msgstr "сбой инициализации прохода по редакциям"
+#: apply.c:4291
+#, c-format
+msgid "unable to create backing store for newly created file %s"
+msgstr "не удалось создать вспомогательный файл для созданного файла %s"
 
-#: bundle.c:185
+#: apply.c:4297 apply.c:4441
 #, c-format
-msgid "The bundle contains this ref:"
-msgid_plural "The bundle contains these %d refs:"
-msgstr[0] "Пакет содержит эту %d ссылку:"
-msgstr[1] "Пакет содержит эти %d ссылки:"
-msgstr[2] "Пакет содержит эти %d ссылок:"
-msgstr[3] "Пакет содержит эти %d ссылок:"
+msgid "unable to add cache entry for %s"
+msgstr "не удалось создать запись в кэше для %s"
 
-#: bundle.c:192
-msgid "The bundle records a complete history."
-msgstr "Пакет содержит полную историю."
+#: apply.c:4338
+#, c-format
+msgid "failed to write to '%s'"
+msgstr "не удалось записать в «%s»"
 
-#: bundle.c:194
+#: apply.c:4342
 #, c-format
-msgid "The bundle requires this ref:"
-msgid_plural "The bundle requires these %d refs:"
-msgstr[0] "Пакет требует эту %d ссылку:"
-msgstr[1] "Пакет требует эти %d ссылки:"
-msgstr[2] "Пакет требует эти %d ссылок:"
-msgstr[3] "Пакет требует эти %d ссылок:"
+msgid "closing file '%s'"
+msgstr "закрытие файла «%s»"
 
-#: bundle.c:253
-msgid "Could not spawn pack-objects"
-msgstr "Не удалось создать объекты пакета"
+#: apply.c:4412
+#, c-format
+msgid "unable to write file '%s' mode %o"
+msgstr "не удалось записать файл «%s» с режимом доступа %o"
 
-#: bundle.c:264
-msgid "pack-objects died"
-msgstr "критическая ошибка pack-objects"
+#: apply.c:4510
+#, c-format
+msgid "Applied patch %s cleanly."
+msgstr "Патч %s применен без ошибок."
 
-#: bundle.c:304
-msgid "rev-list died"
-msgstr "кÑ\80иÑ\82иÑ\87еÑ\81каÑ\8f Ð¾Ñ\88ибка rev-list"
+#: apply.c:4518
+msgid "internal error"
+msgstr "внÑ\83Ñ\82Ñ\80еннÑ\8fÑ\8f Ð¾Ñ\88ибка"
 
-#: bundle.c:353
+#: apply.c:4521
 #, c-format
-msgid "ref '%s' is excluded by the rev-list options"
-msgstr "ссылка «%s» исключена в соответствии с опциями rev-list"
+msgid "Applying patch %%s with %d reject..."
+msgid_plural "Applying patch %%s with %d rejects..."
+msgstr[0] "Применение патча %%s с %d отказом…"
+msgstr[1] "Применение патча %%s с %d отказами…"
+msgstr[2] "Применение патча %%s с %d отказами…"
+msgstr[3] "Применение патча %%s с %d отказами…"
 
-#: bundle.c:443 builtin/log.c:165 builtin/log.c:1565 builtin/shortlog.c:273
+#: apply.c:4532
 #, c-format
-msgid "unrecognized argument: %s"
-msgstr "неопознанный аргумент: %s"
-
-#: bundle.c:451
-msgid "Refusing to create empty bundle."
-msgstr "Отклонение создания пустого пакета."
+msgid "truncating .rej filename to %.*s.rej"
+msgstr "усечение имени .rej файла до %.*s.rej"
 
-#: bundle.c:463
+#: apply.c:4540 builtin/fetch.c:740 builtin/fetch.c:989
 #, c-format
-msgid "cannot create '%s'"
-msgstr "не удалось создать «%s»"
-
-#: bundle.c:491
-msgid "index-pack died"
-msgstr "критическая ошибка index-pack"
+msgid "cannot open %s"
+msgstr "не удалось открыть %s"
 
-#: color.c:290
+#: apply.c:4554
 #, c-format
-msgid "invalid color value: %.*s"
-msgstr "недопÑ\83Ñ\81Ñ\82имое Ð·Ð½Ð°Ñ\87ение Ñ\86веÑ\82а: %.*s"
+msgid "Hunk #%d applied cleanly."
+msgstr "Ð\91лок â\84\96%d Ð¿Ñ\80именен Ð±ÐµÐ· Ð¾Ñ\88ибок."
 
-#: commit.c:40 builtin/am.c:433 builtin/am.c:469 builtin/am.c:1505
-#: builtin/am.c:2119
+#: apply.c:4558
 #, c-format
-msgid "could not parse %s"
-msgstr "не Ñ\83далоÑ\81Ñ\8c Ñ\80азобÑ\80аÑ\82Ñ\8c %s"
+msgid "Rejected hunk #%d."
+msgstr "Ð\91лок â\84\96%d Ð¾Ñ\82клонен."
 
-#: commit.c:42
+#: apply.c:4668
 #, c-format
-msgid "%s %s is not a commit!"
-msgstr "%s %s не является коммитом!"
+msgid "Skipped patch '%s'."
+msgstr "Патч «%s» пропущен."
 
-#: compat/obstack.c:406 compat/obstack.c:408
-msgid "memory exhausted"
-msgstr "памÑ\8fÑ\82Ñ\8c Ð¸Ñ\81Ñ\87еÑ\80пана"
+#: apply.c:4676
+msgid "unrecognized input"
+msgstr "не Ñ\80аÑ\81познаннÑ\8bй Ð²Ð²Ð¾Ð´"
 
-#: config.c:516
+#: apply.c:4695
+msgid "unable to read index file"
+msgstr "не удалось прочитать файл индекса"
+
+#: apply.c:4833
 #, c-format
-msgid "bad config line %d in blob %s"
-msgstr "оÑ\88ибка Ð² %d Ñ\81Ñ\82Ñ\80оке Ð´Ð²Ð¾Ð¸Ñ\87ного Ð¾Ð±Ñ\8aекÑ\82а %s"
+msgid "can't open patch '%s': %s"
+msgstr "не Ñ\83далоÑ\81Ñ\8c Ð¾Ñ\82кÑ\80Ñ\8bÑ\82Ñ\8c Ð¿Ð°Ñ\82Ñ\87 Â«%s»: %s"
 
-#: config.c:520
+#: apply.c:4858
 #, c-format
-msgid "bad config line %d in file %s"
-msgstr "ошибка в %d строке файла %s"
+msgid "squelched %d whitespace error"
+msgid_plural "squelched %d whitespace errors"
+msgstr[0] "пропущена %d ошибка в пробельных символах"
+msgstr[1] "пропущено %d ошибки в пробельных символах"
+msgstr[2] "пропущено %d ошибок в пробельных символах"
+msgstr[3] "пропущено %d ошибок в пробельных символах"
 
-#: config.c:524
+#: apply.c:4864 apply.c:4879
 #, c-format
-msgid "bad config line %d in standard input"
-msgstr "ошибка в %d строке стандартного ввода"
+msgid "%d line adds whitespace errors."
+msgid_plural "%d lines add whitespace errors."
+msgstr[0] "%d строка добавила ошибки в пробельных символах."
+msgstr[1] "%d строки добавили ошибки в пробельных символах."
+msgstr[2] "%d строк добавили ошибки в пробельных символах."
+msgstr[3] "%d строк добавили ошибки в пробельных символах."
 
-#: config.c:528
+#: apply.c:4872
 #, c-format
-msgid "bad config line %d in submodule-blob %s"
-msgstr "ошибка в %d строке двоичного объекта подмодуля %s"
+msgid "%d line applied after fixing whitespace errors."
+msgid_plural "%d lines applied after fixing whitespace errors."
+msgstr[0] "%d строка добавлена после исправления ошибок в пробелах."
+msgstr[1] "%d строки добавлено после исправления ошибок в пробелах."
+msgstr[2] "%d строк добавлено после исправления ошибок в пробелах."
+msgstr[3] "%d строки добавлено после исправления ошибок в пробелах."
 
-#: config.c:532
+#: apply.c:4888 builtin/add.c:463 builtin/mv.c:286 builtin/rm.c:431
+msgid "Unable to write new index file"
+msgstr "Не удалось записать новый файл индекса"
+
+#: apply.c:4919 apply.c:4922 builtin/am.c:2277 builtin/am.c:2280
+#: builtin/clone.c:95 builtin/fetch.c:98 builtin/pull.c:180
+#: builtin/submodule--helper.c:281 builtin/submodule--helper.c:407
+#: builtin/submodule--helper.c:589 builtin/submodule--helper.c:592
+#: builtin/submodule--helper.c:944 builtin/submodule--helper.c:947
+msgid "path"
+msgstr "путь"
+
+#: apply.c:4920
+msgid "don't apply changes matching the given path"
+msgstr "не применять изменения по указанному пути"
+
+#: apply.c:4923
+msgid "apply changes matching the given path"
+msgstr "применять изменения по указанному пути"
+
+#: apply.c:4925 builtin/am.c:2286
+msgid "num"
+msgstr "количество"
+
+#: apply.c:4926
+msgid "remove <num> leading slashes from traditional diff paths"
+msgstr "удалить <количество> ведущих косых черт из традиционных путей списка изменений"
+
+#: apply.c:4929
+msgid "ignore additions made by the patch"
+msgstr "игнорировать добавления, сделанные этим патчем"
+
+#: apply.c:4931
+msgid "instead of applying the patch, output diffstat for the input"
+msgstr "вместо применения патча вывести статистику добавлений и удалений для ввода"
+
+#: apply.c:4935
+msgid "show number of added and deleted lines in decimal notation"
+msgstr "показать количество добавленных и удаленных строк в десятичном представлении"
+
+#: apply.c:4937
+msgid "instead of applying the patch, output a summary for the input"
+msgstr "вместо применения патча вывести статистику изменений для ввода"
+
+#: apply.c:4939
+msgid "instead of applying the patch, see if the patch is applicable"
+msgstr "вместо применения патча проверить подходит ли он"
+
+#: apply.c:4941
+msgid "make sure the patch is applicable to the current index"
+msgstr "проверить, что патч применяется к текущему индексу"
+
+#: apply.c:4943
+msgid "apply a patch without touching the working tree"
+msgstr "применить патч, не изменяя рабочий каталог"
+
+#: apply.c:4945
+msgid "accept a patch that touches outside the working area"
+msgstr "принять патч, который затрагивает файлы за рабочим каталогом"
+
+#: apply.c:4947
+msgid "also apply the patch (use with --stat/--summary/--check)"
+msgstr "а также применить патч (используйте с --stat/--summary/--check)"
+
+#: apply.c:4949
+msgid "attempt three-way merge if a patch does not apply"
+msgstr "попытаться сделать трехходовое слияние, если патч не применяется"
+
+#: apply.c:4951
+msgid "build a temporary index based on embedded index information"
+msgstr "построить временный индекс, основанный на встроенной информации об индексе"
+
+#: apply.c:4954 builtin/checkout-index.c:169 builtin/ls-files.c:505
+msgid "paths are separated with NUL character"
+msgstr "пути, отделённые НУЛЕВЫМ символом"
+
+#: apply.c:4956
+msgid "ensure at least <n> lines of context match"
+msgstr "удостовериться, что по крайней мере <n> строк контекста совпадают"
+
+#: apply.c:4957 builtin/am.c:2265
+msgid "action"
+msgstr "действие"
+
+#: apply.c:4958
+msgid "detect new or modified lines that have whitespace errors"
+msgstr "определять новые или модифицированные строки, у которых есть ошибки в пробельных символах"
+
+#: apply.c:4961 apply.c:4964
+msgid "ignore changes in whitespace when finding context"
+msgstr "игнорировать изменения в пробельных символах при поиске контекста"
+
+#: apply.c:4967
+msgid "apply the patch in reverse"
+msgstr "применить патч с обращением изменений"
+
+#: apply.c:4969
+msgid "don't expect at least one line of context"
+msgstr "не ожидать как минимум одной строки контекста"
+
+#: apply.c:4971
+msgid "leave the rejected hunks in corresponding *.rej files"
+msgstr "оставить отклоненные блоки изменений в соответствующих *.rej файлах"
+
+#: apply.c:4973
+msgid "allow overlapping hunks"
+msgstr "разрешить перекрывающиеся блоки изменений"
+
+#: apply.c:4974 builtin/add.c:267 builtin/check-ignore.c:19
+#: builtin/commit.c:1339 builtin/count-objects.c:94 builtin/fsck.c:593
+#: builtin/log.c:1860 builtin/mv.c:110 builtin/read-tree.c:114
+msgid "be verbose"
+msgstr "быть многословнее"
+
+#: apply.c:4976
+msgid "tolerate incorrectly detected missing new-line at the end of file"
+msgstr "разрешить некорректно определенные пропущенные пустые строки в конце файла"
+
+#: apply.c:4979
+msgid "do not trust the line counts in the hunk headers"
+msgstr "не доверять количеству строк из заголовка блока изменений"
+
+#: apply.c:4981 builtin/am.c:2274
+msgid "root"
+msgstr "корень"
+
+#: apply.c:4982
+msgid "prepend <root> to all filenames"
+msgstr "добавить <корень> спереди ко всем именам файлов"
+
+#: archive.c:12
+msgid "git archive [<options>] <tree-ish> [<path>...]"
+msgstr "git archive [<опции>] <указатель-дерева> [<путь>…]"
+
+#: archive.c:13
+msgid "git archive --list"
+msgstr "git archive --list"
+
+#: archive.c:14
+msgid ""
+"git archive --remote <repo> [--exec <cmd>] [<options>] <tree-ish> "
+"[<path>...]"
+msgstr "git archive --remote <репозиторий> [--exec <команда>] [<опции>] <указатель-дерева> [<путь>…]"
+
+#: archive.c:15
+msgid "git archive --remote <repo> [--exec <cmd>] --list"
+msgstr "git archive --remote <репозиторий> [--exec <команда>] --list"
+
+#: archive.c:344 builtin/add.c:152 builtin/add.c:442 builtin/rm.c:327
 #, c-format
-msgid "bad config line %d in command line %s"
-msgstr "ошибка в %d строке коммандной строки %s"
+msgid "pathspec '%s' did not match any files"
+msgstr "спецификация пути «%s» не соответствует ни одному файлу"
 
-#: config.c:536
+#: archive.c:429
+msgid "fmt"
+msgstr "формат"
+
+#: archive.c:429
+msgid "archive format"
+msgstr "формат архива"
+
+#: archive.c:430 builtin/log.c:1429
+msgid "prefix"
+msgstr "префикс"
+
+#: archive.c:431
+msgid "prepend prefix to each pathname in the archive"
+msgstr "добавлять префикс перед каждым путем файла в архиве"
+
+#: archive.c:432 builtin/blame.c:2603 builtin/blame.c:2604 builtin/config.c:59
+#: builtin/fast-export.c:987 builtin/fast-export.c:989 builtin/grep.c:723
+#: builtin/hash-object.c:101 builtin/ls-files.c:539 builtin/ls-files.c:542
+#: builtin/notes.c:401 builtin/notes.c:564 builtin/read-tree.c:109
+#: parse-options.h:153
+msgid "file"
+msgstr "файл"
+
+#: archive.c:433 builtin/archive.c:89
+msgid "write the archive to this file"
+msgstr "запись архива в этот файл"
+
+#: archive.c:435
+msgid "read .gitattributes in working directory"
+msgstr "читать .gitattributes в рабочем каталоге"
+
+#: archive.c:436
+msgid "report archived files on stderr"
+msgstr "отчет об архивированных файлах в stderr"
+
+#: archive.c:437
+msgid "store only"
+msgstr "только хранение"
+
+#: archive.c:438
+msgid "compress faster"
+msgstr "сжимать быстрее"
+
+#: archive.c:446
+msgid "compress better"
+msgstr "сжимать лучше"
+
+#: archive.c:449
+msgid "list supported archive formats"
+msgstr "перечислить поддерживаемые форматы архивов"
+
+#: archive.c:451 builtin/archive.c:90 builtin/clone.c:85 builtin/clone.c:88
+#: builtin/submodule--helper.c:601 builtin/submodule--helper.c:953
+msgid "repo"
+msgstr "репозиторий"
+
+#: archive.c:452 builtin/archive.c:91
+msgid "retrieve the archive from remote repository <repo>"
+msgstr "получить архив из внешнего <репозитория>"
+
+#: archive.c:453 builtin/archive.c:92 builtin/notes.c:485
+msgid "command"
+msgstr "команда"
+
+#: archive.c:454 builtin/archive.c:93
+msgid "path to the remote git-upload-archive command"
+msgstr "путь к команде git-upload-archive на машине с внешним репозиторием"
+
+#: archive.c:461
+msgid "Unexpected option --remote"
+msgstr "Неожиданная опция --remote"
+
+#: archive.c:463
+msgid "Option --exec can only be used together with --remote"
+msgstr "Опция --exec может использоваться только вместе с --remote"
+
+#: archive.c:465
+msgid "Unexpected option --output"
+msgstr "Неожиданная опция --output"
+
+#: archive.c:487
 #, c-format
-msgid "bad config line %d in %s"
-msgstr "оÑ\88ибка Ð² %d Ñ\81Ñ\82Ñ\80оке Ð² %s"
+msgid "Unknown archive format '%s'"
+msgstr "Ð\9dеизвеÑ\81Ñ\82нÑ\8bй Ñ\84оÑ\80маÑ\82 Ð°Ñ\80Ñ\85ива Â«%s»"
 
-#: config.c:655
-msgid "out of range"
-msgstr "вне диапазона"
+#: archive.c:494
+#, c-format
+msgid "Argument not supported for format '%s': -%d"
+msgstr "Аргумент не поддерживается для формата «%s»: -%d"
 
-#: config.c:655
-msgid "invalid unit"
-msgstr "неправильное число"
+#: attr.c:263
+msgid ""
+"Negative patterns are ignored in git attributes\n"
+"Use '\\!' for literal leading exclamation."
+msgstr "Отрицающие шаблоны в атрибутах git игнорируются.\nИспользуйте «\\!» для буквального использования символа в значении «восклицательный знак»."
 
-#: config.c:661
+#: bisect.c:441
 #, c-format
-msgid "bad numeric config value '%s' for '%s': %s"
-msgstr "непÑ\80авилÑ\8cное Ñ\87иÑ\81ловое Ð·Ð½Ð°Ñ\87ение Â«%s» Ð´Ð»Ñ\8f Â«%s»: %s"
+msgid "Could not open file '%s'"
+msgstr "Ð\9dе Ñ\83далоÑ\81Ñ\8c Ð¾Ñ\82кÑ\80Ñ\8bÑ\82Ñ\8c Ñ\84айл Â«%s»"
 
-#: config.c:666
+#: bisect.c:446
 #, c-format
-msgid "bad numeric config value '%s' for '%s' in blob %s: %s"
-msgstr "непÑ\80авилÑ\8cное Ñ\87иÑ\81ловое Ð·Ð½Ð°Ñ\87ение Â«%s» Ð´Ð»Ñ\8f Â«%s» Ð² Ð´Ð²Ð¾Ð¸Ñ\87ном Ð¾Ð±Ñ\8aекÑ\82е %s: %s"
+msgid "Badly quoted content in file '%s': %s"
+msgstr "Ð\9fлоÑ\85ое Ñ\81одеÑ\80жимое Ñ\84айла Â«%s»: %s"
 
-#: config.c:669
+#: bisect.c:655
 #, c-format
-msgid "bad numeric config value '%s' for '%s' in file %s: %s"
-msgstr "непÑ\80авилÑ\8cное Ñ\87иÑ\81ловое Ð·Ð½Ð°Ñ\87ение Â«%s» Ð´Ð»Ñ\8f Â«%s» Ð² Ñ\84айле %s: %s"
+msgid "We cannot bisect more!\n"
+msgstr "Ð\9dевозможно Ð¿Ñ\80одолжиÑ\82Ñ\8c Ð±Ð¸Ð½Ð°Ñ\80нÑ\8bй Ð¿Ð¾Ð¸Ñ\81к!\n"
 
-#: config.c:672
+#: bisect.c:708
 #, c-format
-msgid "bad numeric config value '%s' for '%s' in standard input: %s"
-msgstr "непÑ\80авилÑ\8cное Ñ\87иÑ\81ловое Ð·Ð½Ð°Ñ\87ение Â«%s» Ð´Ð»Ñ\8f Â«%s» Ð½Ð° Ñ\81Ñ\82андаÑ\80Ñ\82ном Ð²Ð²Ð¾Ð´Ðµ: %s"
+msgid "Not a valid commit name %s"
+msgstr "Ð\9dедопÑ\83Ñ\81Ñ\82имое Ð¸Ð¼Ñ\8f ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82а %s"
 
-#: config.c:675
+#: bisect.c:732
 #, c-format
-msgid "bad numeric config value '%s' for '%s' in submodule-blob %s: %s"
-msgstr "неправильное числовое значение «%s» для «%s» в двоичном объекте подмодуля %s: %s"
+msgid ""
+"The merge base %s is bad.\n"
+"This means the bug has been fixed between %s and [%s].\n"
+msgstr "База слияния %s является плохим коммитом.\nЭто значит, что ошибка была исправлена где-то между %s и [%s].\n"
 
-#: config.c:678
+#: bisect.c:737
 #, c-format
-msgid "bad numeric config value '%s' for '%s' in command line %s: %s"
-msgstr "неправильное числовое значение «%s» для «%s» на коммандной строке %s: %s"
+msgid ""
+"The merge base %s is new.\n"
+"The property has changed between %s and [%s].\n"
+msgstr "База слияния %s является новой.\nСвойство было изменено где-то между %s и [%s].\n"
 
-#: config.c:681
+#: bisect.c:742
 #, c-format
-msgid "bad numeric config value '%s' for '%s' in %s: %s"
-msgstr "неправильное числовое значение «%s» для «%s» в %s: %s"
+msgid ""
+"The merge base %s is %s.\n"
+"This means the first '%s' commit is between %s and [%s].\n"
+msgstr "База слияния %s является %s.\nЭто значит, что «%s» коммит находится где-то между %s и [%s].\n"
 
-#: config.c:768
+#: bisect.c:750
 #, c-format
-msgid "failed to expand user dir in: '%s'"
-msgstr "сбой разворачивания пути каталога пользователя: «%s»"
+msgid ""
+"Some %s revs are not ancestor of the %s rev.\n"
+"git bisect cannot work properly in this case.\n"
+"Maybe you mistook %s and %s revs?\n"
+msgstr "Несколько %s коммитов не являются предками %s коммита.\nВ этом случае git bisect не может работать правильно.\nВозможно, вы перепутали редакции %s и %s местами?\n"
 
-#: config.c:849 config.c:860
+#: bisect.c:763
 #, c-format
-msgid "bad zlib compression level %d"
-msgstr "неправильный уровень сжатия zlib %d"
+msgid ""
+"the merge base between %s and [%s] must be skipped.\n"
+"So we cannot be sure the first %s commit is between %s and %s.\n"
+"We continue anyway."
+msgstr "База слияния между %s и [%s] должно быть пропущена.\nПоэтому мы не можем быть уверены, что первый %s коммит находится между %s и %s.\nНо все же продолжаем поиск."
 
-#: config.c:978
+#: bisect.c:798
 #, c-format
-msgid "invalid mode for object creation: %s"
-msgstr "недопÑ\83Ñ\81Ñ\82имÑ\8bй Ñ\80ежим Ñ\81озданиÑ\8f Ð¾Ð±Ñ\8aекÑ\82а: %s"
+msgid "Bisecting: a merge base must be tested\n"
+msgstr "Ð\91инаÑ\80нÑ\8bй Ð¿Ð¾Ð¸Ñ\81к: Ð±Ð°Ð·Ð° Ñ\81лиÑ\8fниÑ\8f Ð´Ð¾Ð»Ð¶Ð½Ð° Ð±Ñ\8bÑ\82Ñ\8c Ð¿Ñ\80овеÑ\80ена\n"
 
-#: config.c:1312
-msgid "unable to parse command-line config"
-msgstr "не удалось разобрать конфигурацию из командной строки"
+#: bisect.c:849
+#, c-format
+msgid "a %s revision is needed"
+msgstr "нужно указать %s редакцию"
 
-#: config.c:1362
-msgid "unknown error occurred while reading the configuration files"
-msgstr "произошла неизвестная ошибка при чтении файлов конфигурации"
+#: bisect.c:866 builtin/notes.c:174 builtin/tag.c:248
+#, c-format
+msgid "could not create file '%s'"
+msgstr "не удалось создать файл «%s»"
 
-#: config.c:1716
+#: bisect.c:917
 #, c-format
-msgid "unable to parse '%s' from command-line config"
-msgstr "не удалось разобрать «%s» в конфигурации из командной строки"
+msgid "could not read file '%s'"
+msgstr "не удалось прочитать файл «%s»"
 
-#: config.c:1718
+#: bisect.c:947
+msgid "reading bisect refs failed"
+msgstr "сбой при чтении ссылок двоичного поиска"
+
+#: bisect.c:967
 #, c-format
-msgid "bad config variable '%s' in file '%s' at line %d"
-msgstr "неправильная переменная конфигурации «%s» в файле «%s» на строке %d"
+msgid "%s was both %s and %s\n"
+msgstr "%s была одновременно и %s и %s\n"
 
-#: config.c:1777
+#: bisect.c:975
 #, c-format
-msgid "%s has multiple values"
-msgstr "%s имеет несколько значений"
+msgid ""
+"No testable commit found.\n"
+"Maybe you started with bad path parameters?\n"
+msgstr "Тестируемый коммит не найден.\nВозможно, вы начали поиск с указанием неправильного параметра пути?\n"
 
-#: config.c:2311
+#: bisect.c:994
 #, c-format
-msgid "could not set '%s' to '%s'"
-msgstr "не удалось установить «%s» в «%s»"
+msgid "(roughly %d step)"
+msgid_plural "(roughly %d steps)"
+msgstr[0] "(примерно %d шаг)"
+msgstr[1] "(примерно %d шага)"
+msgstr[2] "(примерно %d шагов)"
+msgstr[3] "(примерно %d шагов)"
 
-#: config.c:2313
+#. TRANSLATORS: the last %s will be replaced with
+#. "(roughly %d steps)" translation
+#: bisect.c:998
 #, c-format
-msgid "could not unset '%s'"
-msgstr "не удалось сбросить значение для «%s»"
+msgid "Bisecting: %d revision left to test after this %s\n"
+msgid_plural "Bisecting: %d revisions left to test after this %s\n"
+msgstr[0] "Бинарный поиск: %d редакцию осталось проверить после этой %s\n"
+msgstr[1] "Бинарный поиск: %d редакции осталось проверить после этой %s\n"
+msgstr[2] "Бинарный поиск: %d редакций осталось проверить после этой %s\n"
+msgstr[3] "Бинарный поиск: %d редакций осталось проверить после этой %s\n"
 
-#: connected.c:63 builtin/fsck.c:173 builtin/prune.c:140
-msgid "Checking connectivity"
-msgstr "Проверка соединения"
+#: branch.c:53
+#, c-format
+msgid ""
+"\n"
+"After fixing the error cause you may try to fix up\n"
+"the remote tracking information by invoking\n"
+"\"git branch --set-upstream-to=%s%s%s\"."
+msgstr "\nПосле исправления причины ошибки,\nвы можете исправить информацию об отслеживаемой\nвнешней ветке, с помощью команды\n«git branch --set-upstream-to=%s%s%s»."
 
-#: connected.c:74
-msgid "Could not run 'git rev-list'"
-msgstr "Не удалось запустить «git rev-list»"
+#: branch.c:67
+#, c-format
+msgid "Not setting branch %s as its own upstream."
+msgstr "Не устанавливаю ветку %s, так так она принадлежит вышестоящему репозиторию."
 
-#: connected.c:94
-msgid "failed write to rev-list"
-msgstr "сбой записи в rev-list"
+#: branch.c:93
+#, c-format
+msgid "Branch %s set up to track remote branch %s from %s by rebasing."
+msgstr "Ветка %s отслеживает внешнюю ветку %s из %s перемещением."
 
-#: connected.c:101
-msgid "failed to close rev-list's stdin"
-msgstr "сбой закрытия стандартного ввода у rev-list"
+#: branch.c:94
+#, c-format
+msgid "Branch %s set up to track remote branch %s from %s."
+msgstr "Ветка %s отслеживает внешнюю ветку %s из %s."
 
-#: date.c:97
-msgid "in the future"
-msgstr "в будущем"
+#: branch.c:98
+#, c-format
+msgid "Branch %s set up to track local branch %s by rebasing."
+msgstr "Ветка %s отслеживает локальную ветку %s перемещением."
 
-#: date.c:103
+#: branch.c:99
 #, c-format
-msgid "%lu second ago"
-msgid_plural "%lu seconds ago"
-msgstr[0] "%lu секунду назад"
-msgstr[1] "%lu секунды назад"
-msgstr[2] "%lu секунд назад"
-msgstr[3] "%lu секунд назад"
+msgid "Branch %s set up to track local branch %s."
+msgstr "Ветка %s отслеживает локальную ветку %s."
 
-#: date.c:110
+#: branch.c:104
 #, c-format
-msgid "%lu minute ago"
-msgid_plural "%lu minutes ago"
-msgstr[0] "%lu минуту назад"
-msgstr[1] "%lu минуты назад"
-msgstr[2] "%lu минут назад"
-msgstr[3] "%lu минут назад"
+msgid "Branch %s set up to track remote ref %s by rebasing."
+msgstr "Ветка %s отслеживает внешнюю ссылку %s перемещением."
 
-#: date.c:117
+#: branch.c:105
 #, c-format
-msgid "%lu hour ago"
-msgid_plural "%lu hours ago"
-msgstr[0] "%lu час назад"
-msgstr[1] "%lu часа назад"
-msgstr[2] "%lu часов назад"
-msgstr[3] "%lu часов назад"
+msgid "Branch %s set up to track remote ref %s."
+msgstr "Ветка %s отслеживает внешнюю ссылку %s."
 
-#: date.c:124
+#: branch.c:109
 #, c-format
-msgid "%lu day ago"
-msgid_plural "%lu days ago"
-msgstr[0] "%lu день назад"
-msgstr[1] "%lu дня назад"
-msgstr[2] "%lu дней назад"
-msgstr[3] "%lu дней назад"
+msgid "Branch %s set up to track local ref %s by rebasing."
+msgstr "Ветка %s отслеживает локальную ссылку %s перемещением."
 
-#: date.c:130
+#: branch.c:110
 #, c-format
-msgid "%lu week ago"
-msgid_plural "%lu weeks ago"
-msgstr[0] "%lu неделю назад"
-msgstr[1] "%lu недели назад"
-msgstr[2] "%lu недель назад"
-msgstr[3] "%lu недель назад"
+msgid "Branch %s set up to track local ref %s."
+msgstr "Ветка %s отслеживает локальную ссылку %s."
 
-#: date.c:137
+#: branch.c:119
+msgid "Unable to write upstream branch configuration"
+msgstr "Не удалось записать настройки вышестоящей ветки"
+
+#: branch.c:156
 #, c-format
-msgid "%lu month ago"
-msgid_plural "%lu months ago"
-msgstr[0] "%lu месяц назад"
-msgstr[1] "%lu месяца назад"
-msgstr[2] "%lu месяцев назад"
-msgstr[3] "%lu месяцев назад"
+msgid "Not tracking: ambiguous information for ref %s"
+msgstr "Не отслеживается: неоднозначная информация для ссылки %s"
 
-#: date.c:148
+#: branch.c:185
 #, c-format
-msgid "%lu year"
-msgid_plural "%lu years"
-msgstr[0] "%lu год"
-msgstr[1] "%lu года"
-msgstr[2] "%lu лет"
-msgstr[3] "%lu лет"
+msgid "'%s' is not a valid branch name."
+msgstr "«%s» не является действительным именем ветки."
 
-#. TRANSLATORS: "%s" is "<n> years"
-#: date.c:151
+#: branch.c:190
 #, c-format
-msgid "%s, %lu month ago"
-msgid_plural "%s, %lu months ago"
-msgstr[0] "%s и %lu месяц назад"
-msgstr[1] "%s и %lu месяца назад"
-msgstr[2] "%s и %lu месяцев назад"
-msgstr[3] "%s и %lu месяцев назад"
+msgid "A branch named '%s' already exists."
+msgstr "Ветка с именем «%s» уже существует."
 
-#: date.c:156 date.c:161
+#: branch.c:198
+msgid "Cannot force update the current branch."
+msgstr "Не удалось принудительно обновить текущую ветку."
+
+#: branch.c:218
 #, c-format
-msgid "%lu year ago"
-msgid_plural "%lu years ago"
-msgstr[0] "%lu год назад"
-msgstr[1] "%lu года назад"
-msgstr[2] "%lu лет назад"
-msgstr[3] "%lu лет назад"
+msgid ""
+"Cannot setup tracking information; starting point '%s' is not a branch."
+msgstr "Не удалось настроить информацию отслеживания; стартовая точка «%s» не является веткой."
 
-#: diffcore-order.c:24
+#: branch.c:220
 #, c-format
-msgid "failed to read orderfile '%s'"
-msgstr "сбой чтения orderfile «%s»"
+msgid "the requested upstream branch '%s' does not exist"
+msgstr "запрошенная ветка вышестоящего репозитория «%s» не существует"
 
-#: diffcore-rename.c:540
-msgid "Performing inexact rename detection"
-msgstr "Выполняется неточное определение переименования"
+#: branch.c:222
+msgid ""
+"\n"
+"If you are planning on basing your work on an upstream\n"
+"branch that already exists at the remote, you may need to\n"
+"run \"git fetch\" to retrieve it.\n"
+"\n"
+"If you are planning to push out a new local branch that\n"
+"will track its remote counterpart, you may want to use\n"
+"\"git push -u\" to set the upstream config as you push."
+msgstr "\nЕсли вы планируете основывать свою работу на вышестоящей ветке, которая уже существует во внешнем репозитории, вам может потребоваться запустить «git fetch» для ее получения.\n\nЕсли вы планируете отправить новую локальную ветку, которая будет отслеживаться, во внешний репозиторий, вам может потребоваться запустить «git push -u» — чтобы сохранить настройку вышестоящего репозитория для отправки."
 
-#: diff.c:116
+#: branch.c:265
 #, c-format
-msgid "  Failed to parse dirstat cut-off percentage '%s'\n"
-msgstr "  Сбой разбора величины среза (cut-off) у dirstat «%s»\n"
+msgid "Not a valid object name: '%s'."
+msgstr "Недопустимое имя объекта: «%s»."
 
-#: diff.c:121
+#: branch.c:285
 #, c-format
-msgid "  Unknown dirstat parameter '%s'\n"
-msgstr "Ð\9dеизвеÑ\81Ñ\82нÑ\8bй Ð¿Ð°Ñ\80амеÑ\82Ñ\80 dirstat: Â«%s»\n"
+msgid "Ambiguous object name: '%s'."
+msgstr "Ð\9dеоднознаÑ\87ное Ð¸Ð¼Ñ\8f Ð¾Ð±Ñ\8aекÑ\82а: Â«%s»."
 
-#: diff.c:225
+#: branch.c:290
 #, c-format
-msgid "Unknown value for 'diff.submodule' config variable: '%s'"
-msgstr "Ð\9dеизвеÑ\81Ñ\82ное Ð·Ð½Ð°Ñ\87ениÑ\8f Ð´Ð»Ñ\8f Ð¿ÐµÑ\80еменной Â«diff.submodule»: Â«%s»"
+msgid "Not a valid branch point: '%s'."
+msgstr "Ð\9dедопÑ\83Ñ\81Ñ\82имаÑ\8f Ñ\82оÑ\87ка Ð²ÐµÑ\82ки: Â«%s»."
 
-#: diff.c:277
+#: branch.c:344
 #, c-format
-msgid ""
-"Found errors in 'diff.dirstat' config variable:\n"
-"%s"
-msgstr "Найдены ошибки в переменной «diff.dirstat»:\n%s"
+msgid "'%s' is already checked out at '%s'"
+msgstr "«%s» уже находится на «%s»"
 
-#: diff.c:3017
+#: branch.c:363
 #, c-format
-msgid "external diff died, stopping at %s"
-msgstr "критическая ошибка при внешнем сравнении, останов на %s"
+msgid "HEAD of working tree %s is not updated"
+msgstr "HEAD рабочего каталога %s не обновлён"
 
-#: diff.c:3415
-msgid "--follow requires exactly one pathspec"
-msgstr "--follow требует ровно одной спецификации пути"
+#: bundle.c:34
+#, c-format
+msgid "'%s' does not look like a v2 bundle file"
+msgstr "«%s» не похож на файл пакета версии 2"
 
-#: diff.c:3578
+#: bundle.c:61
 #, c-format
-msgid ""
-"Failed to parse --dirstat/-X option parameter:\n"
-"%s"
-msgstr "Сбой разбора параметра опции --dirstat/-X :\n%s"
+msgid "unrecognized header: %s%s (%d)"
+msgstr "неопознанный заголовок: %s%s (%d)"
 
-#: diff.c:3592
+#: bundle.c:87 sequencer.c:963 builtin/commit.c:777
 #, c-format
-msgid "Failed to parse --submodule option parameter: '%s'"
-msgstr "Сбой Ñ\80азбоÑ\80а Ð¿Ð°Ñ\80амеÑ\82Ñ\80а Ð¾Ð¿Ñ\86ии --submodule: «%s»"
+msgid "could not open '%s'"
+msgstr "не Ñ\83далоÑ\81Ñ\8c Ð¾Ñ\82кÑ\80Ñ\8bÑ\82Ñ\8c «%s»"
 
-#: dir.c:1823
-msgid "failed to get kernel name and information"
-msgstr "не Ñ\83далоÑ\81Ñ\8c Ð¿Ð¾Ð»Ñ\83Ñ\87иÑ\82Ñ\8c Ð¸Ð¼Ñ\8f Ñ\8fдÑ\80а Ð¸ Ð¸Ð½Ñ\84оÑ\80маÑ\86иÑ\8e"
+#: bundle.c:139
+msgid "Repository lacks these prerequisite commits:"
+msgstr "Ð\92 Ñ\80епозиÑ\82оÑ\80ии Ð¾Ñ\82Ñ\81Ñ\83Ñ\82Ñ\81Ñ\82вÑ\83Ñ\8eÑ\82 Ð½ÐµÐ¾Ð±Ñ\85одимÑ\8bе ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82Ñ\8b:"
 
-#: dir.c:1942
-msgid "Untracked cache is disabled on this system or location."
-msgstr "Кэш неотслеживаемых файлов отключен на этой системе или в этом месте."
+#: bundle.c:163 ref-filter.c:1462 sequencer.c:830 sequencer.c:1374
+#: builtin/blame.c:2814 builtin/commit.c:1061 builtin/log.c:348
+#: builtin/log.c:890 builtin/log.c:1340 builtin/log.c:1666 builtin/log.c:1909
+#: builtin/merge.c:356 builtin/shortlog.c:170
+msgid "revision walk setup failed"
+msgstr "сбой инициализации прохода по редакциям"
 
-#: gpg-interface.c:178
-msgid "gpg failed to sign the data"
-msgstr "gpg не удалось подписать данные"
+#: bundle.c:185
+#, c-format
+msgid "The bundle contains this ref:"
+msgid_plural "The bundle contains these %d refs:"
+msgstr[0] "Пакет содержит эту %d ссылку:"
+msgstr[1] "Пакет содержит эти %d ссылки:"
+msgstr[2] "Пакет содержит эти %d ссылок:"
+msgstr[3] "Пакет содержит эти %d ссылок:"
 
-#: gpg-interface.c:208
-msgid "could not create temporary file"
-msgstr "не Ñ\83далоÑ\81Ñ\8c Ñ\81оздаÑ\82Ñ\8c Ð²Ñ\80еменнÑ\8bй Ñ\84айл"
+#: bundle.c:192
+msgid "The bundle records a complete history."
+msgstr "Ð\9fакеÑ\82 Ñ\81одеÑ\80жиÑ\82 Ð¿Ð¾Ð»Ð½Ñ\83Ñ\8e Ð¸Ñ\81Ñ\82оÑ\80иÑ\8e."
 
-#: gpg-interface.c:210
+#: bundle.c:194
 #, c-format
-msgid "failed writing detached signature to '%s'"
-msgstr "сбой записи отсоединенной подписи в «%s»"
+msgid "The bundle requires this ref:"
+msgid_plural "The bundle requires these %d refs:"
+msgstr[0] "Пакет требует эту %d ссылку:"
+msgstr[1] "Пакет требует эти %d ссылки:"
+msgstr[2] "Пакет требует эти %d ссылок:"
+msgstr[3] "Пакет требует эти %d ссылок:"
 
-#: grep.c:1792
-#, c-format
-msgid "'%s': unable to read %s"
-msgstr "«%s»: не удалось прочесть %s"
+#: bundle.c:253
+msgid "Could not spawn pack-objects"
+msgstr "Не удалось создать объекты пакета"
 
-#: grep.c:1809 builtin/clone.c:382 builtin/diff.c:84 builtin/rm.c:155
-#, c-format
-msgid "failed to stat '%s'"
-msgstr "не удалось выполнить stat «%s»"
+#: bundle.c:264
+msgid "pack-objects died"
+msgstr "критическая ошибка pack-objects"
 
-#: grep.c:1820
-#, c-format
-msgid "'%s': short read"
-msgstr "«%s»: слишком мало данных прочитано"
+#: bundle.c:304
+msgid "rev-list died"
+msgstr "критическая ошибка rev-list"
 
-#: help.c:205
+#: bundle.c:353
 #, c-format
-msgid "available git commands in '%s'"
-msgstr "доступные команды git в «%s»"
+msgid "ref '%s' is excluded by the rev-list options"
+msgstr "ссылка «%s» исключена в соответствии с опциями rev-list"
 
-#: help.c:212
-msgid "git commands available from elsewhere on your $PATH"
-msgstr "команды git, доступные в других местах вашего $PATH"
+#: bundle.c:443 builtin/log.c:165 builtin/log.c:1572 builtin/shortlog.c:273
+#, c-format
+msgid "unrecognized argument: %s"
+msgstr "неопознанный аргумент: %s"
 
-#: help.c:244
-msgid "These are common Git commands used in various situations:"
-msgstr "СÑ\82андаÑ\80Ñ\82нÑ\8bе ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ\8b Git Ð¸Ñ\81полÑ\8cзÑ\83емÑ\8bе Ð² Ñ\80азлиÑ\87нÑ\8bÑ\85 Ñ\81иÑ\82Ñ\83аÑ\86иÑ\8fÑ\85:"
+#: bundle.c:451
+msgid "Refusing to create empty bundle."
+msgstr "Ð\9eÑ\82клонение Ñ\81озданиÑ\8f Ð¿Ñ\83Ñ\81Ñ\82ого Ð¿Ð°ÐºÐµÑ\82а."
 
-#: help.c:309
+#: bundle.c:463
 #, c-format
-msgid ""
-"'%s' appears to be a git command, but we were not\n"
-"able to execute it. Maybe git-%s is broken?"
-msgstr "«%s» похоже на команду git, но нам не удалось ее запустить. Возможно, git-%s  не работает?"
+msgid "cannot create '%s'"
+msgstr "не удалось создать «%s»"
 
-#: help.c:366
-msgid "Uh oh. Your system reports no Git commands at all."
-msgstr "Ð\9eй-Ñ\91й! Ð\92аÑ\88а Ñ\81иÑ\81Ñ\82ема Ð½Ðµ Ñ\81ообÑ\89аеÑ\82 Ð½Ð¸ Ð¾ ÐºÐ°ÐºÐ¸Ñ\85 ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°Ñ\85 Git Ð²Ð¾Ð¾Ð±Ñ\89е."
+#: bundle.c:491
+msgid "index-pack died"
+msgstr "кÑ\80иÑ\82иÑ\87еÑ\81каÑ\8f Ð¾Ñ\88ибка index-pack"
 
-#: help.c:388
+#: color.c:290
 #, c-format
-msgid ""
-"WARNING: You called a Git command named '%s', which does not exist.\n"
-"Continuing under the assumption that you meant '%s'"
-msgstr "ВНИМАНИЕ: Вы вызвали команду Git «%s», но такой не существует.\nПродолжаем с предположением, что вы имели в виду «%s»"
+msgid "invalid color value: %.*s"
+msgstr "недопустимое значение цвета: %.*s"
 
-#: help.c:393
+#: commit.c:40 builtin/am.c:421 builtin/am.c:457 builtin/am.c:1493
+#: builtin/am.c:2127
 #, c-format
-msgid "in %0.1f seconds automatically..."
-msgstr "через %0.1f секунд автоматически…"
+msgid "could not parse %s"
+msgstr "не удалось разобрать %s"
 
-#: help.c:400
+#: commit.c:42
 #, c-format
-msgid "git: '%s' is not a git command. See 'git --help'."
-msgstr "git: «%s» не является командой git. Смотрите «git --help»."
+msgid "%s %s is not a commit!"
+msgstr "%s %s не является коммитом!"
 
-#: help.c:404 help.c:470
+#: commit.c:1514
 msgid ""
-"\n"
-"Did you mean this?"
-msgid_plural ""
-"\n"
-"Did you mean one of these?"
-msgstr[0] "\nВозможно, вы имели в виду это?"
-msgstr[1] "\nВозможно, вы имели в виду что-то из этого?"
-msgstr[2] "\nВозможно, вы имели в виду что-то из этого?"
-msgstr[3] "\nВозможно, вы имели в виду что-то из этого?"
+"Warning: commit message did not conform to UTF-8.\n"
+"You may want to amend it after fixing the message, or set the config\n"
+"variable i18n.commitencoding to the encoding your project uses.\n"
+msgstr "Предупреждение: сообщение коммита не соответствует UTF-8.\nВозможно, вы захотите исправить его после исправления сообщения\nили настроить опцию i18n.commitencoding и указать кодировку\nсообщений, которую использует ваш проект.\n"
 
-#: help.c:466
-#, c-format
-msgid "%s: %s - %s"
-msgstr "%s: %s — %s"
+#: compat/obstack.c:406 compat/obstack.c:408
+msgid "memory exhausted"
+msgstr "память исчерпана"
 
-#: lockfile.c:152
+#: config.c:516
 #, c-format
-msgid ""
-"Unable to create '%s.lock': %s.\n"
-"\n"
-"Another git process seems to be running in this repository, e.g.\n"
-"an editor opened by 'git commit'. Please make sure all processes\n"
-"are terminated then try again. If it still fails, a git process\n"
-"may have crashed in this repository earlier:\n"
-"remove the file manually to continue."
-msgstr "Не удалось создать «%s.lock»: %s.\n\nПохоже, что другой процесс git запущен в этом репозитории,\nнапример редактор открыт из «git commit». Пожалуйста, убедитесь,\nчто все процессы были завершены и потом попробуйте снова.\nЕсли это не поможет, то возможно процесс git был ранее завершен\nс ошибкой в этом репозитории: \nудалите файл вручную для продолжения."
+msgid "bad config line %d in blob %s"
+msgstr "ошибка в %d строке двоичного объекта %s"
 
-#: lockfile.c:160
+#: config.c:520
 #, c-format
-msgid "Unable to create '%s.lock': %s"
-msgstr "Не удалось создать «%s.lock»: %s"
-
-#: merge.c:41
-msgid "failed to read the cache"
-msgstr "сбой чтения кэша"
-
-#: merge.c:94 builtin/am.c:1992 builtin/am.c:2027 builtin/checkout.c:375
-#: builtin/checkout.c:589 builtin/clone.c:732
-msgid "unable to write new index file"
-msgstr "не удалось записать новый файл индекса"
-
-#: merge-recursive.c:209
-msgid "(bad commit)\n"
-msgstr "(плохой коммит)\n"
+msgid "bad config line %d in file %s"
+msgstr "ошибка в %d строке файла %s"
 
-#: merge-recursive.c:231
+#: config.c:524
 #, c-format
-msgid "addinfo_cache failed for path '%s'"
-msgstr "сбой addinfo_cache для пути «%s»"
-
-#: merge-recursive.c:301
-msgid "error building trees"
-msgstr "ошибка при построении деревьев"
+msgid "bad config line %d in standard input"
+msgstr "ошибка в %d строке стандартного ввода"
 
-#: merge-recursive.c:720
+#: config.c:528
 #, c-format
-msgid "failed to create path '%s'%s"
-msgstr "не Ñ\83далоÑ\81Ñ\8c Ñ\81оздаÑ\82Ñ\8c Ð¿Ñ\83Ñ\82Ñ\8c Â«%s»%s"
+msgid "bad config line %d in submodule-blob %s"
+msgstr "оÑ\88ибка Ð² %d Ñ\81Ñ\82Ñ\80оке Ð´Ð²Ð¾Ð¸Ñ\87ного Ð¾Ð±Ñ\8aекÑ\82а Ð¿Ð¾Ð´Ð¼Ð¾Ð´Ñ\83лÑ\8f %s"
 
-#: merge-recursive.c:731
+#: config.c:532
 #, c-format
-msgid "Removing %s to make room for subdirectory\n"
-msgstr "Удаление %s, чтобы освободить место для подкаталогов\n"
-
-#: merge-recursive.c:745 merge-recursive.c:764
-msgid ": perhaps a D/F conflict?"
-msgstr ": возможно, конфликт каталогов/файлов?"
+msgid "bad config line %d in command line %s"
+msgstr "ошибка в %d строке коммандной строки %s"
 
-#: merge-recursive.c:754
+#: config.c:536
 #, c-format
-msgid "refusing to lose untracked file at '%s'"
-msgstr "оÑ\82каз Ð¿Ð¾Ñ\82еÑ\80и Ð½ÐµÐ¾Ñ\82Ñ\81леживаемого Ñ\84айла Ð² Â«%s»"
+msgid "bad config line %d in %s"
+msgstr "оÑ\88ибка Ð² %d Ñ\81Ñ\82Ñ\80оке Ð² %s"
 
-#: merge-recursive.c:796
-#, c-format
-msgid "cannot read object %s '%s'"
-msgstr "невозможно прочитать объект %s «%s»"
+#: config.c:655
+msgid "out of range"
+msgstr "вне диапазона"
 
-#: merge-recursive.c:798
-#, c-format
-msgid "blob expected for %s '%s'"
-msgstr "ожидается двоичный объект для %s «%s»"
+#: config.c:655
+msgid "invalid unit"
+msgstr "неправильное число"
 
-#: merge-recursive.c:822
+#: config.c:661
 #, c-format
-msgid "failed to open '%s': %s"
-msgstr "не удалось открыть «%s»: %s"
+msgid "bad numeric config value '%s' for '%s': %s"
+msgstr "неправильное числовое значение «%s» для «%s»: %s"
 
-#: merge-recursive.c:833
+#: config.c:666
 #, c-format
-msgid "failed to symlink '%s': %s"
-msgstr "не удалось создать символьную ссылку «%s»: %s"
+msgid "bad numeric config value '%s' for '%s' in blob %s: %s"
+msgstr "неправильное числовое значение «%s» для «%s» в двоичном объекте %s: %s"
 
-#: merge-recursive.c:838
+#: config.c:669
 #, c-format
-msgid "do not know what to do with %06o %s '%s'"
-msgstr "не понятно, что делать с %06o %s «%s»"
-
-#: merge-recursive.c:978
-msgid "Failed to execute internal merge"
-msgstr "Не удалось запустить внутреннее слияние"
+msgid "bad numeric config value '%s' for '%s' in file %s: %s"
+msgstr "неправильное числовое значение «%s» для «%s» в файле %s: %s"
 
-#: merge-recursive.c:982
+#: config.c:672
 #, c-format
-msgid "Unable to add %s to database"
-msgstr "Ð\9dе Ñ\83далоÑ\81Ñ\8c Ð´Ð¾Ð±Ð°Ð²Ð¸Ñ\82Ñ\8c %s Ð² Ð±Ð°Ð·Ñ\83 Ð´Ð°Ð½Ð½Ñ\8bÑ\85"
+msgid "bad numeric config value '%s' for '%s' in standard input: %s"
+msgstr "непÑ\80авилÑ\8cное Ñ\87иÑ\81ловое Ð·Ð½Ð°Ñ\87ение Â«%s» Ð´Ð»Ñ\8f Â«%s» Ð½Ð° Ñ\81Ñ\82андаÑ\80Ñ\82ном Ð²Ð²Ð¾Ð´Ðµ: %s"
 
-#: merge-recursive.c:1081 merge-recursive.c:1095
+#: config.c:675
 #, c-format
-msgid ""
-"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
-"in tree."
-msgstr "КОНФЛИКТ (%s/удаление): %s удалено в %s и %s в %s. Версия %s из %s оставлена в дереве."
+msgid "bad numeric config value '%s' for '%s' in submodule-blob %s: %s"
+msgstr "неправильное числовое значение «%s» для «%s» в двоичном объекте подмодуля %s: %s"
 
-#: merge-recursive.c:1087 merge-recursive.c:1100
+#: config.c:678
 #, c-format
-msgid ""
-"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
-"in tree at %s."
-msgstr "КОНФЛИКТ (%s/удаление): %s удалено в %s и %s в %s. Версия %s из %s оставлена в дереве на %s."
+msgid "bad numeric config value '%s' for '%s' in command line %s: %s"
+msgstr "неправильное числовое значение «%s» для «%s» на коммандной строке %s: %s"
 
-#: merge-recursive.c:1143
-msgid "rename"
-msgstr "переименование"
+#: config.c:681
+#, c-format
+msgid "bad numeric config value '%s' for '%s' in %s: %s"
+msgstr "неправильное числовое значение «%s» для «%s» в %s: %s"
 
-#: merge-recursive.c:1143
-msgid "renamed"
-msgstr "переименовано"
+#: config.c:768
+#, c-format
+msgid "failed to expand user dir in: '%s'"
+msgstr "сбой разворачивания пути каталога пользователя: «%s»"
 
-#: merge-recursive.c:1200
+#: config.c:852 config.c:863
 #, c-format
-msgid "%s is a directory in %s adding as %s instead"
-msgstr "%s — это каталог в %s, добавляем как %s вместо этого"
+msgid "bad zlib compression level %d"
+msgstr "неправильный уровень сжатия zlib %d"
 
-#: merge-recursive.c:1225
+#: config.c:978
 #, c-format
-msgid ""
-"CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename "
-"\"%s\"->\"%s\" in \"%s\"%s"
-msgstr "КОНФЛИКТ (переименование/переименование): Переименование «%s»→«%s» в ветке «%s» и переименование «%s»→«%s» в ветке «%s»%s"
+msgid "invalid mode for object creation: %s"
+msgstr "недопустимый режим создания объекта: %s"
 
-#: merge-recursive.c:1230
-msgid " (left unresolved)"
-msgstr " (оставлено неразрешенным)"
+#: config.c:1312
+msgid "unable to parse command-line config"
+msgstr "не удалось разобрать конфигурацию из командной строки"
 
-#: merge-recursive.c:1292
-#, c-format
-msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s"
-msgstr "КОНФЛИКТ (переименование/переименование): Переименование «%s»→«%s» в ветке «%s» и переименование «%s»→«%s» в ветке «%s»"
+#: config.c:1362
+msgid "unknown error occurred while reading the configuration files"
+msgstr "произошла неизвестная ошибка при чтении файлов конфигурации"
 
-#: merge-recursive.c:1325
+#: config.c:1716
 #, c-format
-msgid "Renaming %s to %s and %s to %s instead"
-msgstr "Ð\9fеÑ\80еименовÑ\8bваÑ\8e %s Ð² %s Ð¸ %s Ð² %s Ð²Ð¼ÐµÑ\81Ñ\82о Ñ\8dÑ\82ого"
+msgid "unable to parse '%s' from command-line config"
+msgstr "не Ñ\83далоÑ\81Ñ\8c Ñ\80азобÑ\80аÑ\82Ñ\8c Â«%s» Ð² ÐºÐ¾Ð½Ñ\84игÑ\83Ñ\80аÑ\86ии Ð¸Ð· ÐºÐ¾Ð¼Ð°Ð½Ð´Ð½Ð¾Ð¹ Ñ\81Ñ\82Ñ\80оки"
 
-#: merge-recursive.c:1531
+#: config.c:1718
 #, c-format
-msgid "CONFLICT (rename/add): Rename %s->%s in %s. %s added in %s"
-msgstr "Ð\9aÐ\9eÐ\9dФÐ\9bÐ\98Ð\9aТ (пеÑ\80еименование/добавление): Ð\9fеÑ\80еименование Â«%s»â\86\92«%s» Ð² Ð²ÐµÑ\82ке Â«%s» Ð¸ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ðµ Â«%s» Ð² Ð²ÐµÑ\82ке Â«%s»"
+msgid "bad config variable '%s' in file '%s' at line %d"
+msgstr "непÑ\80авилÑ\8cнаÑ\8f Ð¿ÐµÑ\80еменнаÑ\8f ÐºÐ¾Ð½Ñ\84игÑ\83Ñ\80аÑ\86ии Â«%s» Ð² Ñ\84айле Â«%s» Ð½Ð° Ñ\81Ñ\82Ñ\80оке %d"
 
-#: merge-recursive.c:1546
+#: config.c:1777
 #, c-format
-msgid "Adding merged %s"
-msgstr "Добавление слитого %s"
+msgid "%s has multiple values"
+msgstr "%s имеет несколько значений"
 
-#: merge-recursive.c:1553 merge-recursive.c:1766
+#: config.c:2311
 #, c-format
-msgid "Adding as %s instead"
-msgstr "Ð\94обавление Ð²Ð¼ÐµÑ\81Ñ\82о Ñ\8dÑ\82ого ÐºÐ°Ðº %s"
+msgid "could not set '%s' to '%s'"
+msgstr "не Ñ\83далоÑ\81Ñ\8c Ñ\83Ñ\81Ñ\82ановиÑ\82Ñ\8c Â«%s» Ð² Â«%s»"
 
-#: merge-recursive.c:1610
+#: config.c:2313
 #, c-format
-msgid "cannot read object %s"
-msgstr "невозможно прочитать объект «%s»"
+msgid "could not unset '%s'"
+msgstr "не удалось сбросить значение для «%s»"
 
-#: merge-recursive.c:1613
-#, c-format
-msgid "object %s is not a blob"
-msgstr "объект %s не является двоичным объектом"
+#: connect.c:49
+msgid "The remote end hung up upon initial contact"
+msgstr "Внешний сервер отсоединился до начала сеанса связи"
 
-#: merge-recursive.c:1666
-msgid "modify"
-msgstr "изменение"
+#: connect.c:51
+msgid ""
+"Could not read from remote repository.\n"
+"\n"
+"Please make sure you have the correct access rights\n"
+"and the repository exists."
+msgstr "Не удалось прочитать из внешнего репозитория.\n\nУдостоверьтесь, что у вас есть необходимые права доступа\nи репозиторий существует."
 
-#: merge-recursive.c:1666
-msgid "modified"
-msgstr "изменено"
+#: connected.c:63 builtin/fsck.c:173 builtin/prune.c:140
+msgid "Checking connectivity"
+msgstr "Ð\9fÑ\80овеÑ\80ка Ñ\81оединениÑ\8f"
 
-#: merge-recursive.c:1676
-msgid "content"
-msgstr "содержимое"
+#: connected.c:75
+msgid "Could not run 'git rev-list'"
+msgstr "Не удалось запустить «git rev-list»"
 
-#: merge-recursive.c:1683
-msgid "add/add"
-msgstr "добавление/добавление"
+#: connected.c:95
+msgid "failed write to rev-list"
+msgstr "сбой записи в rev-list"
 
-#: merge-recursive.c:1718
-#, c-format
-msgid "Skipped %s (merged same as existing)"
-msgstr "Пропуск %s (слиты одинаковые изменения как существующие)"
+#: connected.c:102
+msgid "failed to close rev-list's stdin"
+msgstr "сбой закрытия стандартного ввода у rev-list"
 
-#: merge-recursive.c:1732
+#: convert.c:201
 #, c-format
-msgid "Auto-merging %s"
-msgstr "Автослияние %s"
+msgid ""
+"CRLF will be replaced by LF in %s.\n"
+"The file will have its original line endings in your working directory."
+msgstr "CRLF будет заменен на LF в %s.\nФайл будет иметь свои оригинальные концы строк в рашей рабочей копии."
 
-#: merge-recursive.c:1736 git-submodule.sh:919
-msgid "submodule"
-msgstr "подмодуль"
+#: convert.c:205
+#, c-format
+msgid "CRLF would be replaced by LF in %s."
+msgstr "CRLF будет заменен на LF в %s."
 
-#: merge-recursive.c:1737
+#: convert.c:211
 #, c-format
-msgid "CONFLICT (%s): Merge conflict in %s"
-msgstr "КОНФЛИКТ (%s): Конфликт слияния в %s"
+msgid ""
+"LF will be replaced by CRLF in %s.\n"
+"The file will have its original line endings in your working directory."
+msgstr "LF будет заменен на CRLF в %s.\nФайл будет иметь свои оригинальные концы строк в рашей рабочей копии."
 
-#: merge-recursive.c:1831
+#: convert.c:215
 #, c-format
-msgid "Removing %s"
-msgstr "Удаление %s"
+msgid "LF would be replaced by CRLF in %s"
+msgstr "LF будет заменен на CRLF в %s"
 
-#: merge-recursive.c:1857
-msgid "file/directory"
-msgstr "файл/каталог"
+#: date.c:97
+msgid "in the future"
+msgstr "в будущем"
 
-#: merge-recursive.c:1863
-msgid "directory/file"
-msgstr "каталог/файл"
+#: date.c:103
+#, c-format
+msgid "%lu second ago"
+msgid_plural "%lu seconds ago"
+msgstr[0] "%lu секунду назад"
+msgstr[1] "%lu секунды назад"
+msgstr[2] "%lu секунд назад"
+msgstr[3] "%lu секунд назад"
 
-#: merge-recursive.c:1868
+#: date.c:110
 #, c-format
-msgid ""
-"CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s"
-msgstr "КОНФЛИКТ (%s): Уже существует каталог с именем «%s» в «%s». Добавление «%s» как «%s»"
+msgid "%lu minute ago"
+msgid_plural "%lu minutes ago"
+msgstr[0] "%lu минуту назад"
+msgstr[1] "%lu минуты назад"
+msgstr[2] "%lu минут назад"
+msgstr[3] "%lu минут назад"
 
-#: merge-recursive.c:1877
+#: date.c:117
 #, c-format
-msgid "Adding %s"
-msgstr "Добавление %s"
+msgid "%lu hour ago"
+msgid_plural "%lu hours ago"
+msgstr[0] "%lu час назад"
+msgstr[1] "%lu часа назад"
+msgstr[2] "%lu часов назад"
+msgstr[3] "%lu часов назад"
 
-#: merge-recursive.c:1914
-msgid "Already up-to-date!"
-msgstr "Уже обновлено!"
+#: date.c:124
+#, c-format
+msgid "%lu day ago"
+msgid_plural "%lu days ago"
+msgstr[0] "%lu день назад"
+msgstr[1] "%lu дня назад"
+msgstr[2] "%lu дней назад"
+msgstr[3] "%lu дней назад"
 
-#: merge-recursive.c:1923
+#: date.c:130
 #, c-format
-msgid "merging of trees %s and %s failed"
-msgstr "сбой слияния деревьев «%s» и «%s»"
+msgid "%lu week ago"
+msgid_plural "%lu weeks ago"
+msgstr[0] "%lu неделю назад"
+msgstr[1] "%lu недели назад"
+msgstr[2] "%lu недель назад"
+msgstr[3] "%lu недель назад"
 
-#: merge-recursive.c:2006
-msgid "Merging:"
-msgstr "Слияние:"
+#: date.c:137
+#, c-format
+msgid "%lu month ago"
+msgid_plural "%lu months ago"
+msgstr[0] "%lu месяц назад"
+msgstr[1] "%lu месяца назад"
+msgstr[2] "%lu месяцев назад"
+msgstr[3] "%lu месяцев назад"
 
-#: merge-recursive.c:2019
+#: date.c:148
 #, c-format
-msgid "found %u common ancestor:"
-msgid_plural "found %u common ancestors:"
-msgstr[0] "найден %u общий предок:"
-msgstr[1] "найдено %u общих предка:"
-msgstr[2] "найдено %u общих предков:"
-msgstr[3] "найдено %u общих предков:"
+msgid "%lu year"
+msgid_plural "%lu years"
+msgstr[0] "%lu год"
+msgstr[1] "%lu года"
+msgstr[2] "%lu лет"
+msgstr[3] "%lu лет"
 
-#: merge-recursive.c:2058
-msgid "merge returned no commit"
-msgstr "слияние не вернуло коммит"
+#. TRANSLATORS: "%s" is "<n> years"
+#: date.c:151
+#, c-format
+msgid "%s, %lu month ago"
+msgid_plural "%s, %lu months ago"
+msgstr[0] "%s и %lu месяц назад"
+msgstr[1] "%s и %lu месяца назад"
+msgstr[2] "%s и %lu месяцев назад"
+msgstr[3] "%s и %lu месяцев назад"
 
-#: merge-recursive.c:2121
+#: date.c:156 date.c:161
 #, c-format
-msgid "Could not parse object '%s'"
-msgstr "Не удалось разобрать объект «%s»"
+msgid "%lu year ago"
+msgid_plural "%lu years ago"
+msgstr[0] "%lu год назад"
+msgstr[1] "%lu года назад"
+msgstr[2] "%lu лет назад"
+msgstr[3] "%lu лет назад"
 
-#: merge-recursive.c:2135 builtin/merge.c:641 builtin/merge.c:788
-msgid "Unable to write index."
-msgstr "Не удается записать индекс."
+#: diffcore-order.c:24
+#, c-format
+msgid "failed to read orderfile '%s'"
+msgstr "сбой чтения orderfile «%s»"
 
-#: notes-utils.c:41
-msgid "Cannot commit uninitialized/unreferenced notes tree"
-msgstr "Нельзя закоммитить неинициализированное или не имеющее ссылок дерево заметок"
+#: diffcore-rename.c:536
+msgid "Performing inexact rename detection"
+msgstr "Выполняется неточное определение переименования"
+
+#: diff.c:62
+#, c-format
+msgid "option '%s' requires a value"
+msgstr "параметр «%s» требует указания значения"
+
+#: diff.c:124
+#, c-format
+msgid "  Failed to parse dirstat cut-off percentage '%s'\n"
+msgstr "  Сбой разбора величины среза (cut-off) у dirstat «%s»\n"
 
-#: notes-utils.c:100
+#: diff.c:129
 #, c-format
-msgid "Bad notes.rewriteMode value: '%s'"
-msgstr "Ð\9dепÑ\80авилÑ\8cное Ð·Ð½Ð°Ñ\87ение notes.rewriteMode: Â«%s»"
+msgid "  Unknown dirstat parameter '%s'\n"
+msgstr "Ð\9dеизвеÑ\81Ñ\82нÑ\8bй Ð¿Ð°Ñ\80амеÑ\82Ñ\80 dirstat: Â«%s»\n"
 
-#: notes-utils.c:110
+#: diff.c:283
 #, c-format
-msgid "Refusing to rewrite notes in %s (outside of refs/notes/)"
-msgstr "Ð\9eÑ\82каз Ð² Ð¿ÐµÑ\80езапиÑ\81и Ð·Ð°Ð¼ÐµÑ\82ок Ð² %s (за Ð¿Ñ\80еделами refs/notes/)"
+msgid "Unknown value for 'diff.submodule' config variable: '%s'"
+msgstr "Ð\9dеизвеÑ\81Ñ\82ное Ð·Ð½Ð°Ñ\87ениÑ\8f Ð´Ð»Ñ\8f Ð¿ÐµÑ\80еменной Â«diff.submodule»: Â«%s»"
 
-#. TRANSLATORS: The first %s is the name of the
-#. environment variable, the second %s is its value
-#: notes-utils.c:137
+#: diff.c:346
 #, c-format
-msgid "Bad %s value: '%s'"
-msgstr "Неправильное значение переменной %s: «%s»"
+msgid ""
+"Found errors in 'diff.dirstat' config variable:\n"
+"%s"
+msgstr "Найдены ошибки в переменной «diff.dirstat»:\n%s"
 
-#: object.c:242
+#: diff.c:3087
 #, c-format
-msgid "unable to parse object: %s"
-msgstr "не Ñ\83далоÑ\81Ñ\8c Ñ\80азобÑ\80аÑ\82Ñ\8c Ð¾Ð±Ñ\8aекÑ\82: %s"
+msgid "external diff died, stopping at %s"
+msgstr "кÑ\80иÑ\82иÑ\87еÑ\81каÑ\8f Ð¾Ñ\88ибка Ð¿Ñ\80и Ð²Ð½ÐµÑ\88нем Ñ\81Ñ\80авнении, Ð¾Ñ\81Ñ\82анов Ð½Ð° %s"
 
-#: parse-options.c:572
-msgid "..."
-msgstr ""
+#: diff.c:3412
+msgid "--name-only, --name-status, --check and -s are mutually exclusive"
+msgstr "--name-only, --name-status, --check и -s нельзя использовать одновременно"
 
-#: parse-options.c:590
-#, c-format
-msgid "usage: %s"
-msgstr "использование: %s"
+#: diff.c:3502
+msgid "--follow requires exactly one pathspec"
+msgstr "--follow требует ровно одной спецификации пути"
 
-#. TRANSLATORS: the colon here should align with the
-#. one in "usage: %s" translation
-#: parse-options.c:594
+#: diff.c:3665
 #, c-format
-msgid "   or: %s"
-msgstr "          или: %s"
+msgid ""
+"Failed to parse --dirstat/-X option parameter:\n"
+"%s"
+msgstr "Сбой разбора параметра опции --dirstat/-X :\n%s"
 
-#: parse-options.c:597
+#: diff.c:3679
 #, c-format
-msgid "    %s"
-msgstr "            %s"
+msgid "Failed to parse --submodule option parameter: '%s'"
+msgstr "Сбой разбора параметра опции --submodule: «%s»"
 
-#: parse-options.c:631
-msgid "-NUM"
-msgstr "-КОЛИЧЕСТВО"
+#: diff.c:4700
+msgid "inexact rename detection was skipped due to too many files."
+msgstr "неточное определение переименования было пропущено из-за слишком большого количества файлов."
 
-#: parse-options-cb.c:108
-#, c-format
-msgid "malformed object name '%s'"
-msgstr "Неправильное имя объекта «%s»"
+#: diff.c:4703
+msgid "only found copies from modified paths due to too many files."
+msgstr "найдены только копии из измененных путей из-за слишком большого количества файлов."
 
-#: path.c:798
+#: diff.c:4706
 #, c-format
-msgid "Could not make %s writable by group"
-msgstr "Не удалось предоставить доступ к %s на запись"
+msgid ""
+"you may want to set your %s variable to at least %d and retry the command."
+msgstr "возможно вы захотите установить переменную %s в как минимум значение %d и повторить вызов команды."
 
-#: pathspec.c:133
-msgid "global 'glob' and 'noglob' pathspec settings are incompatible"
-msgstr "глобалÑ\8cнÑ\8bе Ð¾Ð¿Ñ\86ии Ñ\81пеÑ\86иÑ\84икаÑ\86ии Ð¿Ñ\83Ñ\82и Â«glob» Ð¸ Â«noglob» Ð½ÐµÐ»Ñ\8cзÑ\8f Ð¸Ñ\81полÑ\8cзоваÑ\82Ñ\8c Ð¾Ð´Ð½Ð¾Ð²Ñ\80еменно"
+#: dir.c:1866
+msgid "failed to get kernel name and information"
+msgstr "не Ñ\83далоÑ\81Ñ\8c Ð¿Ð¾Ð»Ñ\83Ñ\87иÑ\82Ñ\8c Ð¸Ð¼Ñ\8f Ñ\8fдÑ\80а Ð¸ Ð¸Ð½Ñ\84оÑ\80маÑ\86иÑ\8e"
 
-#: pathspec.c:143
-msgid ""
-"global 'literal' pathspec setting is incompatible with all other global "
-"pathspec settings"
-msgstr "глобальная опция спецификации пути «literal» не совместима с другими глобальными спецификаторами доступа"
+#: dir.c:1985
+msgid "Untracked cache is disabled on this system or location."
+msgstr "Кэш неотслеживаемых файлов отключен на этой системе или в этом месте."
 
-#: pathspec.c:177
-msgid "invalid parameter for pathspec magic 'prefix'"
-msgstr "неправильный параметр для магического слова «prefix» в спецификации пути "
+#: fetch-pack.c:213
+msgid "git fetch-pack: expected shallow list"
+msgstr "git fetch-pack: ожидается передача списка для получение части"
 
-#: pathspec.c:183
+#: fetch-pack.c:225
+msgid "git fetch-pack: expected ACK/NAK, got EOF"
+msgstr "git fetch-pack: ожидается ACK/NAK, а получено EOF"
+
+#: fetch-pack.c:243
 #, c-format
-msgid "Invalid pathspec magic '%.*s' in '%s'"
-msgstr "неправильное магическое слово «%.*s» в спецификации пути «%s»"
+msgid "git fetch-pack: expected ACK/NAK, got '%s'"
+msgstr "git fetch-pack: ожидается ACK/NAK, а получено «%s»"
 
-#: pathspec.c:187
+#: fetch-pack.c:295
+msgid "--stateless-rpc requires multi_ack_detailed"
+msgstr "--stateless-rpc требует multi_ack_detailed"
+
+#: fetch-pack.c:381
 #, c-format
-msgid "Missing ')' at the end of pathspec magic in '%s'"
-msgstr "Ð\9fÑ\80опÑ\83Ñ\89ено Â«)» Ð² ÐºÐ¾Ð½Ñ\86е Ð¼Ð°Ð³Ð¸Ñ\87еÑ\81кого Ñ\81лова Ñ\81пеÑ\86иÑ\84икаÑ\86ии Ð¿Ñ\83Ñ\82и Â«%s»"
+msgid "invalid shallow line: %s"
+msgstr "непÑ\80авилÑ\8cнаÑ\8f Ñ\81Ñ\82Ñ\80ока Ñ\87аÑ\81Ñ\82иÑ\87ного Ð¿Ð¾Ð»Ñ\83Ñ\87ениÑ\8f: %s"
 
-#: pathspec.c:205
+#: fetch-pack.c:387
 #, c-format
-msgid "Unimplemented pathspec magic '%c' in '%s'"
-msgstr "Ð\9dеÑ\80еализованное Ð¼Ð°Ð³Ð¸Ñ\87еÑ\81кое Ñ\81лово Â«%c» Ñ\81пеÑ\86иÑ\84икаÑ\86ии Ð¿Ñ\83Ñ\82и Â«%s»"
+msgid "invalid unshallow line: %s"
+msgstr "непÑ\80авилÑ\8cнаÑ\8f Ñ\81Ñ\82Ñ\80ока Ð¿Ð¾Ð»Ð½Ð¾Ð³Ð¾ Ð¿Ð¾Ð»Ñ\83Ñ\87ениÑ\8f: %s"
 
-#: pathspec.c:230
+#: fetch-pack.c:389
 #, c-format
-msgid "%s: 'literal' and 'glob' are incompatible"
-msgstr "%s: «literal» и «glob» не совместимы"
+msgid "object not found: %s"
+msgstr "объект не найден: %s"
 
-#: pathspec.c:241
+#: fetch-pack.c:392
 #, c-format
-msgid "%s: '%s' is outside repository"
-msgstr "%s: «%s» вне репозитория"
+msgid "error in object: %s"
+msgstr "ошибка в объекте: %s"
 
-#: pathspec.c:291
+#: fetch-pack.c:394
 #, c-format
-msgid "Pathspec '%s' is in submodule '%.*s'"
-msgstr "Спецификация пути «%s» в подмодуле «%.*s»"
+msgid "no shallow found: %s"
+msgstr "частичный клон не найден: %s"
 
-#: pathspec.c:353
+#: fetch-pack.c:397
 #, c-format
-msgid "%s: pathspec magic not supported by this command: %s"
-msgstr "%s: магические слова в спецификации пути не поддерживаются командой: %s"
+msgid "expected shallow/unshallow, got %s"
+msgstr "ожидалось shallow/unshallow, а получено %s"
 
-#: pathspec.c:433
+#: fetch-pack.c:436
 #, c-format
-msgid "pathspec '%s' is beyond a symbolic link"
-msgstr "спецификация пути «%s» находится за символической ссылкой"
+msgid "got %s %d %s"
+msgstr "получено %s %d %s"
 
-#: pathspec.c:442
-msgid ""
-"There is nothing to exclude from by :(exclude) patterns.\n"
-"Perhaps you forgot to add either ':/' or '.' ?"
-msgstr "Не указан шаблон для исключения с помощью :(exclude).\nВозможно, вы забыли «:/» или «.» ?"
+#: fetch-pack.c:450
+#, c-format
+msgid "invalid commit %s"
+msgstr "недопустимый коммит %s"
 
-#: pretty.c:973
-msgid "unable to parse --pretty format"
-msgstr "не Ñ\83далоÑ\81Ñ\8c Ñ\80азобÑ\80аÑ\82Ñ\8c Ñ\84оÑ\80маÑ\82 Ð´Ð»Ñ\8f --pretty"
+#: fetch-pack.c:483
+msgid "giving up"
+msgstr "оÑ\81Ñ\82анавливаÑ\8e Ð´Ð°Ð»Ñ\8cнейÑ\88ие Ð¿Ð¾Ð¿Ñ\8bÑ\82ки"
 
-#: progress.c:235
+#: fetch-pack.c:493 progress.c:235
 msgid "done"
 msgstr "готово"
 
-#: read-cache.c:1281
+#: fetch-pack.c:505
 #, c-format
-msgid ""
-"index.version set, but the value is invalid.\n"
-"Using version %i"
-msgstr "index.version указан, но значение недействительное.\nИспользую версию %i"
+msgid "got %s (%d) %s"
+msgstr "получено %s (%d) %s"
 
-#: read-cache.c:1291
+#: fetch-pack.c:551
 #, c-format
-msgid ""
-"GIT_INDEX_VERSION set, but the value is invalid.\n"
-"Using version %i"
-msgstr "GIT_INDEX_VERSION указан, но значение недействительное.\nИспользую версию %i"
+msgid "Marking %s as complete"
+msgstr "Помечаю %s как завершенный"
 
-#: refs.c:551 builtin/merge.c:840
+#: fetch-pack.c:697
 #, c-format
-msgid "Could not open '%s' for writing"
-msgstr "Не удалось открыть «%s» для записи"
+msgid "already have %s (%s)"
+msgstr "уже есть %s (%s)"
 
-#: refs/files-backend.c:2534
-#, c-format
-msgid "could not delete reference %s: %s"
-msgstr "не удалось удалить ссылку %s: %s"
+#: fetch-pack.c:735
+msgid "fetch-pack: unable to fork off sideband demultiplexer"
+msgstr "fetch-pack: не удалось запустить программу разбора данных"
 
-#: refs/files-backend.c:2537
-#, c-format
-msgid "could not delete references: %s"
-msgstr "не удалось удалить ссылки: %s"
+#: fetch-pack.c:743
+msgid "protocol error: bad pack header"
+msgstr "ошибка протокола: неправильный заголовок потока"
 
-#: refs/files-backend.c:2546
+#: fetch-pack.c:799
 #, c-format
-msgid "could not remove reference %s"
-msgstr "не удалось удалить ссылки %s"
+msgid "fetch-pack: unable to fork off %s"
+msgstr "fetch-pack: не удалось запустить программу %s"
 
-#: ref-filter.c:55
+#: fetch-pack.c:815
 #, c-format
-msgid "expected format: %%(color:<color>)"
-msgstr "ожидаемый формат: %%(color:<color>)"
+msgid "%s failed"
+msgstr "%s завершен с ошибкой"
 
-#: ref-filter.c:57
-#, c-format
-msgid "unrecognized color: %%(color:%s)"
-msgstr "неопознанный цвет: %%(color:%s)"
+#: fetch-pack.c:817
+msgid "error in sideband demultiplexer"
+msgstr "произошла  ошибка в  программе разбора данных"
 
-#: ref-filter.c:71
+#: fetch-pack.c:844
+msgid "Server does not support shallow clients"
+msgstr "Сервер не поддерживает клиентов с частичным клонированием"
+
+#: fetch-pack.c:848
+msgid "Server supports multi_ack_detailed"
+msgstr "Сервер поддерживает multi_ack_detailed"
+
+#: fetch-pack.c:851
+msgid "Server supports no-done"
+msgstr "Сервер поддерживает no-done"
+
+#: fetch-pack.c:857
+msgid "Server supports multi_ack"
+msgstr "Сервер поддерживает multi_ack"
+
+#: fetch-pack.c:861
+msgid "Server supports side-band-64k"
+msgstr "Сервер поддерживает side-band-64k"
+
+#: fetch-pack.c:865
+msgid "Server supports side-band"
+msgstr "Сервер поддерживает side-band"
+
+#: fetch-pack.c:869
+msgid "Server supports allow-tip-sha1-in-want"
+msgstr "Сервер поддерживает allow-tip-sha1-in-want"
+
+#: fetch-pack.c:873
+msgid "Server supports allow-reachable-sha1-in-want"
+msgstr "Сервер поддерживает allow-reachable-sha1-in-want"
+
+#: fetch-pack.c:883
+msgid "Server supports ofs-delta"
+msgstr "Сервер поддерживает ofs-delta"
+
+#: fetch-pack.c:890
 #, c-format
-msgid "unrecognized format: %%(%s)"
-msgstr "неопознаннÑ\8bй Ñ\84оÑ\80маÑ\82: %%(%s)"
+msgid "Server version is %.*s"
+msgstr "Ð\92еÑ\80Ñ\81иÑ\8f Ñ\81еÑ\80веÑ\80а %.*s"
 
-#: ref-filter.c:77
+#: fetch-pack.c:896
+msgid "Server does not support --shallow-since"
+msgstr "Сервер не поддерживает --shallow-since"
+
+#: fetch-pack.c:900
+msgid "Server does not support --shallow-exclude"
+msgstr "Сервер не поддерживает --shallow-exclude"
+
+#: fetch-pack.c:902
+msgid "Server does not support --deepen"
+msgstr "Сервер не поддерживает --deepen"
+
+#: fetch-pack.c:913
+msgid "no common commits"
+msgstr "не общих коммитов"
+
+#: fetch-pack.c:925
+msgid "git fetch-pack: fetch failed."
+msgstr "git fetch-pack: ошибка при получении данных."
+
+#: fetch-pack.c:1087
+msgid "no matching remote head"
+msgstr "нет соотвествующего внешнего указателя на ветку"
+
+#: gpg-interface.c:185
+msgid "gpg failed to sign the data"
+msgstr "gpg не удалось подписать данные"
+
+#: gpg-interface.c:215
+msgid "could not create temporary file"
+msgstr "не удалось создать временный файл"
+
+#: gpg-interface.c:217
 #, c-format
-msgid "%%(body) does not take arguments"
-msgstr "%%(body) не принимает аргументов"
+msgid "failed writing detached signature to '%s'"
+msgstr "сбой записи отсоединенной подписи в «%s»"
 
-#: ref-filter.c:84
+#: grep.c:1782
 #, c-format
-msgid "%%(subject) does not take arguments"
-msgstr "%%(subject) не принимает аргументов"
+msgid "'%s': unable to read %s"
+msgstr "«%s»: не удалось прочесть %s"
 
-#: ref-filter.c:101
+#: grep.c:1799 builtin/clone.c:381 builtin/diff.c:84 builtin/rm.c:155
 #, c-format
-msgid "positive value expected contents:lines=%s"
-msgstr "положиÑ\82елÑ\8cное Ð·Ð½Ð°Ñ\87ение Ð¾Ð¶Ð¸Ð´Ð°ÐµÑ\82 Ñ\81одеÑ\80жимое:lines=%s"
+msgid "failed to stat '%s'"
+msgstr "не Ñ\83далоÑ\81Ñ\8c Ð²Ñ\8bполниÑ\82Ñ\8c stat Â«%s»"
 
-#: ref-filter.c:103
+#: grep.c:1810
 #, c-format
-msgid "unrecognized %%(contents) argument: %s"
-msgstr "неопознанный аргумент %%(contents): %s"
+msgid "'%s': short read"
+msgstr "«%s»: слишком мало данных прочитано"
 
-#: ref-filter.c:113
+#: help.c:203
 #, c-format
-msgid "unrecognized %%(objectname) argument: %s"
-msgstr "неопознаннÑ\8bй Ð°Ñ\80гÑ\83менÑ\82 %%(objectname): %s"
+msgid "available git commands in '%s'"
+msgstr "доÑ\81Ñ\82Ñ\83пнÑ\8bе ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ\8b git Ð² Â«%s»"
 
-#: ref-filter.c:135
+#: help.c:210
+msgid "git commands available from elsewhere on your $PATH"
+msgstr "команды git, доступные в других местах вашего $PATH"
+
+#: help.c:241
+msgid "These are common Git commands used in various situations:"
+msgstr "Стандартные команды Git используемые в различных ситуациях:"
+
+#: help.c:306
 #, c-format
-msgid "expected format: %%(align:<width>,<position>)"
-msgstr "ожидаемый формат: %%(align:<width>,<position>)"
+msgid ""
+"'%s' appears to be a git command, but we were not\n"
+"able to execute it. Maybe git-%s is broken?"
+msgstr "«%s» похоже на команду git, но нам не удалось ее запустить. Возможно, git-%s  не работает?"
 
-#: ref-filter.c:147
+#: help.c:361
+msgid "Uh oh. Your system reports no Git commands at all."
+msgstr "Ой-ёй! Ваша система не сообщает ни о каких командах Git вообще."
+
+#: help.c:383
 #, c-format
-msgid "unrecognized position:%s"
-msgstr "неопознанная позиция:%s"
+msgid ""
+"WARNING: You called a Git command named '%s', which does not exist.\n"
+"Continuing under the assumption that you meant '%s'"
+msgstr "ВНИМАНИЕ: Вы вызвали команду Git «%s», но такой не существует.\nПродолжаем с предположением, что вы имели в виду «%s»"
 
-#: ref-filter.c:151
+#: help.c:388
 #, c-format
-msgid "unrecognized width:%s"
-msgstr "неопознанная ширина:%s"
+msgid "in %0.1f seconds automatically..."
+msgstr "через %0.1f секунд автоматически…"
 
-#: ref-filter.c:157
+#: help.c:395
 #, c-format
-msgid "unrecognized %%(align) argument: %s"
-msgstr "неопознанный аргумент %%(align): %s"
+msgid "git: '%s' is not a git command. See 'git --help'."
+msgstr "git: «%s» не является командой git. Смотрите «git --help»."
 
-#: ref-filter.c:161
+#: help.c:399 help.c:465
+msgid ""
+"\n"
+"Did you mean this?"
+msgid_plural ""
+"\n"
+"Did you mean one of these?"
+msgstr[0] "\nВозможно, вы имели в виду это?"
+msgstr[1] "\nВозможно, вы имели в виду что-то из этого?"
+msgstr[2] "\nВозможно, вы имели в виду что-то из этого?"
+msgstr[3] "\nВозможно, вы имели в виду что-то из этого?"
+
+#: help.c:461
 #, c-format
-msgid "positive width expected with the %%(align) atom"
-msgstr "ожидается положительная ширина с указанием частицы %%(align)"
+msgid "%s: %s - %s"
+msgstr "%s: %s — %s"
 
-#: ref-filter.c:244
+#: ident.c:334
+msgid ""
+"\n"
+"*** Please tell me who you are.\n"
+"\n"
+"Run\n"
+"\n"
+"  git config --global user.email \"you@example.com\"\n"
+"  git config --global user.name \"Your Name\"\n"
+"\n"
+"to set your account's default identity.\n"
+"Omit --global to set the identity only in this repository.\n"
+"\n"
+msgstr "\n*** Пожалуйста, скажите мне кто вы есть.\n\nЗапустите\n\n  git config --global user.email \"you@example.com\"\n  git config --global user.name \"Ваше Имя\"\n\nдля указания идентификационных данных аккаунта по умолчанию.\nПропустите параметр --global для указания данных только для этого репозитория.\n\n"
+
+#: lockfile.c:152
 #, c-format
-msgid "malformed field name: %.*s"
-msgstr "неправильное имя поля: %.*s"
+msgid ""
+"Unable to create '%s.lock': %s.\n"
+"\n"
+"Another git process seems to be running in this repository, e.g.\n"
+"an editor opened by 'git commit'. Please make sure all processes\n"
+"are terminated then try again. If it still fails, a git process\n"
+"may have crashed in this repository earlier:\n"
+"remove the file manually to continue."
+msgstr "Не удалось создать «%s.lock»: %s.\n\nПохоже, что другой процесс git запущен в этом репозитории,\nнапример редактор открыт из «git commit». Пожалуйста, убедитесь,\nчто все процессы были завершены и потом попробуйте снова.\nЕсли это не поможет, то возможно процесс git был ранее завершен\nс ошибкой в этом репозитории: \nудалите файл вручную для продолжения."
 
-#: ref-filter.c:270
+#: lockfile.c:160
 #, c-format
-msgid "unknown field name: %.*s"
-msgstr "неизвестное имя поля: %.*s"
+msgid "Unable to create '%s.lock': %s"
+msgstr "Не удалось создать «%s.lock»: %s"
+
+#: merge.c:41
+msgid "failed to read the cache"
+msgstr "сбой чтения кэша"
 
-#: ref-filter.c:372
-#, c-format
-msgid "format: %%(end) atom used without corresponding atom"
-msgstr "формат: частица %%(end) использована без соответствующей частицы"
+#: merge.c:96 builtin/am.c:2000 builtin/am.c:2035 builtin/checkout.c:374
+#: builtin/checkout.c:588 builtin/clone.c:731
+msgid "unable to write new index file"
+msgstr "не удалось записать новый файл индекса"
 
-#: ref-filter.c:424
+#: merge-recursive.c:209
+msgid "(bad commit)\n"
+msgstr "(плохой коммит)\n"
+
+#: merge-recursive.c:231
 #, c-format
-msgid "malformed format string %s"
-msgstr "неправильная строка формата %s"
+msgid "addinfo_cache failed for path '%s'"
+msgstr "сбой addinfo_cache для пути «%s»"
 
-#: ref-filter.c:878
-msgid ":strip= requires a positive integer argument"
-msgstr ":strip= требует наличия положительного целого аргумента"
+#: merge-recursive.c:301
+msgid "error building trees"
+msgstr "ошибка при построении деревьев"
 
-#: ref-filter.c:883
+#: merge-recursive.c:720
 #, c-format
-msgid "ref '%s' does not have %ld components to :strip"
-msgstr "ссылка «%s» не содержит %ld компонент для :strip"
+msgid "failed to create path '%s'%s"
+msgstr "не удалось создать путь «%s»%s"
 
-#: ref-filter.c:1046
+#: merge-recursive.c:731
 #, c-format
-msgid "unknown %.*s format %s"
-msgstr "неизвеÑ\81Ñ\82нÑ\8bй %.*s Ñ\84оÑ\80маÑ\82 %s"
+msgid "Removing %s to make room for subdirectory\n"
+msgstr "Удаление %s, Ñ\87Ñ\82обÑ\8b Ð¾Ñ\81вободиÑ\82Ñ\8c Ð¼ÐµÑ\81Ñ\82о Ð´Ð»Ñ\8f Ð¿Ð¾Ð´ÐºÐ°Ñ\82алогов\n"
 
-#: ref-filter.c:1066 ref-filter.c:1097
-#, c-format
-msgid "missing object %s for %s"
-msgstr "не найден объект %s для %s"
+#: merge-recursive.c:745 merge-recursive.c:764
+msgid ": perhaps a D/F conflict?"
+msgstr ": возможно, конфликт каталогов/файлов?"
 
-#: ref-filter.c:1069 ref-filter.c:1100
+#: merge-recursive.c:754
 #, c-format
-msgid "parse_object_buffer failed on %s for %s"
-msgstr "сбой при выполнении parse_object_buffer на %s для %s"
+msgid "refusing to lose untracked file at '%s'"
+msgstr "отказ потери неотслеживаемого файла в «%s»"
 
-#: ref-filter.c:1311
+#: merge-recursive.c:796 builtin/cat-file.c:34
 #, c-format
-msgid "malformed object at '%s'"
-msgstr "Ð\9fовÑ\80еждÑ\91ннÑ\8bй Ð¾Ð±Ñ\8aекÑ\82 «%s»"
+msgid "cannot read object %s '%s'"
+msgstr "невозможно Ð¿Ñ\80оÑ\87иÑ\82аÑ\82Ñ\8c Ð¾Ð±Ñ\8aекÑ\82 %s «%s»"
 
-#: ref-filter.c:1373
+#: merge-recursive.c:798
 #, c-format
-msgid "ignoring ref with broken name %s"
-msgstr "игноÑ\80иÑ\80Ñ\83Ñ\8e Ñ\81Ñ\81Ñ\8bлкÑ\83 Ñ\81 Ð½ÐµÐ¿Ñ\80авилÑ\8cнÑ\8bм Ð¸Ð¼ÐµÐ½ÐµÐ¼ %s"
+msgid "blob expected for %s '%s'"
+msgstr "ожидаеÑ\82Ñ\81Ñ\8f Ð´Ð²Ð¾Ð¸Ñ\87нÑ\8bй Ð¾Ð±Ñ\8aекÑ\82 Ð´Ð»Ñ\8f %s Â«%s»"
 
-#: ref-filter.c:1378
+#: merge-recursive.c:822
 #, c-format
-msgid "ignoring broken ref %s"
-msgstr "игноÑ\80иÑ\80Ñ\83Ñ\8e Ð½ÐµÐ¿Ñ\80авилÑ\8cнÑ\83Ñ\8e Ñ\81Ñ\81Ñ\8bлкÑ\83 %s"
+msgid "failed to open '%s': %s"
+msgstr "не Ñ\83далоÑ\81Ñ\8c Ð¾Ñ\82кÑ\80Ñ\8bÑ\82Ñ\8c Â«%s»: %s"
 
-#: ref-filter.c:1651
+#: merge-recursive.c:833
 #, c-format
-msgid "format: %%(end) atom missing"
-msgstr "format: пропущена частица %%(end)"
+msgid "failed to symlink '%s': %s"
+msgstr "не удалось создать символьную ссылку «%s»: %s"
 
-#: ref-filter.c:1705
+#: merge-recursive.c:838
 #, c-format
-msgid "malformed object name %s"
-msgstr "неправильное имя объекта %s"
+msgid "do not know what to do with %06o %s '%s'"
+msgstr "не понятно, что делать с %06o %s «%s»"
 
-#: remote.c:746
+#: merge-recursive.c:978
+msgid "Failed to execute internal merge"
+msgstr "Не удалось запустить внутреннее слияние"
+
+#: merge-recursive.c:982
 #, c-format
-msgid "Cannot fetch both %s and %s to %s"
-msgstr "Нельзя извлечь одновременно %s и %s в %s"
+msgid "Unable to add %s to database"
+msgstr "Не удалось добавить %s в базу данных"
 
-#: remote.c:750
+#: merge-recursive.c:1081 merge-recursive.c:1095
 #, c-format
-msgid "%s usually tracks %s, not %s"
-msgstr "%s обычно отслеживает %s, а не %s"
+msgid ""
+"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
+"in tree."
+msgstr "КОНФЛИКТ (%s/удаление): %s удалено в %s и %s в %s. Версия %s из %s оставлена в дереве."
 
-#: remote.c:754
+#: merge-recursive.c:1087 merge-recursive.c:1100
 #, c-format
-msgid "%s tracks both %s and %s"
-msgstr "%s отслеживает и %s и %s"
+msgid ""
+"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
+"in tree at %s."
+msgstr "КОНФЛИКТ (%s/удаление): %s удалено в %s и %s в %s. Версия %s из %s оставлена в дереве на %s."
 
-#: remote.c:762
-msgid "Internal error"
-msgstr "Ð\92нÑ\83Ñ\82Ñ\80еннÑ\8fÑ\8f Ð¾Ñ\88ибка"
+#: merge-recursive.c:1143
+msgid "rename"
+msgstr "пеÑ\80еименование"
 
-#: remote.c:1677 remote.c:1720
-msgid "HEAD does not point to a branch"
-msgstr "HEAD не указывает на ветку"
+#: merge-recursive.c:1143
+msgid "renamed"
+msgstr "переименовано"
 
-#: remote.c:1686
+#: merge-recursive.c:1200
 #, c-format
-msgid "no such branch: '%s'"
-msgstr "нет такой ветки: «%s»"
+msgid "%s is a directory in %s adding as %s instead"
+msgstr "%s — это каталог в %s, добавляем как %s вместо этого"
 
-#: remote.c:1689
+#: merge-recursive.c:1225
 #, c-format
-msgid "no upstream configured for branch '%s'"
-msgstr "вышестоящая ветка не настроена для ветки «%s»"
+msgid ""
+"CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename "
+"\"%s\"->\"%s\" in \"%s\"%s"
+msgstr "КОНФЛИКТ (переименование/переименование): Переименование «%s»→«%s» в ветке «%s» и переименование «%s»→«%s» в ветке «%s»%s"
 
-#: remote.c:1695
-#, c-format
-msgid "upstream branch '%s' not stored as a remote-tracking branch"
-msgstr "вышестоящая ветка «%s» не сохранена как отслеживаемая ветка"
+#: merge-recursive.c:1230
+msgid " (left unresolved)"
+msgstr " (оставлено неразрешенным)"
 
-#: remote.c:1710
+#: merge-recursive.c:1292
 #, c-format
-msgid "push destination '%s' on remote '%s' has no local tracking branch"
-msgstr "назнаÑ\87ение Ð´Ð»Ñ\8f Ð¾Ñ\82пÑ\80авки Â«%s» Ð½Ð° Ð²Ð½ÐµÑ\88нем Ñ\81еÑ\80веÑ\80е Â«%s» Ð½Ðµ Ð¸Ð¼ÐµÐµÑ\82 Ð»Ð¾ÐºÐ°Ð»Ñ\8cной Ð¾Ñ\82Ñ\81леживаемой Ð²ÐµÑ\82ки"
+msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s"
+msgstr "Ð\9aÐ\9eÐ\9dФÐ\9bÐ\98Ð\9aТ (пеÑ\80еименование/пеÑ\80еименование): Ð\9fеÑ\80еименование Â«%s»â\86\92«%s» Ð² Ð²ÐµÑ\82ке Â«%s» Ð¸ Ð¿ÐµÑ\80еименование Â«%s»â\86\92«%s» Ð² Ð²ÐµÑ\82ке Â«%s»"
 
-#: remote.c:1725
+#: merge-recursive.c:1325
 #, c-format
-msgid "branch '%s' has no remote for pushing"
-msgstr "веÑ\82ка Â«%s» Ð½Ðµ Ð¸Ð¼ÐµÐµÑ\82 Ð²Ð½ÐµÑ\88него Ñ\81еÑ\80веÑ\80а Ð´Ð»Ñ\8f Ð¾Ñ\82пÑ\80авки"
+msgid "Renaming %s to %s and %s to %s instead"
+msgstr "Ð\9fеÑ\80еименовÑ\8bваÑ\8e %s Ð² %s Ð¸ %s Ð² %s Ð²Ð¼ÐµÑ\81Ñ\82о Ñ\8dÑ\82ого"
 
-#: remote.c:1736
+#: merge-recursive.c:1531
 #, c-format
-msgid "push refspecs for '%s' do not include '%s'"
-msgstr "спецификации пути для отправки «%s» не включают в себя «%s»"
-
-#: remote.c:1749
-msgid "push has no destination (push.default is 'nothing')"
-msgstr "отправка не имеет точки назначения (push.default выставлен в «nothing»)"
-
-#: remote.c:1771
-msgid "cannot resolve 'simple' push to a single destination"
-msgstr "не удалось выполнить «simple» отправку в единственную точку назначения"
+msgid "CONFLICT (rename/add): Rename %s->%s in %s. %s added in %s"
+msgstr "КОНФЛИКТ (переименование/добавление): Переименование «%s»→«%s» в ветке «%s» и добавление «%s» в ветке «%s»"
 
-#: remote.c:2073
+#: merge-recursive.c:1546
 #, c-format
-msgid "Your branch is based on '%s', but the upstream is gone.\n"
-msgstr "Ваша ветка базируется на «%s», но вышестоящий репозиторий исчез.\n"
-
-#: remote.c:2077
-msgid "  (use \"git branch --unset-upstream\" to fixup)\n"
-msgstr "(для исправления запустите «git branch --unset-upstream»)\n"
+msgid "Adding merged %s"
+msgstr "Добавление слитого %s"
 
-#: remote.c:2080
+#: merge-recursive.c:1553 merge-recursive.c:1766
 #, c-format
-msgid "Your branch is up-to-date with '%s'.\n"
-msgstr "Ð\92аÑ\88а Ð²ÐµÑ\82ка Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð° Ð² Ñ\81ооÑ\82веÑ\82Ñ\81Ñ\82вии Ñ\81 Â«%s».\n"
+msgid "Adding as %s instead"
+msgstr "Ð\94обавление Ð²Ð¼ÐµÑ\81Ñ\82о Ñ\8dÑ\82ого ÐºÐ°Ðº %s"
 
-#: remote.c:2084
+#: merge-recursive.c:1610
 #, c-format
-msgid "Your branch is ahead of '%s' by %d commit.\n"
-msgid_plural "Your branch is ahead of '%s' by %d commits.\n"
-msgstr[0] "Ваша ветка опережает «%s» на %d коммит.\n"
-msgstr[1] "Ваша ветка опережает «%s» на %d коммита.\n"
-msgstr[2] "Ваша ветка опережает «%s» на %d коммитов.\n"
-msgstr[3] "Ваша ветка опережает «%s» на %d коммитов.\n"
-
-#: remote.c:2090
-msgid "  (use \"git push\" to publish your local commits)\n"
-msgstr "  (используйте «git push», чтобы опубликовать ваши локальные коммиты)\n"
+msgid "cannot read object %s"
+msgstr "невозможно прочитать объект «%s»"
 
-#: remote.c:2093
+#: merge-recursive.c:1613
 #, c-format
-msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n"
-msgid_plural ""
-"Your branch is behind '%s' by %d commits, and can be fast-forwarded.\n"
-msgstr[0] "Ваша ветка отстает от «%s» на %d коммит и может быть перемотана вперед.\n"
-msgstr[1] "Ваша ветка отстает от «%s» на %d коммита и может быть перемотана вперед.\n"
-msgstr[2] "Ваша ветка отстает от «%s» на %d коммитов и может быть перемотана вперед.\n"
-msgstr[3] "Ваша ветка отстает от «%s» на %d коммитов и может быть перемотана вперед.\n"
+msgid "object %s is not a blob"
+msgstr "объект %s не является двоичным объектом"
 
-#: remote.c:2101
-msgid "  (use \"git pull\" to update your local branch)\n"
-msgstr "  (используйте «git pull», чтобы обновить вашу локальную ветку)\n"
+#: merge-recursive.c:1666
+msgid "modify"
+msgstr "изменение"
 
-#: remote.c:2104
-#, c-format
-msgid ""
-"Your branch and '%s' have diverged,\n"
-"and have %d and %d different commit each, respectively.\n"
-msgid_plural ""
-"Your branch and '%s' have diverged,\n"
-"and have %d and %d different commits each, respectively.\n"
-msgstr[0] "Ваша ветка и «%s» разделились\nи теперь имеют %d и %d разный коммит в каждой соответственно.\n"
-msgstr[1] "Ваша ветка и «%s» разделились\nи теперь имеют %d и %d разных коммита в каждой соответственно.\n"
-msgstr[2] "Ваша ветка и «%s» разделились\nи теперь имеют %d и %d разных коммитов в каждой соответственно.\n"
-msgstr[3] "Ваша ветка и «%s» разделились\nи теперь имеют %d и %d разных коммитов в каждой соответственно.\n"
+#: merge-recursive.c:1666
+msgid "modified"
+msgstr "изменено"
 
-#: remote.c:2114
-msgid "  (use \"git pull\" to merge the remote branch into yours)\n"
-msgstr "  (используйте «git pull», чтобы слить внешнюю ветку в вашу)\n"
+#: merge-recursive.c:1676
+msgid "content"
+msgstr "содержимое"
 
-#: revision.c:2132
-msgid "your current branch appears to be broken"
-msgstr "поÑ\85оже, Ð²Ð°Ñ\88а Ñ\82екÑ\83Ñ\89аÑ\8f Ð²ÐµÑ\82ка Ð¿Ð¾Ð²Ñ\80еждена"
+#: merge-recursive.c:1683
+msgid "add/add"
+msgstr "добавление/добавление"
 
-#: revision.c:2135
+#: merge-recursive.c:1718
 #, c-format
-msgid "your current branch '%s' does not have any commits yet"
-msgstr "ваша текущая ветка «%s» еще не содержит ни одного коммита"
-
-#: revision.c:2329
-msgid "--first-parent is incompatible with --bisect"
-msgstr "опцию --first-parent нельзя использовать одновременно с --bisect"
-
-#: run-command.c:92
-msgid "open /dev/null failed"
-msgstr "сбой открытия /dev/null"
+msgid "Skipped %s (merged same as existing)"
+msgstr "Пропуск %s (слиты одинаковые изменения как существующие)"
 
-#: run-command.c:94
+#: merge-recursive.c:1732
 #, c-format
-msgid "dup2(%d,%d) failed"
-msgstr "dup2(%d,%d) сбой"
-
-#: send-pack.c:298
-msgid "failed to sign the push certificate"
-msgstr "сбой подписания сертификата отправки"
-
-#: send-pack.c:411
-msgid "the receiving end does not support --signed push"
-msgstr "принимающая сторона не поддерживает отправку с опцией --signed"
+msgid "Auto-merging %s"
+msgstr "Автослияние %s"
 
-#: send-pack.c:413
-msgid ""
-"not sending a push certificate since the receiving end does not support "
-"--signed push"
-msgstr "не отправляем сертификат для отправки, так как принимающая сторона не поддерживает отправку с опцией --signed"
+#: merge-recursive.c:1736 git-submodule.sh:924
+msgid "submodule"
+msgstr "подмодуль"
 
-#: send-pack.c:425
-msgid "the receiving end does not support --atomic push"
-msgstr "принимающая сторона не поддерживает отправку с опцией --atomic"
+#: merge-recursive.c:1737
+#, c-format
+msgid "CONFLICT (%s): Merge conflict in %s"
+msgstr "КОНФЛИКТ (%s): Конфликт слияния в %s"
 
-#: send-pack.c:430
-msgid "the receiving end does not support push options"
-msgstr "принимающая сторона не поддерживает отправку с опциями"
+#: merge-recursive.c:1831
+#, c-format
+msgid "Removing %s"
+msgstr "Удаление %s"
 
-#: sequencer.c:174
-msgid ""
-"after resolving the conflicts, mark the corrected paths\n"
-"with 'git add <paths>' or 'git rm <paths>'"
-msgstr "после разрешения конфликтов, пометьте исправленные пути\nс помощью «git add <пути>» или «git rm <пути>»"
+#: merge-recursive.c:1857
+msgid "file/directory"
+msgstr "файл/каталог"
 
-#: sequencer.c:177
-msgid ""
-"after resolving the conflicts, mark the corrected paths\n"
-"with 'git add <paths>' or 'git rm <paths>'\n"
-"and commit the result with 'git commit'"
-msgstr "после разрешения конфликтов, пометьте исправленные пути\nс помощью «git add <пути>» или «git rm <пути>»\nи сделайте коммит с помощью «git commit»"
+#: merge-recursive.c:1863
+msgid "directory/file"
+msgstr "каталог/файл"
 
-#: sequencer.c:190 sequencer.c:841 sequencer.c:924
+#: merge-recursive.c:1868
 #, c-format
-msgid "Could not write to %s"
-msgstr "Не удалось записать в %s"
+msgid ""
+"CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s"
+msgstr "КОНФЛИКТ (%s): Уже существует каталог с именем «%s» в «%s». Добавление «%s» как «%s»"
 
-#: sequencer.c:193 sequencer.c:843 sequencer.c:928
+#: merge-recursive.c:1877
 #, c-format
-msgid "Error wrapping up %s."
-msgstr "Ð\9eÑ\88ибка Ð¾Ð±Ð¾Ñ\80аÑ\87иваниÑ\8f %s."
+msgid "Adding %s"
+msgstr "Ð\94обавление %s"
 
-#: sequencer.c:208
-msgid "Your local changes would be overwritten by cherry-pick."
-msgstr "Ð\92аÑ\88и Ð»Ð¾ÐºÐ°Ð»Ñ\8cнÑ\8bе Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ðµ Ð±Ñ\83дÑ\83Ñ\82 Ð¿ÐµÑ\80езапиÑ\81анÑ\8b ÐºÐ¾Ð¿Ð¸ÐµÐ¹ ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82а."
+#: merge-recursive.c:1914
+msgid "Already up-to-date!"
+msgstr "Уже Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¾!"
 
-#: sequencer.c:210
-msgid "Your local changes would be overwritten by revert."
-msgstr "Ваши локальные изменения будут перезаписаны обратными изменениями коммита."
+#: merge-recursive.c:1923
+#, c-format
+msgid "merging of trees %s and %s failed"
+msgstr "сбой слияния деревьев «%s» и «%s»"
 
-#: sequencer.c:213
-msgid "Commit your changes or stash them to proceed."
-msgstr "СделайÑ\82е ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82 Ð¸Ð»Ð¸ Ñ\81пÑ\80Ñ\8fÑ\87Ñ\8cÑ\82е Ð²Ð°Ñ\88и Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f Ð´Ð»Ñ\8f Ð¿Ñ\80одолжениÑ\8f."
+#: merge-recursive.c:2006
+msgid "Merging:"
+msgstr "СлиÑ\8fние:"
 
-#: sequencer.c:228
+#: merge-recursive.c:2019
 #, c-format
-msgid "%s: fast-forward"
-msgstr "%s: перемотка вперед"
+msgid "found %u common ancestor:"
+msgid_plural "found %u common ancestors:"
+msgstr[0] "найден %u общий предок:"
+msgstr[1] "найдено %u общих предка:"
+msgstr[2] "найдено %u общих предков:"
+msgstr[3] "найдено %u общих предков:"
 
-#. TRANSLATORS: %s will be "revert" or "cherry-pick"
-#: sequencer.c:303
-#, c-format
-msgid "%s: Unable to write new index file"
-msgstr "%s: Не удалось записать файл индекса"
+#: merge-recursive.c:2058
+msgid "merge returned no commit"
+msgstr "слияние не вернуло коммит"
 
-#: sequencer.c:321
-msgid "Could not resolve HEAD commit\n"
-msgstr "Не удалось определить HEAD коммит\n"
+#: merge-recursive.c:2121
+#, c-format
+msgid "Could not parse object '%s'"
+msgstr "Не удалось разобрать объект «%s»"
 
-#: sequencer.c:341
-msgid "Unable to update cache tree\n"
-msgstr "Ð\9dе Ñ\83далоÑ\81Ñ\8c Ð¾Ð±Ð½Ð¾Ð²Ð¸Ñ\82Ñ\8c Ð´ÐµÑ\80ево ÐºÑ\8dÑ\88а\n"
+#: merge-recursive.c:2135 builtin/merge.c:641 builtin/merge.c:788
+msgid "Unable to write index."
+msgstr "Ð\9dе Ñ\83даеÑ\82Ñ\81Ñ\8f Ð·Ð°Ð¿Ð¸Ñ\81аÑ\82Ñ\8c Ð¸Ð½Ð´ÐµÐºÑ\81."
 
-#: sequencer.c:393
+#: notes-merge.c:273
 #, c-format
-msgid "Could not parse commit %s\n"
-msgstr "Не удалось разобрать коммит %s\n"
+msgid ""
+"You have not concluded your previous notes merge (%s exists).\n"
+"Please, use 'git notes merge --commit' or 'git notes merge --abort' to commit/abort the previous merge before you start a new notes merge."
+msgstr "Вы не закончили предыдущее слияние заметок (%s существует).\nЗапустите «git notes merge --commit» или «git notes merge --abort» для коммита или отмены предыдущего слияния и запуска нового слияния заметок."
 
-#: sequencer.c:398
+#: notes-merge.c:280
 #, c-format
-msgid "Could not parse parent commit %s\n"
-msgstr "Ð\9dе Ñ\83далоÑ\81Ñ\8c Ñ\80азобÑ\80аÑ\82Ñ\8c Ñ\80одиÑ\82елÑ\8cÑ\81кÑ\83Ñ\8e ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82 %s\n"
+msgid "You have not concluded your notes merge (%s exists)."
+msgstr "Ð\92Ñ\8b Ð½Ðµ Ð·Ð°ÐºÐ¾Ð½Ñ\87или Ð¿Ñ\80едÑ\8bдÑ\83Ñ\89ее Ñ\81лиÑ\8fние Ð·Ð°Ð¼ÐµÑ\82ок (%s Ñ\81Ñ\83Ñ\89еÑ\81Ñ\82вÑ\83еÑ\82)."
 
-#: sequencer.c:463
-msgid "Your index file is unmerged."
-msgstr "Ð\92аÑ\88 Ñ\84айл Ð¸Ð½Ð´ÐµÐºÑ\81а Ð½Ðµ Ñ\81лиÑ\82."
+#: notes-utils.c:41
+msgid "Cannot commit uninitialized/unreferenced notes tree"
+msgstr "Ð\9dелÑ\8cзÑ\8f Ð·Ð°ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82иÑ\82Ñ\8c Ð½ÐµÐ¸Ð½Ð¸Ñ\86иализиÑ\80ованное Ð¸Ð»Ð¸ Ð½Ðµ Ð¸Ð¼ÐµÑ\8eÑ\89ее Ñ\81Ñ\81Ñ\8bлок Ð´ÐµÑ\80ево Ð·Ð°Ð¼ÐµÑ\82ок"
 
-#: sequencer.c:482
+#: notes-utils.c:100
 #, c-format
-msgid "Commit %s is a merge but no -m option was given."
-msgstr "Ð\9aоммиÑ\82 %s â\80\94 Ñ\8dÑ\82о ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82\81лиÑ\8fние, Ð½Ð¾ Ð¾Ð¿Ñ\86иÑ\8f -m Ð½Ðµ Ñ\83казана."
+msgid "Bad notes.rewriteMode value: '%s'"
+msgstr "Ð\9dепÑ\80авилÑ\8cное Ð·Ð½Ð°Ñ\87ение notes.rewriteMode: Â«%s»"
 
-#: sequencer.c:490
+#: notes-utils.c:110
 #, c-format
-msgid "Commit %s does not have parent %d"
-msgstr "У ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82а %s Ð½ÐµÑ\82 Ð¿Ñ\80едка %d"
+msgid "Refusing to rewrite notes in %s (outside of refs/notes/)"
+msgstr "Ð\9eÑ\82каз Ð² Ð¿ÐµÑ\80езапиÑ\81и Ð·Ð°Ð¼ÐµÑ\82ок Ð² %s (за Ð¿Ñ\80еделами refs/notes/)"
 
-#: sequencer.c:494
+#. TRANSLATORS: The first %s is the name of the
+#. environment variable, the second %s is its value
+#: notes-utils.c:137
 #, c-format
-msgid "Mainline was specified but commit %s is not a merge."
-msgstr "Ð\9eÑ\81новнаÑ\8f Ð²ÐµÑ\82ка Ñ\83казана, Ð½Ð¾ ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82 %s Ð½Ðµ Ñ\8fвлÑ\8fеÑ\82Ñ\81Ñ\8f Ñ\81лиÑ\8fнием."
+msgid "Bad %s value: '%s'"
+msgstr "Ð\9dепÑ\80авилÑ\8cное Ð·Ð½Ð°Ñ\87ение Ð¿ÐµÑ\80еменной %s: Â«%s»"
 
-#. TRANSLATORS: The first %s will be "revert" or
-#. "cherry-pick", the second %s a SHA1
-#: sequencer.c:507
+#: object.c:242
 #, c-format
-msgid "%s: cannot parse parent commit %s"
-msgstr "%s: не удалось разобрать родительский коммит для %s"
+msgid "unable to parse object: %s"
+msgstr "не удалось разобрать объект: %s"
+
+#: parse-options.c:572
+msgid "..."
+msgstr "…"
 
-#: sequencer.c:511
+#: parse-options.c:590
 #, c-format
-msgid "Cannot get commit message for %s"
-msgstr "Ð\9dе Ñ\83далоÑ\81Ñ\8c Ð¿Ð¾Ð»Ñ\83Ñ\87иÑ\82Ñ\8c Ñ\81ообÑ\89ение ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82а Ð´Ð»Ñ\8f %s"
+msgid "usage: %s"
+msgstr "иÑ\81полÑ\8cзование: %s"
 
-#: sequencer.c:597
+#. TRANSLATORS: the colon here should align with the
+#. one in "usage: %s" translation
+#: parse-options.c:594
 #, c-format
-msgid "could not revert %s... %s"
-msgstr "не удалось обратить изменения коммита %s… %s"
+msgid "   or: %s"
+msgstr "          или: %s"
 
-#: sequencer.c:598
+#: parse-options.c:597
 #, c-format
-msgid "could not apply %s... %s"
-msgstr "не удалось применить коммит %s… %s"
+msgid "    %s"
+msgstr "            %s"
 
-#: sequencer.c:633
-msgid "empty commit set passed"
-msgstr "передан пустой набор коммитов"
+#: parse-options.c:631
+msgid "-NUM"
+msgstr "-КОЛИЧЕСТВО"
 
-#: sequencer.c:641
+#: parse-options-cb.c:108
 #, c-format
-msgid "git %s: failed to read the index"
-msgstr "git %s: сбой чтения индекса"
+msgid "malformed object name '%s'"
+msgstr "Неправильное имя объекта «%s»"
 
-#: sequencer.c:645
+#: path.c:826
 #, c-format
-msgid "git %s: failed to refresh the index"
-msgstr "git %s: сбой обновления индекса"
-
-#: sequencer.c:705
-msgid "Cannot revert during another revert."
-msgstr "Нельзя обратить изменения коммита во время другого процесса обращения коммита."
+msgid "Could not make %s writable by group"
+msgstr "Не удалось предоставить доступ к %s на запись"
 
-#: sequencer.c:706
-msgid "Cannot revert during a cherry-pick."
-msgstr "Ð\9dелÑ\8cзÑ\8f Ð¾Ð±Ñ\80аÑ\82иÑ\82Ñ\8c Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82а Ð²Ð¾ Ð²Ñ\80емÑ\8f ÐºÐ¾Ð¿Ð¸Ñ\80ованиÑ\8f ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82а."
+#: pathspec.c:133
+msgid "global 'glob' and 'noglob' pathspec settings are incompatible"
+msgstr "глобалÑ\8cнÑ\8bе Ð¾Ð¿Ñ\86ии Ñ\81пеÑ\86иÑ\84икаÑ\86ии Ð¿Ñ\83Ñ\82и Â«glob» Ð¸ Â«noglob» Ð½ÐµÐ»Ñ\8cзÑ\8f Ð¸Ñ\81полÑ\8cзоваÑ\82Ñ\8c Ð¾Ð´Ð½Ð¾Ð²Ñ\80еменно"
 
-#: sequencer.c:709
-msgid "Cannot cherry-pick during a revert."
-msgstr "Нельзя скопировать коммит во время процесса обращения коммита."
+#: pathspec.c:143
+msgid ""
+"global 'literal' pathspec setting is incompatible with all other global "
+"pathspec settings"
+msgstr "глобальная опция спецификации пути «literal» не совместима с другими глобальными спецификаторами доступа"
 
-#: sequencer.c:710
-msgid "Cannot cherry-pick during another cherry-pick."
-msgstr "Ð\9dелÑ\8cзÑ\8f Ñ\81копиÑ\80оваÑ\82Ñ\8c ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82 Ð²Ð¾ Ð²Ñ\80емÑ\8f Ð´Ñ\80Ñ\83гого Ð¿Ñ\80оÑ\86еÑ\81Ñ\81а ÐºÐ¾Ð¿Ð¸Ñ\80ованиÑ\8f ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82а."
+#: pathspec.c:177
+msgid "invalid parameter for pathspec magic 'prefix'"
+msgstr "непÑ\80авилÑ\8cнÑ\8bй Ð¿Ð°Ñ\80амеÑ\82Ñ\80 Ð´Ð»Ñ\8f Ð¼Ð°Ð³Ð¸Ñ\87еÑ\81кого Ñ\81лова Â«prefix» Ð² Ñ\81пеÑ\86иÑ\84икаÑ\86ии Ð¿Ñ\83Ñ\82и "
 
-#: sequencer.c:732
+#: pathspec.c:183
 #, c-format
-msgid "Could not parse line %d."
-msgstr "Не удалось разобрать строку %d."
-
-#: sequencer.c:737
-msgid "No commits parsed."
-msgstr "Коммиты не разобраны."
+msgid "Invalid pathspec magic '%.*s' in '%s'"
+msgstr "неправильное магическое слово «%.*s» в спецификации пути «%s»"
 
-#: sequencer.c:749
+#: pathspec.c:187
 #, c-format
-msgid "Could not open %s"
-msgstr "Ð\9dе Ñ\83далоÑ\81Ñ\8c Ð¾Ñ\82кÑ\80Ñ\8bÑ\82Ñ\8c %s"
+msgid "Missing ')' at the end of pathspec magic in '%s'"
+msgstr "Ð\9fÑ\80опÑ\83Ñ\89ено Â«)» Ð² ÐºÐ¾Ð½Ñ\86е Ð¼Ð°Ð³Ð¸Ñ\87еÑ\81кого Ñ\81лова Ñ\81пеÑ\86иÑ\84икаÑ\86ии Ð¿Ñ\83Ñ\82и Â«%s»"
 
-#: sequencer.c:753
+#: pathspec.c:205
 #, c-format
-msgid "Could not read %s."
-msgstr "Не удалось прочитать %s."
+msgid "Unimplemented pathspec magic '%c' in '%s'"
+msgstr "Нереализованное магическое слово «%c» спецификации пути «%s»"
 
-#: sequencer.c:760
+#: pathspec.c:230
 #, c-format
-msgid "Unusable instruction sheet: %s"
-msgstr "Непригодная для использования карта с инструкциями: %s"
+msgid "%s: 'literal' and 'glob' are incompatible"
+msgstr "%s: «literal» и «glob» не совместимы"
 
-#: sequencer.c:790
+#: pathspec.c:241
 #, c-format
-msgid "Invalid key: %s"
-msgstr "Недействительный ключ: %s"
+msgid "%s: '%s' is outside repository"
+msgstr "%s: «%s» вне репозитория"
 
-#: sequencer.c:793 builtin/pull.c:50 builtin/pull.c:52
+#: pathspec.c:291
 #, c-format
-msgid "Invalid value for %s: %s"
-msgstr "Ð\9dепÑ\80авилÑ\8cное Ð·Ð½Ð°Ñ\87ение %s: %s"
+msgid "Pathspec '%s' is in submodule '%.*s'"
+msgstr "СпеÑ\86иÑ\84икаÑ\86иÑ\8f Ð¿Ñ\83Ñ\82и Â«%s» Ð² Ð¿Ð¾Ð´Ð¼Ð¾Ð´Ñ\83ле Â«%.*s»"
 
-#: sequencer.c:803
+#: pathspec.c:353
 #, c-format
-msgid "Malformed options sheet: %s"
-msgstr "Повреждённая карта с опциями: %s"
-
-#: sequencer.c:822
-msgid "a cherry-pick or revert is already in progress"
-msgstr "копирование или обращение изменений коммита уже выполняются"
+msgid "%s: pathspec magic not supported by this command: %s"
+msgstr "%s: магические слова в спецификации пути не поддерживаются командой: %s"
 
-#: sequencer.c:823
-msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
-msgstr "попробуйте «git cherry-pick (--continue | --quit | --abort)»"
+#: pathspec.c:408
+msgid ""
+"empty strings as pathspecs will be made invalid in upcoming releases. please"
+" use . instead if you meant to match all paths"
+msgstr "пустые строки как спецификаторы пути будут сделаны недопустимыми в следующих версиях. используйте вместо них «.», что значит соотвествие всем путям"
 
-#: sequencer.c:827
+#: pathspec.c:440
 #, c-format
-msgid "Could not create sequencer directory %s"
-msgstr "Не удалось создать каталог для указателя следования коммитов %s"
-
-#: sequencer.c:862 sequencer.c:998
-msgid "no cherry-pick or revert in progress"
-msgstr "копирование или обращение изменений коммита уже выполняются"
+msgid "pathspec '%s' is beyond a symbolic link"
+msgstr "спецификация пути «%s» находится за символической ссылкой"
 
-#: sequencer.c:864
-msgid "cannot resolve HEAD"
-msgstr "не удалось определить HEAD"
+#: pathspec.c:449
+msgid ""
+"There is nothing to exclude from by :(exclude) patterns.\n"
+"Perhaps you forgot to add either ':/' or '.' ?"
+msgstr "Не указан шаблон для исключения с помощью :(exclude).\nВозможно, вы забыли «:/» или «.» ?"
 
-#: sequencer.c:866 sequencer.c:900
-msgid "cannot abort from a branch yet to be born"
-msgstr "нельзя отменить изменения с ветки, которая еще не создана"
+#: pretty.c:971
+msgid "unable to parse --pretty format"
+msgstr "не удалось разобрать формат для --pretty"
 
-#: sequencer.c:886 builtin/fetch.c:724 builtin/fetch.c:970
+#: read-cache.c:1315
 #, c-format
-msgid "cannot open %s"
-msgstr "не удалось открыть %s"
+msgid ""
+"index.version set, but the value is invalid.\n"
+"Using version %i"
+msgstr "index.version указан, но значение недействительное.\nИспользую версию %i"
 
-#: sequencer.c:888
+#: read-cache.c:1325
 #, c-format
-msgid "cannot read %s: %s"
-msgstr "не удалось прочитать %s: %s"
+msgid ""
+"GIT_INDEX_VERSION set, but the value is invalid.\n"
+"Using version %i"
+msgstr "GIT_INDEX_VERSION указан, но значение недействительное.\nИспользую версию %i"
 
-#: sequencer.c:889
-msgid "unexpected end of file"
-msgstr "неожиданный конец файла"
+#: refs.c:576 builtin/merge.c:840
+#, c-format
+msgid "Could not open '%s' for writing"
+msgstr "Не удалось открыть «%s» для записи"
 
-#: sequencer.c:895
+#: refs/files-backend.c:2481
 #, c-format
-msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
-msgstr "сохраненный файл с HEAD перед копированием коммита «%s» поврежден"
+msgid "could not delete reference %s: %s"
+msgstr "не удалось удалить ссылку %s: %s"
 
-#: sequencer.c:921
+#: refs/files-backend.c:2484
 #, c-format
-msgid "Could not format %s."
-msgstr "Ð\9dе Ñ\83далоÑ\81Ñ\8c Ð¾Ñ\82Ñ\84оÑ\80маÑ\82иÑ\80оваÑ\82Ñ\8c %s."
+msgid "could not delete references: %s"
+msgstr "не Ñ\83далоÑ\81Ñ\8c Ñ\83далиÑ\82Ñ\8c Ñ\81Ñ\81Ñ\8bлки: %s"
 
-#: sequencer.c:1066
+#: refs/files-backend.c:2493
 #, c-format
-msgid "%s: can't cherry-pick a %s"
-msgstr "%s: не удалось скопировать коммит %s"
+msgid "could not remove reference %s"
+msgstr "не удалось удалить ссылки %s"
 
-#: sequencer.c:1069
+#: ref-filter.c:55
 #, c-format
-msgid "%s: bad revision"
-msgstr "%s: плохая редакция"
+msgid "expected format: %%(color:<color>)"
+msgstr "ожидаемый формат: %%(color:<color>)"
 
-#: sequencer.c:1102
-msgid "Can't revert as initial commit"
-msgstr "Нельзя обратить изменения изначального коммита"
+#: ref-filter.c:57
+#, c-format
+msgid "unrecognized color: %%(color:%s)"
+msgstr "неопознанный цвет: %%(color:%s)"
 
-#: setup.c:160
+#: ref-filter.c:71
 #, c-format
-msgid ""
-"%s: no such path in the working tree.\n"
-"Use 'git <command> -- <path>...' to specify paths that do not exist locally."
-msgstr "%s: нет такого пути в рабочем каталоге.\nИспользуйте «git <команда> -- <путь>…» для указания путей, которые не существуют локально."
+msgid "unrecognized format: %%(%s)"
+msgstr "неопознанный формат: %%(%s)"
 
-#: setup.c:173
+#: ref-filter.c:77
 #, c-format
-msgid ""
-"ambiguous argument '%s': unknown revision or path not in the working tree.\n"
-"Use '--' to separate paths from revisions, like this:\n"
-"'git <command> [<revision>...] -- [<file>...]'"
-msgstr "неоднозначный аргумент «%s»: неизвестная редакция или не путь в рабочем каталоге.\nИспользуйте «--» для отделения путей от редакций, вот так:\n«git <команда> [<редакция>…] -- [<файл>…]»"
+msgid "%%(body) does not take arguments"
+msgstr "%%(body) не принимает аргументов"
 
-#: setup.c:223
+#: ref-filter.c:84
 #, c-format
-msgid ""
-"ambiguous argument '%s': both revision and filename\n"
-"Use '--' to separate paths from revisions, like this:\n"
-"'git <command> [<revision>...] -- [<file>...]'"
-msgstr "неоднозначный аргумент «%s»: является одновременно и редакцией и именем файла.\nИспользуйте «--» для отделения путей от редакций, вот так:\n«git <команда> [<редакция>…] -- [<файл>…]»"
+msgid "%%(subject) does not take arguments"
+msgstr "%%(subject) не принимает аргументов"
 
-#: setup.c:248 builtin/apply.c:3362 builtin/apply.c:3373 builtin/apply.c:3419
+#: ref-filter.c:101
 #, c-format
-msgid "failed to read %s"
-msgstr "не Ñ\83далоÑ\81Ñ\8c Ð¿Ñ\80оÑ\87иÑ\82аÑ\82Ñ\8c %s"
+msgid "positive value expected contents:lines=%s"
+msgstr "положиÑ\82елÑ\8cное Ð·Ð½Ð°Ñ\87ение Ð¾Ð¶Ð¸Ð´Ð°ÐµÑ\82 Ñ\81одеÑ\80жимое:lines=%s"
 
-#: setup.c:468
+#: ref-filter.c:103
 #, c-format
-msgid "Expected git repo version <= %d, found %d"
-msgstr "Ð\9eжидаемаÑ\8f Ð²ÐµÑ\80Ñ\81иÑ\8f git Ñ\80епозиÑ\82оÑ\80иÑ\8f <= %d, Ð° Ð¾Ð±Ð½Ð°Ñ\80Ñ\83жена %d"
+msgid "unrecognized %%(contents) argument: %s"
+msgstr "неопознаннÑ\8bй Ð°Ñ\80гÑ\83менÑ\82 %%(contents): %s"
 
-#: setup.c:476
-msgid "unknown repository extensions found:"
-msgstr "обнаружены неизвестные расширения репозитория:"
+#: ref-filter.c:113
+#, c-format
+msgid "unrecognized %%(objectname) argument: %s"
+msgstr "неопознанный аргумент %%(objectname): %s"
 
-#: setup.c:762
+#: ref-filter.c:135
 #, c-format
-msgid "Not a git repository (or any of the parent directories): %s"
-msgstr "Ð\9dе Ð½Ð°Ð¹Ð´ÐµÐ½ git Ñ\80епозиÑ\82оий (или Ð¾Ð´Ð¸Ð½ Ð¸Ð· ÐµÐ³Ð¾ ÐºÐ°Ñ\82алогов): %s"
+msgid "expected format: %%(align:<width>,<position>)"
+msgstr "ожидаемÑ\8bй Ñ\84оÑ\80маÑ\82: %%(align:<width>,<position>)"
 
-#: setup.c:764 setup.c:915 builtin/index-pack.c:1641
-msgid "Cannot come back to cwd"
-msgstr "Не удалось вернуться в текущий рабочий каталог"
+#: ref-filter.c:147
+#, c-format
+msgid "unrecognized position:%s"
+msgstr "неопознанная позиция:%s"
 
-#: setup.c:845
-msgid "Unable to read current working directory"
-msgstr "Не удалось прочитать текущий рабочий каталог"
+#: ref-filter.c:151
+#, c-format
+msgid "unrecognized width:%s"
+msgstr "неопознанная ширина:%s"
 
-#: setup.c:920
+#: ref-filter.c:157
 #, c-format
-msgid ""
-"Not a git repository (or any parent up to mount point %s)\n"
-"Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set)."
-msgstr "Не найден git репозитоий (или один из его каталогов вплоть до точки монтирования %s)\nОстанавливаю поиск на границе файловой системы (так как GIT_DISCOVERY_ACROSS_FILESYSTEM не установлен)."
+msgid "unrecognized %%(align) argument: %s"
+msgstr "неопознанный аргумент %%(align): %s"
 
-#: setup.c:927
+#: ref-filter.c:161
 #, c-format
-msgid "Cannot change to '%s/..'"
-msgstr "Ð\9fеÑ\80ейÑ\82и Ð² Â«%s/..»"
+msgid "positive width expected with the %%(align) atom"
+msgstr "ожидаеÑ\82Ñ\81Ñ\8f Ð¿Ð¾Ð»Ð¾Ð¶Ð¸Ñ\82елÑ\8cнаÑ\8f Ñ\88иÑ\80ина Ñ\81 Ñ\83казанием Ñ\87аÑ\81Ñ\82иÑ\86Ñ\8b %%(align)"
 
-#: setup.c:989
+#: ref-filter.c:244
 #, c-format
-msgid ""
-"Problem with core.sharedRepository filemode value (0%.3o).\n"
-"The owner of files must always have read and write permissions."
-msgstr "Проблема со значением режима доступа к файлу core.sharedRepository (0%.3o).\nВладелец файлов должен всегда иметь права на чтение и на запись."
+msgid "malformed field name: %.*s"
+msgstr "неправильное имя поля: %.*s"
 
-#: sha1_file.c:1046
-msgid "offset before end of packfile (broken .idx?)"
-msgstr "сдвиг до конца файла пакета (возможно, повреждён файл .idx?)"
+#: ref-filter.c:270
+#, c-format
+msgid "unknown field name: %.*s"
+msgstr "неизвестное имя поля: %.*s"
 
-#: sha1_file.c:2434
+#: ref-filter.c:372
 #, c-format
-msgid "offset before start of pack index for %s (corrupt index?)"
-msgstr "Ñ\81двиг Ð´Ð¾ Ð½Ð°Ñ\87ала Ð¸Ð½Ð´ÐµÐºÑ\81а Ð¿Ð°ÐºÐµÑ\82а Ð´Ð»Ñ\8f %s (повÑ\80еждÑ\91н Ð¸Ð½Ð´ÐµÐºÑ\81?)"
+msgid "format: %%(end) atom used without corresponding atom"
+msgstr "Ñ\84оÑ\80маÑ\82: Ñ\87аÑ\81Ñ\82иÑ\86а %%(end) Ð¸Ñ\81полÑ\8cзована Ð±ÐµÐ· Ñ\81ооÑ\82веÑ\82Ñ\81Ñ\82вÑ\83Ñ\8eÑ\89ей Ñ\87аÑ\81Ñ\82иÑ\86Ñ\8b"
 
-#: sha1_file.c:2438
+#: ref-filter.c:424
 #, c-format
-msgid "offset beyond end of pack index for %s (truncated index?)"
-msgstr "сдвиг за пределами индекса пакета для %s (обрезан индекс?)"
+msgid "malformed format string %s"
+msgstr "неправильная строка формата %s"
 
-#: sha1_name.c:462
-msgid ""
-"Git normally never creates a ref that ends with 40 hex characters\n"
-"because it will be ignored when you just specify 40-hex. These refs\n"
-"may be created by mistake. For example,\n"
-"\n"
-"  git checkout -b $br $(git rev-parse ...)\n"
-"\n"
-"where \"$br\" is somehow empty and a 40-hex ref is created. Please\n"
-"examine these refs and maybe delete them. Turn this message off by\n"
-"running \"git config advice.objectNameWarning false\""
-msgstr "Обычно Git не создает ссылки, оканчивающиеся на 40 шестнадцатеричных\nсимволов, потому, что они будут игнорироваться, когда вы просто\nукажете это 40-символьное шестнадцатеричное число. Такие ссылки\nмогли быть созданы по ошибке. Например, с помощью:\n\n  git checkout -b $br $(git rev-parse …)\n\n, если «$br» оказался пустым, то ссылка с 40-символьным\nшестнадцатеричным числом будет создана. Пожалуйста, просмотрите эти\nссылки и, возможно, удалите их. Вы можете отключить это сообщение\nзапустив «git config advice.objectNameWarning false»"
+#: ref-filter.c:878
+msgid ":strip= requires a positive integer argument"
+msgstr ":strip= требует наличия положительного целого аргумента"
 
-#: submodule.c:64 submodule.c:98
-msgid "Cannot change unmerged .gitmodules, resolve merge conflicts first"
-msgstr "Не удалось изменить не слитый .gitmodules, сначала разрешите конфликты"
+#: ref-filter.c:883
+#, c-format
+msgid "ref '%s' does not have %ld components to :strip"
+msgstr "ссылка «%s» не содержит %ld компонент для :strip"
 
-#: submodule.c:68 submodule.c:102
+#: ref-filter.c:1046
 #, c-format
-msgid "Could not find section in .gitmodules where path=%s"
-msgstr "Ð\9dе Ñ\83далоÑ\81Ñ\8c Ð½Ð°Ð¹Ñ\82и Ñ\80аздел Ð² .gitmodules, Ð³Ð´Ðµ Ð¿Ñ\83Ñ\82Ñ\8c Ñ\80авен %s"
+msgid "unknown %.*s format %s"
+msgstr "неизвеÑ\81Ñ\82нÑ\8bй %.*s Ñ\84оÑ\80маÑ\82 %s"
 
-#: submodule.c:76
+#: ref-filter.c:1066 ref-filter.c:1097
 #, c-format
-msgid "Could not update .gitmodules entry %s"
-msgstr " Не удалось обновить .gitmodules запись %s"
+msgid "missing object %s for %s"
+msgstr "не найден объект %s для %s"
 
-#: submodule.c:109
+#: ref-filter.c:1069 ref-filter.c:1100
 #, c-format
-msgid "Could not remove .gitmodules entry for %s"
-msgstr "Не удалось удалить запись в .gitmodules для %s"
+msgid "parse_object_buffer failed on %s for %s"
+msgstr "сбой при выполнении parse_object_buffer на %s для %s"
 
-#: submodule.c:120
-msgid "staging updated .gitmodules failed"
-msgstr "сбой индексирования обновленного .gitmodules"
+#: ref-filter.c:1311
+#, c-format
+msgid "malformed object at '%s'"
+msgstr "Повреждённый объект «%s»"
 
-#: submodule.c:177
-msgid "negative values not allowed for submodule.fetchJobs"
-msgstr "нельзя использовать отприцательные значения для submodule.fetchJobs"
+#: ref-filter.c:1373
+#, c-format
+msgid "ignoring ref with broken name %s"
+msgstr "игнорирую ссылку с неправильным именем %s"
 
-#: submodule-config.c:358
+#: ref-filter.c:1378
 #, c-format
-msgid "invalid value for %s"
-msgstr "непÑ\80авилÑ\8cное Ð·Ð½Ð°Ñ\87ение %s"
+msgid "ignoring broken ref %s"
+msgstr "игноÑ\80иÑ\80Ñ\83Ñ\8e Ð½ÐµÐ¿Ñ\80авилÑ\8cнÑ\83Ñ\8e Ñ\81Ñ\81Ñ\8bлкÑ\83 %s"
 
-#: trailer.c:237
+#: ref-filter.c:1633
 #, c-format
-msgid "running trailer command '%s' failed"
-msgstr "сбой при запуске команды завершителя «%s»"
+msgid "format: %%(end) atom missing"
+msgstr "format: пропущена частица %%(end)"
 
-#: trailer.c:492 trailer.c:496 trailer.c:500 trailer.c:554 trailer.c:558
-#: trailer.c:562
+#: ref-filter.c:1687
 #, c-format
-msgid "unknown value '%s' for key '%s'"
-msgstr "неизвеÑ\81Ñ\82ное Ð·Ð½Ð°Ñ\87ение Â«%s» Ð´Ð»Ñ\8f ÐºÐ»Ñ\8eÑ\87а Â«%s»"
+msgid "malformed object name %s"
+msgstr "непÑ\80авилÑ\8cное Ð¸Ð¼Ñ\8f Ð¾Ð±Ñ\8aекÑ\82а %s"
 
-#: trailer.c:544 trailer.c:549 builtin/remote.c:289
+#: remote.c:746
 #, c-format
-msgid "more than one %s"
-msgstr "болÑ\8cÑ\88е Ð¾Ð´Ð½Ð¾Ð³Ð¾ %s"
+msgid "Cannot fetch both %s and %s to %s"
+msgstr "Ð\9dелÑ\8cзÑ\8f Ð¸Ð·Ð²Ð»ÐµÑ\87Ñ\8c Ð¾Ð´Ð½Ð¾Ð²Ñ\80еменно %s Ð¸ %s Ð² %s"
 
-#: trailer.c:582
+#: remote.c:750
 #, c-format
-msgid "empty trailer token in trailer '%.*s'"
-msgstr "пустая последняя лексема в завершителе «%.*s»"
+msgid "%s usually tracks %s, not %s"
+msgstr "%s обычно отслеживает %s, а не %s"
 
-#: trailer.c:702
+#: remote.c:754
 #, c-format
-msgid "could not read input file '%s'"
-msgstr "не удалось прочитать входной файл «%s»"
+msgid "%s tracks both %s and %s"
+msgstr "%s отслеживает и %s и %s"
 
-#: trailer.c:705
-msgid "could not read from stdin"
-msgstr "не Ñ\83далоÑ\81Ñ\8c Ð¿Ñ\80оÑ\87иÑ\82аÑ\82Ñ\8c Ð¸Ð· Ñ\81Ñ\82андаÑ\80Ñ\82ного Ð²Ð²Ð¾Ð´а"
+#: remote.c:762
+msgid "Internal error"
+msgstr "Ð\92нÑ\83Ñ\82Ñ\80еннÑ\8fÑ\8f Ð¾Ñ\88ибка"
 
-#: trailer.c:857 builtin/am.c:42
-#, c-format
-msgid "could not stat %s"
-msgstr "не удалось выполнить stat для %s"
+#: remote.c:1677 remote.c:1720
+msgid "HEAD does not point to a branch"
+msgstr "HEAD не указывает на ветку"
 
-#: trailer.c:859
+#: remote.c:1686
 #, c-format
-msgid "file %s is not a regular file"
-msgstr "файл %s не является обычным файлом"
+msgid "no such branch: '%s'"
+msgstr "нет такой ветки: «%s»"
 
-#: trailer.c:861
+#: remote.c:1689
 #, c-format
-msgid "file %s is not writable by user"
-msgstr "файл %s не доступен на запись пользователю"
-
-#: trailer.c:873
-msgid "could not open temporary file"
-msgstr "не удалось создать временный файл"
+msgid "no upstream configured for branch '%s'"
+msgstr "вышестоящая ветка не настроена для ветки «%s»"
 
-#: trailer.c:912
+#: remote.c:1695
 #, c-format
-msgid "could not rename temporary file to %s"
-msgstr "не Ñ\83далоÑ\81Ñ\8c Ð¿ÐµÑ\80еименоваÑ\82Ñ\8c Ð²Ñ\80еменнÑ\8bй Ñ\84айл Ð² %s"
+msgid "upstream branch '%s' not stored as a remote-tracking branch"
+msgstr "вÑ\8bÑ\88еÑ\81Ñ\82оÑ\8fÑ\89аÑ\8f Ð²ÐµÑ\82ка Â«%s» Ð½Ðµ Ñ\81оÑ\85Ñ\80анена ÐºÐ°Ðº Ð¾Ñ\82Ñ\81леживаемаÑ\8f Ð²ÐµÑ\82ка"
 
-#: transport.c:62
+#: remote.c:1710
 #, c-format
-msgid "Would set upstream of '%s' to '%s' of '%s'\n"
-msgstr "Ð\91Ñ\83деÑ\82 Ñ\83Ñ\81Ñ\82ановлен Ð²Ñ\8bÑ\88еÑ\81Ñ\82оÑ\8fÑ\89ий Ñ\80епозиÑ\82оÑ\80ий Ð´Ð»Ñ\8f Â«%s» Ð½Ð° Â«%s» Ñ\81 Â«%s»\n"
+msgid "push destination '%s' on remote '%s' has no local tracking branch"
+msgstr "назнаÑ\87ение Ð´Ð»Ñ\8f Ð¾Ñ\82пÑ\80авки Â«%s» Ð½Ð° Ð²Ð½ÐµÑ\88нем Ñ\81еÑ\80веÑ\80е Â«%s» Ð½Ðµ Ð¸Ð¼ÐµÐµÑ\82 Ð»Ð¾ÐºÐ°Ð»Ñ\8cной Ð¾Ñ\82Ñ\81леживаемой Ð²ÐµÑ\82ки"
 
-#: transport.c:151
+#: remote.c:1725
 #, c-format
-msgid "transport: invalid depth option '%s'"
-msgstr "транспорт: неправильный параметр глубины «%s»"
+msgid "branch '%s' has no remote for pushing"
+msgstr "ветка «%s» не имеет внешнего сервера для отправки"
 
-#: transport.c:771
+#: remote.c:1736
 #, c-format
-msgid ""
-"The following submodule paths contain changes that can\n"
-"not be found on any remote:\n"
-msgstr "Подмодули по указанным путям содержат изменения, которые не найдены ни на одном из внешних репозиториев:\n"
+msgid "push refspecs for '%s' do not include '%s'"
+msgstr "спецификации пути для отправки «%s» не включают в себя «%s»"
+
+#: remote.c:1749
+msgid "push has no destination (push.default is 'nothing')"
+msgstr "отправка не имеет точки назначения (push.default выставлен в «nothing»)"
+
+#: remote.c:1771
+msgid "cannot resolve 'simple' push to a single destination"
+msgstr "не удалось выполнить «simple» отправку в единственную точку назначения"
 
-#: transport.c:775
+#: remote.c:2073
 #, c-format
-msgid ""
-"\n"
-"Please try\n"
-"\n"
-"\tgit push --recurse-submodules=on-demand\n"
-"\n"
-"or cd to the path and use\n"
-"\n"
-"\tgit push\n"
-"\n"
-"to push them to a remote.\n"
-"\n"
-msgstr "\nПопробуйте выполнить\n\n\tgit push --recurse-submodules=on-demand\n\nили перейти в каталог с помощью команды cd и выполнить\n\n\tgit push\n\nдля их отправки на внешний репозиторий.\n"
+msgid "Your branch is based on '%s', but the upstream is gone.\n"
+msgstr "Ваша ветка базируется на «%s», но вышестоящий репозиторий исчез.\n"
 
-#: transport.c:783
-msgid "Aborting."
-msgstr "Прерываю."
+#: remote.c:2077
+msgid "  (use \"git branch --unset-upstream\" to fixup)\n"
+msgstr "(для исправления запустите «git branch --unset-upstream»)\n"
 
-#: transport-helper.c:1041
+#: remote.c:2080
 #, c-format
-msgid "Could not read ref %s"
-msgstr "Ð\9dе Ñ\83далоÑ\81Ñ\8c Ð¿Ñ\80оÑ\87иÑ\82аÑ\82Ñ\8c Ñ\81Ñ\81Ñ\8bлкÑ\83 %s"
+msgid "Your branch is up-to-date with '%s'.\n"
+msgstr "Ð\92аÑ\88а Ð²ÐµÑ\82ка Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð° Ð² Ñ\81ооÑ\82веÑ\82Ñ\81Ñ\82вии Ñ\81 Â«%s».\n"
 
-#: unpack-trees.c:64
+#: remote.c:2084
 #, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by checkout:\n"
-"%%sPlease commit your changes or stash them before you switch branches."
-msgstr "Ваши локальные изменения в указанных файлах будут перезаписаны при переключении на состояние:\n%%sСделайте коммит или спрячьте ваши изменения перед переключением веток."
+msgid "Your branch is ahead of '%s' by %d commit.\n"
+msgid_plural "Your branch is ahead of '%s' by %d commits.\n"
+msgstr[0] "Ваша ветка опережает «%s» на %d коммит.\n"
+msgstr[1] "Ваша ветка опережает «%s» на %d коммита.\n"
+msgstr[2] "Ваша ветка опережает «%s» на %d коммитов.\n"
+msgstr[3] "Ваша ветка опережает «%s» на %d коммитов.\n"
 
-#: unpack-trees.c:66
+#: remote.c:2090
+msgid "  (use \"git push\" to publish your local commits)\n"
+msgstr "  (используйте «git push», чтобы опубликовать ваши локальные коммиты)\n"
+
+#: remote.c:2093
 #, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by checkout:\n"
-"%%s"
-msgstr "Ваши локальные изменения в указанных файлах будут перезаписаны при переключении на состояние:\n%%s"
+msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n"
+msgid_plural ""
+"Your branch is behind '%s' by %d commits, and can be fast-forwarded.\n"
+msgstr[0] "Ваша ветка отстает от «%s» на %d коммит и может быть перемотана вперед.\n"
+msgstr[1] "Ваша ветка отстает от «%s» на %d коммита и может быть перемотана вперед.\n"
+msgstr[2] "Ваша ветка отстает от «%s» на %d коммитов и может быть перемотана вперед.\n"
+msgstr[3] "Ваша ветка отстает от «%s» на %d коммитов и может быть перемотана вперед.\n"
 
-#: unpack-trees.c:69
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by merge:\n"
-"%%sPlease commit your changes or stash them before you merge."
-msgstr "Ваши локальные изменения в указанных файлах будут перезаписаны при слиянии:\n%%sСделайте коммит или спрячьте ваши изменения перед слиянием веток."
+#: remote.c:2101
+msgid "  (use \"git pull\" to update your local branch)\n"
+msgstr "  (используйте «git pull», чтобы обновить вашу локальную ветку)\n"
 
-#: unpack-trees.c:71
+#: remote.c:2104
 #, c-format
 msgid ""
-"Your local changes to the following files would be overwritten by merge:\n"
-"%%s"
-msgstr "Ваши локальные изменения в указанных файлах будут перезаписаны при слиянии:\n%%s"
+"Your branch and '%s' have diverged,\n"
+"and have %d and %d different commit each, respectively.\n"
+msgid_plural ""
+"Your branch and '%s' have diverged,\n"
+"and have %d and %d different commits each, respectively.\n"
+msgstr[0] "Ваша ветка и «%s» разделились\nи теперь имеют %d и %d разный коммит в каждой соответственно.\n"
+msgstr[1] "Ваша ветка и «%s» разделились\nи теперь имеют %d и %d разных коммита в каждой соответственно.\n"
+msgstr[2] "Ваша ветка и «%s» разделились\nи теперь имеют %d и %d разных коммитов в каждой соответственно.\n"
+msgstr[3] "Ваша ветка и «%s» разделились\nи теперь имеют %d и %d разных коммитов в каждой соответственно.\n"
 
-#: unpack-trees.c:74
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by %s:\n"
-"%%sPlease commit your changes or stash them before you %s."
-msgstr "Ваши локальные изменения в указанных файлах будут перезаписаны при %s:\n%%sСделайте коммит или спрячьте ваши изменения перед %s."
+#: remote.c:2114
+msgid "  (use \"git pull\" to merge the remote branch into yours)\n"
+msgstr "  (используйте «git pull», чтобы слить внешнюю ветку в вашу)\n"
 
-#: unpack-trees.c:76
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by %s:\n"
-"%%s"
-msgstr "Ваши локальные изменения в указанных файлах будут перезаписаны при %s:\n%%s"
+#: revision.c:2158
+msgid "your current branch appears to be broken"
+msgstr "похоже, ваша текущая ветка повреждена"
 
-#: unpack-trees.c:81
+#: revision.c:2161
 #, c-format
-msgid ""
-"Updating the following directories would lose untracked files in it:\n"
-"%s"
-msgstr "Обновление указанных каталогов приведет к потере неотслеживаемых файлов в них:\n%s"
+msgid "your current branch '%s' does not have any commits yet"
+msgstr "ваша текущая ветка «%s» еще не содержит ни одного коммита"
 
-#: unpack-trees.c:85
-#, c-format
-msgid ""
-"The following untracked working tree files would be removed by checkout:\n"
-"%%sPlease move or remove them before you switch branches."
-msgstr "Указанные неотслеживаемые файлы в рабочем каталоге будут удалены при переключении на состояние:\n%%sПереместите эти файлы или удалите их перед переключением веток."
+#: revision.c:2355
+msgid "--first-parent is incompatible with --bisect"
+msgstr "опцию --first-parent нельзя использовать одновременно с --bisect"
 
-#: unpack-trees.c:87
-#, c-format
-msgid ""
-"The following untracked working tree files would be removed by checkout:\n"
-"%%s"
-msgstr "Указанные неотслеживаемые файлы в рабочем каталоге будут удалены при переключении на состояние:\n%%s"
+#: run-command.c:106
+msgid "open /dev/null failed"
+msgstr "сбой открытия /dev/null"
 
-#: unpack-trees.c:90
+#: run-command.c:108
 #, c-format
-msgid ""
-"The following untracked working tree files would be removed by merge:\n"
-"%%sPlease move or remove them before you merge."
-msgstr "Указанные неотслеживаемые файлы в рабочем каталоге будут удалены при слиянии:\n%%sПереместите эти файлы или удалите их перед переключением веток."
+msgid "dup2(%d,%d) failed"
+msgstr "dup2(%d,%d) сбой"
 
-#: unpack-trees.c:92
-#, c-format
-msgid ""
-"The following untracked working tree files would be removed by merge:\n"
-"%%s"
-msgstr "Указанные неотслеживаемые файлы в рабочем каталоге будут удалены при слиянии:\n%%s"
+#: send-pack.c:297
+msgid "failed to sign the push certificate"
+msgstr "сбой подписания сертификата отправки"
 
-#: unpack-trees.c:95
-#, c-format
-msgid ""
-"The following untracked working tree files would be removed by %s:\n"
-"%%sPlease move or remove them before you %s."
-msgstr "Указанные неотслеживаемые файлы в рабочем каталоге будут удалены при %s:\n%%sПереместите эти файлы или удалите их перед %s."
+#: send-pack.c:410
+msgid "the receiving end does not support --signed push"
+msgstr "принимающая сторона не поддерживает отправку с опцией --signed"
 
-#: unpack-trees.c:97
-#, c-format
+#: send-pack.c:412
 msgid ""
-"The following untracked working tree files would be removed by %s:\n"
-"%%s"
-msgstr "УказаннÑ\8bе Ð½ÐµÐ¾Ñ\82Ñ\81леживаемÑ\8bе Ñ\84айлÑ\8b Ð² Ñ\80абоÑ\87ем ÐºÐ°Ñ\82алоге Ð±Ñ\83дÑ\83Ñ\82 Ñ\83даленÑ\8b Ð¿Ñ\80и %s:\n%%s"
+"not sending a push certificate since the receiving end does not support "
+"--signed push"
+msgstr "не Ð¾Ñ\82пÑ\80авлÑ\8fем Ñ\81еÑ\80Ñ\82иÑ\84икаÑ\82 Ð´Ð»Ñ\8f Ð¾Ñ\82пÑ\80авки, Ñ\82ак ÐºÐ°Ðº Ð¿Ñ\80инимаÑ\8eÑ\89аÑ\8f Ñ\81Ñ\82оÑ\80она Ð½Ðµ Ð¿Ð¾Ð´Ð´ÐµÑ\80живаеÑ\82 Ð¾Ñ\82пÑ\80авкÑ\83 Ñ\81 Ð¾Ð¿Ñ\86ией --signed"
 
-#: unpack-trees.c:102
-#, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by checkout:\n"
-"%%sPlease move or remove them before you switch branches."
-msgstr "Указанные неотслеживаемые файлы в рабочем каталоге будут перезаписаны при переключении на состояние:\n%%sПереместите эти файлы или удалите их перед переключением веток."
+#: send-pack.c:424
+msgid "the receiving end does not support --atomic push"
+msgstr "принимающая сторона не поддерживает отправку с опцией --atomic"
 
-#: unpack-trees.c:104
-#, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by checkout:\n"
-"%%s"
-msgstr "Указанные неотслеживаемые файлы в рабочем каталоге будут перезаписаны при переключении на состояние:\n%%s"
+#: send-pack.c:429
+msgid "the receiving end does not support push options"
+msgstr "принимающая сторона не поддерживает отправку с опциями"
 
-#: unpack-trees.c:107
-#, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by merge:\n"
-"%%sPlease move or remove them before you merge."
-msgstr "Указанные неотслеживаемые файлы в рабочем каталоге будут перезаписаны при слиянии:\n%%sПереместите эти файлы или удалите их перед переключением веток."
+#: sequencer.c:171
+msgid "revert"
+msgstr "обратить изменения"
 
-#: unpack-trees.c:109
-#, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by merge:\n"
-"%%s"
-msgstr "Указанные неотслеживаемые файлы в рабочем каталоге будут перезаписаны при слиянии:\n%%s"
+#: sequencer.c:171
+msgid "cherry-pick"
+msgstr "копировать коммит"
 
-#: unpack-trees.c:112
-#, c-format
+#: sequencer.c:228
 msgid ""
-"The following untracked working tree files would be overwritten by %s:\n"
-"%%sPlease move or remove them before you %s."
-msgstr "УказаннÑ\8bе Ð½ÐµÐ¾Ñ\82Ñ\81леживаемÑ\8bе Ñ\84айлÑ\8b Ð² Ñ\80абоÑ\87ем ÐºÐ°Ñ\82алоге Ð±Ñ\83дÑ\83Ñ\82 Ð¿ÐµÑ\80езапиÑ\81анÑ\8b Ð¿Ñ\80и %s:\n%%sÐ\9fеÑ\80емеÑ\81Ñ\82иÑ\82е Ñ\8dÑ\82и Ñ\84айлÑ\8b Ð¸Ð»Ð¸ Ñ\83далиÑ\82е Ð¸Ñ\85 Ð¿ÐµÑ\80ед %s."
+"after resolving the conflicts, mark the corrected paths\n"
+"with 'git add <paths>' or 'git rm <paths>'"
+msgstr "поÑ\81ле Ñ\80азÑ\80еÑ\88ениÑ\8f ÐºÐ¾Ð½Ñ\84ликÑ\82ов, Ð¿Ð¾Ð¼ÐµÑ\82Ñ\8cÑ\82е Ð¸Ñ\81пÑ\80авленнÑ\8bе Ð¿Ñ\83Ñ\82и\nÑ\81 Ð¿Ð¾Ð¼Ð¾Ñ\89Ñ\8cÑ\8e Â«git add <пÑ\83Ñ\82и>» Ð¸Ð»Ð¸ Â«git rm <пÑ\83Ñ\82и>»"
 
-#: unpack-trees.c:114
-#, c-format
+#: sequencer.c:231
 msgid ""
-"The following untracked working tree files would be overwritten by %s:\n"
-"%%s"
-msgstr "Указанные неотслеживаемые файлы в рабочем каталоге будут перезаписаны при %s:\n%%s"
+"after resolving the conflicts, mark the corrected paths\n"
+"with 'git add <paths>' or 'git rm <paths>'\n"
+"and commit the result with 'git commit'"
+msgstr "после разрешения конфликтов, пометьте исправленные пути\nс помощью «git add <пути>» или «git rm <пути>»\nи сделайте коммит с помощью «git commit»"
 
-#: unpack-trees.c:121
+#: sequencer.c:244 sequencer.c:1209
 #, c-format
-msgid "Entry '%s' overlaps with '%s'.  Cannot bind."
-msgstr "Ð\97апиÑ\81Ñ\8c Â«%s» Ñ\87аÑ\81Ñ\82иÑ\87но Ñ\81овпадаеÑ\82 Ñ\81 Â«%s».  Ð\9dе Ñ\83далоÑ\81Ñ\8c Ð½Ð°Ð·Ð½Ð°Ñ\87иÑ\82Ñ\8c Ñ\81ооÑ\82веÑ\82Ñ\81Ñ\82вие."
+msgid "could not lock '%s'"
+msgstr "не Ñ\83далоÑ\81Ñ\8c Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñ\80оваÑ\82Ñ\8c Â«%s»"
 
-#: unpack-trees.c:124
+#: sequencer.c:247 sequencer.c:1125 sequencer.c:1214
 #, c-format
-msgid ""
-"Cannot update sparse checkout: the following entries are not up-to-date:\n"
-"%s"
-msgstr "Не удалось обновить частичное состояние: следующие элементы не последней версии:\n%s"
+msgid "could not write to '%s'"
+msgstr "не удалось записать в «%s»"
 
-#: unpack-trees.c:126
+#: sequencer.c:251
 #, c-format
-msgid ""
-"The following Working tree files would be overwritten by sparse checkout update:\n"
-"%s"
-msgstr "Указанные файлы из рабочего каталога будут перезаписаны при обновлении частичного состояния:\n%s"
+msgid "could not write eol to '%s'"
+msgstr "не удалось записать eol в «%s»"
 
-#: unpack-trees.c:128
+#: sequencer.c:255 sequencer.c:1130 sequencer.c:1216
 #, c-format
-msgid ""
-"The following Working tree files would be removed by sparse checkout update:\n"
-"%s"
-msgstr "Указанные файлы из рабочего каталога будут удалены при обновлении частичного состояния:\n%s"
+msgid "failed to finalize '%s'."
+msgstr "не удалось завершить «%s»."
 
-#: unpack-trees.c:205
+#: sequencer.c:279 builtin/am.c:259 builtin/commit.c:749 builtin/merge.c:1032
 #, c-format
-msgid "Aborting\n"
-msgstr "Прерываю\n"
-
-#: unpack-trees.c:237
-msgid "Checking out files"
-msgstr "Распаковка файлов"
-
-#: urlmatch.c:120
-msgid "invalid URL scheme name or missing '://' suffix"
-msgstr "Неправильная имя URL схемы или пропущен суффикс «://»"
+msgid "could not read '%s'"
+msgstr "не удалось прочитать «%s»"
 
-#: urlmatch.c:144 urlmatch.c:297 urlmatch.c:356
+#: sequencer.c:305
 #, c-format
-msgid "invalid %XX escape sequence"
-msgstr "непÑ\80авилÑ\8cнаÑ\8f Ñ\83пÑ\80авлÑ\8fÑ\8eÑ\89аÑ\8f Ð¿Ð¾Ñ\81ледоваÑ\82елÑ\8cноÑ\81Ñ\82Ñ\8c %XX"
+msgid "your local changes would be overwritten by %s."
+msgstr "ваÑ\88и Ð»Ð¾ÐºÐ°Ð»Ñ\8cнÑ\8bе Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f Ð±Ñ\83дÑ\83Ñ\82 Ð¿ÐµÑ\80езапиÑ\81анÑ\8b %s."
 
-#: urlmatch.c:172
-msgid "missing host and scheme is not 'file:'"
-msgstr "пÑ\80опÑ\83Ñ\89ено Ð¸Ð¼Ñ\8f Ñ\81еÑ\80веÑ\80а Ð¸ Ñ\81Ñ\85ема Ð´Ð¾Ñ\81Ñ\82Ñ\83па Ð½Ðµ Â«file:»"
+#: sequencer.c:309
+msgid "commit your changes or stash them to proceed."
+msgstr "длÑ\8f Ð¿Ñ\80одолжениÑ\8f Ð·Ð°ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82Ñ\8cÑ\82е Ð²Ð°Ñ\88и Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f Ð¸Ð»Ð¸ Ñ\81пÑ\80Ñ\8fÑ\87Ñ\8cÑ\82е Ð¸Ñ\85."
 
-#: urlmatch.c:189
-msgid "a 'file:' URL may not have a port number"
-msgstr "URL со схемой «file:» не может содержать номер порта"
+#: sequencer.c:324
+#, c-format
+msgid "%s: fast-forward"
+msgstr "%s: перемотка вперед"
 
-#: urlmatch.c:199
-msgid "invalid characters in host name"
-msgstr "неправильные символы в имени сервера"
+#. TRANSLATORS: %s will be "revert" or "cherry-pick"
+#: sequencer.c:399
+#, c-format
+msgid "%s: Unable to write new index file"
+msgstr "%s: Не удалось записать файл индекса"
 
-#: urlmatch.c:244 urlmatch.c:255
-msgid "invalid port number"
-msgstr "неправильный номер порта"
+#: sequencer.c:418
+msgid "could not resolve HEAD commit\n"
+msgstr "не удалось распознать HEAD коммит\n"
 
-#: urlmatch.c:322
-msgid "invalid '..' path segment"
-msgstr "неправильная часть пути «..»"
+#: sequencer.c:438
+msgid "unable to update cache tree\n"
+msgstr "не удалось обновить дерево кэша\n"
 
-#: worktree.c:282
+#: sequencer.c:483
 #, c-format
-msgid "failed to read '%s'"
-msgstr "не удалось прочитать «%s»"
+msgid ""
+"you have staged changes in your working tree\n"
+"If these changes are meant to be squashed into the previous commit, run:\n"
+"\n"
+"  git commit --amend %s\n"
+"\n"
+"If they are meant to go into a new commit, run:\n"
+"\n"
+"  git commit %s\n"
+"\n"
+"In both cases, once you're done, continue with:\n"
+"\n"
+"  git rebase --continue\n"
+msgstr "у вас имеются проиндексированные изменения в рабочем каталоге. Если эти изменения должны быть объеденены с предыдущим коммитом, то запустите:\n\n  git commit --amend %s\n\nЕсли же они должны быть помещены в новый коммит, то запустите:\n\n  git commit %s\n\nВ любом случае, после того как вы закончите, продолжить перемещение можно выполнив:\n\n  git rebase --continue\n"
 
-#: wrapper.c:222 wrapper.c:392
+#: sequencer.c:567
 #, c-format
-msgid "could not open '%s' for reading and writing"
-msgstr "не удалось открыть «%s» для чтения и записи"
+msgid "could not parse commit %s\n"
+msgstr "не удалось разобрать коммит %s\n"
 
-#: wrapper.c:224 wrapper.c:394 builtin/am.c:778
+#: sequencer.c:572
 #, c-format
-msgid "could not open '%s' for writing"
-msgstr "не удалось открыть «%s» для записи"
+msgid "could not parse parent commit %s\n"
+msgstr "не удалось разобрать родительский коммит %s\n"
 
-#: wrapper.c:226 wrapper.c:396 builtin/am.c:324 builtin/am.c:771
-#: builtin/am.c:859 builtin/commit.c:1712 builtin/merge.c:1029
-#: builtin/pull.c:407
-#, c-format
-msgid "could not open '%s' for reading"
-msgstr "не удалось открыть «%s» для чтения"
+#: sequencer.c:656
+msgid "your index file is unmerged."
+msgstr "ваш индекс не слит."
 
-#: wrapper.c:605 wrapper.c:626
+#: sequencer.c:675
 #, c-format
-msgid "unable to access '%s'"
-msgstr "«%s» недоступно"
-
-#: wrapper.c:634
-msgid "unable to get current working directory"
-msgstr "не удалось получить текущий рабочий каталог"
+msgid "commit %s is a merge but no -m option was given."
+msgstr "коммит %s — это коммит-слияние, но опция -m не указана."
 
-#: wrapper.c:658
+#: sequencer.c:683
 #, c-format
-msgid "could not write to %s"
-msgstr "не удалось записать в %s"
+msgid "commit %s does not have parent %d"
+msgstr "у коммита %s нет предка %d"
 
-#: wrapper.c:660
+#: sequencer.c:687
 #, c-format
-msgid "could not close %s"
-msgstr "не Ñ\83далоÑ\81Ñ\8c Ð·Ð°ÐºÑ\80Ñ\8bÑ\82Ñ\8c %s"
+msgid "mainline was specified but commit %s is not a merge."
+msgstr "оÑ\81новнаÑ\8f Ð²ÐµÑ\82ка Ñ\83казана, Ð½Ð¾ ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82 %s Ð½Ðµ Ñ\8fвлÑ\8fеÑ\82Ñ\81Ñ\8f Ñ\81лиÑ\8fнием."
 
-#: wt-status.c:150
-msgid "Unmerged paths:"
-msgstr "Не слитые пути:"
-
-#: wt-status.c:177 wt-status.c:204
+#. TRANSLATORS: The first %s will be a "todo" command like
+#. "revert" or "pick", the second %s a SHA1.
+#: sequencer.c:700
 #, c-format
-msgid "  (use \"git reset %s <file>...\" to unstage)"
-msgstr "  (используйте «git reset %s <файл>…», чтобы убрать из индекса)"
-
-#: wt-status.c:179 wt-status.c:206
-msgid "  (use \"git rm --cached <file>...\" to unstage)"
-msgstr "  (используйте «git rm --cached <файл>…», чтобы убрать из индекса)"
+msgid "%s: cannot parse parent commit %s"
+msgstr "%s: не удалось разобрать родительский коммит для %s"
 
-#: wt-status.c:183
-msgid "  (use \"git add <file>...\" to mark resolution)"
-msgstr "  (используйте «git add <файл>…», чтобы пометить разрешение конфликта)"
+#: sequencer.c:705
+#, c-format
+msgid "cannot get commit message for %s"
+msgstr "не удалось получить сообщение коммита для %s"
 
-#: wt-status.c:185 wt-status.c:189
-msgid "  (use \"git add/rm <file>...\" as appropriate to mark resolution)"
-msgstr "  (используйте «git add/rm <файл>…», чтобы пометить выбранное разрешение конфликта)"
+#: sequencer.c:797
+#, c-format
+msgid "could not revert %s... %s"
+msgstr "не удалось обратить изменения коммита %s… %s"
 
-#: wt-status.c:187
-msgid "  (use \"git rm <file>...\" to mark resolution)"
-msgstr "  (используйте «git rm <файл>…», чтобы пометить разрешение конфликта)"
+#: sequencer.c:798
+#, c-format
+msgid "could not apply %s... %s"
+msgstr "не удалось применить коммит %s… %s"
 
-#: wt-status.c:198 wt-status.c:882
-msgid "Changes to be committed:"
-msgstr "Ð\98зменениÑ\8f, ÐºÐ¾Ñ\82оÑ\80Ñ\8bе Ð±Ñ\83дÑ\83Ñ\82 Ð²ÐºÐ»Ñ\8eÑ\87енÑ\8b Ð² ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82:"
+#: sequencer.c:833
+msgid "empty commit set passed"
+msgstr "пеÑ\80едан Ð¿Ñ\83Ñ\81Ñ\82ой Ð½Ð°Ð±Ð¾Ñ\80 ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82ов"
 
-#: wt-status.c:216 wt-status.c:891
-msgid "Changes not staged for commit:"
-msgstr "Изменения, которые не в индексе для коммита:"
+#: sequencer.c:843
+#, c-format
+msgid "git %s: failed to read the index"
+msgstr "git %s: сбой чтения индекса"
 
-#: wt-status.c:220
-msgid "  (use \"git add <file>...\" to update what will be committed)"
-msgstr "  (используйте «git add <файл>…», чтобы добавить файл в индекс)"
+#: sequencer.c:850
+#, c-format
+msgid "git %s: failed to refresh the index"
+msgstr "git %s: сбой обновления индекса"
 
-#: wt-status.c:222
-msgid "  (use \"git add/rm <file>...\" to update what will be committed)"
-msgstr "  (используйте «git add/rm <файл>…», чтобы добавить или удалить файл из индекса)"
+#: sequencer.c:944
+#, c-format
+msgid "invalid line %d: %.*s"
+msgstr "неправильная строка %d: %.*s"
 
-#: wt-status.c:223
-msgid ""
-"  (use \"git checkout -- <file>...\" to discard changes in working "
-"directory)"
-msgstr "  (используйте «git checkout -- <файл>…», чтобы отменить изменения\n   в рабочем каталоге)"
+#: sequencer.c:950
+msgid "no commits parsed."
+msgstr "коммиты не разобраны."
 
-#: wt-status.c:225
-msgid "  (commit or discard the untracked or modified content in submodules)"
-msgstr "  (сделайте коммит или отмените изменения в неотслеживаемом или измененном содержимом в подмодулях)"
+#: sequencer.c:966
+#, c-format
+msgid "could not read '%s'."
+msgstr "не удалось прочитать «%s»."
 
-#: wt-status.c:237
+#: sequencer.c:972
 #, c-format
-msgid "  (use \"git %s <file>...\" to include in what will be committed)"
-msgstr "  (используйте «git %s <файл>…», чтобы добавить в то, что будет включено в коммит)"
+msgid "unusable instruction sheet: '%s'"
+msgstr "непригодная для использования карта с инструкциями: «%s»"
 
-#: wt-status.c:252
-msgid "both deleted:"
-msgstr "оба Ñ\83даленÑ\8b:"
+#: sequencer.c:983
+msgid "cannot cherry-pick during a revert."
+msgstr "нелÑ\8cзÑ\8f Ñ\81копиÑ\80оваÑ\82Ñ\8c ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82 Ð²Ð¾ Ð²Ñ\80емÑ\8f Ð¿Ñ\80оÑ\86еÑ\81Ñ\81а Ð¾Ð±Ñ\80аÑ\89ениÑ\8f ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82а."
 
-#: wt-status.c:254
-msgid "added by us:"
-msgstr "добавлено Ð½Ð°Ð¼Ð¸:"
+#: sequencer.c:985
+msgid "cannot revert during a cherry-pick."
+msgstr "нелÑ\8cзÑ\8f Ð¾Ð±Ñ\80аÑ\82иÑ\82Ñ\8c Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82а Ð²Ð¾ Ð²Ñ\80емÑ\8f ÐºÐ¾Ð¿Ð¸Ñ\80ованиÑ\8f ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82а."
 
-#: wt-status.c:256
-msgid "deleted by them:"
-msgstr "удалено ими:"
+#: sequencer.c:1028
+#, c-format
+msgid "invalid key: %s"
+msgstr "недействительный ключ: %s"
 
-#: wt-status.c:258
-msgid "added by them:"
-msgstr "добавлено ими:"
+#: sequencer.c:1031
+#, c-format
+msgid "invalid value for %s: %s"
+msgstr "неправильное значение %s: %s"
 
-#: wt-status.c:260
-msgid "deleted by us:"
-msgstr "удалено нами:"
+#: sequencer.c:1063
+#, c-format
+msgid "malformed options sheet: '%s'"
+msgstr "испорченная карта с опциями: «%s»"
 
-#: wt-status.c:262
-msgid "both added:"
-msgstr "оба Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ñ\8b:"
+#: sequencer.c:1101
+msgid "a cherry-pick or revert is already in progress"
+msgstr "копиÑ\80ование Ð¸Ð»Ð¸ Ð¾Ð±Ñ\80аÑ\89ение Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82а Ñ\83же Ð²Ñ\8bполнÑ\8fÑ\8eÑ\82Ñ\81Ñ\8f"
 
-#: wt-status.c:264
-msgid "both modified:"
-msgstr "оба Ð¸Ð·Ð¼ÐµÐ½Ñ\8b:"
+#: sequencer.c:1102
+msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
+msgstr "попÑ\80обÑ\83йÑ\82е Â«git cherry-pick (--continue | --quit | --abort)»"
 
-#: wt-status.c:274
-msgid "new file:"
-msgstr "новый файл:"
+#: sequencer.c:1106
+#, c-format
+msgid "could not create sequencer directory '%s'"
+msgstr "не удалось создать каталог для указателя следования коммитов «%s»"
 
-#: wt-status.c:276
-msgid "copied:"
-msgstr "скопировано:"
+#: sequencer.c:1120
+msgid "could not lock HEAD"
+msgstr "не удалось заблокировать HEAD"
 
-#: wt-status.c:278
-msgid "deleted:"
-msgstr "удалено:"
+#: sequencer.c:1151 sequencer.c:1289
+msgid "no cherry-pick or revert in progress"
+msgstr "копирование или обращение изменений коммита уже выполняются"
 
-#: wt-status.c:280
-msgid "modified:"
-msgstr "изменено:"
+#: sequencer.c:1153
+msgid "cannot resolve HEAD"
+msgstr "не Ñ\83далоÑ\81Ñ\8c Ð¾Ð¿Ñ\80еделиÑ\82Ñ\8c HEAD"
 
-#: wt-status.c:282
-msgid "renamed:"
-msgstr "пеÑ\80еименовано:"
+#: sequencer.c:1155 sequencer.c:1189
+msgid "cannot abort from a branch yet to be born"
+msgstr "нелÑ\8cзÑ\8f Ð¾Ñ\82мениÑ\82Ñ\8c Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f Ñ\81 Ð²ÐµÑ\82ки, ÐºÐ¾Ñ\82оÑ\80аÑ\8f ÐµÑ\89е Ð½Ðµ Ñ\81оздана"
 
-#: wt-status.c:284
-msgid "typechange:"
-msgstr "изменен тип:"
+#: sequencer.c:1175 builtin/grep.c:578
+#, c-format
+msgid "cannot open '%s'"
+msgstr "не удалось открыть «%s»"
 
-#: wt-status.c:286
-msgid "unknown:"
-msgstr "неизвестно:"
+#: sequencer.c:1177
+#, c-format
+msgid "cannot read '%s': %s"
+msgstr "не удалось прочитать «%s»: %s"
 
-#: wt-status.c:288
-msgid "unmerged:"
-msgstr "не слитые:"
+#: sequencer.c:1178
+msgid "unexpected end of file"
+msgstr "неожиданный конец файла"
 
-#: wt-status.c:370
-msgid "new commits, "
-msgstr "новые коммиты, "
+#: sequencer.c:1184
+#, c-format
+msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
+msgstr "сохраненный файл с HEAD перед копированием коммита «%s» поврежден"
 
-#: wt-status.c:372
-msgid "modified content, "
-msgstr "изменено содержимое, "
+#: sequencer.c:1354
+#, c-format
+msgid "%s: can't cherry-pick a %s"
+msgstr "%s: не удалось скопировать коммит %s"
 
-#: wt-status.c:374
-msgid "untracked content, "
-msgstr "неотслеживаемое содержимое, "
+#: sequencer.c:1358
+#, c-format
+msgid "%s: bad revision"
+msgstr "%s: плохая редакция"
 
-#: wt-status.c:756
-msgid "Submodules changed but not updated:"
-msgstr "Ð\98змененнÑ\8bе, Ð½Ð¾ Ð½Ðµ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ\8bе Ð¿Ð¾Ð´Ð¼Ð¾Ð´Ñ\83ли:"
+#: sequencer.c:1391
+msgid "can't revert as initial commit"
+msgstr "нелÑ\8cзÑ\8f Ð²Ð¾Ð·Ð²Ñ\80аÑ\82иÑ\82Ñ\8c Ð¸Ð·Ð½Ð°Ñ\87алÑ\8cнÑ\8bй ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82"
 
-#: wt-status.c:758
-msgid "Submodule changes to be committed:"
-msgstr "Изменения в подмодулях, которые будут закоммичены:"
+#: setup.c:160
+#, c-format
+msgid ""
+"%s: no such path in the working tree.\n"
+"Use 'git <command> -- <path>...' to specify paths that do not exist locally."
+msgstr "%s: нет такого пути в рабочем каталоге.\nИспользуйте «git <команда> -- <путь>…» для указания путей, которые не существуют локально."
 
-#: wt-status.c:839
+#: setup.c:173
+#, c-format
 msgid ""
-"Do not touch the line above.\n"
-"Everything below will be removed."
-msgstr "Не трогайте строку выше этой.\nВсё, что ниже — будет удалено."
+"ambiguous argument '%s': unknown revision or path not in the working tree.\n"
+"Use '--' to separate paths from revisions, like this:\n"
+"'git <command> [<revision>...] -- [<file>...]'"
+msgstr "неоднозначный аргумент «%s»: неизвестная редакция или не путь в рабочем каталоге.\nИспользуйте «--» для отделения путей от редакций, вот так:\n«git <команда> [<редакция>…] -- [<файл>…]»"
 
-#: wt-status.c:950
-msgid "You have unmerged paths."
-msgstr "У вас есть не слитые пути."
+#: setup.c:223
+#, c-format
+msgid ""
+"ambiguous argument '%s': both revision and filename\n"
+"Use '--' to separate paths from revisions, like this:\n"
+"'git <command> [<revision>...] -- [<file>...]'"
+msgstr "неоднозначный аргумент «%s»: является одновременно и редакцией и именем файла.\nИспользуйте «--» для отделения путей от редакций, вот так:\n«git <команда> [<редакция>…] -- [<файл>…]»"
 
-#: wt-status.c:953
-msgid "  (fix conflicts and run \"git commit\")"
-msgstr "  (разрешите конфликты, затем запустите «git commit»)"
+#: setup.c:468
+#, c-format
+msgid "Expected git repo version <= %d, found %d"
+msgstr "Ожидаемая версия git репозитория <= %d, а обнаружена %d"
 
-#: wt-status.c:955
-msgid "  (use \"git merge --abort\" to abort the merge)"
-msgstr "  (используйте «git merge --abort», чтобы остановить операцию слияния)"
+#: setup.c:476
+msgid "unknown repository extensions found:"
+msgstr "обнаружены неизвестные расширения репозитория:"
 
-#: wt-status.c:960
-msgid "All conflicts fixed but you are still merging."
-msgstr "Все конфликты исправлены, но вы все еще в процессе слияния."
+#: setup.c:762
+#, c-format
+msgid "Not a git repository (or any of the parent directories): %s"
+msgstr "Не найден git репозитоий (или один из его каталогов): %s"
 
-#: wt-status.c:963
-msgid "  (use \"git commit\" to conclude merge)"
-msgstr "  (используйте «git commit», чтобы завершить слияние)"
+#: setup.c:764 setup.c:915 builtin/index-pack.c:1641
+msgid "Cannot come back to cwd"
+msgstr "Не удалось вернуться в текущий рабочий каталог"
 
-#: wt-status.c:973
-msgid "You are in the middle of an am session."
-msgstr "Ð\92Ñ\8b Ð² Ð¿Ñ\80оÑ\86еÑ\81Ñ\81е Ñ\81еÑ\81Ñ\81ии am."
+#: setup.c:845
+msgid "Unable to read current working directory"
+msgstr "Ð\9dе Ñ\83далоÑ\81Ñ\8c Ð¿Ñ\80оÑ\87иÑ\82аÑ\82Ñ\8c Ñ\82екÑ\83Ñ\89ий Ñ\80абоÑ\87ий ÐºÐ°Ñ\82алог"
 
-#: wt-status.c:976
-msgid "The current patch is empty."
-msgstr "Текущий патч пустой."
+#: setup.c:920
+#, c-format
+msgid ""
+"Not a git repository (or any parent up to mount point %s)\n"
+"Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set)."
+msgstr "Не найден git репозитоий (или один из его каталогов вплоть до точки монтирования %s)\nОстанавливаю поиск на границе файловой системы (так как GIT_DISCOVERY_ACROSS_FILESYSTEM не установлен)."
 
-#: wt-status.c:980
-msgid "  (fix conflicts and then run \"git am --continue\")"
-msgstr "  (разрешите конфликты, затем запустите «git am --continue»)"
+#: setup.c:927
+#, c-format
+msgid "Cannot change to '%s/..'"
+msgstr "Перейти в «%s/..»"
 
-#: wt-status.c:982
-msgid "  (use \"git am --skip\" to skip this patch)"
-msgstr "  (используйте «git am --skip», чтобы пропустить этот патч)"
+#: setup.c:989
+#, c-format
+msgid ""
+"Problem with core.sharedRepository filemode value (0%.3o).\n"
+"The owner of files must always have read and write permissions."
+msgstr "Проблема со значением режима доступа к файлу core.sharedRepository (0%.3o).\nВладелец файлов должен всегда иметь права на чтение и на запись."
 
-#: wt-status.c:984
-msgid "  (use \"git am --abort\" to restore the original branch)"
-msgstr "  (используйте «git am --abort», чтобы восстановить оригинальную ветку)"
+#: sha1_file.c:473
+#, c-format
+msgid "path '%s' does not exist"
+msgstr "путь «%s» не существует"
 
-#: wt-status.c:1109
-msgid "No commands done."
-msgstr "Команды не выполнены."
+#: sha1_file.c:499
+#, c-format
+msgid "reference repository '%s' as a linked checkout is not supported yet."
+msgstr "ссылаемый репозиторий «%s» как связанное состояние, пока не поддерживается."
 
-#: wt-status.c:1112
+#: sha1_file.c:505
 #, c-format
-msgid "Last command done (%d command done):"
-msgid_plural "Last commands done (%d commands done):"
-msgstr[0] "Последняя команда выполнена (%d команда выполнена):"
-msgstr[1] "Последняя команда выполнена (%d команды выполнено):"
-msgstr[2] "Последняя команда выполнена (%d команд выполнено):"
-msgstr[3] "Последняя команда выполнена (%d команд выполнено):"
+msgid "reference repository '%s' is not a local repository."
+msgstr "ссылаемый репозиторий «%s» не является локальным."
 
-#: wt-status.c:1123
+#: sha1_file.c:511
 #, c-format
-msgid "  (see more in file %s)"
-msgstr "  (смотрите дополнительно в файле %s)"
+msgid "reference repository '%s' is shallow"
+msgstr "ссылаемый репозиторий «%s» является частичным"
 
-#: wt-status.c:1128
-msgid "No commands remaining."
-msgstr "Команд больше не осталось."
+#: sha1_file.c:519
+#, c-format
+msgid "reference repository '%s' is grafted"
+msgstr "ссылаемый репозиторий «%s» является сращенным"
+
+#: sha1_file.c:1159
+msgid "offset before end of packfile (broken .idx?)"
+msgstr "сдвиг до конца файла пакета (возможно, повреждён файл .idx?)"
 
-#: wt-status.c:1131
+#: sha1_file.c:2592
 #, c-format
-msgid "Next command to do (%d remaining command):"
-msgid_plural "Next commands to do (%d remaining commands):"
-msgstr[0] "Следующая команда для выполнения (%d команда осталась):"
-msgstr[1] "Следующая команда для выполнения (%d команды осталось):"
-msgstr[2] "Следующая команда для выполнения (%d команд осталось):"
-msgstr[3] "Следующая команда для выполнения (%d команд осталось):"
+msgid "offset before start of pack index for %s (corrupt index?)"
+msgstr "сдвиг до начала индекса пакета для %s (повреждён индекс?)"
 
-#: wt-status.c:1139
-msgid "  (use \"git rebase --edit-todo\" to view and edit)"
-msgstr "  (используйте «git rebase --edit-todo», чтобы просмотреть и изменить)"
+#: sha1_file.c:2596
+#, c-format
+msgid "offset beyond end of pack index for %s (truncated index?)"
+msgstr "сдвиг за пределами индекса пакета для %s (обрезан индекс?)"
 
-#: wt-status.c:1152
+#: sha1_name.c:407
 #, c-format
-msgid "You are currently rebasing branch '%s' on '%s'."
-msgstr "Вы сейчас перемещаете ветку «%s» над «%s»."
+msgid "short SHA1 %s is ambiguous"
+msgstr "сокращённый SHA1 идентификатор %s неоднозначен"
 
-#: wt-status.c:1157
-msgid "You are currently rebasing."
-msgstr "Вы сейчас перемещаете ветку."
+#: sha1_name.c:418
+msgid "The candidates are:"
+msgstr "Возможно, вы имели в виду:"
 
-#: wt-status.c:1171
-msgid "  (fix conflicts and then run \"git rebase --continue\")"
-msgstr "  (разрешите конфликты, затем запустите «git rebase --continue»)"
+#: sha1_name.c:578
+msgid ""
+"Git normally never creates a ref that ends with 40 hex characters\n"
+"because it will be ignored when you just specify 40-hex. These refs\n"
+"may be created by mistake. For example,\n"
+"\n"
+"  git checkout -b $br $(git rev-parse ...)\n"
+"\n"
+"where \"$br\" is somehow empty and a 40-hex ref is created. Please\n"
+"examine these refs and maybe delete them. Turn this message off by\n"
+"running \"git config advice.objectNameWarning false\""
+msgstr "Обычно Git не создает ссылки, оканчивающиеся на 40 шестнадцатеричных\nсимволов, потому, что они будут игнорироваться, когда вы просто\nукажете это 40-символьное шестнадцатеричное число. Такие ссылки\nмогли быть созданы по ошибке. Например, с помощью:\n\n  git checkout -b $br $(git rev-parse …)\n\n, если «$br» оказался пустым, то ссылка с 40-символьным\nшестнадцатеричным числом будет создана. Пожалуйста, просмотрите эти\nссылки и, возможно, удалите их. Вы можете отключить это сообщение\nзапустив «git config advice.objectNameWarning false»"
 
-#: wt-status.c:1173
-msgid "  (use \"git rebase --skip\" to skip this patch)"
-msgstr "  (используйте «git rebase --skip», чтобы пропустить этот патч)"
+#: submodule.c:64 submodule.c:98
+msgid "Cannot change unmerged .gitmodules, resolve merge conflicts first"
+msgstr "Не удалось изменить не слитый .gitmodules, сначала разрешите конфликты"
 
-#: wt-status.c:1175
-msgid "  (use \"git rebase --abort\" to check out the original branch)"
-msgstr "  (используйте «git rebase --abort», чтобы перейти на оригинальную ветку)"
+#: submodule.c:68 submodule.c:102
+#, c-format
+msgid "Could not find section in .gitmodules where path=%s"
+msgstr "Не удалось найти раздел в .gitmodules, где путь равен %s"
 
-#: wt-status.c:1181
-msgid "  (all conflicts fixed: run \"git rebase --continue\")"
-msgstr "  (все конфликты разрешены: запустите «git rebase --continue»)"
+#: submodule.c:76
+#, c-format
+msgid "Could not update .gitmodules entry %s"
+msgstr " Не удалось обновить .gitmodules запись %s"
 
-#: wt-status.c:1185
+#: submodule.c:109
 #, c-format
-msgid ""
-"You are currently splitting a commit while rebasing branch '%s' on '%s'."
-msgstr "Вы сейчас разделяете коммит при перемещении ветки  «%s» над «%s»."
+msgid "Could not remove .gitmodules entry for %s"
+msgstr "Не удалось удалить запись в .gitmodules для %s"
 
-#: wt-status.c:1190
-msgid "You are currently splitting a commit during a rebase."
-msgstr "Вы сейчас разделяете коммит при перемещении ветки."
+#: submodule.c:120
+msgid "staging updated .gitmodules failed"
+msgstr "сбой индексирования обновленного .gitmodules"
 
-#: wt-status.c:1193
-msgid "  (Once your working directory is clean, run \"git rebase --continue\")"
-msgstr "(Как только ваш рабочий каталог будет чистый, запустите «git rebase --continue»)"
+#: submodule.c:158
+msgid "negative values not allowed for submodule.fetchJobs"
+msgstr "нельзя использовать отприцательные значения для submodule.fetchJobs"
 
-#: wt-status.c:1197
+#: submodule-config.c:358
 #, c-format
-msgid "You are currently editing a commit while rebasing branch '%s' on '%s'."
-msgstr "Вы сейчас редактируете коммит при перемещении ветки  «%s» над «%s»."
-
-#: wt-status.c:1202
-msgid "You are currently editing a commit during a rebase."
-msgstr "Вы сейчас редактируете коммит при перемещении ветки."
+msgid "invalid value for %s"
+msgstr "неправильное значение %s"
 
-#: wt-status.c:1205
-msgid "  (use \"git commit --amend\" to amend the current commit)"
-msgstr "  (используйте «git commit --amend», чтобы исправить текущий коммит)"
+#: trailer.c:238
+#, c-format
+msgid "running trailer command '%s' failed"
+msgstr "сбой при запуске команды завершителя «%s»"
 
-#: wt-status.c:1207
-msgid "  (use \"git rebase --continue\" once you are satisfied with your changes)"
-msgstr "  (используйте «git rebase --continue», когда будете довольны изменениями)"
+#: trailer.c:471 trailer.c:475 trailer.c:479 trailer.c:533 trailer.c:537
+#: trailer.c:541
+#, c-format
+msgid "unknown value '%s' for key '%s'"
+msgstr "неизвестное значение «%s» для ключа «%s»"
 
-#: wt-status.c:1217
+#: trailer.c:523 trailer.c:528 builtin/remote.c:289
 #, c-format
-msgid "You are currently cherry-picking commit %s."
-msgstr "Ð\92Ñ\8b ÐºÐ¾Ð¿Ð¸Ñ\80Ñ\83еÑ\82е ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82 %s."
+msgid "more than one %s"
+msgstr "болÑ\8cÑ\88е Ð¾Ð´Ð½Ð¾Ð³Ð¾ %s"
 
-#: wt-status.c:1222
-msgid "  (fix conflicts and run \"git cherry-pick --continue\")"
-msgstr "  (разрешите конфликты, затем запустите «git cherry-pick --continue»)"
+#: trailer.c:672
+#, c-format
+msgid "empty trailer token in trailer '%.*s'"
+msgstr "пустая последняя лексема в завершителе «%.*s»"
 
-#: wt-status.c:1225
-msgid "  (all conflicts fixed: run \"git cherry-pick --continue\")"
-msgstr "  (все конфликты разрешены: запустите «git cherry-pick --continue»)"
+#: trailer.c:695
+#, c-format
+msgid "could not read input file '%s'"
+msgstr "не удалось прочитать входной файл «%s»"
 
-#: wt-status.c:1227
-msgid "  (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)"
-msgstr "  (используйте «git cherry-pick --abort», чтобы отменить копирования коммита)"
+#: trailer.c:698
+msgid "could not read from stdin"
+msgstr "не удалось прочитать из стандартного ввода"
 
-#: wt-status.c:1236
+#: trailer.c:929 builtin/am.c:44
 #, c-format
-msgid "You are currently reverting commit %s."
-msgstr "Ð\92Ñ\8b Ñ\81ейÑ\87аÑ\81 Ð¾Ð±Ñ\80аÑ\89аеÑ\82е Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82а %s."
+msgid "could not stat %s"
+msgstr "не Ñ\83далоÑ\81Ñ\8c Ð²Ñ\8bполниÑ\82Ñ\8c stat Ð´Ð»Ñ\8f %s"
 
-#: wt-status.c:1241
-msgid "  (fix conflicts and run \"git revert --continue\")"
-msgstr "  (разрешите конфликты, затем запустите «git revert --continue»)"
+#: trailer.c:931
+#, c-format
+msgid "file %s is not a regular file"
+msgstr "файл %s не является обычным файлом"
 
-#: wt-status.c:1244
-msgid "  (all conflicts fixed: run \"git revert --continue\")"
-msgstr "  (все конфликты разрешены: запустите «git revert --continue»)"
+#: trailer.c:933
+#, c-format
+msgid "file %s is not writable by user"
+msgstr "файл %s не доступен на запись пользователю"
 
-#: wt-status.c:1246
-msgid "  (use \"git revert --abort\" to cancel the revert operation)"
-msgstr "  (используйте «git revert --abort», чтобы отменить операцию обращения изменений коммита)"
+#: trailer.c:945
+msgid "could not open temporary file"
+msgstr "не удалось создать временный файл"
 
-#: wt-status.c:1257
+#: trailer.c:983
 #, c-format
-msgid "You are currently bisecting, started from branch '%s'."
-msgstr "Вы сейчас в процессе двоичного поиска, начатого с ветки «%s»."
-
-#: wt-status.c:1261
-msgid "You are currently bisecting."
-msgstr "Вы сейчас в процессе двоичного поиска."
+msgid "could not rename temporary file to %s"
+msgstr "не удалось переименовать временный файл в %s"
 
-#: wt-status.c:1264
-msgid "  (use \"git bisect reset\" to get back to the original branch)"
-msgstr "  (используйте «git bisect reset», чтобы вернуться на исходную ветку)"
+#: transport.c:62
+#, c-format
+msgid "Would set upstream of '%s' to '%s' of '%s'\n"
+msgstr "Будет установлен вышестоящий репозиторий для «%s» на «%s» с «%s»\n"
 
-#: wt-status.c:1464
-msgid "On branch "
-msgstr "На ветке "
+#: transport.c:151
+#, c-format
+msgid "transport: invalid depth option '%s'"
+msgstr "транспорт: неправильный параметр глубины «%s»"
 
-#: wt-status.c:1470
-msgid "interactive rebase in progress; onto "
-msgstr "интерактивное перемещение в процессе; над "
+#: transport.c:817
+#, c-format
+msgid ""
+"The following submodule paths contain changes that can\n"
+"not be found on any remote:\n"
+msgstr "Подмодули по указанным путям содержат изменения, которые не найдены ни на одном из внешних репозиториев:\n"
 
-#: wt-status.c:1472
-msgid "rebase in progress; onto "
-msgstr "перемещение в процессе; над "
+#: transport.c:821
+#, c-format
+msgid ""
+"\n"
+"Please try\n"
+"\n"
+"\tgit push --recurse-submodules=on-demand\n"
+"\n"
+"or cd to the path and use\n"
+"\n"
+"\tgit push\n"
+"\n"
+"to push them to a remote.\n"
+"\n"
+msgstr "\nПопробуйте выполнить\n\n\tgit push --recurse-submodules=on-demand\n\nили перейти в каталог с помощью команды cd и выполнить\n\n\tgit push\n\nдля их отправки на внешний репозиторий.\n"
 
-#: wt-status.c:1477
-msgid "HEAD detached at "
-msgstr "HEAD отделён на "
+#: transport.c:829
+msgid "Aborting."
+msgstr "Прерываю."
 
-#: wt-status.c:1479
-msgid "HEAD detached from "
-msgstr "HEAD отделён начиная с "
+#: transport-helper.c:1075
+#, c-format
+msgid "Could not read ref %s"
+msgstr "Не удалось прочитать ссылку %s"
 
-#: wt-status.c:1482
-msgid "Not currently on any branch."
-msgstr "Сейчас ни на одной из веток"
+#: tree-walk.c:31
+msgid "too-short tree object"
+msgstr "слишком  короткий объект дерева"
 
-#: wt-status.c:1500
-msgid "Initial commit"
-msgstr "Ð\9dаÑ\87алÑ\8cнÑ\8bй ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82"
+#: tree-walk.c:37
+msgid "malformed mode in tree entry"
+msgstr "непÑ\80авилÑ\8cнÑ\8bй Ñ\80ежим Ð² Ð·Ð°Ð¿Ð¸Ñ\81и Ð´ÐµÑ\80ева"
 
-#: wt-status.c:1514
-msgid "Untracked files"
-msgstr "Ð\9dеоÑ\82Ñ\81леживаемÑ\8bе Ñ\84айлÑ\8b"
+#: tree-walk.c:41
+msgid "empty filename in tree entry"
+msgstr "пÑ\83Ñ\81Ñ\82ое Ð¸Ð¼Ñ\8f Ñ\84айла Ð² Ð·Ð°Ð¿Ð¸Ñ\81и Ð´ÐµÑ\80ева"
 
-#: wt-status.c:1516
-msgid "Ignored files"
-msgstr "Игнорируемые файлы"
+#: tree-walk.c:113
+msgid "too-short tree file"
+msgstr "слишком  короткий файл дерева"
 
-#: wt-status.c:1520
+#: unpack-trees.c:64
 #, c-format
 msgid ""
-"It took %.2f seconds to enumerate untracked files. 'status -uno'\n"
-"may speed it up, but you have to be careful not to forget to add\n"
-"new files yourself (see 'git help status')."
-msgstr "%.2f секунды занял вывод списка неотслеживаемых файлов. «status -uno» возможно может ускорить это, но будьте внимательны, и не забудьте добавить новые файлы вручную (смотрите «git help status» для подробностей)."
+"Your local changes to the following files would be overwritten by checkout:\n"
+"%%sPlease commit your changes or stash them before you switch branches."
+msgstr "Ваши локальные изменения в указанных файлах будут перезаписаны при переключении на состояние:\n%%sСделайте коммит или спрячьте ваши изменения перед переключением веток."
 
-#: wt-status.c:1526
+#: unpack-trees.c:66
 #, c-format
-msgid "Untracked files not listed%s"
-msgstr "Неотслеживаемые файлы не показаны%s"
-
-#: wt-status.c:1528
-msgid " (use -u option to show untracked files)"
-msgstr "(используйте опцию «-u», чтобы показать неотслеживаемые файлы)"
-
-#: wt-status.c:1534
-msgid "No changes"
-msgstr "Нет изменений"
+msgid ""
+"Your local changes to the following files would be overwritten by checkout:\n"
+"%%s"
+msgstr "Ваши локальные изменения в указанных файлах будут перезаписаны при переключении на состояние:\n%%s"
 
-#: wt-status.c:1539
+#: unpack-trees.c:69
 #, c-format
-msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n"
-msgstr "нет изменений добавленных для коммита\n(используйте «git add» и/или «git commit -a»)\n"
+msgid ""
+"Your local changes to the following files would be overwritten by merge:\n"
+"%%sPlease commit your changes or stash them before you merge."
+msgstr "Ваши локальные изменения в указанных файлах будут перезаписаны при слиянии:\n%%sСделайте коммит или спрячьте ваши изменения перед слиянием веток."
 
-#: wt-status.c:1542
+#: unpack-trees.c:71
 #, c-format
-msgid "no changes added to commit\n"
-msgstr "нет изменений добавленных для коммита\n"
+msgid ""
+"Your local changes to the following files would be overwritten by merge:\n"
+"%%s"
+msgstr "Ваши локальные изменения в указанных файлах будут перезаписаны при слиянии:\n%%s"
 
-#: wt-status.c:1545
+#: unpack-trees.c:74
 #, c-format
 msgid ""
-"nothing added to commit but untracked files present (use \"git add\" to "
-"track)\n"
-msgstr "ниÑ\87его Ð½Ðµ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¾ Ð² ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82, Ð½Ð¾ ÐµÑ\81Ñ\82Ñ\8c Ð½ÐµÐ¾Ñ\82Ñ\81леживаемÑ\8bе Ñ\84айлÑ\8b (иÑ\81полÑ\8cзÑ\83йÑ\82е Â«git add», Ñ\87Ñ\82обÑ\8b Ð¾Ñ\82Ñ\81леживаÑ\82Ñ\8c Ð¸Ñ\85)\n"
+"Your local changes to the following files would be overwritten by %s:\n"
+"%%sPlease commit your changes or stash them before you %s."
+msgstr "Ð\92аÑ\88и Ð»Ð¾ÐºÐ°Ð»Ñ\8cнÑ\8bе Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f Ð² Ñ\83казаннÑ\8bÑ\85 Ñ\84айлаÑ\85 Ð±Ñ\83дÑ\83Ñ\82 Ð¿ÐµÑ\80езапиÑ\81анÑ\8b Ð¿Ñ\80и %s:\n%%sСделайÑ\82е ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82 Ð¸Ð»Ð¸ Ñ\81пÑ\80Ñ\8fÑ\87Ñ\8cÑ\82е Ð²Ð°Ñ\88и Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f Ð¿ÐµÑ\80ед %s."
 
-#: wt-status.c:1548
+#: unpack-trees.c:76
 #, c-format
-msgid "nothing added to commit but untracked files present\n"
-msgstr "ничего не добавлено в коммит, но есть неотслеживаемые файлы\n"
+msgid ""
+"Your local changes to the following files would be overwritten by %s:\n"
+"%%s"
+msgstr "Ваши локальные изменения в указанных файлах будут перезаписаны при %s:\n%%s"
 
-#: wt-status.c:1551
+#: unpack-trees.c:81
 #, c-format
-msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
-msgstr "нечего коммитить (создайте/скопируйте файлы, затем запустите «git add», чтобы отслеживать их)\n"
+msgid ""
+"Updating the following directories would lose untracked files in it:\n"
+"%s"
+msgstr "Обновление указанных каталогов приведет к потере неотслеживаемых файлов в них:\n%s"
 
-#: wt-status.c:1554 wt-status.c:1559
+#: unpack-trees.c:85
 #, c-format
-msgid "nothing to commit\n"
-msgstr "нечего коммитить\n"
+msgid ""
+"The following untracked working tree files would be removed by checkout:\n"
+"%%sPlease move or remove them before you switch branches."
+msgstr "Указанные неотслеживаемые файлы в рабочем каталоге будут удалены при переключении на состояние:\n%%sПереместите эти файлы или удалите их перед переключением веток."
 
-#: wt-status.c:1557
+#: unpack-trees.c:87
 #, c-format
-msgid "nothing to commit (use -u to show untracked files)\n"
-msgstr "нечего коммитить (используйте опцию «-u», чтобы показать неотслеживаемые файлы)\n"
+msgid ""
+"The following untracked working tree files would be removed by checkout:\n"
+"%%s"
+msgstr "Указанные неотслеживаемые файлы в рабочем каталоге будут удалены при переключении на состояние:\n%%s"
 
-#: wt-status.c:1561
+#: unpack-trees.c:90
 #, c-format
-msgid "nothing to commit, working tree clean\n"
-msgstr "нечего коммитить, нет изменений в рабочем каталоге\n"
-
-#: wt-status.c:1668
-msgid "Initial commit on "
-msgstr "Начальный коммит на "
-
-#: wt-status.c:1672
-msgid "HEAD (no branch)"
-msgstr "HEAD (нет ветки)"
-
-#: wt-status.c:1701
-msgid "gone"
-msgstr "исчез"
-
-#: wt-status.c:1703 wt-status.c:1711
-msgid "behind "
-msgstr "позади"
-
-#: wt-status.c:1706 wt-status.c:1709
-msgid "ahead "
-msgstr "впереди "
+msgid ""
+"The following untracked working tree files would be removed by merge:\n"
+"%%sPlease move or remove them before you merge."
+msgstr "Указанные неотслеживаемые файлы в рабочем каталоге будут удалены при слиянии:\n%%sПереместите эти файлы или удалите их перед переключением веток."
 
-#: compat/precompose_utf8.c:57 builtin/clone.c:415
+#: unpack-trees.c:92
 #, c-format
-msgid "failed to unlink '%s'"
-msgstr "сбой отсоединения «%s»"
-
-#: builtin/add.c:22
-msgid "git add [<options>] [--] <pathspec>..."
-msgstr "git add [<опции>] [--] <спецификация-пути>…"
+msgid ""
+"The following untracked working tree files would be removed by merge:\n"
+"%%s"
+msgstr "Указанные неотслеживаемые файлы в рабочем каталоге будут удалены при слиянии:\n%%s"
 
-#: builtin/add.c:65
+#: unpack-trees.c:95
 #, c-format
-msgid "unexpected diff status %c"
-msgstr "неожиданный статус различий %c"
-
-#: builtin/add.c:71 builtin/commit.c:281
-msgid "updating files failed"
-msgstr "сбой при обновлении файлов"
+msgid ""
+"The following untracked working tree files would be removed by %s:\n"
+"%%sPlease move or remove them before you %s."
+msgstr "Указанные неотслеживаемые файлы в рабочем каталоге будут удалены при %s:\n%%sПереместите эти файлы или удалите их перед %s."
 
-#: builtin/add.c:81
+#: unpack-trees.c:97
 #, c-format
-msgid "remove '%s'\n"
-msgstr "удалить «%s»\n"
-
-#: builtin/add.c:136
-msgid "Unstaged changes after refreshing the index:"
-msgstr "Непроиндексированные изменения после обновления индекса:"
-
-#: builtin/add.c:196 builtin/rev-parse.c:811
-msgid "Could not read the index"
-msgstr "Не удалось прочитать индекс"
+msgid ""
+"The following untracked working tree files would be removed by %s:\n"
+"%%s"
+msgstr "Указанные неотслеживаемые файлы в рабочем каталоге будут удалены при %s:\n%%s"
 
-#: builtin/add.c:207
+#: unpack-trees.c:102
 #, c-format
-msgid "Could not open '%s' for writing."
-msgstr "Не удалось открыть «%s» для записи."
-
-#: builtin/add.c:211
-msgid "Could not write patch"
-msgstr "Не удалось записать патч"
-
-#: builtin/add.c:214
-msgid "editing patch failed"
-msgstr "сбой при редактировании патча"
+msgid ""
+"The following untracked working tree files would be overwritten by checkout:\n"
+"%%sPlease move or remove them before you switch branches."
+msgstr "Указанные неотслеживаемые файлы в рабочем каталоге будут перезаписаны при переключении на состояние:\n%%sПереместите эти файлы или удалите их перед переключением веток."
 
-#: builtin/add.c:217
+#: unpack-trees.c:104
 #, c-format
-msgid "Could not stat '%s'"
-msgstr "Не удалось выполнить stat для «%s»"
-
-#: builtin/add.c:219
-msgid "Empty patch. Aborted."
-msgstr "Пустой патч. Операция прервана."
+msgid ""
+"The following untracked working tree files would be overwritten by checkout:\n"
+"%%s"
+msgstr "Указанные неотслеживаемые файлы в рабочем каталоге будут перезаписаны при переключении на состояние:\n%%s"
 
-#: builtin/add.c:224
+#: unpack-trees.c:107
 #, c-format
-msgid "Could not apply '%s'"
-msgstr "Не удалось применить «%s»"
+msgid ""
+"The following untracked working tree files would be overwritten by merge:\n"
+"%%sPlease move or remove them before you merge."
+msgstr "Указанные неотслеживаемые файлы в рабочем каталоге будут перезаписаны при слиянии:\n%%sПереместите эти файлы или удалите их перед переключением веток."
 
-#: builtin/add.c:234
-msgid "The following paths are ignored by one of your .gitignore files:\n"
-msgstr "Следующие пути игнорируются одним из ваших файлов .gitignore:\n"
+#: unpack-trees.c:109
+#, c-format
+msgid ""
+"The following untracked working tree files would be overwritten by merge:\n"
+"%%s"
+msgstr "Указанные неотслеживаемые файлы в рабочем каталоге будут перезаписаны при слиянии:\n%%s"
 
-#: builtin/add.c:253 builtin/clean.c:870 builtin/fetch.c:113 builtin/mv.c:111
-#: builtin/prune-packed.c:55 builtin/pull.c:197 builtin/push.c:521
-#: builtin/remote.c:1327 builtin/rm.c:268 builtin/send-pack.c:162
-msgid "dry run"
-msgstr "пробный запуск"
+#: unpack-trees.c:112
+#, c-format
+msgid ""
+"The following untracked working tree files would be overwritten by %s:\n"
+"%%sPlease move or remove them before you %s."
+msgstr "Указанные неотслеживаемые файлы в рабочем каталоге будут перезаписаны при %s:\n%%sПереместите эти файлы или удалите их перед %s."
 
-#: builtin/add.c:254 builtin/apply.c:4854 builtin/check-ignore.c:19
-#: builtin/commit.c:1334 builtin/count-objects.c:85 builtin/fsck.c:593
-#: builtin/log.c:1852 builtin/mv.c:110 builtin/read-tree.c:114
-msgid "be verbose"
-msgstr "быть многословнее"
+#: unpack-trees.c:114
+#, c-format
+msgid ""
+"The following untracked working tree files would be overwritten by %s:\n"
+"%%s"
+msgstr "Указанные неотслеживаемые файлы в рабочем каталоге будут перезаписаны при %s:\n%%s"
 
-#: builtin/add.c:256
-msgid "interactive picking"
-msgstr "интерактивный выбор"
+#: unpack-trees.c:121
+#, c-format
+msgid "Entry '%s' overlaps with '%s'.  Cannot bind."
+msgstr "Запись «%s» частично совпадает с «%s».  Не удалось назначить соответствие."
 
-#: builtin/add.c:257 builtin/checkout.c:1157 builtin/reset.c:286
-msgid "select hunks interactively"
-msgstr "интерактивный выбор блоков"
+#: unpack-trees.c:124
+#, c-format
+msgid ""
+"Cannot update sparse checkout: the following entries are not up-to-date:\n"
+"%s"
+msgstr "Не удалось обновить частичное состояние: следующие элементы не последней версии:\n%s"
 
-#: builtin/add.c:258
-msgid "edit current diff and apply"
-msgstr "отредактировать текущий файл различий и применить его"
+#: unpack-trees.c:126
+#, c-format
+msgid ""
+"The following working tree files would be overwritten by sparse checkout update:\n"
+"%s"
+msgstr "Указанные файлы из рабочего каталога будут перезаписаны при обновлении частичного состояния:\n%s"
 
-#: builtin/add.c:259
-msgid "allow adding otherwise ignored files"
-msgstr "разрешить добавление игнорируемых иначе файлов"
+#: unpack-trees.c:128
+#, c-format
+msgid ""
+"The following working tree files would be removed by sparse checkout update:\n"
+"%s"
+msgstr "Указанные файлы из рабочего каталога будут удалены при обновлении частичного состояния:\n%s"
 
-#: builtin/add.c:260
-msgid "update tracked files"
-msgstr "обновить отслеживаемые файлы"
+#: unpack-trees.c:205
+#, c-format
+msgid "Aborting\n"
+msgstr "Прерываю\n"
 
-#: builtin/add.c:261
-msgid "record only the fact that the path will be added later"
-msgstr "запиÑ\81аÑ\82Ñ\8c Ñ\82олÑ\8cко Ñ\84акÑ\82, Ñ\87Ñ\82о Ð¿Ñ\83Ñ\82Ñ\8c Ð±Ñ\83деÑ\82 Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½ Ð¿Ð¾Ð·Ð¶Ðµ"
+#: unpack-trees.c:237
+msgid "Checking out files"
+msgstr "РаÑ\81паковка Ñ\84айлов"
 
-#: builtin/add.c:262
-msgid "add changes from all tracked and untracked files"
-msgstr "добавиÑ\82Ñ\8c Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f Ð¸Ð· Ð²Ñ\81еÑ\85 Ð¾Ñ\82Ñ\81леживаемÑ\8bÑ\85 Ð¸ Ð½ÐµÐ¾Ñ\82Ñ\81леживаемÑ\8bÑ\85 Ñ\84айлов"
+#: urlmatch.c:120
+msgid "invalid URL scheme name or missing '://' suffix"
+msgstr "Ð\9dепÑ\80авилÑ\8cнаÑ\8f Ð¸Ð¼Ñ\8f URL Ñ\81Ñ\85емÑ\8b Ð¸Ð»Ð¸ Ð¿Ñ\80опÑ\83Ñ\89ен Ñ\81Ñ\83Ñ\84Ñ\84икÑ\81 Â«://»"
 
-#: builtin/add.c:265
-msgid "ignore paths removed in the working tree (same as --no-all)"
-msgstr "игнорировать пути удаленные из рабочего каталога (тоже, что и --no-all)"
+#: urlmatch.c:144 urlmatch.c:297 urlmatch.c:356
+#, c-format
+msgid "invalid %XX escape sequence"
+msgstr "неправильная управляющая последовательность %XX"
 
-#: builtin/add.c:267
-msgid "don't add, only refresh the index"
-msgstr "не Ð´Ð¾Ð±Ð°Ð²Ð»Ñ\8fÑ\82Ñ\8c, Ñ\82олÑ\8cко Ð¾Ð±Ð½Ð¾Ð²Ð¸Ñ\82Ñ\8c Ð¸Ð½Ð´ÐµÐºÑ\81"
+#: urlmatch.c:172
+msgid "missing host and scheme is not 'file:'"
+msgstr "пÑ\80опÑ\83Ñ\89ено Ð¸Ð¼Ñ\8f Ñ\81еÑ\80веÑ\80а Ð¸ Ñ\81Ñ\85ема Ð´Ð¾Ñ\81Ñ\82Ñ\83па Ð½Ðµ Â«file:»"
 
-#: builtin/add.c:268
-msgid "just skip files which cannot be added because of errors"
-msgstr "пропускать файлы, которые не могут быть добавлены из-за ошибок"
+#: urlmatch.c:189
+msgid "a 'file:' URL may not have a port number"
+msgstr "URL со схемой «file:» не может содержать номер порта"
 
-#: builtin/add.c:269
-msgid "check if - even missing - files are ignored in dry run"
-msgstr "удостовериться, что даже недостающие файлы будут проигнорированы при  пробном запуске"
+#: urlmatch.c:199
+msgid "invalid characters in host name"
+msgstr "неправильные символы в имени сервера"
 
-#: builtin/add.c:270 builtin/update-index.c:958
-msgid "(+/-)x"
-msgstr "(+/-)x"
+#: urlmatch.c:244 urlmatch.c:255
+msgid "invalid port number"
+msgstr "неправильный номер порта"
 
-#: builtin/add.c:270 builtin/update-index.c:959
-msgid "override the executable bit of the listed files"
-msgstr "пеÑ\80еопÑ\80еделиÑ\82Ñ\8c Ð±Ð¸Ñ\82 Ð²Ñ\8bполнениÑ\8f Ð½Ð° Ñ\83казаннÑ\8bÑ\85 Ñ\84айлаÑ\85"
+#: urlmatch.c:322
+msgid "invalid '..' path segment"
+msgstr "непÑ\80авилÑ\8cнаÑ\8f Ñ\87аÑ\81Ñ\82Ñ\8c Ð¿Ñ\83Ñ\82и Â«..»"
 
-#: builtin/add.c:292
+#: worktree.c:282
 #, c-format
-msgid "Use -f if you really want to add them.\n"
-msgstr "Используйте -f, если вы действительно хотите добавить их.\n"
-
-#: builtin/add.c:300
-msgid "adding files failed"
-msgstr "ошибка при добавлении файлов"
-
-#: builtin/add.c:336
-msgid "-A and -u are mutually incompatible"
-msgstr "-A и -u нельзя использовать одновременно"
+msgid "failed to read '%s'"
+msgstr "не удалось прочитать «%s»"
 
-#: builtin/add.c:343
-msgid "Option --ignore-missing can only be used together with --dry-run"
-msgstr "Опция --ignore-missing может использоваться только вместе с --dry-run"
+#: wrapper.c:222 wrapper.c:392
+#, c-format
+msgid "could not open '%s' for reading and writing"
+msgstr "не удалось открыть «%s» для чтения и записи"
 
-#: builtin/add.c:352
+#: wrapper.c:224 wrapper.c:394 builtin/am.c:766
 #, c-format
-msgid "--chmod param '%s' must be either -x or +x"
-msgstr "паÑ\80амеÑ\82Ñ\80 --chmod Â«%s» Ð´Ð¾Ð»Ð¶ÐµÐ½ Ð±Ñ\8bÑ\82Ñ\8c -x Ð¸Ð»Ð¸ +x"
+msgid "could not open '%s' for writing"
+msgstr "не Ñ\83далоÑ\81Ñ\8c Ð¾Ñ\82кÑ\80Ñ\8bÑ\82Ñ\8c Â«%s» Ð´Ð»Ñ\8f Ð·Ð°Ð¿Ð¸Ñ\81и"
 
-#: builtin/add.c:367
+#: wrapper.c:226 wrapper.c:396 builtin/am.c:320 builtin/am.c:759
+#: builtin/am.c:847 builtin/commit.c:1705 builtin/merge.c:1029
+#: builtin/pull.c:341
 #, c-format
-msgid "Nothing specified, nothing added.\n"
-msgstr "Ð\9dиÑ\87его Ð½Ðµ Ñ\83казано, Ð½Ð¸Ñ\87его Ð½Ðµ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¾.\n"
+msgid "could not open '%s' for reading"
+msgstr "не Ñ\83далоÑ\81Ñ\8c Ð¾Ñ\82кÑ\80Ñ\8bÑ\82Ñ\8c Â«%s» Ð´Ð»Ñ\8f Ñ\87Ñ\82ениÑ\8f"
 
-#: builtin/add.c:368
+#: wrapper.c:605 wrapper.c:626
 #, c-format
-msgid "Maybe you wanted to say 'git add .'?\n"
-msgstr "Возможно, вы имели в виду «git add .»?\n"
+msgid "unable to access '%s'"
+msgstr "«%s» недоступно"
 
-#: builtin/add.c:373 builtin/check-ignore.c:172 builtin/checkout.c:279
-#: builtin/checkout.c:473 builtin/clean.c:914 builtin/commit.c:340
-#: builtin/mv.c:131 builtin/reset.c:235 builtin/rm.c:298
-#: builtin/submodule--helper.c:240
-msgid "index file corrupt"
-msgstr "файл индекса поврежден"
+#: wrapper.c:634
+msgid "unable to get current working directory"
+msgstr "не удалось получить текущий рабочий каталог"
 
-#: builtin/add.c:454 builtin/apply.c:4784 builtin/mv.c:286 builtin/rm.c:431
-msgid "Unable to write new index file"
-msgstr "Не удалось записать новый файл индекса"
+#: wrapper.c:658
+#, c-format
+msgid "could not write to %s"
+msgstr "не удалось записать в %s"
 
-#: builtin/am.c:257 builtin/commit.c:750 builtin/merge.c:1032
+#: wrapper.c:660
 #, c-format
-msgid "could not read '%s'"
-msgstr "не Ñ\83далоÑ\81Ñ\8c Ð¿Ñ\80оÑ\87иÑ\82аÑ\82Ñ\8c Â«%s»"
+msgid "could not close %s"
+msgstr "не Ñ\83далоÑ\81Ñ\8c Ð·Ð°ÐºÑ\80Ñ\8bÑ\82Ñ\8c %s"
 
-#: builtin/am.c:426
-msgid "could not parse author script"
-msgstr "не Ñ\83далоÑ\81Ñ\8c Ñ\80азобÑ\80аÑ\82Ñ\8c Ñ\81Ñ\86енаÑ\80ий Ð°Ð²Ñ\82оÑ\80Ñ\81Ñ\82ва"
+#: wt-status.c:151
+msgid "Unmerged paths:"
+msgstr "Ð\9dе Ñ\81лиÑ\82Ñ\8bе Ð¿Ñ\83Ñ\82и:"
 
-#: builtin/am.c:503
+#: wt-status.c:178 wt-status.c:205
 #, c-format
-msgid "'%s' was deleted by the applypatch-msg hook"
-msgstr "«%s» был удален перехватчиком applypatch-msg"
+msgid "  (use \"git reset %s <file>...\" to unstage)"
+msgstr "  (используйте «git reset %s <файл>…», чтобы убрать из индекса)"
 
-#: builtin/am.c:544 builtin/notes.c:301
-#, c-format
-msgid "Malformed input line: '%s'."
-msgstr "Неправильная строка ввода: «%s»."
+#: wt-status.c:180 wt-status.c:207
+msgid "  (use \"git rm --cached <file>...\" to unstage)"
+msgstr "  (используйте «git rm --cached <файл>…», чтобы убрать из индекса)"
 
-#: builtin/am.c:581 builtin/notes.c:316
-#, c-format
-msgid "Failed to copy notes from '%s' to '%s'"
-msgstr "Не удалось скопировать заметку из «%s» в «%s»"
+#: wt-status.c:184
+msgid "  (use \"git add <file>...\" to mark resolution)"
+msgstr "  (используйте «git add <файл>…», чтобы пометить разрешение конфликта)"
 
-#: builtin/am.c:607
-msgid "fseek failed"
-msgstr "сбой при выполнении fseek"
+#: wt-status.c:186 wt-status.c:190
+msgid "  (use \"git add/rm <file>...\" as appropriate to mark resolution)"
+msgstr "  (используйте «git add/rm <файл>…», чтобы пометить выбранное разрешение конфликта)"
 
-#: builtin/am.c:787
-#, c-format
-msgid "could not parse patch '%s'"
-msgstr "не удалось разобрать патч «%s»"
+#: wt-status.c:188
+msgid "  (use \"git rm <file>...\" to mark resolution)"
+msgstr "  (используйте «git rm <файл>…», чтобы пометить разрешение конфликта)"
 
-#: builtin/am.c:852
-msgid "Only one StGIT patch series can be applied at once"
-msgstr "ТолÑ\8cко Ñ\81еÑ\80иÑ\8f Ð¿Ð°Ñ\82Ñ\87ей StGIT Ð¼Ð¾Ð¶ÐµÑ\82 Ð±Ñ\8bÑ\82Ñ\8c Ð¿Ñ\80именена Ð·Ð° Ñ\80аз"
+#: wt-status.c:199 wt-status.c:945
+msgid "Changes to be committed:"
+msgstr "Ð\98зменениÑ\8f, ÐºÐ¾Ñ\82оÑ\80Ñ\8bе Ð±Ñ\83дÑ\83Ñ\82 Ð²ÐºÐ»Ñ\8eÑ\87енÑ\8b Ð² ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82:"
 
-#: builtin/am.c:899
-msgid "invalid timestamp"
-msgstr "недопÑ\83Ñ\81Ñ\82имаÑ\8f Ð¼ÐµÑ\82ка Ð´Ð°Ñ\82Ñ\8b/вÑ\80емени"
+#: wt-status.c:217 wt-status.c:954
+msgid "Changes not staged for commit:"
+msgstr "Ð\98зменениÑ\8f, ÐºÐ¾Ñ\82оÑ\80Ñ\8bе Ð½Ðµ Ð² Ð¸Ð½Ð´ÐµÐºÑ\81е Ð´Ð»Ñ\8f ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82а:"
 
-#: builtin/am.c:902 builtin/am.c:910
-msgid "invalid Date line"
-msgstr "недопустимая строка даты"
+#: wt-status.c:221
+msgid "  (use \"git add <file>...\" to update what will be committed)"
+msgstr "  (используйте «git add <файл>…», чтобы добавить файл в индекс)"
 
-#: builtin/am.c:907
-msgid "invalid timezone offset"
-msgstr "недопустимое смещение часового пояса"
+#: wt-status.c:223
+msgid "  (use \"git add/rm <file>...\" to update what will be committed)"
+msgstr "  (используйте «git add/rm <файл>…», чтобы добавить или удалить файл из индекса)"
 
-#: builtin/am.c:996
-msgid "Patch format detection failed."
-msgstr "Сбой определения формата патча."
+#: wt-status.c:224
+msgid ""
+"  (use \"git checkout -- <file>...\" to discard changes in working "
+"directory)"
+msgstr "  (используйте «git checkout -- <файл>…», чтобы отменить изменения\n   в рабочем каталоге)"
+
+#: wt-status.c:226
+msgid "  (commit or discard the untracked or modified content in submodules)"
+msgstr "  (сделайте коммит или отмените изменения в неотслеживаемом или измененном содержимом в подмодулях)"
 
-#: builtin/am.c:1001 builtin/clone.c:380
+#: wt-status.c:238
 #, c-format
-msgid "failed to create directory '%s'"
-msgstr "не удалось создать каталог «%s»"
+msgid "  (use \"git %s <file>...\" to include in what will be committed)"
+msgstr "  (используйте «git %s <файл>…», чтобы добавить в то, что будет включено в коммит)"
 
-#: builtin/am.c:1005
-msgid "Failed to split patches."
-msgstr "Ð\9dе Ñ\83далоÑ\81Ñ\8c Ñ\80азделиÑ\82Ñ\8c Ð¿Ð°Ñ\82Ñ\87и Ð½Ð° Ñ\87аÑ\81Ñ\82и."
+#: wt-status.c:253
+msgid "both deleted:"
+msgstr "оба Ñ\83даленÑ\8b:"
 
-#: builtin/am.c:1137 builtin/commit.c:366
-msgid "unable to write index file"
-msgstr "не Ñ\83далоÑ\81Ñ\8c Ð·Ð°Ð¿Ð¸Ñ\81аÑ\82Ñ\8c Ð¸Ð½Ð´ÐµÐºÑ\81"
+#: wt-status.c:255
+msgid "added by us:"
+msgstr "добавлено Ð½Ð°Ð¼Ð¸:"
 
-#: builtin/am.c:1188
-#, c-format
-msgid "When you have resolved this problem, run \"%s --continue\"."
-msgstr "Когда вы устраните эту проблему, запустите «%s --continue»."
+#: wt-status.c:257
+msgid "deleted by them:"
+msgstr "удалено ими:"
 
-#: builtin/am.c:1189
-#, c-format
-msgid "If you prefer to skip this patch, run \"%s --skip\" instead."
-msgstr "Если вы хотите пропустить этот патч, то запустите «%s --skip»."
+#: wt-status.c:259
+msgid "added by them:"
+msgstr "добавлено ими:"
 
-#: builtin/am.c:1190
-#, c-format
-msgid "To restore the original branch and stop patching, run \"%s --abort\"."
-msgstr "Чтобы вернуться на предыдущую ветку и остановить применение изменений, запустите «%s --abort»."
+#: wt-status.c:261
+msgid "deleted by us:"
+msgstr "удалено нами:"
+
+#: wt-status.c:263
+msgid "both added:"
+msgstr "оба добавлены:"
+
+#: wt-status.c:265
+msgid "both modified:"
+msgstr "оба измены:"
+
+#: wt-status.c:275
+msgid "new file:"
+msgstr "новый файл:"
 
-#: builtin/am.c:1328
-msgid "Patch is empty. Was it split wrong?"
-msgstr "Патч пуст. Возможно, он был неправильно разделён?"
+#: wt-status.c:277
+msgid "copied:"
+msgstr "скопировано:"
 
-#: builtin/am.c:1402 builtin/log.c:1543
-#, c-format
-msgid "invalid ident line: %s"
-msgstr "неправильная строка идентификации: %s"
+#: wt-status.c:279
+msgid "deleted:"
+msgstr "удалено:"
 
-#: builtin/am.c:1429
-#, c-format
-msgid "unable to parse commit %s"
-msgstr "не удалось разобрать коммит %s"
+#: wt-status.c:281
+msgid "modified:"
+msgstr "изменено:"
 
-#: builtin/am.c:1602
-msgid "Repository lacks necessary blobs to fall back on 3-way merge."
-msgstr "Ð\92 Ñ\80епозиÑ\82оÑ\80ии Ð¾Ñ\82Ñ\81Ñ\83Ñ\82Ñ\81Ñ\82вÑ\83Ñ\8eÑ\82 Ð´Ð²Ð¾Ð¸Ñ\87нÑ\8bе Ð¾Ð±Ñ\8aекÑ\82Ñ\8b, Ð½ÐµÐ¾Ð±Ñ\85одимÑ\8bе Ð´Ð»Ñ\8f Ð¾Ñ\82каÑ\82а Ðº Ñ\82Ñ\80еÑ\85Ñ\85одовомÑ\83 Ñ\81лиÑ\8fниÑ\8e."
+#: wt-status.c:283
+msgid "renamed:"
+msgstr "пеÑ\80еименовано:"
 
-#: builtin/am.c:1604
-msgid "Using index info to reconstruct a base tree..."
-msgstr "Ð\98Ñ\81полÑ\8cзÑ\83Ñ\8e Ð¸Ð½Ð´ÐµÐºÑ\81 Ð´Ð»Ñ\8f Ñ\80еконÑ\81Ñ\82Ñ\80Ñ\83кÑ\86ии Ð±Ð°Ð·Ð¾Ð²Ð¾Ð³Ð¾ Ð´ÐµÑ\80еваâ\80¦"
+#: wt-status.c:285
+msgid "typechange:"
+msgstr "изменен Ñ\82ип:"
 
-#: builtin/am.c:1623
-msgid ""
-"Did you hand edit your patch?\n"
-"It does not apply to blobs recorded in its index."
-msgstr "Вы вручную изменяли патч?\nОн не накладывается без ошибок на двоичные объекты, записанные в его заголовке."
+#: wt-status.c:287
+msgid "unknown:"
+msgstr "неизвестно:"
 
-#: builtin/am.c:1629
-msgid "Falling back to patching base and 3-way merge..."
-msgstr "Ð\9eÑ\82каÑ\82 Ðº Ð¿Ñ\80именениÑ\8e Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ Ðº Ð±Ð°Ð·Ð¾Ð²Ð¾Ð¼Ñ\83 ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82Ñ\83 Ñ\81 Ð¿Ð¾Ð¼Ð¾Ñ\89Ñ\8cÑ\8e Ñ\82Ñ\80еÑ\85Ñ\85одового Ñ\81лиÑ\8fниÑ\8fâ\80¦"
+#: wt-status.c:289
+msgid "unmerged:"
+msgstr "не Ñ\81лиÑ\82Ñ\8bе:"
 
-#: builtin/am.c:1654
-msgid "Failed to merge in the changes."
-msgstr "Ð\9dе Ñ\83далоÑ\81Ñ\8c Ñ\81лиÑ\82Ñ\8c Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f."
+#: wt-status.c:371
+msgid "new commits, "
+msgstr "новÑ\8bе ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82Ñ\8b"
 
-#: builtin/am.c:1679 builtin/merge.c:628
-msgid "git write-tree failed to write a tree"
-msgstr "git write-tree не удалось записать дерево"
+#: wt-status.c:373
+msgid "modified content, "
+msgstr "изменено содержимое, "
 
-#: builtin/am.c:1686
-msgid "applying to an empty history"
-msgstr "пÑ\80именение Ðº Ð¿Ñ\83Ñ\81Ñ\82ой Ð¸Ñ\81Ñ\82оÑ\80ии"
+#: wt-status.c:375
+msgid "untracked content, "
+msgstr "неоÑ\82Ñ\81леживаемое Ñ\81одеÑ\80жимое, "
 
-#: builtin/am.c:1699 builtin/commit.c:1776 builtin/merge.c:798
-#: builtin/merge.c:823
-msgid "failed to write commit object"
-msgstr "сбой записи объекта коммита"
+#: wt-status.c:818
+msgid "Submodules changed but not updated:"
+msgstr "Измененные, но не обновленные подмодули:"
 
-#: builtin/am.c:1731 builtin/am.c:1735
-#, c-format
-msgid "cannot resume: %s does not exist."
-msgstr "нельзя продолжнить: %s не существует "
+#: wt-status.c:820
+msgid "Submodule changes to be committed:"
+msgstr "Изменения в подмодулях, которые будут закоммичены:"
 
-#: builtin/am.c:1751
-msgid "cannot be interactive without stdin connected to a terminal."
-msgstr "не удалось использовать интерактивное поведение, без stdin подключенного к терминалу."
+#: wt-status.c:901
+msgid ""
+"Do not touch the line above.\n"
+"Everything below will be removed."
+msgstr "Не трогайте строку выше этой.\nВсё, что ниже — будет удалено."
 
-#: builtin/am.c:1756
-msgid "Commit Body is:"
-msgstr "Тело ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82а:"
+#: wt-status.c:1013
+msgid "You have unmerged paths."
+msgstr "У Ð²Ð°Ñ\81 ÐµÑ\81Ñ\82Ñ\8c Ð½Ðµ Ñ\81лиÑ\82Ñ\8bе Ð¿Ñ\83Ñ\82и."
 
-#. TRANSLATORS: Make sure to include [y], [n], [e], [v] and [a]
-#. in your translation. The program will only accept English
-#. input at this point.
-#: builtin/am.c:1766
-msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all: "
-msgstr "Применить? [y] - да/[n] - нет/[e] - редактировать/[v] - просмотреть патч/[a] - применить всё: "
+#: wt-status.c:1016
+msgid "  (fix conflicts and run \"git commit\")"
+msgstr "  (разрешите конфликты, затем запустите «git commit»)"
 
-#: builtin/am.c:1816
-#, c-format
-msgid "Dirty index: cannot apply patches (dirty: %s)"
-msgstr "Индекс не пустой: нельзя применять патчи (в индексе: %s)"
+#: wt-status.c:1018
+msgid "  (use \"git merge --abort\" to abort the merge)"
+msgstr "  (используйте «git merge --abort», чтобы остановить операцию слияния)"
 
-#: builtin/am.c:1853 builtin/am.c:1925
-#, c-format
-msgid "Applying: %.*s"
-msgstr "Применение: %.*s"
+#: wt-status.c:1023
+msgid "All conflicts fixed but you are still merging."
+msgstr "Все конфликты исправлены, но вы все еще в процессе слияния."
 
-#: builtin/am.c:1869
-msgid "No changes -- Patch already applied."
-msgstr "Нет изменений — Патч уже применен."
+#: wt-status.c:1026
+msgid "  (use \"git commit\" to conclude merge)"
+msgstr "  (используйте «git commit», чтобы завершить слияние)"
 
-#: builtin/am.c:1877
-#, c-format
-msgid "Patch failed at %s %.*s"
-msgstr "Ошибка применения изменений на %s %.*s"
+#: wt-status.c:1036
+msgid "You are in the middle of an am session."
+msgstr "Вы в процессе сессии am."
 
-#: builtin/am.c:1883
-#, c-format
-msgid "The copy of the patch that failed is found in: %s"
-msgstr "Копию изменений, которые не удалось применить, вы можете найти в: %s"
+#: wt-status.c:1039
+msgid "The current patch is empty."
+msgstr "Текущий патч пустой."
 
-#: builtin/am.c:1928
-msgid ""
-"No changes - did you forget to use 'git add'?\n"
-"If there is nothing left to stage, chances are that something else\n"
-"already introduced the same changes; you might want to skip this patch."
-msgstr "Нет изменений — возможно, вы забыли вызвать «git add»?\nЕсли ничего не осталось для индексации, то, скорее всего, что-то другое уже сделало те же изменения; возможно, вам следует пропустить этот патч."
+#: wt-status.c:1043
+msgid "  (fix conflicts and then run \"git am --continue\")"
+msgstr "  (разрешите конфликты, затем запустите «git am --continue»)"
 
-#: builtin/am.c:1935
-msgid ""
-"You still have unmerged paths in your index.\n"
-"Did you forget to use 'git add'?"
-msgstr "У вас все еще имеются не слитые пути в индексе.\nВозможно, вы забыли вызвать «git add»?"
+#: wt-status.c:1045
+msgid "  (use \"git am --skip\" to skip this patch)"
+msgstr "  (используйте «git am --skip», чтобы пропустить этот патч)"
 
-#: builtin/am.c:2043 builtin/am.c:2047 builtin/am.c:2059 builtin/reset.c:308
-#: builtin/reset.c:316
-#, c-format
-msgid "Could not parse object '%s'."
-msgstr "Не удалось разобрать объект «%s»."
+#: wt-status.c:1047
+msgid "  (use \"git am --abort\" to restore the original branch)"
+msgstr "  (используйте «git am --abort», чтобы восстановить оригинальную ветку)"
 
-#: builtin/am.c:2095
-msgid "failed to clean index"
-msgstr "не Ñ\83далоÑ\81Ñ\8c Ð¾Ñ\87иÑ\81Ñ\82иÑ\82Ñ\8c Ð¸Ð½Ð´ÐµÐºÑ\81"
+#: wt-status.c:1172
+msgid "No commands done."
+msgstr "Ð\9aомандÑ\8b Ð½Ðµ Ð²Ñ\8bполненÑ\8b."
 
-#: builtin/am.c:2129
-msgid ""
-"You seem to have moved HEAD since the last 'am' failure.\n"
-"Not rewinding to ORIG_HEAD"
-msgstr "Похоже, что вы переместили HEAD с момента последней ошибки выполнения «am».\nПеремотка на ORIG_HEAD не выполняется"
+#: wt-status.c:1175
+#, c-format
+msgid "Last command done (%d command done):"
+msgid_plural "Last commands done (%d commands done):"
+msgstr[0] "Последняя команда выполнена (%d команда выполнена):"
+msgstr[1] "Последняя команда выполнена (%d команды выполнено):"
+msgstr[2] "Последняя команда выполнена (%d команд выполнено):"
+msgstr[3] "Последняя команда выполнена (%d команд выполнено):"
 
-#: builtin/am.c:2192
+#: wt-status.c:1186
 #, c-format
-msgid "Invalid value for --patch-format: %s"
-msgstr "Неправильное значение для --patch-format: %s"
+msgid "  (see more in file %s)"
+msgstr "  (смотрите дополнительно в файле %s)"
 
-#: builtin/am.c:2225
-msgid "git am [<options>] [(<mbox>|<Maildir>)...]"
-msgstr "git am [<опции>] [(<mbox>|<Maildir>)…]"
+#: wt-status.c:1191
+msgid "No commands remaining."
+msgstr "Команд больше не осталось."
 
-#: builtin/am.c:2226
-msgid "git am [<options>] (--continue | --skip | --abort)"
-msgstr "git am [<опции>] (--continue | --skip | --abort)"
+#: wt-status.c:1194
+#, c-format
+msgid "Next command to do (%d remaining command):"
+msgid_plural "Next commands to do (%d remaining commands):"
+msgstr[0] "Следующая команда для выполнения (%d команда осталась):"
+msgstr[1] "Следующая команда для выполнения (%d команды осталось):"
+msgstr[2] "Следующая команда для выполнения (%d команд осталось):"
+msgstr[3] "Следующая команда для выполнения (%d команд осталось):"
 
-#: builtin/am.c:2232
-msgid "run interactively"
-msgstr "запустить в интерактивном режиме"
+#: wt-status.c:1202
+msgid "  (use \"git rebase --edit-todo\" to view and edit)"
+msgstr "  (используйте «git rebase --edit-todo», чтобы просмотреть и изменить)"
 
-#: builtin/am.c:2234
-msgid "historical option -- no-op"
-msgstr "историческая опция — ничего не делает"
+#: wt-status.c:1215
+#, c-format
+msgid "You are currently rebasing branch '%s' on '%s'."
+msgstr "Вы сейчас перемещаете ветку «%s» над «%s»."
 
-#: builtin/am.c:2236
-msgid "allow fall back on 3way merging if needed"
-msgstr "разрешить откатиться к трехходовому слиянию, если нужно"
+#: wt-status.c:1220
+msgid "You are currently rebasing."
+msgstr "Вы сейчас перемещаете ветку."
 
-#: builtin/am.c:2237 builtin/init-db.c:481 builtin/prune-packed.c:57
-#: builtin/repack.c:172
-msgid "be quiet"
-msgstr "тихий режим"
+#: wt-status.c:1234
+msgid "  (fix conflicts and then run \"git rebase --continue\")"
+msgstr "  (разрешите конфликты, затем запустите «git rebase --continue»)"
 
-#: builtin/am.c:2239
-msgid "add a Signed-off-by line to the commit message"
-msgstr "добавить строку Signed-off-by к сообщению коммита"
+#: wt-status.c:1236
+msgid "  (use \"git rebase --skip\" to skip this patch)"
+msgstr "  (используйте «git rebase --skip», чтобы пропустить этот патч)"
 
-#: builtin/am.c:2242
-msgid "recode into utf8 (default)"
-msgstr "перекодировать в utf8 (по умолчанию)"
+#: wt-status.c:1238
+msgid "  (use \"git rebase --abort\" to check out the original branch)"
+msgstr "  (используйте «git rebase --abort», чтобы перейти на оригинальную ветку)"
 
-#: builtin/am.c:2244
-msgid "pass -k flag to git-mailinfo"
-msgstr "передать флаг -k в git-mailinfo"
+#: wt-status.c:1244
+msgid "  (all conflicts fixed: run \"git rebase --continue\")"
+msgstr "  (все конфликты разрешены: запустите «git rebase --continue»)"
 
-#: builtin/am.c:2246
-msgid "pass -b flag to git-mailinfo"
-msgstr "передать флаг -b в git-mailinfo"
+#: wt-status.c:1248
+#, c-format
+msgid ""
+"You are currently splitting a commit while rebasing branch '%s' on '%s'."
+msgstr "Вы сейчас разделяете коммит при перемещении ветки  «%s» над «%s»."
 
-#: builtin/am.c:2248
-msgid "pass -m flag to git-mailinfo"
-msgstr "пеÑ\80едаÑ\82Ñ\8c Ñ\84лаг -m Ð² git-mailinfo"
+#: wt-status.c:1253
+msgid "You are currently splitting a commit during a rebase."
+msgstr "Ð\92Ñ\8b Ñ\81ейÑ\87аÑ\81 Ñ\80азделÑ\8fеÑ\82е ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82 Ð¿Ñ\80и Ð¿ÐµÑ\80емеÑ\89ении Ð²ÐµÑ\82ки."
 
-#: builtin/am.c:2250
-msgid "pass --keep-cr flag to git-mailsplit for mbox format"
-msgstr "передать флаг --keep-cr в git-mailsplit для формата mbox"
+#: wt-status.c:1256
+msgid "  (Once your working directory is clean, run \"git rebase --continue\")"
+msgstr "(Как только ваш рабочий каталог будет чистый, запустите «git rebase --continue»)"
 
-#: builtin/am.c:2253
-msgid "do not pass --keep-cr flag to git-mailsplit independent of am.keepcr"
-msgstr "не передавать --keep-cr флаг в git-mailsplit вне зависимости от am.keepcr"
+#: wt-status.c:1260
+#, c-format
+msgid "You are currently editing a commit while rebasing branch '%s' on '%s'."
+msgstr "Вы сейчас редактируете коммит при перемещении ветки  «%s» над «%s»."
 
-#: builtin/am.c:2256
-msgid "strip everything before a scissors line"
-msgstr "обÑ\80езаÑ\82Ñ\8c Ð²Ñ\81е Ð´Ð¾ Ñ\81Ñ\82Ñ\80оки Ð¾Ð±Ñ\80езки"
+#: wt-status.c:1265
+msgid "You are currently editing a commit during a rebase."
+msgstr "Ð\92Ñ\8b Ñ\81ейÑ\87аÑ\81 Ñ\80едакÑ\82иÑ\80Ñ\83еÑ\82е ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82 Ð¿Ñ\80и Ð¿ÐµÑ\80емеÑ\89ении Ð²ÐµÑ\82ки."
 
-#: builtin/am.c:2257 builtin/apply.c:4837
-msgid "action"
-msgstr "действие"
+#: wt-status.c:1268
+msgid "  (use \"git commit --amend\" to amend the current commit)"
+msgstr "  (используйте «git commit --amend», чтобы исправить текущий коммит)"
 
-#: builtin/am.c:2258 builtin/am.c:2261 builtin/am.c:2264 builtin/am.c:2267
-#: builtin/am.c:2270 builtin/am.c:2273 builtin/am.c:2276 builtin/am.c:2279
-#: builtin/am.c:2285
-msgid "pass it through git-apply"
-msgstr "передать его в git-apply"
+#: wt-status.c:1270
+msgid "  (use \"git rebase --continue\" once you are satisfied with your changes)"
+msgstr "  (используйте «git rebase --continue», когда будете довольны изменениями)"
 
-#: builtin/am.c:2266 builtin/apply.c:4861
-msgid "root"
-msgstr "корень"
+#: wt-status.c:1280
+#, c-format
+msgid "You are currently cherry-picking commit %s."
+msgstr "Вы копируете коммит %s."
 
-#: builtin/am.c:2269 builtin/am.c:2272 builtin/apply.c:4799
-#: builtin/apply.c:4802 builtin/clone.c:90 builtin/fetch.c:96
-#: builtin/pull.c:179 builtin/submodule--helper.c:277
-#: builtin/submodule--helper.c:402 builtin/submodule--helper.c:482
-#: builtin/submodule--helper.c:485 builtin/submodule--helper.c:823
-#: builtin/submodule--helper.c:826
-msgid "path"
-msgstr "путь"
+#: wt-status.c:1285
+msgid "  (fix conflicts and run \"git cherry-pick --continue\")"
+msgstr "  (разрешите конфликты, затем запустите «git cherry-pick --continue»)"
 
-#: builtin/am.c:2275 builtin/fmt-merge-msg.c:666 builtin/fmt-merge-msg.c:669
-#: builtin/grep.c:706 builtin/merge.c:200 builtin/pull.c:134
-#: builtin/pull.c:193 builtin/repack.c:181 builtin/repack.c:185
-#: builtin/show-branch.c:645 builtin/show-ref.c:175 builtin/tag.c:340
-#: parse-options.h:132 parse-options.h:134 parse-options.h:244
-msgid "n"
-msgstr "n"
+#: wt-status.c:1288
+msgid "  (all conflicts fixed: run \"git cherry-pick --continue\")"
+msgstr "  (все конфликты разрешены: запустите «git cherry-pick --continue»)"
 
-#: builtin/am.c:2278 builtin/apply.c:4805
-msgid "num"
-msgstr "количество"
+#: wt-status.c:1290
+msgid "  (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)"
+msgstr "  (используйте «git cherry-pick --abort», чтобы отменить копирования коммита)"
 
-#: builtin/am.c:2281 builtin/for-each-ref.c:37 builtin/replace.c:438
-#: builtin/tag.c:372
-msgid "format"
-msgstr "формат"
+#: wt-status.c:1299
+#, c-format
+msgid "You are currently reverting commit %s."
+msgstr "Вы сейчас обращаете изменения коммита %s."
 
-#: builtin/am.c:2282
-msgid "format the patch(es) are in"
-msgstr "формат, в котором находятся патчи"
+#: wt-status.c:1304
+msgid "  (fix conflicts and run \"git revert --continue\")"
+msgstr "  (разрешите конфликты, затем запустите «git revert --continue»)"
 
-#: builtin/am.c:2288
-msgid "override error message when patch failure occurs"
-msgstr "переопределить сообщение об ошибке, если не удалось наложить изменения"
+#: wt-status.c:1307
+msgid "  (all conflicts fixed: run \"git revert --continue\")"
+msgstr "  (все конфликты разрешены: запустите «git revert --continue»)"
 
-#: builtin/am.c:2290
-msgid "continue applying patches after resolving a conflict"
-msgstr "продолжить применение изменений после разрешения конфиликта"
+#: wt-status.c:1309
+msgid "  (use \"git revert --abort\" to cancel the revert operation)"
+msgstr "  (используйте «git revert --abort», чтобы отменить операцию обращения изменений коммита)"
 
-#: builtin/am.c:2293
-msgid "synonyms for --continue"
-msgstr "синоним для --continue"
+#: wt-status.c:1320
+#, c-format
+msgid "You are currently bisecting, started from branch '%s'."
+msgstr "Вы сейчас в процессе двоичного поиска, начатого с ветки «%s»."
 
-#: builtin/am.c:2296
-msgid "skip the current patch"
-msgstr "пÑ\80опÑ\83Ñ\81Ñ\82иÑ\82Ñ\8c Ñ\82екÑ\83Ñ\89ий Ð¿Ð°Ñ\82Ñ\87"
+#: wt-status.c:1324
+msgid "You are currently bisecting."
+msgstr "Ð\92Ñ\8b Ñ\81ейÑ\87аÑ\81 Ð² Ð¿Ñ\80оÑ\86еÑ\81Ñ\81е Ð´Ð²Ð¾Ð¸Ñ\87ного Ð¿Ð¾Ð¸Ñ\81ка."
 
-#: builtin/am.c:2299
-msgid "restore the original branch and abort the patching operation."
-msgstr "восстановить оригинальную ветку и отменить операцию применения изменений."
+#: wt-status.c:1327
+msgid "  (use \"git bisect reset\" to get back to the original branch)"
+msgstr "  (используйте «git bisect reset», чтобы вернуться на исходную ветку)"
 
-#: builtin/am.c:2303
-msgid "lie about committer date"
-msgstr "соврать о дате коммитера"
+#: wt-status.c:1524
+msgid "On branch "
+msgstr "На ветке "
 
-#: builtin/am.c:2305
-msgid "use current timestamp for author date"
-msgstr "использовать текущее время как время авторства"
+#: wt-status.c:1530
+msgid "interactive rebase in progress; onto "
+msgstr "интерактивное перемещение в процессе; над "
 
-#: builtin/am.c:2307 builtin/commit.c:1610 builtin/merge.c:229
-#: builtin/pull.c:164 builtin/revert.c:92 builtin/tag.c:355
-msgid "key-id"
-msgstr "key-id"
+#: wt-status.c:1532
+msgid "rebase in progress; onto "
+msgstr "перемещение в процессе; над "
 
-#: builtin/am.c:2308
-msgid "GPG-sign commits"
-msgstr "подписать коммиты с помощью GPG"
+#: wt-status.c:1537
+msgid "HEAD detached at "
+msgstr "HEAD отделён на "
 
-#: builtin/am.c:2311
-msgid "(internal use for git-rebase)"
-msgstr "(внутреннее использование для git-rebase)"
+#: wt-status.c:1539
+msgid "HEAD detached from "
+msgstr "HEAD отделён начиная с "
 
-#: builtin/am.c:2326
-msgid ""
-"The -b/--binary option has been a no-op for long time, and\n"
-"it will be removed. Please do not use it anymore."
-msgstr "Опция -b/--binary уже долгое время ничего не делает и будет удалена с следующих версиях Git. Пожалуйста, не используйте ее."
+#: wt-status.c:1542
+msgid "Not currently on any branch."
+msgstr "Сейчас ни на одной из веток"
 
-#: builtin/am.c:2333
-msgid "failed to read the index"
-msgstr "сбой чтения индекса"
+#: wt-status.c:1560
+msgid "Initial commit"
+msgstr "Начальный коммит"
 
-#: builtin/am.c:2348
-#, c-format
-msgid "previous rebase directory %s still exists but mbox given."
-msgstr "предыдущий каталог перемещения %s еще существует, но передан mbox."
+#: wt-status.c:1574
+msgid "Untracked files"
+msgstr "Неотслеживаемые файлы"
 
-#: builtin/am.c:2372
+#: wt-status.c:1576
+msgid "Ignored files"
+msgstr "Игнорируемые файлы"
+
+#: wt-status.c:1580
 #, c-format
 msgid ""
-"Stray %s directory found.\n"
-"Use \"git am --abort\" to remove it."
-msgstr "Найден забытый каталог %s.\nИспользуйте «git am --abort», чтобы удалить его."
+"It took %.2f seconds to enumerate untracked files. 'status -uno'\n"
+"may speed it up, but you have to be careful not to forget to add\n"
+"new files yourself (see 'git help status')."
+msgstr "%.2f секунды занял вывод списка неотслеживаемых файлов. «status -uno» возможно может ускорить это, но будьте внимательны, и не забудьте добавить новые файлы вручную (смотрите «git help status» для подробностей)."
 
-#: builtin/am.c:2378
-msgid "Resolve operation not in progress, we are not resuming."
-msgstr "Операция разрешения конфликтов не в процессе выполнения, не продолжаем."
+#: wt-status.c:1586
+#, c-format
+msgid "Untracked files not listed%s"
+msgstr "Неотслеживаемые файлы не показаны%s"
 
-#: builtin/apply.c:122
-msgid "git apply [<options>] [<patch>...]"
-msgstr "git apply [<опции>] [<патч>…]"
+#: wt-status.c:1588
+msgid " (use -u option to show untracked files)"
+msgstr "(используйте опцию «-u», чтобы показать неотслеживаемые файлы)"
 
-#: builtin/apply.c:153
-#, c-format
-msgid "unrecognized whitespace option '%s'"
-msgstr "неопознанная опция для пробелов «%s»"
+#: wt-status.c:1594
+msgid "No changes"
+msgstr "Нет изменений"
 
-#: builtin/apply.c:169
+#: wt-status.c:1599
 #, c-format
-msgid "unrecognized whitespace ignore option '%s'"
-msgstr "неопознанная опция для игнорирования пробелов «%s»"
+msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n"
+msgstr "нет изменений добавленных для коммита\n(используйте «git add» и/или «git commit -a»)\n"
 
-#: builtin/apply.c:854
+#: wt-status.c:1602
 #, c-format
-msgid "Cannot prepare timestamp regexp %s"
-msgstr "Ð\9dе Ñ\83далоÑ\81Ñ\8c Ð¿Ð¾Ð´Ð³Ð¾Ñ\82овиÑ\82Ñ\8c Ñ\80егÑ\83лÑ\8fÑ\80ное Ð²Ñ\8bÑ\80ажение Ð´Ð»Ñ\8f Ð¼ÐµÑ\82ки Ð²Ñ\80емени %s"
+msgid "no changes added to commit\n"
+msgstr "неÑ\82 Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð½Ñ\8bÑ\85 Ð´Ð»Ñ\8f ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82а\n"
 
-#: builtin/apply.c:863
+#: wt-status.c:1605
 #, c-format
-msgid "regexec returned %d for input: %s"
-msgstr "regexec возвратил %d для ввода: %s"
+msgid ""
+"nothing added to commit but untracked files present (use \"git add\" to "
+"track)\n"
+msgstr "ничего не добавлено в коммит, но есть неотслеживаемые файлы (используйте «git add», чтобы отслеживать их)\n"
 
-#: builtin/apply.c:947
+#: wt-status.c:1608
 #, c-format
-msgid "unable to find filename in patch at line %d"
-msgstr "не Ñ\83далоÑ\81Ñ\8c Ð½Ð°Ð¹Ñ\82и Ð¸Ð¼Ñ\8f Ñ\84айла Ð² Ñ\81Ñ\82Ñ\80оке Ð¿Ð°Ñ\82Ñ\87а %d"
+msgid "nothing added to commit but untracked files present\n"
+msgstr "ниÑ\87его Ð½Ðµ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¾ Ð² ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82, Ð½Ð¾ ÐµÑ\81Ñ\82Ñ\8c Ð½ÐµÐ¾Ñ\82Ñ\81леживаемÑ\8bе Ñ\84айлÑ\8b\n"
 
-#: builtin/apply.c:984
+#: wt-status.c:1611
 #, c-format
-msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d"
-msgstr "git apply: плохой git-diff — ожидалось /dev/null, получено %s на строке %d"
+msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
+msgstr "нечего коммитить (создайте/скопируйте файлы, затем запустите «git add», чтобы отслеживать их)\n"
 
-#: builtin/apply.c:989
+#: wt-status.c:1614 wt-status.c:1619
 #, c-format
-msgid "git apply: bad git-diff - inconsistent new filename on line %d"
-msgstr "git apply: плохой git-diff — не согласующееся новое имя файла на строке %d"
+msgid "nothing to commit\n"
+msgstr "нечего коммитить\n"
 
-#: builtin/apply.c:990
+#: wt-status.c:1617
 #, c-format
-msgid "git apply: bad git-diff - inconsistent old filename on line %d"
-msgstr "git apply: плохой git-diff — не согласующееся старое имя файла на строке %d"
+msgid "nothing to commit (use -u to show untracked files)\n"
+msgstr "нечего коммитить (используйте опцию «-u», чтобы показать неотслеживаемые файлы)\n"
 
-#: builtin/apply.c:995
+#: wt-status.c:1621
 #, c-format
-msgid "git apply: bad git-diff - expected /dev/null on line %d"
-msgstr "git apply: плохой git-diff  — ожидалось /dev/null на строке %d"
+msgid "nothing to commit, working tree clean\n"
+msgstr "нечего коммитить, нет изменений в рабочем каталоге\n"
 
-#: builtin/apply.c:1489
-#, c-format
-msgid "recount: unexpected line: %.*s"
-msgstr "recount: не ожидаемая строка: %.*s"
+#: wt-status.c:1728
+msgid "Initial commit on "
+msgstr "Начальный коммит на "
 
-#: builtin/apply.c:1550
-#, c-format
-msgid "patch fragment without header at line %d: %.*s"
-msgstr "фрагмент изменений без заголовка на строке %d: %.*s"
+#: wt-status.c:1732
+msgid "HEAD (no branch)"
+msgstr "HEAD (нет ветки)"
 
-#: builtin/apply.c:1567
-#, c-format
-msgid ""
-"git diff header lacks filename information when removing %d leading pathname"
-" component (line %d)"
-msgid_plural ""
-"git diff header lacks filename information when removing %d leading pathname"
-" components (line %d)"
-msgstr[0] "заголовок git diff не нашел информацию об имени файла при удалении %d ведущего компонента пути к файлу (строка %d)"
-msgstr[1] "заголовок git diff не нашел информацию об имени файла при удалении %d ведущих компонент пути к файлу (строка %d)"
-msgstr[2] "заголовок git diff не нашел информацию об имени файла при удалении %d ведущих компонент пути к файлу (строка %d)"
-msgstr[3] "заголовок git diff не нашел информацию об имени файла при удалении %d ведущих компонент пути к файлу (строка %d)"
+#: wt-status.c:1761
+msgid "gone"
+msgstr "исчез"
 
-#: builtin/apply.c:1743
-msgid "new file depends on old contents"
-msgstr "новÑ\8bй Ñ\84айл Ð·Ð°Ð²Ð¸Ñ\81иÑ\82 Ð¾Ñ\82 Ñ\81Ñ\82аÑ\80ого Ñ\81одеÑ\80жимого"
+#: wt-status.c:1763 wt-status.c:1771
+msgid "behind "
+msgstr "позади"
 
-#: builtin/apply.c:1745
-msgid "deleted file still has contents"
-msgstr "удаленный файл все еще имеет содержимое"
+#: wt-status.c:1766 wt-status.c:1769
+msgid "ahead "
+msgstr "впереди "
 
-#: builtin/apply.c:1774
+#. TRANSLATORS: the action is e.g. "pull with rebase"
+#: wt-status.c:2270
 #, c-format
-msgid "corrupt patch at line %d"
-msgstr "паÑ\82Ñ\87 Ð¿Ð¾Ð²Ñ\80ежден Ð½Ð° Ñ\81Ñ\82Ñ\80оке %d"
+msgid "cannot %s: You have unstaged changes."
+msgstr "не Ñ\83далоÑ\81Ñ\8c Ð²Ñ\8bполниÑ\82Ñ\8c %s: Ð£ Ð²Ð°Ñ\81 ÐµÑ\81Ñ\82Ñ\8c Ð½ÐµÐ¿Ñ\80оиндекÑ\81иÑ\80ованнÑ\8bе Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f."
 
-#: builtin/apply.c:1810
-#, c-format
-msgid "new file %s depends on old contents"
-msgstr "новый файл %s зависит от старого содержимого"
+#: wt-status.c:2276
+msgid "additionally, your index contains uncommitted changes."
+msgstr "к тому же, в вашем индексе есть незакоммиченные изменения."
 
-#: builtin/apply.c:1812
+#: wt-status.c:2278
 #, c-format
-msgid "deleted file %s still has contents"
-msgstr "удаленный файл %s все еще имеет содержимое"
+msgid "cannot %s: Your index contains uncommitted changes."
+msgstr "не удалось выполнить %s: В вашем индексе есть незакоммиченные изменения."
 
-#: builtin/apply.c:1815
+#: compat/precompose_utf8.c:57 builtin/clone.c:414
 #, c-format
-msgid "** warning: file %s becomes empty but is not deleted"
-msgstr "** предупреждение: файл %s становится пустым, но не удаляется"
+msgid "failed to unlink '%s'"
+msgstr "сбой отсоединения «%s»"
 
-#: builtin/apply.c:1962
-#, c-format
-msgid "corrupt binary patch at line %d: %.*s"
-msgstr "поврежденный двоичный патч на строке %d: %.*s"
+#: builtin/add.c:22
+msgid "git add [<options>] [--] <pathspec>..."
+msgstr "git add [<опции>] [--] <спецификация-пути>…"
 
-#: builtin/apply.c:1999
+#: builtin/add.c:80
 #, c-format
-msgid "unrecognized binary patch at line %d"
-msgstr "неопознанный двоичный патч на строке %d"
+msgid "unexpected diff status %c"
+msgstr "неожиданный статус различий %c"
+
+#: builtin/add.c:85 builtin/commit.c:291
+msgid "updating files failed"
+msgstr "сбой при обновлении файлов"
 
-#: builtin/apply.c:2154
+#: builtin/add.c:95
 #, c-format
-msgid "patch with only garbage at line %d"
-msgstr "патч с мусором на строке %d"
+msgid "remove '%s'\n"
+msgstr "удалить «%s»\n"
+
+#: builtin/add.c:149
+msgid "Unstaged changes after refreshing the index:"
+msgstr "Непроиндексированные изменения после обновления индекса:"
 
-#: builtin/apply.c:2244
+#: builtin/add.c:209 builtin/rev-parse.c:840
+msgid "Could not read the index"
+msgstr "Не удалось прочитать индекс"
+
+#: builtin/add.c:220
 #, c-format
-msgid "unable to read symlink %s"
-msgstr "не удалось прочитать символьную ссылку %s"
+msgid "Could not open '%s' for writing."
+msgstr "Не удалось открыть «%s» для записи."
+
+#: builtin/add.c:224
+msgid "Could not write patch"
+msgstr "Не удалось записать патч"
+
+#: builtin/add.c:227
+msgid "editing patch failed"
+msgstr "сбой при редактировании патча"
 
-#: builtin/apply.c:2248
+#: builtin/add.c:230
 #, c-format
-msgid "unable to open or read %s"
-msgstr "не удалось открыть или прочесть %s"
+msgid "Could not stat '%s'"
+msgstr "Не удалось выполнить stat для «%s»"
+
+#: builtin/add.c:232
+msgid "Empty patch. Aborted."
+msgstr "Пустой патч. Операция прервана."
 
-#: builtin/apply.c:2901
+#: builtin/add.c:237
 #, c-format
-msgid "invalid start of line: '%c'"
-msgstr "неправильное начало строки: «%c»"
+msgid "Could not apply '%s'"
+msgstr "Не удалось применить «%s»"
+
+#: builtin/add.c:247
+msgid "The following paths are ignored by one of your .gitignore files:\n"
+msgstr "Следующие пути игнорируются одним из ваших файлов .gitignore:\n"
+
+#: builtin/add.c:266 builtin/clean.c:870 builtin/fetch.c:115 builtin/mv.c:111
+#: builtin/prune-packed.c:55 builtin/pull.c:198 builtin/push.c:521
+#: builtin/remote.c:1326 builtin/rm.c:268 builtin/send-pack.c:162
+msgid "dry run"
+msgstr "пробный запуск"
+
+#: builtin/add.c:269
+msgid "interactive picking"
+msgstr "интерактивный выбор"
+
+#: builtin/add.c:270 builtin/checkout.c:1156 builtin/reset.c:286
+msgid "select hunks interactively"
+msgstr "интерактивный выбор блоков"
+
+#: builtin/add.c:271
+msgid "edit current diff and apply"
+msgstr "отредактировать текущий файл различий и применить его"
+
+#: builtin/add.c:272
+msgid "allow adding otherwise ignored files"
+msgstr "разрешить добавление игнорируемых иначе файлов"
+
+#: builtin/add.c:273
+msgid "update tracked files"
+msgstr "обновить отслеживаемые файлы"
+
+#: builtin/add.c:274
+msgid "record only the fact that the path will be added later"
+msgstr "записать только факт, что путь будет добавлен позже"
+
+#: builtin/add.c:275
+msgid "add changes from all tracked and untracked files"
+msgstr "добавить изменения из всех отслеживаемых и неотслеживаемых файлов"
+
+#: builtin/add.c:278
+msgid "ignore paths removed in the working tree (same as --no-all)"
+msgstr "игнорировать пути удаленные из рабочего каталога (тоже, что и --no-all)"
 
-#: builtin/apply.c:3020
+#: builtin/add.c:280
+msgid "don't add, only refresh the index"
+msgstr "не добавлять, только обновить индекс"
+
+#: builtin/add.c:281
+msgid "just skip files which cannot be added because of errors"
+msgstr "пропускать файлы, которые не могут быть добавлены из-за ошибок"
+
+#: builtin/add.c:282
+msgid "check if - even missing - files are ignored in dry run"
+msgstr "удостовериться, что даже недостающие файлы будут проигнорированы при  пробном запуске"
+
+#: builtin/add.c:283 builtin/update-index.c:947
+msgid "(+/-)x"
+msgstr "(+/-)x"
+
+#: builtin/add.c:283 builtin/update-index.c:948
+msgid "override the executable bit of the listed files"
+msgstr "переопределить бит выполнения на указанных файлах"
+
+#: builtin/add.c:305
 #, c-format
-msgid "Hunk #%d succeeded at %d (offset %d line)."
-msgid_plural "Hunk #%d succeeded at %d (offset %d lines)."
-msgstr[0] "Часть #%d успешно применена на %d (со сдвигом в %d строку)."
-msgstr[1] "Часть #%d успешно применена на %d (со сдвигом в %d строки)."
-msgstr[2] "Часть #%d успешно применена на %d (со сдвигом в %d строк)."
-msgstr[3] "Часть #%d успешно применена на %d (со сдвигом в %d строк)."
+msgid "Use -f if you really want to add them.\n"
+msgstr "Используйте -f, если вы действительно хотите добавить их.\n"
+
+#: builtin/add.c:312
+msgid "adding files failed"
+msgstr "ошибка при добавлении файлов"
+
+#: builtin/add.c:348
+msgid "-A and -u are mutually incompatible"
+msgstr "-A и -u нельзя использовать одновременно"
+
+#: builtin/add.c:355
+msgid "Option --ignore-missing can only be used together with --dry-run"
+msgstr "Опция --ignore-missing может использоваться только вместе с --dry-run"
 
-#: builtin/apply.c:3032
+#: builtin/add.c:359
 #, c-format
-msgid "Context reduced to (%ld/%ld) to apply fragment at %d"
-msgstr "Ð\9aонÑ\82екÑ\81Ñ\82 Ñ\81Ñ\83жен Ð´Ð¾ (%ld/%ld), Ñ\87Ñ\82обÑ\8b Ð¿Ñ\80имениÑ\82Ñ\8c Ñ\84Ñ\80агменÑ\82 Ð½Ð° %d Ñ\81Ñ\82Ñ\80оке"
+msgid "--chmod param '%s' must be either -x or +x"
+msgstr "паÑ\80амеÑ\82Ñ\80 --chmod Â«%s» Ð´Ð¾Ð»Ð¶ÐµÐ½ Ð±Ñ\8bÑ\82Ñ\8c -x Ð¸Ð»Ð¸ +x"
 
-#: builtin/apply.c:3038
+#: builtin/add.c:374
 #, c-format
-msgid ""
-"while searching for:\n"
-"%.*s"
-msgstr "при поиске:\n%.*s"
+msgid "Nothing specified, nothing added.\n"
+msgstr "Ничего не указано, ничего не добавлено.\n"
 
-#: builtin/apply.c:3060
+#: builtin/add.c:375
 #, c-format
-msgid "missing binary patch data for '%s'"
-msgstr "пÑ\80опÑ\83Ñ\89енÑ\8b Ð´Ð°Ð½Ð½Ñ\8bе Ð´Ð²Ð¾Ð¸Ñ\87ного Ð¿Ð°Ñ\82Ñ\87а Ð´Ð»Ñ\8f Â«%s»"
+msgid "Maybe you wanted to say 'git add .'?\n"
+msgstr "Ð\92озможно, Ð²Ñ\8b Ð¸Ð¼ÐµÐ»Ð¸ Ð² Ð²Ð¸Ð´Ñ\83 Â«git add .»?\n"
 
-#: builtin/apply.c:3163
-#, c-format
-msgid "binary patch does not apply to '%s'"
-msgstr "не удалось применить двоичный патч к «%s»"
+#: builtin/add.c:380 builtin/check-ignore.c:172 builtin/checkout.c:279
+#: builtin/checkout.c:472 builtin/clean.c:914 builtin/commit.c:350
+#: builtin/mv.c:131 builtin/reset.c:235 builtin/rm.c:298
+#: builtin/submodule--helper.c:244
+msgid "index file corrupt"
+msgstr "файл индекса поврежден"
 
-#: builtin/apply.c:3169
-#, c-format
-msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)"
-msgstr "после применения двоичного патча для «%s» был получен неправильный результат (ожидалось %s, получено %s)"
+#: builtin/am.c:414
+msgid "could not parse author script"
+msgstr "не удалось разобрать сценарий авторства"
 
-#: builtin/apply.c:3190
+#: builtin/am.c:491
 #, c-format
-msgid "patch failed: %s:%ld"
-msgstr "ошибка применения изменений: %s:%ld"
+msgid "'%s' was deleted by the applypatch-msg hook"
+msgstr "«%s» был удален перехватчиком applypatch-msg"
 
-#: builtin/apply.c:3314
+#: builtin/am.c:532
 #, c-format
-msgid "cannot checkout %s"
-msgstr "не Ñ\83далоÑ\81Ñ\8c Ð¿ÐµÑ\80еклÑ\8eÑ\87иÑ\82Ñ\8c Ñ\81оÑ\81Ñ\82оÑ\8fние Ð½Ð° %s"
+msgid "Malformed input line: '%s'."
+msgstr "Ð\9dепÑ\80авилÑ\8cнаÑ\8f Ñ\81Ñ\82Ñ\80ока Ð²Ð²Ð¾Ð´Ð°: Â«%s»."
 
-#: builtin/apply.c:3370
+#: builtin/am.c:569
 #, c-format
-msgid "reading from '%s' beyond a symbolic link"
-msgstr "чтение из «%s» за символической ссылкой"
+msgid "Failed to copy notes from '%s' to '%s'"
+msgstr "Не удалось скопировать заметку из «%s» в «%s»"
 
-#: builtin/apply.c:3399 builtin/apply.c:3630
-#, c-format
-msgid "path %s has been renamed/deleted"
-msgstr "путь %s был переименован/удален"
+#: builtin/am.c:595
+msgid "fseek failed"
+msgstr "сбой при выполнении fseek"
 
-#: builtin/apply.c:3482 builtin/apply.c:3644
+#: builtin/am.c:775
 #, c-format
-msgid "%s: does not exist in index"
-msgstr "%s: нет в индексе"
+msgid "could not parse patch '%s'"
+msgstr "не удалось разобрать патч «%s»"
 
-#: builtin/apply.c:3486 builtin/apply.c:3636 builtin/apply.c:3658
-#, c-format
-msgid "%s: %s"
-msgstr "%s: %s"
+#: builtin/am.c:840
+msgid "Only one StGIT patch series can be applied at once"
+msgstr "Только серия патчей StGIT может быть применена за раз"
 
-#: builtin/apply.c:3491 builtin/apply.c:3652
-#, c-format
-msgid "%s: does not match index"
-msgstr "%s: не совпадает с индексом"
+#: builtin/am.c:887
+msgid "invalid timestamp"
+msgstr "недопустимая метка даты/времени"
 
-#: builtin/apply.c:3597
-msgid "removal patch leaves file contents"
-msgstr "паÑ\82Ñ\87 Ñ\83далениÑ\8f Ð½Ðµ Ñ\83далил Ñ\81одеÑ\80жимое Ñ\84айла"
+#: builtin/am.c:890 builtin/am.c:898
+msgid "invalid Date line"
+msgstr "недопÑ\83Ñ\81Ñ\82имаÑ\8f Ñ\81Ñ\82Ñ\80ока Ð´Ð°Ñ\82Ñ\8b"
 
-#: builtin/apply.c:3669
-#, c-format
-msgid "%s: wrong type"
-msgstr "%s: неправильный тип"
+#: builtin/am.c:895
+msgid "invalid timezone offset"
+msgstr "недопустимое смещение часового пояса"
 
-#: builtin/apply.c:3671
-#, c-format
-msgid "%s has type %o, expected %o"
-msgstr "%s имеет тип %o, а ожидался %o"
+#: builtin/am.c:984
+msgid "Patch format detection failed."
+msgstr "Сбой определения формата патча."
 
-#: builtin/apply.c:3822 builtin/apply.c:3824
+#: builtin/am.c:989 builtin/clone.c:379
 #, c-format
-msgid "invalid path '%s'"
-msgstr "неправильный путь «%s»"
+msgid "failed to create directory '%s'"
+msgstr "не удалось создать каталог «%s»"
 
-#: builtin/apply.c:3879
-#, c-format
-msgid "%s: already exists in index"
-msgstr "%s: уже содержится в индексе"
+#: builtin/am.c:993
+msgid "Failed to split patches."
+msgstr "Не удалось разделить патчи на части."
 
-#: builtin/apply.c:3882
-#, c-format
-msgid "%s: already exists in working directory"
-msgstr "%s: уже содержится в рабочем каталоге"
+#: builtin/am.c:1125 builtin/commit.c:376
+msgid "unable to write index file"
+msgstr "не удалось записать индекс"
 
-#: builtin/apply.c:3902
+#: builtin/am.c:1176
 #, c-format
-msgid "new mode (%o) of %s does not match old mode (%o)"
-msgstr "новÑ\8bй Ñ\80ежим Ð´Ð¾Ñ\81Ñ\82Ñ\83па (%o) Ð´Ð»Ñ\8f %s Ð½Ðµ Ñ\81ооÑ\82веÑ\82Ñ\81Ñ\82вÑ\83еÑ\82 Ñ\81Ñ\82аÑ\80омÑ\83 Ñ\80ежимÑ\83 Ð´Ð¾Ñ\81Ñ\82Ñ\83па (%o)"
+msgid "When you have resolved this problem, run \"%s --continue\"."
+msgstr "Ð\9aогда Ð²Ñ\8b Ñ\83Ñ\81Ñ\82Ñ\80аниÑ\82е Ñ\8dÑ\82Ñ\83 Ð¿Ñ\80облемÑ\83, Ð·Ð°Ð¿Ñ\83Ñ\81Ñ\82иÑ\82е Â«%s --continue»."
 
-#: builtin/apply.c:3907
+#: builtin/am.c:1177
 #, c-format
-msgid "new mode (%o) of %s does not match old mode (%o) of %s"
-msgstr "новÑ\8bй Ñ\80ежим Ð´Ð¾Ñ\81Ñ\82Ñ\83па (%o) Ð´Ð»Ñ\8f %s Ð½Ðµ Ñ\81ооÑ\82веÑ\82Ñ\81Ñ\82вÑ\83еÑ\82 Ñ\81Ñ\82аÑ\80омÑ\83 Ñ\80ежимÑ\83 Ð´Ð¾Ñ\81Ñ\82Ñ\83па (%o) Ð´Ð»Ñ\8f %s"
+msgid "If you prefer to skip this patch, run \"%s --skip\" instead."
+msgstr "Ð\95Ñ\81ли Ð²Ñ\8b Ñ\85оÑ\82иÑ\82е Ð¿Ñ\80опÑ\83Ñ\81Ñ\82иÑ\82Ñ\8c Ñ\8dÑ\82оÑ\82 Ð¿Ð°Ñ\82Ñ\87, Ñ\82о Ð·Ð°Ð¿Ñ\83Ñ\81Ñ\82иÑ\82е Â«%s --skip»."
 
-#: builtin/apply.c:3927
+#: builtin/am.c:1178
 #, c-format
-msgid "affected file '%s' is beyond a symbolic link"
-msgstr "заÑ\82Ñ\80онÑ\83Ñ\82Ñ\8bй Ñ\84айл Â«%s» Ð½Ð°Ñ\85одиÑ\82Ñ\81Ñ\8f Ð·Ð° Ñ\81имволиÑ\87еÑ\81кой Ñ\81Ñ\81Ñ\8bлкой"
+msgid "To restore the original branch and stop patching, run \"%s --abort\"."
+msgstr "ЧÑ\82обÑ\8b Ð²ÐµÑ\80нÑ\83Ñ\82Ñ\8cÑ\81Ñ\8f Ð½Ð° Ð¿Ñ\80едÑ\8bдÑ\83Ñ\89Ñ\83Ñ\8e Ð²ÐµÑ\82кÑ\83 Ð¸ Ð¾Ñ\81Ñ\82ановиÑ\82Ñ\8c Ð¿Ñ\80именение Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹, Ð·Ð°Ð¿Ñ\83Ñ\81Ñ\82иÑ\82е Â«%s --abort»."
 
-#: builtin/apply.c:3931
-#, c-format
-msgid "%s: patch does not apply"
-msgstr "%s: не удалось применить патч"
+#: builtin/am.c:1316
+msgid "Patch is empty. Was it split wrong?"
+msgstr "Патч пуст. Возможно, он был неправильно разделён?"
 
-#: builtin/apply.c:3945
+#: builtin/am.c:1390 builtin/log.c:1550
 #, c-format
-msgid "Checking patch %s..."
-msgstr "Ð\9fÑ\80овеÑ\80ка Ð¿Ð°Ñ\82Ñ\87а %sâ\80¦"
+msgid "invalid ident line: %s"
+msgstr "непÑ\80авилÑ\8cнаÑ\8f Ñ\81Ñ\82Ñ\80ока Ð¸Ð´ÐµÐ½Ñ\82иÑ\84икаÑ\86ии: %s"
 
-#: builtin/apply.c:4038 builtin/checkout.c:233 builtin/reset.c:135
+#: builtin/am.c:1417
 #, c-format
-msgid "make_cache_entry failed for path '%s'"
-msgstr "сбой make_cache_entry для пути «%s»"
+msgid "unable to parse commit %s"
+msgstr "не удалось разобрать коммит %s"
 
-#: builtin/apply.c:4182
-#, c-format
-msgid "unable to remove %s from index"
-msgstr "не удалось удалить %s из индекса"
+#: builtin/am.c:1610
+msgid "Repository lacks necessary blobs to fall back on 3-way merge."
+msgstr "В репозитории отсутствуют двоичные объекты, необходимые для отката к трехходовому слиянию."
 
-#: builtin/apply.c:4215
-#, c-format
-msgid "corrupt patch for submodule %s"
-msgstr "поврежденный патч для подмодуля %s"
+#: builtin/am.c:1612
+msgid "Using index info to reconstruct a base tree..."
+msgstr "Использую индекс для реконструкции базового дерева…"
 
-#: builtin/apply.c:4219
-#, c-format
-msgid "unable to stat newly created file '%s'"
-msgstr "не удалось выполнить stat для созданного файла «%s»"
+#: builtin/am.c:1631
+msgid ""
+"Did you hand edit your patch?\n"
+"It does not apply to blobs recorded in its index."
+msgstr "Вы вручную изменяли патч?\nОн не накладывается без ошибок на двоичные объекты, записанные в его заголовке."
 
-#: builtin/apply.c:4224
-#, c-format
-msgid "unable to create backing store for newly created file %s"
-msgstr "не удалось создать вспомогательный файл для созданного файла %s"
+#: builtin/am.c:1637
+msgid "Falling back to patching base and 3-way merge..."
+msgstr "Откат к применению изменений к базовому коммиту с помощью трехходового слияния…"
 
-#: builtin/apply.c:4227 builtin/apply.c:4340
-#, c-format
-msgid "unable to add cache entry for %s"
-msgstr "не удалось создать запись в кэше для %s"
+#: builtin/am.c:1662
+msgid "Failed to merge in the changes."
+msgstr "Не удалось слить изменения."
 
-#: builtin/apply.c:4260
-#, c-format
-msgid "closing file '%s'"
-msgstr "закрытие файла «%s»"
+#: builtin/am.c:1686 builtin/merge.c:628
+msgid "git write-tree failed to write a tree"
+msgstr "git write-tree не удалось записать дерево"
 
-#: builtin/apply.c:4313
-#, c-format
-msgid "unable to write file '%s' mode %o"
-msgstr "не удалось записать файл «%s» с режимом доступа %o"
+#: builtin/am.c:1693
+msgid "applying to an empty history"
+msgstr "применение к пустой истории"
 
-#: builtin/apply.c:4403
+#: builtin/am.c:1706 builtin/commit.c:1769 builtin/merge.c:798
+#: builtin/merge.c:823
+msgid "failed to write commit object"
+msgstr "сбой записи объекта коммита"
+
+#: builtin/am.c:1739 builtin/am.c:1743
 #, c-format
-msgid "Applied patch %s cleanly."
-msgstr "Ð\9fаÑ\82Ñ\87 %s Ð¿Ñ\80именен Ð±ÐµÐ· Ð¾Ñ\88ибок."
+msgid "cannot resume: %s does not exist."
+msgstr "нелÑ\8cзÑ\8f Ð¿Ñ\80одолжниÑ\82Ñ\8c: %s Ð½Ðµ Ñ\81Ñ\83Ñ\89еÑ\81Ñ\82вÑ\83еÑ\82 "
 
-#: builtin/apply.c:4411
-msgid "internal error"
-msgstr "внутренняя ошибка"
+#: builtin/am.c:1759
+msgid "cannot be interactive without stdin connected to a terminal."
+msgstr "не удалось использовать интерактивное поведение, без stdin подключенного к терминалу."
+
+#: builtin/am.c:1764
+msgid "Commit Body is:"
+msgstr "Тело коммита:"
+
+#. TRANSLATORS: Make sure to include [y], [n], [e], [v] and [a]
+#. in your translation. The program will only accept English
+#. input at this point.
+#: builtin/am.c:1774
+msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all: "
+msgstr "Применить? [y] - да/[n] - нет/[e] - редактировать/[v] - просмотреть патч/[a] - применить всё: "
 
-#: builtin/apply.c:4414
+#: builtin/am.c:1824
 #, c-format
-msgid "Applying patch %%s with %d reject..."
-msgid_plural "Applying patch %%s with %d rejects..."
-msgstr[0] "Применение патча %%s с %d отказом…"
-msgstr[1] "Применение патча %%s с %d отказами…"
-msgstr[2] "Применение патча %%s с %d отказами…"
-msgstr[3] "Применение патча %%s с %d отказами…"
+msgid "Dirty index: cannot apply patches (dirty: %s)"
+msgstr "Индекс не пустой: нельзя применять патчи (в индексе: %s)"
 
-#: builtin/apply.c:4424
+#: builtin/am.c:1861 builtin/am.c:1933
 #, c-format
-msgid "truncating .rej filename to %.*s.rej"
-msgstr "усечение имени .rej файла до %.*s.rej"
+msgid "Applying: %.*s"
+msgstr "Применение: %.*s"
+
+#: builtin/am.c:1877
+msgid "No changes -- Patch already applied."
+msgstr "Нет изменений — Патч уже применен."
 
-#: builtin/apply.c:4432
+#: builtin/am.c:1885
 #, c-format
-msgid "cannot open %s: %s"
-msgstr "не Ñ\83далоÑ\81Ñ\8c Ð¾Ñ\82кÑ\80Ñ\8bÑ\82Ñ\8c %s: %s"
+msgid "Patch failed at %s %.*s"
+msgstr "Ð\9eÑ\88ибка Ð¿Ñ\80именениÑ\8f Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ Ð½Ð° %s %.*s"
 
-#: builtin/apply.c:4445
+#: builtin/am.c:1891
 #, c-format
-msgid "Hunk #%d applied cleanly."
-msgstr "Блок №%d применен без ошибок."
+msgid "The copy of the patch that failed is found in: %s"
+msgstr "Копию изменений, которые не удалось применить, вы можете найти в: %s"
+
+#: builtin/am.c:1936
+msgid ""
+"No changes - did you forget to use 'git add'?\n"
+"If there is nothing left to stage, chances are that something else\n"
+"already introduced the same changes; you might want to skip this patch."
+msgstr "Нет изменений — возможно, вы забыли вызвать «git add»?\nЕсли ничего не осталось для индексации, то, скорее всего, что-то другое уже сделало те же изменения; возможно, вам следует пропустить этот патч."
+
+#: builtin/am.c:1943
+msgid ""
+"You still have unmerged paths in your index.\n"
+"Did you forget to use 'git add'?"
+msgstr "У вас все еще имеются не слитые пути в индексе.\nВозможно, вы забыли вызвать «git add»?"
 
-#: builtin/apply.c:4448
+#: builtin/am.c:2051 builtin/am.c:2055 builtin/am.c:2067 builtin/reset.c:308
+#: builtin/reset.c:316
 #, c-format
-msgid "Rejected hunk #%d."
-msgstr "Блок №%d отклонен."
+msgid "Could not parse object '%s'."
+msgstr "Не удалось разобрать объект «%s»."
+
+#: builtin/am.c:2103
+msgid "failed to clean index"
+msgstr "не удалось очистить индекс"
+
+#: builtin/am.c:2137
+msgid ""
+"You seem to have moved HEAD since the last 'am' failure.\n"
+"Not rewinding to ORIG_HEAD"
+msgstr "Похоже, что вы переместили HEAD с момента последней ошибки выполнения «am».\nПеремотка на ORIG_HEAD не выполняется"
 
-#: builtin/apply.c:4537
+#: builtin/am.c:2200
 #, c-format
-msgid "Skipped patch '%s'."
-msgstr "Ð\9fаÑ\82Ñ\87 Â«%s» Ð¿Ñ\80опÑ\83Ñ\89ен."
+msgid "Invalid value for --patch-format: %s"
+msgstr "Ð\9dепÑ\80авилÑ\8cное Ð·Ð½Ð°Ñ\87ение Ð´Ð»Ñ\8f --patch-format: %s"
 
-#: builtin/apply.c:4545
-msgid "unrecognized input"
-msgstr "не распознанный ввод"
+#: builtin/am.c:2233
+msgid "git am [<options>] [(<mbox> | <Maildir>)...]"
+msgstr "git am [<опции>] [(<mbox> | <Maildir>)…]"
 
-#: builtin/apply.c:4556
-msgid "unable to read index file"
-msgstr "не удалось прочитать файл индекса"
+#: builtin/am.c:2234
+msgid "git am [<options>] (--continue | --skip | --abort)"
+msgstr "git am [<опции>] (--continue | --skip | --abort)"
 
-#: builtin/apply.c:4701
-msgid "--3way outside a repository"
-msgstr "--3way вне репозитория"
+#: builtin/am.c:2240
+msgid "run interactively"
+msgstr "запустить в интерактивном режиме"
 
-#: builtin/apply.c:4709
-msgid "--index outside a repository"
-msgstr "--index вне репозитория"
+#: builtin/am.c:2242
+msgid "historical option -- no-op"
+msgstr "историческая опция — ничего не делает"
 
-#: builtin/apply.c:4712
-msgid "--cached outside a repository"
-msgstr "--cached вне репозитория"
+#: builtin/am.c:2244
+msgid "allow fall back on 3way merging if needed"
+msgstr "разрешить откатиться к трехходовому слиянию, если нужно"
 
-#: builtin/apply.c:4745
-#, c-format
-msgid "can't open patch '%s'"
-msgstr "не удалось открыть патч «%s»"
+#: builtin/am.c:2245 builtin/init-db.c:483 builtin/prune-packed.c:57
+#: builtin/repack.c:172
+msgid "be quiet"
+msgstr "тихий режим"
 
-#: builtin/apply.c:4760
-#, c-format
-msgid "squelched %d whitespace error"
-msgid_plural "squelched %d whitespace errors"
-msgstr[0] "пропущена %d ошибка в пробельных символах"
-msgstr[1] "пропущено %d ошибки в пробельных символах"
-msgstr[2] "пропущено %d ошибок в пробельных символах"
-msgstr[3] "пропущено %d ошибок в пробельных символах"
+#: builtin/am.c:2247
+msgid "add a Signed-off-by line to the commit message"
+msgstr "добавить строку Signed-off-by к сообщению коммита"
 
-#: builtin/apply.c:4766 builtin/apply.c:4776
-#, c-format
-msgid "%d line adds whitespace errors."
-msgid_plural "%d lines add whitespace errors."
-msgstr[0] "%d строка добавила ошибки в пробельных символах."
-msgstr[1] "%d строки добавили ошибки в пробельных символах."
-msgstr[2] "%d строк добавили ошибки в пробельных символах."
-msgstr[3] "%d строк добавили ошибки в пробельных символах."
+#: builtin/am.c:2250
+msgid "recode into utf8 (default)"
+msgstr "перекодировать в utf8 (по умолчанию)"
 
-#: builtin/apply.c:4800
-msgid "don't apply changes matching the given path"
-msgstr "не Ð¿Ñ\80именÑ\8fÑ\82Ñ\8c Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f Ð¿Ð¾ Ñ\83казанномÑ\83 Ð¿Ñ\83Ñ\82и"
+#: builtin/am.c:2252
+msgid "pass -k flag to git-mailinfo"
+msgstr "пеÑ\80едаÑ\82Ñ\8c Ñ\84лаг -k Ð² git-mailinfo"
 
-#: builtin/apply.c:4803
-msgid "apply changes matching the given path"
-msgstr "применять изменения по указанному пути"
+#: builtin/am.c:2254
+msgid "pass -b flag to git-mailinfo"
+msgstr "передать флаг -b в git-mailinfo"
 
-#: builtin/apply.c:4806
-msgid "remove <num> leading slashes from traditional diff paths"
-msgstr "удалить <количество> ведущих косых черт из традиционных путей списка изменений"
+#: builtin/am.c:2256
+msgid "pass -m flag to git-mailinfo"
+msgstr "передать флаг -m в git-mailinfo"
 
-#: builtin/apply.c:4809
-msgid "ignore additions made by the patch"
-msgstr "игноÑ\80иÑ\80оваÑ\82Ñ\8c Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ\8f, Ñ\81деланнÑ\8bе Ñ\8dÑ\82им Ð¿Ð°Ñ\82Ñ\87ем"
+#: builtin/am.c:2258
+msgid "pass --keep-cr flag to git-mailsplit for mbox format"
+msgstr "пеÑ\80едаÑ\82Ñ\8c Ñ\84лаг --keep-cr Ð² git-mailsplit Ð´Ð»Ñ\8f Ñ\84оÑ\80маÑ\82а mbox"
 
-#: builtin/apply.c:4811
-msgid "instead of applying the patch, output diffstat for the input"
-msgstr "вмеÑ\81Ñ\82о Ð¿Ñ\80именениÑ\8f Ð¿Ð°Ñ\82Ñ\87а Ð²Ñ\8bвеÑ\81Ñ\82и Ñ\81Ñ\82аÑ\82иÑ\81Ñ\82икÑ\83 Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ð¹ Ð¸ Ñ\83далений Ð´Ð»Ñ\8f Ð²Ð²Ð¾Ð´Ð°"
+#: builtin/am.c:2261
+msgid "do not pass --keep-cr flag to git-mailsplit independent of am.keepcr"
+msgstr "не Ð¿ÐµÑ\80едаваÑ\82Ñ\8c --keep-cr Ñ\84лаг Ð² git-mailsplit Ð²Ð½Ðµ Ð·Ð°Ð²Ð¸Ñ\81имоÑ\81Ñ\82и Ð¾Ñ\82 am.keepcr"
 
-#: builtin/apply.c:4815
-msgid "show number of added and deleted lines in decimal notation"
-msgstr "показаÑ\82Ñ\8c ÐºÐ¾Ð»Ð¸Ñ\87еÑ\81Ñ\82во Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð½Ñ\8bÑ\85 Ð¸ Ñ\83даленнÑ\8bÑ\85 Ñ\81Ñ\82Ñ\80ок Ð² Ð´ÐµÑ\81Ñ\8fÑ\82иÑ\87ном Ð¿Ñ\80едÑ\81Ñ\82авлении"
+#: builtin/am.c:2264
+msgid "strip everything before a scissors line"
+msgstr "обÑ\80езаÑ\82Ñ\8c Ð²Ñ\81е Ð´Ð¾ Ñ\81Ñ\82Ñ\80оки Ð¾Ð±Ñ\80езки"
 
-#: builtin/apply.c:4817
-msgid "instead of applying the patch, output a summary for the input"
-msgstr "вместо применения патча вывести статистику изменений для ввода"
+#: builtin/am.c:2266 builtin/am.c:2269 builtin/am.c:2272 builtin/am.c:2275
+#: builtin/am.c:2278 builtin/am.c:2281 builtin/am.c:2284 builtin/am.c:2287
+#: builtin/am.c:2293
+msgid "pass it through git-apply"
+msgstr "передать его в git-apply"
 
-#: builtin/apply.c:4819
-msgid "instead of applying the patch, see if the patch is applicable"
-msgstr "вместо применения патча проверить подходит ли он"
+#: builtin/am.c:2283 builtin/fmt-merge-msg.c:662 builtin/fmt-merge-msg.c:665
+#: builtin/grep.c:707 builtin/merge.c:200 builtin/pull.c:135
+#: builtin/pull.c:194 builtin/repack.c:181 builtin/repack.c:185
+#: builtin/show-branch.c:644 builtin/show-ref.c:175 builtin/tag.c:340
+#: parse-options.h:132 parse-options.h:134 parse-options.h:245
+msgid "n"
+msgstr "n"
 
-#: builtin/apply.c:4821
-msgid "make sure the patch is applicable to the current index"
-msgstr "проверить, что патч применяется к текущему индексу"
+#: builtin/am.c:2289 builtin/for-each-ref.c:37 builtin/replace.c:438
+#: builtin/tag.c:372
+msgid "format"
+msgstr "формат"
 
-#: builtin/apply.c:4823
-msgid "apply a patch without touching the working tree"
-msgstr "применить патч, не изменяя рабочий каталог"
+#: builtin/am.c:2290
+msgid "format the patch(es) are in"
+msgstr "формат, в котором находятся патчи"
 
-#: builtin/apply.c:4825
-msgid "accept a patch that touches outside the working area"
-msgstr "принять патч, который затрагивает файлы за рабочим каталогом"
+#: builtin/am.c:2296
+msgid "override error message when patch failure occurs"
+msgstr "переопределить сообщение об ошибке, если не удалось наложить изменения"
 
-#: builtin/apply.c:4827
-msgid "also apply the patch (use with --stat/--summary/--check)"
-msgstr "а Ñ\82акже Ð¿Ñ\80имениÑ\82Ñ\8c Ð¿Ð°Ñ\82Ñ\87 (иÑ\81полÑ\8cзÑ\83йÑ\82е Ñ\81 --stat/--summary/--check)"
+#: builtin/am.c:2298
+msgid "continue applying patches after resolving a conflict"
+msgstr "пÑ\80одолжиÑ\82Ñ\8c Ð¿Ñ\80именение Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ Ð¿Ð¾Ñ\81ле Ñ\80азÑ\80еÑ\88ениÑ\8f ÐºÐ¾Ð½Ñ\84иликÑ\82а"
 
-#: builtin/apply.c:4829
-msgid "attempt three-way merge if a patch does not apply"
-msgstr "попытаться сделать трехходовое слияние, если патч не применяется"
+#: builtin/am.c:2301
+msgid "synonyms for --continue"
+msgstr "синоним для --continue"
 
-#: builtin/apply.c:4831
-msgid "build a temporary index based on embedded index information"
-msgstr "построить временный индекс, основанный на встроенной информации об индексе"
+#: builtin/am.c:2304
+msgid "skip the current patch"
+msgstr "пропустить текущий патч"
 
-#: builtin/apply.c:4834 builtin/checkout-index.c:169 builtin/ls-files.c:426
-msgid "paths are separated with NUL character"
-msgstr "пÑ\83Ñ\82и, Ð¾Ñ\82делÑ\91ннÑ\8bе Ð\9dУÐ\9bÐ\95Ð\92ЫÐ\9c Ñ\81имволом"
+#: builtin/am.c:2307
+msgid "restore the original branch and abort the patching operation."
+msgstr "воÑ\81Ñ\81Ñ\82ановиÑ\82Ñ\8c Ð¾Ñ\80игиналÑ\8cнÑ\83Ñ\8e Ð²ÐµÑ\82кÑ\83 Ð¸ Ð¾Ñ\82мениÑ\82Ñ\8c Ð¾Ð¿ÐµÑ\80аÑ\86иÑ\8e Ð¿Ñ\80именениÑ\8f Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹."
 
-#: builtin/apply.c:4836
-msgid "ensure at least <n> lines of context match"
-msgstr "Ñ\83доÑ\81Ñ\82овеÑ\80иÑ\82Ñ\8cÑ\81Ñ\8f, Ñ\87Ñ\82о Ð¿Ð¾ ÐºÑ\80айней Ð¼ÐµÑ\80е <n> Ñ\81Ñ\82Ñ\80ок ÐºÐ¾Ð½Ñ\82екÑ\81Ñ\82а Ñ\81овпадаÑ\8eÑ\82"
+#: builtin/am.c:2311
+msgid "lie about committer date"
+msgstr "Ñ\81овÑ\80аÑ\82Ñ\8c Ð¾ Ð´Ð°Ñ\82е ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82еÑ\80а"
 
-#: builtin/apply.c:4838
-msgid "detect new or modified lines that have whitespace errors"
-msgstr "опÑ\80еделÑ\8fÑ\82Ñ\8c Ð½Ð¾Ð²Ñ\8bе Ð¸Ð»Ð¸ Ð¼Ð¾Ð´Ð¸Ñ\84иÑ\86иÑ\80ованнÑ\8bе Ñ\81Ñ\82Ñ\80оки, Ñ\83 ÐºÐ¾Ñ\82оÑ\80Ñ\8bÑ\85 ÐµÑ\81Ñ\82Ñ\8c Ð¾Ñ\88ибки Ð² Ð¿Ñ\80обелÑ\8cнÑ\8bÑ\85 Ñ\81имволаÑ\85"
+#: builtin/am.c:2313
+msgid "use current timestamp for author date"
+msgstr "иÑ\81полÑ\8cзоваÑ\82Ñ\8c Ñ\82екÑ\83Ñ\89ее Ð²Ñ\80емÑ\8f ÐºÐ°Ðº Ð²Ñ\80емÑ\8f Ð°Ð²Ñ\82оÑ\80Ñ\81Ñ\82ва"
 
-#: builtin/apply.c:4841 builtin/apply.c:4844
-msgid "ignore changes in whitespace when finding context"
-msgstr "игнорировать изменения в пробельных символах при поиске контекста"
+#: builtin/am.c:2315 builtin/commit.c:1605 builtin/merge.c:229
+#: builtin/pull.c:165 builtin/revert.c:92 builtin/tag.c:355
+msgid "key-id"
+msgstr "key-id"
 
-#: builtin/apply.c:4847
-msgid "apply the patch in reverse"
-msgstr "применить патч с обращением изменений"
+#: builtin/am.c:2316
+msgid "GPG-sign commits"
+msgstr "подписать коммиты с помощью GPG"
 
-#: builtin/apply.c:4849
-msgid "don't expect at least one line of context"
-msgstr "не ожидать как минимум одной строки контекста"
+#: builtin/am.c:2319
+msgid "(internal use for git-rebase)"
+msgstr "(внутреннее использование для git-rebase)"
 
-#: builtin/apply.c:4851
-msgid "leave the rejected hunks in corresponding *.rej files"
-msgstr "оставить отклоненные блоки изменений в соответствующих *.rej файлах"
+#: builtin/am.c:2334
+msgid ""
+"The -b/--binary option has been a no-op for long time, and\n"
+"it will be removed. Please do not use it anymore."
+msgstr "Опция -b/--binary уже долгое время ничего не делает и будет удалена с следующих версиях Git. Пожалуйста, не используйте ее."
 
-#: builtin/apply.c:4853
-msgid "allow overlapping hunks"
-msgstr "Ñ\80азÑ\80еÑ\88иÑ\82Ñ\8c Ð¿ÐµÑ\80екÑ\80Ñ\8bваÑ\8eÑ\89иеÑ\81Ñ\8f Ð±Ð»Ð¾ÐºÐ¸ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹"
+#: builtin/am.c:2341
+msgid "failed to read the index"
+msgstr "Ñ\81бой Ñ\87Ñ\82ениÑ\8f Ð¸Ð½Ð´ÐµÐºÑ\81а"
 
-#: builtin/apply.c:4856
-msgid "tolerate incorrectly detected missing new-line at the end of file"
-msgstr "разрешить некорректно определенные пропущенные пустые строки в конце файла"
+#: builtin/am.c:2356
+#, c-format
+msgid "previous rebase directory %s still exists but mbox given."
+msgstr "предыдущий каталог перемещения %s еще существует, но передан mbox."
 
-#: builtin/apply.c:4859
-msgid "do not trust the line counts in the hunk headers"
-msgstr "не доверять количеству строк из заголовка блока изменений"
+#: builtin/am.c:2380
+#, c-format
+msgid ""
+"Stray %s directory found.\n"
+"Use \"git am --abort\" to remove it."
+msgstr "Найден забытый каталог %s.\nИспользуйте «git am --abort», чтобы удалить его."
 
-#: builtin/apply.c:4862
-msgid "prepend <root> to all filenames"
-msgstr "добавить <корень> спереди ко всем именам файлов"
+#: builtin/am.c:2386
+msgid "Resolve operation not in progress, we are not resuming."
+msgstr "Операция разрешения конфликтов не в процессе выполнения, не продолжаем."
+
+#: builtin/apply.c:8
+msgid "git apply [<options>] [<patch>...]"
+msgstr "git apply [<опции>] [<патч>…]"
 
 #: builtin/archive.c:17
 #, c-format
@@ -3860,112 +4306,160 @@ msgstr "<опции-rev-list> документированы в git-rev-list(1)"
 msgid "Blaming lines"
 msgstr "Просмотр авторов строк"
 
-#: builtin/blame.c:2536
+#: builtin/blame.c:2577
 msgid "Show blame entries as we find them, incrementally"
 msgstr "Показать записи авторства постепенно, в процессе нахождения"
 
-#: builtin/blame.c:2537
+#: builtin/blame.c:2578
 msgid "Show blank SHA-1 for boundary commits (Default: off)"
 msgstr "Не показывать SHA-1 для коммитов, не входящих в границы запроса (По умолчанию: отключено)"
 
-#: builtin/blame.c:2538
+#: builtin/blame.c:2579
 msgid "Do not treat root commits as boundaries (Default: off)"
 msgstr "Не воспринимать корневые коммиты как граничные (По умолчанию: отключено)"
 
-#: builtin/blame.c:2539
+#: builtin/blame.c:2580
 msgid "Show work cost statistics"
 msgstr "Показать статистику расходов на выполнение запроса"
 
-#: builtin/blame.c:2540
+#: builtin/blame.c:2581
 msgid "Force progress reporting"
 msgstr "Принудительно выводить прогресс выполнения"
 
-#: builtin/blame.c:2541
+#: builtin/blame.c:2582
 msgid "Show output score for blame entries"
 msgstr "Показать оценку для записей авторства"
 
-#: builtin/blame.c:2542
+#: builtin/blame.c:2583
 msgid "Show original filename (Default: auto)"
 msgstr "Показать оригинальное имя файла (По умолчанию: автоматически)"
 
-#: builtin/blame.c:2543
+#: builtin/blame.c:2584
 msgid "Show original linenumber (Default: off)"
 msgstr "Показать оригинальные номера строк (По умолчанию: отключено)"
 
-#: builtin/blame.c:2544
+#: builtin/blame.c:2585
 msgid "Show in a format designed for machine consumption"
 msgstr "Показать в формате для программного разбора"
 
-#: builtin/blame.c:2545
+#: builtin/blame.c:2586
 msgid "Show porcelain format with per-line commit information"
 msgstr "Показать в машиночитаемом формате, с построчной информацией о коммите"
 
-#: builtin/blame.c:2546
+#: builtin/blame.c:2587
 msgid "Use the same output mode as git-annotate (Default: off)"
 msgstr "Использовать такой же формат вывода, как и git-annotate (По умолчанию: отключено)"
 
-#: builtin/blame.c:2547
+#: builtin/blame.c:2588
 msgid "Show raw timestamp (Default: off)"
 msgstr "Показать необработанные временные метки (По умолчанию: отключено)"
 
-#: builtin/blame.c:2548
+#: builtin/blame.c:2589
 msgid "Show long commit SHA1 (Default: off)"
 msgstr "Показать длинный SHA1 идентификатор коммита (По умолчанию: отключено)"
 
-#: builtin/blame.c:2549
+#: builtin/blame.c:2590
 msgid "Suppress author name and timestamp (Default: off)"
 msgstr "Не показывать имя автора и временные метки (По умолчанию: отключено)"
 
-#: builtin/blame.c:2550
+#: builtin/blame.c:2591
 msgid "Show author email instead of name (Default: off)"
 msgstr "Показать почту автора вместо имени (По умолчанию: отключено)"
 
-#: builtin/blame.c:2551
+#: builtin/blame.c:2592
 msgid "Ignore whitespace differences"
 msgstr "Игнорировать различия в пробелах"
 
-#: builtin/blame.c:2552
+#: builtin/blame.c:2599
+msgid "Use an experimental indent-based heuristic to improve diffs"
+msgstr "Использовать эксперементальную эвристику, основанную на отступах, чтобы улучшить файлы различий"
+
+#: builtin/blame.c:2600
+msgid "Use an experimental blank-line-based heuristic to improve diffs"
+msgstr "Использовать эксперементальную эвристику, основанную на пустых строках, чтобы улучшить файлы различий"
+
+#: builtin/blame.c:2602
 msgid "Spend extra cycles to find better match"
 msgstr "Потратить больше времени, для нахождения лучших совпадений"
 
-#: builtin/blame.c:2553
+#: builtin/blame.c:2603
 msgid "Use revisions from <file> instead of calling git-rev-list"
 msgstr "Использовать редакции из <файла> вместо вызова git-rev-list"
 
-#: builtin/blame.c:2554
+#: builtin/blame.c:2604
 msgid "Use <file>'s contents as the final image"
 msgstr "Использовать содержимое <файла> как финальный снимок"
 
-#: builtin/blame.c:2555 builtin/blame.c:2556
+#: builtin/blame.c:2605 builtin/blame.c:2606
 msgid "score"
 msgstr "мин-длина"
 
-#: builtin/blame.c:2555
+#: builtin/blame.c:2605
 msgid "Find line copies within and across files"
 msgstr "Найти копирование строк в пределах и между файлами"
 
-#: builtin/blame.c:2556
+#: builtin/blame.c:2606
 msgid "Find line movements within and across files"
 msgstr "Найти перемещения строк в пределах и между файлами"
 
-#: builtin/blame.c:2557
+#: builtin/blame.c:2607
 msgid "n,m"
 msgstr "начало,конец"
 
-#: builtin/blame.c:2557
+#: builtin/blame.c:2607
 msgid "Process only line range n,m, counting from 1"
 msgstr "Обработать только строки в диапазоне начало,конец, начиная с 1"
 
+#: builtin/blame.c:2654
+msgid "--progress can't be used with --incremental or porcelain formats"
+msgstr "--progress нельзя использовать одновременно с --incremental или машиночитаемым (porcelain) форматом"
+
 #. TRANSLATORS: This string is used to tell us the maximum
 #. display width for a relative timestamp in "git blame"
 #. output.  For C locale, "4 years, 11 months ago", which
 #. takes 22 places, is the longest among various forms of
 #. relative timestamps, but your language may need more or
 #. fewer display columns.
-#: builtin/blame.c:2649
+#: builtin/blame.c:2700
 msgid "4 years, 11 months ago"
 msgstr "4 года и 11 месяцев назад"
 
+#: builtin/blame.c:2780
+msgid "--contents and --reverse do not blend well."
+msgstr "--contents и --reverse не очень сочетаются."
+
+#: builtin/blame.c:2800
+msgid "cannot use --contents with final commit object name"
+msgstr "нельзя использовать --contents с указанием финального имени объекта"
+
+#: builtin/blame.c:2805
+msgid "--reverse and --first-parent together require specified latest commit"
+msgstr "при --reverse и --first-parent вместе нужно указывать конкретный последний коммит"
+
+#: builtin/blame.c:2832
+msgid ""
+"--reverse --first-parent together require range along first-parent chain"
+msgstr "при указании --reverse и --first-parent вместе, требуется также указать диапазон по цепочке первого родителя"
+
+#: builtin/blame.c:2843
+#, c-format
+msgid "no such path %s in %s"
+msgstr "нет такого пути %s в %s"
+
+#: builtin/blame.c:2854
+#, c-format
+msgid "cannot read blob %s for path %s"
+msgstr "невозможно прочитать объект %s для пути %s"
+
+#: builtin/blame.c:2873
+#, c-format
+msgid "file %s has only %lu line"
+msgid_plural "file %s has only %lu lines"
+msgstr[0] "файл %s содержит только %lu строку"
+msgstr[1] "файл %s содержит только %lu строки"
+msgstr[2] "файл %s содержит только %lu строк"
+msgstr[3] "файл %s содержит только %lu строки"
+
 #: builtin/branch.c:26
 msgid "git branch [<options>] [-r | -a] [--merged | --no-merged]"
 msgstr "git branch [<опции>] [-r | -a] [--merged | --no-merged]"
@@ -4204,6 +4698,10 @@ msgstr "вышестоящая"
 msgid "change the upstream info"
 msgstr "изменить информацию о вышестоящей ветке"
 
+#: builtin/branch.c:660
+msgid "Unset the upstream info"
+msgstr "Убрать информацию о вышестоящей ветке"
+
 #: builtin/branch.c:661
 msgid "use colored output"
 msgstr "использовать цветной вывод"
@@ -4276,8 +4774,8 @@ msgstr "ключ"
 msgid "field name to sort on"
 msgstr "имя поля, по которому выполнить сортировку"
 
-#: builtin/branch.c:686 builtin/for-each-ref.c:41 builtin/notes.c:402
-#: builtin/notes.c:405 builtin/notes.c:565 builtin/notes.c:568
+#: builtin/branch.c:686 builtin/for-each-ref.c:41 builtin/notes.c:404
+#: builtin/notes.c:407 builtin/notes.c:567 builtin/notes.c:570
 #: builtin/tag.c:369
 msgid "object"
 msgstr "объект"
@@ -4290,7 +4788,7 @@ msgstr "вывод только веток, определенного объе
 msgid "Failed to resolve HEAD as a valid ref."
 msgstr "Не удалось определить HEAD как действительную ссылку."
 
-#: builtin/branch.c:709 builtin/clone.c:707
+#: builtin/branch.c:709 builtin/clone.c:706
 msgid "HEAD not found below refs/heads!"
 msgstr "HEAD не найден в refs/heads!"
 
@@ -4393,61 +4891,75 @@ msgstr "Требуется репозиторий для создания пак
 msgid "Need a repository to unbundle."
 msgstr "Требуется репозиторий для распаковки."
 
-#: builtin/cat-file.c:443
+#: builtin/cat-file.c:513
 msgid ""
-"git cat-file (-t [--allow-unknown-type]|-s [--allow-unknown-"
-"type]|-e|-p|<type>|--textconv) <object>"
-msgstr "git cat-file (-t [--allow-unknown-type]|-s [--allow-unknown-type]|-e|-p|<тип>|--textconv) <объект>"
+"git cat-file (-t [--allow-unknown-type] | -s [--allow-unknown-type] | -e | "
+"-p | <type> | --textconv | --filters) [--path=<path>] <object>"
+msgstr "git cat-file (-t [--allow-unknown-type] | -s [--allow-unknown-type] | -e | -p | <тип> | --textconv | --filters) [--path=<путь>] <объект>"
 
-#: builtin/cat-file.c:444
-msgid "git cat-file (--batch | --batch-check) [--follow-symlinks]"
-msgstr "git cat-file (--batch | --batch-check) [--follow-symlinks]"
+#: builtin/cat-file.c:514
+msgid ""
+"git cat-file (--batch | --batch-check) [--follow-symlinks] [--textconv | "
+"--filters]"
+msgstr "git cat-file (--batch | --batch-check) [--follow-symlinks] [--textconv | --filters]"
 
-#: builtin/cat-file.c:481
+#: builtin/cat-file.c:551
 msgid "<type> can be one of: blob, tree, commit, tag"
 msgstr "<тип> может быть одним из: blob, tree, commit, tag"
 
-#: builtin/cat-file.c:482
+#: builtin/cat-file.c:552
 msgid "show object type"
 msgstr "показать тип объекта"
 
-#: builtin/cat-file.c:483
+#: builtin/cat-file.c:553
 msgid "show object size"
 msgstr "показать размер объекта"
 
-#: builtin/cat-file.c:485
+#: builtin/cat-file.c:555
 msgid "exit with zero when there's no error"
 msgstr "выйти с нулевым кодом возврата, если нет ошибки"
 
-#: builtin/cat-file.c:486
+#: builtin/cat-file.c:556
 msgid "pretty-print object's content"
 msgstr "структурированный вывод содержимого объекта"
 
-#: builtin/cat-file.c:488
+#: builtin/cat-file.c:558
 msgid "for blob objects, run textconv on object's content"
 msgstr "запустить texconv на содержимом двоичных объектов "
 
-#: builtin/cat-file.c:490
+#: builtin/cat-file.c:560
+msgid "for blob objects, run filters on object's content"
+msgstr "запуск фильтров на содержимом двоичных объектов "
+
+#: builtin/cat-file.c:561 git-submodule.sh:923
+msgid "blob"
+msgstr "двоичный объект"
+
+#: builtin/cat-file.c:562
+msgid "use a specific path for --textconv/--filters"
+msgstr "использовать определенный путь для --textconv/--filters"
+
+#: builtin/cat-file.c:564
 msgid "allow -s and -t to work with broken/corrupt objects"
 msgstr "разрешить -s и -t работать с повреждёнными объектами"
 
-#: builtin/cat-file.c:491
+#: builtin/cat-file.c:565
 msgid "buffer --batch output"
 msgstr "буфферировать вывод --batch"
 
-#: builtin/cat-file.c:493
+#: builtin/cat-file.c:567
 msgid "show info and content of objects fed from the standard input"
 msgstr "показать информацию и содержимое объектов, переданных из стандартного ввода"
 
-#: builtin/cat-file.c:496
+#: builtin/cat-file.c:570
 msgid "show info about objects fed from the standard input"
 msgstr "показать информацию об объектах, переданных из стандартного ввода"
 
-#: builtin/cat-file.c:499
+#: builtin/cat-file.c:573
 msgid "follow in-tree symlinks (used with --batch or --batch-check)"
 msgstr "переходить по символьным ссылкам внутри дерева (используется с опциями --batch и --batch-check)"
 
-#: builtin/cat-file.c:501
+#: builtin/cat-file.c:575
 msgid "show all objects with --batch or --batch-check"
 msgstr "показать все объекты с опциями --batch или --batch-check"
 
@@ -4467,7 +4979,7 @@ msgstr "вывести все атрибуты установленные для
 msgid "use .gitattributes only from the index"
 msgstr "использовать только .gitattributes из индекса"
 
-#: builtin/check-attr.c:21 builtin/check-ignore.c:22 builtin/hash-object.c:97
+#: builtin/check-attr.c:21 builtin/check-ignore.c:22 builtin/hash-object.c:98
 msgid "read file names from stdin"
 msgstr "прочитать имена файлов из стандартного ввода"
 
@@ -4475,7 +4987,7 @@ msgstr "прочитать имена файлов из стандартного
 msgid "terminate input and output records by a NUL character"
 msgstr "окончание ввода и вывода записей по НУЛЕВОМУ символу"
 
-#: builtin/check-ignore.c:18 builtin/checkout.c:1138 builtin/gc.c:325
+#: builtin/check-ignore.c:18 builtin/checkout.c:1137 builtin/gc.c:325
 msgid "suppress progress reporting"
 msgstr "не выводить прогресс выполнения"
 
@@ -4565,9 +5077,9 @@ msgid "write the content to temporary files"
 msgstr "записать содержимое во временные файлы"
 
 #: builtin/checkout-index.c:174 builtin/column.c:30
-#: builtin/submodule--helper.c:488 builtin/submodule--helper.c:491
-#: builtin/submodule--helper.c:494 builtin/submodule--helper.c:497
-#: builtin/submodule--helper.c:830 builtin/worktree.c:469
+#: builtin/submodule--helper.c:595 builtin/submodule--helper.c:598
+#: builtin/submodule--helper.c:604 builtin/submodule--helper.c:951
+#: builtin/worktree.c:469
 msgid "string"
 msgstr "строка"
 
@@ -4638,54 +5150,54 @@ msgstr "Нельзя обновлять пути и переключаться 
 msgid "path '%s' is unmerged"
 msgstr "путь «%s» не слит"
 
-#: builtin/checkout.c:495
+#: builtin/checkout.c:494
 msgid "you need to resolve your current index first"
 msgstr "сначала нужно разрешить конфликты в вашем текущем индексе"
 
-#: builtin/checkout.c:625
+#: builtin/checkout.c:624
 #, c-format
 msgid "Can not do reflog for '%s': %s\n"
 msgstr "Не удалось создать журнал ссылок для «%s»: %s\n"
 
-#: builtin/checkout.c:664
+#: builtin/checkout.c:663
 msgid "HEAD is now at"
 msgstr "HEAD сейчас на"
 
-#: builtin/checkout.c:668 builtin/clone.c:661
+#: builtin/checkout.c:667 builtin/clone.c:660
 msgid "unable to update HEAD"
 msgstr "не удалось обновить HEAD"
 
-#: builtin/checkout.c:672
+#: builtin/checkout.c:671
 #, c-format
 msgid "Reset branch '%s'\n"
 msgstr "Сброс ветки «%s»\n"
 
-#: builtin/checkout.c:675
+#: builtin/checkout.c:674
 #, c-format
 msgid "Already on '%s'\n"
 msgstr "Уже на «%s»\n"
 
-#: builtin/checkout.c:679
+#: builtin/checkout.c:678
 #, c-format
 msgid "Switched to and reset branch '%s'\n"
 msgstr "Переключение и сброс ветки «%s»\n"
 
-#: builtin/checkout.c:681 builtin/checkout.c:1070
+#: builtin/checkout.c:680 builtin/checkout.c:1069
 #, c-format
 msgid "Switched to a new branch '%s'\n"
 msgstr "Переключено на новую ветку «%s»\n"
 
-#: builtin/checkout.c:683
+#: builtin/checkout.c:682
 #, c-format
 msgid "Switched to branch '%s'\n"
 msgstr "Переключено на ветку «%s»\n"
 
-#: builtin/checkout.c:734
+#: builtin/checkout.c:733
 #, c-format
 msgid " ... and %d more.\n"
 msgstr " … и еще %d.\n"
 
-#: builtin/checkout.c:740
+#: builtin/checkout.c:739
 #, c-format
 msgid ""
 "Warning: you are leaving %d commit behind, not connected to\n"
@@ -4702,7 +5214,7 @@ msgstr[1] "Предупреждение: вы оставляете позади
 msgstr[2] "Предупреждение: вы оставляете позади %d коммитов не соединенные ни с одной из ваших веток:\n\n%s\n"
 msgstr[3] "Предупреждение: вы оставляете позади %d коммитов не соединенные ни с одной из ваших веток:\n\n%s\n"
 
-#: builtin/checkout.c:759
+#: builtin/checkout.c:758
 #, c-format
 msgid ""
 "If you want to keep it by creating a new branch, this may be a good time\n"
@@ -4721,162 +5233,162 @@ msgstr[1] "Если вы хотите сохранить их с помощью
 msgstr[2] "Если вы хотите сохранить их с помощью создания новой ветки, то сейчас самое время\nсделать это с помощью:\n\n git branch <имя-новой-ветки> %s\n"
 msgstr[3] "Если вы хотите сохранить их с помощью создания новой ветки, то сейчас самое время\nсделать это с помощью:\n\n git branch <имя-новой-ветки> %s\n"
 
-#: builtin/checkout.c:795
+#: builtin/checkout.c:794
 msgid "internal error in revision walk"
 msgstr "внутренняя ошибка при хождении по редакциям"
 
-#: builtin/checkout.c:799
+#: builtin/checkout.c:798
 msgid "Previous HEAD position was"
 msgstr "Предыдущая позиция HEAD была"
 
-#: builtin/checkout.c:826 builtin/checkout.c:1065
+#: builtin/checkout.c:825 builtin/checkout.c:1064
 msgid "You are on a branch yet to be born"
 msgstr "Вы находитесь на еще не созданной ветке"
 
-#: builtin/checkout.c:971
+#: builtin/checkout.c:970
 #, c-format
 msgid "only one reference expected, %d given."
 msgstr "ожидается только одна ссылка, а передано %d."
 
-#: builtin/checkout.c:1011 builtin/worktree.c:214
+#: builtin/checkout.c:1010 builtin/worktree.c:214
 #, c-format
 msgid "invalid reference: %s"
 msgstr "неправильная ссылка: %s"
 
-#: builtin/checkout.c:1040
+#: builtin/checkout.c:1039
 #, c-format
 msgid "reference is not a tree: %s"
 msgstr "в дереве нет такой ссылки: %s"
 
-#: builtin/checkout.c:1079
+#: builtin/checkout.c:1078
 msgid "paths cannot be used with switching branches"
 msgstr "нельзя использовать пути при переключении веток"
 
-#: builtin/checkout.c:1082 builtin/checkout.c:1086
+#: builtin/checkout.c:1081 builtin/checkout.c:1085
 #, c-format
 msgid "'%s' cannot be used with switching branches"
 msgstr "нельзя использовать «%s» при переключении веток"
 
-#: builtin/checkout.c:1090 builtin/checkout.c:1093 builtin/checkout.c:1098
-#: builtin/checkout.c:1101
+#: builtin/checkout.c:1089 builtin/checkout.c:1092 builtin/checkout.c:1097
+#: builtin/checkout.c:1100
 #, c-format
 msgid "'%s' cannot be used with '%s'"
 msgstr "«%s» нельзя использовать одновременно с «%s»"
 
-#: builtin/checkout.c:1106
+#: builtin/checkout.c:1105
 #, c-format
 msgid "Cannot switch branch to a non-commit '%s'"
 msgstr "Нельзя переключить ветку на не коммит «%s»"
 
-#: builtin/checkout.c:1139 builtin/checkout.c:1141 builtin/clone.c:88
+#: builtin/checkout.c:1138 builtin/checkout.c:1140 builtin/clone.c:93
 #: builtin/remote.c:165 builtin/remote.c:167 builtin/worktree.c:324
 #: builtin/worktree.c:326
 msgid "branch"
 msgstr "ветка"
 
-#: builtin/checkout.c:1140
+#: builtin/checkout.c:1139
 msgid "create and checkout a new branch"
 msgstr "создать и переключиться на новую ветку"
 
-#: builtin/checkout.c:1142
+#: builtin/checkout.c:1141
 msgid "create/reset and checkout a branch"
 msgstr "создать/сбросить и перключиться на новую ветку"
 
-#: builtin/checkout.c:1143
+#: builtin/checkout.c:1142
 msgid "create reflog for new branch"
 msgstr "создать журнал ссылок для новой ветки"
 
-#: builtin/checkout.c:1144 builtin/worktree.c:328
+#: builtin/checkout.c:1143 builtin/worktree.c:328
 msgid "detach HEAD at named commit"
 msgstr "отсоединить HEAD на указанном коммите"
 
-#: builtin/checkout.c:1145
+#: builtin/checkout.c:1144
 msgid "set upstream info for new branch"
 msgstr "установить информацию о вышестоящей ветке для новой ветки"
 
-#: builtin/checkout.c:1147
+#: builtin/checkout.c:1146
 msgid "new-branch"
 msgstr "новая-ветка"
 
-#: builtin/checkout.c:1147
+#: builtin/checkout.c:1146
 msgid "new unparented branch"
 msgstr "новая ветка без родителей"
 
-#: builtin/checkout.c:1148
+#: builtin/checkout.c:1147
 msgid "checkout our version for unmerged files"
 msgstr "переключиться на нашу версию для не слитых файлов"
 
-#: builtin/checkout.c:1150
+#: builtin/checkout.c:1149
 msgid "checkout their version for unmerged files"
 msgstr "переключиться на их версию для не слитых файлов"
 
-#: builtin/checkout.c:1152
+#: builtin/checkout.c:1151
 msgid "force checkout (throw away local modifications)"
 msgstr "принудительное переключение на состояние (отбрасывает все локальные изменения)"
 
-#: builtin/checkout.c:1153
+#: builtin/checkout.c:1152
 msgid "perform a 3-way merge with the new branch"
 msgstr "выполнить трехходовое слияние с новой веткой"
 
-#: builtin/checkout.c:1154 builtin/merge.c:231
+#: builtin/checkout.c:1153 builtin/merge.c:231
 msgid "update ignored files (default)"
 msgstr "обновить игнорируемые файлы (по умолчанию)"
 
-#: builtin/checkout.c:1155 builtin/log.c:1459 parse-options.h:250
+#: builtin/checkout.c:1154 builtin/log.c:1466 parse-options.h:251
 msgid "style"
 msgstr "стиль"
 
-#: builtin/checkout.c:1156
+#: builtin/checkout.c:1155
 msgid "conflict style (merge or diff3)"
 msgstr "стиль конфликтов слияния (merge или diff3)"
 
-#: builtin/checkout.c:1159
+#: builtin/checkout.c:1158
 msgid "do not limit pathspecs to sparse entries only"
 msgstr "не ограничивать спецификаторы пути только частичными записями"
 
-#: builtin/checkout.c:1161
+#: builtin/checkout.c:1160
 msgid "second guess 'git checkout <no-such-branch>'"
 msgstr "пересмотр «git checkout <нет-такой-ветки>»"
 
-#: builtin/checkout.c:1163
+#: builtin/checkout.c:1162
 msgid "do not check if another worktree is holding the given ref"
 msgstr "не проверять, что другое дерево уже содержит указанную ссылку"
 
-#: builtin/checkout.c:1164 builtin/clone.c:60 builtin/fetch.c:117
-#: builtin/merge.c:228 builtin/pull.c:116 builtin/push.c:536
+#: builtin/checkout.c:1163 builtin/clone.c:63 builtin/fetch.c:119
+#: builtin/merge.c:228 builtin/pull.c:117 builtin/push.c:536
 #: builtin/send-pack.c:168
 msgid "force progress reporting"
 msgstr "принудительно выводить прогресс"
 
-#: builtin/checkout.c:1195
+#: builtin/checkout.c:1194
 msgid "-b, -B and --orphan are mutually exclusive"
 msgstr "-b, -B и --orphan нельзя использовать одновременно"
 
-#: builtin/checkout.c:1212
+#: builtin/checkout.c:1211
 msgid "--track needs a branch name"
 msgstr "--track требует имя ветки"
 
-#: builtin/checkout.c:1217
+#: builtin/checkout.c:1216
 msgid "Missing branch name; try -b"
 msgstr "Пропущено имя ветки; попробуйте -b"
 
-#: builtin/checkout.c:1253
+#: builtin/checkout.c:1252
 msgid "invalid path specification"
 msgstr "неправильная спецификация пути"
 
-#: builtin/checkout.c:1260
+#: builtin/checkout.c:1259
 #, c-format
 msgid ""
 "Cannot update paths and switch to branch '%s' at the same time.\n"
 "Did you intend to checkout '%s' which can not be resolved as commit?"
 msgstr "Нельзя обновить пути и одновременно переключиться на ветку «%s».\nВы хотели переключиться на «%s», что не может быть определено как коммит?"
 
-#: builtin/checkout.c:1265
+#: builtin/checkout.c:1264
 #, c-format
 msgid "git checkout: --detach does not take a path argument '%s'"
 msgstr "git checkout: --detach не принимает путь «%s» как аргумент"
 
-#: builtin/checkout.c:1269
+#: builtin/checkout.c:1268
 msgid ""
 "git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
 "checking out of the index."
@@ -5008,8 +5520,8 @@ msgstr "интерактивная очистка"
 msgid "remove whole directories"
 msgstr "удалить каталоги полностью"
 
-#: builtin/clean.c:875 builtin/describe.c:407 builtin/grep.c:724
-#: builtin/ls-files.c:457 builtin/name-rev.c:314 builtin/show-ref.c:182
+#: builtin/clean.c:875 builtin/describe.c:407 builtin/grep.c:725
+#: builtin/ls-files.c:536 builtin/name-rev.c:313 builtin/show-ref.c:182
 msgid "pattern"
 msgstr "шаблон"
 
@@ -5045,290 +5557,306 @@ msgstr "clean.requireForce установлен по умолчанию как t
 msgid "git clone [<options>] [--] <repo> [<dir>]"
 msgstr "git clone [<опции>] [--] <репозиторий> [<каталог>]"
 
-#: builtin/clone.c:62
+#: builtin/clone.c:65
 msgid "don't create a checkout"
 msgstr "не переключать рабочую копию на HEAD"
 
-#: builtin/clone.c:63 builtin/clone.c:65 builtin/init-db.c:476
+#: builtin/clone.c:66 builtin/clone.c:68 builtin/init-db.c:478
 msgid "create a bare repository"
 msgstr "создать голый репозиторий"
 
-#: builtin/clone.c:67
+#: builtin/clone.c:70
 msgid "create a mirror repository (implies bare)"
 msgstr "создать зеркало репозитория (включает в себя и параметр bare)"
 
-#: builtin/clone.c:69
+#: builtin/clone.c:72
 msgid "to clone from a local repository"
 msgstr "для клонирования из локального репозитория"
 
-#: builtin/clone.c:71
+#: builtin/clone.c:74
 msgid "don't use local hardlinks, always copy"
 msgstr "не использовать жесткие ссылки, всегда копировать файлы"
 
-#: builtin/clone.c:73
+#: builtin/clone.c:76
 msgid "setup as shared repository"
 msgstr "настроить как общедоступный репозиторий"
 
-#: builtin/clone.c:75 builtin/clone.c:77
+#: builtin/clone.c:78 builtin/clone.c:80
 msgid "initialize submodules in the clone"
 msgstr "инициализировать подмодули в клоне"
 
-#: builtin/clone.c:79
+#: builtin/clone.c:82
 msgid "number of submodules cloned in parallel"
 msgstr "количество подмодулей, которые будут клонированы парралельно"
 
-#: builtin/clone.c:80 builtin/init-db.c:473
+#: builtin/clone.c:83 builtin/init-db.c:475
 msgid "template-directory"
 msgstr "каталог-шаблонов"
 
-#: builtin/clone.c:81 builtin/init-db.c:474
+#: builtin/clone.c:84 builtin/init-db.c:476
 msgid "directory from which templates will be used"
 msgstr "каталог, шаблоны из которого будут использованы"
 
-#: builtin/clone.c:83 builtin/submodule--helper.c:495
-#: builtin/submodule--helper.c:833
+#: builtin/clone.c:86 builtin/clone.c:88 builtin/submodule--helper.c:602
+#: builtin/submodule--helper.c:954
 msgid "reference repository"
 msgstr "ссылаемый репозиторий"
 
-#: builtin/clone.c:85
+#: builtin/clone.c:90
 msgid "use --reference only while cloning"
 msgstr "используйте --reference только при клонировании"
 
-#: builtin/clone.c:86 builtin/column.c:26 builtin/merge-file.c:44
+#: builtin/clone.c:91 builtin/column.c:26 builtin/merge-file.c:44
 msgid "name"
 msgstr "имя"
 
-#: builtin/clone.c:87
+#: builtin/clone.c:92
 msgid "use <name> instead of 'origin' to track upstream"
 msgstr "использовать <имя> вместо «origin» для отслеживания вышестоящего репозитория"
 
-#: builtin/clone.c:89
+#: builtin/clone.c:94
 msgid "checkout <branch> instead of the remote's HEAD"
 msgstr "переключиться на <ветку>, вместо HEAD внешнего репозитория"
 
-#: builtin/clone.c:91
+#: builtin/clone.c:96
 msgid "path to git-upload-pack on the remote"
 msgstr "путь к git-upload-pack на внешнем репозитории"
 
-#: builtin/clone.c:92 builtin/fetch.c:118 builtin/grep.c:667
-#: builtin/pull.c:201
+#: builtin/clone.c:97 builtin/fetch.c:120 builtin/grep.c:668
+#: builtin/pull.c:202
 msgid "depth"
 msgstr "глубина"
 
-#: builtin/clone.c:93
+#: builtin/clone.c:98
 msgid "create a shallow clone of that depth"
 msgstr "сделать частичный клон указанной глубины"
 
-#: builtin/clone.c:95
+#: builtin/clone.c:99 builtin/fetch.c:122 builtin/pack-objects.c:2848
+#: parse-options.h:142
+msgid "time"
+msgstr "время"
+
+#: builtin/clone.c:100
+msgid "create a shallow clone since a specific time"
+msgstr "сделать частичный клон до определенного времени"
+
+#: builtin/clone.c:101 builtin/fetch.c:124
+msgid "revision"
+msgstr "редакция"
+
+#: builtin/clone.c:102 builtin/fetch.c:125
+msgid "deepen history of shallow clone by excluding rev"
+msgstr "углубить историю частичного клона исключая редакцию"
+
+#: builtin/clone.c:104
 msgid "clone only one branch, HEAD or --branch"
 msgstr "клонировать только одну ветку, HEAD или --branch"
 
-#: builtin/clone.c:97
+#: builtin/clone.c:106
 msgid "any cloned submodules will be shallow"
 msgstr "все склонированные подмодули будут частичными клонами"
 
-#: builtin/clone.c:98 builtin/init-db.c:482
+#: builtin/clone.c:107 builtin/init-db.c:484
 msgid "gitdir"
 msgstr "каталог-git"
 
-#: builtin/clone.c:99 builtin/init-db.c:483
+#: builtin/clone.c:108 builtin/init-db.c:485
 msgid "separate git dir from working tree"
 msgstr "разместить каталог git отдельно от рабочей копии"
 
-#: builtin/clone.c:100
+#: builtin/clone.c:109
 msgid "key=value"
 msgstr "ключ=значение"
 
-#: builtin/clone.c:101
+#: builtin/clone.c:110
 msgid "set config inside the new repository"
 msgstr "установить параметры внутри нового репозитория"
 
-#: builtin/clone.c:102 builtin/fetch.c:132 builtin/push.c:547
+#: builtin/clone.c:111 builtin/fetch.c:140 builtin/push.c:547
 msgid "use IPv4 addresses only"
 msgstr "использовать только IPv4 адреса"
 
-#: builtin/clone.c:104 builtin/fetch.c:134 builtin/push.c:549
+#: builtin/clone.c:113 builtin/fetch.c:142 builtin/push.c:549
 msgid "use IPv6 addresses only"
 msgstr "использовать только IPv6 адреса"
 
-#: builtin/clone.c:241
+#: builtin/clone.c:250
 msgid ""
 "No directory name could be guessed.\n"
 "Please specify a directory on the command line"
 msgstr "Имя каталога не может быть угадано.\nУкажите имя каталога с помощью параметра командной строки"
 
-#: builtin/clone.c:307
-#, c-format
-msgid "reference repository '%s' as a linked checkout is not supported yet."
-msgstr "ссылаемый репозиторий «%s» как связанное состояние, пока не поддерживается."
-
-#: builtin/clone.c:309
-#, c-format
-msgid "reference repository '%s' is not a local repository."
-msgstr "ссылаемый репозиторий «%s» не является локальным."
-
-#: builtin/clone.c:314
-#, c-format
-msgid "reference repository '%s' is shallow"
-msgstr "ссылаемый репозиторий «%s» является частичным"
-
-#: builtin/clone.c:317
+#: builtin/clone.c:303
 #, c-format
-msgid "reference repository '%s' is grafted"
-msgstr "ссылаемый репозиторий «%s» является сращенным"
+msgid "info: Could not add alternate for '%s': %s\n"
+msgstr "информация: Не удалось добавить альтернативу для «%s»: %s\n"
 
-#: builtin/clone.c:376
+#: builtin/clone.c:375
 #, c-format
 msgid "failed to open '%s'"
 msgstr "не удалось открыть «%s»"
 
-#: builtin/clone.c:384
+#: builtin/clone.c:383
 #, c-format
 msgid "%s exists and is not a directory"
 msgstr "%s уже существует и не является каталогом"
 
-#: builtin/clone.c:398
+#: builtin/clone.c:397
 #, c-format
 msgid "failed to stat %s\n"
 msgstr "не удалось выполнить stat %s\n"
 
-#: builtin/clone.c:420
+#: builtin/clone.c:419
 #, c-format
 msgid "failed to create link '%s'"
 msgstr "не удалось создать ссылку «%s»"
 
-#: builtin/clone.c:424
+#: builtin/clone.c:423
 #, c-format
 msgid "failed to copy file to '%s'"
 msgstr "не удалось копировать файл в «%s»"
 
-#: builtin/clone.c:449
+#: builtin/clone.c:448
 #, c-format
 msgid "done.\n"
 msgstr "готово.\n"
 
-#: builtin/clone.c:461
+#: builtin/clone.c:460
 msgid ""
 "Clone succeeded, but checkout failed.\n"
 "You can inspect what was checked out with 'git status'\n"
 "and retry the checkout with 'git checkout -f HEAD'\n"
 msgstr "Клонирование прошло успешно, но во время переключения состояния произошла ошибка.\nС помощь команды «git status» вы можете просмотреть, какие файлы были обновлены, а повторить попытку переключения на ветку с помощью «git checkout -f HEAD»\n"
 
-#: builtin/clone.c:538
+#: builtin/clone.c:537
 #, c-format
 msgid "Could not find remote branch %s to clone."
 msgstr "Не удалось найти внешнюю ветку %s для клонирования."
 
-#: builtin/clone.c:633
+#: builtin/clone.c:632
 msgid "remote did not send all necessary objects"
 msgstr "внешний репозиторий прислал не все необходимые объекты"
 
-#: builtin/clone.c:649
+#: builtin/clone.c:648
 #, c-format
 msgid "unable to update %s"
 msgstr "не удалось обновить %s"
 
-#: builtin/clone.c:698
+#: builtin/clone.c:697
 msgid "remote HEAD refers to nonexistent ref, unable to checkout.\n"
 msgstr "внешний HEAD ссылается на несуществующую ссылку, нельзя переключиться на такую версию.\n"
 
-#: builtin/clone.c:729
+#: builtin/clone.c:728
 msgid "unable to checkout working tree"
 msgstr "не удалось переключиться на версию в рабочем каталоге"
 
-#: builtin/clone.c:766
+#: builtin/clone.c:768
 msgid "unable to write parameters to config file"
 msgstr "не удалось записать параметры в файл конфигурации"
 
-#: builtin/clone.c:829
+#: builtin/clone.c:831
 msgid "cannot repack to clean up"
 msgstr "не удалось выполнить перепаковку для очистки"
 
-#: builtin/clone.c:831
+#: builtin/clone.c:833
 msgid "cannot unlink temporary alternates file"
 msgstr "не удалось отсоединить временные альтернативные файлы"
 
-#: builtin/clone.c:863 builtin/receive-pack.c:1855
+#: builtin/clone.c:866 builtin/receive-pack.c:1895
 msgid "Too many arguments."
 msgstr "Слишком много аргументов."
 
-#: builtin/clone.c:867
+#: builtin/clone.c:870
 msgid "You must specify a repository to clone."
 msgstr "Вы должны указать репозиторий для клонирования."
 
-#: builtin/clone.c:878
+#: builtin/clone.c:883
 #, c-format
 msgid "--bare and --origin %s options are incompatible."
 msgstr "--bare и --origin %s нельзя использовать одновременно."
 
-#: builtin/clone.c:881
+#: builtin/clone.c:886
 msgid "--bare and --separate-git-dir are incompatible."
 msgstr "--bare и --separate-git-dir нельзя использовать одновременно."
 
-#: builtin/clone.c:894
+#: builtin/clone.c:899
 #, c-format
 msgid "repository '%s' does not exist"
 msgstr "репозиторий «%s» не существует"
 
-#: builtin/clone.c:900 builtin/fetch.c:1293
+#: builtin/clone.c:905 builtin/fetch.c:1338
 #, c-format
 msgid "depth %s is not a positive number"
 msgstr "глубина %s не является положительным числом"
 
-#: builtin/clone.c:910
+#: builtin/clone.c:915
 #, c-format
 msgid "destination path '%s' already exists and is not an empty directory."
 msgstr "целевой путь «%s» уже существует и не является пустым каталогом."
 
-#: builtin/clone.c:920
+#: builtin/clone.c:925
 #, c-format
 msgid "working tree '%s' already exists."
 msgstr "рабочий каталог «%s» уже существует."
 
-#: builtin/clone.c:935 builtin/clone.c:946 builtin/submodule--helper.c:544
+#: builtin/clone.c:940 builtin/clone.c:951 builtin/submodule--helper.c:657
 #: builtin/worktree.c:222 builtin/worktree.c:249
 #, c-format
 msgid "could not create leading directories of '%s'"
 msgstr "не удалось создать родительские каталоги для «%s»"
 
-#: builtin/clone.c:938
+#: builtin/clone.c:943
 #, c-format
 msgid "could not create work tree dir '%s'"
 msgstr "не удалось создать рабочий каталог «%s»"
 
-#: builtin/clone.c:956
+#: builtin/clone.c:955
 #, c-format
 msgid "Cloning into bare repository '%s'...\n"
 msgstr "Клонирование в голый репозиторий «%s»…\n"
 
-#: builtin/clone.c:958
+#: builtin/clone.c:957
 #, c-format
 msgid "Cloning into '%s'...\n"
 msgstr "Клонирование в «%s»…\n"
 
-#: builtin/clone.c:997
+#: builtin/clone.c:963
+msgid ""
+"clone --recursive is not compatible with both --reference and --reference-"
+"if-able"
+msgstr "клонирование с параметром --recursive нельзя использовать одновременно ни с --reference, ни с --reference-if-able"
+
+#: builtin/clone.c:1019
 msgid "--depth is ignored in local clones; use file:// instead."
 msgstr "--depth игнорируется на локальных клонах; вместо этого используйте file://."
 
-#: builtin/clone.c:1000
+#: builtin/clone.c:1021
+msgid "--shallow-since is ignored in local clones; use file:// instead."
+msgstr "--shallow-since игнорируется на локальных клонах; используйте file:// вместо этого."
+
+#: builtin/clone.c:1023
+msgid "--shallow-exclude is ignored in local clones; use file:// instead."
+msgstr "--shallow-exclude игнорируется на локальных клонах; используйте file:// вместо этого."
+
+#: builtin/clone.c:1026
 msgid "source repository is shallow, ignoring --local"
 msgstr "исходный репозиторий является частичным, --local игнорируется"
 
-#: builtin/clone.c:1005
+#: builtin/clone.c:1031
 msgid "--local is ignored"
 msgstr "--local игнорируется"
 
-#: builtin/clone.c:1009
+#: builtin/clone.c:1035
 #, c-format
 msgid "Don't know how to clone %s"
 msgstr "Не знаю как клонировать %s"
 
-#: builtin/clone.c:1058 builtin/clone.c:1066
+#: builtin/clone.c:1090 builtin/clone.c:1098
 #, c-format
 msgid "Remote branch %s not found in upstream %s"
 msgstr "Внешняя ветка %s не найдена в вышестоящем репозитории %s"
 
-#: builtin/clone.c:1069
+#: builtin/clone.c:1101
 msgid "You appear to have cloned an empty repository."
 msgstr "Похоже, что вы клонировали пустой репозиторий."
 
@@ -5431,103 +5959,103 @@ msgid ""
 "the remaining commits.\n"
 msgstr "Если вы хотите пропустит этот коммит, используйте команду:\n\n    git reset\n\nПосле этого «git cherry-pick --continue» продолжит копирование оставшихся коммитов.\n"
 
-#: builtin/commit.c:308
+#: builtin/commit.c:318
 msgid "failed to unpack HEAD tree object"
 msgstr "сбой распаковки объекта дерева HEAD"
 
-#: builtin/commit.c:349
+#: builtin/commit.c:359
 msgid "unable to create temporary index"
 msgstr "не удалось создать временный индекс"
 
-#: builtin/commit.c:355
+#: builtin/commit.c:365
 msgid "interactive add failed"
 msgstr "сбой интерактивного добавления"
 
-#: builtin/commit.c:368
+#: builtin/commit.c:378
 msgid "unable to update temporary index"
 msgstr "не удалось обновить временный индекс"
 
-#: builtin/commit.c:370
+#: builtin/commit.c:380
 msgid "Failed to update main cache tree"
 msgstr "Сбой при обновлении основного кэша дерева"
 
-#: builtin/commit.c:394 builtin/commit.c:417 builtin/commit.c:466
+#: builtin/commit.c:404 builtin/commit.c:427 builtin/commit.c:476
 msgid "unable to write new_index file"
 msgstr "не удалось записать файл new_index"
 
-#: builtin/commit.c:448
+#: builtin/commit.c:458
 msgid "cannot do a partial commit during a merge."
 msgstr "нельзя создать частичный коммит во время слияния."
 
-#: builtin/commit.c:450
+#: builtin/commit.c:460
 msgid "cannot do a partial commit during a cherry-pick."
 msgstr "нельзя создать частичный коммит во время копирования коммита."
 
-#: builtin/commit.c:459
+#: builtin/commit.c:469
 msgid "cannot read the index"
 msgstr "не удалось прочитать индекс"
 
-#: builtin/commit.c:478
+#: builtin/commit.c:488
 msgid "unable to write temporary index file"
 msgstr "не удалось записать временный файл индекса"
 
-#: builtin/commit.c:583
+#: builtin/commit.c:582
 #, c-format
 msgid "commit '%s' lacks author header"
 msgstr "у коммита «%s» отсутствует автор в заголовке"
 
-#: builtin/commit.c:585
+#: builtin/commit.c:584
 #, c-format
 msgid "commit '%s' has malformed author line"
 msgstr "у коммита «%s» строка автора в неправильном формате"
 
-#: builtin/commit.c:604
+#: builtin/commit.c:603
 msgid "malformed --author parameter"
 msgstr "параметр --author в неправильном формате"
 
-#: builtin/commit.c:612
+#: builtin/commit.c:611
 #, c-format
 msgid "invalid date format: %s"
 msgstr "неправильный формат даты: %s"
 
-#: builtin/commit.c:656
+#: builtin/commit.c:655
 msgid ""
 "unable to select a comment character that is not used\n"
 "in the current commit message"
 msgstr "нельзя выбрать символ комментария, который\nне используется в текущем сообщении коммита"
 
-#: builtin/commit.c:693 builtin/commit.c:726 builtin/commit.c:1092
+#: builtin/commit.c:692 builtin/commit.c:725 builtin/commit.c:1096
 #, c-format
 msgid "could not lookup commit %s"
 msgstr "не удалось запросить коммит %s"
 
-#: builtin/commit.c:705 builtin/shortlog.c:286
+#: builtin/commit.c:704 builtin/shortlog.c:286
 #, c-format
 msgid "(reading log message from standard input)\n"
 msgstr "(чтение файла журнала из стандартного ввода)\n"
 
-#: builtin/commit.c:707
+#: builtin/commit.c:706
 msgid "could not read log from standard input"
 msgstr "не удалось прочитать файл журнала из стандартного ввода"
 
-#: builtin/commit.c:711
+#: builtin/commit.c:710
 #, c-format
 msgid "could not read log file '%s'"
 msgstr "не удалось прочитать файл журнала «%s»"
 
-#: builtin/commit.c:738 builtin/commit.c:746
+#: builtin/commit.c:737 builtin/commit.c:745
 msgid "could not read SQUASH_MSG"
 msgstr "не удалось прочитать SQUASH_MSG"
 
-#: builtin/commit.c:743
+#: builtin/commit.c:742
 msgid "could not read MERGE_MSG"
 msgstr "не удалось прочитать MERGE_MSG"
 
-#: builtin/commit.c:797
+#: builtin/commit.c:796
 msgid "could not write commit template"
 msgstr "не удалось записать шаблон описания коммита"
 
-#: builtin/commit.c:815
+#: builtin/commit.c:814
 #, c-format
 msgid ""
 "\n"
@@ -5537,7 +6065,7 @@ msgid ""
 "and try again.\n"
 msgstr "\nПохоже, что вы пытаетесь закоммитить слияние.\nЕсли это ошибка, пожалуйста удалите файл\n\t%s\nи попробуйте снова.\n"
 
-#: builtin/commit.c:820
+#: builtin/commit.c:819
 #, c-format
 msgid ""
 "\n"
@@ -5547,14 +6075,14 @@ msgid ""
 "and try again.\n"
 msgstr "\nПохоже, что вы пытаетесь закоммитить при копировании коммита.\nЕсли это не так, то удалите файл\n\t%s\nи попробуйте снова.\n"
 
-#: builtin/commit.c:833
+#: builtin/commit.c:832
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
 "with '%c' will be ignored, and an empty message aborts the commit.\n"
 msgstr "Пожалуйста, введите сообщение коммита для ваших изменений. Строки,\nначинающиеся с «%c» будут проигнорированы, а пустое сообщение\nотменяет процесс коммита.\n"
 
-#: builtin/commit.c:840
+#: builtin/commit.c:839
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
@@ -5562,341 +6090,345 @@ msgid ""
 "An empty message aborts the commit.\n"
 msgstr "Пожалуйста, введите сообщение коммита для ваших изменений. Строки,\nначинающиеся с «%c» будут оставлены; вы можете удалить их вручную,\nесли хотите. Пустое сообщение отменяет процесс коммита.\n"
 
-#: builtin/commit.c:860
+#: builtin/commit.c:859
 #, c-format
 msgid "%sAuthor:    %.*s <%.*s>"
 msgstr "%sАвтор:     %.*s <%.*s>"
 
-#: builtin/commit.c:868
+#: builtin/commit.c:867
 #, c-format
 msgid "%sDate:      %s"
 msgstr "%sДата:      %s"
 
-#: builtin/commit.c:875
+#: builtin/commit.c:874
 #, c-format
 msgid "%sCommitter: %.*s <%.*s>"
 msgstr "%sКоммитер:  %.*s <%.*s>"
 
-#: builtin/commit.c:893
+#: builtin/commit.c:892
 msgid "Cannot read index"
 msgstr "Не удалось прочитать индекс"
 
-#: builtin/commit.c:950
+#: builtin/commit.c:954
 msgid "Error building trees"
 msgstr "Ошибка при построении деревьев"
 
-#: builtin/commit.c:965 builtin/tag.c:266
+#: builtin/commit.c:969 builtin/tag.c:266
 #, c-format
 msgid "Please supply the message using either -m or -F option.\n"
 msgstr "Пожалуйста, укажите сообщение, при указании опций -m или -F.\n"
 
-#: builtin/commit.c:1067
+#: builtin/commit.c:1071
 #, c-format
 msgid "--author '%s' is not 'Name <email>' and matches no existing author"
 msgstr "--author «%s» не в формате «Имя <почта>» и не совпадает с существующим автором"
 
-#: builtin/commit.c:1082 builtin/commit.c:1322
+#: builtin/commit.c:1086 builtin/commit.c:1327
 #, c-format
 msgid "Invalid untracked files mode '%s'"
 msgstr "Неправильный режим неотслеживаемых файлов «%s»"
 
-#: builtin/commit.c:1119
+#: builtin/commit.c:1124
 msgid "--long and -z are incompatible"
 msgstr "--long и -z нельзя использовать одновременно"
 
-#: builtin/commit.c:1149
+#: builtin/commit.c:1154
 msgid "Using both --reset-author and --author does not make sense"
 msgstr "Указание одновременно опций --reset-author и --author не имеет смысла"
 
-#: builtin/commit.c:1158
+#: builtin/commit.c:1163
 msgid "You have nothing to amend."
 msgstr "Нечего исправлять."
 
-#: builtin/commit.c:1161
+#: builtin/commit.c:1166
 msgid "You are in the middle of a merge -- cannot amend."
 msgstr "Вы в процессе слияния —  сейчас нельзя исправлять."
 
-#: builtin/commit.c:1163
+#: builtin/commit.c:1168
 msgid "You are in the middle of a cherry-pick -- cannot amend."
 msgstr "Вы в процессе копирования коммита —  сейчас нельзя исправлять."
 
-#: builtin/commit.c:1166
+#: builtin/commit.c:1171
 msgid "Options --squash and --fixup cannot be used together"
 msgstr "Опции --squash и --fixup не могут использоваться одновременно"
 
-#: builtin/commit.c:1176
+#: builtin/commit.c:1181
 msgid "Only one of -c/-C/-F/--fixup can be used."
 msgstr "Может использоваться только одна из опций -c/-C/-F/--fixup."
 
-#: builtin/commit.c:1178
+#: builtin/commit.c:1183
 msgid "Option -m cannot be combined with -c/-C/-F/--fixup."
 msgstr "Опция -m не может использоваться с -c/-C/-F/--fixup."
 
-#: builtin/commit.c:1186
+#: builtin/commit.c:1191
 msgid "--reset-author can be used only with -C, -c or --amend."
 msgstr "--reset-author может использоваться только одновременно с опциями -C, -c или --amend."
 
-#: builtin/commit.c:1203
+#: builtin/commit.c:1208
 msgid "Only one of --include/--only/--all/--interactive/--patch can be used."
 msgstr "Может использоваться только одна из опций --include/--only/--all/--interactive/--patch."
 
-#: builtin/commit.c:1205
+#: builtin/commit.c:1210
 msgid "No paths with --include/--only does not make sense."
 msgstr "Указание путей каталогов с опциями --include/--only не имеет смысла."
 
-#: builtin/commit.c:1207
+#: builtin/commit.c:1212
 msgid "Clever... amending the last one with dirty index."
 msgstr "Умно… отмена последнего с измененным индексом."
 
-#: builtin/commit.c:1209
+#: builtin/commit.c:1214
 msgid "Explicit paths specified without -i or -o; assuming --only paths..."
 msgstr "Пути явно указаны пути без опций -i или -o; предполагаю опцию --only…"
 
-#: builtin/commit.c:1221 builtin/tag.c:474
+#: builtin/commit.c:1226 builtin/tag.c:474
 #, c-format
 msgid "Invalid cleanup mode %s"
 msgstr "Неправильное значение режима очистки %s"
 
-#: builtin/commit.c:1226
+#: builtin/commit.c:1231
 msgid "Paths with -a does not make sense."
 msgstr "С опцией -a указание пути не имеет смысла."
 
-#: builtin/commit.c:1336 builtin/commit.c:1622
+#: builtin/commit.c:1341 builtin/commit.c:1617
 msgid "show status concisely"
 msgstr "кратко показать статус"
 
-#: builtin/commit.c:1338 builtin/commit.c:1624
+#: builtin/commit.c:1343 builtin/commit.c:1619
 msgid "show branch information"
 msgstr "показать информацию о версии"
 
-#: builtin/commit.c:1340 builtin/commit.c:1626 builtin/push.c:522
+#: builtin/commit.c:1345
+msgid "version"
+msgstr "версия"
+
+#: builtin/commit.c:1345 builtin/commit.c:1621 builtin/push.c:522
 #: builtin/worktree.c:440
 msgid "machine-readable output"
 msgstr "машиночитаемый вывод"
 
-#: builtin/commit.c:1343 builtin/commit.c:1628
+#: builtin/commit.c:1348 builtin/commit.c:1623
 msgid "show status in long format (default)"
 msgstr "показать статус в длинном формате (по умолчанию)"
 
-#: builtin/commit.c:1346 builtin/commit.c:1631
+#: builtin/commit.c:1351 builtin/commit.c:1626
 msgid "terminate entries with NUL"
 msgstr "завершать записи НУЛЕВЫМ байтом"
 
-#: builtin/commit.c:1348 builtin/commit.c:1634 builtin/fast-export.c:981
+#: builtin/commit.c:1353 builtin/commit.c:1629 builtin/fast-export.c:981
 #: builtin/fast-export.c:984 builtin/tag.c:353
 msgid "mode"
 msgstr "режим"
 
-#: builtin/commit.c:1349 builtin/commit.c:1634
+#: builtin/commit.c:1354 builtin/commit.c:1629
 msgid "show untracked files, optional modes: all, normal, no. (Default: all)"
 msgstr "показать неотслеживаемые файлы, опциональные режимы: all (все), normal (как обычно), no (нет). (По умолчанию: all)"
 
-#: builtin/commit.c:1352
+#: builtin/commit.c:1357
 msgid "show ignored files"
 msgstr "показать игнорируемые файлы"
 
-#: builtin/commit.c:1353 parse-options.h:155
+#: builtin/commit.c:1358 parse-options.h:155
 msgid "when"
 msgstr "когда"
 
-#: builtin/commit.c:1354
+#: builtin/commit.c:1359
 msgid ""
 "ignore changes to submodules, optional when: all, dirty, untracked. "
 "(Default: all)"
 msgstr "игнорировать изменения в подмодулях, опционально когда: all (всегда), dirty (измененные), untracked (неотслеживаемые). (По умолчанию: all)"
 
-#: builtin/commit.c:1356
+#: builtin/commit.c:1361
 msgid "list untracked files in columns"
 msgstr "показать неотслеживаемые файлы по столбцам"
 
-#: builtin/commit.c:1442
+#: builtin/commit.c:1437
 msgid "couldn't look up newly created commit"
 msgstr "нельзя запросить новосозданный коммит"
 
-#: builtin/commit.c:1444
+#: builtin/commit.c:1439
 msgid "could not parse newly created commit"
 msgstr "нельзя разобрать новосозданный коммит"
 
-#: builtin/commit.c:1489
+#: builtin/commit.c:1484
 msgid "detached HEAD"
 msgstr "отделённый HEAD"
 
-#: builtin/commit.c:1492
+#: builtin/commit.c:1487
 msgid " (root-commit)"
 msgstr " (корневой коммит)"
 
-#: builtin/commit.c:1592
+#: builtin/commit.c:1587
 msgid "suppress summary after successful commit"
 msgstr "не выводить сводку после успешного коммита"
 
-#: builtin/commit.c:1593
+#: builtin/commit.c:1588
 msgid "show diff in commit message template"
 msgstr "добавить список изменений в шаблон сообщения коммита"
 
-#: builtin/commit.c:1595
+#: builtin/commit.c:1590
 msgid "Commit message options"
 msgstr "Опции сообщения коммита"
 
-#: builtin/commit.c:1596 builtin/tag.c:351
+#: builtin/commit.c:1591 builtin/tag.c:351
 msgid "read message from file"
 msgstr "прочитать сообщение из файла"
 
-#: builtin/commit.c:1597
+#: builtin/commit.c:1592
 msgid "author"
 msgstr "автор"
 
-#: builtin/commit.c:1597
+#: builtin/commit.c:1592
 msgid "override author for commit"
 msgstr "подменить автора коммита"
 
-#: builtin/commit.c:1598 builtin/gc.c:326
+#: builtin/commit.c:1593 builtin/gc.c:326
 msgid "date"
 msgstr "дата"
 
-#: builtin/commit.c:1598
+#: builtin/commit.c:1593
 msgid "override date for commit"
 msgstr "подменить дату коммита"
 
-#: builtin/commit.c:1599 builtin/merge.c:220 builtin/notes.c:396
-#: builtin/notes.c:559 builtin/tag.c:349
+#: builtin/commit.c:1594 builtin/merge.c:220 builtin/notes.c:398
+#: builtin/notes.c:561 builtin/tag.c:349
 msgid "message"
 msgstr "сообщение"
 
-#: builtin/commit.c:1599
+#: builtin/commit.c:1594
 msgid "commit message"
 msgstr "сообщение коммита"
 
-#: builtin/commit.c:1600 builtin/commit.c:1601 builtin/commit.c:1602
-#: builtin/commit.c:1603 parse-options.h:256 ref-filter.h:79
+#: builtin/commit.c:1595 builtin/commit.c:1596 builtin/commit.c:1597
+#: builtin/commit.c:1598 parse-options.h:257 ref-filter.h:79
 msgid "commit"
 msgstr "коммит"
 
-#: builtin/commit.c:1600
+#: builtin/commit.c:1595
 msgid "reuse and edit message from specified commit"
 msgstr "использовать и отредактировать сообщение от указанного коммита"
 
-#: builtin/commit.c:1601
+#: builtin/commit.c:1596
 msgid "reuse message from specified commit"
 msgstr "использовать сообщение указанного коммита"
 
-#: builtin/commit.c:1602
+#: builtin/commit.c:1597
 msgid "use autosquash formatted message to fixup specified commit"
 msgstr "использовать форматированное сообщение автоуплотнения для исправления указанного коммита"
 
-#: builtin/commit.c:1603
+#: builtin/commit.c:1598
 msgid "use autosquash formatted message to squash specified commit"
 msgstr "использовать форматированное сообщение автоуплотнения для уплотнения указанного коммита"
 
-#: builtin/commit.c:1604
+#: builtin/commit.c:1599
 msgid "the commit is authored by me now (used with -C/-c/--amend)"
 msgstr "коммит теперь за моим авторством (с использованием -C/-c/--amend)"
 
-#: builtin/commit.c:1605 builtin/log.c:1409 builtin/revert.c:86
+#: builtin/commit.c:1600 builtin/log.c:1413 builtin/revert.c:86
 msgid "add Signed-off-by:"
 msgstr "добавить Signed-off-by:"
 
-#: builtin/commit.c:1606
+#: builtin/commit.c:1601
 msgid "use specified template file"
 msgstr "использовать указанный файл шаблона"
 
-#: builtin/commit.c:1607
+#: builtin/commit.c:1602
 msgid "force edit of commit"
 msgstr "принудительно редактировать коммит"
 
-#: builtin/commit.c:1608
+#: builtin/commit.c:1603
 msgid "default"
 msgstr "по-умолчанию"
 
-#: builtin/commit.c:1608 builtin/tag.c:354
+#: builtin/commit.c:1603 builtin/tag.c:354
 msgid "how to strip spaces and #comments from message"
 msgstr "как удалять пробелы и #комментарии из сообщения коммита"
 
-#: builtin/commit.c:1609
+#: builtin/commit.c:1604
 msgid "include status in commit message template"
 msgstr "включить статус файлов в шаблон сообщения коммита"
 
-#: builtin/commit.c:1611 builtin/merge.c:230 builtin/pull.c:165
+#: builtin/commit.c:1606 builtin/merge.c:230 builtin/pull.c:166
 #: builtin/revert.c:93
 msgid "GPG sign commit"
 msgstr "подписать коммит с помощью GPG"
 
-#: builtin/commit.c:1614
+#: builtin/commit.c:1609
 msgid "Commit contents options"
 msgstr "Опции содержимого коммита"
 
-#: builtin/commit.c:1615
+#: builtin/commit.c:1610
 msgid "commit all changed files"
 msgstr "закоммитить все измененные файлы"
 
-#: builtin/commit.c:1616
+#: builtin/commit.c:1611
 msgid "add specified files to index for commit"
 msgstr "добавить указанные файлы в индекс для коммита"
 
-#: builtin/commit.c:1617
+#: builtin/commit.c:1612
 msgid "interactively add files"
 msgstr "интерактивное добавление файлов"
 
-#: builtin/commit.c:1618
+#: builtin/commit.c:1613
 msgid "interactively add changes"
 msgstr "интерактивное добавление изменений"
 
-#: builtin/commit.c:1619
+#: builtin/commit.c:1614
 msgid "commit only specified files"
 msgstr "закоммитить только указанные файлы"
 
-#: builtin/commit.c:1620
+#: builtin/commit.c:1615
 msgid "bypass pre-commit and commit-msg hooks"
 msgstr "пропустить перехватчик pre-commit и commit-msg"
 
-#: builtin/commit.c:1621
+#: builtin/commit.c:1616
 msgid "show what would be committed"
 msgstr "показать, что будет закоммичено"
 
-#: builtin/commit.c:1632
+#: builtin/commit.c:1627
 msgid "amend previous commit"
 msgstr "исправить предыдущий коммит"
 
-#: builtin/commit.c:1633
+#: builtin/commit.c:1628
 msgid "bypass post-rewrite hook"
 msgstr "пропустить перехватчик post-rewrite"
 
-#: builtin/commit.c:1638
+#: builtin/commit.c:1633
 msgid "ok to record an empty change"
 msgstr "разрешить запись пустого коммита"
 
-#: builtin/commit.c:1640
+#: builtin/commit.c:1635
 msgid "ok to record a change with an empty message"
 msgstr "разрешить запись изменений с пустым сообщением"
 
-#: builtin/commit.c:1669
+#: builtin/commit.c:1664
 msgid "could not parse HEAD commit"
 msgstr "не удалось разобрать HEAD коммит"
 
-#: builtin/commit.c:1719
+#: builtin/commit.c:1712
 #, c-format
 msgid "Corrupt MERGE_HEAD file (%s)"
 msgstr "Файл MERGE_HEAD поврежден (%s)"
 
-#: builtin/commit.c:1726
+#: builtin/commit.c:1719
 msgid "could not read MERGE_MODE"
 msgstr "не удалось прочитать MERGE_MODE"
 
-#: builtin/commit.c:1745
+#: builtin/commit.c:1738
 #, c-format
 msgid "could not read commit message: %s"
 msgstr "не удалось открыть сообщение коммита: %s"
 
-#: builtin/commit.c:1756
+#: builtin/commit.c:1749
 #, c-format
 msgid "Aborting commit; you did not edit the message.\n"
 msgstr "Отмена коммита; вы не изменили сообщение.\n"
 
-#: builtin/commit.c:1761
+#: builtin/commit.c:1754
 #, c-format
 msgid "Aborting commit due to empty commit message.\n"
 msgstr "Отмена коммита из-за пустого сообщения коммита.\n"
 
-#: builtin/commit.c:1809
+#: builtin/commit.c:1802
 msgid ""
 "Repository has been updated, but unable to write\n"
 "new_index file. Check that disk is not full and quota is\n"
@@ -6054,11 +6586,18 @@ msgstr "# Это файл конфигурации пользователя Git.
 msgid "cannot create configuration file %s"
 msgstr "не удалось создать файл конфигурации %s"
 
-#: builtin/count-objects.c:77
+#: builtin/config.c:625
+#, c-format
+msgid ""
+"cannot overwrite multiple values with a single value\n"
+"       Use a regexp, --add or --replace-all to change %s."
+msgstr "нельзя перезаписать несколько значений одним\n       Используйте регулярные выражения, параметры --add или --replace-all, чтобы изменить %s."
+
+#: builtin/count-objects.c:86
 msgid "git count-objects [-v] [-H | --human-readable]"
 msgstr "git count-objects [-v] [-H | --human-readable]"
 
-#: builtin/count-objects.c:87
+#: builtin/count-objects.c:96
 msgid "print sizes in human readable format"
 msgstr "вывод размеров в удобочитаемом для человека виде"
 
@@ -6172,7 +6711,7 @@ msgstr "рассматривать последние <n> меток (по ум
 msgid "only consider tags matching <pattern>"
 msgstr "рассматривать только метки по <шаблону>"
 
-#: builtin/describe.c:410 builtin/name-rev.c:321
+#: builtin/describe.c:410 builtin/name-rev.c:320
 msgid "show abbreviated commit object as fallback"
 msgstr "если не найдено, показать сокращенный номер редакции коммита"
 
@@ -6206,21 +6745,21 @@ msgstr "«%s»: не является обычным файлом или сим
 msgid "invalid option: %s"
 msgstr "неправильный параметр: %s"
 
-#: builtin/diff.c:360
+#: builtin/diff.c:361
 msgid "Not a git repository"
 msgstr "Не найден git репозитоий"
 
-#: builtin/diff.c:403
+#: builtin/diff.c:404
 #, c-format
 msgid "invalid object '%s' given."
 msgstr "передан неправильный объект «%s»."
 
-#: builtin/diff.c:412
+#: builtin/diff.c:413
 #, c-format
 msgid "more than two blobs given: '%s'"
 msgstr "передано больше двух двоичных объектов: «%s»"
 
-#: builtin/diff.c:419
+#: builtin/diff.c:420
 #, c-format
 msgid "unhandled object '%s' given."
 msgstr "передан необработанный объект «%s»."
@@ -6293,247 +6832,259 @@ msgstr "git fetch --multiple [<опции>] [(<репозиторий> | <гру
 msgid "git fetch --all [<options>]"
 msgstr "git fetch --all [<опции>]"
 
-#: builtin/fetch.c:93 builtin/pull.c:174
+#: builtin/fetch.c:95 builtin/pull.c:175
 msgid "fetch from all remotes"
 msgstr "извлечь со всех внешних репозиториев"
 
-#: builtin/fetch.c:95 builtin/pull.c:177
+#: builtin/fetch.c:97 builtin/pull.c:178
 msgid "append to .git/FETCH_HEAD instead of overwriting"
 msgstr "дописать к .git/FETCH_HEAD вместо перезаписи"
 
-#: builtin/fetch.c:97 builtin/pull.c:180
+#: builtin/fetch.c:99 builtin/pull.c:181
 msgid "path to upload pack on remote end"
 msgstr "путь к программе упаковки пакета на машине с внешним репозиторием"
 
-#: builtin/fetch.c:98 builtin/pull.c:182
+#: builtin/fetch.c:100 builtin/pull.c:183
 msgid "force overwrite of local branch"
 msgstr "принудительная перезапись локальной ветки"
 
-#: builtin/fetch.c:100
+#: builtin/fetch.c:102
 msgid "fetch from multiple remotes"
 msgstr "извлечь с нескольких внешних репозиториев"
 
-#: builtin/fetch.c:102 builtin/pull.c:184
+#: builtin/fetch.c:104 builtin/pull.c:185
 msgid "fetch all tags and associated objects"
 msgstr "извлечь все метки и связанные объекты"
 
-#: builtin/fetch.c:104
+#: builtin/fetch.c:106
 msgid "do not fetch all tags (--no-tags)"
 msgstr "не извлекать все метки (--no-tags)"
 
-#: builtin/fetch.c:106
+#: builtin/fetch.c:108
 msgid "number of submodules fetched in parallel"
 msgstr "количество подмодулей, которые будут скачаны парралельно"
 
-#: builtin/fetch.c:108 builtin/pull.c:187
+#: builtin/fetch.c:110 builtin/pull.c:188
 msgid "prune remote-tracking branches no longer on remote"
 msgstr "почистить отслеживаемые внешние ветки, которых уже нет на внешнем репозитории"
 
-#: builtin/fetch.c:109 builtin/pull.c:190
+#: builtin/fetch.c:111 builtin/pull.c:191
 msgid "on-demand"
 msgstr "по требованию"
 
-#: builtin/fetch.c:110 builtin/pull.c:191
+#: builtin/fetch.c:112 builtin/pull.c:192
 msgid "control recursive fetching of submodules"
 msgstr "управление рекурсивным извлечением подмодулей"
 
-#: builtin/fetch.c:114 builtin/pull.c:199
+#: builtin/fetch.c:116 builtin/pull.c:200
 msgid "keep downloaded pack"
 msgstr "оставить загруженный пакет данных"
 
-#: builtin/fetch.c:116
+#: builtin/fetch.c:118
 msgid "allow updating of HEAD ref"
 msgstr "разрешить обновление ссылки HEAD"
 
-#: builtin/fetch.c:119 builtin/pull.c:202
+#: builtin/fetch.c:121 builtin/fetch.c:127 builtin/pull.c:203
 msgid "deepen history of shallow clone"
-msgstr "глубокая история частичного клона"
+msgstr "улугубить историю частичного клона"
 
-#: builtin/fetch.c:121 builtin/pull.c:205
+#: builtin/fetch.c:123
+msgid "deepen history of shallow repository based on time"
+msgstr "углубить историю частичного клона основываясь на времени"
+
+#: builtin/fetch.c:129 builtin/pull.c:206
 msgid "convert to a complete repository"
 msgstr "преобразовать в полный репозиторий"
 
-#: builtin/fetch.c:123 builtin/log.c:1426
+#: builtin/fetch.c:131 builtin/log.c:1433
 msgid "dir"
 msgstr "каталог"
 
-#: builtin/fetch.c:124
+#: builtin/fetch.c:132
 msgid "prepend this to submodule path output"
 msgstr "присоединять это спереди к выводу путей подмодуля"
 
-#: builtin/fetch.c:127
+#: builtin/fetch.c:135
 msgid "default mode for recursion"
 msgstr "режим по умолчанию для рекурсии"
 
-#: builtin/fetch.c:129 builtin/pull.c:208
+#: builtin/fetch.c:137 builtin/pull.c:209
 msgid "accept refs that update .git/shallow"
 msgstr "принимать ссылки, которые обновляют .git/shallow"
 
-#: builtin/fetch.c:130 builtin/pull.c:210
+#: builtin/fetch.c:138 builtin/pull.c:211
 msgid "refmap"
 msgstr "соответствие-ссылок"
 
-#: builtin/fetch.c:131 builtin/pull.c:211
+#: builtin/fetch.c:139 builtin/pull.c:212
 msgid "specify fetch refmap"
 msgstr "указать соответствие ссылок при извлечении"
 
-#: builtin/fetch.c:387
+#: builtin/fetch.c:398
 msgid "Couldn't find remote ref HEAD"
 msgstr "Не удалось найти ссылку HEAD на внешнем репозитории"
 
-#: builtin/fetch.c:503
+#: builtin/fetch.c:514
 #, c-format
 msgid "configuration fetch.output contains invalid value %s"
 msgstr "опция fetch.output содержит неправильное значение для %s"
 
-#: builtin/fetch.c:592
+#: builtin/fetch.c:607
 #, c-format
 msgid "object %s not found"
 msgstr "объект %s не найден"
 
-#: builtin/fetch.c:596
+#: builtin/fetch.c:611
 msgid "[up to date]"
 msgstr "[актуально]"
 
-#: builtin/fetch.c:609 builtin/fetch.c:689
+#: builtin/fetch.c:624 builtin/fetch.c:704
 msgid "[rejected]"
 msgstr "[отклонено]"
 
-#: builtin/fetch.c:610
+#: builtin/fetch.c:625
 msgid "can't fetch in current branch"
 msgstr "нельзя извлечь текущую ветку"
 
-#: builtin/fetch.c:619
+#: builtin/fetch.c:634
 msgid "[tag update]"
 msgstr "[обновление метки]"
 
-#: builtin/fetch.c:620 builtin/fetch.c:653 builtin/fetch.c:669
-#: builtin/fetch.c:684
+#: builtin/fetch.c:635 builtin/fetch.c:668 builtin/fetch.c:684
+#: builtin/fetch.c:699
 msgid "unable to update local ref"
 msgstr "не удалось обновить локальную ссылку"
 
-#: builtin/fetch.c:639
+#: builtin/fetch.c:654
 msgid "[new tag]"
 msgstr "[новая метка]"
 
-#: builtin/fetch.c:642
+#: builtin/fetch.c:657
 msgid "[new branch]"
 msgstr "[новая ветка]"
 
-#: builtin/fetch.c:645
+#: builtin/fetch.c:660
 msgid "[new ref]"
 msgstr "[новая ссылка]"
 
-#: builtin/fetch.c:684
+#: builtin/fetch.c:699
 msgid "forced update"
 msgstr "принудительное обновление"
 
-#: builtin/fetch.c:689
+#: builtin/fetch.c:704
 msgid "non-fast-forward"
 msgstr "без перемотки вперед"
 
-#: builtin/fetch.c:733
+#: builtin/fetch.c:749
 #, c-format
 msgid "%s did not send all necessary objects\n"
 msgstr "%s не отправил все необходимые объекты\n"
 
-#: builtin/fetch.c:753
+#: builtin/fetch.c:769
 #, c-format
 msgid "reject %s because shallow roots are not allowed to be updated"
 msgstr "%s отклонено из-за того, что частичные корни не разрешено обновлять"
 
-#: builtin/fetch.c:839 builtin/fetch.c:934
+#: builtin/fetch.c:856 builtin/fetch.c:952
 #, c-format
 msgid "From %.*s\n"
 msgstr "Из %.*s\n"
 
-#: builtin/fetch.c:850
+#: builtin/fetch.c:867
 #, c-format
 msgid ""
 "some local refs could not be updated; try running\n"
 " 'git remote prune %s' to remove any old, conflicting branches"
 msgstr "не удалось обновить некоторые локальные ссылки; попробуйте запустить «git remote prune %s», чтобы почистить старые, конфликтующие ветки"
 
-#: builtin/fetch.c:904
+#: builtin/fetch.c:922
 #, c-format
 msgid "   (%s will become dangling)"
 msgstr "   (%s будет висящей веткой)"
 
-#: builtin/fetch.c:905
+#: builtin/fetch.c:923
 #, c-format
 msgid "   (%s has become dangling)"
 msgstr "   (%s стала висящей веткой)"
 
-#: builtin/fetch.c:937
+#: builtin/fetch.c:955
 msgid "[deleted]"
 msgstr "[удалено]"
 
-#: builtin/fetch.c:938 builtin/remote.c:1020
+#: builtin/fetch.c:956 builtin/remote.c:1020
 msgid "(none)"
 msgstr "(нет)"
 
-#: builtin/fetch.c:960
+#: builtin/fetch.c:979
 #, c-format
 msgid "Refusing to fetch into current branch %s of non-bare repository"
 msgstr "Отказ получения в текущую ветку %s не голого репозитория"
 
-#: builtin/fetch.c:979
+#: builtin/fetch.c:998
 #, c-format
 msgid "Option \"%s\" value \"%s\" is not valid for %s"
 msgstr "Неправильное значение «%2$s» для параметра «%1$s» для %3$s"
 
-#: builtin/fetch.c:982
+#: builtin/fetch.c:1001
 #, c-format
 msgid "Option \"%s\" is ignored for %s\n"
 msgstr "Параметр «%s» игнорируется для %s\n"
 
-#: builtin/fetch.c:1039
+#: builtin/fetch.c:1077
 #, c-format
 msgid "Don't know how to fetch from %s"
 msgstr "Не знаю как извлечь с %s"
 
-#: builtin/fetch.c:1199
+#: builtin/fetch.c:1237
 #, c-format
 msgid "Fetching %s\n"
 msgstr "Извлечение из %s\n"
 
-#: builtin/fetch.c:1201 builtin/remote.c:96
+#: builtin/fetch.c:1239 builtin/remote.c:96
 #, c-format
 msgid "Could not fetch %s"
 msgstr "Не удалось извлечь %s"
 
-#: builtin/fetch.c:1219
+#: builtin/fetch.c:1257
 msgid ""
 "No remote repository specified.  Please, specify either a URL or a\n"
 "remote name from which new revisions should be fetched."
 msgstr "Не указан внешний репозиторий. Укажите URL или имя внешнего репозитория из которого должны извлекаться новые редакции."
 
-#: builtin/fetch.c:1242
+#: builtin/fetch.c:1280
 msgid "You need to specify a tag name."
 msgstr "Вам нужно указать имя метки."
 
-#: builtin/fetch.c:1284
+#: builtin/fetch.c:1322
+msgid "Negative depth in --deepen is not supported"
+msgstr "Отрицательная грубина для --deepen не поддерживается"
+
+#: builtin/fetch.c:1324
+msgid "--deepen and --depth are mutually exclusive"
+msgstr "--deepen и --depth нельзя использовать одновременно"
+
+#: builtin/fetch.c:1329
 msgid "--depth and --unshallow cannot be used together"
 msgstr "нельзя использовать одновременно --depth и --unshallow"
 
-#: builtin/fetch.c:1286
+#: builtin/fetch.c:1331
 msgid "--unshallow on a complete repository does not make sense"
 msgstr "--unshallow не имеет смысла на полном репозитории"
 
-#: builtin/fetch.c:1306
+#: builtin/fetch.c:1353
 msgid "fetch --all does not take a repository argument"
 msgstr "fetch --all не принимает имя репозитория как аргумент"
 
-#: builtin/fetch.c:1308
+#: builtin/fetch.c:1355
 msgid "fetch --all does not make sense with refspecs"
 msgstr "fetch --all не имеет смысла при указании спецификаций ссылок"
 
-#: builtin/fetch.c:1319
+#: builtin/fetch.c:1366
 #, c-format
 msgid "No such remote or remote group: %s"
 msgstr "Нет такого внешнего репозитория или группы: %s"
 
-#: builtin/fetch.c:1327
+#: builtin/fetch.c:1374
 msgid "Fetching a group and specifying refspecs does not make sense"
 msgstr "Получение группы и указание спецификаций ссылок не имеет смысла"
 
@@ -6542,23 +7093,23 @@ msgid ""
 "git fmt-merge-msg [-m <message>] [--log[=<n>] | --no-log] [--file <file>]"
 msgstr "git fmt-merge-msg [-m <сообщение>] [--log[=<n>] | --no-log] [--file <файл>]"
 
-#: builtin/fmt-merge-msg.c:667
+#: builtin/fmt-merge-msg.c:663
 msgid "populate log with at most <n> entries from shortlog"
 msgstr "отправить в журнал <n> записей из короткого журнала"
 
-#: builtin/fmt-merge-msg.c:670
+#: builtin/fmt-merge-msg.c:666
 msgid "alias for --log (deprecated)"
 msgstr "сокращение для --log (устаревшее)"
 
-#: builtin/fmt-merge-msg.c:673
+#: builtin/fmt-merge-msg.c:669
 msgid "text"
 msgstr "текст"
 
-#: builtin/fmt-merge-msg.c:674
+#: builtin/fmt-merge-msg.c:670
 msgid "use <text> as start of message"
 msgstr "использовать <текст> как начальное сообщение"
 
-#: builtin/fmt-merge-msg.c:675
+#: builtin/fmt-merge-msg.c:671
 msgid "file to read from"
 msgstr "файл для чтения"
 
@@ -6674,7 +7225,7 @@ msgstr "показать прогресс выполнения"
 msgid "show verbose names for reachable objects"
 msgstr "показать подробные имена для недоступных объектов"
 
-#: builtin/fsck.c:671
+#: builtin/fsck.c:665
 msgid "Checking objects"
 msgstr "Проверка объектов"
 
@@ -6759,224 +7310,219 @@ msgstr "grep: сбой создания потока: %s"
 msgid "invalid number of threads specified (%d) for %s"
 msgstr "указано недопустимое количество потоков (%d) для %s"
 
-#: builtin/grep.c:452 builtin/grep.c:487
+#: builtin/grep.c:453 builtin/grep.c:488
 #, c-format
 msgid "unable to read tree (%s)"
 msgstr "не удалось прочитать дерево (%s)"
 
-#: builtin/grep.c:502
+#: builtin/grep.c:503
 #, c-format
 msgid "unable to grep from object of type %s"
 msgstr "не удалось выполнить grep из объекта типа %s"
 
-#: builtin/grep.c:560
+#: builtin/grep.c:561
 #, c-format
 msgid "switch `%c' expects a numerical value"
 msgstr "параметр «%c» ожидает числовое значение"
 
-#: builtin/grep.c:577
-#, c-format
-msgid "cannot open '%s'"
-msgstr "не удалось открыть «%s»"
-
-#: builtin/grep.c:646
+#: builtin/grep.c:647
 msgid "search in index instead of in the work tree"
 msgstr "искать в индексе, а не в рабочем каталоге"
 
-#: builtin/grep.c:648
+#: builtin/grep.c:649
 msgid "find in contents not managed by git"
 msgstr "искать в содержимом не управляемым git"
 
-#: builtin/grep.c:650
+#: builtin/grep.c:651
 msgid "search in both tracked and untracked files"
 msgstr "искать и в отслеживаемых, и в неотслеживаемых файлах"
 
-#: builtin/grep.c:652
+#: builtin/grep.c:653
 msgid "ignore files specified via '.gitignore'"
 msgstr "игнорировать файлы указанные в «.gitignore»"
 
-#: builtin/grep.c:655
+#: builtin/grep.c:656
 msgid "show non-matching lines"
 msgstr "искать в несовпадающих строках"
 
-#: builtin/grep.c:657
+#: builtin/grep.c:658
 msgid "case insensitive matching"
 msgstr "без учета регистра"
 
-#: builtin/grep.c:659
+#: builtin/grep.c:660
 msgid "match patterns only at word boundaries"
 msgstr "искать совпадения шаблона только на границах слов"
 
-#: builtin/grep.c:661
+#: builtin/grep.c:662
 msgid "process binary files as text"
 msgstr "обработка двоичных файлов как текста"
 
-#: builtin/grep.c:663
+#: builtin/grep.c:664
 msgid "don't match patterns in binary files"
 msgstr "не искать совпадения шаблона в двоичных файлах"
 
-#: builtin/grep.c:666
+#: builtin/grep.c:667
 msgid "process binary files with textconv filters"
 msgstr "обрабатываться двоичные файлы с помощью фильтров textconv"
 
-#: builtin/grep.c:668
+#: builtin/grep.c:669
 msgid "descend at most <depth> levels"
 msgstr "на глубине максиму <глубина> уровней"
 
-#: builtin/grep.c:672
+#: builtin/grep.c:673
 msgid "use extended POSIX regular expressions"
 msgstr "использовать расширенные регулярные выражения POSIX"
 
-#: builtin/grep.c:675
+#: builtin/grep.c:676
 msgid "use basic POSIX regular expressions (default)"
 msgstr "использовать базовые регулярные выражения POSIX (по умолчанию)"
 
-#: builtin/grep.c:678
+#: builtin/grep.c:679
 msgid "interpret patterns as fixed strings"
 msgstr "интерпретировать шаблоны как фиксированные строки"
 
-#: builtin/grep.c:681
+#: builtin/grep.c:682
 msgid "use Perl-compatible regular expressions"
 msgstr "использовать Perl-совместимые регулярные выражения"
 
-#: builtin/grep.c:684
+#: builtin/grep.c:685
 msgid "show line numbers"
 msgstr "вывести номера строк"
 
-#: builtin/grep.c:685
+#: builtin/grep.c:686
 msgid "don't show filenames"
 msgstr "не выводить имена файлов"
 
-#: builtin/grep.c:686
+#: builtin/grep.c:687
 msgid "show filenames"
 msgstr "выводить имена файлов"
 
-#: builtin/grep.c:688
+#: builtin/grep.c:689
 msgid "show filenames relative to top directory"
 msgstr "выводить имена файлов относительно каталога репозитория"
 
-#: builtin/grep.c:690
+#: builtin/grep.c:691
 msgid "show only filenames instead of matching lines"
 msgstr "выводить только имена файлов, а не совпадающие строки"
 
-#: builtin/grep.c:692
+#: builtin/grep.c:693
 msgid "synonym for --files-with-matches"
 msgstr "синоним для --files-with-matches"
 
-#: builtin/grep.c:695
+#: builtin/grep.c:696
 msgid "show only the names of files without match"
 msgstr "выводить только несовпадающие имена файлов"
 
-#: builtin/grep.c:697
+#: builtin/grep.c:698
 msgid "print NUL after filenames"
 msgstr "выводить двоичный НОЛЬ после списка имен файлов"
 
-#: builtin/grep.c:699
+#: builtin/grep.c:700
 msgid "show the number of matches instead of matching lines"
 msgstr "выводить количество совпадений, а не совпадающие строки"
 
-#: builtin/grep.c:700
+#: builtin/grep.c:701
 msgid "highlight matches"
 msgstr "подсвечивать совпадения"
 
-#: builtin/grep.c:702
+#: builtin/grep.c:703
 msgid "print empty line between matches from different files"
 msgstr "выводить пустую строку после совпадений из разных файлов"
 
-#: builtin/grep.c:704
+#: builtin/grep.c:705
 msgid "show filename only once above matches from same file"
 msgstr "выводить имя файла только раз на несколько совпадений в одном файле"
 
-#: builtin/grep.c:707
+#: builtin/grep.c:708
 msgid "show <n> context lines before and after matches"
 msgstr "показать <n> строк контекста перед и после совпадения"
 
-#: builtin/grep.c:710
+#: builtin/grep.c:711
 msgid "show <n> context lines before matches"
 msgstr "показать <n> строк контекста перед совпадением"
 
-#: builtin/grep.c:712
+#: builtin/grep.c:713
 msgid "show <n> context lines after matches"
 msgstr "показать <n> строк контекста после совпадения"
 
-#: builtin/grep.c:714
+#: builtin/grep.c:715
 msgid "use <n> worker threads"
 msgstr "использовать <кол> рабочих потоков"
 
-#: builtin/grep.c:715
+#: builtin/grep.c:716
 msgid "shortcut for -C NUM"
 msgstr "тоже, что и -C КОЛИЧЕСТВО"
 
-#: builtin/grep.c:718
+#: builtin/grep.c:719
 msgid "show a line with the function name before matches"
 msgstr "показать строку с именем функции перед совпадением"
 
-#: builtin/grep.c:720
+#: builtin/grep.c:721
 msgid "show the surrounding function"
 msgstr "показать окружающую функцию"
 
-#: builtin/grep.c:723
+#: builtin/grep.c:724
 msgid "read patterns from file"
 msgstr "прочитать шаблоны из файла"
 
-#: builtin/grep.c:725
+#: builtin/grep.c:726
 msgid "match <pattern>"
 msgstr "поиск соответствий с <шаблоном>"
 
-#: builtin/grep.c:727
+#: builtin/grep.c:728
 msgid "combine patterns specified with -e"
 msgstr "объединить шаблоны указанные с помощью -e"
 
-#: builtin/grep.c:739
+#: builtin/grep.c:740
 msgid "indicate hit with exit status without output"
 msgstr "ничего не выводить, указать на совпадение с помощью кода выхода"
 
-#: builtin/grep.c:741
+#: builtin/grep.c:742
 msgid "show only matches from files that match all patterns"
 msgstr "показать только совпадения из файлов в которых совпадают все шаблоны"
 
-#: builtin/grep.c:743
+#: builtin/grep.c:744
 msgid "show parse tree for grep expression"
 msgstr "показать дерево разбора для выражения поиска"
 
-#: builtin/grep.c:747
+#: builtin/grep.c:748
 msgid "pager"
 msgstr "пейджер"
 
-#: builtin/grep.c:747
+#: builtin/grep.c:748
 msgid "show matching files in the pager"
 msgstr "показать совпадающие файлы с помощью программы-пейджера"
 
-#: builtin/grep.c:750
+#: builtin/grep.c:751
 msgid "allow calling of grep(1) (ignored by this build)"
 msgstr "разрешить вызов grep(1) (игнорируется в этой сборке)"
 
-#: builtin/grep.c:813
+#: builtin/grep.c:814
 msgid "no pattern given."
 msgstr "не задан шаблон."
 
-#: builtin/grep.c:845 builtin/index-pack.c:1479
+#: builtin/grep.c:846 builtin/index-pack.c:1480
 #, c-format
 msgid "invalid number of threads specified (%d)"
 msgstr "указано неправильное количество потоков (%d)"
 
-#: builtin/grep.c:875
+#: builtin/grep.c:876
 msgid "--open-files-in-pager only works on the worktree"
 msgstr "--open-files-in-pager работает только в рабочем каталоге"
 
-#: builtin/grep.c:901
+#: builtin/grep.c:902
 msgid "--cached or --untracked cannot be used with --no-index."
 msgstr "--cached или --untracked нельзя использовать одновременно с --no-index."
 
-#: builtin/grep.c:906
+#: builtin/grep.c:907
 msgid "--no-index or --untracked cannot be used with revs."
 msgstr "--no-index или --untracked нельзя использовать одновременно с указанием редакции."
 
-#: builtin/grep.c:909
+#: builtin/grep.c:910
 msgid "--[no-]exclude-standard cannot be used for tracked contents."
 msgstr "--[no-]exclude-standard не может использоваться для отслеживаемого содержимого."
 
-#: builtin/grep.c:917
+#: builtin/grep.c:918
 msgid "both --cached and trees are given."
 msgstr "указано одновременно --cached и дерево."
 
@@ -6990,176 +7536,180 @@ msgstr "git hash-object [-t <тип>] [-w] [--path=<файл> | --no-filters] [-
 msgid "git hash-object  --stdin-paths"
 msgstr "git hash-object  --stdin-paths"
 
-#: builtin/hash-object.c:93
+#: builtin/hash-object.c:94
 msgid "type"
 msgstr "тип"
 
-#: builtin/hash-object.c:93
+#: builtin/hash-object.c:94
 msgid "object type"
 msgstr "тип объекта"
 
-#: builtin/hash-object.c:94
+#: builtin/hash-object.c:95
 msgid "write the object into the object database"
 msgstr "запись объекта в базу данных объектов"
 
-#: builtin/hash-object.c:96
+#: builtin/hash-object.c:97
 msgid "read the object from stdin"
 msgstr "прочитать объект из стандартного ввода"
 
-#: builtin/hash-object.c:98
+#: builtin/hash-object.c:99
 msgid "store file as is without filters"
 msgstr "сохранить файл без использования фильтров"
 
-#: builtin/hash-object.c:99
+#: builtin/hash-object.c:100
 msgid ""
 "just hash any random garbage to create corrupt objects for debugging Git"
 msgstr "хэшировать любой мусор и создавать поврежденные объекты для отладки Git"
 
-#: builtin/hash-object.c:100
+#: builtin/hash-object.c:101
 msgid "process file as it were from this path"
 msgstr "обработать файл так, будто он находится по указанному пути"
 
-#: builtin/help.c:41
+#: builtin/help.c:42
 msgid "print all available commands"
 msgstr "вывести список всех доступных команд"
 
-#: builtin/help.c:42
+#: builtin/help.c:43
+msgid "exclude guides"
+msgstr "исключить руководства"
+
+#: builtin/help.c:44
 msgid "print list of useful guides"
 msgstr "вывести список полезных руководств"
 
-#: builtin/help.c:43
+#: builtin/help.c:45
 msgid "show man page"
 msgstr "открыть руководство в формате man"
 
-#: builtin/help.c:44
+#: builtin/help.c:46
 msgid "show manual in web browser"
 msgstr "открыть руководство в веб-браузере"
 
-#: builtin/help.c:46
+#: builtin/help.c:48
 msgid "show info page"
 msgstr "открыть руководство в формате info"
 
-#: builtin/help.c:52
+#: builtin/help.c:54
 msgid "git help [--all] [--guides] [--man | --web | --info] [<command>]"
 msgstr "git help [--all] [--guides] [--man | --web | --info] [<команда>]"
 
-#: builtin/help.c:64
+#: builtin/help.c:66
 #, c-format
 msgid "unrecognized help format '%s'"
 msgstr "неопознанный формат руководства «%s»"
 
-#: builtin/help.c:91
+#: builtin/help.c:93
 msgid "Failed to start emacsclient."
 msgstr "Сбой при запуске emacsclient."
 
-#: builtin/help.c:104
+#: builtin/help.c:106
 msgid "Failed to parse emacsclient version."
 msgstr "Сбой при определении версии emacsclient."
 
-#: builtin/help.c:112
+#: builtin/help.c:114
 #, c-format
 msgid "emacsclient version '%d' too old (< 22)."
 msgstr "версия emacsclient «%d» слишком старая (< 22)."
 
-#: builtin/help.c:130 builtin/help.c:151 builtin/help.c:160 builtin/help.c:168
+#: builtin/help.c:132 builtin/help.c:153 builtin/help.c:162 builtin/help.c:170
 #, c-format
 msgid "failed to exec '%s'"
 msgstr "сбой при запуске «%s»"
 
-#: builtin/help.c:205
+#: builtin/help.c:207
 #, c-format
 msgid ""
 "'%s': path for unsupported man viewer.\n"
 "Please consider using 'man.<tool>.cmd' instead."
 msgstr "«%s»: путь для неподдерживаемой программы просмотра man.\nВместо этого используйте «man.<программа>.cmd»."
 
-#: builtin/help.c:217
+#: builtin/help.c:219
 #, c-format
 msgid ""
 "'%s': cmd for supported man viewer.\n"
 "Please consider using 'man.<tool>.path' instead."
 msgstr "«%s»: команда для неподдерживаемой программы просмотра man.\nВместо этого используйте «man.<программа>.path»."
 
-#: builtin/help.c:334
+#: builtin/help.c:336
 #, c-format
 msgid "'%s': unknown man viewer."
 msgstr "«%s»: неизвестная программа просмотра man."
 
-#: builtin/help.c:351
+#: builtin/help.c:353
 msgid "no man viewer handled the request"
 msgstr "программа просмотра man не обработала запрос"
 
-#: builtin/help.c:359
+#: builtin/help.c:361
 msgid "no info viewer handled the request"
 msgstr "программа просмотра info не обработала запрос"
 
-#: builtin/help.c:401
+#: builtin/help.c:403
 msgid "Defining attributes per path"
 msgstr "Определение атрибутов для путей файлов или каталогов"
 
-#: builtin/help.c:402
+#: builtin/help.c:404
 msgid "Everyday Git With 20 Commands Or So"
 msgstr "Повседневный Git с 20 командами или около того"
 
-#: builtin/help.c:403
+#: builtin/help.c:405
 msgid "A Git glossary"
 msgstr "Глоссарий Git"
 
-#: builtin/help.c:404
+#: builtin/help.c:406
 msgid "Specifies intentionally untracked files to ignore"
 msgstr "Указание специально игнорируемых файлов"
 
-#: builtin/help.c:405
+#: builtin/help.c:407
 msgid "Defining submodule properties"
 msgstr "Определение свойств подмодулей"
 
-#: builtin/help.c:406
+#: builtin/help.c:408
 msgid "Specifying revisions and ranges for Git"
 msgstr "Указание редакций и диапазонов для Git"
 
-#: builtin/help.c:407
+#: builtin/help.c:409
 msgid "A tutorial introduction to Git (for version 1.5.1 or newer)"
 msgstr "Учебное введение в Git (для версии 1.5.1 или новее)"
 
-#: builtin/help.c:408
+#: builtin/help.c:410
 msgid "An overview of recommended workflows with Git"
 msgstr "Обзор рекомендуемых последовательностей выполняемых действий с Git"
 
-#: builtin/help.c:420
+#: builtin/help.c:422
 msgid "The common Git guides are:\n"
 msgstr "Основные руководства Git:\n"
 
-#: builtin/help.c:441 builtin/help.c:458
-#, c-format
-msgid "usage: %s%s"
-msgstr "использование: %s%s"
-
-#: builtin/help.c:474
+#: builtin/help.c:440
 #, c-format
 msgid "`git %s' is aliased to `%s'"
 msgstr "«git %s» — это сокращение для «%s»"
 
-#: builtin/index-pack.c:153
+#: builtin/help.c:462 builtin/help.c:479
+#, c-format
+msgid "usage: %s%s"
+msgstr "использование: %s%s"
+
+#: builtin/index-pack.c:154
 #, c-format
 msgid "unable to open %s"
 msgstr "не удалось открыть %s"
 
-#: builtin/index-pack.c:203
+#: builtin/index-pack.c:204
 #, c-format
 msgid "object type mismatch at %s"
 msgstr "несоответствие типа объекта на %s"
 
-#: builtin/index-pack.c:223
+#: builtin/index-pack.c:224
 #, c-format
 msgid "did not receive expected object %s"
 msgstr "ожидаемый объект не получен на %s"
 
-#: builtin/index-pack.c:226
+#: builtin/index-pack.c:227
 #, c-format
 msgid "object %s: expected type %s, found %s"
 msgstr "объект %s: ожидаемый тип %s, получен %s"
 
-#: builtin/index-pack.c:268
+#: builtin/index-pack.c:269
 #, c-format
 msgid "cannot fill %d byte"
 msgid_plural "cannot fill %d bytes"
@@ -7168,69 +7718,73 @@ msgstr[1] "не удалось заполнить %d байта"
 msgstr[2] "не удалось заполнить %d байтов"
 msgstr[3] "не удалось заполнить %d байтов"
 
-#: builtin/index-pack.c:278
+#: builtin/index-pack.c:279
 msgid "early EOF"
 msgstr "неожиданный конец файла"
 
-#: builtin/index-pack.c:279
+#: builtin/index-pack.c:280
 msgid "read error on input"
 msgstr "ошибка чтения ввода"
 
-#: builtin/index-pack.c:291
+#: builtin/index-pack.c:292
 msgid "used more bytes than were available"
 msgstr "использовано больше байт, чем было доступно"
 
-#: builtin/index-pack.c:298
+#: builtin/index-pack.c:299
 msgid "pack too large for current definition of off_t"
 msgstr "пакет слишком большой для текущего определения off_t"
 
-#: builtin/index-pack.c:314
+#: builtin/index-pack.c:302 builtin/unpack-objects.c:92
+msgid "pack exceeds maximum allowed size"
+msgstr "размер пакета превышает максимальный допустимый"
+
+#: builtin/index-pack.c:317
 #, c-format
 msgid "unable to create '%s'"
 msgstr "не удалось создать «%s»"
 
-#: builtin/index-pack.c:319
+#: builtin/index-pack.c:322
 #, c-format
 msgid "cannot open packfile '%s'"
 msgstr "не удалось открыть файл пакета «%s»"
 
-#: builtin/index-pack.c:333
+#: builtin/index-pack.c:336
 msgid "pack signature mismatch"
 msgstr "несоответствие подписи пакета"
 
-#: builtin/index-pack.c:335
+#: builtin/index-pack.c:338
 #, c-format
 msgid "pack version %<PRIu32> unsupported"
 msgstr "версия пакета %<PRIu32> не поддерживается"
 
-#: builtin/index-pack.c:353
+#: builtin/index-pack.c:356
 #, c-format
 msgid "pack has bad object at offset %<PRIuMAX>: %s"
 msgstr "пакет содержит плохой объект по смещению %<PRIuMAX>: %s"
 
-#: builtin/index-pack.c:475
+#: builtin/index-pack.c:478
 #, c-format
 msgid "inflate returned %d"
 msgstr "программа сжатия вернула %d"
 
-#: builtin/index-pack.c:524
+#: builtin/index-pack.c:527
 msgid "offset value overflow for delta base object"
 msgstr "переполнение значения смещения у базового объекта дельты"
 
-#: builtin/index-pack.c:532
+#: builtin/index-pack.c:535
 msgid "delta base offset is out of bound"
 msgstr "смещение базовой дельты вышло за допустимые пределы"
 
-#: builtin/index-pack.c:540
+#: builtin/index-pack.c:543
 #, c-format
 msgid "unknown object type %d"
 msgstr "неизвестный тип объекта %d"
 
-#: builtin/index-pack.c:571
+#: builtin/index-pack.c:574
 msgid "cannot pread pack file"
 msgstr "не удалось выполнить pread для файла пакета"
 
-#: builtin/index-pack.c:573
+#: builtin/index-pack.c:576
 #, c-format
 msgid "premature end of pack file, %<PRIuMAX> byte missing"
 msgid_plural "premature end of pack file, %<PRIuMAX> bytes missing"
@@ -7239,88 +7793,88 @@ msgstr[1] "преждевременное окончание файла паке
 msgstr[2] "преждевременное окончание файла пакета, %<PRIuMAX> байтов отсутствует"
 msgstr[3] "преждевременное окончание файла пакета, %<PRIuMAX> байтов отсутствует"
 
-#: builtin/index-pack.c:599
+#: builtin/index-pack.c:602
 msgid "serious inflate inconsistency"
 msgstr "серьезное несоответствие при распаковке"
 
-#: builtin/index-pack.c:745 builtin/index-pack.c:751 builtin/index-pack.c:774
-#: builtin/index-pack.c:808 builtin/index-pack.c:817
+#: builtin/index-pack.c:748 builtin/index-pack.c:754 builtin/index-pack.c:777
+#: builtin/index-pack.c:811 builtin/index-pack.c:820
 #, c-format
 msgid "SHA1 COLLISION FOUND WITH %s !"
 msgstr "НАЙДЕНА КОЛЛИЗИЯ SHA1 С %s !"
 
-#: builtin/index-pack.c:748 builtin/pack-objects.c:164
-#: builtin/pack-objects.c:256
+#: builtin/index-pack.c:751 builtin/pack-objects.c:166
+#: builtin/pack-objects.c:258
 #, c-format
 msgid "unable to read %s"
 msgstr "не удалось прочитать %s"
 
-#: builtin/index-pack.c:814
+#: builtin/index-pack.c:817
 #, c-format
 msgid "cannot read existing object %s"
 msgstr "не удалось прочитать существующий объект %s"
 
-#: builtin/index-pack.c:828
+#: builtin/index-pack.c:831
 #, c-format
 msgid "invalid blob object %s"
 msgstr "неправильный файл двоичного объекта %s"
 
-#: builtin/index-pack.c:842
+#: builtin/index-pack.c:845
 #, c-format
 msgid "invalid %s"
 msgstr "неправильный %s"
 
-#: builtin/index-pack.c:845
+#: builtin/index-pack.c:848
 msgid "Error in object"
 msgstr "Ошибка в объекте"
 
-#: builtin/index-pack.c:847
+#: builtin/index-pack.c:850
 #, c-format
 msgid "Not all child objects of %s are reachable"
 msgstr "Не все дочерние объекты %s достижимы"
 
-#: builtin/index-pack.c:919 builtin/index-pack.c:950
+#: builtin/index-pack.c:922 builtin/index-pack.c:953
 msgid "failed to apply delta"
 msgstr "сбой при применении дельты"
 
-#: builtin/index-pack.c:1120
+#: builtin/index-pack.c:1123
 msgid "Receiving objects"
 msgstr "Получение объектов"
 
-#: builtin/index-pack.c:1120
+#: builtin/index-pack.c:1123
 msgid "Indexing objects"
 msgstr "Индексирование объектов"
 
-#: builtin/index-pack.c:1152
+#: builtin/index-pack.c:1155
 msgid "pack is corrupted (SHA1 mismatch)"
 msgstr "пакет поврежден (несоответствие SHA1)"
 
-#: builtin/index-pack.c:1157
+#: builtin/index-pack.c:1160
 msgid "cannot fstat packfile"
 msgstr "не удалось выполнить fstat для файла пакета"
 
-#: builtin/index-pack.c:1160
+#: builtin/index-pack.c:1163
 msgid "pack has junk at the end"
 msgstr "файл пакета содержит мусор в конце"
 
-#: builtin/index-pack.c:1171
+#: builtin/index-pack.c:1174
 msgid "confusion beyond insanity in parse_pack_objects()"
 msgstr "безумная путаница в parse_pack_objects()"
 
-#: builtin/index-pack.c:1196
+#: builtin/index-pack.c:1197
 msgid "Resolving deltas"
 msgstr "Определение изменений"
 
-#: builtin/index-pack.c:1207
+#: builtin/index-pack.c:1208
 #, c-format
 msgid "unable to create thread: %s"
 msgstr "не удалось создать поток: %s"
 
-#: builtin/index-pack.c:1249
+#: builtin/index-pack.c:1250
 msgid "confusion beyond insanity"
 msgstr "безумная путаница"
 
-#: builtin/index-pack.c:1255
+#: builtin/index-pack.c:1256
 #, c-format
 msgid "completed with %d local object"
 msgid_plural "completed with %d local objects"
@@ -7329,12 +7883,12 @@ msgstr[1] "завершено с %d локальными объектами"
 msgstr[2] "завершено с %d локальными объектами"
 msgstr[3] "завершено с %d локальными объектами"
 
-#: builtin/index-pack.c:1267
+#: builtin/index-pack.c:1268
 #, c-format
 msgid "Unexpected tail checksum for %s (disk corruption?)"
 msgstr "Неожиданная контрольная сумма в конце %s (диск поврежден?)"
 
-#: builtin/index-pack.c:1271
+#: builtin/index-pack.c:1272
 #, c-format
 msgid "pack has %d unresolved delta"
 msgid_plural "pack has %d unresolved deltas"
@@ -7343,44 +7897,44 @@ msgstr[1] "пакет содержит %d неразрешенные дельт
 msgstr[2] "пакет содержит %d неразрешенных дельт"
 msgstr[3] "пакет содержит %d неразрешенных дельт"
 
-#: builtin/index-pack.c:1295
+#: builtin/index-pack.c:1296
 #, c-format
 msgid "unable to deflate appended object (%d)"
 msgstr "нельзя сжать присоединенный объект (%d)"
 
-#: builtin/index-pack.c:1371
+#: builtin/index-pack.c:1372
 #, c-format
 msgid "local object %s is corrupt"
 msgstr "локальный объект %s поврежден"
 
-#: builtin/index-pack.c:1395
+#: builtin/index-pack.c:1396
 msgid "error while closing pack file"
 msgstr "ошибка при закрытии файла пакета"
 
-#: builtin/index-pack.c:1408
+#: builtin/index-pack.c:1409
 #, c-format
 msgid "cannot write keep file '%s'"
 msgstr "не удалось записать файл удержания «%s»"
 
-#: builtin/index-pack.c:1416
+#: builtin/index-pack.c:1417
 #, c-format
 msgid "cannot close written keep file '%s'"
 msgstr "не удалось закрыть записанный файл удержания «%s»"
 
-#: builtin/index-pack.c:1429
+#: builtin/index-pack.c:1430
 msgid "cannot store pack file"
 msgstr "не удалось сохранить файл пакета"
 
-#: builtin/index-pack.c:1440
+#: builtin/index-pack.c:1441
 msgid "cannot store index file"
 msgstr "не удалось сохранить файл индекса"
 
-#: builtin/index-pack.c:1473
+#: builtin/index-pack.c:1474
 #, c-format
 msgid "bad pack.indexversion=%<PRIu32>"
 msgstr "плохой pack.indexversion=%<PRIu32>"
 
-#: builtin/index-pack.c:1483 builtin/index-pack.c:1681
+#: builtin/index-pack.c:1484 builtin/index-pack.c:1681
 #, c-format
 msgid "no threads support, ignoring %s"
 msgstr "нет поддержки потоков, игнорирование %s"
@@ -7424,126 +7978,126 @@ msgstr "имя пакета «%s» не оканчивается на «.pack»"
 msgid "bad %s"
 msgstr "плохой %s"
 
-#: builtin/index-pack.c:1730
+#: builtin/index-pack.c:1732
 msgid "--fix-thin cannot be used without --stdin"
 msgstr "--fix-thin нельзя использовать без --stdin"
 
-#: builtin/index-pack.c:1738
+#: builtin/index-pack.c:1740
 msgid "--verify with no packfile name given"
 msgstr "--verify без указания имени файла пакета"
 
-#: builtin/init-db.c:55
+#: builtin/init-db.c:54
 #, c-format
 msgid "cannot stat '%s'"
 msgstr "не удалось выполнить stat для «%s»"
 
-#: builtin/init-db.c:61
+#: builtin/init-db.c:60
 #, c-format
 msgid "cannot stat template '%s'"
 msgstr "не удалось выполнить stat для шаблона «%s»"
 
-#: builtin/init-db.c:66
+#: builtin/init-db.c:65
 #, c-format
 msgid "cannot opendir '%s'"
 msgstr "не удалось выполнить opendir для «%s»"
 
-#: builtin/init-db.c:77
+#: builtin/init-db.c:76
 #, c-format
 msgid "cannot readlink '%s'"
 msgstr "не удалось выполнить readlink для «%s»"
 
-#: builtin/init-db.c:79
+#: builtin/init-db.c:78
 #, c-format
 msgid "cannot symlink '%s' '%s'"
 msgstr "не удалось создать символьную ссылку «%s» на «%s»"
 
-#: builtin/init-db.c:85
+#: builtin/init-db.c:84
 #, c-format
 msgid "cannot copy '%s' to '%s'"
 msgstr "не удалось скопировать файл «%s» в «%s»"
 
-#: builtin/init-db.c:89
+#: builtin/init-db.c:88
 #, c-format
 msgid "ignoring template %s"
 msgstr "игнорирование шаблона %s"
 
-#: builtin/init-db.c:120
+#: builtin/init-db.c:119
 #, c-format
 msgid "templates not found %s"
 msgstr "шаблоны не найдены %s"
 
-#: builtin/init-db.c:135
+#: builtin/init-db.c:134
 #, c-format
 msgid "not copying templates from '%s': %s"
 msgstr "не копирую шаблоны из «%s»: %s"
 
-#: builtin/init-db.c:312 builtin/init-db.c:315
-#, c-format
-msgid "%s already exists"
-msgstr "%s уже существует"
-
-#: builtin/init-db.c:344
+#: builtin/init-db.c:327
 #, c-format
 msgid "unable to handle file type %d"
 msgstr "не удается обработать файл типа %d"
 
-#: builtin/init-db.c:347
+#: builtin/init-db.c:330
 #, c-format
 msgid "unable to move %s to %s"
 msgstr "не удается переместить файл %s в %s"
 
-#: builtin/init-db.c:402
+#: builtin/init-db.c:347 builtin/init-db.c:350
+#, c-format
+msgid "%s already exists"
+msgstr "%s уже существует"
+
+#: builtin/init-db.c:403
 #, c-format
 msgid "Reinitialized existing shared Git repository in %s%s\n"
 msgstr "Переинициализирован существующий общий репозиторий Git в %s%s\n"
 
-#: builtin/init-db.c:403
+#: builtin/init-db.c:404
 #, c-format
 msgid "Reinitialized existing Git repository in %s%s\n"
 msgstr "Переинициализирован существующий репозиторий Git в %s%s\n"
 
-#: builtin/init-db.c:407
+#: builtin/init-db.c:408
 #, c-format
 msgid "Initialized empty shared Git repository in %s%s\n"
 msgstr "Инициализирован пустой общий репозиторий Git в %s%s\n"
 
-#: builtin/init-db.c:408
+#: builtin/init-db.c:409
 #, c-format
 msgid "Initialized empty Git repository in %s%s\n"
 msgstr "Инициализирован пустой репозиторий Git в %s%s\n"
 
-#: builtin/init-db.c:455
+#: builtin/init-db.c:457
 msgid ""
 "git init [-q | --quiet] [--bare] [--template=<template-directory>] "
 "[--shared[=<permissions>]] [<directory>]"
 msgstr "git init [-q | --quiet] [--bare] [--template=<каталог-шаблонов>] [--shared[=<права-доступа>]] [<каталог>]"
 
-#: builtin/init-db.c:478
+#: builtin/init-db.c:480
 msgid "permissions"
 msgstr "права-доступа"
 
-#: builtin/init-db.c:479
+#: builtin/init-db.c:481
 msgid "specify that the git repository is to be shared amongst several users"
 msgstr "укажите, если репозиторий git будет использоваться несколькими пользователями"
 
-#: builtin/init-db.c:513 builtin/init-db.c:518
+#: builtin/init-db.c:515 builtin/init-db.c:520
 #, c-format
 msgid "cannot mkdir %s"
 msgstr "не удалось выполнить mkdir %s"
 
-#: builtin/init-db.c:522
+#: builtin/init-db.c:524
 #, c-format
 msgid "cannot chdir to %s"
 msgstr "не удалось выполнить chdir в %s"
 
-#: builtin/init-db.c:543
+#: builtin/init-db.c:545
 #, c-format
 msgid ""
 "%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-"
 "dir=<directory>)"
 msgstr "%s (или --work-tree=<каталог>) нельзя использовать без указания %s (или --git-dir=<каталог>)"
 
-#: builtin/init-db.c:571
+#: builtin/init-db.c:573
 #, c-format
 msgid "Cannot access work tree '%s'"
 msgstr "Не удалось получить доступ к рабочему каталогу «%s»"
@@ -7652,345 +8206,350 @@ msgstr "Не является диапазоном."
 msgid "Cover letter needs email format"
 msgstr "Сопроводительное письмо должно быть в формате электронной почты"
 
-#: builtin/log.c:1064
+#: builtin/log.c:1063
 #, c-format
 msgid "insane in-reply-to: %s"
 msgstr "ошибка в поле in-reply-to: %s"
 
-#: builtin/log.c:1092
+#: builtin/log.c:1091
 msgid "git format-patch [<options>] [<since> | <revision-range>]"
 msgstr "git format-patch [<опции>] [<начиная-с> | <диапазон-редакций>]"
 
-#: builtin/log.c:1137
+#: builtin/log.c:1141
 msgid "Two output directories?"
 msgstr "Два выходных каталога?"
 
-#: builtin/log.c:1244 builtin/log.c:1883 builtin/log.c:1885 builtin/log.c:1897
+#: builtin/log.c:1248 builtin/log.c:1891 builtin/log.c:1893 builtin/log.c:1905
 #, c-format
 msgid "Unknown commit %s"
 msgstr "Неизвестный коммит %s"
 
-#: builtin/log.c:1254 builtin/notes.c:254 builtin/notes.c:305
-#: builtin/notes.c:307 builtin/notes.c:370 builtin/notes.c:425
-#: builtin/notes.c:511 builtin/notes.c:516 builtin/notes.c:594
-#: builtin/notes.c:657 builtin/notes.c:882 builtin/tag.c:455
+#: builtin/log.c:1258 builtin/notes.c:884 builtin/tag.c:455
 #, c-format
 msgid "Failed to resolve '%s' as a valid ref."
 msgstr "Не удалось разрешить «%s» как ссылку."
 
-#: builtin/log.c:1259
+#: builtin/log.c:1263
 msgid "Could not find exact merge base."
 msgstr "Не удалось найти точную базу слияния."
 
-#: builtin/log.c:1263
+#: builtin/log.c:1267
 msgid ""
 "Failed to get upstream, if you want to record base commit automatically,\n"
 "please use git branch --set-upstream-to to track a remote branch.\n"
 "Or you could specify base commit by --base=<base-commit-id> manually."
 msgstr "Не удалось получить вышестоящую ветку. Если вы хотите записать базовый коммит автомитически, то используйте git branch --set-upstream-to для отслеживания внешней ветки.\nИли же вы можете указать базовый коммит указанием --base=<идентификатор-базового-коммита> вручную."
 
-#: builtin/log.c:1283
+#: builtin/log.c:1287
 msgid "Failed to find exact merge base"
 msgstr "Не удалось найти точную базу слияния"
 
-#: builtin/log.c:1294
+#: builtin/log.c:1298
 msgid "base commit should be the ancestor of revision list"
 msgstr "базовый коммит должен быть предком списка редакций"
 
-#: builtin/log.c:1298
+#: builtin/log.c:1302
 msgid "base commit shouldn't be in revision list"
 msgstr "базовый коммит не должен быть в списке редакций"
 
-#: builtin/log.c:1347
+#: builtin/log.c:1351
 msgid "cannot get patch id"
 msgstr "не удалось получить идентификатор патча"
 
-#: builtin/log.c:1404
+#: builtin/log.c:1408
 msgid "use [PATCH n/m] even with a single patch"
 msgstr "выводить [PATCH n/m] даже когда один патч"
 
-#: builtin/log.c:1407
+#: builtin/log.c:1411
 msgid "use [PATCH] even with multiple patches"
 msgstr "выводить [PATCH] даже когда несколько патчей"
 
-#: builtin/log.c:1411
+#: builtin/log.c:1415
 msgid "print patches to standard out"
 msgstr "выводить патчи на стандартный вывод"
 
-#: builtin/log.c:1413
+#: builtin/log.c:1417
 msgid "generate a cover letter"
 msgstr "генерировать сопроводительное письмо"
 
-#: builtin/log.c:1415
+#: builtin/log.c:1419
 msgid "use simple number sequence for output file names"
 msgstr "использовать простую последовательность чисел для имен выходных файлов"
 
-#: builtin/log.c:1416
+#: builtin/log.c:1420
 msgid "sfx"
 msgstr "суффикс"
 
-#: builtin/log.c:1417
+#: builtin/log.c:1421
 msgid "use <sfx> instead of '.patch'"
 msgstr "использовать суффикс <суффикс> вместо «.patch»"
 
-#: builtin/log.c:1419
+#: builtin/log.c:1423
 msgid "start numbering patches at <n> instead of 1"
 msgstr "начать нумерацию патчей с <n>, а не с 1"
 
-#: builtin/log.c:1421
+#: builtin/log.c:1425
 msgid "mark the series as Nth re-roll"
 msgstr "пометить серию как энную попытку"
 
-#: builtin/log.c:1423
+#: builtin/log.c:1427
+msgid "Use [RFC PATCH] instead of [PATCH]"
+msgstr "Использовать [RFC PATCH] вместо [PATCH]"
+
+#: builtin/log.c:1430
 msgid "Use [<prefix>] instead of [PATCH]"
 msgstr "Использовать [<префикс>] вместо [PATCH]"
 
-#: builtin/log.c:1426
+#: builtin/log.c:1433
 msgid "store resulting files in <dir>"
 msgstr "сохранить результирующие файлы в <каталог>"
 
-#: builtin/log.c:1429
+#: builtin/log.c:1436
 msgid "don't strip/add [PATCH]"
 msgstr "не обрезать/добавлять [PATCH]"
 
-#: builtin/log.c:1432
+#: builtin/log.c:1439
 msgid "don't output binary diffs"
 msgstr "не выводить двоичные различия"
 
-#: builtin/log.c:1434
+#: builtin/log.c:1441
 msgid "output all-zero hash in From header"
 msgstr "выводить нулевую хэш-сумму в заголовке From"
 
-#: builtin/log.c:1436
+#: builtin/log.c:1443
 msgid "don't include a patch matching a commit upstream"
 msgstr "не включать патч, если коммит уже есть в вышестоящей ветке"
 
-#: builtin/log.c:1438
+#: builtin/log.c:1445
 msgid "show patch format instead of default (patch + stat)"
 msgstr "выводить в формате патча, а не в стандартном (патч + статистика)"
 
-#: builtin/log.c:1440
+#: builtin/log.c:1447
 msgid "Messaging"
 msgstr "Передача сообщений"
 
-#: builtin/log.c:1441
+#: builtin/log.c:1448
 msgid "header"
 msgstr "заголовок"
 
-#: builtin/log.c:1442
+#: builtin/log.c:1449
 msgid "add email header"
 msgstr "добавить заголовок сообщения"
 
-#: builtin/log.c:1443 builtin/log.c:1445
+#: builtin/log.c:1450 builtin/log.c:1452
 msgid "email"
 msgstr "почта"
 
-#: builtin/log.c:1443
+#: builtin/log.c:1450
 msgid "add To: header"
 msgstr "добавить заголовок To:"
 
-#: builtin/log.c:1445
+#: builtin/log.c:1452
 msgid "add Cc: header"
 msgstr "добавить заголовок Cc:"
 
-#: builtin/log.c:1447
+#: builtin/log.c:1454
 msgid "ident"
 msgstr "идентификатор"
 
-#: builtin/log.c:1448
+#: builtin/log.c:1455
 msgid "set From address to <ident> (or committer ident if absent)"
 msgstr "установить адрес отправителя на <идентификатор> (или на идентификатор коммитера, если отсутствует)"
 
-#: builtin/log.c:1450
+#: builtin/log.c:1457
 msgid "message-id"
 msgstr "идентификатор-сообщения"
 
-#: builtin/log.c:1451
+#: builtin/log.c:1458
 msgid "make first mail a reply to <message-id>"
 msgstr "сделать первое письмо ответом на <идентификатор-сообщения>"
 
-#: builtin/log.c:1452 builtin/log.c:1455
+#: builtin/log.c:1459 builtin/log.c:1462
 msgid "boundary"
 msgstr "вложение"
 
-#: builtin/log.c:1453
+#: builtin/log.c:1460
 msgid "attach the patch"
 msgstr "приложить патч"
 
-#: builtin/log.c:1456
+#: builtin/log.c:1463
 msgid "inline the patch"
 msgstr "включить патч в текст письма"
 
-#: builtin/log.c:1460
+#: builtin/log.c:1467
 msgid "enable message threading, styles: shallow, deep"
 msgstr "включить в письмах иерархичность, стили: shallow (частичную), deep (глубокую)"
 
-#: builtin/log.c:1462
+#: builtin/log.c:1469
 msgid "signature"
 msgstr "подпись"
 
-#: builtin/log.c:1463
+#: builtin/log.c:1470
 msgid "add a signature"
 msgstr "добавить подпись"
 
-#: builtin/log.c:1464
+#: builtin/log.c:1471
 msgid "base-commit"
 msgstr "базовый коммит"
 
-#: builtin/log.c:1465
+#: builtin/log.c:1472
 msgid "add prerequisite tree info to the patch series"
 msgstr "добавить информацию о требовании дерева к серии патчей"
 
-#: builtin/log.c:1467
+#: builtin/log.c:1474
 msgid "add a signature from a file"
 msgstr "добавить подпись из файла"
 
-#: builtin/log.c:1468
+#: builtin/log.c:1475
 msgid "don't print the patch filenames"
 msgstr "не выводить имена файлов патчей"
 
-#: builtin/log.c:1558
+#: builtin/log.c:1565
 msgid "-n and -k are mutually exclusive."
 msgstr "-n и -k нельзя использовать одновременно"
 
-#: builtin/log.c:1560
-msgid "--subject-prefix and -k are mutually exclusive."
-msgstr "--subject-prefix и -k нельзя использовать одновременно."
+#: builtin/log.c:1567
+msgid "--subject-prefix/--rfc and -k are mutually exclusive."
+msgstr "--subject-prefix/--rfc и -k нельзя использовать одновременно."
 
-#: builtin/log.c:1568
+#: builtin/log.c:1575
 msgid "--name-only does not make sense"
 msgstr "--name-only не имеет смысла"
 
-#: builtin/log.c:1570
+#: builtin/log.c:1577
 msgid "--name-status does not make sense"
 msgstr "--name-status не имеет смысла"
 
-#: builtin/log.c:1572
+#: builtin/log.c:1579
 msgid "--check does not make sense"
 msgstr "--check не имеет смысла"
 
-#: builtin/log.c:1602
+#: builtin/log.c:1609
 msgid "standard output, or directory, which one?"
 msgstr "стандартный вывод или каталог?"
 
-#: builtin/log.c:1604
+#: builtin/log.c:1611
 #, c-format
 msgid "Could not create directory '%s'"
 msgstr "Не удалось создать каталог «%s»"
 
-#: builtin/log.c:1698
+#: builtin/log.c:1705
 #, c-format
 msgid "unable to read signature file '%s'"
 msgstr "не удалось прочитать файл подписи «%s»"
 
-#: builtin/log.c:1769
+#: builtin/log.c:1777
 msgid "Failed to create output files"
 msgstr "Сбой при создании выходных файлов"
 
-#: builtin/log.c:1818
+#: builtin/log.c:1826
 msgid "git cherry [-v] [<upstream> [<head> [<limit>]]]"
 msgstr "git cherry [-v] [<вышестоящая-ветка> [<голова> [<ограничение>]]]"
 
-#: builtin/log.c:1872
+#: builtin/log.c:1880
 #, c-format
 msgid ""
 "Could not find a tracked remote branch, please specify <upstream> "
 "manually.\n"
 msgstr "Не удалось найти отслеживаемую внешнюю ветку, укажите <вышестоящую-ветку> вручную.\n"
 
-#: builtin/ls-files.c:379
+#: builtin/ls-files.c:458
 msgid "git ls-files [<options>] [<file>...]"
 msgstr "git ls-files [<опции>] [<файл>…]"
 
-#: builtin/ls-files.c:428
+#: builtin/ls-files.c:507
 msgid "identify the file status with tags"
 msgstr "выводить имена файлов с метками"
 
-#: builtin/ls-files.c:430
+#: builtin/ls-files.c:509
 msgid "use lowercase letters for 'assume unchanged' files"
 msgstr "использовать символы в нижнем регистре для «предположительно без изменений» файлов"
 
-#: builtin/ls-files.c:432
+#: builtin/ls-files.c:511
 msgid "show cached files in the output (default)"
 msgstr "показывать кэшированные файлы при выводе (по умолчанию)"
 
-#: builtin/ls-files.c:434
+#: builtin/ls-files.c:513
 msgid "show deleted files in the output"
 msgstr "показывать удаленные файлы при выводе"
 
-#: builtin/ls-files.c:436
+#: builtin/ls-files.c:515
 msgid "show modified files in the output"
 msgstr "показывать измененные файлы при выводе"
 
-#: builtin/ls-files.c:438
+#: builtin/ls-files.c:517
 msgid "show other files in the output"
 msgstr "показывать другие файлы при выводе"
 
-#: builtin/ls-files.c:440
+#: builtin/ls-files.c:519
 msgid "show ignored files in the output"
 msgstr "показывать игнорируемые файлы при выводе"
 
-#: builtin/ls-files.c:443
+#: builtin/ls-files.c:522
 msgid "show staged contents' object name in the output"
 msgstr "показывать имя индексированного объекта на выводе"
 
-#: builtin/ls-files.c:445
+#: builtin/ls-files.c:524
 msgid "show files on the filesystem that need to be removed"
 msgstr "показывать файлы в файловой системе, которые должны быть удалены"
 
-#: builtin/ls-files.c:447
+#: builtin/ls-files.c:526
 msgid "show 'other' directories' names only"
 msgstr "показывать только имена у «других» каталогов"
 
-#: builtin/ls-files.c:449
+#: builtin/ls-files.c:528
 msgid "show line endings of files"
 msgstr "показать концы строк файлов"
 
-#: builtin/ls-files.c:451
+#: builtin/ls-files.c:530
 msgid "don't show empty directories"
 msgstr "не показывать пустые каталоги"
 
-#: builtin/ls-files.c:454
+#: builtin/ls-files.c:533
 msgid "show unmerged files in the output"
 msgstr "показывать не слитые файлы на выводе"
 
-#: builtin/ls-files.c:456
+#: builtin/ls-files.c:535
 msgid "show resolve-undo information"
 msgstr "показывать информации о разрешении конфликтов и отмене"
 
-#: builtin/ls-files.c:458
+#: builtin/ls-files.c:537
 msgid "skip files matching pattern"
 msgstr "пропустить файлы, соответствующие шаблону"
 
-#: builtin/ls-files.c:461
+#: builtin/ls-files.c:540
 msgid "exclude patterns are read from <file>"
 msgstr "прочитать шаблоны исключения из <файл>"
 
-#: builtin/ls-files.c:464
+#: builtin/ls-files.c:543
 msgid "read additional per-directory exclude patterns in <file>"
 msgstr "прочитать дополнительные покаталожные шаблоны исключения из <файл>"
 
-#: builtin/ls-files.c:466
+#: builtin/ls-files.c:545
 msgid "add the standard git exclusions"
 msgstr "добавить стандартные исключения git"
 
-#: builtin/ls-files.c:469
+#: builtin/ls-files.c:548
 msgid "make the output relative to the project top directory"
 msgstr "выводить пути относительно корневого каталога проекта"
 
-#: builtin/ls-files.c:472
+#: builtin/ls-files.c:551
+msgid "recurse through submodules"
+msgstr "рекурсивно по подмодулям"
+
+#: builtin/ls-files.c:553
 msgid "if any <file> is not in the index, treat this as an error"
 msgstr "если какой-либо <файл> не в индексе, считать это ошибкой"
 
-#: builtin/ls-files.c:473
+#: builtin/ls-files.c:554
 msgid "tree-ish"
 msgstr "указатель-дерева"
 
-#: builtin/ls-files.c:474
+#: builtin/ls-files.c:555
 msgid "pretend that paths removed since <tree-ish> are still present"
 msgstr "притвориться, что пути удалены, т.к. <указатель-дерева> еще существует"
 
-#: builtin/ls-files.c:476
+#: builtin/ls-files.c:557
 msgid "show debugging data"
 msgstr "показать отладочную информацию"
 
@@ -8104,31 +8663,31 @@ msgstr "Доступные стратегии:"
 msgid "Available custom strategies are:"
 msgstr "Доступные пользовательские стратегии:"
 
-#: builtin/merge.c:195 builtin/pull.c:126
+#: builtin/merge.c:195 builtin/pull.c:127
 msgid "do not show a diffstat at the end of the merge"
 msgstr "не выводить статистику изменений после окончания слияния"
 
-#: builtin/merge.c:198 builtin/pull.c:129
+#: builtin/merge.c:198 builtin/pull.c:130
 msgid "show a diffstat at the end of the merge"
 msgstr "вывести статистику изменений после окончания слияния"
 
-#: builtin/merge.c:199 builtin/pull.c:132
+#: builtin/merge.c:199 builtin/pull.c:133
 msgid "(synonym to --stat)"
 msgstr "(синоним для --stat)"
 
-#: builtin/merge.c:201 builtin/pull.c:135
+#: builtin/merge.c:201 builtin/pull.c:136
 msgid "add (at most <n>) entries from shortlog to merge commit message"
 msgstr "добавить (максимум <n>) записей из короткого журнала в сообщение коммита у слияния"
 
-#: builtin/merge.c:204 builtin/pull.c:138
+#: builtin/merge.c:204 builtin/pull.c:139
 msgid "create a single commit instead of doing a merge"
 msgstr "создать один коммит, вместо выполнения слияния"
 
-#: builtin/merge.c:206 builtin/pull.c:141
+#: builtin/merge.c:206 builtin/pull.c:142
 msgid "perform a commit if the merge succeeds (default)"
 msgstr "сделать коммит, если слияние прошло успешно (по умолчанию)"
 
-#: builtin/merge.c:208 builtin/pull.c:144
+#: builtin/merge.c:208 builtin/pull.c:145
 msgid "edit message before committing"
 msgstr "отредактировать сообщение перед выполнением коммита"
 
@@ -8136,28 +8695,28 @@ msgstr "отредактировать сообщение перед выпол
 msgid "allow fast-forward (default)"
 msgstr "разрешить перемотку вперед (по умолчанию)"
 
-#: builtin/merge.c:211 builtin/pull.c:150
+#: builtin/merge.c:211 builtin/pull.c:151
 msgid "abort if fast-forward is not possible"
 msgstr "отменить выполнение слияния, если перемотка вперед невозможна"
 
-#: builtin/merge.c:215 builtin/pull.c:153
+#: builtin/merge.c:215 builtin/pull.c:154
 msgid "verify that the named commit has a valid GPG signature"
 msgstr "проверить, что указанный коммит имеет верную электронную подпись GPG"
 
-#: builtin/merge.c:216 builtin/notes.c:772 builtin/pull.c:157
+#: builtin/merge.c:216 builtin/notes.c:774 builtin/pull.c:158
 #: builtin/revert.c:89
 msgid "strategy"
 msgstr "стратегия"
 
-#: builtin/merge.c:217 builtin/pull.c:158
+#: builtin/merge.c:217 builtin/pull.c:159
 msgid "merge strategy to use"
 msgstr "используемая стратегия слияния"
 
-#: builtin/merge.c:218 builtin/pull.c:161
+#: builtin/merge.c:218 builtin/pull.c:162
 msgid "option=value"
 msgstr "опция=значение"
 
-#: builtin/merge.c:219 builtin/pull.c:162
+#: builtin/merge.c:219 builtin/pull.c:163
 msgid "option for selected merge strategy"
 msgstr "опции для выбранной стратегии слияния"
 
@@ -8169,7 +8728,7 @@ msgstr "сообщение коммита для слияния (для слия
 msgid "abort the current in-progress merge"
 msgstr "отменить выполнение происходящего слияния"
 
-#: builtin/merge.c:227 builtin/pull.c:169
+#: builtin/merge.c:227 builtin/pull.c:170
 msgid "allow merging unrelated histories"
 msgstr "разрешить слияние несвязанных историй изменений"
 
@@ -8376,55 +8935,55 @@ msgstr "отказ слияния несвязанных историй изме
 msgid "Already up-to-date."
 msgstr "Уже обновлено."
 
-#: builtin/merge.c:1382
+#: builtin/merge.c:1377
 #, c-format
 msgid "Updating %s..%s\n"
 msgstr "Обновление %s..%s\n"
 
-#: builtin/merge.c:1419
+#: builtin/merge.c:1418
 #, c-format
 msgid "Trying really trivial in-index merge...\n"
 msgstr "Попытка тривиального слияния в индексе…\n"
 
-#: builtin/merge.c:1426
+#: builtin/merge.c:1425
 #, c-format
 msgid "Nope.\n"
 msgstr "Не вышло.\n"
 
-#: builtin/merge.c:1451
+#: builtin/merge.c:1450
 msgid "Already up-to-date. Yeeah!"
 msgstr "Уже обновлено. Круто!"
 
-#: builtin/merge.c:1457
+#: builtin/merge.c:1456
 msgid "Not possible to fast-forward, aborting."
 msgstr "Перемотка вперед невозможна, отмена."
 
-#: builtin/merge.c:1480 builtin/merge.c:1559
+#: builtin/merge.c:1479 builtin/merge.c:1558
 #, c-format
 msgid "Rewinding the tree to pristine...\n"
 msgstr "Перемотка дерева к исходному состоянию…\n"
 
-#: builtin/merge.c:1484
+#: builtin/merge.c:1483
 #, c-format
 msgid "Trying merge strategy %s...\n"
 msgstr "Попытка слияния с помощью стратегии %s…\n"
 
-#: builtin/merge.c:1550
+#: builtin/merge.c:1549
 #, c-format
 msgid "No merge strategy handled the merge.\n"
 msgstr "Ни одна стратегия слияния не обработала слияние.\n"
 
-#: builtin/merge.c:1552
+#: builtin/merge.c:1551
 #, c-format
 msgid "Merge with strategy %s failed.\n"
 msgstr "Сбой при слиянии с помощью стратегии %s.\n"
 
-#: builtin/merge.c:1561
+#: builtin/merge.c:1560
 #, c-format
 msgid "Using the %s to prepare resolving by hand.\n"
 msgstr "Использую %s для подготовки ручного разрешения конфликтов.\n"
 
-#: builtin/merge.c:1573
+#: builtin/merge.c:1572
 #, c-format
 msgid "Automatic merge went well; stopped before committing as requested\n"
 msgstr "Автоматическое слияние прошло успешно; как и запрашивали, остановлено перед выполнением коммита\n"
@@ -8449,23 +9008,23 @@ msgstr "git merge-base --is-ancestor <коммит> <коммит>"
 msgid "git merge-base --fork-point <ref> [<commit>]"
 msgstr "git merge-base --fork-point <ссылка> [<коммит>]"
 
-#: builtin/merge-base.c:214
+#: builtin/merge-base.c:217
 msgid "output all common ancestors"
 msgstr "вывести всех общих предков"
 
-#: builtin/merge-base.c:216
+#: builtin/merge-base.c:219
 msgid "find ancestors for a single n-way merge"
 msgstr "вывести предков для одного многоходового слияния"
 
-#: builtin/merge-base.c:218
+#: builtin/merge-base.c:221
 msgid "list revs not reachable from others"
 msgstr "вывести список редаций, которые не достижимы из друг друга"
 
-#: builtin/merge-base.c:220
+#: builtin/merge-base.c:223
 msgid "is the first one ancestor of the other?"
 msgstr "является первым предком второго указанного коммита?"
 
-#: builtin/merge-base.c:222
+#: builtin/merge-base.c:225
 msgid "find where <commit> forked from reflog of <ref>"
 msgstr "найти журнале ссылок <ссылка> где именно <коммит> разветвился"
 
@@ -8507,6 +9066,39 @@ msgstr "не предупреждать о конфликтах"
 msgid "set labels for file1/orig-file/file2"
 msgstr "установить метки для файл1/ориг-файл/файл2"
 
+#: builtin/merge-recursive.c:45
+#, c-format
+msgid "unknown option %s"
+msgstr "неизвестная опция %s"
+
+#: builtin/merge-recursive.c:51
+#, c-format
+msgid "could not parse object '%s'"
+msgstr "не удалось разобрать объект «%s»"
+
+#: builtin/merge-recursive.c:55
+#, c-format
+msgid "cannot handle more than %d base. Ignoring %s."
+msgid_plural "cannot handle more than %d bases. Ignoring %s."
+msgstr[0] "невозможно обработать больше %d базы. Игнорирую %s."
+msgstr[1] "невозможно обработать больше %d баз. Игнорирую %s."
+msgstr[2] "невозможно обработать больше %d баз. Игнорирую %s."
+msgstr[3] "невозможно обработать больше %d базы. Игнорирую %s."
+
+#: builtin/merge-recursive.c:63
+msgid "not handling anything other than two heads merge."
+msgstr "не обрабатываю ничего, кроме слияния двух указателей на ветки."
+
+#: builtin/merge-recursive.c:69 builtin/merge-recursive.c:71
+#, c-format
+msgid "could not resolve ref '%s'"
+msgstr "не удалось распознать ссылку «%s»"
+
+#: builtin/merge-recursive.c:77
+#, c-format
+msgid "Merging %s with %s\n"
+msgstr "Слияние %s и %s\n"
+
 #: builtin/mktree.c:65
 msgid "git mktree [-z] [--missing] [--batch]"
 msgstr "git mktree [-z] [--missing] [--batch]"
@@ -8615,43 +9207,43 @@ msgstr "Переименование %s в %s\n"
 msgid "renaming '%s' failed"
 msgstr "сбой при переименовании «%s»"
 
-#: builtin/name-rev.c:258
+#: builtin/name-rev.c:257
 msgid "git name-rev [<options>] <commit>..."
 msgstr "git name-rev [<опции>] <коммит>…"
 
-#: builtin/name-rev.c:259
+#: builtin/name-rev.c:258
 msgid "git name-rev [<options>] --all"
 msgstr "git name-rev [<опции>] --all"
 
-#: builtin/name-rev.c:260
+#: builtin/name-rev.c:259
 msgid "git name-rev [<options>] --stdin"
 msgstr "git name-rev [<опции>] --stdin"
 
-#: builtin/name-rev.c:312
+#: builtin/name-rev.c:311
 msgid "print only names (no SHA-1)"
 msgstr "выводить только имена (без SHA-1)"
 
-#: builtin/name-rev.c:313
+#: builtin/name-rev.c:312
 msgid "only use tags to name the commits"
 msgstr "использовать только метки для именования коммитов"
 
-#: builtin/name-rev.c:315
+#: builtin/name-rev.c:314
 msgid "only use refs matching <pattern>"
 msgstr "использовать только ссылки, соответствующие <шаблону> "
 
-#: builtin/name-rev.c:317
+#: builtin/name-rev.c:316
 msgid "list all commits reachable from all refs"
 msgstr "вывести список всех коммитов, достижимых со всех ссылок"
 
-#: builtin/name-rev.c:318
+#: builtin/name-rev.c:317
 msgid "read from stdin"
 msgstr "прочитать из стандартного ввода"
 
-#: builtin/name-rev.c:319
+#: builtin/name-rev.c:318
 msgid "allow to print `undefined` names (default)"
 msgstr "разрешить вывод «undefined», если не найдено (по умолчанию)"
 
-#: builtin/name-rev.c:325
+#: builtin/name-rev.c:324
 msgid "dereference tags in the input (internal use)"
 msgstr "разыменовывать введенные метки (для внутреннего использования)"
 
@@ -8779,8 +9371,8 @@ msgid "failed to finish 'show' for object '%s'"
 msgstr "не удалось завершить «show» для объекта «%s»"
 
 #: builtin/notes.c:194
-msgid "Please supply the note contents using either -m or -F option"
-msgstr "Ð\9fожалуйста, укажите содержимое заметки, используя опцию -m или -F"
+msgid "please supply the note contents using either -m or -F option"
+msgstr "пожалуйста, укажите содержимое заметки, используя опцию -m или -F"
 
 #: builtin/notes.c:203
 msgid "unable to write note object"
@@ -8788,8 +9380,8 @@ msgstr "не удалось записать объект заметки"
 
 #: builtin/notes.c:205
 #, c-format
-msgid "The note contents have been left in %s"
-msgstr "Содержимое заметки осталось в %s"
+msgid "the note contents have been left in %s"
+msgstr "содержимое заметки осталось в %s"
 
 #: builtin/notes.c:233 builtin/tag.c:439
 #, c-format
@@ -8801,158 +9393,214 @@ msgstr "не удалось прочитать «%s»"
 msgid "could not open or read '%s'"
 msgstr "не удалось открыть или прочитать «%s»"
 
+#: builtin/notes.c:254 builtin/notes.c:305 builtin/notes.c:307
+#: builtin/notes.c:372 builtin/notes.c:427 builtin/notes.c:513
+#: builtin/notes.c:518 builtin/notes.c:596 builtin/notes.c:659
+#, c-format
+msgid "failed to resolve '%s' as a valid ref."
+msgstr "не удалось разрешить «%s» как ссылку."
+
 #: builtin/notes.c:257
 #, c-format
-msgid "Failed to read object '%s'."
-msgstr "Ð\9dе удалось прочитать объект «%s»."
+msgid "failed to read object '%s'."
+msgstr "не удалось прочитать объект «%s»."
 
 #: builtin/notes.c:261
 #, c-format
-msgid "Cannot read note data from non-blob object '%s'."
-msgstr "Не удалось прочитать данные заметки из недвоичного объекта «%s»."
+msgid "cannot read note data from non-blob object '%s'."
+msgstr "не удалось прочитать данные заметки из недвоичного объекта «%s»."
+
+#: builtin/notes.c:301
+#, c-format
+msgid "malformed input line: '%s'."
+msgstr "неправильная введенная строка: «%s»."
+
+#: builtin/notes.c:316
+#, c-format
+msgid "failed to copy notes from '%s' to '%s'"
+msgstr "не удалось скопировать заметку из «%s» в «%s»"
+
+#. TRANSLATORS: the first %s will be replaced by a
+#. git notes command: 'add', 'merge', 'remove', etc.
+#: builtin/notes.c:345
+#, c-format
+msgid "refusing to %s notes in %s (outside of refs/notes/)"
+msgstr "отказ в перезаписи %s заметок в %s (за пределами refs/notes/)"
 
-#: builtin/notes.c:363 builtin/notes.c:418 builtin/notes.c:494
-#: builtin/notes.c:506 builtin/notes.c:582 builtin/notes.c:650
-#: builtin/notes.c:800 builtin/notes.c:947 builtin/notes.c:968
+#: builtin/notes.c:365 builtin/notes.c:420 builtin/notes.c:496
+#: builtin/notes.c:508 builtin/notes.c:584 builtin/notes.c:652
+#: builtin/notes.c:802 builtin/notes.c:949 builtin/notes.c:970
 msgid "too many parameters"
 msgstr "передано слишком много параметров"
 
-#: builtin/notes.c:376 builtin/notes.c:663
+#: builtin/notes.c:378 builtin/notes.c:665
 #, c-format
-msgid "No note found for object %s."
-msgstr "Ð\9dе найдена заметка для объекта %s."
+msgid "no note found for object %s."
+msgstr "не найдена заметка для объекта %s."
 
-#: builtin/notes.c:397 builtin/notes.c:560
+#: builtin/notes.c:399 builtin/notes.c:562
 msgid "note contents as a string"
 msgstr "текстовое содержимое заметки"
 
-#: builtin/notes.c:400 builtin/notes.c:563
+#: builtin/notes.c:402 builtin/notes.c:565
 msgid "note contents in a file"
 msgstr "содержимое заметки в файле"
 
-#: builtin/notes.c:403 builtin/notes.c:566
+#: builtin/notes.c:405 builtin/notes.c:568
 msgid "reuse and edit specified note object"
 msgstr "использовать и отредактировать указанный объект заметки"
 
-#: builtin/notes.c:406 builtin/notes.c:569
+#: builtin/notes.c:408 builtin/notes.c:571
 msgid "reuse specified note object"
 msgstr "использовать указанный объект заметки"
 
-#: builtin/notes.c:409 builtin/notes.c:572
+#: builtin/notes.c:411 builtin/notes.c:574
 msgid "allow storing empty note"
 msgstr "разрешить сохранение пустой заметки"
 
-#: builtin/notes.c:410 builtin/notes.c:481
+#: builtin/notes.c:412 builtin/notes.c:483
 msgid "replace existing notes"
 msgstr "заменить существующие заметки"
 
-#: builtin/notes.c:435
+#: builtin/notes.c:437
 #, c-format
 msgid ""
 "Cannot add notes. Found existing notes for object %s. Use '-f' to overwrite "
 "existing notes"
 msgstr "Не удалось добавить заметку. Найдена существующая заметка у объекта %s. Используйте параметр «-f» для перезаписи существующих заметок."
 
-#: builtin/notes.c:450 builtin/notes.c:529
+#: builtin/notes.c:452 builtin/notes.c:531
 #, c-format
 msgid "Overwriting existing notes for object %s\n"
 msgstr "Перезапись существующих заметок у объекта %s\n"
 
-#: builtin/notes.c:461 builtin/notes.c:622 builtin/notes.c:887
+#: builtin/notes.c:463 builtin/notes.c:624 builtin/notes.c:889
 #, c-format
 msgid "Removing note for object %s\n"
 msgstr "Удаление заметки у объекта %s\n"
 
-#: builtin/notes.c:482
+#: builtin/notes.c:484
 msgid "read objects from stdin"
 msgstr "прочитать объекты из стандартного ввода"
 
-#: builtin/notes.c:484
+#: builtin/notes.c:486
 msgid "load rewriting config for <command> (implies --stdin)"
 msgstr "загрузить настройки перезаписи для команды <команда> (включает в себя --stdin)"
 
-#: builtin/notes.c:502
+#: builtin/notes.c:504
 msgid "too few parameters"
 msgstr "передано слишком мало параметров"
 
-#: builtin/notes.c:523
+#: builtin/notes.c:525
 #, c-format
 msgid ""
 "Cannot copy notes. Found existing notes for object %s. Use '-f' to overwrite"
 " existing notes"
 msgstr "Не удалось скопировать заметку. Найдена существующая заметка у объекта %s. Используйте параметр «-f» для перезаписи существующих заметок."
 
-#: builtin/notes.c:535
+#: builtin/notes.c:537
 #, c-format
-msgid "Missing notes on source object %s. Cannot copy."
-msgstr "Ð\9dет заметок у исходного объекта %s. Нельзя скопировать."
+msgid "missing notes on source object %s. Cannot copy."
+msgstr "нет заметок у исходного объекта %s. Нельзя скопировать."
 
-#: builtin/notes.c:587
+#: builtin/notes.c:589
 #, c-format
 msgid ""
 "The -m/-F/-c/-C options have been deprecated for the 'edit' subcommand.\n"
 "Please use 'git notes add -f -m/-F/-c/-C' instead.\n"
 msgstr "Опции -m/-F/-c/-C для подкоманды «edit» устарели.\nИспользуйте вместо них «git notes add -f -m/-F/-c/-C».\n"
 
-#: builtin/notes.c:753
+#: builtin/notes.c:685
+msgid "failed to delete ref NOTES_MERGE_PARTIAL"
+msgstr "не удалось удалить ссылку NOTES_MERGE_PARTIAL"
+
+#: builtin/notes.c:687
+msgid "failed to delete ref NOTES_MERGE_REF"
+msgstr "не удалось удалить ссылку NOTES_MERGE_REF"
+
+#: builtin/notes.c:689
+msgid "failed to remove 'git notes merge' worktree"
+msgstr "не удалось удалить рабочий каталог «git notes merge»"
+
+#: builtin/notes.c:709
+msgid "failed to read ref NOTES_MERGE_PARTIAL"
+msgstr "не удалось прочитать ссылку NOTES_MERGE_PARTIAL"
+
+#: builtin/notes.c:711
+msgid "could not find commit from NOTES_MERGE_PARTIAL."
+msgstr "не удалось найти коммит из NOTES_MERGE_PARTIAL."
+
+#: builtin/notes.c:713
+msgid "could not parse commit from NOTES_MERGE_PARTIAL."
+msgstr "не удалось разобрать коммит из NOTES_MERGE_PARTIAL."
+
+#: builtin/notes.c:726
+msgid "failed to resolve NOTES_MERGE_REF"
+msgstr "не удалось разрешить NOTES_MERGE_REF"
+
+#: builtin/notes.c:729
+msgid "failed to finalize notes merge"
+msgstr "не удалось завершить слиние заметок"
+
+#: builtin/notes.c:755
 #, c-format
 msgid "unknown notes merge strategy %s"
 msgstr "неизвестная стратегия слияния заметок %s"
 
-#: builtin/notes.c:769
+#: builtin/notes.c:771
 msgid "General options"
 msgstr "Общие опции"
 
-#: builtin/notes.c:771
+#: builtin/notes.c:773
 msgid "Merge options"
 msgstr "Опции слияния"
 
-#: builtin/notes.c:773
+#: builtin/notes.c:775
 msgid ""
 "resolve notes conflicts using the given strategy "
 "(manual/ours/theirs/union/cat_sort_uniq)"
 msgstr "разрешить конфликты заметок с помощью указанной стратегии (manual/ours/theirs/union/cat_sort_uniq)"
 
-#: builtin/notes.c:775
+#: builtin/notes.c:777
 msgid "Committing unmerged notes"
 msgstr "Коммит не слитых заметок"
 
-#: builtin/notes.c:777
+#: builtin/notes.c:779
 msgid "finalize notes merge by committing unmerged notes"
 msgstr "завершить слияние заметок коммитом не слитых заметок"
 
-#: builtin/notes.c:779
+#: builtin/notes.c:781
 msgid "Aborting notes merge resolution"
 msgstr "Отмена разрешения слияния заметок"
 
-#: builtin/notes.c:781
+#: builtin/notes.c:783
 msgid "abort notes merge"
 msgstr "отменить слияние заметок"
 
-#: builtin/notes.c:792
+#: builtin/notes.c:794
 msgid "cannot mix --commit, --abort or -s/--strategy"
 msgstr "нельзя использовать одновременно --commit, --abort и -s/--strategy"
 
-#: builtin/notes.c:797
-msgid "Must specify a notes ref to merge"
-msgstr "Ð\92ы должны указать ссылку заметки для слияния"
+#: builtin/notes.c:799
+msgid "must specify a notes ref to merge"
+msgstr "вы должны указать ссылку заметки для слияния"
 
-#: builtin/notes.c:821
+#: builtin/notes.c:823
 #, c-format
-msgid "Unknown -s/--strategy: %s"
-msgstr "Ð\9dеизвестный параметр для -s/--strategy: %s"
+msgid "unknown -s/--strategy: %s"
+msgstr "неизвестный параметр для -s/--strategy: %s"
 
-#: builtin/notes.c:858
+#: builtin/notes.c:860
 #, c-format
-msgid "A notes merge into %s is already in-progress at %s"
-msgstr "Слияние заметок в %s уже выполняется на %s"
+msgid "a notes merge into %s is already in-progress at %s"
+msgstr "слияние заметок в %s уже выполняется на %s"
 
-#: builtin/notes.c:861
+#: builtin/notes.c:863
 #, c-format
-msgid "Failed to store link to current notes ref (%s)"
-msgstr "Ð\9dе удалось сохранить адрес текущей ссылки на заметку (%s)"
+msgid "failed to store link to current notes ref (%s)"
+msgstr "не удалось сохранить адрес текущей ссылки на заметку (%s)"
 
-#: builtin/notes.c:863
+#: builtin/notes.c:865
 #, c-format
 msgid ""
 "Automatic notes merge failed. Fix conflicts in %s and commit the result with"
@@ -8960,222 +9608,218 @@ msgid ""
 "--abort'.\n"
 msgstr "Не удалось автоматически слить заметки. Исправьте конфликты в %s и закоммитьте результат с помощью «git notes merge --commit», или прервите процесс слияния с помощью «git notes merge --abort».\n"
 
-#: builtin/notes.c:885
+#: builtin/notes.c:887
 #, c-format
 msgid "Object %s has no note\n"
 msgstr "У объекта %s нет заметки\n"
 
-#: builtin/notes.c:897
+#: builtin/notes.c:899
 msgid "attempt to remove non-existent note is not an error"
 msgstr "попытка удаления несуществующей заметки не является ошибкой"
 
-#: builtin/notes.c:900
+#: builtin/notes.c:902
 msgid "read object names from the standard input"
 msgstr "прочитать имена объектов из стандартного ввода"
 
-#: builtin/notes.c:938 builtin/prune.c:105 builtin/worktree.c:127
+#: builtin/notes.c:940 builtin/prune.c:105 builtin/worktree.c:127
 msgid "do not remove, show only"
 msgstr "не удалять, только показать список"
 
-#: builtin/notes.c:939
+#: builtin/notes.c:941
 msgid "report pruned notes"
 msgstr "вывести список удаленных заметок"
 
-#: builtin/notes.c:981
+#: builtin/notes.c:983
 msgid "notes-ref"
 msgstr "ссылка-на-заметку"
 
-#: builtin/notes.c:982
+#: builtin/notes.c:984
 msgid "use notes from <notes-ref>"
 msgstr "использовать заметку из <ссылка-на-заметку>"
 
-#: builtin/notes.c:1017 builtin/remote.c:1623
+#: builtin/notes.c:1019
 #, c-format
-msgid "Unknown subcommand: %s"
-msgstr "Ð\9dеизвестная подкоманда: %s"
+msgid "unknown subcommand: %s"
+msgstr "неизвестная подкоманда: %s"
 
-#: builtin/pack-objects.c:28
+#: builtin/pack-objects.c:29
 msgid ""
 "git pack-objects --stdout [<options>...] [< <ref-list> | < <object-list>]"
 msgstr "git pack-objects --stdout [<опции>…] [< <список-ссылок> | < <список-объектов>]"
 
-#: builtin/pack-objects.c:29
+#: builtin/pack-objects.c:30
 msgid ""
 "git pack-objects [<options>...] <base-name> [< <ref-list> | < <object-list>]"
 msgstr "git pack-objects [<опции>…] <имя-базы> [< <список-ссылок> | < <список-объектов>]"
 
-#: builtin/pack-objects.c:177 builtin/pack-objects.c:180
+#: builtin/pack-objects.c:179 builtin/pack-objects.c:182
 #, c-format
 msgid "deflate error (%d)"
 msgstr "ошибка сжатия (%d)"
 
-#: builtin/pack-objects.c:766
+#: builtin/pack-objects.c:768
 msgid "disabling bitmap writing, packs are split due to pack.packSizeLimit"
 msgstr "отключение записи битовых карт, так как карты были разбиты на части из-за pack.packSizeLimit"
 
-#: builtin/pack-objects.c:779
+#: builtin/pack-objects.c:781
 msgid "Writing objects"
 msgstr "Запись объектов"
 
-#: builtin/pack-objects.c:1037
+#: builtin/pack-objects.c:1070
 msgid "disabling bitmap writing, as some objects are not being packed"
 msgstr "отключение записи битовых карт, так как некоторые объекты не были упакованы"
 
-#: builtin/pack-objects.c:2197
+#: builtin/pack-objects.c:2346
 msgid "Compressing objects"
 msgstr "Сжатие объектов"
 
-#: builtin/pack-objects.c:2611
+#: builtin/pack-objects.c:2759
 #, c-format
 msgid "unsupported index version %s"
 msgstr "неподдерживаемая версия индекса %s"
 
-#: builtin/pack-objects.c:2615
+#: builtin/pack-objects.c:2763
 #, c-format
 msgid "bad index version '%s'"
 msgstr "плохая версия индекса «%s»"
 
-#: builtin/pack-objects.c:2645
+#: builtin/pack-objects.c:2793
 msgid "do not show progress meter"
 msgstr "не выводить прогресс выполнения"
 
-#: builtin/pack-objects.c:2647
+#: builtin/pack-objects.c:2795
 msgid "show progress meter"
 msgstr "показать прогресс выполнения"
 
-#: builtin/pack-objects.c:2649
+#: builtin/pack-objects.c:2797
 msgid "show progress meter during object writing phase"
 msgstr "показать прогресс выполнения во время записи объектов"
 
-#: builtin/pack-objects.c:2652
+#: builtin/pack-objects.c:2800
 msgid "similar to --all-progress when progress meter is shown"
 msgstr "похоже на --all-progress при включенном прогрессе выполнения"
 
-#: builtin/pack-objects.c:2653
+#: builtin/pack-objects.c:2801
 msgid "version[,offset]"
 msgstr "версия[,смещение]"
 
-#: builtin/pack-objects.c:2654
+#: builtin/pack-objects.c:2802
 msgid "write the pack index file in the specified idx format version"
 msgstr "записать файл индекса пакета в указанной версии формата"
 
-#: builtin/pack-objects.c:2657
+#: builtin/pack-objects.c:2805
 msgid "maximum size of each output pack file"
 msgstr "максимальный размер каждого выходного файла пакета"
 
-#: builtin/pack-objects.c:2659
+#: builtin/pack-objects.c:2807
 msgid "ignore borrowed objects from alternate object store"
 msgstr "игнорировать чужие объекты, взятые из альтернативного хранилища объектов"
 
-#: builtin/pack-objects.c:2661
+#: builtin/pack-objects.c:2809
 msgid "ignore packed objects"
 msgstr "игнорировать упакованные объекты"
 
-#: builtin/pack-objects.c:2663
+#: builtin/pack-objects.c:2811
 msgid "limit pack window by objects"
 msgstr "ограничить окно пакета по количеству объектов"
 
-#: builtin/pack-objects.c:2665
+#: builtin/pack-objects.c:2813
 msgid "limit pack window by memory in addition to object limit"
 msgstr "дополнительно к количеству объектов ограничить окно пакета по памяти"
 
-#: builtin/pack-objects.c:2667
+#: builtin/pack-objects.c:2815
 msgid "maximum length of delta chain allowed in the resulting pack"
 msgstr "максимальная разрешенная длина цепочки дельт в результирующем пакете"
 
-#: builtin/pack-objects.c:2669
+#: builtin/pack-objects.c:2817
 msgid "reuse existing deltas"
 msgstr "использовать повторно существующие дельты"
 
-#: builtin/pack-objects.c:2671
+#: builtin/pack-objects.c:2819
 msgid "reuse existing objects"
 msgstr "использовать повторно существующие объекты"
 
-#: builtin/pack-objects.c:2673
+#: builtin/pack-objects.c:2821
 msgid "use OFS_DELTA objects"
 msgstr "использовать объекты OFS_DELTA"
 
-#: builtin/pack-objects.c:2675
+#: builtin/pack-objects.c:2823
 msgid "use threads when searching for best delta matches"
 msgstr "использовать многопоточность при поиске лучших совпадений дельт"
 
-#: builtin/pack-objects.c:2677
+#: builtin/pack-objects.c:2825
 msgid "do not create an empty pack output"
 msgstr "не создавать пустые выходные пакеты"
 
-#: builtin/pack-objects.c:2679
+#: builtin/pack-objects.c:2827
 msgid "read revision arguments from standard input"
 msgstr "прочитать аргументы редакций из стандартного ввода"
 
-#: builtin/pack-objects.c:2681
+#: builtin/pack-objects.c:2829
 msgid "limit the objects to those that are not yet packed"
 msgstr "ограничиться объектами, которые еще не упакованы"
 
-#: builtin/pack-objects.c:2684
+#: builtin/pack-objects.c:2832
 msgid "include objects reachable from any reference"
 msgstr "включить объекты, которые достижимы по любой из ссылок"
 
-#: builtin/pack-objects.c:2687
+#: builtin/pack-objects.c:2835
 msgid "include objects referred by reflog entries"
 msgstr "включить объекты, на которые ссылаются записи журнала ссылок"
 
-#: builtin/pack-objects.c:2690
+#: builtin/pack-objects.c:2838
 msgid "include objects referred to by the index"
 msgstr "включить объекты, на которые ссылается индекс"
 
-#: builtin/pack-objects.c:2693
+#: builtin/pack-objects.c:2841
 msgid "output pack to stdout"
 msgstr "вывести пакет на  стандартный вывод"
 
-#: builtin/pack-objects.c:2695
+#: builtin/pack-objects.c:2843
 msgid "include tag objects that refer to objects to be packed"
 msgstr "включить объекты меток, которые ссылаются на упаковываемые объекты"
 
-#: builtin/pack-objects.c:2697
+#: builtin/pack-objects.c:2845
 msgid "keep unreachable objects"
 msgstr "сохранять ссылки на недоступные объекты"
 
-#: builtin/pack-objects.c:2699
+#: builtin/pack-objects.c:2847
 msgid "pack loose unreachable objects"
 msgstr "паковать недостижимые объекты"
 
-#: builtin/pack-objects.c:2700 parse-options.h:142
-msgid "time"
-msgstr "время"
-
-#: builtin/pack-objects.c:2701
+#: builtin/pack-objects.c:2849
 msgid "unpack unreachable objects newer than <time>"
 msgstr "распаковать недоступные объекты, которые новее, чем <время>"
 
-#: builtin/pack-objects.c:2704
+#: builtin/pack-objects.c:2852
 msgid "create thin packs"
 msgstr "создавать тонкие пакеты"
 
-#: builtin/pack-objects.c:2706
+#: builtin/pack-objects.c:2854
 msgid "create packs suitable for shallow fetches"
 msgstr "создавать пакеты, подходящие для частичных извлечений"
 
-#: builtin/pack-objects.c:2708
+#: builtin/pack-objects.c:2856
 msgid "ignore packs that have companion .keep file"
 msgstr "игнорировать пакеты, рядом с которыми лежит .keep файл"
 
-#: builtin/pack-objects.c:2710
+#: builtin/pack-objects.c:2858
 msgid "pack compression level"
 msgstr "уровень сжатия пакета"
 
-#: builtin/pack-objects.c:2712
+#: builtin/pack-objects.c:2860
 msgid "do not hide commits by grafts"
 msgstr "не скрывать коммиты сращениями"
 
-#: builtin/pack-objects.c:2714
+#: builtin/pack-objects.c:2862
 msgid "use a bitmap index if available to speed up counting objects"
 msgstr "по возможности использовать индекс в битовых картах, для ускорения подсчета объектов"
 
-#: builtin/pack-objects.c:2716
+#: builtin/pack-objects.c:2864
 msgid "write a bitmap index together with the pack index"
 msgstr "запись индекса в битовых картах вместе с индексом пакета"
 
-#: builtin/pack-objects.c:2829
+#: builtin/pack-objects.c:2993
 msgid "Counting objects"
 msgstr "Подсчет объектов"
 
@@ -9215,69 +9859,62 @@ msgstr "удалить объекты старее чем <дата-оконча
 msgid "cannot prune in a precious-objects repo"
 msgstr "нельзя почистить неиспользуемые объекты в precious-objects репозитории"
 
-#: builtin/pull.c:72
+#: builtin/pull.c:51 builtin/pull.c:53
+#, c-format
+msgid "Invalid value for %s: %s"
+msgstr "Неправильное значение %s: %s"
+
+#: builtin/pull.c:73
 msgid "git pull [<options>] [<repository> [<refspec>...]]"
 msgstr "git pull [<опции>] [<репозиторий> [<спецификация-ссылки>…]]"
 
-#: builtin/pull.c:120
+#: builtin/pull.c:121
 msgid "Options related to merging"
 msgstr "Опции, связанные со слиянием"
 
-#: builtin/pull.c:123
+#: builtin/pull.c:124
 msgid "incorporate changes by rebasing rather than merging"
 msgstr "забрать изменения с помощью перебазирования, а не слияния"
 
-#: builtin/pull.c:147 builtin/revert.c:101
+#: builtin/pull.c:148 builtin/revert.c:101
 msgid "allow fast-forward"
 msgstr "разрешить перемотку вперед"
 
-#: builtin/pull.c:156
+#: builtin/pull.c:157
 msgid "automatically stash/stash pop before and after rebase"
 msgstr "автоматически выполнять stash/stash pop до и после перемещения"
 
-#: builtin/pull.c:172
+#: builtin/pull.c:173
 msgid "Options related to fetching"
 msgstr "Опции, связанные с извлечением изменений"
 
-#: builtin/pull.c:194
+#: builtin/pull.c:195
 msgid "number of submodules pulled in parallel"
 msgstr "количество подмодулей, которые будут получены парралельно"
 
-#: builtin/pull.c:283
+#: builtin/pull.c:284
 #, c-format
 msgid "Invalid value for pull.ff: %s"
 msgstr "Неправильное значение для pull.ff: %s"
 
-#: builtin/pull.c:379 git-sh-setup.sh:226
-msgid "Cannot pull with rebase: You have unstaged changes."
-msgstr "Не удалось получить с перемещением: У вас есть непроиндексированные изменения."
-
-#: builtin/pull.c:385 git-sh-setup.sh:252
-msgid "Additionally, your index contains uncommitted changes."
-msgstr "К тому же, в вашем индексе есть незакоммиченные изменения."
-
-#: builtin/pull.c:387 git-sh-setup.sh:245
-msgid "Cannot pull with rebase: Your index contains uncommitted changes."
-msgstr "Не удалось получить с перемещением: В вашем индексе есть незакоммиченные изменения."
-
-#: builtin/pull.c:463
+#: builtin/pull.c:397
 msgid ""
 "There is no candidate for rebasing against among the refs that you just "
 "fetched."
 msgstr "Нет претендентов для перемещения среди ссылок, которые вы только что получили."
 
-#: builtin/pull.c:465
+#: builtin/pull.c:399
 msgid ""
 "There are no candidates for merging among the refs that you just fetched."
 msgstr "Нет претендентов для слияния среди ссылок, которые вы только что получили."
 
-#: builtin/pull.c:466
+#: builtin/pull.c:400
 msgid ""
 "Generally this means that you provided a wildcard refspec which had no\n"
 "matches on the remote end."
 msgstr "Обычно это означает, что вы передали спецификацию ссылки с помощью шаблона и этот шаблон ни с чем не совпал на внешнем репозитории."
 
-#: builtin/pull.c:469
+#: builtin/pull.c:403
 #, c-format
 msgid ""
 "You asked to pull from the remote '%s', but did not specify\n"
@@ -9285,61 +9922,69 @@ msgid ""
 "for your current branch, you must specify a branch on the command line."
 msgstr "Вы попросили получить изменения со внешнего репозитория «%s», но не указали ветку. Так как это не репозиторий по умолчанию для  вашей текущей ветки, вы должны указать ветку в командной строке."
 
-#: builtin/pull.c:474 git-parse-remote.sh:73
+#: builtin/pull.c:408 git-parse-remote.sh:73
 msgid "You are not currently on a branch."
 msgstr "Вы сейчас ни на одной из веток."
 
-#: builtin/pull.c:476 builtin/pull.c:491 git-parse-remote.sh:79
+#: builtin/pull.c:410 builtin/pull.c:425 git-parse-remote.sh:79
 msgid "Please specify which branch you want to rebase against."
 msgstr "Пожалуйста, укажите на какую ветку вы хотите переместить изменения."
 
-#: builtin/pull.c:478 builtin/pull.c:493 git-parse-remote.sh:82
+#: builtin/pull.c:412 builtin/pull.c:427 git-parse-remote.sh:82
 msgid "Please specify which branch you want to merge with."
 msgstr "Пожалуйста, укажите с какой веткой вы хотите слить изменения."
 
-#: builtin/pull.c:479 builtin/pull.c:494
+#: builtin/pull.c:413 builtin/pull.c:428
 msgid "See git-pull(1) for details."
 msgstr "Для дополнительной информации, смотрите git-pull(1)."
 
-#: builtin/pull.c:481 builtin/pull.c:487 builtin/pull.c:496
+#: builtin/pull.c:415 builtin/pull.c:421 builtin/pull.c:430
 #: git-parse-remote.sh:64
 msgid "<remote>"
 msgstr "<внешний-репозиторий>"
 
-#: builtin/pull.c:481 builtin/pull.c:496 builtin/pull.c:501 git-rebase.sh:451
+#: builtin/pull.c:415 builtin/pull.c:430 builtin/pull.c:435 git-rebase.sh:451
 #: git-parse-remote.sh:65
 msgid "<branch>"
 msgstr "<ветка>"
 
-#: builtin/pull.c:489 git-parse-remote.sh:75
+#: builtin/pull.c:423 git-parse-remote.sh:75
 msgid "There is no tracking information for the current branch."
 msgstr "У текущей ветки нет информации об отслеживании."
 
-#: builtin/pull.c:498 git-parse-remote.sh:95
+#: builtin/pull.c:432 git-parse-remote.sh:95
 msgid ""
 "If you wish to set tracking information for this branch you can do so with:"
 msgstr "Если вы хотите указать информацию о отслеживаемой ветке, выполните:"
 
-#: builtin/pull.c:503
+#: builtin/pull.c:437
 #, c-format
 msgid ""
 "Your configuration specifies to merge with the ref '%s'\n"
 "from the remote, but no such ref was fetched."
 msgstr "Ваша конфигурация указывает, что нужно слить изменения со ссылкой\n«%s» из внешнего репозитория, но такая ссылка не была получена."
 
-#: builtin/pull.c:820
+#: builtin/pull.c:754
 msgid "ignoring --verify-signatures for rebase"
 msgstr "игнорирование --verify-signatures при перемещении"
 
-#: builtin/pull.c:867
+#: builtin/pull.c:801
 msgid "--[no-]autostash option is only valid with --rebase."
 msgstr "--[no-]autostash можно использовать только вместе с --rebase."
 
-#: builtin/pull.c:875
+#: builtin/pull.c:809
 msgid "Updating an unborn branch with changes added to the index."
 msgstr "Обновление еще не начавшейся ветки с изменениями, добавленными в индекс."
 
-#: builtin/pull.c:903
+#: builtin/pull.c:812
+msgid "pull with rebase"
+msgstr "получение с перемещением"
+
+#: builtin/pull.c:813
+msgid "please commit or stash them."
+msgstr "сделайте коммит или спрячьте их."
+
+#: builtin/pull.c:838
 #, c-format
 msgid ""
 "fetch updated the current branch head.\n"
@@ -9347,7 +9992,7 @@ msgid ""
 "commit %s."
 msgstr "извлечение обновило указатель на вашу текущую ветку.\nперемотка вашего рабочего каталога\nс коммита %s."
 
-#: builtin/pull.c:908
+#: builtin/pull.c:843
 #, c-format
 msgid ""
 "Cannot fast-forward your working tree.\n"
@@ -9358,11 +10003,11 @@ msgid ""
 "to recover."
 msgstr "Не удалось перемотать вперёд изменения в вашем рабочем каталоге.\nПосле того, как вы убедитесь, что вы сохранили всё необходимое из вывода\n$ git diff %s\n, запустите\n$ git reset --hard\nдля восстановления исходного состояния."
 
-#: builtin/pull.c:923
+#: builtin/pull.c:858
 msgid "Cannot merge multiple branches into empty head."
 msgstr "Нельзя слить несколько веток в пустой указатель на ветку."
 
-#: builtin/pull.c:927
+#: builtin/pull.c:862
 msgid "Cannot rebase onto multiple branches."
 msgstr "Невозможно переместить над несколькими ветками."
 
@@ -9679,15 +10324,44 @@ msgstr "пропустить применение фильтра частичн
 msgid "debug unpack-trees"
 msgstr "отладка unpack-trees"
 
-#: builtin/receive-pack.c:25
+#: builtin/receive-pack.c:26
 msgid "git receive-pack <git-dir>"
 msgstr "git receive-pack <каталог-git>"
 
-#: builtin/receive-pack.c:1843
+#: builtin/receive-pack.c:793
+msgid ""
+"By default, updating the current branch in a non-bare repository\n"
+"is denied, because it will make the index and work tree inconsistent\n"
+"with what you pushed, and will require 'git reset --hard' to match\n"
+"the work tree to HEAD.\n"
+"\n"
+"You can set 'receive.denyCurrentBranch' configuration variable to\n"
+"'ignore' or 'warn' in the remote repository to allow pushing into\n"
+"its current branch; however, this is not recommended unless you\n"
+"arranged to update its work tree to match what you pushed in some\n"
+"other way.\n"
+"\n"
+"To squelch this message and still keep the default behaviour, set\n"
+"'receive.denyCurrentBranch' configuration variable to 'refuse'."
+msgstr "По умолчанию, обновлять текущую ветку в репозитории с рабочей\nкопией (не голом) запрещено, так как это сделает состояние индекса\nи рабочего каталога противоречивым, и вам прийдется выполнить\n«git reset --hard», чтобы состояние рабочего каталога снова\nсоответствовало HEAD.\n\nВы можете установить значение опции «receive.denyCurrentBranch»\nв «ignore» или «warn» во внешнем репозитории, чтобы разрешить\nотправку в его текущую ветку; но это не рекомендуется, если только\nвы не намерены обновить его рабочий каталог способом подобным\nвышеописанному.\n\nЧтобы пропустить это сообщение и все равно оставить поведение\nпо умолчанию, установите значение опции «receive.denyCurrentBranch»\nв «refuse»."
+
+#: builtin/receive-pack.c:813
+msgid ""
+"By default, deleting the current branch is denied, because the next\n"
+"'git clone' won't result in any file checked out, causing confusion.\n"
+"\n"
+"You can set 'receive.denyDeleteCurrent' configuration variable to\n"
+"'warn' or 'ignore' in the remote repository to allow deleting the\n"
+"current branch, with or without a warning message.\n"
+"\n"
+"To squelch this message, you can set it to 'refuse'."
+msgstr "По умолчанию, удаление текущей ветки запрещено, так как последующий\n«git clone» не сможет получить никаких файлов, что приведет к путанице.\n\nВы можете установить значение опции «receive.denyDeleteCurrent»\nв «warn» или «ignore», во внешнем репозитории,  чтобы разрешить\nудаление текущей ветки с или без предупреждающего сообщения.\n\nЧтобы пропустить это сообщение, вы можете установить значение опции\nв «refuse»."
+
+#: builtin/receive-pack.c:1883
 msgid "quiet"
 msgstr "тихий режим"
 
-#: builtin/receive-pack.c:1857
+#: builtin/receive-pack.c:1897
 msgid "You must specify a directory."
 msgstr "Вы должны указать каталог."
 
@@ -10006,7 +10680,7 @@ msgstr "* внешний репозиторий %s"
 msgid "  Fetch URL: %s"
 msgstr "  URL для извлечения: %s"
 
-#: builtin/remote.c:1143 builtin/remote.c:1156 builtin/remote.c:1296
+#: builtin/remote.c:1143 builtin/remote.c:1156 builtin/remote.c:1295
 msgid "(no URL)"
 msgstr "(нет URL)"
 
@@ -10044,7 +10718,7 @@ msgstr[1] "  Внешние ветки:%s"
 msgstr[2] "  Внешние ветки:%s"
 msgstr[3] "  Внешние ветки:%s"
 
-#: builtin/remote.c:1179 builtin/remote.c:1206
+#: builtin/remote.c:1179 builtin/remote.c:1205
 msgid " (status not queried)"
 msgstr " (статус не запрашивался)"
 
@@ -10060,7 +10734,7 @@ msgstr[3] "  Локальные ветки, настроенные для «git
 msgid "  Local refs will be mirrored by 'git push'"
 msgstr " Локальные ссылки, зеркалируемые с помощью «git push»"
 
-#: builtin/remote.c:1203
+#: builtin/remote.c:1202
 #, c-format
 msgid "  Local ref configured for 'git push'%s:"
 msgid_plural "  Local refs configured for 'git push'%s:"
@@ -10069,131 +10743,136 @@ msgstr[1] "  Локальные ссылки, настроенные для «gi
 msgstr[2] "  Локальные ссылки, настроенные для «git push»%s:"
 msgstr[3] "  Локальные ссылки, настроенные для «git push»%s:"
 
-#: builtin/remote.c:1224
+#: builtin/remote.c:1223
 msgid "set refs/remotes/<name>/HEAD according to remote"
 msgstr "установить refs/remotes/<имя>/HEAD в зависимости от внешнего репозитория"
 
-#: builtin/remote.c:1226
+#: builtin/remote.c:1225
 msgid "delete refs/remotes/<name>/HEAD"
 msgstr "удалить refs/remotes/<имя>/HEAD"
 
-#: builtin/remote.c:1241
+#: builtin/remote.c:1240
 msgid "Cannot determine remote HEAD"
 msgstr "Не удалось определить внешний HEAD"
 
-#: builtin/remote.c:1243
+#: builtin/remote.c:1242
 msgid "Multiple remote HEAD branches. Please choose one explicitly with:"
 msgstr "Несколько внешних HEAD веток. Укажите явно одну из них:"
 
-#: builtin/remote.c:1253
+#: builtin/remote.c:1252
 #, c-format
 msgid "Could not delete %s"
 msgstr "Не удалось удалить %s"
 
-#: builtin/remote.c:1261
+#: builtin/remote.c:1260
 #, c-format
 msgid "Not a valid ref: %s"
 msgstr "Недопустимая ссылка: %s"
 
-#: builtin/remote.c:1263
+#: builtin/remote.c:1262
 #, c-format
 msgid "Could not setup %s"
 msgstr "Не удалось настроить %s"
 
-#: builtin/remote.c:1281
+#: builtin/remote.c:1280
 #, c-format
 msgid " %s will become dangling!"
 msgstr " %s будет висящей веткой!"
 
-#: builtin/remote.c:1282
+#: builtin/remote.c:1281
 #, c-format
 msgid " %s has become dangling!"
 msgstr " %s стала висящей веткой!"
 
-#: builtin/remote.c:1292
+#: builtin/remote.c:1291
 #, c-format
 msgid "Pruning %s"
 msgstr "Очистка %s"
 
-#: builtin/remote.c:1293
+#: builtin/remote.c:1292
 #, c-format
 msgid "URL: %s"
 msgstr "URL: %s"
 
-#: builtin/remote.c:1309
+#: builtin/remote.c:1308
 #, c-format
 msgid " * [would prune] %s"
 msgstr " * [будет удалена] %s"
 
-#: builtin/remote.c:1312
+#: builtin/remote.c:1311
 #, c-format
 msgid " * [pruned] %s"
 msgstr " * [удалена] %s"
 
-#: builtin/remote.c:1357
+#: builtin/remote.c:1356
 msgid "prune remotes after fetching"
 msgstr "почистить внешние репозитории после извлечения"
 
-#: builtin/remote.c:1420 builtin/remote.c:1474 builtin/remote.c:1542
+#: builtin/remote.c:1419 builtin/remote.c:1473 builtin/remote.c:1541
 #, c-format
 msgid "No such remote '%s'"
 msgstr "Нет такого внешнего репозитория «%s»"
 
-#: builtin/remote.c:1436
+#: builtin/remote.c:1435
 msgid "add branch"
 msgstr "добавить ветку"
 
-#: builtin/remote.c:1443
+#: builtin/remote.c:1442
 msgid "no remote specified"
 msgstr "не указан внешний репозиторий"
 
-#: builtin/remote.c:1460
+#: builtin/remote.c:1459
 msgid "query push URLs rather than fetch URLs"
 msgstr "запросить URL отправки, вместо URL извлечения"
 
-#: builtin/remote.c:1462
+#: builtin/remote.c:1461
 msgid "return all URLs"
 msgstr "вернуть все URL"
 
-#: builtin/remote.c:1490
+#: builtin/remote.c:1489
 #, c-format
 msgid "no URLs configured for remote '%s'"
 msgstr "URL не настроены для внешнего репозитория «%s»"
 
-#: builtin/remote.c:1516
+#: builtin/remote.c:1515
 msgid "manipulate push URLs"
 msgstr "управление URL отправки"
 
-#: builtin/remote.c:1518
+#: builtin/remote.c:1517
 msgid "add URL"
 msgstr "добавить URL"
 
-#: builtin/remote.c:1520
+#: builtin/remote.c:1519
 msgid "delete URLs"
 msgstr "удалить URL"
 
-#: builtin/remote.c:1527
+#: builtin/remote.c:1526
 msgid "--add --delete doesn't make sense"
 msgstr "--add нельзя использовать одновременно с --delete"
 
-#: builtin/remote.c:1568
+#: builtin/remote.c:1567
 #, c-format
 msgid "Invalid old URL pattern: %s"
 msgstr "Неправильный шаблон старого URL: %s"
 
-#: builtin/remote.c:1576
+#: builtin/remote.c:1575
 #, c-format
 msgid "No such URL found: %s"
 msgstr "Не найдены совпадения URL: %s"
 
-#: builtin/remote.c:1578
+#: builtin/remote.c:1577
 msgid "Will not delete all non-push URLs"
 msgstr "Нельзя удалить все URL не-отправки"
 
-#: builtin/remote.c:1592
+#: builtin/remote.c:1591
 msgid "be verbose; must be placed before a subcommand"
 msgstr "быть многословнее; должно стоять перед подкомандой"
 
+#: builtin/remote.c:1622
+#, c-format
+msgid "Unknown subcommand: %s"
+msgstr "Неизвестная подкоманда: %s"
+
 #: builtin/repack.c:17
 msgid "git repack [<options>]"
 msgstr "git repack [<опции>]"
@@ -10377,8 +11056,8 @@ msgid ""
 msgstr "git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [<коммит>]"
 
 #: builtin/reset.c:27
-msgid "git reset [-q] <tree-ish> [--] <paths>..."
-msgstr "git reset [-q] <указатель-дерева> [--] <пути>…"
+msgid "git reset [-q] [<tree-ish>] [--] <paths>..."
+msgstr "git reset [-q] [<указатель-дерева>] [--] <пути>…"
 
 #: builtin/reset.c:28
 msgid "git reset --patch [<tree-ish>] [--] [<paths>...]"
@@ -10496,27 +11175,27 @@ msgstr "Не удалось сбросить файл индекса на ред
 msgid "Could not write new index file."
 msgstr "Не удалось записать новый файл индекса."
 
-#: builtin/rev-list.c:362
+#: builtin/rev-list.c:354
 msgid "rev-list does not support display of notes"
 msgstr "rev-list не поддерживает отображение заметок"
 
-#: builtin/rev-parse.c:358
+#: builtin/rev-parse.c:386
 msgid "git rev-parse --parseopt [<options>] -- [<args>...]"
 msgstr "git rev-parse --parseopt [<опции>] -- [<аргументы>…]"
 
-#: builtin/rev-parse.c:363
+#: builtin/rev-parse.c:391
 msgid "keep the `--` passed as an arg"
 msgstr "передавать далее «--» как аргумент"
 
-#: builtin/rev-parse.c:365
+#: builtin/rev-parse.c:393
 msgid "stop parsing after the first non-option argument"
 msgstr "остановить разбор после первого аргумента не являющегося опцией"
 
-#: builtin/rev-parse.c:368
+#: builtin/rev-parse.c:396
 msgid "output in stuck long form"
 msgstr "выводить аргументы в длинном формате"
 
-#: builtin/rev-parse.c:499
+#: builtin/rev-parse.c:527
 msgid ""
 "git rev-parse --parseopt [<options>] -- [<args>...]\n"
 "   or: git rev-parse --sq-quote [<arg>...]\n"
@@ -10602,7 +11281,7 @@ msgstr "оставить избыточные, пустые коммиты"
 msgid "revert failed"
 msgstr "сбой обращения изменений коммита"
 
-#: builtin/revert.c:207
+#: builtin/revert.c:205
 msgid "cherry-pick failed"
 msgstr "сбой при копировании коммита"
 
@@ -10756,70 +11435,131 @@ msgstr "git show-branch [-a | --all] [-r | --remotes] [--topo-order | --date-ord
 msgid "git show-branch (-g | --reflog)[=<n>[,<base>]] [--list] [<ref>]"
 msgstr "git show-branch (-g | --reflog)[=<n>[,<база>]] [--list] [<ссылка>]"
 
-#: builtin/show-branch.c:640
+#: builtin/show-branch.c:375
+#, c-format
+msgid "ignoring %s; cannot handle more than %d ref"
+msgid_plural "ignoring %s; cannot handle more than %d refs"
+msgstr[0] "игнорирование %s; невозможно обработать больше %d ссылки"
+msgstr[1] "игнорирование %s; невозможно обработать больше %d ссылок"
+msgstr[2] "игнорирование %s; невозможно обработать больше %d ссылок"
+msgstr[3] "игнорирование %s; невозможно обработать больше %d ссылки"
+
+#: builtin/show-branch.c:541
+#, c-format
+msgid "no matching refs with %s"
+msgstr "нет совпадающих записей с %s"
+
+#: builtin/show-branch.c:639
 msgid "show remote-tracking and local branches"
 msgstr "показать список и отслеживаемых внешних и локальных веток"
 
-#: builtin/show-branch.c:642
+#: builtin/show-branch.c:641
 msgid "show remote-tracking branches"
 msgstr "показать список отслеживаемых внешних веток"
 
-#: builtin/show-branch.c:644
+#: builtin/show-branch.c:643
 msgid "color '*!+-' corresponding to the branch"
 msgstr "окрашивать «*!+-» в соответствии с веткой"
 
-#: builtin/show-branch.c:646
+#: builtin/show-branch.c:645
 msgid "show <n> more commits after the common ancestor"
 msgstr "показать <n> коммитов после общего предка"
 
-#: builtin/show-branch.c:648
+#: builtin/show-branch.c:647
 msgid "synonym to more=-1"
 msgstr "синоним для more=-1"
 
-#: builtin/show-branch.c:649
+#: builtin/show-branch.c:648
 msgid "suppress naming strings"
 msgstr "не выводить именованные строки"
 
-#: builtin/show-branch.c:651
+#: builtin/show-branch.c:650
 msgid "include the current branch"
 msgstr "включить в вывод текущую ветку"
 
-#: builtin/show-branch.c:653
+#: builtin/show-branch.c:652
 msgid "name commits with their object names"
 msgstr "именовать коммиты их именами объектов"
 
-#: builtin/show-branch.c:655
+#: builtin/show-branch.c:654
 msgid "show possible merge bases"
 msgstr "вывести возможные базы слияния"
 
-#: builtin/show-branch.c:657
+#: builtin/show-branch.c:656
 msgid "show refs unreachable from any other ref"
 msgstr "вывести ссылки, недоступные из любых других ссылок"
 
-#: builtin/show-branch.c:659
+#: builtin/show-branch.c:658
 msgid "show commits in topological order"
 msgstr "вывести коммиты в топологическом порядке"
 
-#: builtin/show-branch.c:662
+#: builtin/show-branch.c:661
 msgid "show only commits not on the first branch"
 msgstr "вывести только коммиты, отсутствующие в первой ветке"
 
-#: builtin/show-branch.c:664
+#: builtin/show-branch.c:663
 msgid "show merges reachable from only one tip"
 msgstr "вывести слияния, достижимые только из одной из верхушек"
 
-#: builtin/show-branch.c:666
+#: builtin/show-branch.c:665
 msgid "topologically sort, maintaining date order where possible"
 msgstr "топологическая сортировка, с сохранением порядка дат, если возможно"
 
-#: builtin/show-branch.c:669
+#: builtin/show-branch.c:668
 msgid "<n>[,<base>]"
 msgstr "<n>[,<база>]"
 
-#: builtin/show-branch.c:670
+#: builtin/show-branch.c:669
 msgid "show <n> most recent ref-log entries starting at base"
 msgstr "показать <n> последних записей в журнале ссылок, начиная с базы"
 
+#: builtin/show-branch.c:703
+msgid ""
+"--reflog is incompatible with --all, --remotes, --independent or --merge-"
+"base"
+msgstr "--reflog несовместимо с --all, --remotes, --independent и --merge-base"
+
+#: builtin/show-branch.c:727
+msgid "no branches given, and HEAD is not valid"
+msgstr "не указаны ветки и HEAD не действительный"
+
+#: builtin/show-branch.c:730
+msgid "--reflog option needs one branch name"
+msgstr "параметр --reflog требует указания имени одной ветки"
+
+#: builtin/show-branch.c:733
+#, c-format
+msgid "only %d entry can be shown at one time."
+msgid_plural "only %d entries can be shown at one time."
+msgstr[0] "только %d запись может быть показана одновременно."
+msgstr[1] "только %d записи могут быть показаны одновременно."
+msgstr[2] "только %d записей могут быть показаны одновременно."
+msgstr[3] "только %d записи могут быть показаны одновременно."
+
+#: builtin/show-branch.c:737
+#, c-format
+msgid "no such ref %s"
+msgstr "нет такой ссылки %s"
+
+#: builtin/show-branch.c:829
+#, c-format
+msgid "cannot handle more than %d rev."
+msgid_plural "cannot handle more than %d revs."
+msgstr[0] "невозможно обработать больше %d редакции."
+msgstr[1] "невозможно обработать больше %d редакций."
+msgstr[2] "невозможно обработать больше %d редакций."
+msgstr[3] "невозможно обработать больше %d редакции."
+
+#: builtin/show-branch.c:833
+#, c-format
+msgid "'%s' is not a valid ref."
+msgstr "«%s» не является допустимой ссылкой на коммит."
+
+#: builtin/show-branch.c:836
+#, c-format
+msgid "cannot find commit %s (%s)"
+msgstr "не удалось найти коммит %s (%s)"
+
 #: builtin/show-ref.c:10
 msgid ""
 "git show-ref [-q | --quiet] [--verify] [--head] [-d | --dereference] [-s | "
@@ -10878,12 +11618,12 @@ msgstr "пропустить и удалить все строки, начина
 msgid "prepend comment character and space to each line"
 msgstr "добавить перед каждой строкой символ комметария и пробел"
 
-#: builtin/submodule--helper.c:24 builtin/submodule--helper.c:923
+#: builtin/submodule--helper.c:24 builtin/submodule--helper.c:1046
 #, c-format
 msgid "No such ref: %s"
 msgstr "Нет такой ссылки: %s"
 
-#: builtin/submodule--helper.c:31 builtin/submodule--helper.c:932
+#: builtin/submodule--helper.c:31 builtin/submodule--helper.c:1055
 #, c-format
 msgid "Expecting a full ref name, got %s"
 msgstr "Ожидалось полное имя ссылки, а получено %s"
@@ -10893,181 +11633,200 @@ msgstr "Ожидалось полное имя ссылки, а получено
 msgid "cannot strip one component off url '%s'"
 msgstr "не удалось обрезать один компонент url «%s»"
 
-#: builtin/submodule--helper.c:278 builtin/submodule--helper.c:403
-#: builtin/submodule--helper.c:483
+#: builtin/submodule--helper.c:282 builtin/submodule--helper.c:408
+#: builtin/submodule--helper.c:590
 msgid "alternative anchor for relative paths"
 msgstr "альтернативный символ для относительных путей"
 
-#: builtin/submodule--helper.c:283
+#: builtin/submodule--helper.c:287
 msgid "git submodule--helper list [--prefix=<path>] [<path>...]"
 msgstr "git submodule--helper list [--prefix=<путь>] [<путь>…]"
 
-#: builtin/submodule--helper.c:324 builtin/submodule--helper.c:338
+#: builtin/submodule--helper.c:329 builtin/submodule--helper.c:343
 #, c-format
 msgid "No url found for submodule path '%s' in .gitmodules"
 msgstr "URL для подмодуля по пути «%s» не найден в .gitmodules"
 
-#: builtin/submodule--helper.c:364
+#: builtin/submodule--helper.c:369
 #, c-format
 msgid "Failed to register url for submodule path '%s'"
 msgstr "Сбой регистрации адреса для пути подмодуля «%s»"
 
-#: builtin/submodule--helper.c:368
+#: builtin/submodule--helper.c:373
 #, c-format
 msgid "Submodule '%s' (%s) registered for path '%s'\n"
 msgstr "Подмодуль «%s» (%s) зарегистрирован по пути «%s»\n"
 
-#: builtin/submodule--helper.c:378
+#: builtin/submodule--helper.c:383
 #, c-format
 msgid "warning: command update mode suggested for submodule '%s'\n"
 msgstr "внимание: предполагаемый режим обновления для подмодуля «%s»\n"
 
-#: builtin/submodule--helper.c:385
+#: builtin/submodule--helper.c:390
 #, c-format
 msgid "Failed to register update mode for submodule path '%s'"
 msgstr "Сбой регистрации режима обновления для пути подмодуля «%s»"
 
-#: builtin/submodule--helper.c:404
+#: builtin/submodule--helper.c:409
 msgid "Suppress output for initializing a submodule"
 msgstr "Не выводить информацию о инициализации подмодуля"
 
-#: builtin/submodule--helper.c:409
+#: builtin/submodule--helper.c:414
 msgid "git submodule--helper init [<path>]"
 msgstr "git submodule--helper init [<путь>]"
 
-#: builtin/submodule--helper.c:430
+#: builtin/submodule--helper.c:435
 msgid "git submodule--helper name <path>"
 msgstr "git submodule--helper name <путь>"
 
-#: builtin/submodule--helper.c:436
+#: builtin/submodule--helper.c:441
 #, c-format
 msgid "no submodule mapping found in .gitmodules for path '%s'"
 msgstr "не найдено соответствие подмодулей в .gitmodules для пути «%s»"
 
-#: builtin/submodule--helper.c:486
+#: builtin/submodule--helper.c:524 builtin/submodule--helper.c:527
+#, c-format
+msgid "submodule '%s' cannot add alternate: %s"
+msgstr "подмодулю «%s» не удалось добавить альтернативу: %s"
+
+#: builtin/submodule--helper.c:563
+#, c-format
+msgid "Value '%s' for submodule.alternateErrorStrategy is not recognized"
+msgstr "Значение «%s» для параметра submodule.alternateErrorStrategy не рапознано"
+
+#: builtin/submodule--helper.c:570
+#, c-format
+msgid "Value '%s' for submodule.alternateLocation is not recognized"
+msgstr "Значение «%s» для параметра submodule.alternateLocation не рапознано"
+
+#: builtin/submodule--helper.c:593
 msgid "where the new submodule will be cloned to"
 msgstr "куда должен быть склонирован новый подмодуль"
 
-#: builtin/submodule--helper.c:489
+#: builtin/submodule--helper.c:596
 msgid "name of the new submodule"
 msgstr "имя нового подмодуля"
 
-#: builtin/submodule--helper.c:492
+#: builtin/submodule--helper.c:599
 msgid "url where to clone the submodule from"
 msgstr "url откуда должен был склонирован новый подмодуль"
 
-#: builtin/submodule--helper.c:498
+#: builtin/submodule--helper.c:605
 msgid "depth for shallow clones"
 msgstr "глубина для частичного клона"
 
-#: builtin/submodule--helper.c:504
+#: builtin/submodule--helper.c:608 builtin/submodule--helper.c:964
+msgid "force cloning progress"
+msgstr "принудительно выводить прогресс клонирования"
+
+#: builtin/submodule--helper.c:613
 msgid ""
 "git submodule--helper clone [--prefix=<path>] [--quiet] [--reference "
 "<repository>] [--name <name>] [--depth <depth>] --url <url> --path <path>"
 msgstr "git submodule--helper clone [--prefix=<путь>] [--quiet] [--reference <репозиторий>] [--name <имя>] [--depth <глубина>] --url <url> --path <путь>"
 
-#: builtin/submodule--helper.c:529 builtin/submodule--helper.c:535
+#: builtin/submodule--helper.c:638 builtin/submodule--helper.c:648
 #, c-format
 msgid "could not create directory '%s'"
 msgstr "не удалось создать каталог «%s»"
 
-#: builtin/submodule--helper.c:531
+#: builtin/submodule--helper.c:644
 #, c-format
 msgid "clone of '%s' into submodule path '%s' failed"
 msgstr "не удалось клонировать «%s» в подмодуль по пути «%s»"
 
-#: builtin/submodule--helper.c:547
+#: builtin/submodule--helper.c:660
 #, c-format
 msgid "cannot open file '%s'"
 msgstr "не удалось открыть файл «%s»"
 
-#: builtin/submodule--helper.c:552
+#: builtin/submodule--helper.c:665
 #, c-format
 msgid "could not close file %s"
 msgstr "не удалось закрыть файл %s"
 
-#: builtin/submodule--helper.c:559
+#: builtin/submodule--helper.c:672
 #, c-format
 msgid "could not get submodule directory for '%s'"
 msgstr "не удалось получить каталог для подмодуля «%s»"
 
-#: builtin/submodule--helper.c:611
+#: builtin/submodule--helper.c:726
 #, c-format
 msgid "Submodule path '%s' not initialized"
 msgstr "Подмодуль по пути «%s» не инициализирован"
 
-#: builtin/submodule--helper.c:615
+#: builtin/submodule--helper.c:730
 msgid "Maybe you want to use 'update --init'?"
 msgstr "Возможно, вы хотели использовать «update --init»?"
 
-#: builtin/submodule--helper.c:641
+#: builtin/submodule--helper.c:756
 #, c-format
 msgid "Skipping unmerged submodule %s"
 msgstr "Пропуск не слитого подмодуля %s"
 
-#: builtin/submodule--helper.c:662
+#: builtin/submodule--helper.c:777
 #, c-format
 msgid "Skipping submodule '%s'"
 msgstr "Пропуск подмодуля «%s»"
 
-#: builtin/submodule--helper.c:792
+#: builtin/submodule--helper.c:913
 #, c-format
 msgid "Failed to clone '%s'. Retry scheduled"
 msgstr "Не удалось клонировать «%s». Запланирована повторная попытка"
 
-#: builtin/submodule--helper.c:803
+#: builtin/submodule--helper.c:924
 #, c-format
 msgid "Failed to clone '%s' a second time, aborting"
 msgstr "Не удалось клонировать «%s» со второй попытки, отмена"
 
-#: builtin/submodule--helper.c:824
+#: builtin/submodule--helper.c:945
 msgid "path into the working tree"
 msgstr "путь в рабочем каталоге"
 
-#: builtin/submodule--helper.c:827
+#: builtin/submodule--helper.c:948
 msgid "path into the working tree, across nested submodule boundaries"
 msgstr "путь в рабочем каталоге, в пределах границ подмодуля"
 
-#: builtin/submodule--helper.c:831
+#: builtin/submodule--helper.c:952
 msgid "rebase, merge, checkout or none"
 msgstr "rebase, merge, checkout или none"
 
-#: builtin/submodule--helper.c:835
+#: builtin/submodule--helper.c:956
 msgid "Create a shallow clone truncated to the specified number of revisions"
 msgstr "Создать частичный клон, ограниченный указанным количеством редакций"
 
-#: builtin/submodule--helper.c:838
+#: builtin/submodule--helper.c:959
 msgid "parallel jobs"
 msgstr "параллельные задачи"
 
-#: builtin/submodule--helper.c:840
+#: builtin/submodule--helper.c:961
 msgid "whether the initial clone should follow the shallow recommendation"
 msgstr "должен ли изначальный процесс клонирования следовать рекомендации о частичности"
 
-#: builtin/submodule--helper.c:841
+#: builtin/submodule--helper.c:962
 msgid "don't print cloning progress"
 msgstr "вы выводить прогресс клонирования"
 
-#: builtin/submodule--helper.c:846
+#: builtin/submodule--helper.c:969
 msgid "git submodule--helper update_clone [--prefix=<path>] [<path>...]"
 msgstr "git submodule--helper update_clone [--prefix=<путь>] [<путь>…]"
 
-#: builtin/submodule--helper.c:856
+#: builtin/submodule--helper.c:979
 msgid "bad value for update parameter"
 msgstr "плохое значение для параметра update"
 
-#: builtin/submodule--helper.c:927
+#: builtin/submodule--helper.c:1050
 #, c-format
 msgid ""
 "Submodule (%s) branch configured to inherit branch from superproject, but "
 "the superproject is not on any branch"
 msgstr "Ветка подмодуля (%s) настроена на наследование ветки из родительского проекта, но он не находится ни на одной ветке"
 
-#: builtin/submodule--helper.c:977
+#: builtin/submodule--helper.c:1100
 msgid "submodule--helper subcommand must be called with a subcommand"
 msgstr "подкоманда submodule--helper должна вызываться с указанием подкоманды"
 
-#: builtin/submodule--helper.c:984
+#: builtin/submodule--helper.c:1107
 #, c-format
 msgid "'%s' is not a valid submodule--helper subcommand"
 msgstr "«%s» не является подкомандой submodule--helper"
@@ -11289,7 +12048,7 @@ msgstr "метка «%s» уже существует"
 msgid "Updated tag '%s' (was %s)\n"
 msgstr "Метка «%s» обновлена (была %s)\n"
 
-#: builtin/unpack-objects.c:490
+#: builtin/unpack-objects.c:493
 msgid "Unpacking objects"
 msgstr "Распаковка объектов"
 
@@ -11351,131 +12110,143 @@ msgstr "информация статистики каталога не изме
 msgid " OK"
 msgstr " OK"
 
-#: builtin/update-index.c:575
+#: builtin/update-index.c:564
 msgid "git update-index [<options>] [--] [<file>...]"
 msgstr "git update-index [<опции>] [--] [<файл>…]"
 
-#: builtin/update-index.c:930
+#: builtin/update-index.c:919
 msgid "continue refresh even when index needs update"
 msgstr "продолжить обновление, даже если индекс требует обновления"
 
-#: builtin/update-index.c:933
+#: builtin/update-index.c:922
 msgid "refresh: ignore submodules"
 msgstr "обновление: игнорировать подмодули"
 
-#: builtin/update-index.c:936
+#: builtin/update-index.c:925
 msgid "do not ignore new files"
 msgstr "не игнорировать новые файлы"
 
-#: builtin/update-index.c:938
+#: builtin/update-index.c:927
 msgid "let files replace directories and vice-versa"
 msgstr "разрешить файлам заменять каталоги и наоборот"
 
-#: builtin/update-index.c:940
+#: builtin/update-index.c:929
 msgid "notice files missing from worktree"
 msgstr "замечать файлы отсутствующие в рабочем каталоге"
 
-#: builtin/update-index.c:942
+#: builtin/update-index.c:931
 msgid "refresh even if index contains unmerged entries"
 msgstr "обновить, даже если в индексе имеются не слитые записи"
 
-#: builtin/update-index.c:945
+#: builtin/update-index.c:934
 msgid "refresh stat information"
 msgstr "обновить информацию о статусе файлов"
 
-#: builtin/update-index.c:949
+#: builtin/update-index.c:938
 msgid "like --refresh, but ignore assume-unchanged setting"
 msgstr "как --refresh, но игнорировать настройку assume-unchanged"
 
-#: builtin/update-index.c:953
+#: builtin/update-index.c:942
 msgid "<mode>,<object>,<path>"
 msgstr "<режим доступа>,<объект>,<путь>"
 
-#: builtin/update-index.c:954
+#: builtin/update-index.c:943
 msgid "add the specified entry to the index"
 msgstr "добавить указанную запись в индекс"
 
-#: builtin/update-index.c:963
+#: builtin/update-index.c:952
 msgid "mark files as \"not changing\""
 msgstr "пометить файлы как «не измененные»"
 
-#: builtin/update-index.c:966
+#: builtin/update-index.c:955
 msgid "clear assumed-unchanged bit"
 msgstr "убрать пометку assumed-unchanged"
 
-#: builtin/update-index.c:969
+#: builtin/update-index.c:958
 msgid "mark files as \"index-only\""
 msgstr "пометить файлы как «только в индексе»"
 
-#: builtin/update-index.c:972
+#: builtin/update-index.c:961
 msgid "clear skip-worktree bit"
 msgstr "убрать пометку skip-worktree"
 
-#: builtin/update-index.c:975
+#: builtin/update-index.c:964
 msgid "add to index only; do not add content to object database"
 msgstr "только добавить в индекс; не добавлять содержимое в базу данных объектов"
 
-#: builtin/update-index.c:977
+#: builtin/update-index.c:966
 msgid "remove named paths even if present in worktree"
 msgstr "удалить указанные пути, даже если они существуют в рабочем каталоге"
 
-#: builtin/update-index.c:979
+#: builtin/update-index.c:968
 msgid "with --stdin: input lines are terminated by null bytes"
 msgstr "с опцией --stdin: строки на вводе отделяются НУЛЕВЫМ байтом"
 
-#: builtin/update-index.c:981
+#: builtin/update-index.c:970
 msgid "read list of paths to be updated from standard input"
 msgstr "прочитать список обновляемых путей из стандартного ввода"
 
-#: builtin/update-index.c:985
+#: builtin/update-index.c:974
 msgid "add entries from standard input to the index"
 msgstr "добавить записи из стандартного ввода в индекс"
 
-#: builtin/update-index.c:989
+#: builtin/update-index.c:978
 msgid "repopulate stages #2 and #3 for the listed paths"
 msgstr "заново заполнить индекс #2 и #3 для указанных путей"
 
-#: builtin/update-index.c:993
+#: builtin/update-index.c:982
 msgid "only update entries that differ from HEAD"
 msgstr "обновить только записи, которые отличаются от HEAD"
 
-#: builtin/update-index.c:997
+#: builtin/update-index.c:986
 msgid "ignore files missing from worktree"
 msgstr "игнорировать файлы, отсутствующие в рабочем каталоге"
 
-#: builtin/update-index.c:1000
+#: builtin/update-index.c:989
 msgid "report actions to standard output"
 msgstr "вывести выполняемые действия на стандартный вывод"
 
-#: builtin/update-index.c:1002
+#: builtin/update-index.c:991
 msgid "(for porcelains) forget saved unresolved conflicts"
 msgstr "(для машинной обработки) забыть сохраненные неразрешенные конфликты"
 
-#: builtin/update-index.c:1006
+#: builtin/update-index.c:995
 msgid "write index in this format"
 msgstr "записать индекс в указанном формате"
 
-#: builtin/update-index.c:1008
+#: builtin/update-index.c:997
 msgid "enable or disable split index"
 msgstr "разрешить или запретить раздельный индекс"
 
-#: builtin/update-index.c:1010
+#: builtin/update-index.c:999
 msgid "enable/disable untracked cache"
 msgstr "включить/отключить кэш неотслеживаемых файлов"
 
-#: builtin/update-index.c:1012
+#: builtin/update-index.c:1001
 msgid "test if the filesystem supports untracked cache"
 msgstr "проверить, что файловая система поддерживает кэш неотслеживаемых файлов"
 
-#: builtin/update-index.c:1014
+#: builtin/update-index.c:1003
 msgid "enable untracked cache without testing the filesystem"
 msgstr "включить кэш неотслеживаемых файлов без проверки файловой системы"
 
-#: builtin/update-index.c:1134
+#: builtin/update-index.c:1119
+msgid ""
+"core.untrackedCache is set to true; remove or change it, if you really want "
+"to disable the untracked cache"
+msgstr "параметр core.untrackedCache установлен true; удалите или измените его, если вы действительно хотите удалить кэш неотслеживаемых файлов"
+
+#: builtin/update-index.c:1123
 msgid "Untracked cache disabled"
 msgstr "Кэш неотслеживаемых файлов отключен"
 
-#: builtin/update-index.c:1146
+#: builtin/update-index.c:1131
+msgid ""
+"core.untrackedCache is set to false; remove or change it, if you really want"
+" to enable the untracked cache"
+msgstr "параметр core.untrackedCache установлен false; удалите или измените его, если вы действительно хотите включить кэш неотслеживаемых файлов"
+
+#: builtin/update-index.c:1135
 #, c-format
 msgid "Untracked cache enabled for '%s'"
 msgstr "Кэш неотслеживаемых файлов включен для «%s»"
@@ -11672,26 +12443,35 @@ msgstr "вывести объект дерева для подкаталога 
 msgid "only useful for debugging"
 msgstr "используется только при отладке"
 
-#: upload-pack.c:20
+#: upload-pack.c:22
 msgid "git upload-pack [<options>] <dir>"
 msgstr "git upload-pack [<опции>] <каталог>"
 
-#: upload-pack.c:837
+#: upload-pack.c:1028
 msgid "quit after a single request/response exchange"
 msgstr "выход после обмена одним запросом/ответом"
 
-#: upload-pack.c:839
+#: upload-pack.c:1030
 msgid "exit immediately after initial ref advertisement"
 msgstr "выходить сразу после начального объявления списка ссылок"
 
-#: upload-pack.c:841
+#: upload-pack.c:1032
 msgid "do not try <directory>/.git/ if <directory> is no Git directory"
 msgstr "не проверять <каталог>/.git/ если <каталог> не является каталогом Git"
 
-#: upload-pack.c:843
+#: upload-pack.c:1034
 msgid "interrupt transfer after <n> seconds of inactivity"
 msgstr "прервать передачу после <кол> секунд простоя"
 
+#: credential-cache--daemon.c:223
+#, c-format
+msgid ""
+"The permissions on your socket directory are too loose; other\n"
+"users may be able to read your cached credentials. Consider running:\n"
+"\n"
+"\tchmod 0700 %s"
+msgstr "Права доступа к вашему каталогу сокетов слишком свободны; друге пользователи могуи читать ваши закэшированные пароли доступа. Обдумайте запуск команды:\n\n\tchmod 0700 %s"
+
 #: credential-cache--daemon.c:271
 msgid "print debugging messages to stderr"
 msgstr "вывод отладочных сообщений на stderr"
@@ -11703,7 +12483,11 @@ msgid ""
 "to read about a specific subcommand or concept."
 msgstr "«git help -а» и «git help -g» выводит список доступных подкоманд и\nнекоторые руководства по темам. Запустите «git help <команда>» или\n«git help <термин>», чтобы прочесть о конкретных подкоманде или теме."
 
-#: http.c:323
+#: http.c:342
+msgid "Delegation control is not supported with cURL < 7.22.0"
+msgstr "Делегация проверки полномочий не поддерживается с cURL < 7.22.0"
+
+#: http.c:351
 msgid "Public key pinning not supported with cURL < 7.44.0"
 msgstr "Public key pinning не поддерживается с cURL < 7.44.0"
 
@@ -11819,15 +12603,15 @@ msgstr "дата-окончания"
 msgid "no-op (backward compatibility)"
 msgstr "ничего не делает (оставлено для обратной совместимости)"
 
-#: parse-options.h:237
+#: parse-options.h:238
 msgid "be more verbose"
 msgstr "быть многословнее"
 
-#: parse-options.h:239
+#: parse-options.h:240
 msgid "be more quiet"
 msgstr "тихий режим"
 
-#: parse-options.h:245
+#: parse-options.h:246
 msgid "use <n> digits to display SHA-1s"
 msgstr "использовать <n> цифр для вывода SHA-1"
 
@@ -12028,7 +12812,7 @@ msgid "Automated merge did not work."
 msgstr "Не удалось автоматически слить изменения."
 
 #: git-merge-octopus.sh:62
-msgid "Should not be doing an Octopus."
+msgid "Should not be doing an octopus."
 msgstr "Должно быть octopus не подходит."
 
 #: git-merge-octopus.sh:73
@@ -12196,6 +12980,10 @@ msgstr "У вас еще нет начального коммита"
 msgid "Cannot save the current index state"
 msgstr "Не удалось сохранить текущее состояние индекса"
 
+#: git-stash.sh:103
+msgid "Cannot save the untracked files"
+msgstr "Невозможно сохранить неотслеживаемые файлы"
+
 #: git-stash.sh:123 git-stash.sh:136
 msgid "Cannot save the current worktree state"
 msgstr "Не удалось сохранить текущее состояние рабочего каталога"
@@ -12233,6 +13021,10 @@ msgid ""
 "       To provide a message, use git stash save -- '$option'"
 msgstr "ошибка: неизвестная опция для «stash save»: $option\n        Для предоставления сообщения, используйте git stash save -- «$option»"
 
+#: git-stash.sh:251
+msgid "Can't use --patch and --include-untracked or --all at the same time"
+msgstr "Нельзя использовать --patch и --include-untracked или --all одновременно"
+
 #: git-stash.sh:259
 msgid "No local changes to save"
 msgstr "Нет локальных изменений для сохранения"
@@ -12254,96 +13046,100 @@ msgstr "Рабочий каталог и состояние индекса со
 msgid "Cannot remove worktree changes"
 msgstr "Не удалось удалить изменения рабочего каталога"
 
-#: git-stash.sh:404
+#: git-stash.sh:403
 #, sh-format
 msgid "unknown option: $opt"
 msgstr "неизвестная опция: $opt"
 
-#: git-stash.sh:414
+#: git-stash.sh:416
 msgid "No stash found."
 msgstr "Не найдены спрятанные изменения."
 
-#: git-stash.sh:421
+#: git-stash.sh:423
 #, sh-format
 msgid "Too many revisions specified: $REV"
 msgstr "Передано слишком много редакций: $REV"
 
-#: git-stash.sh:427
+#: git-stash.sh:438
 #, sh-format
 msgid "$reference is not a valid reference"
 msgstr "$reference не является действительной ссылкой"
 
-#: git-stash.sh:455
+#: git-stash.sh:466
 #, sh-format
 msgid "'$args' is not a stash-like commit"
 msgstr "«$args» не похоже на коммит со спрятанными изменениями"
 
-#: git-stash.sh:466
+#: git-stash.sh:477
 #, sh-format
 msgid "'$args' is not a stash reference"
 msgstr "«$args» не является ссылкой на спрятанные изменения"
 
-#: git-stash.sh:474
+#: git-stash.sh:485
 msgid "unable to refresh index"
 msgstr "не удалось обновить индекс"
 
-#: git-stash.sh:478
+#: git-stash.sh:489
 msgid "Cannot apply a stash in the middle of a merge"
 msgstr "Нельзя применить спрятанные изменения во время выполнения слияния"
 
-#: git-stash.sh:486
+#: git-stash.sh:497
 msgid "Conflicts in index. Try without --index."
 msgstr "Конфликты в индексе. Попробуйте без --index."
 
-#: git-stash.sh:488
+#: git-stash.sh:499
 msgid "Could not save index tree"
 msgstr "Не удалось сохранить дерево индекса"
 
-#: git-stash.sh:522
+#: git-stash.sh:508
+msgid "Could not restore untracked files from stash"
+msgstr "Невозможно восстановить неотслеживаемые файлы из спятанных файлов"
+
+#: git-stash.sh:533
 msgid "Cannot unstage modified files"
 msgstr "Невозможно убрать из индекса измененные файлы"
 
-#: git-stash.sh:537
+#: git-stash.sh:548
 msgid "Index was not unstashed."
 msgstr "Индекс не был извлечён из спрятанных изменений."
 
-#: git-stash.sh:551
+#: git-stash.sh:562
 msgid "The stash is kept in case you need it again."
 msgstr "Спрятанные изменения сохранены, на случай если они снова вам понадобятся."
 
-#: git-stash.sh:560
+#: git-stash.sh:571
 #, sh-format
 msgid "Dropped ${REV} ($s)"
 msgstr "Отброшено ${REV} ($s)"
 
-#: git-stash.sh:561
+#: git-stash.sh:572
 #, sh-format
 msgid "${REV}: Could not drop stash entry"
 msgstr "${REV}: Не удалось отбросить запись из спрятанных изменений"
 
-#: git-stash.sh:569
+#: git-stash.sh:580
 msgid "No branch name specified"
 msgstr "Не указано имя ветки"
 
-#: git-stash.sh:641
+#: git-stash.sh:652
 msgid "(To restore them type \"git stash apply\")"
 msgstr "(Чтобы восстановить их, наберите «git stash apply»)"
 
-#: git-submodule.sh:183
+#: git-submodule.sh:184
 msgid "Relative path can only be used from the toplevel of the working tree"
 msgstr "Относительный путь можно использовать только находясь на вершине рабочего каталога"
 
-#: git-submodule.sh:193
+#: git-submodule.sh:194
 #, sh-format
 msgid "repo URL: '$repo' must be absolute or begin with ./|../"
 msgstr "URL репозитория: «$repo» должен быть абсолютным или начинаться с ./|../"
 
-#: git-submodule.sh:210
+#: git-submodule.sh:211
 #, sh-format
 msgid "'$sm_path' already exists in the index"
 msgstr "«$sm_path» уже содержится в индексе"
 
-#: git-submodule.sh:214
+#: git-submodule.sh:215
 #, sh-format
 msgid ""
 "The following path is ignored by one of your .gitignore files:\n"
@@ -12351,22 +13147,22 @@ msgid ""
 "Use -f if you really want to add it."
 msgstr "Следующие пути игнорируются одним из ваших файлов .gitignore:\n$sm_path\nИспользуйте опцию -f, если вы действительно хотите его добавить."
 
-#: git-submodule.sh:232
+#: git-submodule.sh:233
 #, sh-format
 msgid "Adding existing repo at '$sm_path' to the index"
 msgstr "Добавляю существующий репозиторий из «$sm_path» в индекс"
 
-#: git-submodule.sh:234
+#: git-submodule.sh:235
 #, sh-format
 msgid "'$sm_path' already exists and is not a valid git repo"
 msgstr "«$sm_path» уже существует и не является действительным репозиторием git"
 
-#: git-submodule.sh:242
+#: git-submodule.sh:243
 #, sh-format
 msgid "A git directory for '$sm_name' is found locally with remote(s):"
 msgstr "Каталог git для «$sm_name» найден локально на внешних репозиториях:"
 
-#: git-submodule.sh:244
+#: git-submodule.sh:245
 #, sh-format
 msgid ""
 "If you want to reuse this local git directory instead of cloning again from\n"
@@ -12375,188 +13171,184 @@ msgid ""
 "or you are unsure what this means choose another name with the '--name' option."
 msgstr "Если вы хотите повторно использовать локальный каталог git вместо повторного клонирования из\n  $realrepo\nто используйте параметр «--force». Если же локальный каталог git не является нужным репозиторием или если вы не уверены, что это значит, то укажите другое имя для подмодуля с помощью параметра «--name»."
 
-#: git-submodule.sh:250
+#: git-submodule.sh:251
 #, sh-format
 msgid "Reactivating local git directory for submodule '$sm_name'."
 msgstr "Восстановление локального каталога git для подмодуля «$sm_name»."
 
-#: git-submodule.sh:262
+#: git-submodule.sh:263
 #, sh-format
 msgid "Unable to checkout submodule '$sm_path'"
 msgstr "Не удалось переключиться на состояние у подмодуля «$sm_path»"
 
-#: git-submodule.sh:267
+#: git-submodule.sh:268
 #, sh-format
 msgid "Failed to add submodule '$sm_path'"
 msgstr "Сбой добавления подмодуля «$sm_path»"
 
-#: git-submodule.sh:276
+#: git-submodule.sh:277
 #, sh-format
 msgid "Failed to register submodule '$sm_path'"
 msgstr "Не удалось зарегистрировать подмодуль «$sm_path»"
 
-#: git-submodule.sh:323
+#: git-submodule.sh:324
 #, sh-format
 msgid "Entering '$displaypath'"
 msgstr "Заходим в «$displaypath»"
 
-#: git-submodule.sh:343
+#: git-submodule.sh:344
 #, sh-format
 msgid "Stopping at '$displaypath'; script returned non-zero status."
 msgstr "Останавливаемся на «$displaypath»; сценарий вернул не нулевой код возврата."
 
-#: git-submodule.sh:414
+#: git-submodule.sh:415
 #, sh-format
 msgid "pathspec and --all are incompatible"
 msgstr "спецификацию пути и --all нельзя использовать одновременно"
 
-#: git-submodule.sh:419
+#: git-submodule.sh:420
 #, sh-format
 msgid "Use '--all' if you really want to deinitialize all submodules"
 msgstr "Используйте «--all», если вы действительно хотите деинициализировать все подмодули"
 
-#: git-submodule.sh:439
+#: git-submodule.sh:440
 #, sh-format
 msgid ""
 "Submodule work tree '$displaypath' contains a .git directory\n"
 "(use 'rm -rf' if you really want to remove it including all of its history)"
 msgstr "Рабочий каталог подмодуля «$displaypath» уже содержит каталог .git\n(используйте «rm -rf», если вы действительно хотите удалить его со всей историей изменений)"
 
-#: git-submodule.sh:447
+#: git-submodule.sh:448
 #, sh-format
 msgid ""
 "Submodule work tree '$displaypath' contains local modifications; use '-f' to"
 " discard them"
 msgstr "Рабочий каталог подмодуля «$displaypath» содержит локальные изменения; используйте «-f», чтобы отменить их"
 
-#: git-submodule.sh:450
+#: git-submodule.sh:451
 #, sh-format
 msgid "Cleared directory '$displaypath'"
 msgstr "Очищен каталог «$displaypath»"
 
-#: git-submodule.sh:451
+#: git-submodule.sh:452
 #, sh-format
 msgid "Could not remove submodule work tree '$displaypath'"
 msgstr "Не удалось удалить рабочий каталог подмодуля «$displaypath»"
 
-#: git-submodule.sh:454
+#: git-submodule.sh:455
 #, sh-format
 msgid "Could not create empty submodule directory '$displaypath'"
 msgstr "Не удалось создать пустой каталог подмодуля «$displaypath»"
 
-#: git-submodule.sh:463
+#: git-submodule.sh:464
 #, sh-format
 msgid "Submodule '$name' ($url) unregistered for path '$displaypath'"
 msgstr "Подмодуль «$name» ($url) был снят с регистрации по пути «$displaypath»"
 
-#: git-submodule.sh:612
+#: git-submodule.sh:617
 #, sh-format
 msgid "Unable to find current revision in submodule path '$displaypath'"
 msgstr "Не удалось найти текущую редакцию для подмодуля по пути «$displaypath»"
 
-#: git-submodule.sh:622
+#: git-submodule.sh:627
 #, sh-format
 msgid "Unable to fetch in submodule path '$sm_path'"
 msgstr "Не удалось выполнить извлечение для подмодуля по пути «$sm_path»"
 
-#: git-submodule.sh:627
+#: git-submodule.sh:632
 #, sh-format
 msgid ""
 "Unable to find current ${remote_name}/${branch} revision in submodule path "
 "'$sm_path'"
 msgstr "Не удалось найти текущую редакцию ${remote_name}/${branch} для подмодуля по пути «$sm_path»"
 
-#: git-submodule.sh:645
+#: git-submodule.sh:650
 #, sh-format
 msgid "Unable to fetch in submodule path '$displaypath'"
 msgstr "Не удалось выполнить извлечение для подмодуля по пути «$displaypath»"
 
-#: git-submodule.sh:651
+#: git-submodule.sh:656
 #, sh-format
 msgid ""
 "Fetched in submodule path '$displaypath', but it did not contain $sha1. "
 "Direct fetching of that commit failed."
 msgstr "Получен по пути подмодуля «$displaypath», но не содержит $sha1. Сбой при прямом получении коммита."
 
-#: git-submodule.sh:658
+#: git-submodule.sh:663
 #, sh-format
 msgid "Unable to checkout '$sha1' in submodule path '$displaypath'"
 msgstr "Не удалось переключиться на состояние «$sha1» для подмодуля по пути «$displaypath»"
 
-#: git-submodule.sh:659
+#: git-submodule.sh:664
 #, sh-format
 msgid "Submodule path '$displaypath': checked out '$sha1'"
 msgstr "Подмодуль по пути «$displaypath»: забрано состояние «$sha1»"
 
-#: git-submodule.sh:663
+#: git-submodule.sh:668
 #, sh-format
 msgid "Unable to rebase '$sha1' in submodule path '$displaypath'"
 msgstr "Не удалось переместить «$sha1» для подмодуля по пути «$displaypath»"
 
-#: git-submodule.sh:664
+#: git-submodule.sh:669
 #, sh-format
 msgid "Submodule path '$displaypath': rebased into '$sha1'"
 msgstr "Подмодуль по пути «$displaypath»: перемещен над «$sha1»"
 
-#: git-submodule.sh:669
+#: git-submodule.sh:674
 #, sh-format
 msgid "Unable to merge '$sha1' in submodule path '$displaypath'"
 msgstr "Не удалось выполнить слияние с «$sha1» для подмодуля по пути «$displaypath»"
 
-#: git-submodule.sh:670
+#: git-submodule.sh:675
 #, sh-format
 msgid "Submodule path '$displaypath': merged in '$sha1'"
 msgstr "Подмодуль по пути «$displaypath»: слито с «$sha1»"
 
-#: git-submodule.sh:675
+#: git-submodule.sh:680
 #, sh-format
 msgid "Execution of '$command $sha1' failed in submodule path '$displaypath'"
 msgstr "Сбой выполнения «$command $sha1» для подмодуля по пути «$displaypath»"
 
-#: git-submodule.sh:676
+#: git-submodule.sh:681
 #, sh-format
 msgid "Submodule path '$displaypath': '$command $sha1'"
 msgstr "Подмодуль по пути «$displaypath»: «$command $sha1»"
 
-#: git-submodule.sh:707
+#: git-submodule.sh:712
 #, sh-format
 msgid "Failed to recurse into submodule path '$displaypath'"
 msgstr "Не удалось выполнить рекурсивно для подмодуля по пути «$displaypath»"
 
-#: git-submodule.sh:815
+#: git-submodule.sh:820
 msgid "The --cached option cannot be used with the --files option"
 msgstr "Опцию --cached нельзя использовать одновременно с опцией --files"
 
-#: git-submodule.sh:867
+#: git-submodule.sh:872
 #, sh-format
 msgid "unexpected mode $mod_dst"
 msgstr "неизвестный режим $mod_dst"
 
-#: git-submodule.sh:887
+#: git-submodule.sh:892
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commit $sha1_src"
 msgstr "  Предупреждение: $display_name не содержит коммит $sha1_src"
 
-#: git-submodule.sh:890
+#: git-submodule.sh:895
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commit $sha1_dst"
 msgstr "  Предупреждение: $display_name не содержит коммит $sha1_dst"
 
-#: git-submodule.sh:893
+#: git-submodule.sh:898
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commits $sha1_src and $sha1_dst"
 msgstr "  Предупреждение: $display_name не содержит коммиты $sha1_src и $sha1_dst"
 
-#: git-submodule.sh:918
-msgid "blob"
-msgstr "двоичный объект"
-
-#: git-submodule.sh:1040
+#: git-submodule.sh:1045
 #, sh-format
 msgid "Failed to recurse into submodule path '$sm_path'"
 msgstr "Не удалось выполнить рекурсивно для подмодуля по пути «$sm_path»"
 
-#: git-submodule.sh:1107
+#: git-submodule.sh:1112
 #, sh-format
 msgid "Synchronizing submodule url for '$displaypath'"
 msgstr "Синхронизация url для подмодуля «$displaypath»"
@@ -12566,12 +13358,12 @@ msgstr "Синхронизация url для подмодуля «$displaypath
 msgid "See git-${cmd}(1) for details."
 msgstr "Для дополнительной информации, смотрите git-${cmd}(1)."
 
-#: git-rebase--interactive.sh:131
+#: git-rebase--interactive.sh:140
 #, sh-format
 msgid "Rebasing ($new_count/$total)"
 msgstr "Перемещение ($new_count/$total)"
 
-#: git-rebase--interactive.sh:147
+#: git-rebase--interactive.sh:156
 msgid ""
 "\n"
 "Commands:\n"
@@ -12586,19 +13378,19 @@ msgid ""
 "These lines can be re-ordered; they are executed from top to bottom.\n"
 msgstr "\nКоманды:\n p, pick = использовать коммит\n r, reword = использовать коммит, но изменить сообщение коммита\n e, edit = использовать коммит, но остановиться для внесения правок\n s, squash = использовать коммит, но объединить его с предыдущим коммитом\n f, fixup = как «squash», но отбросить сообщение этого коммита\n x, exec = выполнить команду (остаток строки) с помощью командной оболочки\n d, drop = удалить коммит\n\nЭти строки могут быть перемещены; выполняются по очереди сверху вниз.\n"
 
-#: git-rebase--interactive.sh:162
+#: git-rebase--interactive.sh:171
 msgid ""
 "\n"
 "Do not remove any line. Use 'drop' explicitly to remove a commit.\n"
 msgstr "\nНе удаляйте строки. Используйте «drop», чтобы явно удалить коммит.\n"
 
-#: git-rebase--interactive.sh:166
+#: git-rebase--interactive.sh:175
 msgid ""
 "\n"
 "If you remove a line here THAT COMMIT WILL BE LOST.\n"
 msgstr "\nЕсли вы удалите строку здесь, то УКАЗАННЫЙ КОММИТ БУДЕТ УТЕРЯН.\n"
 
-#: git-rebase--interactive.sh:202
+#: git-rebase--interactive.sh:211
 #, sh-format
 msgid ""
 "You can amend the commit now, with\n"
@@ -12610,61 +13402,61 @@ msgid ""
 "\tgit rebase --continue"
 msgstr "Теперь вы можете исправить коммит с помощью\n\n\tgit commit --amend $gpg_sign_opt_quoted\n\nКак только вы будете довольны результатом, запустите\n\n\tgit rebase --continue"
 
-#: git-rebase--interactive.sh:227
+#: git-rebase--interactive.sh:236
 #, sh-format
 msgid "$sha1: not a commit that can be picked"
 msgstr "$sha1: не является коммитом, который можно взять"
 
-#: git-rebase--interactive.sh:266
+#: git-rebase--interactive.sh:275
 #, sh-format
 msgid "Invalid commit name: $sha1"
 msgstr "Недопустимое имя коммита: $sha1"
 
-#: git-rebase--interactive.sh:308
+#: git-rebase--interactive.sh:317
 msgid "Cannot write current commit's replacement sha1"
 msgstr "Не удалось записать замену sha1 текущего коммита"
 
-#: git-rebase--interactive.sh:360
+#: git-rebase--interactive.sh:369
 #, sh-format
 msgid "Fast-forward to $sha1"
 msgstr "Перемотка вперед до $sha1"
 
-#: git-rebase--interactive.sh:362
+#: git-rebase--interactive.sh:371
 #, sh-format
 msgid "Cannot fast-forward to $sha1"
 msgstr "Не удалось перемотать вперед до $sha1"
 
-#: git-rebase--interactive.sh:371
+#: git-rebase--interactive.sh:380
 #, sh-format
 msgid "Cannot move HEAD to $first_parent"
 msgstr "Не удалось переместить HEAD на $first_parent"
 
-#: git-rebase--interactive.sh:376
+#: git-rebase--interactive.sh:385
 #, sh-format
 msgid "Refusing to squash a merge: $sha1"
 msgstr "Нельзя уплотнить слияние: $sha1"
 
-#: git-rebase--interactive.sh:390
+#: git-rebase--interactive.sh:399
 #, sh-format
 msgid "Error redoing merge $sha1"
 msgstr "Ошибка при повторении слияния $sha1"
 
-#: git-rebase--interactive.sh:398
+#: git-rebase--interactive.sh:407
 #, sh-format
 msgid "Could not pick $sha1"
 msgstr "Не удалось взять $sha1"
 
-#: git-rebase--interactive.sh:407
+#: git-rebase--interactive.sh:416
 #, sh-format
 msgid "This is the commit message #${n}:"
 msgstr "Это сообщение коммита номер #${n}:"
 
-#: git-rebase--interactive.sh:412
+#: git-rebase--interactive.sh:421
 #, sh-format
 msgid "The commit message #${n} will be skipped:"
 msgstr "Сообщение коммита номер #${n} будет пропущено:"
 
-#: git-rebase--interactive.sh:423
+#: git-rebase--interactive.sh:432
 #, sh-format
 msgid "This is a combination of $count commit."
 msgid_plural "This is a combination of $count commits."
@@ -12673,26 +13465,26 @@ msgstr[1] "Это объединение $count коммитов"
 msgstr[2] "Это объединение $count коммитов"
 msgstr[3] "Это объединение $count коммитов"
 
-#: git-rebase--interactive.sh:431
+#: git-rebase--interactive.sh:440
 #, sh-format
 msgid "Cannot write $fixup_msg"
 msgstr "Не удалось записать $fixup_msg"
 
-#: git-rebase--interactive.sh:434
+#: git-rebase--interactive.sh:443
 msgid "This is a combination of 2 commits."
 msgstr "Это объединение 2 коммитов"
 
-#: git-rebase--interactive.sh:435
+#: git-rebase--interactive.sh:444
 msgid "This is the 1st commit message:"
 msgstr "Это 1-е сообщение коммита:"
 
-#: git-rebase--interactive.sh:475 git-rebase--interactive.sh:518
-#: git-rebase--interactive.sh:521
+#: git-rebase--interactive.sh:484 git-rebase--interactive.sh:527
+#: git-rebase--interactive.sh:530
 #, sh-format
 msgid "Could not apply $sha1... $rest"
 msgstr "Не удалось применить $sha1… $rest"
 
-#: git-rebase--interactive.sh:549
+#: git-rebase--interactive.sh:558
 #, sh-format
 msgid ""
 "Could not amend commit after successfully picking $sha1... $rest\n"
@@ -12701,31 +13493,31 @@ msgid ""
 "you are able to reword the commit."
 msgstr "Не удолось исправить коммит после успешного перехода на $sha1… $rest\nЭто произошло, скорее всего, из-за пустого сообщения коммита или из-за перехватчика перед коммитом. Если же это произошло из-за перехватчика перед коммитом, то вам нужно решить с ним проблему и повторить попытку снова."
 
-#: git-rebase--interactive.sh:564
+#: git-rebase--interactive.sh:573
 #, sh-format
 msgid "Stopped at $sha1_abbrev... $rest"
 msgstr "Остановлено на $sha1_abbrev… $rest"
 
-#: git-rebase--interactive.sh:579
+#: git-rebase--interactive.sh:588
 #, sh-format
 msgid "Cannot '$squash_style' without a previous commit"
 msgstr "Нельзя сделать «$squash_style» без указания предыдущего коммита"
 
-#: git-rebase--interactive.sh:621
+#: git-rebase--interactive.sh:630
 #, sh-format
 msgid "Executing: $rest"
 msgstr "Выполнение: $rest"
 
-#: git-rebase--interactive.sh:629
+#: git-rebase--interactive.sh:638
 #, sh-format
 msgid "Execution failed: $rest"
 msgstr "Не удалось выполнить: $rest"
 
-#: git-rebase--interactive.sh:631
+#: git-rebase--interactive.sh:640
 msgid "and made changes to the index and/or the working tree"
 msgstr "и были сделаны изменения в индексе и/или в рабочем каталоге"
 
-#: git-rebase--interactive.sh:633
+#: git-rebase--interactive.sh:642
 msgid ""
 "You can fix the problem, and then run\n"
 "\n"
@@ -12733,7 +13525,7 @@ msgid ""
 msgstr "Вы можете исправить ошибку, а затем запустить\n\n\tgit rebase --continue"
 
 #. TRANSLATORS: after these lines is a command to be issued by the user
-#: git-rebase--interactive.sh:646
+#: git-rebase--interactive.sh:655
 #, sh-format
 msgid ""
 "Execution succeeded: $rest\n"
@@ -12743,49 +13535,49 @@ msgid ""
 "\tgit rebase --continue"
 msgstr "Успешное выполнение: $rest\nно остались изменения в индексе и/или в рабочем каталоге\nСделайте коммит или спрячьте ваши изменения, а затем выполните\n\n\tgit rebase --continue"
 
-#: git-rebase--interactive.sh:657
+#: git-rebase--interactive.sh:666
 #, sh-format
 msgid "Unknown command: $command $sha1 $rest"
 msgstr "Неопознанная команда: $command $sha1 $rest"
 
-#: git-rebase--interactive.sh:658
+#: git-rebase--interactive.sh:667
 msgid "Please fix this using 'git rebase --edit-todo'."
 msgstr "Пожалуйста исправьте это с помощью «git rebase --edit-todo»."
 
-#: git-rebase--interactive.sh:693
+#: git-rebase--interactive.sh:702
 #, sh-format
 msgid "Successfully rebased and updated $head_name."
 msgstr "Успешно перебазирован и обновлён $head_name."
 
-#: git-rebase--interactive.sh:740
+#: git-rebase--interactive.sh:749
 msgid "Could not skip unnecessary pick commands"
 msgstr "Не удалось пропустить ненужные команды отбора (pick)"
 
-#: git-rebase--interactive.sh:898
+#: git-rebase--interactive.sh:907
 #, sh-format
 msgid ""
 "Warning: the SHA-1 is missing or isn't a commit in the following line:\n"
 " - $line"
 msgstr "Внимание: не найден SHA-1 или он не указывает на коммит. На строке:\n - $line"
 
-#: git-rebase--interactive.sh:931
+#: git-rebase--interactive.sh:940
 #, sh-format
 msgid ""
 "Warning: the command isn't recognized in the following line:\n"
 " - $line"
 msgstr "Внимание: команда не распознана на строке:\n - $line"
 
-#: git-rebase--interactive.sh:970
+#: git-rebase--interactive.sh:979
 msgid "could not detach HEAD"
 msgstr "не удалось отделить HEAD"
 
-#: git-rebase--interactive.sh:1008
+#: git-rebase--interactive.sh:1017
 msgid ""
 "Warning: some commits may have been dropped accidentally.\n"
 "Dropped commits (newer to older):"
 msgstr "Внимание: некоторые коммиты могли быть отброшены по ошибке.\nОтброшенные коммиты (от новых к старым):"
 
-#: git-rebase--interactive.sh:1016
+#: git-rebase--interactive.sh:1025
 msgid ""
 "To avoid this message, use \"drop\" to explicitly remove a commit.\n"
 "\n"
@@ -12793,26 +13585,28 @@ msgid ""
 "The possible behaviours are: ignore, warn, error."
 msgstr "Для избежания этого сообщения, используйте «drop» чтобы явно удалить коммит.\n\nИспользуйте опцию «git config rebase.missingCommitsCheck» для изменения количества предупреждений.\nВозможные значения: ignore, warn, error."
 
-#: git-rebase--interactive.sh:1027
+#: git-rebase--interactive.sh:1036
 #, sh-format
 msgid ""
 "Unrecognized setting $check_level for option rebase.missingCommitsCheck. "
 "Ignoring."
 msgstr "Нераспознанная настройка $check_level для опции rebase.missingCommitsCheck. Игнорирую."
 
-#: git-rebase--interactive.sh:1044
-msgid "You can fix this with 'git rebase --edit-todo'."
-msgstr "Вы можете исправить это с помощью «git rebase --edit-todo»."
+#: git-rebase--interactive.sh:1053
+msgid ""
+"You can fix this with 'git rebase --edit-todo' and then run 'git rebase "
+"--continue'."
+msgstr "Вы можете исправить это с помощью «git rebase --edit-todo», а потом запустив «git rebase --continue»."
 
-#: git-rebase--interactive.sh:1045
+#: git-rebase--interactive.sh:1054
 msgid "Or you can abort the rebase with 'git rebase --abort'."
 msgstr "Или вы можете отменить процесс перебазирования с помощью «git rebase --abort»."
 
-#: git-rebase--interactive.sh:1069
+#: git-rebase--interactive.sh:1078
 msgid "Could not remove CHERRY_PICK_HEAD"
 msgstr "Не удалось удалить CHERRY_PICK_HEAD"
 
-#: git-rebase--interactive.sh:1074
+#: git-rebase--interactive.sh:1083
 #, sh-format
 msgid ""
 "You have staged changes in your working tree.\n"
@@ -12825,26 +13619,26 @@ msgid ""
 "\n"
 "  git commit $gpg_sign_opt_quoted\n"
 "\n"
-"In both case, once you're done, continue with:\n"
+"In both cases, once you're done, continue with:\n"
 "\n"
 "  git rebase --continue\n"
 msgstr "У вас имеются проиндексированные изменения в рабочем каталоге.\nЕсли эти изменения должны быть объеденены с предыдущим коммитом, то запустите:\n\n  git commit --amend $gpg_sign_opt_quoted\n\nЕсли же они должны быть помещены в новый коммит, то запустите:\n\n  git commit $gpg_sign_opt_quoted\n\nВ любом случае, после того как вы закончите, продолжить перемещение можно выполнив:\n\n  git rebase --continue\n"
 
-#: git-rebase--interactive.sh:1091
+#: git-rebase--interactive.sh:1100
 msgid "Error trying to find the author identity to amend commit"
 msgstr "Произошла ошибка при поиске автора для исправления коммита"
 
-#: git-rebase--interactive.sh:1096
+#: git-rebase--interactive.sh:1105
 msgid ""
 "You have uncommitted changes in your working tree. Please commit them\n"
 "first and then run 'git rebase --continue' again."
 msgstr "У вас имеются незакоммиченные изменения в рабочем каталоге. Сделайте коммит, а затем запустите «git rebase --continue» снова."
 
-#: git-rebase--interactive.sh:1101 git-rebase--interactive.sh:1105
+#: git-rebase--interactive.sh:1110 git-rebase--interactive.sh:1114
 msgid "Could not commit staged changes."
 msgstr "Не удалось закоммитить проиндексированные изменения."
 
-#: git-rebase--interactive.sh:1129
+#: git-rebase--interactive.sh:1138
 msgid ""
 "\n"
 "You are editing the todo file of an ongoing interactive rebase.\n"
@@ -12853,37 +13647,33 @@ msgid ""
 "\n"
 msgstr "\nВы сейчас редактируете файл со списком дел для интерактивного перемещения.\nДля продолжения перемещения, после редактирования файла запустите:\n    git rebase --continue\n\n"
 
-#: git-rebase--interactive.sh:1137 git-rebase--interactive.sh:1298
+#: git-rebase--interactive.sh:1146 git-rebase--interactive.sh:1304
 msgid "Could not execute editor"
 msgstr "Не удалось запустить редактор"
 
-#: git-rebase--interactive.sh:1145
-msgid "You need to set your committer info first"
-msgstr "Сначала вам нужно указать вашу информацию коммитера"
-
-#: git-rebase--interactive.sh:1153
+#: git-rebase--interactive.sh:1159
 #, sh-format
 msgid "Could not checkout $switch_to"
 msgstr "Не удалось перейти на версию $switch_to"
 
-#: git-rebase--interactive.sh:1158
+#: git-rebase--interactive.sh:1164
 msgid "No HEAD?"
 msgstr "Нет указателя HEAD?"
 
-#: git-rebase--interactive.sh:1159
+#: git-rebase--interactive.sh:1165
 #, sh-format
 msgid "Could not create temporary $state_dir"
 msgstr "Не удалось создать временный каталог $state_dir"
 
-#: git-rebase--interactive.sh:1161
+#: git-rebase--interactive.sh:1167
 msgid "Could not mark as interactive"
 msgstr "Не удалось пометить как интерактивный"
 
-#: git-rebase--interactive.sh:1171 git-rebase--interactive.sh:1176
+#: git-rebase--interactive.sh:1177 git-rebase--interactive.sh:1182
 msgid "Could not init rewritten commits"
 msgstr "Не удалось инициализировать перезаписанные коммиты"
 
-#: git-rebase--interactive.sh:1276
+#: git-rebase--interactive.sh:1282
 #, sh-format
 msgid "Rebase $shortrevisions onto $shortonto ($todocount command)"
 msgid_plural "Rebase $shortrevisions onto $shortonto ($todocount commands)"
@@ -12892,14 +13682,14 @@ msgstr[1] "Перемещение $shortrevisions над $shortonto ($todocount
 msgstr[2] "Перемещение $shortrevisions над $shortonto ($todocount команд)"
 msgstr[3] "Перемещение $shortrevisions над $shortonto ($todocount команд)"
 
-#: git-rebase--interactive.sh:1281
+#: git-rebase--interactive.sh:1287
 msgid ""
 "\n"
 "However, if you remove everything, the rebase will be aborted.\n"
 "\n"
 msgstr "\nНо если вы удалите все, то процесс перемещения будет будет прерван.\n\n"
 
-#: git-rebase--interactive.sh:1288
+#: git-rebase--interactive.sh:1294
 msgid "Note that empty commits are commented out"
 msgstr "Заметьте, что пустые коммиты закомментированны"
 
@@ -12926,6 +13716,10 @@ msgstr "Не удалось выполнить перемещение комми
 msgid "Cannot rewrite branches: You have unstaged changes."
 msgstr "Не удалось выполнить перезапись веток: У вас есть непроиндексированные изменения."
 
+#: git-sh-setup.sh:226
+msgid "Cannot pull with rebase: You have unstaged changes."
+msgstr "Не удалось получить с перемещением: У вас есть непроиндексированные изменения."
+
 #: git-sh-setup.sh:229
 #, sh-format
 msgid "Cannot $action: You have unstaged changes."
@@ -12935,11 +13729,19 @@ msgstr "Не удалось выполнить $action: У вас есть не
 msgid "Cannot rebase: Your index contains uncommitted changes."
 msgstr "Не удалось выполнить перемещение коммитов: В вашем индексе есть незакоммиченные изменения."
 
+#: git-sh-setup.sh:245
+msgid "Cannot pull with rebase: Your index contains uncommitted changes."
+msgstr "Не удалось получить с перемещением: В вашем индексе есть незакоммиченные изменения."
+
 #: git-sh-setup.sh:248
 #, sh-format
 msgid "Cannot $action: Your index contains uncommitted changes."
 msgstr "Не удалось выполнить $action: В вашем индексе есть незакоммиченные изменения."
 
+#: git-sh-setup.sh:252
+msgid "Additionally, your index contains uncommitted changes."
+msgstr "К тому же, в вашем индексе есть незакоммиченные изменения."
+
 #: git-sh-setup.sh:372
 msgid "You need to run this command from the toplevel of the working tree."
 msgstr "Вам нужно запускать эту команду находясь на вершине рабочего каталога."
index ceea7c7a51c67b582c2795853b7604e425304b02..14a555c3aff03f245dcf492c5dd695dc89689f8f 100644 (file)
--- a/po/sv.po
+++ b/po/sv.po
@@ -7,8 +7,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: git 2.11.0\n"
 "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2016-11-22 22:10+0800\n"
-"PO-Revision-Date: 2016-11-22 22:16+0800\n"
+"POT-Creation-Date: 2016-11-25 22:50+0800\n"
+"PO-Revision-Date: 2016-11-25 22:59+0800\n"
 "Last-Translator: Peter Krefting <peter@softwolves.pp.se>\n"
 "Language-Team: Svenska <tp-sv@listor.tp-sv.se>\n"
 "Language: sv\n"
@@ -2655,7 +2655,7 @@ msgstr "kunde inte skriva till \"%s\""
 
 #: sequencer.c:251
 #, c-format
-msgid "could not write eol to '%s"
+msgid "could not write eol to '%s'"
 msgstr "kunde inte skriva radslut till \"%s\""
 
 #: sequencer.c:255 sequencer.c:1130 sequencer.c:1216
index ccba6913655709b23765c0fad6c14220a4d2df9b..1d9544fd7803faefc0a8af559146aa2ccc1f1c3e 100644 (file)
--- a/po/vi.po
+++ b/po/vi.po
@@ -8,8 +8,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: git v2.11.0\n"
 "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2016-11-22 22:10+0800\n"
-"PO-Revision-Date: 2016-11-22 22:17+0800\n"
+"POT-Creation-Date: 2016-11-25 22:50+0800\n"
+"PO-Revision-Date: 2016-11-25 23:00+0800\n"
 "Last-Translator: Trần Ngọc Quân <vnwildman@gmail.com>\n"
 "Language-Team: Vietnamese <translation-team-vi@lists.sourceforge.net>\n"
 "Language: vi\n"
@@ -2638,7 +2638,7 @@ msgstr "không thể ghi vào “%s”"
 
 #: sequencer.c:251
 #, c-format
-msgid "could not write eol to '%s"
+msgid "could not write eol to '%s'"
 msgstr "không thể ghi eol vào “%s”"
 
 #: sequencer.c:255 sequencer.c:1130 sequencer.c:1216
index 1ce25337ec9a00755a57eda7e45c0e85d5f4a534..c38326c6f106f65b6abd9ab7ff47f12c6dd0b432 100644 (file)
@@ -135,8 +135,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Git\n"
 "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2016-11-22 22:10+0800\n"
-"PO-Revision-Date: 2016-11-22 22:15+0800\n"
+"POT-Creation-Date: 2016-11-25 22:50+0800\n"
+"PO-Revision-Date: 2016-11-25 22:54+0800\n"
 "Last-Translator: Jiang Xin <worldhello.net@gmail.com>\n"
 "Language-Team: GitHub <https://github.com/jiangxin/git/>\n"
 "Language: zh_CN\n"
@@ -2732,7 +2732,7 @@ msgstr "不能写入 '%s'"
 
 #: sequencer.c:251
 #, c-format
-msgid "could not write eol to '%s"
+msgid "could not write eol to '%s'"
 msgstr "不能将换行符写入 '%s'"
 
 #: sequencer.c:255 sequencer.c:1130 sequencer.c:1216
index 37b2c3b1f9954d79bf799a3af979e8c337698b79..5e683830d9d66a6a1b50a26ab8c3a8338b33198b 100644 (file)
--- a/pretty.c
+++ b/pretty.c
@@ -10,6 +10,7 @@
 #include "color.h"
 #include "reflog-walk.h"
 #include "gpg-interface.h"
+#include "trailer.h"
 
 static char *user_format;
 static struct cmt_fmt_map {
@@ -889,6 +890,16 @@ const char *format_subject(struct strbuf *sb, const char *msg,
        return msg;
 }
 
+static void format_trailers(struct strbuf *sb, const char *msg)
+{
+       struct trailer_info info;
+
+       trailer_info_get(&info, msg);
+       strbuf_add(sb, info.trailer_start,
+                  info.trailer_end - info.trailer_start);
+       trailer_info_release(&info);
+}
+
 static void parse_commit_message(struct format_commit_context *c)
 {
        const char *msg = c->message + c->message_off;
@@ -1292,6 +1303,12 @@ static size_t format_commit_one(struct strbuf *sb, /* in UTF-8 */
                strbuf_addstr(sb, msg + c->body_off);
                return 1;
        }
+
+       if (starts_with(placeholder, "(trailers)")) {
+               format_trailers(sb, msg + c->subject_off);
+               return strlen("(trailers)");
+       }
+
        return 0;       /* unknown placeholder */
 }
 
index db5d910642663e73e4e4fc8d91e0caba4445bdb1..9054369dd0c6ddfd35794fc63f0e0296ec0c9c91 100644 (file)
@@ -156,14 +156,7 @@ void fill_stat_cache_info(struct cache_entry *ce, struct stat *st)
 static int ce_compare_data(const struct cache_entry *ce, struct stat *st)
 {
        int match = -1;
-       static int cloexec = O_CLOEXEC;
-       int fd = open(ce->name, O_RDONLY | cloexec);
-
-       if ((cloexec & O_CLOEXEC) && fd < 0 && errno == EINVAL) {
-               /* Try again w/o O_CLOEXEC: the kernel might not support it */
-               cloexec &= ~O_CLOEXEC;
-               fd = open(ce->name, O_RDONLY | cloexec);
-       }
+       int fd = git_open_cloexec(ce->name, O_RDONLY);
 
        if (fd >= 0) {
                unsigned char sha1[20];
@@ -510,7 +503,6 @@ int index_name_pos(const struct index_state *istate, const char *name, int namel
        return index_name_stage_pos(istate, name, namelen, 0);
 }
 
-/* Remove entry, return true if there are more entries to go.. */
 int remove_index_entry_at(struct index_state *istate, int pos)
 {
        struct cache_entry *ce = istate->cache[pos];
@@ -1425,12 +1417,9 @@ static int read_index_extension(struct index_state *istate,
        return 0;
 }
 
-int hold_locked_index(struct lock_file *lk, int die_on_error)
+int hold_locked_index(struct lock_file *lk, int lock_flags)
 {
-       return hold_lock_file_for_update(lk, get_index_file(),
-                                        die_on_error
-                                        ? LOCK_DIE_ON_ERROR
-                                        : 0);
+       return hold_lock_file_for_update(lk, get_index_file(), lock_flags);
 }
 
 int read_index(struct index_state *istate)
@@ -2295,7 +2284,8 @@ int index_name_is_other(const struct index_state *istate, const char *name,
        return 1;
 }
 
-void *read_blob_data_from_index(struct index_state *istate, const char *path, unsigned long *size)
+void *read_blob_data_from_index(const struct index_state *istate,
+                               const char *path, unsigned long *size)
 {
        int pos, len;
        unsigned long sz;
index f5f7a70c6d9b8ef36ecfe282167714640cace6b1..3820b21cc75f5e7fd4b1b1851be0aaa9e3268d7d 100644 (file)
@@ -13,6 +13,7 @@
 #include "utf8.h"
 #include "git-compat-util.h"
 #include "version.h"
+#include "trailer.h"
 
 typedef enum { FIELD_STR, FIELD_ULONG, FIELD_TIME } cmp_type;
 
@@ -40,7 +41,7 @@ static struct used_atom {
                enum { RR_NORMAL, RR_SHORTEN, RR_TRACK, RR_TRACKSHORT }
                        remote_ref;
                struct {
-                       enum { C_BARE, C_BODY, C_BODY_DEP, C_LINES, C_SIG, C_SUB } option;
+                       enum { C_BARE, C_BODY, C_BODY_DEP, C_LINES, C_SIG, C_SUB, C_TRAILERS } option;
                        unsigned int nlines;
                } contents;
                enum { O_FULL, O_SHORT } objectname;
@@ -85,6 +86,13 @@ static void subject_atom_parser(struct used_atom *atom, const char *arg)
        atom->u.contents.option = C_SUB;
 }
 
+static void trailers_atom_parser(struct used_atom *atom, const char *arg)
+{
+       if (arg)
+               die(_("%%(trailers) does not take arguments"));
+       atom->u.contents.option = C_TRAILERS;
+}
+
 static void contents_atom_parser(struct used_atom *atom, const char *arg)
 {
        if (!arg)
@@ -95,6 +103,8 @@ static void contents_atom_parser(struct used_atom *atom, const char *arg)
                atom->u.contents.option = C_SIG;
        else if (!strcmp(arg, "subject"))
                atom->u.contents.option = C_SUB;
+       else if (!strcmp(arg, "trailers"))
+               atom->u.contents.option = C_TRAILERS;
        else if (skip_prefix(arg, "lines=", &arg)) {
                atom->u.contents.option = C_LINES;
                if (strtoul_ui(arg, 10, &atom->u.contents.nlines))
@@ -194,6 +204,7 @@ static struct {
        { "creatordate", FIELD_TIME },
        { "subject", FIELD_STR, subject_atom_parser },
        { "body", FIELD_STR, body_atom_parser },
+       { "trailers", FIELD_STR, trailers_atom_parser },
        { "contents", FIELD_STR, contents_atom_parser },
        { "upstream", FIELD_STR, remote_ref_atom_parser },
        { "push", FIELD_STR, remote_ref_atom_parser },
@@ -785,6 +796,7 @@ static void grab_sub_body_contents(struct atom_value *val, int deref, struct obj
                        name++;
                if (strcmp(name, "subject") &&
                    strcmp(name, "body") &&
+                   strcmp(name, "trailers") &&
                    !starts_with(name, "contents"))
                        continue;
                if (!subpos)
@@ -808,6 +820,14 @@ static void grab_sub_body_contents(struct atom_value *val, int deref, struct obj
                        /*  Size is the length of the message after removing the signature */
                        append_lines(&s, subpos, contents_end - subpos, atom->u.contents.nlines);
                        v->s = strbuf_detach(&s, NULL);
+               } else if (atom->u.contents.option == C_TRAILERS) {
+                       struct trailer_info info;
+
+                       /* Search for trailer info */
+                       trailer_info_get(&info, subpos);
+                       v->s = xmemdupz(info.trailer_start,
+                                       info.trailer_end - info.trailer_start);
+                       trailer_info_release(&info);
                } else if (atom->u.contents.option == C_BARE)
                        v->s = xstrdup(subpos);
        }
@@ -1231,8 +1251,14 @@ static int commit_contains(struct ref_filter *filter, struct commit *commit)
  * matches a pattern "refs/heads/mas") or a wildcard (e.g. the same ref
  * matches "refs/heads/mas*", too).
  */
-static int match_pattern(const char **patterns, const char *refname)
+static int match_pattern(const struct ref_filter *filter, const char *refname)
 {
+       const char **patterns = filter->name_patterns;
+       unsigned flags = 0;
+
+       if (filter->ignore_case)
+               flags |= WM_CASEFOLD;
+
        /*
         * When no '--format' option is given we need to skip the prefix
         * for matching refs of tags and branches.
@@ -1243,7 +1269,7 @@ static int match_pattern(const char **patterns, const char *refname)
               skip_prefix(refname, "refs/", &refname));
 
        for (; *patterns; patterns++) {
-               if (!wildmatch(*patterns, refname, 0, NULL))
+               if (!wildmatch(*patterns, refname, flags, NULL))
                        return 1;
        }
        return 0;
@@ -1255,9 +1281,15 @@ static int match_pattern(const char **patterns, const char *refname)
  * matches a pattern "refs/heads/" but not "refs/heads/m") or a
  * wildcard (e.g. the same ref matches "refs/heads/m*", too).
  */
-static int match_name_as_path(const char **pattern, const char *refname)
+static int match_name_as_path(const struct ref_filter *filter, const char *refname)
 {
+       const char **pattern = filter->name_patterns;
        int namelen = strlen(refname);
+       unsigned flags = WM_PATHNAME;
+
+       if (filter->ignore_case)
+               flags |= WM_CASEFOLD;
+
        for (; *pattern; pattern++) {
                const char *p = *pattern;
                int plen = strlen(p);
@@ -1280,8 +1312,8 @@ static int filter_pattern_match(struct ref_filter *filter, const char *refname)
        if (!*filter->name_patterns)
                return 1; /* No pattern always matches */
        if (filter->match_as_path)
-               return match_name_as_path(filter->name_patterns, refname);
-       return match_pattern(filter->name_patterns, refname);
+               return match_name_as_path(filter, refname);
+       return match_pattern(filter, refname);
 }
 
 /*
@@ -1329,7 +1361,7 @@ static struct ref_array_item *new_ref_array_item(const char *refname,
        return ref;
 }
 
-static int filter_ref_kind(struct ref_filter *filter, const char *refname)
+static int ref_kind_from_refname(const char *refname)
 {
        unsigned int i;
 
@@ -1342,11 +1374,7 @@ static int filter_ref_kind(struct ref_filter *filter, const char *refname)
                { "refs/tags/", FILTER_REFS_TAGS}
        };
 
-       if (filter->kind == FILTER_REFS_BRANCHES ||
-           filter->kind == FILTER_REFS_REMOTES ||
-           filter->kind == FILTER_REFS_TAGS)
-               return filter->kind;
-       else if (!strcmp(refname, "HEAD"))
+       if (!strcmp(refname, "HEAD"))
                return FILTER_REFS_DETACHED_HEAD;
 
        for (i = 0; i < ARRAY_SIZE(ref_kind); i++) {
@@ -1357,6 +1385,15 @@ static int filter_ref_kind(struct ref_filter *filter, const char *refname)
        return FILTER_REFS_OTHERS;
 }
 
+static int filter_ref_kind(struct ref_filter *filter, const char *refname)
+{
+       if (filter->kind == FILTER_REFS_BRANCHES ||
+           filter->kind == FILTER_REFS_REMOTES ||
+           filter->kind == FILTER_REFS_TAGS)
+               return filter->kind;
+       return ref_kind_from_refname(refname);
+}
+
 /*
  * A call-back given to for_each_ref().  Filter refs and keep them for
  * later object processing.
@@ -1536,18 +1573,20 @@ static int cmp_ref_sorting(struct ref_sorting *s, struct ref_array_item *a, stru
        struct atom_value *va, *vb;
        int cmp;
        cmp_type cmp_type = used_atom[s->atom].type;
+       int (*cmp_fn)(const char *, const char *);
 
        get_ref_atom_value(a, s->atom, &va);
        get_ref_atom_value(b, s->atom, &vb);
+       cmp_fn = s->ignore_case ? strcasecmp : strcmp;
        if (s->version)
                cmp = versioncmp(va->s, vb->s);
        else if (cmp_type == FIELD_STR)
-               cmp = strcmp(va->s, vb->s);
+               cmp = cmp_fn(va->s, vb->s);
        else {
                if (va->ul < vb->ul)
                        cmp = -1;
                else if (va->ul == vb->ul)
-                       cmp = strcmp(a->refname, b->refname);
+                       cmp = cmp_fn(a->refname, b->refname);
                else
                        cmp = 1;
        }
@@ -1555,8 +1594,7 @@ static int cmp_ref_sorting(struct ref_sorting *s, struct ref_array_item *a, stru
        return (s->reverse) ? -cmp : cmp;
 }
 
-static struct ref_sorting *ref_sorting;
-static int compare_refs(const void *a_, const void *b_)
+static int compare_refs(const void *a_, const void *b_, void *ref_sorting)
 {
        struct ref_array_item *a = *((struct ref_array_item **)a_);
        struct ref_array_item *b = *((struct ref_array_item **)b_);
@@ -1572,8 +1610,7 @@ static int compare_refs(const void *a_, const void *b_)
 
 void ref_array_sort(struct ref_sorting *sorting, struct ref_array *array)
 {
-       ref_sorting = sorting;
-       QSORT(array->items, array->nr, compare_refs);
+       QSORT_S(array->items, array->nr, compare_refs, sorting);
 }
 
 static void append_literal(const char *cp, const char *ep, struct ref_formatting_state *state)
@@ -1637,6 +1674,16 @@ void show_ref_array_item(struct ref_array_item *info, const char *format, int qu
        putchar('\n');
 }
 
+void pretty_print_ref(const char *name, const unsigned char *sha1,
+               const char *format)
+{
+       struct ref_array_item *ref_item;
+       ref_item = new_ref_array_item(name, sha1, 0);
+       ref_item->kind = ref_kind_from_refname(name);
+       show_ref_array_item(ref_item, format, 0);
+       free_array_item(ref_item);
+}
+
 /*  If no sorting option is given, use refname to sort as default */
 struct ref_sorting *ref_default_sorting(void)
 {
index 14d435e2ccf0204312d1f72555f1c2c36fabd215..7b05592baf00661a08f973d0a218f7e0afd99453 100644 (file)
@@ -29,6 +29,7 @@ struct ref_sorting {
        struct ref_sorting *next;
        int atom; /* index into used_atom array (internal) */
        unsigned reverse : 1,
+               ignore_case : 1,
                version : 1;
 };
 
@@ -62,6 +63,7 @@ struct ref_filter {
 
        unsigned int with_commit_tag_algo : 1,
                match_as_path : 1,
+               ignore_case : 1,
                detached : 1;
        unsigned int kind,
                lines;
@@ -107,4 +109,11 @@ struct ref_sorting *ref_default_sorting(void);
 /*  Function to parse --merged and --no-merged options */
 int parse_opt_merge_filter(const struct option *opt, const char *arg, int unset);
 
+/*
+ * Print a single ref, outside of any ref-filter. Note that the
+ * name must be a fully qualified refname.
+ */
+void pretty_print_ref(const char *name, const unsigned char *sha1,
+               const char *format);
+
 #endif /*  REF_FILTER_H  */
diff --git a/refs.c b/refs.c
index 9bd0bc177bb8298148577ce0c3e52134452d6e51..cd36b64ed93f821936fd7ffb68e60ce384119898 100644 (file)
--- a/refs.c
+++ b/refs.c
@@ -638,12 +638,17 @@ int copy_reflog_msg(char *buf, const char *msg)
 
 int should_autocreate_reflog(const char *refname)
 {
-       if (!log_all_ref_updates)
+       switch (log_all_ref_updates) {
+       case LOG_REFS_ALWAYS:
+               return 1;
+       case LOG_REFS_NORMAL:
+               return starts_with(refname, "refs/heads/") ||
+                       starts_with(refname, "refs/remotes/") ||
+                       starts_with(refname, "refs/notes/") ||
+                       !strcmp(refname, "HEAD");
+       default:
                return 0;
-       return starts_with(refname, "refs/heads/") ||
-               starts_with(refname, "refs/remotes/") ||
-               starts_with(refname, "refs/notes/") ||
-               !strcmp(refname, "HEAD");
+       }
 }
 
 int is_branch(const char *refname)
diff --git a/refs.h b/refs.h
index 69478439137d64f6dab7f20d4f157f6c7a982ac2..9fbff90e79bfc45fada65651cd01765b17376249 100644 (file)
--- a/refs.h
+++ b/refs.h
@@ -64,6 +64,8 @@ int read_ref(const char *refname, unsigned char *sha1);
 
 int ref_exists(const char *refname);
 
+int should_autocreate_reflog(const char *refname);
+
 int is_branch(const char *refname);
 
 extern int refs_init_db(struct strbuf *err);
index f9023939d5884e0f975d5997336313695e407ca1..c041d4ba21a8fe70eb6d8277358e7e3f29a69bfb 100644 (file)
@@ -697,7 +697,7 @@ static int cache_ref_iterator_peel(struct ref_iterator *ref_iterator,
 
        if (peel_entry(entry, 0))
                return -1;
-       hashcpy(peeled->hash, entry->u.value.peeled.hash);
+       oidcpy(peeled, &entry->u.value.peeled);
        return 0;
 }
 
@@ -2682,7 +2682,7 @@ static int files_rename_ref(struct ref_store *ref_store,
        }
 
        flag = log_all_ref_updates;
-       log_all_ref_updates = 0;
+       log_all_ref_updates = LOG_REFS_NONE;
        if (write_ref_to_lockfile(lock, orig_sha1, &err) ||
            commit_ref_update(refs, lock, orig_sha1, NULL, &err)) {
                error("unable to write current sha1 into %s: %s", oldrefname, err.buf);
@@ -2835,8 +2835,8 @@ static int log_ref_write_1(const char *refname, const unsigned char *old_sha1,
 {
        int logfd, result, oflags = O_APPEND | O_WRONLY;
 
-       if (log_all_ref_updates < 0)
-               log_all_ref_updates = !is_bare_repository();
+       if (log_all_ref_updates == LOG_REFS_UNSET)
+               log_all_ref_updates = is_bare_repository() ? LOG_REFS_NONE : LOG_REFS_NORMAL;
 
        result = log_ref_setup(refname, logfile, err, flags & REF_FORCE_CREATE_REFLOG);
 
index 708b26082aebcc4c0f9c215db4c96dce15beec67..25444cf5b0f6448e4a1ada56d48f09ab3017a759 100644 (file)
@@ -133,8 +133,6 @@ int verify_refname_available(const char *newname,
  */
 int copy_reflog_msg(char *buf, const char *msg);
 
-int should_autocreate_reflog(const char *refname);
-
 /**
  * Information needed for a single ref update. Set new_sha1 to the new
  * value or to null_sha1 to delete the ref. To check the old value
index f14c41f4c0d6d6c9bbfd18d6417d16f0e6068c1d..34a97e7328d440d48badd53bb0d3167a58558ee9 100644 (file)
@@ -274,7 +274,7 @@ static struct discovery *discover_refs(const char *service, int for_push)
        struct strbuf effective_url = STRBUF_INIT;
        struct discovery *last = last_discovery;
        int http_ret, maybe_smart = 0;
-       struct http_get_options options;
+       struct http_get_options http_options;
 
        if (last && !strcmp(service, last->service))
                return last;
@@ -291,15 +291,16 @@ static struct discovery *discover_refs(const char *service, int for_push)
                strbuf_addf(&refs_url, "service=%s", service);
        }
 
-       memset(&options, 0, sizeof(options));
-       options.content_type = &type;
-       options.charset = &charset;
-       options.effective_url = &effective_url;
-       options.base_url = &url;
-       options.no_cache = 1;
-       options.keep_error = 1;
+       memset(&http_options, 0, sizeof(http_options));
+       http_options.content_type = &type;
+       http_options.charset = &charset;
+       http_options.effective_url = &effective_url;
+       http_options.base_url = &url;
+       http_options.initial_request = 1;
+       http_options.no_cache = 1;
+       http_options.keep_error = 1;
 
-       http_ret = http_get_strbuf(refs_url.buf, &buffer, &options);
+       http_ret = http_get_strbuf(refs_url.buf, &buffer, &http_options);
        switch (http_ret) {
        case HTTP_OK:
                break;
@@ -314,6 +315,9 @@ static struct discovery *discover_refs(const char *service, int for_push)
                die("unable to access '%s': %s", url.buf, curl_errorstr);
        }
 
+       if (options.verbosity && !starts_with(refs_url.buf, url.buf))
+               warning(_("redirecting to %s"), url.buf);
+
        last= xcalloc(1, sizeof(*last_discovery));
        last->service = service;
        last->buf_alloc = strbuf_detach(&buffer, &last->len);
@@ -400,6 +404,7 @@ struct rpc_state {
        size_t pos;
        int in;
        int out;
+       int any_written;
        struct strbuf result;
        unsigned gzip_request : 1;
        unsigned initial_buffer : 1;
@@ -456,6 +461,8 @@ static size_t rpc_in(char *ptr, size_t eltsize,
 {
        size_t size = eltsize * nmemb;
        struct rpc_state *rpc = buffer_;
+       if (size)
+               rpc->any_written = 1;
        write_or_die(rpc->in, ptr, size);
        return size;
 }
@@ -659,6 +666,8 @@ static int post_rpc(struct rpc_state *rpc)
        curl_easy_setopt(slot->curl, CURLOPT_WRITEFUNCTION, rpc_in);
        curl_easy_setopt(slot->curl, CURLOPT_FILE, rpc);
 
+
+       rpc->any_written = 0;
        err = run_slot(slot, NULL);
        if (err == HTTP_REAUTH && !large_request) {
                credential_fill(&http_auth);
@@ -667,6 +676,9 @@ static int post_rpc(struct rpc_state *rpc)
        if (err != HTTP_OK)
                err = -1;
 
+       if (!rpc->any_written)
+               err = -1;
+
        curl_slist_free_all(headers);
        free(gzip_body);
        return err;
index ad6c5424edab2ae15ac17bfcf12ac4ee93b5aa3f..bf1bf2309128bf886eac16959b8162b9990c98d7 100644 (file)
--- a/remote.c
+++ b/remote.c
@@ -255,6 +255,7 @@ static void read_remotes_file(struct remote *remote)
 
        if (!f)
                return;
+       remote->configured_in_repo = 1;
        remote->origin = REMOTE_REMOTES;
        while (strbuf_getline(&buf, f) != EOF) {
                const char *v;
@@ -289,6 +290,7 @@ static void read_branches_file(struct remote *remote)
                return;
        }
 
+       remote->configured_in_repo = 1;
        remote->origin = REMOTE_BRANCHES;
 
        /*
@@ -371,6 +373,8 @@ static int handle_config(const char *key, const char *value, void *cb)
        }
        remote = make_remote(name, namelen);
        remote->origin = REMOTE_CONFIG;
+       if (current_config_scope() == CONFIG_SCOPE_REPO)
+               remote->configured_in_repo = 1;
        if (!strcmp(subkey, "mirror"))
                remote->mirror = git_config_bool(key, value);
        else if (!strcmp(subkey, "skipdefaultupdate"))
@@ -714,9 +718,13 @@ struct remote *pushremote_get(const char *name)
        return remote_get_1(name, pushremote_for_branch);
 }
 
-int remote_is_configured(struct remote *remote)
+int remote_is_configured(struct remote *remote, int in_repo)
 {
-       return remote && remote->origin;
+       if (!remote)
+               return 0;
+       if (in_repo)
+               return remote->configured_in_repo;
+       return !!remote->origin;
 }
 
 int for_each_remote(each_remote_fn fn, void *priv)
@@ -1716,9 +1724,6 @@ static const char *branch_get_push_1(struct branch *branch, struct strbuf *err)
 {
        struct remote *remote;
 
-       if (!branch)
-               return error_buf(err, _("HEAD does not point to a branch"));
-
        remote = remote_get(pushremote_for_branch(branch, NULL));
        if (!remote)
                return error_buf(err,
@@ -1778,6 +1783,9 @@ static const char *branch_get_push_1(struct branch *branch, struct strbuf *err)
 
 const char *branch_get_push(struct branch *branch, struct strbuf *err)
 {
+       if (!branch)
+               return error_buf(err, _("HEAD does not point to a branch"));
+
        if (!branch->push_tracking_ref)
                branch->push_tracking_ref = branch_get_push_1(branch, err);
        return branch->push_tracking_ref;
index 924881169d9f6c5b9b09e2434d964f62e0e28d09..a5bbbe0ef965c5e62be50e8ee0c03794e393cc8c 100644 (file)
--- a/remote.h
+++ b/remote.h
@@ -15,7 +15,7 @@ struct remote {
        struct hashmap_entry ent;  /* must be first */
 
        const char *name;
-       int origin;
+       int origin, configured_in_repo;
 
        const char *foreign_vcs;
 
@@ -60,7 +60,7 @@ struct remote {
 
 struct remote *remote_get(const char *name);
 struct remote *pushremote_get(const char *name);
-int remote_is_configured(struct remote *remote);
+int remote_is_configured(struct remote *remote, int in_repo);
 
 typedef int each_remote_fn(struct remote *remote, void *priv);
 int for_each_remote(each_remote_fn fn, void *priv);
index 5d083ca572df0c8a2cb90c0b12c14e15b4134d48..3bd55caf3b0961888bcca06d3c54577cb25f5223 100644 (file)
--- a/rerere.c
+++ b/rerere.c
@@ -708,7 +708,7 @@ static void update_paths(struct string_list *update)
 {
        int i;
 
-       hold_locked_index(&index_lock, 1);
+       hold_locked_index(&index_lock, LOCK_DIE_ON_ERROR);
 
        for (i = 0; i < update->nr; i++) {
                struct string_list_item *item = &update->items[i];
index ca905a9e8038dda26f8c4e146049ad00ed1cd8df..5227f78aeaae7e76bfc85d4d7ca2886b2b52215e 100644 (file)
@@ -29,6 +29,8 @@ static int installed_child_cleanup_handler;
 
 static void cleanup_children(int sig, int in_signal)
 {
+       struct child_to_clean *children_to_wait_for = NULL;
+
        while (children_to_clean) {
                struct child_to_clean *p = children_to_clean;
                children_to_clean = p->next;
@@ -45,6 +47,23 @@ static void cleanup_children(int sig, int in_signal)
                }
 
                kill(p->pid, sig);
+
+               if (p->process->wait_after_clean) {
+                       p->next = children_to_wait_for;
+                       children_to_wait_for = p;
+               } else {
+                       if (!in_signal)
+                               free(p);
+               }
+       }
+
+       while (children_to_wait_for) {
+               struct child_to_clean *p = children_to_wait_for;
+               children_to_wait_for = p->next;
+
+               while (waitpid(p->pid, NULL, 0) < 0 && errno == EINTR)
+                       ; /* spin waiting for process exit or error */
+
                if (!in_signal)
                        free(p);
        }
@@ -852,8 +871,14 @@ const char *find_hook(const char *name)
 
        strbuf_reset(&path);
        strbuf_git_path(&path, "hooks/%s", name);
-       if (access(path.buf, X_OK) < 0)
+       if (access(path.buf, X_OK) < 0) {
+#ifdef STRIP_EXTENSION
+               strbuf_addstr(&path, STRIP_EXTENSION);
+               if (access(path.buf, X_OK) >= 0)
+                       return path.buf;
+#endif
                return NULL;
+       }
        return path.buf;
 }
 
index dd1c78c28db90b5261454dd8fae925faf4548e21..4fa8f65adbdcea4d007435d9c1d54c622df54474 100644 (file)
@@ -43,6 +43,7 @@ struct child_process {
        unsigned stdout_to_stderr:1;
        unsigned use_shell:1;
        unsigned clean_on_exit:1;
+       unsigned wait_after_clean:1;
        void (*clean_on_exit_handler)(struct child_process *process);
        void *clean_on_exit_handler_cbdata;
 };
index 30b10ba143959bf2618872427f730a9f0e30d369..1f729b053bbc6f544fe0b3e8736113082894b24d 100644 (file)
@@ -16,6 +16,9 @@
 #include "refs.h"
 #include "argv-array.h"
 #include "quote.h"
+#include "trailer.h"
+#include "log-tree.h"
+#include "wt-status.h"
 
 #define GIT_REFLOG_ACTION "GIT_REFLOG_ACTION"
 
@@ -27,59 +30,122 @@ GIT_PATH_FUNC(git_path_seq_dir, "sequencer")
 static GIT_PATH_FUNC(git_path_todo_file, "sequencer/todo")
 static GIT_PATH_FUNC(git_path_opts_file, "sequencer/opts")
 static GIT_PATH_FUNC(git_path_head_file, "sequencer/head")
+static GIT_PATH_FUNC(git_path_abort_safety_file, "sequencer/abort-safety")
 
+static GIT_PATH_FUNC(rebase_path, "rebase-merge")
+/*
+ * The file containing rebase commands, comments, and empty lines.
+ * This file is created by "git rebase -i" then edited by the user. As
+ * the lines are processed, they are removed from the front of this
+ * file and written to the tail of 'done'.
+ */
+static GIT_PATH_FUNC(rebase_path_todo, "rebase-merge/git-rebase-todo")
+/*
+ * The rebase command lines that have already been processed. A line
+ * is moved here when it is first handled, before any associated user
+ * actions.
+ */
+static GIT_PATH_FUNC(rebase_path_done, "rebase-merge/done")
+/*
+ * The file to keep track of how many commands were already processed (e.g.
+ * for the prompt).
+ */
+static GIT_PATH_FUNC(rebase_path_msgnum, "rebase-merge/msgnum");
+/*
+ * The file to keep track of how many commands are to be processed in total
+ * (e.g. for the prompt).
+ */
+static GIT_PATH_FUNC(rebase_path_msgtotal, "rebase-merge/end");
+/*
+ * The commit message that is planned to be used for any changes that
+ * need to be committed following a user interaction.
+ */
+static GIT_PATH_FUNC(rebase_path_message, "rebase-merge/message")
+/*
+ * The file into which is accumulated the suggested commit message for
+ * squash/fixup commands. When the first of a series of squash/fixups
+ * is seen, the file is created and the commit message from the
+ * previous commit and from the first squash/fixup commit are written
+ * to it. The commit message for each subsequent squash/fixup commit
+ * is appended to the file as it is processed.
+ *
+ * The first line of the file is of the form
+ *     # This is a combination of $count commits.
+ * where $count is the number of commits whose messages have been
+ * written to the file so far (including the initial "pick" commit).
+ * Each time that a commit message is processed, this line is read and
+ * updated. It is deleted just before the combined commit is made.
+ */
+static GIT_PATH_FUNC(rebase_path_squash_msg, "rebase-merge/message-squash")
+/*
+ * If the current series of squash/fixups has not yet included a squash
+ * command, then this file exists and holds the commit message of the
+ * original "pick" commit.  (If the series ends without a "squash"
+ * command, then this can be used as the commit message of the combined
+ * commit without opening the editor.)
+ */
+static GIT_PATH_FUNC(rebase_path_fixup_msg, "rebase-merge/message-fixup")
 /*
  * A script to set the GIT_AUTHOR_NAME, GIT_AUTHOR_EMAIL, and
  * GIT_AUTHOR_DATE that will be used for the commit that is currently
  * being rebased.
  */
 static GIT_PATH_FUNC(rebase_path_author_script, "rebase-merge/author-script")
+/*
+ * When an "edit" rebase command is being processed, the SHA1 of the
+ * commit to be edited is recorded in this file.  When "git rebase
+ * --continue" is executed, if there are any staged changes then they
+ * will be amended to the HEAD commit, but only provided the HEAD
+ * commit is still the commit to be edited.  When any other rebase
+ * command is processed, this file is deleted.
+ */
+static GIT_PATH_FUNC(rebase_path_amend, "rebase-merge/amend")
+/*
+ * When we stop at a given patch via the "edit" command, this file contains
+ * the abbreviated commit name of the corresponding patch.
+ */
+static GIT_PATH_FUNC(rebase_path_stopped_sha, "rebase-merge/stopped-sha")
+/*
+ * For the post-rewrite hook, we make a list of rewritten commits and
+ * their new sha1s.  The rewritten-pending list keeps the sha1s of
+ * commits that have been processed, but not committed yet,
+ * e.g. because they are waiting for a 'squash' command.
+ */
+static GIT_PATH_FUNC(rebase_path_rewritten_list, "rebase-merge/rewritten-list")
+static GIT_PATH_FUNC(rebase_path_rewritten_pending,
+       "rebase-merge/rewritten-pending")
 /*
  * The following files are written by git-rebase just after parsing the
  * command-line (and are only consumed, not modified, by the sequencer).
  */
 static GIT_PATH_FUNC(rebase_path_gpg_sign_opt, "rebase-merge/gpg_sign_opt")
+static GIT_PATH_FUNC(rebase_path_orig_head, "rebase-merge/orig-head")
+static GIT_PATH_FUNC(rebase_path_verbose, "rebase-merge/verbose")
+static GIT_PATH_FUNC(rebase_path_head_name, "rebase-merge/head-name")
+static GIT_PATH_FUNC(rebase_path_onto, "rebase-merge/onto")
+static GIT_PATH_FUNC(rebase_path_autostash, "rebase-merge/autostash")
+static GIT_PATH_FUNC(rebase_path_strategy, "rebase-merge/strategy")
+static GIT_PATH_FUNC(rebase_path_strategy_opts, "rebase-merge/strategy_opts")
 
-/* We will introduce the 'interactive rebase' mode later */
 static inline int is_rebase_i(const struct replay_opts *opts)
 {
-       return 0;
+       return opts->action == REPLAY_INTERACTIVE_REBASE;
 }
 
 static const char *get_dir(const struct replay_opts *opts)
 {
+       if (is_rebase_i(opts))
+               return rebase_path();
        return git_path_seq_dir();
 }
 
 static const char *get_todo_path(const struct replay_opts *opts)
 {
+       if (is_rebase_i(opts))
+               return rebase_path_todo();
        return git_path_todo_file();
 }
 
-static int is_rfc2822_line(const char *buf, int len)
-{
-       int i;
-
-       for (i = 0; i < len; i++) {
-               int ch = buf[i];
-               if (ch == ':')
-                       return 1;
-               if (!isalnum(ch) && ch != '-')
-                       break;
-       }
-
-       return 0;
-}
-
-static int is_cherry_picked_from_line(const char *buf, int len)
-{
-       /*
-        * We only care that it looks roughly like (cherry picked from ...)
-        */
-       return len > strlen(cherry_picked_prefix) + 1 &&
-               starts_with(buf, cherry_picked_prefix) && buf[len - 1] == ')';
-}
-
 /*
  * Returns 0 for non-conforming footer
  * Returns 1 for conforming footer
@@ -89,49 +155,25 @@ static int is_cherry_picked_from_line(const char *buf, int len)
 static int has_conforming_footer(struct strbuf *sb, struct strbuf *sob,
        int ignore_footer)
 {
-       char prev;
-       int i, k;
-       int len = sb->len - ignore_footer;
-       const char *buf = sb->buf;
-       int found_sob = 0;
-
-       /* footer must end with newline */
-       if (!len || buf[len - 1] != '\n')
-               return 0;
+       struct trailer_info info;
+       int i;
+       int found_sob = 0, found_sob_last = 0;
 
-       prev = '\0';
-       for (i = len - 1; i > 0; i--) {
-               char ch = buf[i];
-               if (prev == '\n' && ch == '\n') /* paragraph break */
-                       break;
-               prev = ch;
-       }
+       trailer_info_get(&info, sb->buf);
 
-       /* require at least one blank line */
-       if (prev != '\n' || buf[i] != '\n')
+       if (info.trailer_start == info.trailer_end)
                return 0;
 
-       /* advance to start of last paragraph */
-       while (i < len - 1 && buf[i] == '\n')
-               i++;
-
-       for (; i < len; i = k) {
-               int found_rfc2822;
-
-               for (k = i; k < len && buf[k] != '\n'; k++)
-                       ; /* do nothing */
-               k++;
+       for (i = 0; i < info.trailer_nr; i++)
+               if (sob && !strncmp(info.trailers[i], sob->buf, sob->len)) {
+                       found_sob = 1;
+                       if (i == info.trailer_nr - 1)
+                               found_sob_last = 1;
+               }
 
-               found_rfc2822 = is_rfc2822_line(buf + i, k - i - 1);
-               if (found_rfc2822 && sob &&
-                   !strncmp(buf + i, sob->buf, sob->len))
-                       found_sob = k;
+       trailer_info_release(&info);
 
-               if (!(found_rfc2822 ||
-                     is_cherry_picked_from_line(buf + i, k - i - 1)))
-                       return 0;
-       }
-       if (found_sob == i)
+       if (found_sob_last)
                return 3;
        if (found_sob)
                return 2;
@@ -168,7 +210,15 @@ int sequencer_remove_state(struct replay_opts *opts)
 
 static const char *action_name(const struct replay_opts *opts)
 {
-       return opts->action == REPLAY_REVERT ? N_("revert") : N_("cherry-pick");
+       switch (opts->action) {
+       case REPLAY_REVERT:
+               return N_("revert");
+       case REPLAY_PICK:
+               return N_("cherry-pick");
+       case REPLAY_INTERACTIVE_REBASE:
+               return N_("rebase -i");
+       }
+       die(_("Unknown action: %d"), opts->action);
 }
 
 struct commit_message {
@@ -310,6 +360,20 @@ static int error_dirty_index(struct replay_opts *opts)
        return -1;
 }
 
+static void update_abort_safety_file(void)
+{
+       struct object_id head;
+
+       /* Do nothing on a single-pick */
+       if (!file_exists(git_path_seq_dir()))
+               return;
+
+       if (!get_oid("HEAD", &head))
+               write_file(git_path_abort_safety_file(), "%s", oid_to_hex(&head));
+       else
+               write_file(git_path_abort_safety_file(), "%s", "");
+}
+
 static int fast_forward_to(const unsigned char *to, const unsigned char *from,
                        int unborn, struct replay_opts *opts)
 {
@@ -339,6 +403,7 @@ static int fast_forward_to(const unsigned char *to, const unsigned char *from,
        strbuf_release(&sb);
        strbuf_release(&err);
        ref_transaction_free(transaction);
+       update_abort_safety_file();
        return 0;
 }
 
@@ -370,7 +435,7 @@ static int do_recursive_merge(struct commit *base, struct commit *next,
        char **xopt;
        static struct lock_file index_lock;
 
-       hold_locked_index(&index_lock, 1);
+       hold_locked_index(&index_lock, LOCK_DIE_ON_ERROR);
 
        read_cache();
 
@@ -378,6 +443,8 @@ static int do_recursive_merge(struct commit *base, struct commit *next,
        o.ancestor = base ? base_label : "(empty tree)";
        o.branch1 = "HEAD";
        o.branch2 = next ? next_label : "(empty tree)";
+       if (is_rebase_i(opts))
+               o.buffer_output = 2;
 
        head_tree = parse_tree_indirect(head);
        next_tree = next ? next->tree : empty_tree();
@@ -389,13 +456,17 @@ static int do_recursive_merge(struct commit *base, struct commit *next,
        clean = merge_trees(&o,
                            head_tree,
                            next_tree, base_tree, &result);
+       if (is_rebase_i(opts) && clean <= 0)
+               fputs(o.obuf.buf, stdout);
        strbuf_release(&o.obuf);
        if (clean < 0)
                return clean;
 
        if (active_cache_changed &&
            write_locked_index(&the_index, &index_lock, COMMIT_LOCK))
-               /* TRANSLATORS: %s will be "revert" or "cherry-pick" */
+               /* TRANSLATORS: %s will be "revert", "cherry-pick" or
+                * "rebase -i".
+                */
                return error(_("%s: Unable to write new index file"),
                        _(action_name(opts)));
        rollback_lock_file(&index_lock);
@@ -440,19 +511,64 @@ static int is_index_unchanged(void)
        return !hashcmp(active_cache_tree->sha1, head_commit->tree->object.oid.hash);
 }
 
+static int write_author_script(const char *message)
+{
+       struct strbuf buf = STRBUF_INIT;
+       const char *eol;
+       int res;
+
+       for (;;)
+               if (!*message || starts_with(message, "\n")) {
+missing_author:
+                       /* Missing 'author' line? */
+                       unlink(rebase_path_author_script());
+                       return 0;
+               } else if (skip_prefix(message, "author ", &message))
+                       break;
+               else if ((eol = strchr(message, '\n')))
+                       message = eol + 1;
+               else
+                       goto missing_author;
+
+       strbuf_addstr(&buf, "GIT_AUTHOR_NAME='");
+       while (*message && *message != '\n' && *message != '\r')
+               if (skip_prefix(message, " <", &message))
+                       break;
+               else if (*message != '\'')
+                       strbuf_addch(&buf, *(message++));
+               else
+                       strbuf_addf(&buf, "'\\\\%c'", *(message++));
+       strbuf_addstr(&buf, "'\nGIT_AUTHOR_EMAIL='");
+       while (*message && *message != '\n' && *message != '\r')
+               if (skip_prefix(message, "> ", &message))
+                       break;
+               else if (*message != '\'')
+                       strbuf_addch(&buf, *(message++));
+               else
+                       strbuf_addf(&buf, "'\\\\%c'", *(message++));
+       strbuf_addstr(&buf, "'\nGIT_AUTHOR_DATE='@");
+       while (*message && *message != '\n' && *message != '\r')
+               if (*message != '\'')
+                       strbuf_addch(&buf, *(message++));
+               else
+                       strbuf_addf(&buf, "'\\\\%c'", *(message++));
+       res = write_message(buf.buf, buf.len, rebase_path_author_script(), 1);
+       strbuf_release(&buf);
+       return res;
+}
+
 /*
- * Read the author-script file into an environment block, ready for use in
- * run_command(), that can be free()d afterwards.
+ * Read a list of environment variable assignments (such as the author-script
+ * file) into an environment block. Returns -1 on error, 0 otherwise.
  */
-static char **read_author_script(void)
+static int read_env_script(struct argv_array *env)
 {
        struct strbuf script = STRBUF_INIT;
        int i, count = 0;
-       char *p, *p2, **env;
-       size_t env_size;
+       char *p, *p2;
 
        if (strbuf_read_file(&script, rebase_path_author_script(), 256) <= 0)
-               return NULL;
+               return -1;
 
        for (p = script.buf; *p; p++)
                if (skip_prefix(p, "'\\\\''", (const char **)&p2))
@@ -464,19 +580,12 @@ static char **read_author_script(void)
                        count++;
                }
 
-       env_size = (count + 1) * sizeof(*env);
-       strbuf_grow(&script, env_size);
-       memmove(script.buf + env_size, script.buf, script.len);
-       p = script.buf + env_size;
-       env = (char **)strbuf_detach(&script, NULL);
-
-       for (i = 0; i < count; i++) {
-               env[i] = p;
+       for (i = 0, p = script.buf; i < count; i++) {
+               argv_array_push(env, p);
                p += strlen(p) + 1;
        }
-       env[count] = NULL;
 
-       return env;
+       return 0;
 }
 
 static const char staged_changes_advice[] =
@@ -509,14 +618,18 @@ static int run_git_commit(const char *defmsg, struct replay_opts *opts,
                          int allow_empty, int edit, int amend,
                          int cleanup_commit_message)
 {
-       char **env = NULL;
-       struct argv_array array;
-       int rc;
+       struct child_process cmd = CHILD_PROCESS_INIT;
        const char *value;
 
+       cmd.git_cmd = 1;
+
        if (is_rebase_i(opts)) {
-               env = read_author_script();
-               if (!env) {
+               if (!edit) {
+                       cmd.stdout_to_stderr = 1;
+                       cmd.err = -1;
+               }
+
+               if (read_env_script(&cmd.env_array)) {
                        const char *gpg_opt = gpg_sign_opt_quoted(opts);
 
                        return error(_(staged_changes_advice),
@@ -524,39 +637,47 @@ static int run_git_commit(const char *defmsg, struct replay_opts *opts,
                }
        }
 
-       argv_array_init(&array);
-       argv_array_push(&array, "commit");
-       argv_array_push(&array, "-n");
+       argv_array_push(&cmd.args, "commit");
+       argv_array_push(&cmd.args, "-n");
 
        if (amend)
-               argv_array_push(&array, "--amend");
+               argv_array_push(&cmd.args, "--amend");
        if (opts->gpg_sign)
-               argv_array_pushf(&array, "-S%s", opts->gpg_sign);
+               argv_array_pushf(&cmd.args, "-S%s", opts->gpg_sign);
        if (opts->signoff)
-               argv_array_push(&array, "-s");
+               argv_array_push(&cmd.args, "-s");
        if (defmsg)
-               argv_array_pushl(&array, "-F", defmsg, NULL);
+               argv_array_pushl(&cmd.args, "-F", defmsg, NULL);
        if (cleanup_commit_message)
-               argv_array_push(&array, "--cleanup=strip");
+               argv_array_push(&cmd.args, "--cleanup=strip");
        if (edit)
-               argv_array_push(&array, "-e");
+               argv_array_push(&cmd.args, "-e");
        else if (!cleanup_commit_message &&
                 !opts->signoff && !opts->record_origin &&
                 git_config_get_value("commit.cleanup", &value))
-               argv_array_push(&array, "--cleanup=verbatim");
+               argv_array_push(&cmd.args, "--cleanup=verbatim");
 
        if (allow_empty)
-               argv_array_push(&array, "--allow-empty");
+               argv_array_push(&cmd.args, "--allow-empty");
 
        if (opts->allow_empty_message)
-               argv_array_push(&array, "--allow-empty-message");
+               argv_array_push(&cmd.args, "--allow-empty-message");
 
-       rc = run_command_v_opt_cd_env(array.argv, RUN_GIT_CMD, NULL,
-                       (const char *const *)env);
-       argv_array_clear(&array);
-       free(env);
+       if (cmd.err == -1) {
+               /* hide stderr on success */
+               struct strbuf buf = STRBUF_INIT;
+               int rc = pipe_command(&cmd,
+                                     NULL, 0,
+                                     /* stdout is already redirected */
+                                     NULL, 0,
+                                     &buf, 0);
+               if (rc)
+                       fputs(buf.buf, stderr);
+               strbuf_release(&buf);
+               return rc;
+       }
 
-       return rc;
+       return run_command(&cmd);
 }
 
 static int is_original_commit_empty(struct commit *commit)
@@ -617,33 +738,202 @@ static int allow_empty(struct replay_opts *opts, struct commit *commit)
                return 1;
 }
 
+/*
+ * Note that ordering matters in this enum. Not only must it match the mapping
+ * below, it is also divided into several sections that matter.  When adding
+ * new commands, make sure you add it in the right section.
+ */
 enum todo_command {
+       /* commands that handle commits */
        TODO_PICK = 0,
-       TODO_REVERT
+       TODO_REVERT,
+       TODO_EDIT,
+       TODO_REWORD,
+       TODO_FIXUP,
+       TODO_SQUASH,
+       /* commands that do something else than handling a single commit */
+       TODO_EXEC,
+       /* commands that do nothing but are counted for reporting progress */
+       TODO_NOOP,
+       TODO_DROP,
+       /* comments (not counted for reporting progress) */
+       TODO_COMMENT
 };
 
-static const char *todo_command_strings[] = {
-       "pick",
-       "revert"
+static struct {
+       char c;
+       const char *str;
+} todo_command_info[] = {
+       { 'p', "pick" },
+       { 0,   "revert" },
+       { 'e', "edit" },
+       { 'r', "reword" },
+       { 'f', "fixup" },
+       { 's', "squash" },
+       { 'x', "exec" },
+       { 0,   "noop" },
+       { 'd', "drop" },
+       { 0,   NULL }
 };
 
 static const char *command_to_string(const enum todo_command command)
 {
-       if ((size_t)command < ARRAY_SIZE(todo_command_strings))
-               return todo_command_strings[command];
+       if (command < TODO_COMMENT)
+               return todo_command_info[command].str;
        die("Unknown command: %d", command);
 }
 
+static int is_noop(const enum todo_command command)
+{
+       return TODO_NOOP <= command;
+}
+
+static int is_fixup(enum todo_command command)
+{
+       return command == TODO_FIXUP || command == TODO_SQUASH;
+}
+
+static int update_squash_messages(enum todo_command command,
+               struct commit *commit, struct replay_opts *opts)
+{
+       struct strbuf buf = STRBUF_INIT;
+       int count, res;
+       const char *message, *body;
+
+       if (file_exists(rebase_path_squash_msg())) {
+               struct strbuf header = STRBUF_INIT;
+               char *eol, *p;
+
+               if (strbuf_read_file(&buf, rebase_path_squash_msg(), 2048) <= 0)
+                       return error(_("could not read '%s'"),
+                               rebase_path_squash_msg());
+
+               p = buf.buf + 1;
+               eol = strchrnul(buf.buf, '\n');
+               if (buf.buf[0] != comment_line_char ||
+                   (p += strcspn(p, "0123456789\n")) == eol)
+                       return error(_("unexpected 1st line of squash message:"
+                                      "\n\n\t%.*s"),
+                                    (int)(eol - buf.buf), buf.buf);
+               count = strtol(p, NULL, 10);
+
+               if (count < 1)
+                       return error(_("invalid 1st line of squash message:\n"
+                                      "\n\t%.*s"),
+                                    (int)(eol - buf.buf), buf.buf);
+
+               strbuf_addf(&header, "%c ", comment_line_char);
+               strbuf_addf(&header,
+                           _("This is a combination of %d commits."), ++count);
+               strbuf_splice(&buf, 0, eol - buf.buf, header.buf, header.len);
+               strbuf_release(&header);
+       } else {
+               unsigned char head[20];
+               struct commit *head_commit;
+               const char *head_message, *body;
+
+               if (get_sha1("HEAD", head))
+                       return error(_("need a HEAD to fixup"));
+               if (!(head_commit = lookup_commit_reference(head)))
+                       return error(_("could not read HEAD"));
+               if (!(head_message = get_commit_buffer(head_commit, NULL)))
+                       return error(_("could not read HEAD's commit message"));
+
+               find_commit_subject(head_message, &body);
+               if (write_message(body, strlen(body),
+                                 rebase_path_fixup_msg(), 0)) {
+                       unuse_commit_buffer(head_commit, head_message);
+                       return error(_("cannot write '%s'"),
+                                    rebase_path_fixup_msg());
+               }
+
+               count = 2;
+               strbuf_addf(&buf, "%c ", comment_line_char);
+               strbuf_addf(&buf, _("This is a combination of %d commits."),
+                           count);
+               strbuf_addf(&buf, "\n%c ", comment_line_char);
+               strbuf_addstr(&buf, _("This is the 1st commit message:"));
+               strbuf_addstr(&buf, "\n\n");
+               strbuf_addstr(&buf, body);
+
+               unuse_commit_buffer(head_commit, head_message);
+       }
+
+       if (!(message = get_commit_buffer(commit, NULL)))
+               return error(_("could not read commit message of %s"),
+                            oid_to_hex(&commit->object.oid));
+       find_commit_subject(message, &body);
+
+       if (command == TODO_SQUASH) {
+               unlink(rebase_path_fixup_msg());
+               strbuf_addf(&buf, "\n%c ", comment_line_char);
+               strbuf_addf(&buf, _("This is the commit message #%d:"), count);
+               strbuf_addstr(&buf, "\n\n");
+               strbuf_addstr(&buf, body);
+       } else if (command == TODO_FIXUP) {
+               strbuf_addf(&buf, "\n%c ", comment_line_char);
+               strbuf_addf(&buf, _("The commit message #%d will be skipped:"),
+                           count);
+               strbuf_addstr(&buf, "\n\n");
+               strbuf_add_commented_lines(&buf, body, strlen(body));
+       } else
+               return error(_("unknown command: %d"), command);
+       unuse_commit_buffer(commit, message);
+
+       res = write_message(buf.buf, buf.len, rebase_path_squash_msg(), 0);
+       strbuf_release(&buf);
+       return res;
+}
+
+static void flush_rewritten_pending(void) {
+       struct strbuf buf = STRBUF_INIT;
+       unsigned char newsha1[20];
+       FILE *out;
+
+       if (strbuf_read_file(&buf, rebase_path_rewritten_pending(), 82) > 0 &&
+                       !get_sha1("HEAD", newsha1) &&
+                       (out = fopen(rebase_path_rewritten_list(), "a"))) {
+               char *bol = buf.buf, *eol;
+
+               while (*bol) {
+                       eol = strchrnul(bol, '\n');
+                       fprintf(out, "%.*s %s\n", (int)(eol - bol),
+                                       bol, sha1_to_hex(newsha1));
+                       if (!*eol)
+                               break;
+                       bol = eol + 1;
+               }
+               fclose(out);
+               unlink(rebase_path_rewritten_pending());
+       }
+       strbuf_release(&buf);
+}
+
+static void record_in_rewritten(struct object_id *oid,
+               enum todo_command next_command) {
+       FILE *out = fopen(rebase_path_rewritten_pending(), "a");
+
+       if (!out)
+               return;
+
+       fprintf(out, "%s\n", oid_to_hex(oid));
+       fclose(out);
+
+       if (!is_fixup(next_command))
+               flush_rewritten_pending();
+}
 
 static int do_pick_commit(enum todo_command command, struct commit *commit,
-               struct replay_opts *opts)
+               struct replay_opts *opts, int final_fixup)
 {
+       int edit = opts->edit, cleanup_commit_message = 0;
+       const char *msg_file = edit ? NULL : git_path_merge_msg();
        unsigned char head[20];
        struct commit *base, *next, *parent;
        const char *base_label, *next_label;
        struct commit_message msg = { NULL, NULL, NULL, NULL };
        struct strbuf msgbuf = STRBUF_INIT;
-       int res, unborn = 0, allow;
+       int res, unborn = 0, amend = 0, allow = 0;
 
        if (opts->no_commit) {
                /*
@@ -663,9 +953,8 @@ static int do_pick_commit(enum todo_command command, struct commit *commit,
        }
        discard_cache();
 
-       if (!commit->parents) {
+       if (!commit->parents)
                parent = NULL;
-       }
        else if (commit->parents->next) {
                /* Reverting or cherry-picking a merge commit */
                int cnt;
@@ -689,11 +978,23 @@ static int do_pick_commit(enum todo_command command, struct commit *commit,
        else
                parent = commit->parents->item;
 
-       if (opts->allow_ff &&
-           ((parent && !hashcmp(parent->object.oid.hash, head)) ||
-            (!parent && unborn)))
-               return fast_forward_to(commit->object.oid.hash, head, unborn, opts);
+       if (get_message(commit, &msg) != 0)
+               return error(_("cannot get commit message for %s"),
+                       oid_to_hex(&commit->object.oid));
 
+       if (opts->allow_ff && !is_fixup(command) &&
+           ((parent && !hashcmp(parent->object.oid.hash, head)) ||
+            (!parent && unborn))) {
+               if (is_rebase_i(opts))
+                       write_author_script(msg.message);
+               res = fast_forward_to(commit->object.oid.hash, head, unborn,
+                       opts);
+               if (res || command != TODO_REWORD)
+                       goto leave;
+               edit = amend = 1;
+               msg_file = NULL;
+               goto fast_forward_edit;
+       }
        if (parent && parse_commit(parent) < 0)
                /* TRANSLATORS: The first %s will be a "todo" command like
                   "revert" or "pick", the second %s a SHA1. */
@@ -701,10 +1002,6 @@ static int do_pick_commit(enum todo_command command, struct commit *commit,
                        command_to_string(command),
                        oid_to_hex(&parent->object.oid));
 
-       if (get_message(commit, &msg) != 0)
-               return error(_("cannot get commit message for %s"),
-                       oid_to_hex(&commit->object.oid));
-
        /*
         * "commit" is an existing commit.  We would want to apply
         * the difference it introduces since its first parent "prev"
@@ -735,14 +1032,9 @@ static int do_pick_commit(enum todo_command command, struct commit *commit,
                next = commit;
                next_label = msg.label;
 
-               /*
-                * Append the commit log message to msgbuf; it starts
-                * after the tree, parent, author, committer
-                * information followed by "\n\n".
-                */
-               p = strstr(msg.message, "\n\n");
-               if (p)
-                       strbuf_addstr(&msgbuf, skip_blank_lines(p + 2));
+               /* Append the commit log message to msgbuf. */
+               if (find_commit_subject(msg.message, &p))
+                       strbuf_addstr(&msgbuf, p);
 
                if (opts->record_origin) {
                        if (!has_conforming_footer(&msgbuf, NULL, 0))
@@ -753,7 +1045,32 @@ static int do_pick_commit(enum todo_command command, struct commit *commit,
                }
        }
 
-       if (!opts->strategy || !strcmp(opts->strategy, "recursive") || command == TODO_REVERT) {
+       if (command == TODO_REWORD)
+               edit = 1;
+       else if (is_fixup(command)) {
+               if (update_squash_messages(command, commit, opts))
+                       return -1;
+               amend = 1;
+               if (!final_fixup)
+                       msg_file = rebase_path_squash_msg();
+               else if (file_exists(rebase_path_fixup_msg())) {
+                       cleanup_commit_message = 1;
+                       msg_file = rebase_path_fixup_msg();
+               } else {
+                       const char *dest = git_path("SQUASH_MSG");
+                       unlink(dest);
+                       if (copy_file(dest, rebase_path_squash_msg(), 0666))
+                               return error(_("could not rename '%s' to '%s'"),
+                                            rebase_path_squash_msg(), dest);
+                       unlink(git_path("MERGE_MSG"));
+                       msg_file = dest;
+                       edit = 1;
+               }
+       }
+
+       if (is_rebase_i(opts) && write_author_script(msg.message) < 0)
+               res = -1;
+       else if (!opts->strategy || !strcmp(opts->strategy, "recursive") || command == TODO_REVERT) {
                res = do_recursive_merge(base, next, base_label, next_label,
                                         head, &msgbuf, opts);
                if (res < 0)
@@ -808,11 +1125,18 @@ static int do_pick_commit(enum todo_command command, struct commit *commit,
                goto leave;
        }
        if (!opts->no_commit)
-               res = run_git_commit(opts->edit ? NULL : git_path_merge_msg(),
-                                    opts, allow, opts->edit, 0, 0);
+fast_forward_edit:
+               res = run_git_commit(msg_file, opts, allow, edit, amend,
+                                    cleanup_commit_message);
+
+       if (!res && final_fixup) {
+               unlink(rebase_path_fixup_msg());
+               unlink(rebase_path_squash_msg());
+       }
 
 leave:
        free_message(commit, &msg);
+       update_abort_safety_file();
 
        return res;
 }
@@ -867,6 +1191,7 @@ struct todo_list {
        struct strbuf buf;
        struct todo_item *items;
        int nr, alloc, current;
+       int done_nr, total_nr;
 };
 
 #define TODO_LIST_INIT { STRBUF_INIT }
@@ -894,20 +1219,45 @@ static int parse_insn_line(struct todo_item *item, const char *bol, char *eol)
        /* left-trim */
        bol += strspn(bol, " \t");
 
-       for (i = 0; i < ARRAY_SIZE(todo_command_strings); i++)
-               if (skip_prefix(bol, todo_command_strings[i], &bol)) {
+       if (bol == eol || *bol == '\r' || *bol == comment_line_char) {
+               item->command = TODO_COMMENT;
+               item->commit = NULL;
+               item->arg = bol;
+               item->arg_len = eol - bol;
+               return 0;
+       }
+
+       for (i = 0; i < TODO_COMMENT; i++)
+               if (skip_prefix(bol, todo_command_info[i].str, &bol)) {
+                       item->command = i;
+                       break;
+               } else if (bol[1] == ' ' && *bol == todo_command_info[i].c) {
+                       bol++;
                        item->command = i;
                        break;
                }
-       if (i >= ARRAY_SIZE(todo_command_strings))
+       if (i >= TODO_COMMENT)
                return -1;
 
+       if (item->command == TODO_NOOP) {
+               item->commit = NULL;
+               item->arg = bol;
+               item->arg_len = eol - bol;
+               return 0;
+       }
+
        /* Eat up extra spaces/ tabs before object name */
        padding = strspn(bol, " \t");
        if (!padding)
                return -1;
        bol += padding;
 
+       if (item->command == TODO_EXEC) {
+               item->arg = bol;
+               item->arg_len = (int)(eol - bol);
+               return 0;
+       }
+
        end_of_object_name = (char *) bol + strcspn(bol, " \t\n");
        saved = *end_of_object_name;
        *end_of_object_name = '\0';
@@ -928,7 +1278,7 @@ static int parse_insn_buffer(char *buf, struct todo_list *todo_list)
 {
        struct todo_item *item;
        char *p = buf, *next_p;
-       int i, res = 0;
+       int i, res = 0, fixup_okay = file_exists(rebase_path_done());
 
        for (i = 1; *p; i++, p = next_p) {
                char *eol = strchrnul(p, '\n');
@@ -943,14 +1293,32 @@ static int parse_insn_buffer(char *buf, struct todo_list *todo_list)
                if (parse_insn_line(item, p, eol)) {
                        res = error(_("invalid line %d: %.*s"),
                                i, (int)(eol - p), p);
-                       item->command = -1;
+                       item->command = TODO_NOOP;
                }
+
+               if (fixup_okay)
+                       ; /* do nothing */
+               else if (is_fixup(item->command))
+                       return error(_("cannot '%s' without a previous commit"),
+                               command_to_string(item->command));
+               else if (!is_noop(item->command))
+                       fixup_okay = 1;
        }
-       if (!todo_list->nr)
-               return error(_("no commits parsed."));
+
        return res;
 }
 
+static int count_commands(struct todo_list *todo_list)
+{
+       int count = 0, i;
+
+       for (i = 0; i < todo_list->nr; i++)
+               if (todo_list->items[i].command != TODO_COMMENT)
+                       count++;
+
+       return count;
+}
+
 static int read_populate_todo(struct todo_list *todo_list,
                        struct replay_opts *opts)
 {
@@ -968,8 +1336,16 @@ static int read_populate_todo(struct todo_list *todo_list,
        close(fd);
 
        res = parse_insn_buffer(todo_list->buf.buf, todo_list);
-       if (res)
+       if (res) {
+               if (is_rebase_i(opts))
+                       return error(_("please fix this using "
+                                      "'git rebase --edit-todo'."));
                return error(_("unusable instruction sheet: '%s'"), todo_file);
+       }
+
+       if (!todo_list->nr &&
+           (!is_rebase_i(opts) || !file_exists(rebase_path_done())))
+               return error(_("no commits parsed."));
 
        if (!is_rebase_i(opts)) {
                enum todo_command valid =
@@ -985,6 +1361,26 @@ static int read_populate_todo(struct todo_list *todo_list,
                                return error(_("cannot revert during a cherry-pick."));
        }
 
+       if (is_rebase_i(opts)) {
+               struct todo_list done = TODO_LIST_INIT;
+               FILE *f = fopen(rebase_path_msgtotal(), "w");
+
+               if (strbuf_read_file(&done.buf, rebase_path_done(), 0) > 0 &&
+                               !parse_insn_buffer(done.buf.buf, &done))
+                       todo_list->done_nr = count_commands(&done);
+               else
+                       todo_list->done_nr = 0;
+
+               todo_list->total_nr = todo_list->done_nr
+                       + count_commands(todo_list);
+               todo_list_release(&done);
+
+               if (f) {
+                       fprintf(f, "%d\n", todo_list->total_nr);
+                       fclose(f);
+               }
+       }
+
        return 0;
 }
 
@@ -1033,6 +1429,26 @@ static int populate_opts_cb(const char *key, const char *value, void *data)
        return 0;
 }
 
+static void read_strategy_opts(struct replay_opts *opts, struct strbuf *buf)
+{
+       int i;
+
+       strbuf_reset(buf);
+       if (!read_oneliner(buf, rebase_path_strategy(), 0))
+               return;
+       opts->strategy = strbuf_detach(buf, NULL);
+       if (!read_oneliner(buf, rebase_path_strategy_opts(), 0))
+               return;
+
+       opts->xopts_nr = split_cmdline(buf->buf, (const char ***)&opts->xopts);
+       for (i = 0; i < opts->xopts_nr; i++) {
+               const char *arg = opts->xopts[i];
+
+               skip_prefix(arg, "--", &arg);
+               opts->xopts[i] = xstrdup(arg);
+       }
+}
+
 static int read_populate_opts(struct replay_opts *opts)
 {
        if (is_rebase_i(opts)) {
@@ -1046,6 +1462,11 @@ static int read_populate_opts(struct replay_opts *opts)
                                opts->gpg_sign = xstrdup(buf.buf + 2);
                        }
                }
+
+               if (file_exists(rebase_path_verbose()))
+                       opts->verbose = 1;
+
+               read_strategy_opts(opts, &buf);
                strbuf_release(&buf);
 
                return 0;
@@ -1070,7 +1491,7 @@ static int walk_revs_populate_todo(struct todo_list *todo_list,
 {
        enum todo_command command = opts->action == REPLAY_PICK ?
                TODO_PICK : TODO_REVERT;
-       const char *command_string = todo_command_strings[command];
+       const char *command_string = todo_command_info[command].str;
        struct commit *commit;
 
        if (prepare_revs(opts))
@@ -1101,8 +1522,7 @@ static int create_seq_dir(void)
                error(_("a cherry-pick or revert is already in progress"));
                advise(_("try \"git cherry-pick (--continue | --quit | --abort)\""));
                return -1;
-       }
-       else if (mkdir(git_path_seq_dir(), 0777) < 0)
+       } else if (mkdir(git_path_seq_dir(), 0777) < 0)
                return error_errno(_("could not create sequencer directory '%s'"),
                                   git_path_seq_dir());
        return 0;
@@ -1132,9 +1552,34 @@ static int save_head(const char *head)
        return 0;
 }
 
+static int rollback_is_safe(void)
+{
+       struct strbuf sb = STRBUF_INIT;
+       struct object_id expected_head, actual_head;
+
+       if (strbuf_read_file(&sb, git_path_abort_safety_file(), 0) >= 0) {
+               strbuf_trim(&sb);
+               if (get_oid_hex(sb.buf, &expected_head)) {
+                       strbuf_release(&sb);
+                       die(_("could not parse %s"), git_path_abort_safety_file());
+               }
+               strbuf_release(&sb);
+       }
+       else if (errno == ENOENT)
+               oidclr(&expected_head);
+       else
+               die_errno(_("could not read '%s'"), git_path_abort_safety_file());
+
+       if (get_oid("HEAD", &actual_head))
+               oidclr(&actual_head);
+
+       return !oidcmp(&actual_head, &expected_head);
+}
+
 static int reset_for_rollback(const unsigned char *sha1)
 {
        const char *argv[4];    /* reset --merge <arg> + NULL */
+
        argv[0] = "reset";
        argv[1] = "--merge";
        argv[2] = sha1_to_hex(sha1);
@@ -1189,6 +1634,12 @@ int sequencer_rollback(struct replay_opts *opts)
                error(_("cannot abort from a branch yet to be born"));
                goto fail;
        }
+
+       if (!rollback_is_safe()) {
+               /* Do not error, just do not rollback */
+               warning(_("You seem to have moved HEAD. "
+                         "Not rewinding, check your HEAD!"));
+       } else
        if (reset_for_rollback(sha1))
                goto fail;
        strbuf_release(&buf);
@@ -1204,6 +1655,13 @@ static int save_todo(struct todo_list *todo_list, struct replay_opts *opts)
        const char *todo_path = get_todo_path(opts);
        int next = todo_list->current, offset, fd;
 
+       /*
+        * rebase -i writes "git-rebase-todo" without the currently executing
+        * command, appending it to "done" instead.
+        */
+       if (is_rebase_i(opts))
+               next++;
+
        fd = hold_lock_file_for_update(&todo_lock, todo_path, 0);
        if (fd < 0)
                return error_errno(_("could not lock '%s'"), todo_path);
@@ -1214,6 +1672,23 @@ static int save_todo(struct todo_list *todo_list, struct replay_opts *opts)
                return error_errno(_("could not write to '%s'"), todo_path);
        if (commit_lock_file(&todo_lock) < 0)
                return error(_("failed to finalize '%s'."), todo_path);
+
+       if (is_rebase_i(opts)) {
+               const char *done_path = rebase_path_done();
+               int fd = open(done_path, O_CREAT | O_WRONLY | O_APPEND, 0666);
+               int prev_offset = !next ? 0 :
+                       todo_list->items[next - 1].offset_in_buf;
+
+               if (fd >= 0 && offset > prev_offset &&
+                   write_in_full(fd, todo_list->buf.buf + prev_offset,
+                                 offset - prev_offset) < 0) {
+                       close(fd);
+                       return error_errno(_("could not write to '%s'"),
+                                          done_path);
+               }
+               if (fd >= 0)
+                       close(fd);
+       }
        return 0;
 }
 
@@ -1252,9 +1727,228 @@ static int save_opts(struct replay_opts *opts)
        return res;
 }
 
+static int make_patch(struct commit *commit, struct replay_opts *opts)
+{
+       struct strbuf buf = STRBUF_INIT;
+       struct rev_info log_tree_opt;
+       const char *subject, *p;
+       int res = 0;
+
+       p = short_commit_name(commit);
+       if (write_message(p, strlen(p), rebase_path_stopped_sha(), 1) < 0)
+               return -1;
+
+       strbuf_addf(&buf, "%s/patch", get_dir(opts));
+       memset(&log_tree_opt, 0, sizeof(log_tree_opt));
+       init_revisions(&log_tree_opt, NULL);
+       log_tree_opt.abbrev = 0;
+       log_tree_opt.diff = 1;
+       log_tree_opt.diffopt.output_format = DIFF_FORMAT_PATCH;
+       log_tree_opt.disable_stdin = 1;
+       log_tree_opt.no_commit_id = 1;
+       log_tree_opt.diffopt.file = fopen(buf.buf, "w");
+       log_tree_opt.diffopt.use_color = GIT_COLOR_NEVER;
+       if (!log_tree_opt.diffopt.file)
+               res |= error_errno(_("could not open '%s'"), buf.buf);
+       else {
+               res |= log_tree_commit(&log_tree_opt, commit);
+               fclose(log_tree_opt.diffopt.file);
+       }
+       strbuf_reset(&buf);
+
+       strbuf_addf(&buf, "%s/message", get_dir(opts));
+       if (!file_exists(buf.buf)) {
+               const char *commit_buffer = get_commit_buffer(commit, NULL);
+               find_commit_subject(commit_buffer, &subject);
+               res |= write_message(subject, strlen(subject), buf.buf, 1);
+               unuse_commit_buffer(commit, commit_buffer);
+       }
+       strbuf_release(&buf);
+
+       return res;
+}
+
+static int intend_to_amend(void)
+{
+       unsigned char head[20];
+       char *p;
+
+       if (get_sha1("HEAD", head))
+               return error(_("cannot read HEAD"));
+
+       p = sha1_to_hex(head);
+       return write_message(p, strlen(p), rebase_path_amend(), 1);
+}
+
+static int error_with_patch(struct commit *commit,
+       const char *subject, int subject_len,
+       struct replay_opts *opts, int exit_code, int to_amend)
+{
+       if (make_patch(commit, opts))
+               return -1;
+
+       if (to_amend) {
+               if (intend_to_amend())
+                       return -1;
+
+               fprintf(stderr, "You can amend the commit now, with\n"
+                       "\n"
+                       "  git commit --amend %s\n"
+                       "\n"
+                       "Once you are satisfied with your changes, run\n"
+                       "\n"
+                       "  git rebase --continue\n", gpg_sign_opt_quoted(opts));
+       } else if (exit_code)
+               fprintf(stderr, "Could not apply %s... %.*s\n",
+                       short_commit_name(commit), subject_len, subject);
+
+       return exit_code;
+}
+
+static int error_failed_squash(struct commit *commit,
+       struct replay_opts *opts, int subject_len, const char *subject)
+{
+       if (rename(rebase_path_squash_msg(), rebase_path_message()))
+               return error(_("could not rename '%s' to '%s'"),
+                       rebase_path_squash_msg(), rebase_path_message());
+       unlink(rebase_path_fixup_msg());
+       unlink(git_path("MERGE_MSG"));
+       if (copy_file(git_path("MERGE_MSG"), rebase_path_message(), 0666))
+               return error(_("could not copy '%s' to '%s'"),
+                            rebase_path_message(), git_path("MERGE_MSG"));
+       return error_with_patch(commit, subject, subject_len, opts, 1, 0);
+}
+
+static int do_exec(const char *command_line)
+{
+       const char *child_argv[] = { NULL, NULL };
+       int dirty, status;
+
+       fprintf(stderr, "Executing: %s\n", command_line);
+       child_argv[0] = command_line;
+       status = run_command_v_opt(child_argv, RUN_USING_SHELL);
+
+       /* force re-reading of the cache */
+       if (discard_cache() < 0 || read_cache() < 0)
+               return error(_("could not read index"));
+
+       dirty = require_clean_work_tree("rebase", NULL, 1, 1);
+
+       if (status) {
+               warning(_("execution failed: %s\n%s"
+                         "You can fix the problem, and then run\n"
+                         "\n"
+                         "  git rebase --continue\n"
+                         "\n"),
+                       command_line,
+                       dirty ? N_("and made changes to the index and/or the "
+                               "working tree\n") : "");
+               if (status == 127)
+                       /* command not found */
+                       status = 1;
+       } else if (dirty) {
+               warning(_("execution succeeded: %s\nbut "
+                         "left changes to the index and/or the working tree\n"
+                         "Commit or stash your changes, and then run\n"
+                         "\n"
+                         "  git rebase --continue\n"
+                         "\n"), command_line);
+               status = 1;
+       }
+
+       return status;
+}
+
+static int is_final_fixup(struct todo_list *todo_list)
+{
+       int i = todo_list->current;
+
+       if (!is_fixup(todo_list->items[i].command))
+               return 0;
+
+       while (++i < todo_list->nr)
+               if (is_fixup(todo_list->items[i].command))
+                       return 0;
+               else if (!is_noop(todo_list->items[i].command))
+                       break;
+       return 1;
+}
+
+static enum todo_command peek_command(struct todo_list *todo_list, int offset)
+{
+       int i;
+
+       for (i = todo_list->current + offset; i < todo_list->nr; i++)
+               if (!is_noop(todo_list->items[i].command))
+                       return todo_list->items[i].command;
+
+       return -1;
+}
+
+static int apply_autostash(struct replay_opts *opts)
+{
+       struct strbuf stash_sha1 = STRBUF_INIT;
+       struct child_process child = CHILD_PROCESS_INIT;
+       int ret = 0;
+
+       if (!read_oneliner(&stash_sha1, rebase_path_autostash(), 1)) {
+               strbuf_release(&stash_sha1);
+               return 0;
+       }
+       strbuf_trim(&stash_sha1);
+
+       child.git_cmd = 1;
+       argv_array_push(&child.args, "stash");
+       argv_array_push(&child.args, "apply");
+       argv_array_push(&child.args, stash_sha1.buf);
+       if (!run_command(&child))
+               printf(_("Applied autostash."));
+       else {
+               struct child_process store = CHILD_PROCESS_INIT;
+
+               store.git_cmd = 1;
+               argv_array_push(&store.args, "stash");
+               argv_array_push(&store.args, "store");
+               argv_array_push(&store.args, "-m");
+               argv_array_push(&store.args, "autostash");
+               argv_array_push(&store.args, "-q");
+               argv_array_push(&store.args, stash_sha1.buf);
+               if (run_command(&store))
+                       ret = error(_("cannot store %s"), stash_sha1.buf);
+               else
+                       printf(_("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"));
+       }
+
+       strbuf_release(&stash_sha1);
+       return ret;
+}
+
+static const char *reflog_message(struct replay_opts *opts,
+       const char *sub_action, const char *fmt, ...)
+{
+       va_list ap;
+       static struct strbuf buf = STRBUF_INIT;
+
+       va_start(ap, fmt);
+       strbuf_reset(&buf);
+       strbuf_addstr(&buf, action_name(opts));
+       if (sub_action)
+               strbuf_addf(&buf, " (%s)", sub_action);
+       if (fmt) {
+               strbuf_addstr(&buf, ": ");
+               strbuf_vaddf(&buf, fmt, ap);
+       }
+       va_end(ap);
+
+       return buf.buf;
+}
+
 static int pick_commits(struct todo_list *todo_list, struct replay_opts *opts)
 {
-       int res;
+       int res = 0;
 
        setenv(GIT_REFLOG_ACTION, action_name(opts), 0);
        if (opts->allow_ff)
@@ -1267,12 +1961,179 @@ static int pick_commits(struct todo_list *todo_list, struct replay_opts *opts)
                struct todo_item *item = todo_list->items + todo_list->current;
                if (save_todo(todo_list, opts))
                        return -1;
-               res = do_pick_commit(item->command, item->commit, opts);
+               if (is_rebase_i(opts)) {
+                       if (item->command != TODO_COMMENT) {
+                               FILE *f = fopen(rebase_path_msgnum(), "w");
+
+                               todo_list->done_nr++;
+
+                               if (f) {
+                                       fprintf(f, "%d\n", todo_list->done_nr);
+                                       fclose(f);
+                               }
+                               fprintf(stderr, "Rebasing (%d/%d)%s",
+                                       todo_list->done_nr,
+                                       todo_list->total_nr,
+                                       opts->verbose ? "\n" : "\r");
+                       }
+                       unlink(rebase_path_message());
+                       unlink(rebase_path_author_script());
+                       unlink(rebase_path_stopped_sha());
+                       unlink(rebase_path_amend());
+               }
+               if (item->command <= TODO_SQUASH) {
+                       if (is_rebase_i(opts))
+                               setenv("GIT_REFLOG_ACTION", reflog_message(opts,
+                                       command_to_string(item->command), NULL),
+                                       1);
+                       res = do_pick_commit(item->command, item->commit,
+                                       opts, is_final_fixup(todo_list));
+                       if (is_rebase_i(opts) && res < 0) {
+                               /* Reschedule */
+                               todo_list->current--;
+                               if (save_todo(todo_list, opts))
+                                       return -1;
+                       }
+                       if (item->command == TODO_EDIT) {
+                               struct commit *commit = item->commit;
+                               if (!res)
+                                       warning(_("stopped at %s... %.*s"),
+                                               short_commit_name(commit),
+                                               item->arg_len, item->arg);
+                               return error_with_patch(commit,
+                                       item->arg, item->arg_len, opts, res,
+                                       !res);
+                       }
+                       if (is_rebase_i(opts) && !res)
+                               record_in_rewritten(&item->commit->object.oid,
+                                       peek_command(todo_list, 1));
+                       if (res && is_fixup(item->command)) {
+                               if (res == 1)
+                                       intend_to_amend();
+                               return error_failed_squash(item->commit, opts,
+                                       item->arg_len, item->arg);
+                       } else if (res && is_rebase_i(opts))
+                               return res | error_with_patch(item->commit,
+                                       item->arg, item->arg_len, opts, res,
+                                       item->command == TODO_REWORD);
+               } else if (item->command == TODO_EXEC) {
+                       char *end_of_arg = (char *)(item->arg + item->arg_len);
+                       int saved = *end_of_arg;
+
+                       *end_of_arg = '\0';
+                       res = do_exec(item->arg);
+                       *end_of_arg = saved;
+               } else if (!is_noop(item->command))
+                       return error(_("unknown command %d"), item->command);
+
                todo_list->current++;
                if (res)
                        return res;
        }
 
+       if (is_rebase_i(opts)) {
+               struct strbuf head_ref = STRBUF_INIT, buf = STRBUF_INIT;
+               struct stat st;
+
+               /* Stopped in the middle, as planned? */
+               if (todo_list->current < todo_list->nr)
+                       return 0;
+
+               if (read_oneliner(&head_ref, rebase_path_head_name(), 0) &&
+                               starts_with(head_ref.buf, "refs/")) {
+                       const char *msg;
+                       unsigned char head[20], orig[20];
+                       int res;
+
+                       if (get_sha1("HEAD", head)) {
+                               res = error(_("cannot read HEAD"));
+cleanup_head_ref:
+                               strbuf_release(&head_ref);
+                               strbuf_release(&buf);
+                               return res;
+                       }
+                       if (!read_oneliner(&buf, rebase_path_orig_head(), 0) ||
+                                       get_sha1_hex(buf.buf, orig)) {
+                               res = error(_("could not read orig-head"));
+                               goto cleanup_head_ref;
+                       }
+                       if (!read_oneliner(&buf, rebase_path_onto(), 0)) {
+                               res = error(_("could not read 'onto'"));
+                               goto cleanup_head_ref;
+                       }
+                       msg = reflog_message(opts, "finish", "%s onto %s",
+                               head_ref.buf, buf.buf);
+                       if (update_ref(msg, head_ref.buf, head, orig,
+                                       REF_NODEREF, UPDATE_REFS_MSG_ON_ERR)) {
+                               res = error(_("could not update %s"),
+                                       head_ref.buf);
+                               goto cleanup_head_ref;
+                       }
+                       msg = reflog_message(opts, "finish", "returning to %s",
+                               head_ref.buf);
+                       if (create_symref("HEAD", head_ref.buf, msg)) {
+                               res = error(_("could not update HEAD to %s"),
+                                       head_ref.buf);
+                               goto cleanup_head_ref;
+                       }
+                       strbuf_reset(&buf);
+               }
+
+               if (opts->verbose) {
+                       struct rev_info log_tree_opt;
+                       struct object_id orig, head;
+
+                       memset(&log_tree_opt, 0, sizeof(log_tree_opt));
+                       init_revisions(&log_tree_opt, NULL);
+                       log_tree_opt.diff = 1;
+                       log_tree_opt.diffopt.output_format =
+                               DIFF_FORMAT_DIFFSTAT;
+                       log_tree_opt.disable_stdin = 1;
+
+                       if (read_oneliner(&buf, rebase_path_orig_head(), 0) &&
+                           !get_sha1(buf.buf, orig.hash) &&
+                           !get_sha1("HEAD", head.hash)) {
+                               diff_tree_sha1(orig.hash, head.hash,
+                                              "", &log_tree_opt.diffopt);
+                               log_tree_diff_flush(&log_tree_opt);
+                       }
+               }
+               flush_rewritten_pending();
+               if (!stat(rebase_path_rewritten_list(), &st) &&
+                               st.st_size > 0) {
+                       struct child_process child = CHILD_PROCESS_INIT;
+                       const char *post_rewrite_hook =
+                               find_hook("post-rewrite");
+
+                       child.in = open(rebase_path_rewritten_list(), O_RDONLY);
+                       child.git_cmd = 1;
+                       argv_array_push(&child.args, "notes");
+                       argv_array_push(&child.args, "copy");
+                       argv_array_push(&child.args, "--for-rewrite=rebase");
+                       /* we don't care if this copying failed */
+                       run_command(&child);
+
+                       if (post_rewrite_hook) {
+                               struct child_process hook = CHILD_PROCESS_INIT;
+
+                               hook.in = open(rebase_path_rewritten_list(),
+                                       O_RDONLY);
+                               hook.stdout_to_stderr = 1;
+                               argv_array_push(&hook.args, post_rewrite_hook);
+                               argv_array_push(&hook.args, "rebase");
+                               /* we don't care if this hook failed */
+                               run_command(&hook);
+                       }
+               }
+               apply_autostash(opts);
+
+               fprintf(stderr, "Successfully rebased and updated %s.\n",
+                       head_ref.buf);
+
+               strbuf_release(&buf);
+               strbuf_release(&head_ref);
+       }
+
        /*
         * Sequence of picks finished successfully; cleanup by
         * removing the .git/sequencer directory
@@ -1290,6 +2151,47 @@ static int continue_single_pick(void)
        return run_command_v_opt(argv, RUN_GIT_CMD);
 }
 
+static int commit_staged_changes(struct replay_opts *opts)
+{
+       int amend = 0;
+
+       if (has_unstaged_changes(1))
+               return error(_("cannot rebase: You have unstaged changes."));
+       if (!has_uncommitted_changes(0)) {
+               const char *cherry_pick_head = git_path("CHERRY_PICK_HEAD");
+
+               if (file_exists(cherry_pick_head) && unlink(cherry_pick_head))
+                       return error(_("could not remove CHERRY_PICK_HEAD"));
+               return 0;
+       }
+
+       if (file_exists(rebase_path_amend())) {
+               struct strbuf rev = STRBUF_INIT;
+               unsigned char head[20], to_amend[20];
+
+               if (get_sha1("HEAD", head))
+                       return error(_("cannot amend non-existing commit"));
+               if (!read_oneliner(&rev, rebase_path_amend(), 0))
+                       return error(_("invalid file: '%s'"), rebase_path_amend());
+               if (get_sha1_hex(rev.buf, to_amend))
+                       return error(_("invalid contents: '%s'"),
+                               rebase_path_amend());
+               if (hashcmp(head, to_amend))
+                       return error(_("\nYou have uncommitted changes in your "
+                                      "working tree. Please, commit them\n"
+                                      "first and then run 'git rebase "
+                                      "--continue' again."));
+
+               strbuf_release(&rev);
+               amend = 1;
+       }
+
+       if (run_git_commit(rebase_path_message(), opts, 1, 1, amend, 0))
+               return error(_("could not commit staged changes."));
+       unlink(rebase_path_amend());
+       return 0;
+}
+
 int sequencer_continue(struct replay_opts *opts)
 {
        struct todo_list todo_list = TODO_LIST_INIT;
@@ -1298,25 +2200,39 @@ int sequencer_continue(struct replay_opts *opts)
        if (read_and_refresh_cache(opts))
                return -1;
 
-       if (!file_exists(get_todo_path(opts)))
+       if (is_rebase_i(opts)) {
+               if (commit_staged_changes(opts))
+                       return -1;
+       } else if (!file_exists(get_todo_path(opts)))
                return continue_single_pick();
        if (read_populate_opts(opts))
                return -1;
        if ((res = read_populate_todo(&todo_list, opts)))
                goto release_todo_list;
 
-       /* Verify that the conflict has been resolved */
-       if (file_exists(git_path_cherry_pick_head()) ||
-           file_exists(git_path_revert_head())) {
-               res = continue_single_pick();
-               if (res)
+       if (!is_rebase_i(opts)) {
+               /* Verify that the conflict has been resolved */
+               if (file_exists(git_path_cherry_pick_head()) ||
+                   file_exists(git_path_revert_head())) {
+                       res = continue_single_pick();
+                       if (res)
+                               goto release_todo_list;
+               }
+               if (index_differs_from("HEAD", 0, 0)) {
+                       res = error_dirty_index(opts);
                        goto release_todo_list;
+               }
+               todo_list.current++;
+       } else if (file_exists(rebase_path_stopped_sha())) {
+               struct strbuf buf = STRBUF_INIT;
+               struct object_id oid;
+
+               if (read_oneliner(&buf, rebase_path_stopped_sha(), 1) &&
+                   !get_sha1_committish(buf.buf, oid.hash))
+                       record_in_rewritten(&oid, peek_command(&todo_list, 0));
+               strbuf_release(&buf);
        }
-       if (index_differs_from("HEAD", 0, 0)) {
-               res = error_dirty_index(opts);
-               goto release_todo_list;
-       }
-       todo_list.current++;
+
        res = pick_commits(&todo_list, opts);
 release_todo_list:
        todo_list_release(&todo_list);
@@ -1327,7 +2243,7 @@ static int single_pick(struct commit *cmit, struct replay_opts *opts)
 {
        setenv(GIT_REFLOG_ACTION, action_name(opts), 0);
        return do_pick_commit(opts->action == REPLAY_PICK ?
-               TODO_PICK : TODO_REVERT, cmit, opts);
+               TODO_PICK : TODO_REVERT, cmit, opts, 0);
 }
 
 int sequencer_pick_revisions(struct replay_opts *opts)
@@ -1393,6 +2309,7 @@ int sequencer_pick_revisions(struct replay_opts *opts)
                return -1;
        if (save_opts(opts))
                return -1;
+       update_abort_safety_file();
        res = pick_commits(&todo_list, opts);
        todo_list_release(&todo_list);
        return res;
index 7a513c576bdccf8730828fdaa586ec9d0af4af6b..f885b68395f4bff1ded96c0ab84ed87d164f0c7d 100644 (file)
@@ -7,7 +7,8 @@ const char *git_path_seq_dir(void);
 
 enum replay_action {
        REPLAY_REVERT,
-       REPLAY_PICK
+       REPLAY_PICK,
+       REPLAY_INTERACTIVE_REBASE
 };
 
 struct replay_opts {
@@ -23,6 +24,7 @@ struct replay_opts {
        int allow_empty;
        int allow_empty_message;
        int keep_redundant_commits;
+       int verbose;
 
        int mainline;
 
diff --git a/setup.c b/setup.c
index fe572b82c355390e6101aea15d2d53ec5b3b1e15..967f289f1ef07d78f4b680e1d880e2fa86215371 100644 (file)
--- a/setup.c
+++ b/setup.c
@@ -256,8 +256,10 @@ int get_common_dir_noenv(struct strbuf *sb, const char *gitdir)
                strbuf_addbuf(&path, &data);
                strbuf_addstr(sb, real_path(path.buf));
                ret = 1;
-       } else
+       } else {
                strbuf_addstr(sb, gitdir);
+       }
+
        strbuf_release(&data);
        strbuf_release(&path);
        return ret;
@@ -484,6 +486,30 @@ int verify_repository_format(const struct repository_format *format,
        return 0;
 }
 
+void read_gitfile_error_die(int error_code, const char *path, const char *dir)
+{
+       switch (error_code) {
+       case READ_GITFILE_ERR_STAT_FAILED:
+       case READ_GITFILE_ERR_NOT_A_FILE:
+               /* non-fatal; follow return path */
+               break;
+       case READ_GITFILE_ERR_OPEN_FAILED:
+               die_errno("Error opening '%s'", path);
+       case READ_GITFILE_ERR_TOO_LARGE:
+               die("Too large to be a .git file: '%s'", path);
+       case READ_GITFILE_ERR_READ_FAILED:
+               die("Error reading %s", path);
+       case READ_GITFILE_ERR_INVALID_FORMAT:
+               die("Invalid gitfile format: %s", path);
+       case READ_GITFILE_ERR_NO_PATH:
+               die("No path in gitfile: %s", path);
+       case READ_GITFILE_ERR_NOT_A_REPO:
+               die("Not a git repository: %s", dir);
+       default:
+               die("BUG: unknown error code");
+       }
+}
+
 /*
  * Try to read the location of the git directory from the .git file,
  * return path to git directory if found.
@@ -557,28 +583,8 @@ const char *read_gitfile_gently(const char *path, int *return_error_code)
 cleanup_return:
        if (return_error_code)
                *return_error_code = error_code;
-       else if (error_code) {
-               switch (error_code) {
-               case READ_GITFILE_ERR_STAT_FAILED:
-               case READ_GITFILE_ERR_NOT_A_FILE:
-                       /* non-fatal; follow return path */
-                       break;
-               case READ_GITFILE_ERR_OPEN_FAILED:
-                       die_errno("Error opening '%s'", path);
-               case READ_GITFILE_ERR_TOO_LARGE:
-                       die("Too large to be a .git file: '%s'", path);
-               case READ_GITFILE_ERR_READ_FAILED:
-                       die("Error reading %s", path);
-               case READ_GITFILE_ERR_INVALID_FORMAT:
-                       die("Invalid gitfile format: %s", path);
-               case READ_GITFILE_ERR_NO_PATH:
-                       die("No path in gitfile: %s", path);
-               case READ_GITFILE_ERR_NOT_A_REPO:
-                       die("Not a git repository: %s", dir);
-               default:
-                       assert(0);
-               }
-       }
+       else if (error_code)
+               read_gitfile_error_die(error_code, path, dir);
 
        free(buf);
        return error_code ? NULL : path;
@@ -692,7 +698,7 @@ static const char *setup_discovered_git_dir(const char *gitdir,
        /* --work-tree is set without --git-dir; use discovered one */
        if (getenv(GIT_WORK_TREE_ENVIRONMENT) || git_work_tree_cfg) {
                if (offset != cwd->len && !is_absolute_path(gitdir))
-                       gitdir = xstrdup(real_path(gitdir));
+                       gitdir = real_pathdup(gitdir);
                if (chdir(cwd->buf))
                        die_errno("Could not come back to cwd");
                return setup_explicit_git_dir(gitdir, cwd, nongit_ok);
@@ -800,11 +806,12 @@ static int canonicalize_ceiling_entry(struct string_list_item *item,
                /* Keep entry but do not canonicalize it */
                return 1;
        } else {
-               const char *real_path = real_path_if_valid(ceil);
-               if (!real_path)
+               char *real_path = real_pathdup(ceil);
+               if (!real_path) {
                        return 0;
+               }
                free(item->string);
-               item->string = xstrdup(real_path);
+               item->string = real_path;
                return 1;
        }
 }
@@ -1014,11 +1021,11 @@ const char *setup_git_directory(void)
        return setup_git_directory_gently(NULL);
 }
 
-const char *resolve_gitdir(const char *suspect)
+const char *resolve_gitdir_gently(const char *suspect, int *return_error_code)
 {
        if (is_git_directory(suspect))
                return suspect;
-       return read_gitfile(suspect);
+       return read_gitfile_gently(suspect, return_error_code);
 }
 
 /* if any standard file descriptor is missing open it to /dev/null */
index 9c86d1924a23e4c81369f34ec8e1058c2dd15c1f..ec957db5e1c2620b4a95e4f4d028f01794cef02a 100644 (file)
 #include "mru.h"
 #include "list.h"
 #include "mergesort.h"
-
-#ifndef O_NOATIME
-#if defined(__linux__) && (defined(__i386__) || defined(__PPC__))
-#define O_NOATIME 01000000
-#else
-#define O_NOATIME 0
-#endif
-#endif
+#include "quote.h"
 
 #define SZ_FMT PRIuMAX
 static inline uintmax_t sz_fmt(size_t s) { return s; }
@@ -291,7 +284,7 @@ static int link_alt_odb_entry(const char *entry, const char *relative_base,
        struct strbuf pathbuf = STRBUF_INIT;
 
        if (!is_absolute_path(entry) && relative_base) {
-               strbuf_addstr(&pathbuf, real_path(relative_base));
+               strbuf_realpath(&pathbuf, relative_base, 1);
                strbuf_addch(&pathbuf, '/');
        }
        strbuf_addstr(&pathbuf, entry);
@@ -329,13 +322,40 @@ static int link_alt_odb_entry(const char *entry, const char *relative_base,
        return 0;
 }
 
+static const char *parse_alt_odb_entry(const char *string,
+                                      int sep,
+                                      struct strbuf *out)
+{
+       const char *end;
+
+       strbuf_reset(out);
+
+       if (*string == '#') {
+               /* comment; consume up to next separator */
+               end = strchrnul(string, sep);
+       } else if (*string == '"' && !unquote_c_style(out, string, &end)) {
+               /*
+                * quoted path; unquote_c_style has copied the
+                * data for us and set "end". Broken quoting (e.g.,
+                * an entry that doesn't end with a quote) falls
+                * back to the unquoted case below.
+                */
+       } else {
+               /* normal, unquoted path */
+               end = strchrnul(string, sep);
+               strbuf_add(out, string, end - string);
+       }
+
+       if (*end)
+               end++;
+       return end;
+}
+
 static void link_alt_odb_entries(const char *alt, int len, int sep,
                                 const char *relative_base, int depth)
 {
-       struct string_list entries = STRING_LIST_INIT_NODUP;
-       char *alt_copy;
-       int i;
        struct strbuf objdirbuf = STRBUF_INIT;
+       struct strbuf entry = STRBUF_INIT;
 
        if (depth > 5) {
                error("%s: ignoring alternate object stores, nesting too deep.",
@@ -348,16 +368,13 @@ static void link_alt_odb_entries(const char *alt, int len, int sep,
                die("unable to normalize object directory: %s",
                    objdirbuf.buf);
 
-       alt_copy = xmemdupz(alt, len);
-       string_list_split_in_place(&entries, alt_copy, sep, -1);
-       for (i = 0; i < entries.nr; i++) {
-               const char *entry = entries.items[i].string;
-               if (entry[0] == '\0' || entry[0] == '#')
+       while (*alt) {
+               alt = parse_alt_odb_entry(alt, sep, &entry);
+               if (!entry.len)
                        continue;
-               link_alt_odb_entry(entry, relative_base, depth, objdirbuf.buf);
+               link_alt_odb_entry(entry.buf, relative_base, depth, objdirbuf.buf);
        }
-       string_list_clear(&entries, 0);
-       free(alt_copy);
+       strbuf_release(&entry);
        strbuf_release(&objdirbuf);
 }
 
@@ -1586,66 +1603,81 @@ int check_sha1_signature(const unsigned char *sha1, void *map,
        return hashcmp(sha1, real_sha1) ? -1 : 0;
 }
 
-int git_open(const char *name)
+int git_open_cloexec(const char *name, int flags)
 {
-       static int sha1_file_open_flag = O_NOATIME | O_CLOEXEC;
-
-       for (;;) {
-               int fd;
-
-               errno = 0;
-               fd = open(name, O_RDONLY | sha1_file_open_flag);
-               if (fd >= 0)
-                       return fd;
+       int fd;
+       static int o_cloexec = O_CLOEXEC;
 
+       fd = open(name, flags | o_cloexec);
+       if ((o_cloexec & O_CLOEXEC) && fd < 0 && errno == EINVAL) {
                /* Try again w/o O_CLOEXEC: the kernel might not support it */
-               if ((sha1_file_open_flag & O_CLOEXEC) && errno == EINVAL) {
-                       sha1_file_open_flag &= ~O_CLOEXEC;
-                       continue;
-               }
+               o_cloexec &= ~O_CLOEXEC;
+               fd = open(name, flags | o_cloexec);
+       }
 
-               /* Might the failure be due to O_NOATIME? */
-               if (errno != ENOENT && (sha1_file_open_flag & O_NOATIME)) {
-                       sha1_file_open_flag &= ~O_NOATIME;
-                       continue;
+#if defined(F_GETFL) && defined(F_SETFL) && defined(FD_CLOEXEC)
+       {
+               static int fd_cloexec = FD_CLOEXEC;
+
+               if (!o_cloexec && 0 <= fd && fd_cloexec) {
+                       /* Opened w/o O_CLOEXEC?  try with fcntl(2) to add it */
+                       int flags = fcntl(fd, F_GETFL);
+                       if (fcntl(fd, F_SETFL, flags | fd_cloexec))
+                               fd_cloexec = 0;
                }
-               return -1;
        }
+#endif
+       return fd;
 }
 
-static int stat_sha1_file(const unsigned char *sha1, struct stat *st)
+/*
+ * Find "sha1" as a loose object in the local repository or in an alternate.
+ * Returns 0 on success, negative on failure.
+ *
+ * The "path" out-parameter will give the path of the object we found (if any).
+ * Note that it may point to static storage and is only valid until another
+ * call to sha1_file_name(), etc.
+ */
+static int stat_sha1_file(const unsigned char *sha1, struct stat *st,
+                         const char **path)
 {
        struct alternate_object_database *alt;
 
-       if (!lstat(sha1_file_name(sha1), st))
+       *path = sha1_file_name(sha1);
+       if (!lstat(*path, st))
                return 0;
 
        prepare_alt_odb();
        errno = ENOENT;
        for (alt = alt_odb_list; alt; alt = alt->next) {
-               const char *path = alt_sha1_path(alt, sha1);
-               if (!lstat(path, st))
+               *path = alt_sha1_path(alt, sha1);
+               if (!lstat(*path, st))
                        return 0;
        }
 
        return -1;
 }
 
-static int open_sha1_file(const unsigned char *sha1)
+/*
+ * Like stat_sha1_file(), but actually open the object and return the
+ * descriptor. See the caveats on the "path" parameter above.
+ */
+static int open_sha1_file(const unsigned char *sha1, const char **path)
 {
        int fd;
        struct alternate_object_database *alt;
        int most_interesting_errno;
 
-       fd = git_open(sha1_file_name(sha1));
+       *path = sha1_file_name(sha1);
+       fd = git_open(*path);
        if (fd >= 0)
                return fd;
        most_interesting_errno = errno;
 
        prepare_alt_odb();
        for (alt = alt_odb_list; alt; alt = alt->next) {
-               const char *path = alt_sha1_path(alt, sha1);
-               fd = git_open(path);
+               *path = alt_sha1_path(alt, sha1);
+               fd = git_open(*path);
                if (fd >= 0)
                        return fd;
                if (most_interesting_errno == ENOENT)
@@ -1655,12 +1687,21 @@ static int open_sha1_file(const unsigned char *sha1)
        return -1;
 }
 
-void *map_sha1_file(const unsigned char *sha1, unsigned long *size)
+/*
+ * Map the loose object at "path" if it is not NULL, or the path found by
+ * searching for a loose object named "sha1".
+ */
+static void *map_sha1_file_1(const char *path,
+                            const unsigned char *sha1,
+                            unsigned long *size)
 {
        void *map;
        int fd;
 
-       fd = open_sha1_file(sha1);
+       if (path)
+               fd = git_open(path);
+       else
+               fd = open_sha1_file(sha1, &path);
        map = NULL;
        if (fd >= 0) {
                struct stat st;
@@ -1669,7 +1710,7 @@ void *map_sha1_file(const unsigned char *sha1, unsigned long *size)
                        *size = xsize_t(st.st_size);
                        if (!*size) {
                                /* mmap() is forbidden on empty files */
-                               error("object file %s is empty", sha1_file_name(sha1));
+                               error("object file %s is empty", path);
                                return NULL;
                        }
                        map = xmmap(NULL, *size, PROT_READ, MAP_PRIVATE, fd, 0);
@@ -1679,6 +1720,11 @@ void *map_sha1_file(const unsigned char *sha1, unsigned long *size)
        return map;
 }
 
+void *map_sha1_file(const unsigned char *sha1, unsigned long *size)
+{
+       return map_sha1_file_1(NULL, sha1, size);
+}
+
 unsigned long unpack_object_header_buffer(const unsigned char *buf,
                unsigned long len, enum object_type *type, unsigned long *sizep)
 {
@@ -2325,11 +2371,10 @@ static inline void release_delta_base_cache(struct delta_base_cache_entry *ent)
 
 void clear_delta_base_cache(void)
 {
-       struct hashmap_iter iter;
-       struct delta_base_cache_entry *entry;
-       for (entry = hashmap_iter_first(&delta_base_cache, &iter);
-            entry;
-            entry = hashmap_iter_next(&iter)) {
+       struct list_head *lru, *tmp;
+       list_for_each_safe(lru, tmp, &delta_base_cache_lru) {
+               struct delta_base_cache_entry *entry =
+                       list_entry(lru, struct delta_base_cache_entry, lru);
                release_delta_base_cache(entry);
        }
 }
@@ -2789,8 +2834,9 @@ static int sha1_loose_object_info(const unsigned char *sha1,
         * object even exists.
         */
        if (!oi->typep && !oi->typename && !oi->sizep) {
+               const char *path;
                struct stat st;
-               if (stat_sha1_file(sha1, &st) < 0)
+               if (stat_sha1_file(sha1, &st, &path) < 0)
                        return -1;
                if (oi->disk_sizep)
                        *oi->disk_sizep = st.st_size;
@@ -2986,6 +3032,8 @@ void *read_sha1_file_extended(const unsigned char *sha1,
 {
        void *data;
        const struct packed_git *p;
+       const char *path;
+       struct stat st;
        const unsigned char *repl = lookup_replace_object_extended(sha1, flag);
 
        errno = 0;
@@ -3001,12 +3049,9 @@ void *read_sha1_file_extended(const unsigned char *sha1,
                die("replacement %s not found for %s",
                    sha1_to_hex(repl), sha1_to_hex(sha1));
 
-       if (has_loose_object(repl)) {
-               const char *path = sha1_file_name(sha1);
-
+       if (!stat_sha1_file(repl, &st, &path))
                die("loose object %s (stored in %s) is corrupt",
                    sha1_to_hex(repl), path);
-       }
 
        if ((p = has_packed_and_bad(repl)) != NULL)
                die("packed object %s (stored in %s) is corrupt",
@@ -3776,3 +3821,122 @@ int for_each_packed_object(each_packed_object_fn cb, void *data, unsigned flags)
        }
        return r ? r : pack_errors;
 }
+
+static int check_stream_sha1(git_zstream *stream,
+                            const char *hdr,
+                            unsigned long size,
+                            const char *path,
+                            const unsigned char *expected_sha1)
+{
+       git_SHA_CTX c;
+       unsigned char real_sha1[GIT_SHA1_RAWSZ];
+       unsigned char buf[4096];
+       unsigned long total_read;
+       int status = Z_OK;
+
+       git_SHA1_Init(&c);
+       git_SHA1_Update(&c, hdr, stream->total_out);
+
+       /*
+        * We already read some bytes into hdr, but the ones up to the NUL
+        * do not count against the object's content size.
+        */
+       total_read = stream->total_out - strlen(hdr) - 1;
+
+       /*
+        * This size comparison must be "<=" to read the final zlib packets;
+        * see the comment in unpack_sha1_rest for details.
+        */
+       while (total_read <= size &&
+              (status == Z_OK || status == Z_BUF_ERROR)) {
+               stream->next_out = buf;
+               stream->avail_out = sizeof(buf);
+               if (size - total_read < stream->avail_out)
+                       stream->avail_out = size - total_read;
+               status = git_inflate(stream, Z_FINISH);
+               git_SHA1_Update(&c, buf, stream->next_out - buf);
+               total_read += stream->next_out - buf;
+       }
+       git_inflate_end(stream);
+
+       if (status != Z_STREAM_END) {
+               error("corrupt loose object '%s'", sha1_to_hex(expected_sha1));
+               return -1;
+       }
+       if (stream->avail_in) {
+               error("garbage at end of loose object '%s'",
+                     sha1_to_hex(expected_sha1));
+               return -1;
+       }
+
+       git_SHA1_Final(real_sha1, &c);
+       if (hashcmp(expected_sha1, real_sha1)) {
+               error("sha1 mismatch for %s (expected %s)", path,
+                     sha1_to_hex(expected_sha1));
+               return -1;
+       }
+
+       return 0;
+}
+
+int read_loose_object(const char *path,
+                     const unsigned char *expected_sha1,
+                     enum object_type *type,
+                     unsigned long *size,
+                     void **contents)
+{
+       int ret = -1;
+       int fd = -1;
+       void *map = NULL;
+       unsigned long mapsize;
+       git_zstream stream;
+       char hdr[32];
+
+       *contents = NULL;
+
+       map = map_sha1_file_1(path, NULL, &mapsize);
+       if (!map) {
+               error_errno("unable to mmap %s", path);
+               goto out;
+       }
+
+       if (unpack_sha1_header(&stream, map, mapsize, hdr, sizeof(hdr)) < 0) {
+               error("unable to unpack header of %s", path);
+               goto out;
+       }
+
+       *type = parse_sha1_header(hdr, size);
+       if (*type < 0) {
+               error("unable to parse header of %s", path);
+               git_inflate_end(&stream);
+               goto out;
+       }
+
+       if (*type == OBJ_BLOB) {
+               if (check_stream_sha1(&stream, hdr, *size, path, expected_sha1) < 0)
+                       goto out;
+       } else {
+               *contents = unpack_sha1_rest(&stream, hdr, *size, expected_sha1);
+               if (!*contents) {
+                       error("unable to unpack contents of %s", path);
+                       git_inflate_end(&stream);
+                       goto out;
+               }
+               if (check_sha1_signature(expected_sha1, *contents,
+                                        *size, typename(*type))) {
+                       error("sha1 mismatch for %s (expected %s)", path,
+                             sha1_to_hex(expected_sha1));
+                       free(*contents);
+                       goto out;
+               }
+       }
+
+       ret = 0; /* everything checks out */
+
+out:
+       if (map)
+               munmap(map, mapsize);
+       if (fd >= 0)
+               close(fd);
+       return ret;
+}
index 4d0b005d39c1c1ab2379911666d4df75d66b824c..11f7dde9d910093dce6a767150bb4823bff80200 100644 (file)
--- a/shallow.c
+++ b/shallow.c
@@ -431,12 +431,14 @@ void remove_nonexistent_theirs_shallow(struct shallow_info *info)
 
 define_commit_slab(ref_bitmap, uint32_t *);
 
+#define POOL_SIZE (512 * 1024)
+
 struct paint_info {
        struct ref_bitmap ref_bitmap;
        unsigned nr_bits;
-       char **slab;
+       char **pools;
        char *free, *end;
-       unsigned slab_count;
+       unsigned pool_count;
 };
 
 static uint32_t *paint_alloc(struct paint_info *info)
@@ -444,12 +446,15 @@ static uint32_t *paint_alloc(struct paint_info *info)
        unsigned nr = (info->nr_bits + 31) / 32;
        unsigned size = nr * sizeof(uint32_t);
        void *p;
-       if (!info->slab_count || info->free + size > info->end) {
-               info->slab_count++;
-               REALLOC_ARRAY(info->slab, info->slab_count);
-               info->free = xmalloc(COMMIT_SLAB_SIZE);
-               info->slab[info->slab_count - 1] = info->free;
-               info->end = info->free + COMMIT_SLAB_SIZE;
+       if (!info->pool_count || size > info->end - info->free) {
+               if (size > POOL_SIZE)
+                       die("BUG: pool size too small for %d in paint_alloc()",
+                           size);
+               info->pool_count++;
+               REALLOC_ARRAY(info->pools, info->pool_count);
+               info->free = xmalloc(POOL_SIZE);
+               info->pools[info->pool_count - 1] = info->free;
+               info->end = info->free + POOL_SIZE;
        }
        p = info->free;
        info->free += size;
@@ -462,7 +467,7 @@ static uint32_t *paint_alloc(struct paint_info *info)
  * all walked commits.
  */
 static void paint_down(struct paint_info *info, const unsigned char *sha1,
-                      int id)
+                      unsigned int id)
 {
        unsigned int i, nr;
        struct commit_list *head = NULL;
@@ -474,7 +479,7 @@ static void paint_down(struct paint_info *info, const unsigned char *sha1,
        if (!c)
                return;
        memset(bitmap, 0, bitmap_size);
-       bitmap[id / 32] |= (1 << (id % 32));
+       bitmap[id / 32] |= (1U << (id % 32));
        commit_list_insert(c, &head);
        while (head) {
                struct commit_list *p;
@@ -507,12 +512,8 @@ static void paint_down(struct paint_info *info, const unsigned char *sha1,
                            oid_to_hex(&c->object.oid));
 
                for (p = c->parents; p; p = p->next) {
-                       uint32_t **p_refs = ref_bitmap_at(&info->ref_bitmap,
-                                                         p->item);
                        if (p->item->object.flags & SEEN)
                                continue;
-                       if (*p_refs == NULL || *p_refs == *refs)
-                               *p_refs = *refs;
                        commit_list_insert(p->item, &head);
                }
        }
@@ -624,9 +625,9 @@ void assign_shallow_commits_to_refs(struct shallow_info *info,
                post_assign_shallow(info, &pi.ref_bitmap, ref_status);
 
        clear_ref_bitmap(&pi.ref_bitmap);
-       for (i = 0; i < pi.slab_count; i++)
-               free(pi.slab[i]);
-       free(pi.slab);
+       for (i = 0; i < pi.pool_count; i++)
+               free(pi.pools[i]);
+       free(pi.pools);
        free(shallow);
 }
 
@@ -648,11 +649,11 @@ static int add_ref(const char *refname, const struct object_id *oid,
 
 static void update_refstatus(int *ref_status, int nr, uint32_t *bitmap)
 {
-       int i;
+       unsigned int i;
        if (!ref_status)
                return;
        for (i = 0; i < nr; i++)
-               if (bitmap[i / 32] & (1 << (i % 32)))
+               if (bitmap[i / 32] & (1U << (i % 32)))
                        ref_status[i]++;
 }
 
index 5a326c68602610d856ac543b8bd034542d83f64b..5d64cfe929684807fcfa004ec3edf10d720189c9 100644 (file)
@@ -13,6 +13,7 @@ struct shortlog {
        int in2;
        int user_format;
        int abbrev;
+       int committer;
 
        char *common_repo_prefix;
        int email;
index 8c83cac189e94c327327e47cfaadfd621d59b6b9..45016ad86dd5eb55534524cb50e30542e87fab70 100644 (file)
@@ -211,21 +211,18 @@ struct string_list_item *string_list_append(struct string_list *list,
                        list->strdup_strings ? xstrdup(string) : (char *)string);
 }
 
-/* Yuck */
-static compare_strings_fn compare_for_qsort;
-
-/* Only call this from inside string_list_sort! */
-static int cmp_items(const void *a, const void *b)
+static int cmp_items(const void *a, const void *b, void *ctx)
 {
+       compare_strings_fn cmp = ctx;
        const struct string_list_item *one = a;
        const struct string_list_item *two = b;
-       return compare_for_qsort(one->string, two->string);
+       return cmp(one->string, two->string);
 }
 
 void string_list_sort(struct string_list *list)
 {
-       compare_for_qsort = list->cmp ? list->cmp : strcmp;
-       QSORT(list->items, list->nr, cmp_items);
+       QSORT_S(list->items, list->nr, cmp_items,
+               list->cmp ? list->cmp : strcmp);
 }
 
 struct string_list_item *unsorted_string_list_lookup(struct string_list *list,
index 098085be69b97687b0febfe9e29c6dc0c64569a1..93453909cf3225e2b4b9630d4013f76987ca8be8 100644 (file)
@@ -251,6 +251,8 @@ static int parse_push_recurse(const char *opt, const char *arg,
                        return RECURSE_SUBMODULES_ON_DEMAND;
                else if (!strcmp(arg, "check"))
                        return RECURSE_SUBMODULES_CHECK;
+               else if (!strcmp(arg, "only"))
+                       return RECURSE_SUBMODULES_ONLY;
                else if (die_on_error)
                        die("bad %s argument: %s", opt, arg);
                else
@@ -263,12 +265,12 @@ int parse_push_recurse_submodules_arg(const char *opt, const char *arg)
        return parse_push_recurse(opt, arg, 1);
 }
 
-static void warn_multiple_config(const unsigned char *commit_sha1,
+static void warn_multiple_config(const unsigned char *treeish_name,
                                 const char *name, const char *option)
 {
        const char *commit_string = "WORKTREE";
-       if (commit_sha1)
-               commit_string = sha1_to_hex(commit_sha1);
+       if (treeish_name)
+               commit_string = sha1_to_hex(treeish_name);
        warning("%s:.gitmodules, multiple configurations found for "
                        "'submodule.%s.%s'. Skipping second one!",
                        commit_string, name, option);
@@ -276,7 +278,7 @@ static void warn_multiple_config(const unsigned char *commit_sha1,
 
 struct parse_config_parameter {
        struct submodule_cache *cache;
-       const unsigned char *commit_sha1;
+       const unsigned char *treeish_name;
        const unsigned char *gitmodules_sha1;
        int overwrite;
 };
@@ -300,7 +302,7 @@ static int parse_config(const char *var, const char *value, void *data)
                if (!value)
                        ret = config_error_nonbool(var);
                else if (!me->overwrite && submodule->path)
-                       warn_multiple_config(me->commit_sha1, submodule->name,
+                       warn_multiple_config(me->treeish_name, submodule->name,
                                        "path");
                else {
                        if (submodule->path)
@@ -314,7 +316,7 @@ static int parse_config(const char *var, const char *value, void *data)
                int die_on_error = is_null_sha1(me->gitmodules_sha1);
                if (!me->overwrite &&
                    submodule->fetch_recurse != RECURSE_SUBMODULES_NONE)
-                       warn_multiple_config(me->commit_sha1, submodule->name,
+                       warn_multiple_config(me->treeish_name, submodule->name,
                                        "fetchrecursesubmodules");
                else
                        submodule->fetch_recurse = parse_fetch_recurse(
@@ -324,7 +326,7 @@ static int parse_config(const char *var, const char *value, void *data)
                if (!value)
                        ret = config_error_nonbool(var);
                else if (!me->overwrite && submodule->ignore)
-                       warn_multiple_config(me->commit_sha1, submodule->name,
+                       warn_multiple_config(me->treeish_name, submodule->name,
                                        "ignore");
                else if (strcmp(value, "untracked") &&
                         strcmp(value, "dirty") &&
@@ -340,7 +342,7 @@ static int parse_config(const char *var, const char *value, void *data)
                if (!value) {
                        ret = config_error_nonbool(var);
                } else if (!me->overwrite && submodule->url) {
-                       warn_multiple_config(me->commit_sha1, submodule->name,
+                       warn_multiple_config(me->treeish_name, submodule->name,
                                        "url");
                } else {
                        free((void *) submodule->url);
@@ -351,21 +353,21 @@ static int parse_config(const char *var, const char *value, void *data)
                        ret = config_error_nonbool(var);
                else if (!me->overwrite &&
                         submodule->update_strategy.type != SM_UPDATE_UNSPECIFIED)
-                       warn_multiple_config(me->commit_sha1, submodule->name,
+                       warn_multiple_config(me->treeish_name, submodule->name,
                                             "update");
                else if (parse_submodule_update_strategy(value,
                         &submodule->update_strategy) < 0)
                                die(_("invalid value for %s"), var);
        } else if (!strcmp(item.buf, "shallow")) {
                if (!me->overwrite && submodule->recommend_shallow != -1)
-                       warn_multiple_config(me->commit_sha1, submodule->name,
+                       warn_multiple_config(me->treeish_name, submodule->name,
                                             "shallow");
                else
                        submodule->recommend_shallow =
                                git_config_bool(var, value);
        } else if (!strcmp(item.buf, "branch")) {
                if (!me->overwrite && submodule->branch)
-                       warn_multiple_config(me->commit_sha1, submodule->name,
+                       warn_multiple_config(me->treeish_name, submodule->name,
                                             "branch");
                else {
                        free((void *)submodule->branch);
@@ -379,18 +381,18 @@ static int parse_config(const char *var, const char *value, void *data)
        return ret;
 }
 
-static int gitmodule_sha1_from_commit(const unsigned char *commit_sha1,
+int gitmodule_sha1_from_commit(const unsigned char *treeish_name,
                                      unsigned char *gitmodules_sha1,
                                      struct strbuf *rev)
 {
        int ret = 0;
 
-       if (is_null_sha1(commit_sha1)) {
+       if (is_null_sha1(treeish_name)) {
                hashclr(gitmodules_sha1);
                return 1;
        }
 
-       strbuf_addf(rev, "%s:.gitmodules", sha1_to_hex(commit_sha1));
+       strbuf_addf(rev, "%s:.gitmodules", sha1_to_hex(treeish_name));
        if (get_sha1(rev->buf, gitmodules_sha1) >= 0)
                ret = 1;
 
@@ -402,7 +404,7 @@ static int gitmodule_sha1_from_commit(const unsigned char *commit_sha1,
  * revisions.
  */
 static const struct submodule *config_from(struct submodule_cache *cache,
-               const unsigned char *commit_sha1, const char *key,
+               const unsigned char *treeish_name, const char *key,
                enum lookup_type lookup_type)
 {
        struct strbuf rev = STRBUF_INIT;
@@ -418,7 +420,7 @@ static const struct submodule *config_from(struct submodule_cache *cache,
         * return the first submodule. Can be used to check whether
         * there are any submodules parsed.
         */
-       if (!commit_sha1 || !key) {
+       if (!treeish_name || !key) {
                struct hashmap_iter iter;
                struct submodule_entry *entry;
 
@@ -428,7 +430,7 @@ static const struct submodule *config_from(struct submodule_cache *cache,
                return entry->config;
        }
 
-       if (!gitmodule_sha1_from_commit(commit_sha1, sha1, &rev))
+       if (!gitmodule_sha1_from_commit(treeish_name, sha1, &rev))
                goto out;
 
        switch (lookup_type) {
@@ -448,7 +450,7 @@ static const struct submodule *config_from(struct submodule_cache *cache,
 
        /* fill the submodule config into the cache */
        parameter.cache = cache;
-       parameter.commit_sha1 = commit_sha1;
+       parameter.treeish_name = treeish_name;
        parameter.gitmodules_sha1 = sha1;
        parameter.overwrite = 0;
        git_config_from_mem(parse_config, CONFIG_ORIGIN_SUBMODULE_BLOB, rev.buf,
@@ -471,18 +473,6 @@ static const struct submodule *config_from(struct submodule_cache *cache,
        return submodule;
 }
 
-static const struct submodule *config_from_path(struct submodule_cache *cache,
-               const unsigned char *commit_sha1, const char *path)
-{
-       return config_from(cache, commit_sha1, path, lookup_path);
-}
-
-static const struct submodule *config_from_name(struct submodule_cache *cache,
-               const unsigned char *commit_sha1, const char *name)
-{
-       return config_from(cache, commit_sha1, name, lookup_name);
-}
-
 static void ensure_cache_init(void)
 {
        if (is_cache_init)
@@ -496,7 +486,7 @@ int parse_submodule_config_option(const char *var, const char *value)
 {
        struct parse_config_parameter parameter;
        parameter.cache = &the_submodule_cache;
-       parameter.commit_sha1 = NULL;
+       parameter.treeish_name = NULL;
        parameter.gitmodules_sha1 = null_sha1;
        parameter.overwrite = 1;
 
@@ -504,18 +494,18 @@ int parse_submodule_config_option(const char *var, const char *value)
        return parse_config(var, value, &parameter);
 }
 
-const struct submodule *submodule_from_name(const unsigned char *commit_sha1,
+const struct submodule *submodule_from_name(const unsigned char *treeish_name,
                const char *name)
 {
        ensure_cache_init();
-       return config_from_name(&the_submodule_cache, commit_sha1, name);
+       return config_from(&the_submodule_cache, treeish_name, name, lookup_name);
 }
 
-const struct submodule *submodule_from_path(const unsigned char *commit_sha1,
+const struct submodule *submodule_from_path(const unsigned char *treeish_name,
                const char *path)
 {
        ensure_cache_init();
-       return config_from_path(&the_submodule_cache, commit_sha1, path);
+       return config_from(&the_submodule_cache, treeish_name, path, lookup_path);
 }
 
 void submodule_free(void)
index d05c542d2cdace181ea72055c0f71db6b1afda42..70f19363fd8bf5b7f42e974dacdc3ed2cd58a96a 100644 (file)
@@ -25,10 +25,13 @@ struct submodule {
 int parse_fetch_recurse_submodules_arg(const char *opt, const char *arg);
 int parse_push_recurse_submodules_arg(const char *opt, const char *arg);
 int parse_submodule_config_option(const char *var, const char *value);
-const struct submodule *submodule_from_name(const unsigned char *commit_sha1,
+const struct submodule *submodule_from_name(const unsigned char *commit_or_tree,
                const char *name);
-const struct submodule *submodule_from_path(const unsigned char *commit_sha1,
+const struct submodule *submodule_from_path(const unsigned char *commit_or_tree,
                const char *path);
+extern int gitmodule_sha1_from_commit(const unsigned char *commit_sha1,
+                                     unsigned char *gitmodules_sha1,
+                                     struct strbuf *rev);
 void submodule_free(void);
 
 #endif /* SUBMODULE_CONFIG_H */
index 6f7d883de950af8ba6427537d09e021a4bed36bd..3b98766a6bcfe983e5f94e84edd6fcec7ce74f8d 100644 (file)
@@ -14,6 +14,7 @@
 #include "blob.h"
 #include "thread-utils.h"
 #include "quote.h"
+#include "worktree.h"
 
 static int config_fetch_recurse_submodules = RECURSE_SUBMODULES_ON_DEMAND;
 static int parallel_jobs = 1;
@@ -198,6 +199,56 @@ void gitmodules_config(void)
        }
 }
 
+void gitmodules_config_sha1(const unsigned char *commit_sha1)
+{
+       struct strbuf rev = STRBUF_INIT;
+       unsigned char sha1[20];
+
+       if (gitmodule_sha1_from_commit(commit_sha1, sha1, &rev)) {
+               git_config_from_blob_sha1(submodule_config, rev.buf,
+                                         sha1, NULL);
+       }
+       strbuf_release(&rev);
+}
+
+/*
+ * Determine if a submodule has been initialized at a given 'path'
+ */
+int is_submodule_initialized(const char *path)
+{
+       int ret = 0;
+       const struct submodule *module = NULL;
+
+       module = submodule_from_path(null_sha1, path);
+
+       if (module) {
+               char *key = xstrfmt("submodule.%s.url", module->name);
+               char *value = NULL;
+
+               ret = !git_config_get_string(key, &value);
+
+               free(value);
+               free(key);
+       }
+
+       return ret;
+}
+
+/*
+ * Determine if a submodule has been populated at a given 'path'
+ */
+int is_submodule_populated(const char *path)
+{
+       int ret = 0;
+       char *gitdir = xstrfmt("%s/.git", path);
+
+       if (resolve_gitdir(gitdir))
+               ret = 1;
+
+       free(gitdir);
+       return ret;
+}
+
 int parse_submodule_update_strategy(const char *value,
                struct submodule_update_strategy *dst)
 {
@@ -500,27 +551,67 @@ static int has_remote(const char *refname, const struct object_id *oid,
        return 1;
 }
 
-static int submodule_needs_pushing(const char *path, const unsigned char sha1[20])
+static int append_sha1_to_argv(const unsigned char sha1[20], void *data)
+{
+       struct argv_array *argv = data;
+       argv_array_push(argv, sha1_to_hex(sha1));
+       return 0;
+}
+
+static int check_has_commit(const unsigned char sha1[20], void *data)
 {
-       if (add_submodule_odb(path) || !lookup_commit_reference(sha1))
+       int *has_commit = data;
+
+       if (!lookup_commit_reference(sha1))
+               *has_commit = 0;
+
+       return 0;
+}
+
+static int submodule_has_commits(const char *path, struct sha1_array *commits)
+{
+       int has_commit = 1;
+
+       if (add_submodule_odb(path))
+               return 0;
+
+       sha1_array_for_each_unique(commits, check_has_commit, &has_commit);
+       return has_commit;
+}
+
+static int submodule_needs_pushing(const char *path, struct sha1_array *commits)
+{
+       if (!submodule_has_commits(path, commits))
+               /*
+                * NOTE: We do consider it safe to return "no" here. The
+                * correct answer would be "We do not know" instead of
+                * "No push needed", but it is quite hard to change
+                * the submodule pointer without having the submodule
+                * around. If a user did however change the submodules
+                * without having the submodule around, this indicates
+                * an expert who knows what they are doing or a
+                * maintainer integrating work from other people. In
+                * both cases it should be safe to skip this check.
+                */
                return 0;
 
        if (for_each_remote_ref_submodule(path, has_remote, NULL) > 0) {
                struct child_process cp = CHILD_PROCESS_INIT;
-               const char *argv[] = {"rev-list", NULL, "--not", "--remotes", "-n", "1" , NULL};
                struct strbuf buf = STRBUF_INIT;
                int needs_pushing = 0;
 
-               argv[1] = sha1_to_hex(sha1);
-               cp.argv = argv;
+               argv_array_push(&cp.args, "rev-list");
+               sha1_array_for_each_unique(commits, append_sha1_to_argv, &cp.args);
+               argv_array_pushl(&cp.args, "--not", "--remotes", "-n", "1" , NULL);
+
                prepare_submodule_repo_env(&cp.env_array);
                cp.git_cmd = 1;
                cp.no_stdin = 1;
                cp.out = -1;
                cp.dir = path;
                if (start_command(&cp))
-                       die("Could not run 'git rev-list %s --not --remotes -n 1' command in submodule %s",
-                               sha1_to_hex(sha1), path);
+                       die("Could not run 'git rev-list <commits> --not --remotes -n 1' command in submodule %s",
+                                       path);
                if (strbuf_read(&buf, cp.out, 41))
                        needs_pushing = 1;
                finish_command(&cp);
@@ -532,19 +623,34 @@ static int submodule_needs_pushing(const char *path, const unsigned char sha1[20
        return 0;
 }
 
+static struct sha1_array *submodule_commits(struct string_list *submodules,
+                                           const char *path)
+{
+       struct string_list_item *item;
+
+       item = string_list_insert(submodules, path);
+       if (item->util)
+               return (struct sha1_array *) item->util;
+
+       /* NEEDSWORK: should we have sha1_array_init()? */
+       item->util = xcalloc(1, sizeof(struct sha1_array));
+       return (struct sha1_array *) item->util;
+}
+
 static void collect_submodules_from_diff(struct diff_queue_struct *q,
                                         struct diff_options *options,
                                         void *data)
 {
        int i;
-       struct string_list *needs_pushing = data;
+       struct string_list *submodules = data;
 
        for (i = 0; i < q->nr; i++) {
                struct diff_filepair *p = q->queue[i];
+               struct sha1_array *commits;
                if (!S_ISGITLINK(p->two->mode))
                        continue;
-               if (submodule_needs_pushing(p->two->path, p->two->oid.hash))
-                       string_list_insert(needs_pushing, p->two->path);
+               commits = submodule_commits(submodules, p->two->path);
+               sha1_array_append(commits, p->two->oid.hash);
        }
 }
 
@@ -560,46 +666,63 @@ static void find_unpushed_submodule_commits(struct commit *commit,
        diff_tree_combined_merge(commit, 1, &rev);
 }
 
-int find_unpushed_submodules(unsigned char new_sha1[20],
+static void free_submodules_sha1s(struct string_list *submodules)
+{
+       struct string_list_item *item;
+       for_each_string_list_item(item, submodules)
+               sha1_array_clear((struct sha1_array *) item->util);
+       string_list_clear(submodules, 1);
+}
+
+int find_unpushed_submodules(struct sha1_array *commits,
                const char *remotes_name, struct string_list *needs_pushing)
 {
        struct rev_info rev;
        struct commit *commit;
-       const char *argv[] = {NULL, NULL, "--not", "NULL", NULL};
-       int argc = ARRAY_SIZE(argv) - 1;
-       char *sha1_copy;
-
-       struct strbuf remotes_arg = STRBUF_INIT;
+       struct string_list submodules = STRING_LIST_INIT_DUP;
+       struct string_list_item *submodule;
+       struct argv_array argv = ARGV_ARRAY_INIT;
 
-       strbuf_addf(&remotes_arg, "--remotes=%s", remotes_name);
        init_revisions(&rev, NULL);
-       sha1_copy = xstrdup(sha1_to_hex(new_sha1));
-       argv[1] = sha1_copy;
-       argv[3] = remotes_arg.buf;
-       setup_revisions(argc, argv, &rev, NULL);
+
+       /* argv.argv[0] will be ignored by setup_revisions */
+       argv_array_push(&argv, "find_unpushed_submodules");
+       sha1_array_for_each_unique(commits, append_sha1_to_argv, &argv);
+       argv_array_push(&argv, "--not");
+       argv_array_pushf(&argv, "--remotes=%s", remotes_name);
+
+       setup_revisions(argv.argc, argv.argv, &rev, NULL);
        if (prepare_revision_walk(&rev))
                die("revision walk setup failed");
 
        while ((commit = get_revision(&rev)) != NULL)
-               find_unpushed_submodule_commits(commit, needs_pushing);
+               find_unpushed_submodule_commits(commit, &submodules);
 
        reset_revision_walk();
-       free(sha1_copy);
-       strbuf_release(&remotes_arg);
+       argv_array_clear(&argv);
+
+       for_each_string_list_item(submodule, &submodules) {
+               struct sha1_array *commits = (struct sha1_array *) submodule->util;
+
+               if (submodule_needs_pushing(submodule->string, commits))
+                       string_list_insert(needs_pushing, submodule->string);
+       }
+       free_submodules_sha1s(&submodules);
 
        return needs_pushing->nr;
 }
 
-static int push_submodule(const char *path)
+static int push_submodule(const char *path, int dry_run)
 {
        if (add_submodule_odb(path))
                return 1;
 
        if (for_each_remote_ref_submodule(path, has_remote, NULL) > 0) {
                struct child_process cp = CHILD_PROCESS_INIT;
-               const char *argv[] = {"push", NULL};
+               argv_array_push(&cp.args, "push");
+               if (dry_run)
+                       argv_array_push(&cp.args, "--dry-run");
 
-               cp.argv = argv;
                prepare_submodule_repo_env(&cp.env_array);
                cp.git_cmd = 1;
                cp.no_stdin = 1;
@@ -612,18 +735,20 @@ static int push_submodule(const char *path)
        return 1;
 }
 
-int push_unpushed_submodules(unsigned char new_sha1[20], const char *remotes_name)
+int push_unpushed_submodules(struct sha1_array *commits,
+                            const char *remotes_name,
+                            int dry_run)
 {
        int i, ret = 1;
        struct string_list needs_pushing = STRING_LIST_INIT_DUP;
 
-       if (!find_unpushed_submodules(new_sha1, remotes_name, &needs_pushing))
+       if (!find_unpushed_submodules(commits, remotes_name, &needs_pushing))
                return 1;
 
        for (i = 0; i < needs_pushing.nr; i++) {
                const char *path = needs_pushing.items[i].string;
                fprintf(stderr, "Pushing submodule '%s'\n", path);
-               if (!push_submodule(path)) {
+               if (!push_submodule(path, dry_run)) {
                        fprintf(stderr, "Unable to push submodule '%s'\n", path);
                        ret = 0;
                }
@@ -1018,45 +1143,64 @@ int submodule_uses_gitfile(const char *path)
        return 1;
 }
 
-int ok_to_remove_submodule(const char *path)
+/*
+ * Check if it is a bad idea to remove a submodule, i.e. if we'd lose data
+ * when doing so.
+ *
+ * Return 1 if we'd lose data, return 0 if the removal is fine,
+ * and negative values for errors.
+ */
+int bad_to_remove_submodule(const char *path, unsigned flags)
 {
        ssize_t len;
        struct child_process cp = CHILD_PROCESS_INIT;
-       const char *argv[] = {
-               "status",
-               "--porcelain",
-               "-u",
-               "--ignore-submodules=none",
-               NULL,
-       };
        struct strbuf buf = STRBUF_INIT;
-       int ok_to_remove = 1;
+       int ret = 0;
 
        if (!file_exists(path) || is_empty_dir(path))
-               return 1;
+               return 0;
 
        if (!submodule_uses_gitfile(path))
-               return 0;
+               return 1;
+
+       argv_array_pushl(&cp.args, "status", "--porcelain",
+                                  "--ignore-submodules=none", NULL);
+
+       if (flags & SUBMODULE_REMOVAL_IGNORE_UNTRACKED)
+               argv_array_push(&cp.args, "-uno");
+       else
+               argv_array_push(&cp.args, "-uall");
+
+       if (!(flags & SUBMODULE_REMOVAL_IGNORE_IGNORED_UNTRACKED))
+               argv_array_push(&cp.args, "--ignored");
 
-       cp.argv = argv;
        prepare_submodule_repo_env(&cp.env_array);
        cp.git_cmd = 1;
        cp.no_stdin = 1;
        cp.out = -1;
        cp.dir = path;
-       if (start_command(&cp))
-               die("Could not run 'git status --porcelain -uall --ignore-submodules=none' in submodule %s", path);
+       if (start_command(&cp)) {
+               if (flags & SUBMODULE_REMOVAL_DIE_ON_ERROR)
+                       die(_("could not start 'git status in submodule '%s'"),
+                               path);
+               ret = -1;
+               goto out;
+       }
 
        len = strbuf_read(&buf, cp.out, 1024);
        if (len > 2)
-               ok_to_remove = 0;
+               ret = 1;
        close(cp.out);
 
-       if (finish_command(&cp))
-               die("'git status --porcelain -uall --ignore-submodules=none' failed in submodule %s", path);
-
+       if (finish_command(&cp)) {
+               if (flags & SUBMODULE_REMOVAL_DIE_ON_ERROR)
+                       die(_("could not run 'git status in submodule '%s'"),
+                               path);
+               ret = -1;
+       }
+out:
        strbuf_release(&buf);
-       return ok_to_remove;
+       return ret;
 }
 
 static int find_first_merges(struct object_array *result, const char *path,
@@ -1222,30 +1366,6 @@ int merge_submodule(unsigned char result[20], const char *path,
        return 0;
 }
 
-/* Update gitfile and core.worktree setting to connect work tree and git dir */
-void connect_work_tree_and_git_dir(const char *work_tree, const char *git_dir)
-{
-       struct strbuf file_name = STRBUF_INIT;
-       struct strbuf rel_path = STRBUF_INIT;
-       const char *real_work_tree = xstrdup(real_path(work_tree));
-
-       /* Update gitfile */
-       strbuf_addf(&file_name, "%s/.git", work_tree);
-       write_file(file_name.buf, "gitdir: %s",
-                  relative_path(git_dir, real_work_tree, &rel_path));
-
-       /* Update core.worktree setting */
-       strbuf_reset(&file_name);
-       strbuf_addf(&file_name, "%s/config", git_dir);
-       git_config_set_in_file(file_name.buf, "core.worktree",
-                              relative_path(real_work_tree, git_dir,
-                                            &rel_path));
-
-       strbuf_release(&file_name);
-       strbuf_release(&rel_path);
-       free((void *)real_work_tree);
-}
-
 int parallel_submodules(void)
 {
        return parallel_jobs;
@@ -1259,5 +1379,138 @@ void prepare_submodule_repo_env(struct argv_array *out)
                if (strcmp(*var, CONFIG_DATA_ENVIRONMENT))
                        argv_array_push(out, *var);
        }
-       argv_array_push(out, "GIT_DIR=.git");
+       argv_array_pushf(out, "%s=%s", GIT_DIR_ENVIRONMENT,
+                        DEFAULT_GIT_DIR_ENVIRONMENT);
+}
+
+/*
+ * Embeds a single submodules git directory into the superprojects git dir,
+ * non recursively.
+ */
+static void relocate_single_git_dir_into_superproject(const char *prefix,
+                                                     const char *path)
+{
+       char *old_git_dir = NULL, *real_old_git_dir = NULL, *real_new_git_dir = NULL;
+       const char *new_git_dir;
+       const struct submodule *sub;
+
+       if (submodule_uses_worktrees(path))
+               die(_("relocate_gitdir for submodule '%s' with "
+                     "more than one worktree not supported"), path);
+
+       old_git_dir = xstrfmt("%s/.git", path);
+       if (read_gitfile(old_git_dir))
+               /* If it is an actual gitfile, it doesn't need migration. */
+               return;
+
+       real_old_git_dir = real_pathdup(old_git_dir);
+
+       sub = submodule_from_path(null_sha1, path);
+       if (!sub)
+               die(_("could not lookup name for submodule '%s'"), path);
+
+       new_git_dir = git_path("modules/%s", sub->name);
+       if (safe_create_leading_directories_const(new_git_dir) < 0)
+               die(_("could not create directory '%s'"), new_git_dir);
+       real_new_git_dir = real_pathdup(new_git_dir);
+
+       if (!prefix)
+               prefix = get_super_prefix();
+
+       fprintf(stderr, _("Migrating git directory of '%s%s' from\n'%s' to\n'%s'\n"),
+               prefix ? prefix : "", path,
+               real_old_git_dir, real_new_git_dir);
+
+       relocate_gitdir(path, real_old_git_dir, real_new_git_dir);
+
+       free(old_git_dir);
+       free(real_old_git_dir);
+       free(real_new_git_dir);
+}
+
+/*
+ * Migrate the git directory of the submodule given by path from
+ * having its git directory within the working tree to the git dir nested
+ * in its superprojects git dir under modules/.
+ */
+void absorb_git_dir_into_superproject(const char *prefix,
+                                     const char *path,
+                                     unsigned flags)
+{
+       int err_code;
+       const char *sub_git_dir;
+       struct strbuf gitdir = STRBUF_INIT;
+       strbuf_addf(&gitdir, "%s/.git", path);
+       sub_git_dir = resolve_gitdir_gently(gitdir.buf, &err_code);
+
+       /* Not populated? */
+       if (!sub_git_dir) {
+               char *real_new_git_dir;
+               const char *new_git_dir;
+               const struct submodule *sub;
+
+               if (err_code == READ_GITFILE_ERR_STAT_FAILED) {
+                       /* unpopulated as expected */
+                       strbuf_release(&gitdir);
+                       return;
+               }
+
+               if (err_code != READ_GITFILE_ERR_NOT_A_REPO)
+                       /* We don't know what broke here. */
+                       read_gitfile_error_die(err_code, path, NULL);
+
+               /*
+               * Maybe populated, but no git directory was found?
+               * This can happen if the superproject is a submodule
+               * itself and was just absorbed. The absorption of the
+               * superproject did not rewrite the git file links yet,
+               * fix it now.
+               */
+               sub = submodule_from_path(null_sha1, path);
+               if (!sub)
+                       die(_("could not lookup name for submodule '%s'"), path);
+               new_git_dir = git_path("modules/%s", sub->name);
+               if (safe_create_leading_directories_const(new_git_dir) < 0)
+                       die(_("could not create directory '%s'"), new_git_dir);
+               real_new_git_dir = real_pathdup(new_git_dir);
+               connect_work_tree_and_git_dir(path, real_new_git_dir);
+
+               free(real_new_git_dir);
+       } else {
+               /* Is it already absorbed into the superprojects git dir? */
+               char *real_sub_git_dir = real_pathdup(sub_git_dir);
+               char *real_common_git_dir = real_pathdup(get_git_common_dir());
+
+               if (!starts_with(real_sub_git_dir, real_common_git_dir))
+                       relocate_single_git_dir_into_superproject(prefix, path);
+
+               free(real_sub_git_dir);
+               free(real_common_git_dir);
+       }
+       strbuf_release(&gitdir);
+
+       if (flags & ABSORB_GITDIR_RECURSE_SUBMODULES) {
+               struct child_process cp = CHILD_PROCESS_INIT;
+               struct strbuf sb = STRBUF_INIT;
+
+               if (flags & ~ABSORB_GITDIR_RECURSE_SUBMODULES)
+                       die("BUG: we don't know how to pass the flags down?");
+
+               if (get_super_prefix())
+                       strbuf_addstr(&sb, get_super_prefix());
+               strbuf_addstr(&sb, path);
+               strbuf_addch(&sb, '/');
+
+               cp.dir = path;
+               cp.git_cmd = 1;
+               cp.no_stdin = 1;
+               argv_array_pushl(&cp.args, "--super-prefix", sb.buf,
+                                          "submodule--helper",
+                                          "absorb-git-dirs", NULL);
+               prepare_submodule_repo_env(&cp.env_array);
+               if (run_command(&cp))
+                       die(_("could not recurse into submodule '%s'"), path);
+
+               strbuf_release(&sb);
+       }
 }
index d9e197a948fdab44b7a5df4161a5df9c3a2938ff..05ab674f069282b3d5b20ca69d9a1fe8f295879b 100644 (file)
@@ -3,8 +3,10 @@
 
 struct diff_options;
 struct argv_array;
+struct sha1_array;
 
 enum {
+       RECURSE_SUBMODULES_ONLY = -5,
        RECURSE_SUBMODULES_CHECK = -4,
        RECURSE_SUBMODULES_ERROR = -3,
        RECURSE_SUBMODULES_NONE = -2,
@@ -29,50 +31,66 @@ struct submodule_update_strategy {
 };
 #define SUBMODULE_UPDATE_STRATEGY_INIT {SM_UPDATE_UNSPECIFIED, NULL}
 
-int is_staging_gitmodules_ok(void);
-int update_path_in_gitmodules(const char *oldpath, const char *newpath);
-int remove_path_from_gitmodules(const char *path);
-void stage_updated_gitmodules(void);
-void set_diffopt_flags_from_submodule_config(struct diff_options *diffopt,
+extern int is_staging_gitmodules_ok(void);
+extern int update_path_in_gitmodules(const char *oldpath, const char *newpath);
+extern int remove_path_from_gitmodules(const char *path);
+extern void stage_updated_gitmodules(void);
+extern void set_diffopt_flags_from_submodule_config(struct diff_options *,
                const char *path);
-int submodule_config(const char *var, const char *value, void *cb);
-void gitmodules_config(void);
-int parse_submodule_update_strategy(const char *value,
+extern int submodule_config(const char *var, const char *value, void *cb);
+extern void gitmodules_config(void);
+extern void gitmodules_config_sha1(const unsigned char *commit_sha1);
+extern int is_submodule_initialized(const char *path);
+extern int is_submodule_populated(const char *path);
+extern int parse_submodule_update_strategy(const char *value,
                struct submodule_update_strategy *dst);
-const char *submodule_strategy_to_string(const struct submodule_update_strategy *s);
-void handle_ignore_submodules_arg(struct diff_options *diffopt, const char *);
-void show_submodule_summary(FILE *f, const char *path,
+extern const char *submodule_strategy_to_string(const struct submodule_update_strategy *s);
+extern void handle_ignore_submodules_arg(struct diff_options *, const char *);
+extern void show_submodule_summary(FILE *f, const char *path,
                const char *line_prefix,
                struct object_id *one, struct object_id *two,
                unsigned dirty_submodule, const char *meta,
                const char *del, const char *add, const char *reset);
-void show_submodule_inline_diff(FILE *f, const char *path,
+extern void show_submodule_inline_diff(FILE *f, const char *path,
                const char *line_prefix,
                struct object_id *one, struct object_id *two,
                unsigned dirty_submodule, const char *meta,
                const char *del, const char *add, const char *reset,
                const struct diff_options *opt);
-void set_config_fetch_recurse_submodules(int value);
-void check_for_new_submodule_commits(unsigned char new_sha1[20]);
-int fetch_populated_submodules(const struct argv_array *options,
+extern void set_config_fetch_recurse_submodules(int value);
+extern void check_for_new_submodule_commits(unsigned char new_sha1[20]);
+extern int fetch_populated_submodules(const struct argv_array *options,
                               const char *prefix, int command_line_option,
                               int quiet, int max_parallel_jobs);
-unsigned is_submodule_modified(const char *path, int ignore_untracked);
-int submodule_uses_gitfile(const char *path);
-int ok_to_remove_submodule(const char *path);
-int merge_submodule(unsigned char result[20], const char *path, const unsigned char base[20],
-                   const unsigned char a[20], const unsigned char b[20], int search);
-int find_unpushed_submodules(unsigned char new_sha1[20], const char *remotes_name,
-               struct string_list *needs_pushing);
-int push_unpushed_submodules(unsigned char new_sha1[20], const char *remotes_name);
-void connect_work_tree_and_git_dir(const char *work_tree, const char *git_dir);
-int parallel_submodules(void);
+extern unsigned is_submodule_modified(const char *path, int ignore_untracked);
+extern int submodule_uses_gitfile(const char *path);
+
+#define SUBMODULE_REMOVAL_DIE_ON_ERROR (1<<0)
+#define SUBMODULE_REMOVAL_IGNORE_UNTRACKED (1<<1)
+#define SUBMODULE_REMOVAL_IGNORE_IGNORED_UNTRACKED (1<<2)
+extern int bad_to_remove_submodule(const char *path, unsigned flags);
+extern int merge_submodule(unsigned char result[20], const char *path,
+                          const unsigned char base[20],
+                          const unsigned char a[20],
+                          const unsigned char b[20], int search);
+extern int find_unpushed_submodules(struct sha1_array *commits,
+                                   const char *remotes_name,
+                                   struct string_list *needs_pushing);
+extern int push_unpushed_submodules(struct sha1_array *commits,
+                                   const char *remotes_name,
+                                   int dry_run);
+extern void connect_work_tree_and_git_dir(const char *work_tree, const char *git_dir);
+extern int parallel_submodules(void);
 
 /*
  * Prepare the "env_array" parameter of a "struct child_process" for executing
  * a submodule by clearing any repo-specific envirionment variables, but
  * retaining any config in the environment.
  */
-void prepare_submodule_repo_env(struct argv_array *out);
+extern void prepare_submodule_repo_env(struct argv_array *out);
 
+#define ABSORB_GITDIR_RECURSE_SUBMODULES (1<<0)
+extern void absorb_git_dir_into_superproject(const char *prefix,
+                                            const char *path,
+                                            unsigned flags);
 #endif
index d613935f1455440843920e1f040b1e97ff3f27dd..1bb06c36f22d9fa0fb01fb8dfad02ffa9f338ebd 100644 (file)
@@ -35,6 +35,12 @@ all: $(DEFAULT_TEST_TARGET)
 test: pre-clean $(TEST_LINT)
        $(MAKE) aggregate-results-and-cleanup
 
+failed:
+       @failed=$$(cd '$(TEST_RESULTS_DIRECTORY_SQ)' && \
+               grep -l '^failed [1-9]' *.counts | \
+               sed -n 's/\.counts$$/.sh/p') && \
+       test -z "$$failed" || $(MAKE) $$failed
+
 prove: pre-clean $(TEST_LINT)
        @echo "*** prove ***"; $(PROVE) --exec '$(SHELL_PATH_SQ)' $(GIT_PROVE_OPTS) $(T) :: $(GIT_TEST_OPTS)
        $(MAKE) clean-except-prove-cache
index 27fe0405b887671ff0ca4cea1b258aa850e66c8c..d2a63bea4346fb76d38ba43508ee6e60599e41a9 100644 (file)
@@ -8,7 +8,7 @@ static struct lock_file index_lock;
 int cmd_main(int ac, const char **av)
 {
        setup_git_directory();
-       hold_locked_index(&index_lock, 1);
+       hold_locked_index(&index_lock, LOCK_DIE_ON_ERROR);
        if (read_cache() < 0)
                die("unable to read index file");
        active_cache_tree = NULL;
index 4a68967bd126e5ab74ec2b39113cce58e7c021bf..c502fa16d307957b6fe23cbd5481fc35f49c00da 100644 (file)
@@ -97,6 +97,31 @@ int cmd_main(int argc, const char **argv)
                return 0;
        }
 
+       if (argc == 2 && !strcmp(argv[1], "sort")) {
+               struct string_list list = STRING_LIST_INIT_NODUP;
+               struct strbuf sb = STRBUF_INIT;
+               struct string_list_item *item;
+
+               strbuf_read(&sb, 0, 0);
+
+               /*
+                * Split by newline, but don't create a string_list item
+                * for the empty string after the last separator.
+                */
+               if (sb.buf[sb.len - 1] == '\n')
+                       strbuf_setlen(&sb, sb.len - 1);
+               string_list_split_in_place(&list, sb.buf, '\n', -1);
+
+               string_list_sort(&list);
+
+               for_each_string_list_item(item, &list)
+                       puts(item->string);
+
+               string_list_clear(&list, 0);
+               strbuf_release(&sb);
+               return 0;
+       }
+
        fprintf(stderr, "%s: unknown function name: %s\n", argv[0],
                argv[1] ? argv[1] : "(there was none)");
        return 1;
index c3e631394f4a47f32e62e266431607861929f328..69174c6e3110d5e214c048aceccf07232b813ce7 100644 (file)
@@ -123,6 +123,7 @@ ScriptAlias /error/ error.sh/
 </Files>
 
 RewriteEngine on
+RewriteRule ^/dumb-redir/(.*)$ /dumb/$1 [R=301]
 RewriteRule ^/smart-redir-perm/(.*)$ /smart/$1 [R=301]
 RewriteRule ^/smart-redir-temp/(.*)$ /smart/$1 [R=302]
 RewriteRule ^/smart-redir-auth/(.*)$ /auth/smart/$1 [R=301]
@@ -132,6 +133,19 @@ RewriteRule ^/ftp-redir/(.*)$ ftp://localhost:1000/$1 [R=302]
 RewriteRule ^/loop-redir/x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-(.*) /$1 [R=302]
 RewriteRule ^/loop-redir/(.*)$ /loop-redir/x-$1 [R=302]
 
+# The first rule issues a client-side redirect to something
+# that _doesn't_ look like a git repo. The second rule is a
+# server-side rewrite, so that it turns out the odd-looking
+# thing _is_ a git repo. The "[PT]" tells Apache to match
+# the usual ScriptAlias rules for /smart.
+RewriteRule ^/insane-redir/(.*)$ /intern-redir/$1/foo [R=301]
+RewriteRule ^/intern-redir/(.*)/foo$ /smart/$1 [PT]
+
+# Serve info/refs internally without redirecting, but
+# issue a redirect for any object requests.
+RewriteRule ^/redir-objects/(.*/info/refs)$ /dumb/$1 [PT]
+RewriteRule ^/redir-objects/(.*/objects/.*)$ /dumb/$1 [R=301]
+
 # Apache 2.2 does not understand <RequireAll>, so we use RewriteCond.
 # And as RewriteCond does not allow testing for non-matches, we match
 # the desired case first (one has abra, two has cadabra), and let it
index b0917d93e64a93faef4a87fed300761f7461420a..02f49cb4097153f84d5e397b1801128e229c7909 100644 (file)
@@ -1,15 +1,12 @@
 # Test routines for checking protocol disabling.
 
-# test cloning a particular protocol
-#   $1 - description of the protocol
-#   $2 - machine-readable name of the protocol
-#   $3 - the URL to try cloning
-test_proto () {
+# Test clone/fetch/push with GIT_ALLOW_PROTOCOL whitelist
+test_whitelist () {
        desc=$1
        proto=$2
        url=$3
 
-       test_expect_success "clone $1 (enabled)" '
+       test_expect_success "clone $desc (enabled)" '
                rm -rf tmp.git &&
                (
                        GIT_ALLOW_PROTOCOL=$proto &&
@@ -18,7 +15,7 @@ test_proto () {
                )
        '
 
-       test_expect_success "fetch $1 (enabled)" '
+       test_expect_success "fetch $desc (enabled)" '
                (
                        cd tmp.git &&
                        GIT_ALLOW_PROTOCOL=$proto &&
@@ -27,7 +24,7 @@ test_proto () {
                )
        '
 
-       test_expect_success "push $1 (enabled)" '
+       test_expect_success "push $desc (enabled)" '
                (
                        cd tmp.git &&
                        GIT_ALLOW_PROTOCOL=$proto &&
@@ -36,7 +33,7 @@ test_proto () {
                )
        '
 
-       test_expect_success "push $1 (disabled)" '
+       test_expect_success "push $desc (disabled)" '
                (
                        cd tmp.git &&
                        GIT_ALLOW_PROTOCOL=none &&
@@ -45,7 +42,7 @@ test_proto () {
                )
        '
 
-       test_expect_success "fetch $1 (disabled)" '
+       test_expect_success "fetch $desc (disabled)" '
                (
                        cd tmp.git &&
                        GIT_ALLOW_PROTOCOL=none &&
@@ -54,7 +51,7 @@ test_proto () {
                )
        '
 
-       test_expect_success "clone $1 (disabled)" '
+       test_expect_success "clone $desc (disabled)" '
                rm -rf tmp.git &&
                (
                        GIT_ALLOW_PROTOCOL=none &&
@@ -62,6 +59,129 @@ test_proto () {
                        test_must_fail git clone --bare "$url" tmp.git
                )
        '
+
+       test_expect_success "clone $desc (env var has precedence)" '
+               rm -rf tmp.git &&
+               (
+                       GIT_ALLOW_PROTOCOL=none &&
+                       export GIT_ALLOW_PROTOCOL &&
+                       test_must_fail git -c protocol.allow=always clone --bare "$url" tmp.git &&
+                       test_must_fail git -c protocol.$proto.allow=always clone --bare "$url" tmp.git
+               )
+       '
+}
+
+test_config () {
+       desc=$1
+       proto=$2
+       url=$3
+
+       # Test clone/fetch/push with protocol.<type>.allow config
+       test_expect_success "clone $desc (enabled with config)" '
+               rm -rf tmp.git &&
+               git -c protocol.$proto.allow=always clone --bare "$url" tmp.git
+       '
+
+       test_expect_success "fetch $desc (enabled)" '
+               git -C tmp.git -c protocol.$proto.allow=always fetch
+       '
+
+       test_expect_success "push $desc (enabled)" '
+               git -C tmp.git -c protocol.$proto.allow=always  push origin HEAD:pushed
+       '
+
+       test_expect_success "push $desc (disabled)" '
+               test_must_fail git -C tmp.git -c protocol.$proto.allow=never push origin HEAD:pushed
+       '
+
+       test_expect_success "fetch $desc (disabled)" '
+               test_must_fail git -C tmp.git -c protocol.$proto.allow=never fetch
+       '
+
+       test_expect_success "clone $desc (disabled)" '
+               rm -rf tmp.git &&
+               test_must_fail git -c protocol.$proto.allow=never clone --bare "$url" tmp.git
+       '
+
+       # Test clone/fetch/push with protocol.user.allow and its env var
+       test_expect_success "clone $desc (enabled)" '
+               rm -rf tmp.git &&
+               git -c protocol.$proto.allow=user clone --bare "$url" tmp.git
+       '
+
+       test_expect_success "fetch $desc (enabled)" '
+               git -C tmp.git -c protocol.$proto.allow=user fetch
+       '
+
+       test_expect_success "push $desc (enabled)" '
+               git -C tmp.git -c protocol.$proto.allow=user push origin HEAD:pushed
+       '
+
+       test_expect_success "push $desc (disabled)" '
+               (
+                       cd tmp.git &&
+                       GIT_PROTOCOL_FROM_USER=0 &&
+                       export GIT_PROTOCOL_FROM_USER &&
+                       test_must_fail git -c protocol.$proto.allow=user push origin HEAD:pushed
+               )
+       '
+
+       test_expect_success "fetch $desc (disabled)" '
+               (
+                       cd tmp.git &&
+                       GIT_PROTOCOL_FROM_USER=0 &&
+                       export GIT_PROTOCOL_FROM_USER &&
+                       test_must_fail git -c protocol.$proto.allow=user fetch
+               )
+       '
+
+       test_expect_success "clone $desc (disabled)" '
+               rm -rf tmp.git &&
+               (
+                       GIT_PROTOCOL_FROM_USER=0 &&
+                       export GIT_PROTOCOL_FROM_USER &&
+                       test_must_fail git -c protocol.$proto.allow=user clone --bare "$url" tmp.git
+               )
+       '
+
+       # Test clone/fetch/push with protocol.allow user defined default
+       test_expect_success "clone $desc (enabled)" '
+               rm -rf tmp.git &&
+               git config --global protocol.allow always &&
+               git clone --bare "$url" tmp.git
+       '
+
+       test_expect_success "fetch $desc (enabled)" '
+               git -C tmp.git fetch
+       '
+
+       test_expect_success "push $desc (enabled)" '
+               git -C tmp.git push origin HEAD:pushed
+       '
+
+       test_expect_success "push $desc (disabled)" '
+               git config --global protocol.allow never &&
+               test_must_fail git -C tmp.git push origin HEAD:pushed
+       '
+
+       test_expect_success "fetch $desc (disabled)" '
+               test_must_fail git -C tmp.git fetch
+       '
+
+       test_expect_success "clone $desc (disabled)" '
+               rm -rf tmp.git &&
+               test_must_fail git clone --bare "$url" tmp.git
+       '
+}
+
+# test cloning a particular protocol
+#   $1 - description of the protocol
+#   $2 - machine-readable name of the protocol
+#   $3 - the URL to try cloning
+test_proto () {
+       test_whitelist "$@"
+
+       test_config "$@"
 }
 
 # set up an ssh wrapper that will access $host/$repo in the
index 79cdd34a540ddc7230b1aefb7fb4af5915c7085f..915eb4a7c65ca5c574beddc676bf0115990eec3f 100755 (executable)
@@ -69,10 +69,7 @@ create_lib_submodule_repo () {
 
                git checkout -b "replace_sub1_with_directory" "add_sub1" &&
                git submodule update &&
-               (
-                       cd sub1 &&
-                       git checkout modifications
-               ) &&
+               git -C sub1 checkout modifications &&
                git rm --cached sub1 &&
                rm sub1/.git* &&
                git config -f .gitmodules --remove-section "submodule.sub1" &&
diff --git a/t/perf/p0071-sort.sh b/t/perf/p0071-sort.sh
new file mode 100755 (executable)
index 0000000..7c9a35a
--- /dev/null
@@ -0,0 +1,26 @@
+#!/bin/sh
+
+test_description='Basic sort performance tests'
+. ./perf-lib.sh
+
+test_perf_default_repo
+
+test_expect_success 'setup' '
+       git ls-files --stage "*.[ch]" "*.sh" |
+       cut -f2 -d" " |
+       git cat-file --batch >unsorted
+'
+
+test_perf 'sort(1)' '
+       sort <unsorted >expect
+'
+
+test_perf 'string_list_sort()' '
+       test-string-list sort <unsorted >actual
+'
+
+test_expect_success 'string_list_sort() sorts like sort(1)' '
+       test_cmp_bin expect actual
+'
+
+test_done
index 5ee9211f988dce1f334d796623feccda85641bbe..99bdb16c8583a98b0c33cddadabb85f47b7d5c41 100755 (executable)
@@ -13,6 +13,13 @@ test_expect_success 'repack' '
        export PACK
 '
 
+test_expect_success 'create target repositories' '
+       for repo in t1 t2 t3 t4 t5 t6
+       do
+               git init --bare $repo
+       done
+'
+
 test_perf 'index-pack 0 threads' '
        GIT_DIR=t1 git index-pack --threads=1 --stdin < $PACK
 '
index b8fc588b1922760ade8502fda3dc465f6ebf2887..e424de5363848233d2c1d9807df0a01411fd0d6d 100755 (executable)
@@ -258,6 +258,9 @@ test_expect_success POSIXPERM 'init creates a new deep directory (umask vs. shar
        (
                # Leading directories should honor umask while
                # the repository itself should follow "shared"
+               mkdir newdir &&
+               # Remove a default ACL if possible.
+               (setfacl -k newdir 2>/dev/null || true) &&
                umask 002 &&
                git init --bare --shared=0660 newdir/a/b/c &&
                test_path_is_dir newdir/a/b/c/refs &&
index 4ea534e9fa70ea302d4a88a8bc922c100f896873..161f5604464d2f963e60af54eedea3f91be041fa 100755 (executable)
@@ -93,7 +93,7 @@ test_expect_success setup '
        git checkout -- test test.t test.i &&
 
        echo "content-test2" >test2.o &&
-       echo "content-test3 - filename with special characters" >"test3 '\''sq'\'',\$x.o"
+       echo "content-test3 - filename with special characters" >"test3 '\''sq'\'',\$x=.o"
 '
 
 script='s/^\$Id: \([0-9a-f]*\) \$/\1/p'
@@ -350,21 +350,20 @@ test_expect_success PERL 'required process filter should filter data' '
                cd repo &&
                git init &&
 
-               echo "git-stderr.log" >.gitignore &&
                echo "*.r filter=protocol" >.gitattributes &&
                git add . &&
-               git commit -m "test commit 1" &&
+               git commit -m "test commit 1" &&
                git branch empty-branch &&
 
                cp "$TEST_ROOT/test.o" test.r &&
                cp "$TEST_ROOT/test2.o" test2.r &&
                mkdir testsubdir &&
-               cp "$TEST_ROOT/test3 '\''sq'\'',\$x.o" "testsubdir/test3 '\''sq'\'',\$x.r" &&
+               cp "$TEST_ROOT/test3 '\''sq'\'',\$x=.o" "testsubdir/test3 '\''sq'\'',\$x=.r" &&
                >test4-empty.r &&
 
                S=$(file_size test.r) &&
                S2=$(file_size test2.r) &&
-               S3=$(file_size "testsubdir/test3 '\''sq'\'',\$x.r") &&
+               S3=$(file_size "testsubdir/test3 '\''sq'\'',\$x=.r") &&
 
                filter_git add . &&
                cat >expected.log <<-EOF &&
@@ -373,35 +372,20 @@ test_expect_success PERL 'required process filter should filter data' '
                        IN: clean test.r $S [OK] -- OUT: $S . [OK]
                        IN: clean test2.r $S2 [OK] -- OUT: $S2 . [OK]
                        IN: clean test4-empty.r 0 [OK] -- OUT: 0  [OK]
-                       IN: clean testsubdir/test3 '\''sq'\'',\$x.r $S3 [OK] -- OUT: $S3 . [OK]
+                       IN: clean testsubdir/test3 '\''sq'\'',\$x=.r $S3 [OK] -- OUT: $S3 . [OK]
                        STOP
                EOF
                test_cmp_count expected.log rot13-filter.log &&
 
-               filter_git commit . -m "test commit 2" &&
-               cat >expected.log <<-EOF &&
-                       START
-                       init handshake complete
-                       IN: clean test.r $S [OK] -- OUT: $S . [OK]
-                       IN: clean test2.r $S2 [OK] -- OUT: $S2 . [OK]
-                       IN: clean test4-empty.r 0 [OK] -- OUT: 0  [OK]
-                       IN: clean testsubdir/test3 '\''sq'\'',\$x.r $S3 [OK] -- OUT: $S3 . [OK]
-                       IN: clean test.r $S [OK] -- OUT: $S . [OK]
-                       IN: clean test2.r $S2 [OK] -- OUT: $S2 . [OK]
-                       IN: clean test4-empty.r 0 [OK] -- OUT: 0  [OK]
-                       IN: clean testsubdir/test3 '\''sq'\'',\$x.r $S3 [OK] -- OUT: $S3 . [OK]
-                       STOP
-               EOF
-               test_cmp_count expected.log rot13-filter.log &&
-
-               rm -f test2.r "testsubdir/test3 '\''sq'\'',\$x.r" &&
+               git commit -m "test commit 2" &&
+               rm -f test2.r "testsubdir/test3 '\''sq'\'',\$x=.r" &&
 
                filter_git checkout --quiet --no-progress . &&
                cat >expected.log <<-EOF &&
                        START
                        init handshake complete
                        IN: smudge test2.r $S2 [OK] -- OUT: $S2 . [OK]
-                       IN: smudge testsubdir/test3 '\''sq'\'',\$x.r $S3 [OK] -- OUT: $S3 . [OK]
+                       IN: smudge testsubdir/test3 '\''sq'\'',\$x=.r $S3 [OK] -- OUT: $S3 . [OK]
                        STOP
                EOF
                test_cmp_exclude_clean expected.log rot13-filter.log &&
@@ -422,14 +406,14 @@ test_expect_success PERL 'required process filter should filter data' '
                        IN: smudge test.r $S [OK] -- OUT: $S . [OK]
                        IN: smudge test2.r $S2 [OK] -- OUT: $S2 . [OK]
                        IN: smudge test4-empty.r 0 [OK] -- OUT: 0  [OK]
-                       IN: smudge testsubdir/test3 '\''sq'\'',\$x.r $S3 [OK] -- OUT: $S3 . [OK]
+                       IN: smudge testsubdir/test3 '\''sq'\'',\$x=.r $S3 [OK] -- OUT: $S3 . [OK]
                        STOP
                EOF
                test_cmp_exclude_clean expected.log rot13-filter.log &&
 
                test_cmp_committed_rot13 "$TEST_ROOT/test.o" test.r &&
                test_cmp_committed_rot13 "$TEST_ROOT/test2.o" test2.r &&
-               test_cmp_committed_rot13 "$TEST_ROOT/test3 '\''sq'\'',\$x.o" "testsubdir/test3 '\''sq'\'',\$x.r"
+               test_cmp_committed_rot13 "$TEST_ROOT/test3 '\''sq'\'',\$x=.o" "testsubdir/test3 '\''sq'\'',\$x=.r"
        )
 '
 
index 4d5697ee51c673abbe8a1a90b58bf5b7b9856ce1..617f581e56cac95191d6f1301566fa6671ecaf6f 100644 (file)
@@ -109,14 +109,18 @@ sub packet_flush {
 $debug->flush();
 
 while (1) {
-       my ($command) = packet_txt_read() =~ /^command=([^=]+)$/;
+       my ($command) = packet_txt_read() =~ /^command=(.+)$/;
        print $debug "IN: $command";
        $debug->flush();
 
-       my ($pathname) = packet_txt_read() =~ /^pathname=([^=]+)$/;
+       my ($pathname) = packet_txt_read() =~ /^pathname=(.+)$/;
        print $debug " $pathname";
        $debug->flush();
 
+       if ( $pathname eq "" ) {
+               die "bad pathname '$pathname'";
+       }
+
        # Flush
        packet_bin_read();
 
index 2c10cb4693e28eecf7771978a2f3b702e5f3bd30..2cbf7b95907384b4b4b5ac91f801026810b85f0a 100755 (executable)
@@ -4,7 +4,7 @@
 use strict;
 use warnings;
 use POSIX qw(:locale_h);
-use Test::More tests => 8;
+use Test::More tests => 13;
 use Git::I18N;
 
 my $has_gettext_library = $Git::I18N::__HAS_LIBRARY;
@@ -31,6 +31,8 @@
        # more gettext wrapper functions.
        my %prototypes = (qw(
                __      $
+               __n     $$$
+               N__     $
        ));
        while (my ($sub, $proto) = each %prototypes) {
                is(prototype(\&{"Git::I18N::$sub"}), $proto, "sanity: $sub has a $proto prototype");
        my ($got, $expect) = (('TEST: A Perl test string') x 2);
 
        is(__($got), $expect, "Passing a string through __() in the C locale works");
+
+       my ($got_singular, $got_plural, $expect_singular, $expect_plural) =
+               (('TEST: 1 file', 'TEST: n files') x 2);
+
+       is(__n($got_singular, $got_plural, 1), $expect_singular,
+               "Get singular string through __n() in C locale");
+       is(__n($got_singular, $got_plural, 2), $expect_plural,
+               "Get plural string through __n() in C locale");
+
+       is(N__($got), $expect, "Passing a string through N__() in the C locale works");
 }
 
 # Test a basic message on different locales
index a0b79b4839fb21a96bf8aca769542d93b21bb90f..3c4d2d6045bf026cf164374a41ae759d08a69bf8 100755 (executable)
@@ -128,29 +128,29 @@ cat >expected <<\EOF
 EOF
 
 check_result () {
-    git ls-files --stage | sed -e 's/ '"$_x40"' / X /' >current &&
-    test_cmp expected current
+       git ls-files --stage | sed -e 's/ '"$_x40"' / X /' >current &&
+       test_cmp expected current
 }
 
 # This is done on an empty work directory, which is the normal
 # merge person behaviour.
-test_expect_success \
-    '3-way merge with git read-tree -m, empty cache' \
-    "rm -fr [NDMALTS][NDMALTSF] Z &&
-     rm .git/index &&
-     read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
-     check_result"
+test_expect_success '3-way merge with git read-tree -m, empty cache' '
+       rm -fr [NDMALTS][NDMALTSF] Z &&
+       rm .git/index &&
+       read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
+       check_result
+'
 
 # This starts out with the first head, which is the normal
 # patch submitter behaviour.
-test_expect_success \
-    '3-way merge with git read-tree -m, match H' \
-    "rm -fr [NDMALTS][NDMALTSF] Z &&
-     rm .git/index &&
-     read_tree_must_succeed $tree_A &&
-     git checkout-index -f -u -a &&
-     read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
-     check_result"
+test_expect_success '3-way merge with git read-tree -m, match H' '
+       rm -fr [NDMALTS][NDMALTSF] Z &&
+       rm .git/index &&
+       read_tree_must_succeed $tree_A &&
+       git checkout-index -f -u -a &&
+       read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
+       check_result
+'
 
 : <<\END_OF_CASE_TABLE
 
@@ -208,322 +208,304 @@ DF (file) when tree B require DF to be a directory by having DF/DF
 
 END_OF_CASE_TABLE
 
-test_expect_success '1 - must not have an entry not in A.' "
-     rm -f .git/index XX &&
-     echo XX >XX &&
-     git update-index --add XX &&
-     read_tree_must_fail -m $tree_O $tree_A $tree_B
-"
-
-test_expect_success \
-    '2 - must match B in !O && !A && B case.' \
-    "rm -f .git/index NA &&
-     cp .orig-B/NA NA &&
-     git update-index --add NA &&
-     read_tree_must_succeed -m $tree_O $tree_A $tree_B"
-
-test_expect_success \
-    '2 - matching B alone is OK in !O && !A && B case.' \
-    "rm -f .git/index NA &&
-     cp .orig-B/NA NA &&
-     git update-index --add NA &&
-     echo extra >>NA &&
-     read_tree_must_succeed -m $tree_O $tree_A $tree_B"
-
-test_expect_success \
-    '3 - must match A in !O && A && !B case.' \
-    "rm -f .git/index AN &&
-     cp .orig-A/AN AN &&
-     git update-index --add AN &&
-     read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
-     check_result"
-
-test_expect_success \
-    '3 - matching A alone is OK in !O && A && !B case.' \
-    "rm -f .git/index AN &&
-     cp .orig-A/AN AN &&
-     git update-index --add AN &&
-     echo extra >>AN &&
-     read_tree_must_succeed -m $tree_O $tree_A $tree_B"
-
-test_expect_success \
-    '3 (fail) - must match A in !O && A && !B case.' "
-     rm -f .git/index AN &&
-     cp .orig-A/AN AN &&
-     echo extra >>AN &&
-     git update-index --add AN &&
-     read_tree_must_fail -m $tree_O $tree_A $tree_B
-"
-
-test_expect_success \
-    '4 - must match and be up-to-date in !O && A && B && A!=B case.' \
-    "rm -f .git/index AA &&
-     cp .orig-A/AA AA &&
-     git update-index --add AA &&
-     read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
-     check_result"
-
-test_expect_success \
-    '4 (fail) - must match and be up-to-date in !O && A && B && A!=B case.' "
-     rm -f .git/index AA &&
-     cp .orig-A/AA AA &&
-     git update-index --add AA &&
-     echo extra >>AA &&
-     read_tree_must_fail -m $tree_O $tree_A $tree_B
-"
-
-test_expect_success \
-    '4 (fail) - must match and be up-to-date in !O && A && B && A!=B case.' "
-     rm -f .git/index AA &&
-     cp .orig-A/AA AA &&
-     echo extra >>AA &&
-     git update-index --add AA &&
-     read_tree_must_fail -m $tree_O $tree_A $tree_B
-"
-
-test_expect_success \
-    '5 - must match in !O && A && B && A==B case.' \
-    "rm -f .git/index LL &&
-     cp .orig-A/LL LL &&
-     git update-index --add LL &&
-     read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
-     check_result"
-
-test_expect_success \
-    '5 - must match in !O && A && B && A==B case.' \
-    "rm -f .git/index LL &&
-     cp .orig-A/LL LL &&
-     git update-index --add LL &&
-     echo extra >>LL &&
-     read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
-     check_result"
-
-test_expect_success \
-    '5 (fail) - must match A in !O && A && B && A==B case.' "
-     rm -f .git/index LL &&
-     cp .orig-A/LL LL &&
-     echo extra >>LL &&
-     git update-index --add LL &&
-     read_tree_must_fail -m $tree_O $tree_A $tree_B
-"
-
-test_expect_success \
-    '6 - must not exist in O && !A && !B case' "
-     rm -f .git/index DD &&
-     echo DD >DD &&
-     git update-index --add DD &&
-     read_tree_must_fail -m $tree_O $tree_A $tree_B
-"
-
-test_expect_success \
-    '7 - must not exist in O && !A && B && O!=B case' "
-     rm -f .git/index DM &&
-     cp .orig-B/DM DM &&
-     git update-index --add DM &&
-     read_tree_must_fail -m $tree_O $tree_A $tree_B
-"
-
-test_expect_success \
-    '8 - must not exist in O && !A && B && O==B case' "
-     rm -f .git/index DN &&
-     cp .orig-B/DN DN &&
-     git update-index --add DN &&
-     read_tree_must_fail -m $tree_O $tree_A $tree_B
-"
-
-test_expect_success \
-    '9 - must match and be up-to-date in O && A && !B && O!=A case' \
-    "rm -f .git/index MD &&
-     cp .orig-A/MD MD &&
-     git update-index --add MD &&
-     read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
-     check_result"
-
-test_expect_success \
-    '9 (fail) - must match and be up-to-date in O && A && !B && O!=A case' "
-     rm -f .git/index MD &&
-     cp .orig-A/MD MD &&
-     git update-index --add MD &&
-     echo extra >>MD &&
-     read_tree_must_fail -m $tree_O $tree_A $tree_B
-"
-
-test_expect_success \
-    '9 (fail) - must match and be up-to-date in O && A && !B && O!=A case' "
-     rm -f .git/index MD &&
-     cp .orig-A/MD MD &&
-     echo extra >>MD &&
-     git update-index --add MD &&
-     read_tree_must_fail -m $tree_O $tree_A $tree_B
-"
-
-test_expect_success \
-    '10 - must match and be up-to-date in O && A && !B && O==A case' \
-    "rm -f .git/index ND &&
-     cp .orig-A/ND ND &&
-     git update-index --add ND &&
-     read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
-     check_result"
-
-test_expect_success \
-    '10 (fail) - must match and be up-to-date in O && A && !B && O==A case' "
-     rm -f .git/index ND &&
-     cp .orig-A/ND ND &&
-     git update-index --add ND &&
-     echo extra >>ND &&
-     read_tree_must_fail -m $tree_O $tree_A $tree_B
-"
-
-test_expect_success \
-    '10 (fail) - must match and be up-to-date in O && A && !B && O==A case' "
-     rm -f .git/index ND &&
-     cp .orig-A/ND ND &&
-     echo extra >>ND &&
-     git update-index --add ND &&
-     read_tree_must_fail -m $tree_O $tree_A $tree_B
-"
-
-test_expect_success \
-    '11 - must match and be up-to-date in O && A && B && O!=A && O!=B && A!=B case' \
-    "rm -f .git/index MM &&
-     cp .orig-A/MM MM &&
-     git update-index --add MM &&
-     read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
-     check_result"
-
-test_expect_success \
-    '11 (fail) - must match and be up-to-date in O && A && B && O!=A && O!=B && A!=B case' "
-     rm -f .git/index MM &&
-     cp .orig-A/MM MM &&
-     git update-index --add MM &&
-     echo extra >>MM &&
-     read_tree_must_fail -m $tree_O $tree_A $tree_B
-"
-
-test_expect_success \
-    '11 (fail) - must match and be up-to-date in O && A && B && O!=A && O!=B && A!=B case' "
-     rm -f .git/index MM &&
-     cp .orig-A/MM MM &&
-     echo extra >>MM &&
-     git update-index --add MM &&
-     read_tree_must_fail -m $tree_O $tree_A $tree_B
-"
-
-test_expect_success \
-    '12 - must match A in O && A && B && O!=A && A==B case' \
-    "rm -f .git/index SS &&
-     cp .orig-A/SS SS &&
-     git update-index --add SS &&
-     read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
-     check_result"
-
-test_expect_success \
-    '12 - must match A in O && A && B && O!=A && A==B case' \
-    "rm -f .git/index SS &&
-     cp .orig-A/SS SS &&
-     git update-index --add SS &&
-     echo extra >>SS &&
-     read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
-     check_result"
-
-test_expect_success \
-    '12 (fail) - must match A in O && A && B && O!=A && A==B case' "
-     rm -f .git/index SS &&
-     cp .orig-A/SS SS &&
-     echo extra >>SS &&
-     git update-index --add SS &&
-     read_tree_must_fail -m $tree_O $tree_A $tree_B
-"
-
-test_expect_success \
-    '13 - must match A in O && A && B && O!=A && O==B case' \
-    "rm -f .git/index MN &&
-     cp .orig-A/MN MN &&
-     git update-index --add MN &&
-     read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
-     check_result"
-
-test_expect_success \
-    '13 - must match A in O && A && B && O!=A && O==B case' \
-    "rm -f .git/index MN &&
-     cp .orig-A/MN MN &&
-     git update-index --add MN &&
-     echo extra >>MN &&
-     read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
-     check_result"
-
-test_expect_success \
-    '14 - must match and be up-to-date in O && A && B && O==A && O!=B case' \
-    "rm -f .git/index NM &&
-     cp .orig-A/NM NM &&
-     git update-index --add NM &&
-     read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
-     check_result"
-
-test_expect_success \
-    '14 - may match B in O && A && B && O==A && O!=B case' \
-    "rm -f .git/index NM &&
-     cp .orig-B/NM NM &&
-     git update-index --add NM &&
-     echo extra >>NM &&
-     read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
-     check_result"
-
-test_expect_success \
-    '14 (fail) - must match and be up-to-date in O && A && B && O==A && O!=B case' "
-     rm -f .git/index NM &&
-     cp .orig-A/NM NM &&
-     git update-index --add NM &&
-     echo extra >>NM &&
-     read_tree_must_fail -m $tree_O $tree_A $tree_B
-"
-
-test_expect_success \
-    '14 (fail) - must match and be up-to-date in O && A && B && O==A && O!=B case' "
-     rm -f .git/index NM &&
-     cp .orig-A/NM NM &&
-     echo extra >>NM &&
-     git update-index --add NM &&
-     read_tree_must_fail -m $tree_O $tree_A $tree_B
-"
-
-test_expect_success \
-    '15 - must match A in O && A && B && O==A && O==B case' \
-    "rm -f .git/index NN &&
-     cp .orig-A/NN NN &&
-     git update-index --add NN &&
-     read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
-     check_result"
-
-test_expect_success \
-    '15 - must match A in O && A && B && O==A && O==B case' \
-    "rm -f .git/index NN &&
-     cp .orig-A/NN NN &&
-     git update-index --add NN &&
-     echo extra >>NN &&
-     read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
-     check_result"
-
-test_expect_success \
-    '15 (fail) - must match A in O && A && B && O==A && O==B case' "
-     rm -f .git/index NN &&
-     cp .orig-A/NN NN &&
-     echo extra >>NN &&
-     git update-index --add NN &&
-     read_tree_must_fail -m $tree_O $tree_A $tree_B
-"
-
-# #16
-test_expect_success \
-    '16 - A matches in one and B matches in another.' \
-    'rm -f .git/index F16 &&
-    echo F16 >F16 &&
-    git update-index --add F16 &&
-    tree0=$(git write-tree) &&
-    echo E16 >F16 &&
-    git update-index F16 &&
-    tree1=$(git write-tree) &&
-    read_tree_must_succeed -m $tree0 $tree1 $tree1 $tree0 &&
-    git ls-files --stage'
+test_expect_success '1 - must not have an entry not in A.' '
+       rm -f .git/index XX &&
+       echo XX >XX &&
+       git update-index --add XX &&
+       read_tree_must_fail -m $tree_O $tree_A $tree_B
+'
+
+test_expect_success '2 - must match B in !O && !A && B case.' '
+       rm -f .git/index NA &&
+       cp .orig-B/NA NA &&
+       git update-index --add NA &&
+       read_tree_must_succeed -m $tree_O $tree_A $tree_B
+'
+
+test_expect_success '2 - matching B alone is OK in !O && !A && B case.' '
+       rm -f .git/index NA &&
+       cp .orig-B/NA NA &&
+       git update-index --add NA &&
+       echo extra >>NA &&
+       read_tree_must_succeed -m $tree_O $tree_A $tree_B
+'
+
+test_expect_success '3 - must match A in !O && A && !B case.' '
+       rm -f .git/index AN &&
+       cp .orig-A/AN AN &&
+       git update-index --add AN &&
+       read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
+       check_result
+'
+
+test_expect_success '3 - matching A alone is OK in !O && A && !B case.' '
+       rm -f .git/index AN &&
+       cp .orig-A/AN AN &&
+       git update-index --add AN &&
+       echo extra >>AN &&
+       read_tree_must_succeed -m $tree_O $tree_A $tree_B
+'
+
+test_expect_success '3 (fail) - must match A in !O && A && !B case.' '
+       rm -f .git/index AN &&
+       cp .orig-A/AN AN &&
+       echo extra >>AN &&
+       git update-index --add AN &&
+       read_tree_must_fail -m $tree_O $tree_A $tree_B
+'
+
+test_expect_success '4 - must match and be up-to-date in !O && A && B && A!=B case.' '
+       rm -f .git/index AA &&
+       cp .orig-A/AA AA &&
+       git update-index --add AA &&
+       read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
+       check_result
+'
+
+test_expect_success '4 (fail) - must match and be up-to-date in !O && A && B && A!=B case.' '
+       rm -f .git/index AA &&
+       cp .orig-A/AA AA &&
+       git update-index --add AA &&
+       echo extra >>AA &&
+       read_tree_must_fail -m $tree_O $tree_A $tree_B
+'
+
+test_expect_success '4 (fail) - must match and be up-to-date in !O && A && B && A!=B case.' '
+       rm -f .git/index AA &&
+       cp .orig-A/AA AA &&
+       echo extra >>AA &&
+       git update-index --add AA &&
+       read_tree_must_fail -m $tree_O $tree_A $tree_B
+'
+
+test_expect_success '5 - must match in !O && A && B && A==B case.' '
+       rm -f .git/index LL &&
+       cp .orig-A/LL LL &&
+       git update-index --add LL &&
+       read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
+       check_result
+'
+
+test_expect_success '5 - must match in !O && A && B && A==B case.' '
+       rm -f .git/index LL &&
+       cp .orig-A/LL LL &&
+       git update-index --add LL &&
+       echo extra >>LL &&
+       read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
+       check_result
+'
+
+test_expect_success '5 (fail) - must match A in !O && A && B && A==B case.' '
+       rm -f .git/index LL &&
+       cp .orig-A/LL LL &&
+       echo extra >>LL &&
+       git update-index --add LL &&
+       read_tree_must_fail -m $tree_O $tree_A $tree_B
+'
+
+test_expect_success '6 - must not exist in O && !A && !B case' '
+       rm -f .git/index DD &&
+       echo DD >DD &&
+       git update-index --add DD &&
+       read_tree_must_fail -m $tree_O $tree_A $tree_B
+'
+
+test_expect_success '7 - must not exist in O && !A && B && O!=B case' '
+       rm -f .git/index DM &&
+       cp .orig-B/DM DM &&
+       git update-index --add DM &&
+       read_tree_must_fail -m $tree_O $tree_A $tree_B
+'
+
+test_expect_success '8 - must not exist in O && !A && B && O==B case' '
+       rm -f .git/index DN &&
+       cp .orig-B/DN DN &&
+       git update-index --add DN &&
+       read_tree_must_fail -m $tree_O $tree_A $tree_B
+'
+
+test_expect_success '9 - must match and be up-to-date in O && A && !B && O!=A case' '
+       rm -f .git/index MD &&
+       cp .orig-A/MD MD &&
+       git update-index --add MD &&
+       read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
+       check_result
+'
+
+test_expect_success '9 (fail) - must match and be up-to-date in O && A && !B && O!=A case' '
+       rm -f .git/index MD &&
+       cp .orig-A/MD MD &&
+       git update-index --add MD &&
+       echo extra >>MD &&
+       read_tree_must_fail -m $tree_O $tree_A $tree_B
+'
+
+test_expect_success '9 (fail) - must match and be up-to-date in O && A && !B && O!=A case' '
+       rm -f .git/index MD &&
+       cp .orig-A/MD MD &&
+       echo extra >>MD &&
+       git update-index --add MD &&
+       read_tree_must_fail -m $tree_O $tree_A $tree_B
+'
+
+test_expect_success '10 - must match and be up-to-date in O && A && !B && O==A case' '
+       rm -f .git/index ND &&
+       cp .orig-A/ND ND &&
+       git update-index --add ND &&
+       read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
+       check_result
+'
+
+test_expect_success '10 (fail) - must match and be up-to-date in O && A && !B && O==A case' '
+       rm -f .git/index ND &&
+       cp .orig-A/ND ND &&
+       git update-index --add ND &&
+       echo extra >>ND &&
+       read_tree_must_fail -m $tree_O $tree_A $tree_B
+'
+
+test_expect_success '10 (fail) - must match and be up-to-date in O && A && !B && O==A case' '
+       rm -f .git/index ND &&
+       cp .orig-A/ND ND &&
+       echo extra >>ND &&
+       git update-index --add ND &&
+       read_tree_must_fail -m $tree_O $tree_A $tree_B
+'
+
+test_expect_success '11 - must match and be up-to-date in O && A && B && O!=A && O!=B && A!=B case' '
+       rm -f .git/index MM &&
+       cp .orig-A/MM MM &&
+       git update-index --add MM &&
+       read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
+       check_result
+'
+
+test_expect_success '11 (fail) - must match and be up-to-date in O && A && B && O!=A && O!=B && A!=B case' '
+       rm -f .git/index MM &&
+       cp .orig-A/MM MM &&
+       git update-index --add MM &&
+       echo extra >>MM &&
+       read_tree_must_fail -m $tree_O $tree_A $tree_B
+'
+
+test_expect_success '11 (fail) - must match and be up-to-date in O && A && B && O!=A && O!=B && A!=B case' '
+       rm -f .git/index MM &&
+       cp .orig-A/MM MM &&
+       echo extra >>MM &&
+       git update-index --add MM &&
+       read_tree_must_fail -m $tree_O $tree_A $tree_B
+'
+
+test_expect_success '12 - must match A in O && A && B && O!=A && A==B case' '
+       rm -f .git/index SS &&
+       cp .orig-A/SS SS &&
+       git update-index --add SS &&
+       read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
+       check_result
+'
+
+test_expect_success '12 - must match A in O && A && B && O!=A && A==B case' '
+       rm -f .git/index SS &&
+       cp .orig-A/SS SS &&
+       git update-index --add SS &&
+       echo extra >>SS &&
+       read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
+       check_result
+'
+
+test_expect_success '12 (fail) - must match A in O && A && B && O!=A && A==B case' '
+       rm -f .git/index SS &&
+       cp .orig-A/SS SS &&
+       echo extra >>SS &&
+       git update-index --add SS &&
+       read_tree_must_fail -m $tree_O $tree_A $tree_B
+'
+
+test_expect_success '13 - must match A in O && A && B && O!=A && O==B case' '
+       rm -f .git/index MN &&
+       cp .orig-A/MN MN &&
+       git update-index --add MN &&
+       read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
+       check_result
+'
+
+test_expect_success '13 - must match A in O && A && B && O!=A && O==B case' '
+       rm -f .git/index MN &&
+       cp .orig-A/MN MN &&
+       git update-index --add MN &&
+       echo extra >>MN &&
+       read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
+       check_result
+'
+
+test_expect_success '14 - must match and be up-to-date in O && A && B && O==A && O!=B case' '
+       rm -f .git/index NM &&
+       cp .orig-A/NM NM &&
+       git update-index --add NM &&
+       read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
+       check_result
+'
+
+test_expect_success '14 - may match B in O && A && B && O==A && O!=B case' '
+       rm -f .git/index NM &&
+       cp .orig-B/NM NM &&
+       git update-index --add NM &&
+       echo extra >>NM &&
+       read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
+       check_result
+'
+
+test_expect_success '14 (fail) - must match and be up-to-date in O && A && B && O==A && O!=B case' '
+       rm -f .git/index NM &&
+       cp .orig-A/NM NM &&
+       git update-index --add NM &&
+       echo extra >>NM &&
+       read_tree_must_fail -m $tree_O $tree_A $tree_B
+'
+
+test_expect_success '14 (fail) - must match and be up-to-date in O && A && B && O==A && O!=B case' '
+       rm -f .git/index NM &&
+       cp .orig-A/NM NM &&
+       echo extra >>NM &&
+       git update-index --add NM &&
+       read_tree_must_fail -m $tree_O $tree_A $tree_B
+'
+
+test_expect_success '15 - must match A in O && A && B && O==A && O==B case' '
+       rm -f .git/index NN &&
+       cp .orig-A/NN NN &&
+       git update-index --add NN &&
+       read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
+       check_result
+'
+
+test_expect_success '15 - must match A in O && A && B && O==A && O==B case' '
+       rm -f .git/index NN &&
+       cp .orig-A/NN NN &&
+       git update-index --add NN &&
+       echo extra >>NN &&
+       read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
+       check_result
+'
+
+test_expect_success '15 (fail) - must match A in O && A && B && O==A && O==B case' '
+       rm -f .git/index NN &&
+       cp .orig-A/NN NN &&
+       echo extra >>NN &&
+       git update-index --add NN &&
+       read_tree_must_fail -m $tree_O $tree_A $tree_B
+'
+
+test_expect_success '16 - A matches in one and B matches in another.' '
+       rm -f .git/index F16 &&
+       echo F16 >F16 &&
+       git update-index --add F16 &&
+       tree0=$(git write-tree) &&
+       echo E16 >F16 &&
+       git update-index F16 &&
+       tree1=$(git write-tree) &&
+       read_tree_must_succeed -m $tree0 $tree1 $tree1 $tree0 &&
+       git ls-files --stage
+'
 
 test_done
index db1b6f5cf4dd8c7932946a53bc2e1c30b09b762b..5ededd8e400e7e64faa1bd559d67251ecbf8608e 100755 (executable)
@@ -14,10 +14,10 @@ all the combinations described in the two-tree merge "carry forward"
 rules, found in <Documentation/git read-tree.txt>.
 
 In the test, these paths are used:
-        bozbar  - in H, stays in M, modified from bozbar to gnusto
-        frotz   - not in H added in M
-        nitfol  - in H, stays in M unmodified
-        rezrov  - in H, deleted in M
+       bozbar  - in H, stays in M, modified from bozbar to gnusto
+       frotz   - not in H added in M
+       nitfol  - in H, stays in M unmodified
+       rezrov  - in H, deleted in M
        yomin   - not in H or M
 '
 . ./test-lib.sh
@@ -60,336 +60,343 @@ EOF
 
 sed -e 's/bozbar/gnusto (earlier bozbar)/' bozbar-old >bozbar-new
 
-test_expect_success \
-    setup \
-    'echo frotz >frotz &&
-     echo nitfol >nitfol &&
-     cat bozbar-old >bozbar &&
-     echo rezrov >rezrov &&
-     echo yomin >yomin &&
-     git update-index --add nitfol bozbar rezrov &&
-     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) &&
-     echo treeM $treeM &&
-     git ls-tree $treeM &&
-     git diff-tree $treeH $treeM'
-
-test_expect_success \
-    '1, 2, 3 - no carry forward' \
-    'rm -f .git/index &&
-     read_tree_twoway $treeH $treeM &&
-     git ls-files --stage >1-3.out &&
-     test_cmp M.out 1-3.out &&
-     check_cache_at bozbar dirty &&
-     check_cache_at frotz dirty &&
-     check_cache_at nitfol dirty'
+test_expect_success 'setup' '
+       echo frotz >frotz &&
+       echo nitfol >nitfol &&
+       cat bozbar-old >bozbar &&
+       echo rezrov >rezrov &&
+       echo yomin >yomin &&
+       git update-index --add nitfol bozbar rezrov &&
+       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) &&
+       echo treeM $treeM &&
+       git ls-tree $treeM &&
+       git diff-tree $treeH $treeM
+'
 
+test_expect_success '1, 2, 3 - no carry forward' '
+       rm -f .git/index &&
+       read_tree_twoway $treeH $treeM &&
+       git ls-files --stage >1-3.out &&
+       test_cmp M.out 1-3.out &&
+       check_cache_at bozbar dirty &&
+       check_cache_at frotz dirty &&
+       check_cache_at nitfol dirty
+'
 echo '+100644 X 0      yomin' >expected
 
-test_expect_success \
-    '4 - carry forward local addition.' \
-    'rm -f .git/index &&
-     read_tree_must_succeed $treeH &&
-     git checkout-index -u -f -q -a &&
-     git update-index --add yomin &&
-     read_tree_twoway $treeH $treeM &&
-     git ls-files --stage >4.out &&
-     test_must_fail git diff --no-index M.out 4.out >4diff.out &&
-     compare_change 4diff.out expected &&
-     check_cache_at yomin clean'
-
-test_expect_success \
-    '5 - carry forward local addition.' \
-    'rm -f .git/index &&
-     read_tree_must_succeed $treeH &&
-     git checkout-index -u -f -q -a &&
-     echo yomin >yomin &&
-     git update-index --add yomin &&
-     echo yomin yomin >yomin &&
-     read_tree_twoway $treeH $treeM &&
-     git ls-files --stage >5.out &&
-     test_must_fail git diff --no-index M.out 5.out >5diff.out &&
-     compare_change 5diff.out expected &&
-     check_cache_at yomin dirty'
-
-test_expect_success \
-    '6 - local addition already has the same.' \
-    'rm -f .git/index &&
-     read_tree_must_succeed $treeH &&
-     git checkout-index -u -f -q -a &&
-     git update-index --add frotz &&
-     read_tree_twoway $treeH $treeM &&
-     git ls-files --stage >6.out &&
-     test_cmp M.out 6.out &&
-     check_cache_at frotz clean'
-
-test_expect_success \
-    '7 - local addition already has the same.' \
-    'rm -f .git/index &&
-     read_tree_must_succeed $treeH &&
-     git checkout-index -u -f -q -a &&
-     echo frotz >frotz &&
-     git update-index --add frotz &&
-     echo frotz frotz >frotz &&
-     read_tree_twoway $treeH $treeM &&
-     git ls-files --stage >7.out &&
-     test_cmp M.out 7.out &&
-     check_cache_at frotz dirty'
-
-test_expect_success \
-    '8 - conflicting addition.' \
-    'rm -f .git/index &&
-     read_tree_must_succeed $treeH &&
-     git checkout-index -u -f -q -a &&
-     echo frotz frotz >frotz &&
-     git update-index --add frotz &&
-     if read_tree_twoway $treeH $treeM; then false; else :; fi'
-
-test_expect_success \
-    '9 - conflicting addition.' \
-    'rm -f .git/index &&
-     read_tree_must_succeed $treeH &&
-     git checkout-index -u -f -q -a &&
-     echo frotz frotz >frotz &&
-     git update-index --add frotz &&
-     echo frotz >frotz &&
-     if read_tree_twoway $treeH $treeM; then false; else :; fi'
-
-test_expect_success \
-    '10 - path removed.' \
-    'rm -f .git/index &&
-     read_tree_must_succeed $treeH &&
-     git checkout-index -u -f -q -a &&
-     echo rezrov >rezrov &&
-     git update-index --add rezrov &&
-     read_tree_twoway $treeH $treeM &&
-     git ls-files --stage >10.out &&
-     test_cmp M.out 10.out'
-
-test_expect_success \
-    '11 - dirty path removed.' \
-    'rm -f .git/index &&
-     read_tree_must_succeed $treeH &&
-     git checkout-index -u -f -q -a &&
-     echo rezrov >rezrov &&
-     git update-index --add rezrov &&
-     echo rezrov rezrov >rezrov &&
-     if read_tree_twoway $treeH $treeM; then false; else :; fi'
-
-test_expect_success \
-    '12 - unmatching local changes being removed.' \
-    'rm -f .git/index &&
-     read_tree_must_succeed $treeH &&
-     git checkout-index -u -f -q -a &&
-     echo rezrov rezrov >rezrov &&
-     git update-index --add rezrov &&
-     if read_tree_twoway $treeH $treeM; then false; else :; fi'
-
-test_expect_success \
-    '13 - unmatching local changes being removed.' \
-    'rm -f .git/index &&
-     read_tree_must_succeed $treeH &&
-     git checkout-index -u -f -q -a &&
-     echo rezrov rezrov >rezrov &&
-     git update-index --add rezrov &&
-     echo rezrov >rezrov &&
-     if read_tree_twoway $treeH $treeM; then false; else :; fi'
+test_expect_success '4 - carry forward local addition.' '
+       rm -f .git/index &&
+       read_tree_must_succeed $treeH &&
+       git checkout-index -u -f -q -a &&
+       git update-index --add yomin &&
+       read_tree_twoway $treeH $treeM &&
+       git ls-files --stage >4.out &&
+       test_must_fail git diff --no-index M.out 4.out >4diff.out &&
+       compare_change 4diff.out expected &&
+       check_cache_at yomin clean
+'
+
+test_expect_success '5 - carry forward local addition.' '
+       rm -f .git/index &&
+       read_tree_must_succeed $treeH &&
+       git checkout-index -u -f -q -a &&
+       echo yomin >yomin &&
+       git update-index --add yomin &&
+       echo yomin yomin >yomin &&
+       read_tree_twoway $treeH $treeM &&
+       git ls-files --stage >5.out &&
+       test_must_fail git diff --no-index M.out 5.out >5diff.out &&
+       compare_change 5diff.out expected &&
+       check_cache_at yomin dirty
+'
+
+test_expect_success '6 - local addition already has the same.' '
+       rm -f .git/index &&
+       read_tree_must_succeed $treeH &&
+       git checkout-index -u -f -q -a &&
+       git update-index --add frotz &&
+       read_tree_twoway $treeH $treeM &&
+       git ls-files --stage >6.out &&
+       test_cmp M.out 6.out &&
+       check_cache_at frotz clean
+'
+
+test_expect_success '7 - local addition already has the same.' '
+       rm -f .git/index &&
+       read_tree_must_succeed $treeH &&
+       git checkout-index -u -f -q -a &&
+       echo frotz >frotz &&
+       git update-index --add frotz &&
+       echo frotz frotz >frotz &&
+       read_tree_twoway $treeH $treeM &&
+       git ls-files --stage >7.out &&
+       test_cmp M.out 7.out &&
+       check_cache_at frotz dirty
+'
+
+test_expect_success '8 - conflicting addition.' '
+       rm -f .git/index &&
+       read_tree_must_succeed $treeH &&
+       git checkout-index -u -f -q -a &&
+       echo frotz frotz >frotz &&
+       git update-index --add frotz &&
+       if read_tree_twoway $treeH $treeM; then false; else :; fi
+'
+
+test_expect_success '9 - conflicting addition.' '
+       rm -f .git/index &&
+       read_tree_must_succeed $treeH &&
+       git checkout-index -u -f -q -a &&
+       echo frotz frotz >frotz &&
+       git update-index --add frotz &&
+       echo frotz >frotz &&
+       if read_tree_twoway $treeH $treeM; then false; else :; fi
+'
+
+test_expect_success '10 - path removed.' '
+       rm -f .git/index &&
+       read_tree_must_succeed $treeH &&
+       git checkout-index -u -f -q -a &&
+       echo rezrov >rezrov &&
+       git update-index --add rezrov &&
+       read_tree_twoway $treeH $treeM &&
+       git ls-files --stage >10.out &&
+       test_cmp M.out 10.out
+'
+
+test_expect_success '11 - dirty path removed.' '
+       rm -f .git/index &&
+       read_tree_must_succeed $treeH &&
+       git checkout-index -u -f -q -a &&
+       echo rezrov >rezrov &&
+       git update-index --add rezrov &&
+       echo rezrov rezrov >rezrov &&
+       if read_tree_twoway $treeH $treeM; then false; else :; fi
+'
+
+test_expect_success '12 - unmatching local changes being removed.' '
+       rm -f .git/index &&
+       read_tree_must_succeed $treeH &&
+       git checkout-index -u -f -q -a &&
+       echo rezrov rezrov >rezrov &&
+       git update-index --add rezrov &&
+       if read_tree_twoway $treeH $treeM; then false; else :; fi
+'
+
+test_expect_success '13 - unmatching local changes being removed.' '
+       rm -f .git/index &&
+       read_tree_must_succeed $treeH &&
+       git checkout-index -u -f -q -a &&
+       echo rezrov rezrov >rezrov &&
+       git update-index --add rezrov &&
+       echo rezrov >rezrov &&
+       if read_tree_twoway $treeH $treeM; then false; else :; fi
+'
 
 cat >expected <<EOF
 -100644 X 0    nitfol
 +100644 X 0    nitfol
 EOF
 
-test_expect_success \
-    '14 - unchanged in two heads.' \
-    'rm -f .git/index &&
-     read_tree_must_succeed $treeH &&
-     git checkout-index -u -f -q -a &&
-     echo nitfol nitfol >nitfol &&
-     git update-index --add nitfol &&
-     read_tree_twoway $treeH $treeM &&
-     git ls-files --stage >14.out &&
-     test_must_fail git diff --no-index M.out 14.out >14diff.out &&
-     compare_change 14diff.out expected &&
-     check_cache_at nitfol clean'
-
-test_expect_success \
-    '15 - unchanged in two heads.' \
-    'rm -f .git/index &&
-     read_tree_must_succeed $treeH &&
-     git checkout-index -u -f -q -a &&
-     echo nitfol nitfol >nitfol &&
-     git update-index --add nitfol &&
-     echo nitfol nitfol nitfol >nitfol &&
-     read_tree_twoway $treeH $treeM &&
-     git ls-files --stage >15.out &&
-     test_must_fail git diff --no-index M.out 15.out >15diff.out &&
-     compare_change 15diff.out expected &&
-     check_cache_at nitfol dirty'
-
-test_expect_success \
-    '16 - conflicting local change.' \
-    'rm -f .git/index &&
-     read_tree_must_succeed $treeH &&
-     git checkout-index -u -f -q -a &&
-     echo bozbar bozbar >bozbar &&
-     git update-index --add bozbar &&
-     if read_tree_twoway $treeH $treeM; then false; else :; fi'
-
-test_expect_success \
-    '17 - conflicting local change.' \
-    'rm -f .git/index &&
-     read_tree_must_succeed $treeH &&
-     git checkout-index -u -f -q -a &&
-     echo bozbar bozbar >bozbar &&
-     git update-index --add bozbar &&
-     echo bozbar bozbar bozbar >bozbar &&
-     if read_tree_twoway $treeH $treeM; then false; else :; fi'
-
-test_expect_success \
-    '18 - local change already having a good result.' \
-    'rm -f .git/index &&
-     read_tree_must_succeed $treeH &&
-     git checkout-index -u -f -q -a &&
-     cat bozbar-new >bozbar &&
-     git update-index --add bozbar &&
-     read_tree_twoway $treeH $treeM &&
-     git ls-files --stage >18.out &&
-     test_cmp M.out 18.out &&
-     check_cache_at bozbar clean'
-
-test_expect_success \
-    '19 - local change already having a good result, further modified.' \
-    'rm -f .git/index &&
-     read_tree_must_succeed $treeH &&
-     git checkout-index -u -f -q -a &&
-     cat bozbar-new >bozbar &&
-     git update-index --add bozbar &&
-     echo gnusto gnusto >bozbar &&
-     read_tree_twoway $treeH $treeM &&
-     git ls-files --stage >19.out &&
-     test_cmp M.out 19.out &&
-     check_cache_at bozbar dirty'
-
-test_expect_success \
-    '20 - no local change, use new tree.' \
-    'rm -f .git/index &&
-     read_tree_must_succeed $treeH &&
-     git checkout-index -u -f -q -a &&
-     cat bozbar-old >bozbar &&
-     git update-index --add bozbar &&
-     read_tree_twoway $treeH $treeM &&
-     git ls-files --stage >20.out &&
-     test_cmp M.out 20.out &&
-     check_cache_at bozbar dirty'
-
-test_expect_success \
-    '21 - no local change, dirty cache.' \
-    'rm -f .git/index &&
-     read_tree_must_succeed $treeH &&
-     git checkout-index -u -f -q -a &&
-     cat bozbar-old >bozbar &&
-     git update-index --add bozbar &&
-     echo gnusto gnusto >bozbar &&
-     if read_tree_twoway $treeH $treeM; then false; else :; fi'
+test_expect_success '14 - unchanged in two heads.' '
+       rm -f .git/index &&
+       read_tree_must_succeed $treeH &&
+       git checkout-index -u -f -q -a &&
+       echo nitfol nitfol >nitfol &&
+       git update-index --add nitfol &&
+       read_tree_twoway $treeH $treeM &&
+       git ls-files --stage >14.out &&
+       test_must_fail git diff --no-index M.out 14.out >14diff.out &&
+       compare_change 14diff.out expected &&
+       check_cache_at nitfol clean
+'
+
+test_expect_success '15 - unchanged in two heads.' '
+       rm -f .git/index &&
+       read_tree_must_succeed $treeH &&
+       git checkout-index -u -f -q -a &&
+       echo nitfol nitfol >nitfol &&
+       git update-index --add nitfol &&
+       echo nitfol nitfol nitfol >nitfol &&
+       read_tree_twoway $treeH $treeM &&
+       git ls-files --stage >15.out &&
+       test_must_fail git diff --no-index M.out 15.out >15diff.out &&
+       compare_change 15diff.out expected &&
+       check_cache_at nitfol dirty
+'
+
+test_expect_success '16 - conflicting local change.' '
+       rm -f .git/index &&
+       read_tree_must_succeed $treeH &&
+       git checkout-index -u -f -q -a &&
+       echo bozbar bozbar >bozbar &&
+       git update-index --add bozbar &&
+       if read_tree_twoway $treeH $treeM; then false; else :; fi
+'
+
+test_expect_success '17 - conflicting local change.' '
+       rm -f .git/index &&
+       read_tree_must_succeed $treeH &&
+       git checkout-index -u -f -q -a &&
+       echo bozbar bozbar >bozbar &&
+       git update-index --add bozbar &&
+       echo bozbar bozbar bozbar >bozbar &&
+       if read_tree_twoway $treeH $treeM; then false; else :; fi
+'
+
+test_expect_success '18 - local change already having a good result.' '
+       rm -f .git/index &&
+       read_tree_must_succeed $treeH &&
+       git checkout-index -u -f -q -a &&
+       cat bozbar-new >bozbar &&
+       git update-index --add bozbar &&
+       read_tree_twoway $treeH $treeM &&
+       git ls-files --stage >18.out &&
+       test_cmp M.out 18.out &&
+       check_cache_at bozbar clean
+'
+
+test_expect_success '19 - local change already having a good result, further modified.' '
+       rm -f .git/index &&
+       read_tree_must_succeed $treeH &&
+       git checkout-index -u -f -q -a &&
+       cat bozbar-new >bozbar &&
+       git update-index --add bozbar &&
+       echo gnusto gnusto >bozbar &&
+       read_tree_twoway $treeH $treeM &&
+       git ls-files --stage >19.out &&
+       test_cmp M.out 19.out &&
+       check_cache_at bozbar dirty
+'
+
+test_expect_success '20 - no local change, use new tree.' '
+       rm -f .git/index &&
+       read_tree_must_succeed $treeH &&
+       git checkout-index -u -f -q -a &&
+       cat bozbar-old >bozbar &&
+       git update-index --add bozbar &&
+       read_tree_twoway $treeH $treeM &&
+       git ls-files --stage >20.out &&
+       test_cmp M.out 20.out &&
+       check_cache_at bozbar dirty
+'
+
+test_expect_success '21 - no local change, dirty cache.' '
+       rm -f .git/index &&
+       read_tree_must_succeed $treeH &&
+       git checkout-index -u -f -q -a &&
+       cat bozbar-old >bozbar &&
+       git update-index --add bozbar &&
+       echo gnusto gnusto >bozbar &&
+       if read_tree_twoway $treeH $treeM; then false; else :; fi
+'
 
 # This fails with straight two-way fast-forward.
-test_expect_success \
-    '22 - local change cache updated.' \
-    'rm -f .git/index &&
-     read_tree_must_succeed $treeH &&
-     git checkout-index -u -f -q -a &&
-     sed -e "s/such as/SUCH AS/" bozbar-old >bozbar &&
-     git update-index --add bozbar &&
-     if read_tree_twoway $treeH $treeM; then false; else :; fi'
+test_expect_success '22 - local change cache updated.' '
+       rm -f .git/index &&
+       read_tree_must_succeed $treeH &&
+       git checkout-index -u -f -q -a &&
+       sed -e "s/such as/SUCH AS/" bozbar-old >bozbar &&
+       git update-index --add bozbar &&
+       if read_tree_twoway $treeH $treeM; then false; else :; fi
+'
 
 # Also make sure we did not break DF vs DF/DF case.
-test_expect_success \
-    'DF vs DF/DF case setup.' \
-    'rm -f .git/index &&
-     echo DF >DF &&
-     git update-index --add DF &&
-     treeDF=$(git write-tree) &&
-     echo treeDF $treeDF &&
-     git ls-tree $treeDF &&
-
-     rm -f DF &&
-     mkdir DF &&
-     echo DF/DF >DF/DF &&
-     git update-index --add --remove DF DF/DF &&
-     treeDFDF=$(git write-tree) &&
-     echo treeDFDF $treeDFDF &&
-     git ls-tree $treeDFDF &&
-     git ls-files --stage >DFDF.out'
-
-test_expect_success \
-    'DF vs DF/DF case test.' \
-    'rm -f .git/index &&
-     rm -fr DF &&
-     echo DF >DF &&
-     git update-index --add DF &&
-     read_tree_twoway $treeDF $treeDFDF &&
-     git ls-files --stage >DFDFcheck.out &&
-     test_cmp DFDF.out DFDFcheck.out &&
-     check_cache_at DF/DF dirty &&
-     :'
-
-test_expect_success \
-    'a/b (untracked) vs a case setup.' \
-    'rm -f .git/index &&
-     : >a &&
-     git update-index --add a &&
-     treeM=$(git write-tree) &&
-     echo treeM $treeM &&
-     git ls-tree $treeM &&
-     git ls-files --stage >treeM.out &&
-
-     rm -f a &&
-     git update-index --remove a &&
-     mkdir a &&
-     : >a/b &&
-     treeH=$(git write-tree) &&
-     echo treeH $treeH &&
-     git ls-tree $treeH'
-
-test_expect_success \
-    'a/b (untracked) vs a, plus c/d case test.' \
-    'read_tree_u_must_fail -u -m "$treeH" "$treeM" &&
-     git ls-files --stage &&
-     test -f a/b'
-
-test_expect_success \
-    'a/b vs a, plus c/d case setup.' \
-    'rm -f .git/index &&
-     rm -fr a &&
-     : >a &&
-     mkdir c &&
-     : >c/d &&
-     git update-index --add a c/d &&
-     treeM=$(git write-tree) &&
-     echo treeM $treeM &&
-     git ls-tree $treeM &&
-     git ls-files --stage >treeM.out &&
-
-     rm -f a &&
-     mkdir a &&
-     : >a/b &&
-     git update-index --add --remove a a/b &&
-     treeH=$(git write-tree) &&
-     echo treeH $treeH &&
-     git ls-tree $treeH'
-
-test_expect_success \
-    'a/b vs a, plus c/d case test.' \
-    'read_tree_u_must_succeed -u -m "$treeH" "$treeM" &&
-     git ls-files --stage | tee >treeMcheck.out &&
-     test_cmp treeM.out treeMcheck.out'
+test_expect_success 'DF vs DF/DF case setup.' '
+       rm -f .git/index &&
+       echo DF >DF &&
+       git update-index --add DF &&
+       treeDF=$(git write-tree) &&
+       echo treeDF $treeDF &&
+       git ls-tree $treeDF &&
+
+       rm -f DF &&
+       mkdir DF &&
+       echo DF/DF >DF/DF &&
+       git update-index --add --remove DF DF/DF &&
+       treeDFDF=$(git write-tree) &&
+       echo treeDFDF $treeDFDF &&
+       git ls-tree $treeDFDF &&
+       git ls-files --stage >DFDF.out
+'
+
+test_expect_success 'DF vs DF/DF case test.' '
+       rm -f .git/index &&
+       rm -fr DF &&
+       echo DF >DF &&
+       git update-index --add DF &&
+       read_tree_twoway $treeDF $treeDFDF &&
+       git ls-files --stage >DFDFcheck.out &&
+       test_cmp DFDF.out DFDFcheck.out &&
+       check_cache_at DF/DF dirty &&
+       :
+'
+
+test_expect_success 'a/b (untracked) vs a case setup.' '
+       rm -f .git/index &&
+       : >a &&
+       git update-index --add a &&
+       treeM=$(git write-tree) &&
+       echo treeM $treeM &&
+       git ls-tree $treeM &&
+       git ls-files --stage >treeM.out &&
+
+       rm -f a &&
+       git update-index --remove a &&
+       mkdir a &&
+       : >a/b &&
+       treeH=$(git write-tree) &&
+       echo treeH $treeH &&
+       git ls-tree $treeH
+'
+
+test_expect_success 'a/b (untracked) vs a, plus c/d case test.' '
+       read_tree_u_must_fail -u -m "$treeH" "$treeM" &&
+       git ls-files --stage &&
+       test -f a/b
+'
+
+test_expect_success 'read-tree supports the super-prefix' '
+       cat <<-EOF >expect &&
+               error: Updating '\''fictional/a'\'' would lose untracked files in it
+       EOF
+       test_must_fail git --super-prefix fictional/ read-tree -u -m "$treeH" "$treeM" 2>actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'a/b vs a, plus c/d case setup.' '
+       rm -f .git/index &&
+       rm -fr a &&
+       : >a &&
+       mkdir c &&
+       : >c/d &&
+       git update-index --add a c/d &&
+       treeM=$(git write-tree) &&
+       echo treeM $treeM &&
+       git ls-tree $treeM &&
+       git ls-files --stage >treeM.out &&
+
+       rm -f a &&
+       mkdir a &&
+       : >a/b &&
+       git update-index --add --remove a a/b &&
+       treeH=$(git write-tree) &&
+       echo treeH $treeH &&
+       git ls-tree $treeH
+'
+
+test_expect_success 'a/b vs a, plus c/d case test.' '
+       read_tree_u_must_succeed -u -m "$treeH" "$treeM" &&
+       git ls-files --stage | tee >treeMcheck.out &&
+       test_cmp treeM.out treeMcheck.out
+'
 
 test_expect_success '-m references the correct modified tree' '
        echo >file-a &&
index 096dbffecc3d51478b643bd2f4dee92f507e1c1a..6fd264cff0d6de1961656c2cd1193d8ce37e9a1f 100755 (executable)
@@ -5,6 +5,12 @@ test_description='adding and checking out large blobs'
 
 . ./test-lib.sh
 
+# This should be moved to test-lib.sh together with the
+# copy in t0021 after both topics have graduated to 'master'.
+file_size () {
+       perl -e 'print -s $ARGV[0]' "$1"
+}
+
 test_expect_success setup '
        # clone does not allow us to pass core.bigfilethreshold to
        # new repos, so set core.bigfilethreshold globally
@@ -17,6 +23,29 @@ test_expect_success setup '
        export GIT_ALLOC_LIMIT
 '
 
+# add a large file with different settings
+while read expect config
+do
+       test_expect_success "add with $config" '
+               test_when_finished "rm -f .git/objects/pack/pack-*.* .git/index" &&
+               git $config add large1 &&
+               sz=$(file_size .git/objects/pack/pack-*.pack) &&
+               case "$expect" in
+               small) test "$sz" -le 100000 ;;
+               large) test "$sz" -ge 100000 ;;
+               esac
+       '
+done <<\EOF
+large -c core.compression=0
+small -c core.compression=9
+large -c core.compression=0 -c pack.compression=0
+large -c core.compression=9 -c pack.compression=0
+small -c core.compression=0 -c pack.compression=9
+small -c core.compression=9 -c pack.compression=9
+large -c pack.compression=0
+small -c pack.compression=9
+EOF
+
 test_expect_success 'add a large file or two' '
        git add large1 huge large2 &&
        # make sure we got a single packfile and no loose objects
index 7655c94c2801f0070a7b60ea17f30414b16c8d12..ff50960ccaed9953c5738c9bbf602bf0d326e15a 100755 (executable)
@@ -219,14 +219,8 @@ test_expect_success 'check line errors for malformed values' '
 '
 
 test_expect_success 'error on modifying repo config without repo' '
-       mkdir no-repo &&
-       (
-               GIT_CEILING_DIRECTORIES=$(pwd) &&
-               export GIT_CEILING_DIRECTORIES &&
-               cd no-repo &&
-               test_must_fail git config a.b c 2>err &&
-               grep "not in a git directory" err
-       )
+       nongit test_must_fail git config a.b c 2>err &&
+       grep "not in a git directory" err
 '
 
 cmdline_config="'foo.bar=from-cmdline'"
index d4fb9770600df75d3162ffbc6c567b1ae152fccd..b0ffc0b5731dd746ed170604784287d3e48e9c30 100755 (executable)
@@ -8,23 +8,33 @@ test_description='Test git update-ref and basic ref logging'
 
 Z=$_z40
 
-test_expect_success setup '
+m=refs/heads/master
+n_dir=refs/heads/gu
+n=$n_dir/fixes
+outside=refs/foo
+bare=bare-repo
 
+create_test_commits ()
+{
+       prfx="$1"
        for name in A B C D E F
        do
                test_tick &&
                T=$(git write-tree) &&
                sha1=$(echo $name | git commit-tree $T) &&
-               eval $name=$sha1
+               eval $prfx$name=$sha1
        done
+}
 
+test_expect_success setup '
+       create_test_commits "" &&
+       mkdir $bare &&
+       cd $bare &&
+       git init --bare &&
+       create_test_commits "bare" &&
+       cd -
 '
 
-m=refs/heads/master
-n_dir=refs/heads/gu
-n=$n_dir/fixes
-outside=refs/foo
-
 test_expect_success \
        "create $m" \
        "git update-ref $m $A &&
@@ -93,6 +103,61 @@ test_expect_success 'update-ref creates reflogs with --create-reflog' '
        git reflog exists $outside
 '
 
+test_expect_success 'creates no reflog in bare repository' '
+       git -C $bare update-ref $m $bareA &&
+       git -C $bare rev-parse $bareA >expect &&
+       git -C $bare rev-parse $m >actual &&
+       test_cmp expect actual &&
+       test_must_fail git -C $bare reflog exists $m
+'
+
+test_expect_success 'core.logAllRefUpdates=true creates reflog in bare repository' '
+       test_when_finished "git -C $bare config --unset core.logAllRefUpdates && \
+               rm $bare/logs/$m" &&
+       git -C $bare config core.logAllRefUpdates true &&
+       git -C $bare update-ref $m $bareB &&
+       git -C $bare rev-parse $bareB >expect &&
+       git -C $bare rev-parse $m >actual &&
+       test_cmp expect actual &&
+       git -C $bare reflog exists $m
+'
+
+test_expect_success 'core.logAllRefUpdates=true does not create reflog by default' '
+       test_config core.logAllRefUpdates true &&
+       test_when_finished "git update-ref -d $outside" &&
+       git update-ref $outside $A &&
+       git rev-parse $A >expect &&
+       git rev-parse $outside >actual &&
+       test_cmp expect actual &&
+       test_must_fail git reflog exists $outside
+'
+
+test_expect_success 'core.logAllRefUpdates=always creates reflog by default' '
+       test_config core.logAllRefUpdates always &&
+       test_when_finished "git update-ref -d $outside" &&
+       git update-ref $outside $A &&
+       git rev-parse $A >expect &&
+       git rev-parse $outside >actual &&
+       test_cmp expect actual &&
+       git reflog exists $outside
+'
+
+test_expect_success 'core.logAllRefUpdates=always creates no reflog for ORIG_HEAD' '
+       test_config core.logAllRefUpdates always &&
+       git update-ref ORIG_HEAD $A &&
+       test_must_fail git reflog exists ORIG_HEAD
+'
+
+test_expect_success '--no-create-reflog overrides core.logAllRefUpdates=always' '
+       test_config core.logAllRefUpdates true &&
+       test_when_finished "git update-ref -d $outside" &&
+       git update-ref --no-create-reflog $outside $A &&
+       git rev-parse $A >expect &&
+       git rev-parse $outside >actual &&
+       test_cmp expect actual &&
+       test_must_fail git reflog exists $outside
+'
+
 test_expect_success \
        "create $m (by HEAD)" \
        "git update-ref HEAD $A &&
@@ -501,6 +566,7 @@ test_expect_success 'stdin does not create reflogs by default' '
 '
 
 test_expect_success 'stdin creates reflogs with --create-reflog' '
+       test_when_finished "git update-ref -d $outside" &&
        echo "create $outside $m" >stdin &&
        git update-ref --create-reflog --stdin <stdin &&
        git rev-parse $m >expect &&
index 7e10bcfe395609cff5edc1f8f6ce95fcf69cf5f6..30354fd26c0cf6b6e2a6c01bc2bcbef48168e562 100755 (executable)
@@ -97,6 +97,9 @@ test_expect_success 'show-ref -d' '
        git show-ref -d refs/tags/A refs/tags/C >actual &&
        test_cmp expect actual &&
 
+       git show-ref --verify -d refs/tags/A refs/tags/C >actual &&
+       test_cmp expect actual &&
+
        echo $(git rev-parse refs/heads/master) refs/heads/master >expect &&
        git show-ref -d master >actual &&
        test_cmp expect actual &&
@@ -116,6 +119,12 @@ test_expect_success 'show-ref -d' '
        test_cmp expect actual &&
 
        test_must_fail git show-ref -d --verify heads/master >actual &&
+       test_cmp expect actual &&
+
+       test_must_fail git show-ref --verify -d A C >actual &&
+       test_cmp expect actual &&
+
+       test_must_fail git show-ref --verify -d tags/A tags/C >actual &&
        test_cmp expect actual
 
 '
@@ -164,4 +173,37 @@ test_expect_success 'show-ref --heads, --tags, --head, pattern' '
        test_cmp expect actual
 '
 
+test_expect_success 'show-ref --verify HEAD' '
+       echo $(git rev-parse HEAD) HEAD >expect &&
+       git show-ref --verify HEAD >actual &&
+       test_cmp expect actual &&
+
+       >expect &&
+
+       git show-ref --verify -q HEAD >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'show-ref --verify with dangling ref' '
+       sha1_file() {
+               echo "$*" | sed "s#..#.git/objects/&/#"
+       } &&
+
+       remove_object() {
+               file=$(sha1_file "$*") &&
+               test -e "$file" &&
+               rm -f "$file"
+       } &&
+
+       test_when_finished "rm -rf dangling" &&
+       (
+               git init dangling &&
+               cd dangling &&
+               test_commit dangling &&
+               sha=$(git rev-parse refs/tags/dangling) &&
+               remove_object $sha &&
+               test_must_fail git show-ref --verify refs/tags/dangling
+       )
+'
+
 test_done
index ee7d4736db5ac67e7facfee77ffca54fde340d31..33a51c9a67fe833e31e51099f7568b64be385d07 100755 (executable)
@@ -43,13 +43,13 @@ test_expect_success 'HEAD is part of refs, valid objects appear valid' '
 
 test_expect_success 'setup: helpers for corruption tests' '
        sha1_file() {
-               echo "$*" | sed "s#..#.git/objects/&/#"
+               remainder=${1#??} &&
+               firsttwo=${1%$remainder} &&
+               echo ".git/objects/$firsttwo/$remainder"
        } &&
 
        remove_object() {
-               file=$(sha1_file "$*") &&
-               test -e "$file" &&
-               rm -f "$file"
+               rm "$(sha1_file "$1")"
        }
 '
 
@@ -189,14 +189,16 @@ test_expect_success 'commit with NUL in header' '
 '
 
 test_expect_success 'tree object with duplicate entries' '
-       test_when_finished "remove_object \$T" &&
+       test_when_finished "for i in \$T; do remove_object \$i; done" &&
        T=$(
                GIT_INDEX_FILE=test-index &&
                export GIT_INDEX_FILE &&
                rm -f test-index &&
                >x &&
                git add x &&
+               git rev-parse :x &&
                T=$(git write-tree) &&
+               echo $T &&
                (
                        git cat-file tree $T &&
                        git cat-file tree $T
@@ -521,9 +523,21 @@ test_expect_success 'fsck --connectivity-only' '
                touch empty &&
                git add empty &&
                test_commit empty &&
+
+               # Drop the index now; we want to be sure that we
+               # recursively notice the broken objects
+               # because they are reachable from refs, not because
+               # they are in the index.
+               rm -f .git/index &&
+
+               # corrupt the blob, but in a way that we can still identify
+               # its type. That lets us see that --connectivity-only is
+               # not actually looking at the contents, but leaves it
+               # free to examine the type if it chooses.
                empty=.git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 &&
-               rm -f $empty &&
-               echo invalid >$empty &&
+               blob=$(echo unrelated | git hash-object -w --stdin) &&
+               mv -f $(sha1_file $blob) $empty &&
+
                test_must_fail git fsck --strict &&
                git fsck --strict --connectivity-only &&
                tree=$(git rev-parse HEAD:) &&
@@ -535,12 +549,18 @@ test_expect_success 'fsck --connectivity-only' '
        )
 '
 
-remove_loose_object () {
-       sha1="$(git rev-parse "$1")" &&
-       remainder=${sha1#??} &&
-       firsttwo=${sha1%$remainder} &&
-       rm .git/objects/$firsttwo/$remainder
-}
+test_expect_success 'fsck --connectivity-only with explicit head' '
+       rm -rf connectivity-only &&
+       git init connectivity-only &&
+       (
+               cd connectivity-only &&
+               test_commit foo &&
+               rm -f .git/index &&
+               tree=$(git rev-parse HEAD^{tree}) &&
+               remove_object $(git rev-parse HEAD:foo.t) &&
+               test_must_fail git fsck --connectivity-only $tree
+       )
+'
 
 test_expect_success 'fsck --name-objects' '
        rm -rf name-objects &&
@@ -550,11 +570,123 @@ test_expect_success 'fsck --name-objects' '
                test_commit julius caesar.t &&
                test_commit augustus &&
                test_commit caesar &&
-               remove_loose_object $(git rev-parse julius:caesar.t) &&
+               remove_object $(git rev-parse julius:caesar.t) &&
                test_must_fail git fsck --name-objects >out &&
                tree=$(git rev-parse --verify julius:) &&
                grep "$tree (\(refs/heads/master\|HEAD\)@{[0-9]*}:" out
        )
 '
 
+test_expect_success 'alternate objects are correctly blamed' '
+       test_when_finished "rm -rf alt.git .git/objects/info/alternates" &&
+       git init --bare alt.git &&
+       echo "../../alt.git/objects" >.git/objects/info/alternates &&
+       mkdir alt.git/objects/12 &&
+       >alt.git/objects/12/34567890123456789012345678901234567890 &&
+       test_must_fail git fsck >out 2>&1 &&
+       grep alt.git out
+'
+
+test_expect_success 'fsck errors in packed objects' '
+       git cat-file commit HEAD >basis &&
+       sed "s/</one/" basis >one &&
+       sed "s/</foo/" basis >two &&
+       one=$(git hash-object -t commit -w one) &&
+       two=$(git hash-object -t commit -w two) &&
+       pack=$(
+               {
+                       echo $one &&
+                       echo $two
+               } | git pack-objects .git/objects/pack/pack
+       ) &&
+       test_when_finished "rm -f .git/objects/pack/pack-$pack.*" &&
+       remove_object $one &&
+       remove_object $two &&
+       test_must_fail git fsck 2>out &&
+       grep "error in commit $one.* - bad name" out &&
+       grep "error in commit $two.* - bad name" out &&
+       ! grep corrupt out
+'
+
+test_expect_success 'fsck finds problems in duplicate loose objects' '
+       rm -rf broken-duplicate &&
+       git init broken-duplicate &&
+       (
+               cd broken-duplicate &&
+               test_commit duplicate &&
+               # no "-d" here, so we end up with duplicates
+               git repack &&
+               # now corrupt the loose copy
+               file=$(sha1_file "$(git rev-parse HEAD)") &&
+               rm "$file" &&
+               echo broken >"$file" &&
+               test_must_fail git fsck
+       )
+'
+
+test_expect_success 'fsck detects trailing loose garbage (commit)' '
+       git cat-file commit HEAD >basis &&
+       echo bump-commit-sha1 >>basis &&
+       commit=$(git hash-object -w -t commit basis) &&
+       file=$(sha1_file $commit) &&
+       test_when_finished "remove_object $commit" &&
+       chmod +w "$file" &&
+       echo garbage >>"$file" &&
+       test_must_fail git fsck 2>out &&
+       test_i18ngrep "garbage.*$commit" out
+'
+
+test_expect_success 'fsck detects trailing loose garbage (blob)' '
+       blob=$(echo trailing | git hash-object -w --stdin) &&
+       file=$(sha1_file $blob) &&
+       test_when_finished "remove_object $blob" &&
+       chmod +w "$file" &&
+       echo garbage >>"$file" &&
+       test_must_fail git fsck 2>out &&
+       test_i18ngrep "garbage.*$blob" out
+'
+
+# for each of type, we have one version which is referenced by another object
+# (and so while unreachable, not dangling), and another variant which really is
+# dangling.
+test_expect_success 'fsck notices dangling objects' '
+       git init dangling &&
+       (
+               cd dangling &&
+               blob=$(echo not-dangling | git hash-object -w --stdin) &&
+               dblob=$(echo dangling | git hash-object -w --stdin) &&
+               tree=$(printf "100644 blob %s\t%s\n" $blob one | git mktree) &&
+               dtree=$(printf "100644 blob %s\t%s\n" $blob two | git mktree) &&
+               commit=$(git commit-tree $tree) &&
+               dcommit=$(git commit-tree -p $commit $tree) &&
+
+               cat >expect <<-EOF &&
+               dangling blob $dblob
+               dangling commit $dcommit
+               dangling tree $dtree
+               EOF
+
+               git fsck >actual &&
+               # the output order is non-deterministic, as it comes from a hash
+               sort <actual >actual.sorted &&
+               test_cmp expect actual.sorted
+       )
+'
+
+test_expect_success 'fsck $name notices bogus $name' '
+       test_must_fail git fsck bogus &&
+       test_must_fail git fsck $_z40
+'
+
+test_expect_success 'bogus head does not fallback to all heads' '
+       # set up a case that will cause a reachability complaint
+       echo to-be-deleted >foo &&
+       git add foo &&
+       blob=$(git rev-parse :foo) &&
+       test_when_finished "git rm --cached foo" &&
+       remove_object $blob &&
+       test_must_fail git fsck $_z40 >out 2>&1 &&
+       ! grep $blob out
+'
+
 test_done
index 7214f5b33fa41fbb685e572ca24a0cb11337d251..623a32aa6e323d11267cb89af62d42c325a4dd75 100755 (executable)
@@ -60,4 +60,10 @@ test_expect_success '@{push} with push refspecs' '
        resolve topic@{push} refs/remotes/origin/magic/topic
 '
 
+test_expect_success 'resolving @{push} fails with a detached HEAD' '
+       git checkout HEAD^0 &&
+       test_when_finished "git checkout -" &&
+       test_must_fail git rev-parse @{push}
+'
+
 test_done
index 1b1b65a6b0fc7ace4e18e8642a6c47631d7e6a43..465eeeacd3de1971c7256c84583377b3b47d520b 100755 (executable)
@@ -96,4 +96,44 @@ test_expect_success 'bare repo cleanup' '
        rm -rf bare1
 '
 
+test_expect_success 'broken main worktree still at the top' '
+       git init broken-main &&
+       (
+               cd broken-main &&
+               test_commit new &&
+               git worktree add linked &&
+               cat >expected <<-EOF &&
+               worktree $(pwd)
+               HEAD $_z40
+
+               EOF
+               cd linked &&
+               echo "worktree $(pwd)" >expected &&
+               echo "ref: .broken" >../.git/HEAD &&
+               git worktree list --porcelain | head -n 3 >actual &&
+               test_cmp ../expected actual &&
+               git worktree list | head -n 1 >actual.2 &&
+               grep -F "(error)" actual.2
+       )
+'
+
+test_expect_success 'linked worktrees are sorted' '
+       mkdir sorted &&
+       git init sorted/main &&
+       (
+               cd sorted/main &&
+               test_tick &&
+               test_commit new &&
+               git worktree add ../first &&
+               git worktree add ../second &&
+               git worktree list --porcelain | grep ^worktree >actual
+       ) &&
+       cat >expected <<-EOF &&
+       worktree $(pwd)/sorted/main
+       worktree $(pwd)/sorted/first
+       worktree $(pwd)/sorted/second
+       EOF
+       test_cmp expected sorted/main/actual
+'
+
 test_done
index 470f33466ca561484da080a522add72bed51ad6e..9a893b5fe746f03521454972199ecb2d243d79ab 100755 (executable)
@@ -575,13 +575,13 @@ test_expect_success 'merge removes empty directories' '
        test_must_fail test -d d
 '
 
-test_expect_failure 'merge-recursive simple w/submodule' '
+test_expect_success 'merge-recursive simple w/submodule' '
 
        git checkout submod &&
        git merge remove
 '
 
-test_expect_failure 'merge-recursive simple w/submodule result' '
+test_expect_success 'merge-recursive simple w/submodule result' '
 
        git ls-files -s >actual &&
        (
index c6a3ccba1b992cff7412bcf8139da7557981de94..52283dfc8cdafabba485fa6896279d600230abf9 100755 (executable)
@@ -89,6 +89,11 @@ test_expect_success 'git branch --list -v pattern shows branch summaries' '
        awk "{print \$NF}" <tmp >actual &&
        test_cmp expect actual
 '
+test_expect_success 'git branch --ignore-case --list -v pattern shows branch summaries' '
+       git branch --list --ignore-case -v BRANCH* >tmp &&
+       awk "{print \$NF}" <tmp >actual &&
+       test_cmp expect actual
+'
 
 test_expect_success 'git branch -v pattern does not show branch summaries' '
        test_must_fail git branch -v branch*
@@ -196,4 +201,28 @@ test_expect_success 'local-branch symrefs shortened properly' '
        test_cmp expect actual
 '
 
+test_expect_success 'sort branches, ignore case' '
+       (
+               git init sort-icase &&
+               cd sort-icase &&
+               test_commit initial &&
+               git branch branch-one &&
+               git branch BRANCH-two &&
+               git branch --list | awk "{print \$NF}" >actual &&
+               cat >expected <<-\EOF &&
+               BRANCH-two
+               branch-one
+               master
+               EOF
+               test_cmp expected actual &&
+               git branch --list -i | awk "{print \$NF}" >actual &&
+               cat >expected <<-\EOF &&
+               branch-one
+               BRANCH-two
+               master
+               EOF
+               test_cmp expected actual
+       )
+'
+
 test_done
index c896a4c1067fc80378130a09705bef58370f01be..e2f18d11f66afe19bf28b8218042a06f452f0aa1 100755 (executable)
@@ -237,6 +237,22 @@ test_expect_success 'retain authorship' '
        git show HEAD | grep "^Author: Twerp Snog"
 '
 
+test_expect_success 'retain authorship w/ conflicts' '
+       git reset --hard twerp &&
+       test_commit a conflict a conflict-a &&
+       git reset --hard twerp &&
+       GIT_AUTHOR_NAME=AttributeMe \
+       test_commit b conflict b conflict-b &&
+       set_fake_editor &&
+       test_must_fail git rebase -i conflict-a &&
+       echo resolved >conflict &&
+       git add conflict &&
+       git rebase --continue &&
+       test $(git rev-parse conflict-a^0) = $(git rev-parse HEAD^) &&
+       git show >out &&
+       grep AttributeMe out
+'
+
 test_expect_success 'squash' '
        git reset --hard twerp &&
        echo B > file7 &&
index a6a6c40a98512b190f8610391aa153a294e4b5cb..910f2182843476edf878bfc42f34d868c70d8cf5 100755 (executable)
@@ -99,4 +99,28 @@ testrebase() {
 testrebase "" .git/rebase-apply
 testrebase " --merge" .git/rebase-merge
 
+test_expect_success 'rebase --quit' '
+       cd "$work_dir" &&
+       # Clean up the state from the previous one
+       git reset --hard pre-rebase &&
+       test_must_fail git rebase master &&
+       test_path_is_dir .git/rebase-apply &&
+       head_before=$(git rev-parse HEAD) &&
+       git rebase --quit &&
+       test $(git rev-parse HEAD) = $head_before &&
+       test ! -d .git/rebase-apply
+'
+
+test_expect_success 'rebase --merge --quit' '
+       cd "$work_dir" &&
+       # Clean up the state from the previous one
+       git reset --hard pre-rebase &&
+       test_must_fail git rebase --merge master &&
+       test_path_is_dir .git/rebase-merge &&
+       head_before=$(git rev-parse HEAD) &&
+       git rebase --quit &&
+       test $(git rev-parse HEAD) = $head_before &&
+       test ! -d .git/rebase-merge
+'
+
 test_done
index d5b896d4459e82cdc7eb363af77d8eef28871229..ebf4f5e4b2c1c1cc20a49888df14cedd14b49a8b 100755 (executable)
@@ -38,9 +38,6 @@ git_rebase_interactive () {
        git rebase -i "$1"
 }
 
-KNOWN_FAILURE_NOFF_MERGE_DOESNT_CREATE_EMPTY_SUBMODULE_DIR=1
-# The real reason "replace directory with submodule" fails is because a
-# directory "sub1" exists, but we reuse the suppression added for merge here
 test_submodule_switch "git_rebase_interactive"
 
 test_done
index 394f0005a195c1fbc713226c97ecee5cf4600007..4f2a263b63e14348032959059c15b160fecba39c 100755 (executable)
@@ -141,4 +141,16 @@ test_expect_success 'cherry-pick "-" works with arguments' '
        test_cmp expect actual
 '
 
+test_expect_success 'cherry-pick works with dirty renamed file' '
+       test_commit to-rename &&
+       git checkout -b unrelated &&
+       test_commit unrelated &&
+       git checkout @{-1} &&
+       git mv to-rename.t renamed &&
+       test_tick &&
+       git commit -m renamed &&
+       echo modified >renamed &&
+       git cherry-pick refs/heads/unrelated
+'
+
 test_done
index 7b7a89dbd5ce578e0a722345a00f247e383689ef..0acf4b14614c750d3c2324d8a941aa77d5c7ad56 100755 (executable)
@@ -147,6 +147,16 @@ test_expect_success '--abort to cancel single cherry-pick' '
        git diff-index --exit-code HEAD
 '
 
+test_expect_success '--abort does not unsafely change HEAD' '
+       pristine_detach initial &&
+       test_must_fail git cherry-pick picked anotherpick &&
+       git reset --hard base &&
+       test_must_fail git cherry-pick picked anotherpick &&
+       git cherry-pick --abort 2>actual &&
+       test_i18ngrep "You seem to have moved HEAD" actual &&
+       test_cmp_rev base HEAD
+'
+
 test_expect_success 'cherry-pick --abort to cancel multiple revert' '
        pristine_detach anotherpick &&
        test_expect_code 1 git revert base..picked &&
@@ -375,7 +385,7 @@ test_expect_success '--continue respects opts' '
        git cat-file commit HEAD~1 >picked_msg &&
        git cat-file commit HEAD~2 >unrelatedpick_msg &&
        git cat-file commit HEAD~3 >initial_msg &&
-       test_must_fail grep "cherry picked from" initial_msg &&
+       ! grep "cherry picked from" initial_msg &&
        grep "cherry picked from" unrelatedpick_msg &&
        grep "cherry picked from" picked_msg &&
        grep "cherry picked from" anotherpick_msg
@@ -416,9 +426,9 @@ test_expect_failure '--signoff is automatically propagated to resolved conflict'
        git cat-file commit HEAD~1 >picked_msg &&
        git cat-file commit HEAD~2 >unrelatedpick_msg &&
        git cat-file commit HEAD~3 >initial_msg &&
-       test_must_fail grep "Signed-off-by:" initial_msg &&
+       ! grep "Signed-off-by:" initial_msg &&
        grep "Signed-off-by:" unrelatedpick_msg &&
-       test_must_fail grep "Signed-off-by:" picked_msg &&
+       ! grep "Signed-off-by:" picked_msg &&
        grep "Signed-off-by:" anotherpick_msg
 '
 
index 9cce5ae8815a11e3453f5669b0592f7f7659009b..bf0a5c9887235afb5e336a34815d6bb3d64875d8 100755 (executable)
@@ -25,9 +25,8 @@ Signed-off-by: B.U. Thor <buthor@example.com>"
 
 mesg_broken_footer="$mesg_no_footer
 
-The signed-off-by string should begin with the words Signed-off-by followed
-by a colon and space, and then the signers name and email address. e.g.
-Signed-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>"
+This is not recognized as a footer because Myfooter is not a recognized token.
+Myfooter: A.U. Thor <author@example.com>"
 
 mesg_with_footer_sob="$mesg_with_footer
 Signed-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>"
@@ -112,6 +111,17 @@ test_expect_success 'cherry-pick -s inserts blank line after non-conforming foot
        test_cmp expect actual
 '
 
+test_expect_success 'cherry-pick -s recognizes trailer config' '
+       pristine_detach initial &&
+       git -c "trailer.Myfooter.ifexists=add" cherry-pick -s mesg-broken-footer &&
+       cat <<-EOF >expect &&
+               $mesg_broken_footer
+               Signed-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>
+       EOF
+       git log -1 --pretty=format:%B >actual &&
+       test_cmp expect actual
+'
+
 test_expect_success 'cherry-pick -x inserts blank line when conforming footer not found' '
        pristine_detach initial &&
        sha1=$(git rev-parse mesg-no-footer^0) &&
index 14f0edca2b6f67e6ae98379702b5566e4083d8e0..5aa6db584cd0dbddf6060eeb46f4c1c9836bc935 100755 (executable)
@@ -111,21 +111,21 @@ test_expect_success 'Remove nonexistent file with --ignore-unmatch' '
 '
 
 test_expect_success '"rm" command printed' '
-       echo frotz > test-file &&
+       echo frotz >test-file &&
        git add test-file &&
        git commit -m "add file for rm test" &&
-       git rm test-file > rm-output &&
+       git rm test-file >rm-output &&
        test $(grep "^rm " rm-output | wc -l) = 1 &&
        rm -f test-file rm-output &&
        git commit -m "remove file from rm test"
 '
 
 test_expect_success '"rm" command suppressed with --quiet' '
-       echo frotz > test-file &&
+       echo frotz >test-file &&
        git add test-file &&
        git commit -m "add file for rm --quiet test" &&
-       git rm --quiet test-file > rm-output &&
-       test $(wc -l < rm-output) = 0 &&
+       git rm --quiet test-file >rm-output &&
+       test_must_be_empty rm-output &&
        rm -f test-file rm-output &&
        git commit -m "remove file from rm --quiet test"
 '
@@ -221,7 +221,7 @@ test_expect_success 'Call "rm" from outside the work tree' '
        mkdir repo &&
        (cd repo &&
         git init &&
-        echo something > somefile &&
+        echo something >somefile &&
         git add somefile &&
         git commit -m "add a file" &&
         (cd .. &&
@@ -287,7 +287,7 @@ test_expect_success 'rm removes empty submodules from work tree' '
        git commit -m "add submodule" &&
        git rm submod &&
        test ! -e submod &&
-       git status -s -uno --ignore-submodules=none > actual &&
+       git status -s -uno --ignore-submodules=none >actual &&
        test_cmp expect actual &&
        test_must_fail git config -f .gitmodules submodule.sub.url &&
        test_must_fail git config -f .gitmodules submodule.sub.path
@@ -298,7 +298,7 @@ test_expect_success 'rm removes removed submodule from index and .gitmodules' '
        git submodule update &&
        rm -rf submod &&
        git rm submod &&
-       git status -s -uno --ignore-submodules=none > actual &&
+       git status -s -uno --ignore-submodules=none >actual &&
        test_cmp expect actual &&
        test_must_fail git config -f .gitmodules submodule.sub.url &&
        test_must_fail git config -f .gitmodules submodule.sub.path
@@ -309,7 +309,7 @@ test_expect_success 'rm removes work tree of unmodified submodules' '
        git submodule update &&
        git rm submod &&
        test ! -d submod &&
-       git status -s -uno --ignore-submodules=none > actual &&
+       git status -s -uno --ignore-submodules=none >actual &&
        test_cmp expect actual &&
        test_must_fail git config -f .gitmodules submodule.sub.url &&
        test_must_fail git config -f .gitmodules submodule.sub.path
@@ -320,7 +320,7 @@ test_expect_success 'rm removes a submodule with a trailing /' '
        git submodule update &&
        git rm submod/ &&
        test ! -d submod &&
-       git status -s -uno --ignore-submodules=none > actual &&
+       git status -s -uno --ignore-submodules=none >actual &&
        test_cmp expect actual
 '
 
@@ -335,17 +335,15 @@ test_expect_success 'rm succeeds when given a directory with a trailing /' '
 test_expect_success 'rm of a populated submodule with different HEAD fails unless forced' '
        git reset --hard &&
        git submodule update &&
-       (cd submod &&
-               git checkout HEAD^
-       ) &&
+       git -C submod checkout HEAD^ &&
        test_must_fail git rm submod &&
        test -d submod &&
        test -f submod/.git &&
-       git status -s -uno --ignore-submodules=none > actual &&
+       git status -s -uno --ignore-submodules=none >actual &&
        test_cmp expect.modified actual &&
        git rm -f submod &&
        test ! -d submod &&
-       git status -s -uno --ignore-submodules=none > actual &&
+       git status -s -uno --ignore-submodules=none >actual &&
        test_cmp expect actual &&
        test_must_fail git config -f .gitmodules submodule.sub.url &&
        test_must_fail git config -f .gitmodules submodule.sub.path
@@ -418,34 +416,30 @@ test_expect_success 'rm issues a warning when section is not found in .gitmodule
 test_expect_success 'rm of a populated submodule with modifications fails unless forced' '
        git reset --hard &&
        git submodule update &&
-       (cd submod &&
-               echo X >empty
-       ) &&
+       echo X >submod/empty &&
        test_must_fail git rm submod &&
        test -d submod &&
        test -f submod/.git &&
-       git status -s -uno --ignore-submodules=none > actual &&
+       git status -s -uno --ignore-submodules=none >actual &&
        test_cmp expect.modified actual &&
        git rm -f submod &&
        test ! -d submod &&
-       git status -s -uno --ignore-submodules=none > actual &&
+       git status -s -uno --ignore-submodules=none >actual &&
        test_cmp expect actual
 '
 
 test_expect_success 'rm of a populated submodule with untracked files fails unless forced' '
        git reset --hard &&
        git submodule update &&
-       (cd submod &&
-               echo X >untracked
-       ) &&
+       echo X >submod/untracked &&
        test_must_fail git rm submod &&
        test -d submod &&
        test -f submod/.git &&
-       git status -s -uno --ignore-submodules=none > actual &&
+       git status -s -uno --ignore-submodules=none >actual &&
        test_cmp expect.modified actual &&
        git rm -f submod &&
        test ! -d submod &&
-       git status -s -uno --ignore-submodules=none > actual &&
+       git status -s -uno --ignore-submodules=none >actual &&
        test_cmp expect actual
 '
 
@@ -461,16 +455,12 @@ test_expect_success 'setup submodule conflict' '
        git add nitfol &&
        git commit -m "added nitfol 2" &&
        git checkout -b conflict1 master &&
-       (cd submod &&
-               git fetch &&
-               git checkout branch1
-       ) &&
+       git -C submod fetch &&
+       git -C submod checkout branch1 &&
        git add submod &&
        git commit -m "submod 1" &&
        git checkout -b conflict2 master &&
-       (cd submod &&
-               git checkout branch2
-       ) &&
+       git -C submod checkout branch2 &&
        git add submod &&
        git commit -m "submod 2"
 '
@@ -486,7 +476,7 @@ test_expect_success 'rm removes work tree of unmodified conflicted submodule' '
        test_must_fail git merge conflict2 &&
        git rm submod &&
        test ! -d submod &&
-       git status -s -uno --ignore-submodules=none > actual &&
+       git status -s -uno --ignore-submodules=none >actual &&
        test_cmp expect actual
 '
 
@@ -494,18 +484,16 @@ test_expect_success 'rm of a conflicted populated submodule with different HEAD
        git checkout conflict1 &&
        git reset --hard &&
        git submodule update &&
-       (cd submod &&
-               git checkout HEAD^
-       ) &&
+       git -C submod checkout HEAD^ &&
        test_must_fail git merge conflict2 &&
        test_must_fail git rm submod &&
        test -d submod &&
        test -f submod/.git &&
-       git status -s -uno --ignore-submodules=none > actual &&
+       git status -s -uno --ignore-submodules=none >actual &&
        test_cmp expect.conflict actual &&
        git rm -f submod &&
        test ! -d submod &&
-       git status -s -uno --ignore-submodules=none > actual &&
+       git status -s -uno --ignore-submodules=none >actual &&
        test_cmp expect actual &&
        test_must_fail git config -f .gitmodules submodule.sub.url &&
        test_must_fail git config -f .gitmodules submodule.sub.path
@@ -515,18 +503,16 @@ test_expect_success 'rm of a conflicted populated submodule with modifications f
        git checkout conflict1 &&
        git reset --hard &&
        git submodule update &&
-       (cd submod &&
-               echo X >empty
-       ) &&
+       echo X >submod/empty &&
        test_must_fail git merge conflict2 &&
        test_must_fail git rm submod &&
        test -d submod &&
        test -f submod/.git &&
-       git status -s -uno --ignore-submodules=none > actual &&
+       git status -s -uno --ignore-submodules=none >actual &&
        test_cmp expect.conflict actual &&
        git rm -f submod &&
        test ! -d submod &&
-       git status -s -uno --ignore-submodules=none > actual &&
+       git status -s -uno --ignore-submodules=none >actual &&
        test_cmp expect actual &&
        test_must_fail git config -f .gitmodules submodule.sub.url &&
        test_must_fail git config -f .gitmodules submodule.sub.path
@@ -536,18 +522,16 @@ test_expect_success 'rm of a conflicted populated submodule with untracked files
        git checkout conflict1 &&
        git reset --hard &&
        git submodule update &&
-       (cd submod &&
-               echo X >untracked
-       ) &&
+       echo X >submod/untracked &&
        test_must_fail git merge conflict2 &&
        test_must_fail git rm submod &&
        test -d submod &&
        test -f submod/.git &&
-       git status -s -uno --ignore-submodules=none > actual &&
+       git status -s -uno --ignore-submodules=none >actual &&
        test_cmp expect.conflict actual &&
        git rm -f submod &&
        test ! -d submod &&
-       git status -s -uno --ignore-submodules=none > actual &&
+       git status -s -uno --ignore-submodules=none >actual &&
        test_cmp expect actual
 '
 
@@ -564,12 +548,12 @@ test_expect_success 'rm of a conflicted populated submodule with a .git director
        test_must_fail git rm submod &&
        test -d submod &&
        test -d submod/.git &&
-       git status -s -uno --ignore-submodules=none > actual &&
+       git status -s -uno --ignore-submodules=none >actual &&
        test_cmp expect.conflict actual &&
        test_must_fail git rm -f submod &&
        test -d submod &&
        test -d submod/.git &&
-       git status -s -uno --ignore-submodules=none > actual &&
+       git status -s -uno --ignore-submodules=none >actual &&
        test_cmp expect.conflict actual &&
        git merge --abort &&
        rm -rf submod
@@ -581,30 +565,26 @@ test_expect_success 'rm of a conflicted unpopulated submodule succeeds' '
        test_must_fail git merge conflict2 &&
        git rm submod &&
        test ! -d submod &&
-       git status -s -uno --ignore-submodules=none > actual &&
+       git status -s -uno --ignore-submodules=none >actual &&
        test_cmp expect actual
 '
 
-test_expect_success 'rm of a populated submodule with a .git directory fails even when forced' '
+test_expect_success 'rm of a populated submodule with a .git directory migrates git dir' '
        git checkout -f master &&
        git reset --hard &&
        git submodule update &&
        (cd submod &&
                rm .git &&
                cp -R ../.git/modules/sub .git &&
-               GIT_WORK_TREE=. git config --unset core.worktree
+               GIT_WORK_TREE=. git config --unset core.worktree &&
+               rm -r ../.git/modules/sub
        ) &&
-       test_must_fail git rm submod &&
-       test -d submod &&
-       test -d submod/.git &&
-       git status -s -uno --ignore-submodules=none > actual &&
-       ! test -s actual &&
-       test_must_fail git rm -f submod &&
-       test -d submod &&
-       test -d submod/.git &&
-       git status -s -uno --ignore-submodules=none > actual &&
-       ! test -s actual &&
-       rm -rf submod
+       git rm submod 2>output.err &&
+       ! test -d submod &&
+       ! test -d submod/.git &&
+       git status -s -uno --ignore-submodules=none >actual &&
+       test -s actual &&
+       test_i18ngrep Migrating output.err
 '
 
 cat >expect.deepmodified <<EOF
@@ -629,58 +609,52 @@ test_expect_success 'setup subsubmodule' '
 test_expect_success 'rm recursively removes work tree of unmodified submodules' '
        git rm submod &&
        test ! -d submod &&
-       git status -s -uno --ignore-submodules=none > actual &&
+       git status -s -uno --ignore-submodules=none >actual &&
        test_cmp expect actual
 '
 
 test_expect_success 'rm of a populated nested submodule with different nested HEAD fails unless forced' '
        git reset --hard &&
        git submodule update --recursive &&
-       (cd submod/subsubmod &&
-               git checkout HEAD^
-       ) &&
+       git -C submod/subsubmod checkout HEAD^ &&
        test_must_fail git rm submod &&
        test -d submod &&
        test -f submod/.git &&
-       git status -s -uno --ignore-submodules=none > actual &&
+       git status -s -uno --ignore-submodules=none >actual &&
        test_cmp expect.modified actual &&
        git rm -f submod &&
        test ! -d submod &&
-       git status -s -uno --ignore-submodules=none > actual &&
+       git status -s -uno --ignore-submodules=none >actual &&
        test_cmp expect actual
 '
 
 test_expect_success 'rm of a populated nested submodule with nested modifications fails unless forced' '
        git reset --hard &&
        git submodule update --recursive &&
-       (cd submod/subsubmod &&
-               echo X >empty
-       ) &&
+       echo X >submod/subsubmod/empty &&
        test_must_fail git rm submod &&
        test -d submod &&
        test -f submod/.git &&
-       git status -s -uno --ignore-submodules=none > actual &&
+       git status -s -uno --ignore-submodules=none >actual &&
        test_cmp expect.modified actual &&
        git rm -f submod &&
        test ! -d submod &&
-       git status -s -uno --ignore-submodules=none > actual &&
+       git status -s -uno --ignore-submodules=none >actual &&
        test_cmp expect actual
 '
 
 test_expect_success 'rm of a populated nested submodule with nested untracked files fails unless forced' '
        git reset --hard &&
        git submodule update --recursive &&
-       (cd submod/subsubmod &&
-               echo X >untracked
-       ) &&
+       echo X >submod/subsubmod/untracked &&
        test_must_fail git rm submod &&
        test -d submod &&
        test -f submod/.git &&
-       git status -s -uno --ignore-submodules=none > actual &&
+       git status -s -uno --ignore-submodules=none >actual &&
        test_cmp expect.modified actual &&
        git rm -f submod &&
        test ! -d submod &&
-       git status -s -uno --ignore-submodules=none > actual &&
+       git status -s -uno --ignore-submodules=none >actual &&
        test_cmp expect actual
 '
 
@@ -689,34 +663,29 @@ test_expect_success 'rm of a populated nested submodule with a nested .git direc
        git submodule update --recursive &&
        (cd submod/subsubmod &&
                rm .git &&
-               cp -R ../../.git/modules/sub/modules/sub .git &&
+               mv ../../.git/modules/sub/modules/sub .git &&
                GIT_WORK_TREE=. git config --unset core.worktree
        ) &&
-       test_must_fail git rm submod &&
-       test -d submod &&
-       test -d submod/subsubmod/.git &&
-       git status -s -uno --ignore-submodules=none > actual &&
-       ! test -s actual &&
-       test_must_fail git rm -f submod &&
-       test -d submod &&
-       test -d submod/subsubmod/.git &&
-       git status -s -uno --ignore-submodules=none > actual &&
-       ! test -s actual &&
-       rm -rf submod
+       git rm submod 2>output.err &&
+       ! test -d submod &&
+       ! test -d submod/subsubmod/.git &&
+       git status -s -uno --ignore-submodules=none >actual &&
+       test -s actual &&
+       test_i18ngrep Migrating output.err
 '
 
 test_expect_success 'checking out a commit after submodule removal needs manual updates' '
-       git commit -m "submodule removal" submod &&
+       git commit -m "submodule removal" submod .gitmodules &&
        git checkout HEAD^ &&
        git submodule update &&
-       git checkout -q HEAD^ 2>actual &&
+       git checkout -q HEAD^ &&
        git checkout -q master 2>actual &&
        test_i18ngrep "^warning: unable to rmdir submod:" actual &&
        git status -s submod >actual &&
        echo "?? submod/" >expected &&
        test_cmp expected actual &&
        rm -rf submod &&
-       git status -s -uno --ignore-submodules=none > actual &&
+       git status -s -uno --ignore-submodules=none >actual &&
        ! test -s actual
 '
 
index deae948c76bd12f9b3ef6b54568717b21d641d8a..5ffe78e920c4aa292a6c16e2aa8078ede4ab065c 100755 (executable)
@@ -380,4 +380,18 @@ test_expect_success 'patch mode ignores unmerged entries' '
        test_cmp expected diff
 '
 
+test_expect_success 'diffs can be colorized' '
+       git reset --hard &&
+
+       # force color even though the test script has no terminal
+       test_config color.ui always &&
+
+       echo content >test &&
+       printf y | git add -p >output 2>&1 &&
+
+       # We do not want to depend on the exact coloring scheme
+       # git uses for diffs, so just check that we saw some kind of color.
+       grep "$(printf "\\033")" output
+'
+
 test_done
index e1a6ccc00c5988cfa8808bccc49a5e21703166b6..2de3e18ce68a94111c8dfcca858b8515ea8919c1 100755 (executable)
@@ -766,4 +766,13 @@ test_expect_success 'stash list --cc shows combined diff' '
        test_cmp expect actual
 '
 
+test_expect_success 'stash is not confused by partial renames' '
+       mv file renamed &&
+       git add renamed &&
+       git stash &&
+       git stash apply &&
+       test_path_is_file renamed &&
+       test_path_is_missing file
+'
+
 test_done
index 566817e2efdccc4747e871f3bdabb90fa5b134ec..d09acfe48e81b2567fd7408d7cb6345c73d99754 100755 (executable)
@@ -311,6 +311,13 @@ diff --line-prefix=abc master master^ side
 diff --dirstat master~1 master~2
 diff --dirstat initial rearrange
 diff --dirstat-by-file initial rearrange
+# No-index --abbrev and --no-abbrev
+diff --raw initial
+diff --raw --abbrev=4 initial
+diff --raw --no-abbrev initial
+diff --no-index --raw dir2 dir
+diff --no-index --raw --abbrev=4 dir2 dir
+diff --no-index --raw --no-abbrev dir2 dir
 EOF
 
 test_expect_success 'log -S requires an argument' '
diff --git a/t/t4013/diff.diff_--no-index_--raw_--abbrev=4_dir2_dir b/t/t4013/diff.diff_--no-index_--raw_--abbrev=4_dir2_dir
new file mode 100644 (file)
index 0000000..a71b38a
--- /dev/null
@@ -0,0 +1,3 @@
+$ git diff --no-index --raw --abbrev=4 dir2 dir
+:000000 100644 0000... 0000... A       dir/sub
+$
diff --git a/t/t4013/diff.diff_--no-index_--raw_--no-abbrev_dir2_dir b/t/t4013/diff.diff_--no-index_--raw_--no-abbrev_dir2_dir
new file mode 100644 (file)
index 0000000..e0f0097
--- /dev/null
@@ -0,0 +1,3 @@
+$ git diff --no-index --raw --no-abbrev dir2 dir
+:000000 100644 0000000000000000000000000000000000000000 0000000000000000000000000000000000000000 A     dir/sub
+$
diff --git a/t/t4013/diff.diff_--no-index_--raw_dir2_dir b/t/t4013/diff.diff_--no-index_--raw_dir2_dir
new file mode 100644 (file)
index 0000000..3cb4ee7
--- /dev/null
@@ -0,0 +1,3 @@
+$ git diff --no-index --raw dir2 dir
+:000000 100644 0000000... 0000000... A dir/sub
+$
diff --git a/t/t4013/diff.diff_--raw_--abbrev=4_initial b/t/t4013/diff.diff_--raw_--abbrev=4_initial
new file mode 100644 (file)
index 0000000..c3641db
--- /dev/null
@@ -0,0 +1,6 @@
+$ git diff --raw --abbrev=4 initial
+:100644 100644 35d2... 9929... M       dir/sub
+:100644 100644 01e7... 10a8... M       file0
+:000000 100644 0000... b1e6... A       file1
+:100644 000000 01e7... 0000... D       file2
+$
diff --git a/t/t4013/diff.diff_--raw_--no-abbrev_initial b/t/t4013/diff.diff_--raw_--no-abbrev_initial
new file mode 100644 (file)
index 0000000..c87a125
--- /dev/null
@@ -0,0 +1,6 @@
+$ git diff --raw --no-abbrev initial
+:100644 100644 35d242ba79ae89ac695e26b3d4c27a8e6f028f9e 992913c5aa0a5476d10c49ed0f21fc0c6d1aedf3 M     dir/sub
+:100644 100644 01e79c32a8c99c557f0757da7cb6d65b3414466d 10a8a9f3657f91a156b9f0184ed79a20adef9f7f M     file0
+:000000 100644 0000000000000000000000000000000000000000 b1e67221afe8461efd244b487afca22d46b95eb8 A     file1
+:100644 000000 01e79c32a8c99c557f0757da7cb6d65b3414466d 0000000000000000000000000000000000000000 D     file2
+$
diff --git a/t/t4013/diff.diff_--raw_initial b/t/t4013/diff.diff_--raw_initial
new file mode 100644 (file)
index 0000000..a3e9780
--- /dev/null
@@ -0,0 +1,6 @@
+$ git diff --raw initial
+:100644 100644 35d242b... 992913c... M dir/sub
+:100644 100644 01e79c3... 10a8a9f... M file0
+:000000 100644 0000000... b1e6722... A file1
+:100644 000000 01e79c3... 0000000... D file2
+$
index ba4902df2b605f89ec2abcac50abefc2f23fc9bf..482112ca339f05fc31e6f9c2c6168971a1121e87 100755 (executable)
@@ -1294,8 +1294,7 @@ EOF
 4:Subject: [PATCH] subject
 8:
 10:Signed-off-by: example happens to be wrapped here.
-11:
-12:Signed-off-by: C O Mitter <committer@example.com>
+11:Signed-off-by: C O Mitter <committer@example.com>
 EOF
        test_cmp expected actual
 '
@@ -1368,7 +1367,7 @@ EOF
        test_cmp expected actual
 '
 
-test_expect_success 'signoff: detect garbage in non-conforming footer' '
+test_expect_success 'signoff: tolerate garbage in conforming footer' '
        append_signoff <<\EOF >actual &&
 subject
 
@@ -1383,8 +1382,36 @@ EOF
 8:
 10:
 13:Signed-off-by: C O Mitter <committer@example.com>
-14:
-15:Signed-off-by: C O Mitter <committer@example.com>
+EOF
+       test_cmp expected actual
+'
+
+test_expect_success 'signoff: respect trailer config' '
+       append_signoff <<\EOF >actual &&
+subject
+
+Myfooter: x
+Some Trash
+EOF
+       cat >expected <<\EOF &&
+4:Subject: [PATCH] subject
+8:
+11:
+12:Signed-off-by: C O Mitter <committer@example.com>
+EOF
+       test_cmp expected actual &&
+
+       test_config trailer.Myfooter.ifexists add &&
+       append_signoff <<\EOF >actual &&
+subject
+
+Myfooter: x
+Some Trash
+EOF
+       cat >expected <<\EOF &&
+4:Subject: [PATCH] subject
+8:
+11:Signed-off-by: C O Mitter <committer@example.com>
 EOF
        test_cmp expected actual
 '
index ec78c5e3ac5661977b30582df9bec95265e1c613..671e951ee5498c7691c5e996c9dfd75dac3e8861 100755 (executable)
@@ -6,10 +6,11 @@
 test_description='Test diff/status color escape codes'
 . ./test-lib.sh
 
+ESC=$(printf '\033')
 color()
 {
        actual=$(git config --get-color no.such.slot "$1") &&
-       test "$actual" = "\e$2"
+       test "$actual" = "${2:+$ESC}$2"
 }
 
 invalid_color()
@@ -21,6 +22,10 @@ test_expect_success 'reset' '
        color "reset" "[m"
 '
 
+test_expect_success 'empty color is empty' '
+       color "" ""
+'
+
 test_expect_success 'attribute before color name' '
        color "bold red" "[1;31m"
 '
index e4e3e28fc788fd16c73298a0c385f1b39994941e..bada0cbd32f76418a76702fbbd5143004876d074 100755 (executable)
@@ -16,11 +16,15 @@ f() {
 }
 
 t() {
+       use_config=
+       git config --unset diff.interHunkContext
+
        case $# in
        4) hunks=$4; cmd="diff -U$3";;
        5) hunks=$5; cmd="diff -U$3 --inter-hunk-context=$4";;
+       6) hunks=$5; cmd="diff -U$3"; git config diff.interHunkContext $4; use_config="(diff.interHunkContext=$4) ";;
        esac
-       label="$cmd, $1 common $2"
+       label="$use_config$cmd, $1 common $2"
        file=f$1
        expected=expected.$file.$3.$hunks
 
@@ -89,4 +93,25 @@ t 9 lines    3               2
 t 9 lines      3       2       2
 t 9 lines      3       3       1
 
+#                                      use diff.interHunkContext?
+t 1 line       0       0       2       config
+t 1 line       0       1       1       config
+t 1 line       0       2       1       config
+t 9 lines      3       3       1       config
+t 2 lines      0       0       2       config
+t 2 lines      0       1       2       config
+t 2 lines      0       2       1       config
+t 3 lines      1       0       2       config
+t 3 lines      1       1       1       config
+t 3 lines      1       2       1       config
+t 9 lines      3       2       2       config
+t 9 lines      3       3       1       config
+
+test_expect_success 'diff.interHunkContext invalid' '
+       git config diff.interHunkContext asdf &&
+       test_must_fail git diff &&
+       git config diff.interHunkContext -1 &&
+       test_must_fail git diff
+'
+
 test_done
index ae08b57712e382a4cba7f7a51a499b4621a38c84..9df054bf05b8cd40011c0577aa0ce0f30cb8c23f 100755 (executable)
@@ -190,4 +190,23 @@ test_expect_success 'shortlog with --output=<file>' '
        test_line_count = 3 shortlog
 '
 
+test_expect_success 'shortlog --committer (internal)' '
+       git checkout --orphan side &&
+       git commit --allow-empty -m one &&
+       git commit --allow-empty -m two &&
+       GIT_COMMITTER_NAME="Sin Nombre" git commit --allow-empty -m three &&
+
+       cat >expect <<-\EOF &&
+            2  C O Mitter
+            1  Sin Nombre
+       EOF
+       git shortlog -nsc HEAD >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'shortlog --committer (external)' '
+       git log --format=full | git shortlog -nsc >actual &&
+       test_cmp expect actual
+'
+
 test_done
index 1ccbd5948a735f692469e181933c97e8632404b4..08ea725de3307c886d8f341b49c61c0d3436f91c 100755 (executable)
@@ -359,6 +359,28 @@ test_expect_success 'log --graph --line-prefix="| | | " with merge' '
        test_cmp expect actual
 '
 
+cat > expect.colors <<\EOF
+*   Merge branch 'side'
+<BLUE>|<RESET><CYAN>\<RESET>
+<BLUE>|<RESET> * side-2
+<BLUE>|<RESET> * side-1
+* <CYAN>|<RESET> Second
+* <CYAN>|<RESET> sixth
+* <CYAN>|<RESET> fifth
+* <CYAN>|<RESET> fourth
+<CYAN>|<RESET><CYAN>/<RESET>
+* third
+* second
+* initial
+EOF
+
+test_expect_success 'log --graph with merge with log.graphColors' '
+       test_config log.graphColors " blue,invalid-color, cyan, red  , " &&
+       git log --color=always --graph --date-order --pretty=tformat:%s |
+               test_decode_color | sed "s/ *\$//" >actual &&
+       test_cmp expect.colors actual
+'
+
 test_expect_success 'log --raw --graph -m with merge' '
        git log --raw --graph --oneline -m master | head -n 500 >actual &&
        grep "initial" actual
index f5435fd250baf7415fb6a205f4497cb5c118de65..21eb8c8587f2b4de01595d91d27c8ec6706d2a00 100755 (executable)
@@ -535,4 +535,30 @@ test_expect_success 'clean log decoration' '
        test_cmp expected actual1
 '
 
+cat >trailers <<EOF
+Signed-off-by: A U Thor <author@example.com>
+Acked-by: A U Thor <author@example.com>
+[ v2 updated patch description ]
+Signed-off-by: A U Thor <author@example.com>
+EOF
+
+test_expect_success 'pretty format %(trailers) shows trailers' '
+       echo "Some contents" >trailerfile &&
+       git add trailerfile &&
+       git commit -F - <<-EOF &&
+       trailers: this commit message has trailers
+
+       This commit is a test commit with trailers at the end. We parse this
+       message and display the trailers using %bT
+
+       $(cat trailers)
+       EOF
+       git log --no-walk --pretty="%(trailers)" >actual &&
+       cat >expect <<-EOF &&
+       $(cat trailers)
+
+       EOF
+       test_cmp expect actual
+'
+
 test_done
index 830bf2a2f6d4d85358a54f58f74b4ed9fdc954d5..886b6953e40f9fceae18642ebec031e0bdf511e3 100755 (executable)
@@ -94,20 +94,6 @@ check_tar() {
        '
 }
 
-# run "$@" inside a non-git directory
-nongit () {
-       test -d non-repo ||
-       mkdir non-repo ||
-       return 1
-
-       (
-               GIT_CEILING_DIRECTORIES=$(pwd) &&
-               export GIT_CEILING_DIRECTORIES &&
-               cd non-repo &&
-               "$@"
-       )
-}
-
 test_expect_success \
     'populate workdir' \
     'mkdir a &&
index 14744b2a4b1e646890176ec53970d36de6f8ec3b..55c78709978ff75cdbd794ee4c816dfd1eb55ef0 100755 (executable)
@@ -64,6 +64,12 @@ check_zip() {
                test_cmp_bin $original/nodiff.crlf $extracted/nodiff.crlf &&
                test_cmp_bin $original/nodiff.lf   $extracted/nodiff.lf
        "
+
+       test_expect_success UNZIP " validate that custom diff is unchanged " "
+               test_cmp_bin $original/custom.cr   $extracted/custom.cr &&
+               test_cmp_bin $original/custom.crlf $extracted/custom.crlf &&
+               test_cmp_bin $original/custom.lf   $extracted/custom.lf
+       "
 }
 
 test_expect_success \
@@ -78,6 +84,9 @@ test_expect_success \
      printf "text\r"   >a/nodiff.cr &&
      printf "text\r\n" >a/nodiff.crlf &&
      printf "text\n"   >a/nodiff.lf &&
+     printf "text\r"   >a/custom.cr &&
+     printf "text\r\n" >a/custom.crlf &&
+     printf "text\n"   >a/custom.lf &&
      printf "\0\r"     >a/binary.cr &&
      printf "\0\r\n"   >a/binary.crlf &&
      printf "\0\n"     >a/binary.lf &&
@@ -112,15 +121,20 @@ test_expect_success 'add files to repository' '
 test_expect_success 'setup export-subst and diff attributes' '
        echo "a/nodiff.* -diff" >>.git/info/attributes &&
        echo "a/diff.* diff" >>.git/info/attributes &&
+       echo "a/custom.* diff=custom" >>.git/info/attributes &&
+       git config diff.custom.binary true &&
        echo "substfile?" export-subst >>.git/info/attributes &&
        git log --max-count=1 "--pretty=format:A${SUBSTFORMAT}O" HEAD \
                >a/substfile1
 '
 
-test_expect_success \
-    'create bare clone' \
-    'git clone --bare . bare.git &&
-     cp .git/info/attributes bare.git/info/attributes'
+test_expect_success 'create bare clone' '
+       git clone --bare . bare.git &&
+       cp .git/info/attributes bare.git/info/attributes &&
+       # Recreate our changes to .git/config rather than just copying it, as
+       # we do not want to clobber core.bare or other settings.
+       git -C bare.git config diff.custom.binary true
+'
 
 test_expect_success \
     'remove ignored file' \
index 899e52d50f0d73e4a755c4f7991364f34912b336..43a672c3451146f800852a6d8688c10e497b47cf 100755 (executable)
@@ -406,6 +406,21 @@ test_expect_success 'verify resulting packs' '
        git verify-pack test-11-*.pack
 '
 
+test_expect_success 'set up pack for non-repo tests' '
+       # make sure we have a pack with no matching index file
+       cp test-1-*.pack foo.pack
+'
+
+test_expect_success 'index-pack --stdin complains of non-repo' '
+       nongit test_must_fail git index-pack --stdin <foo.pack &&
+       test_path_is_missing non-repo/.git
+'
+
+test_expect_success 'index-pack <pack> works in non-repo' '
+       nongit git index-pack ../foo.pack &&
+       test_path_is_file foo.idx
+'
+
 #
 # WARNING!
 #
index b4c7a6ff6b72d5d06ce9fb13bbd74590ff459a0b..424bec7d77c2b3761669230bf30030883ce4c230 100755 (executable)
@@ -118,12 +118,10 @@ test_expect_success 'fetch (partial bitmap)' '
        test_cmp expect actual
 '
 
-test_expect_success 'incremental repack cannot create bitmaps' '
+test_expect_success 'incremental repack fails when bitmaps are requested' '
        test_commit more-1 &&
-       find .git/objects/pack -name "*.bitmap" >expect &&
-       git repack -d &&
-       find .git/objects/pack -name "*.bitmap" >actual &&
-       test_cmp expect actual
+       test_must_fail git repack -d 2>err &&
+       test_i18ngrep "Incremental repacks are incompatible with bitmap" err
 '
 
 test_expect_success 'incremental repack can disable bitmaps' '
diff --git a/t/t5315-pack-objects-compression.sh b/t/t5315-pack-objects-compression.sh
new file mode 100755 (executable)
index 0000000..34c47da
--- /dev/null
@@ -0,0 +1,44 @@
+#!/bin/sh
+
+test_description='pack-object compression configuration'
+
+. ./test-lib.sh
+
+# This should be moved to test-lib.sh together with the
+# copy in t0021 after both topics have graduated to 'master'.
+file_size () {
+       perl -e 'print -s $ARGV[0]' "$1"
+}
+
+test_expect_success setup '
+       printf "%2000000s" X |
+       git hash-object -w --stdin >object-name &&
+       # make sure it resulted in a loose object
+       ob=$(sed -e "s/\(..\).*/\1/" object-name) &&
+       ject=$(sed -e "s/..\(.*\)/\1/" object-name) &&
+       test -f .git/objects/$ob/$ject
+'
+
+while read expect config
+do
+       test_expect_success "pack-objects with $config" '
+               test_when_finished "rm -f pack-*.*" &&
+               git $config pack-objects pack <object-name &&
+               sz=$(file_size pack-*.pack) &&
+               case "$expect" in
+               small) test "$sz" -le 100000 ;;
+               large) test "$sz" -ge 100000 ;;
+               esac
+       '
+done <<\EOF
+large -c core.compression=0
+small -c core.compression=9
+large -c core.compression=0 -c pack.compression=0
+large -c core.compression=9 -c pack.compression=0
+small -c core.compression=0 -c pack.compression=9
+small -c core.compression=9 -c pack.compression=9
+large -c pack.compression=0
+small -c pack.compression=9
+EOF
+
+test_done
index 9b19cff729381b3a8f81f113a5407ac9f9d97cda..49d3621a926786dfbfd71b205dfcb5dd3fa2d889 100755 (executable)
@@ -152,7 +152,7 @@ test_expect_success 'push with receive.fsck.missingEmail=warn' '
        git --git-dir=dst/.git config --add \
                receive.fsck.badDate warn &&
        git push --porcelain dst bogus >act 2>&1 &&
-       test_must_fail grep "missingEmail" act
+       ! grep "missingEmail" act
 '
 
 test_expect_success \
index 8198d8eb05c5366c7d61a12351c333902a2265b6..ba46e86de0a7285bf88ff5fe05e378c8bfd256f9 100755 (executable)
@@ -764,6 +764,13 @@ test_expect_success 'rename a remote with name prefix of other remote' '
        )
 '
 
+test_expect_success 'rename succeeds with existing remote.<target>.prune' '
+       git clone one four.four &&
+       test_when_finished git config --global --unset remote.upstream.prune &&
+       git config --global remote.upstream.prune true &&
+       git -C four.four remote rename origin upstream
+'
+
 cat >remotes_origin <<EOF
 URL: $(pwd)/one
 Push: refs/heads/master:refs/heads/upstream
index bc44ac36d57615b516018a2602c15bea8085e316..75c570adcae4f474c15775ec8504521fc806e2a9 100755 (executable)
@@ -4,6 +4,7 @@ test_description='fetch/push involving ref namespaces'
 . ./test-lib.sh
 
 test_expect_success setup '
+       git config --global protocol.ext.allow user &&
        test_tick &&
        git init original &&
        (
index 26b2cafc4795baa8b9377c767e4453079826c34f..0fc5a7c596b5d5e01ecb43f81d3d6eaafe611b7b 100755 (executable)
@@ -1004,7 +1004,7 @@ test_expect_success 'push --porcelain' '
 test_expect_success 'push --porcelain bad url' '
        mk_empty testrepo &&
        test_must_fail git push >.git/bar --porcelain asdfasdfasd refs/heads/master:refs/remotes/origin/master &&
-       test_must_fail grep -q Done .git/bar
+       ! grep -q Done .git/bar
 '
 
 test_expect_success 'push --porcelain rejected' '
index 551844584fc7b8ff71667dd61fcba62889ded69f..17f4d0fe4e7244cb58eaedcf41bcaa9c7b157bb4 100755 (executable)
@@ -255,6 +255,23 @@ test_expect_success '--rebase' '
        test new = "$(git show HEAD:file2)"
 '
 
+test_expect_success '--rebase fast forward' '
+       git reset --hard before-rebase &&
+       git checkout -b ff &&
+       echo another modification >file &&
+       git commit -m third file &&
+
+       git checkout to-rebase &&
+       git pull --rebase . ff &&
+       test "$(git rev-parse HEAD)" = "$(git rev-parse ff)" &&
+
+       # The above only validates the result.  Did we actually bypass rebase?
+       git reflog -1 >reflog.actual &&
+       sed "s/^[0-9a-f][0-9a-f]*/OBJID/" reflog.actual >reflog.fuzzy &&
+       echo "OBJID HEAD@{0}: pull --rebase . ff: Fast-forward" >reflog.expected &&
+       test_cmp reflog.expected reflog.fuzzy
+'
+
 test_expect_success '--rebase with conflicts shows advice' '
        test_when_finished "git rebase --abort; git checkout -f to-rebase" &&
        git checkout -b seq &&
index 73f4bb63465e50aa12de824859903e5293696a85..44309566f13431fe5e70f834b4cd6bb0a674624e 100755 (executable)
@@ -98,6 +98,16 @@ test_expect_success 'push from/to new branch with upstream, matching and simple'
        test_push_failure upstream
 '
 
+test_expect_success 'push ambiguously named branch with upstream, matching and simple' '
+       git checkout -b ambiguous &&
+       test_config branch.ambiguous.remote parent1 &&
+       test_config branch.ambiguous.merge refs/heads/ambiguous &&
+       git tag ambiguous &&
+       test_push_success simple ambiguous &&
+       test_push_success matching ambiguous &&
+       test_push_success upstream ambiguous
+'
+
 test_expect_success 'push from/to new branch with current creates remote branch' '
        test_config branch.new-branch.remote repo1 &&
        git checkout new-branch &&
index 198ce8475416be494fc023de3835828332da424d..f55137f76ffac4c6f8333444b444aef65da8b3fd 100755 (executable)
@@ -427,7 +427,52 @@ test_expect_success 'push unpushable submodule recursively fails' '
                cd submodule.git &&
                git rev-parse master >../actual
        ) &&
+       test_when_finished git -C work reset --hard master^ &&
        test_cmp expected actual
 '
 
+test_expect_success 'push --dry-run does not recursively update submodules' '
+       (
+               cd work/gar/bage &&
+               git checkout master &&
+               git rev-parse master >../../../expected_submodule &&
+               > junk9 &&
+               git add junk9 &&
+               git commit -m "Ninth junk" &&
+
+               # Go up to 'work' directory
+               cd ../.. &&
+               git checkout master &&
+               git rev-parse master >../expected_pub &&
+               git add gar/bage &&
+               git commit -m "Ninth commit for gar/bage" &&
+               git push --dry-run --recurse-submodules=on-demand ../pub.git master
+       ) &&
+       git -C submodule.git rev-parse master >actual_submodule &&
+       git -C pub.git rev-parse master >actual_pub &&
+       test_cmp expected_pub actual_pub &&
+       test_cmp expected_submodule actual_submodule
+'
+
+test_expect_success 'push --dry-run does not recursively update submodules' '
+       git -C work push --dry-run --recurse-submodules=only ../pub.git master &&
+
+       git -C submodule.git rev-parse master >actual_submodule &&
+       git -C pub.git rev-parse master >actual_pub &&
+       test_cmp expected_pub actual_pub &&
+       test_cmp expected_submodule actual_submodule
+'
+
+test_expect_success 'push only unpushed submodules recursively' '
+       git -C work/gar/bage rev-parse master >expected_submodule &&
+       git -C pub.git rev-parse master >expected_pub &&
+
+       git -C work push --recurse-submodules=only ../pub.git master &&
+
+       git -C submodule.git rev-parse master >actual_submodule &&
+       git -C pub.git rev-parse master >actual_pub &&
+       test_cmp expected_submodule actual_submodule &&
+       test_cmp expected_pub actual_pub
+'
+
 test_done
index 1e5d32d068539098598b23fb3b489688ac140169..af9fcd833a5e9e4997dd5cb917ac13f4b07f10ab 100755 (executable)
@@ -33,4 +33,29 @@ test_expect_success 'rejected objects are removed' '
        test_cmp expect actual
 '
 
+test_expect_success 'push to repo path with path separator (colon)' '
+       # The interesting failure case here is when the
+       # receiving end cannot access its original object directory,
+       # so make it likely for us to generate a delta by having
+       # a non-trivial file with multiple versions.
+
+       test-genrandom foo 4096 >file.bin &&
+       git add file.bin &&
+       git commit -m bin &&
+
+       if test_have_prereq MINGW
+       then
+               pathsep=";"
+       else
+               pathsep=":"
+       fi &&
+       git clone --bare . "xxx${pathsep}yyy.git" &&
+
+       echo change >>file.bin &&
+       git commit -am change &&
+       # Note that we have to use the full path here, or it gets confused
+       # with the ssh host:path syntax.
+       git push "$(pwd)/xxx${pathsep}yyy.git" HEAD
+'
+
 test_done
index 7641417b4a3848fa9d065572e5a8248fea5c7574..aeb3a63f7c07caa3f53ff4da5096dc51493dd4e3 100755 (executable)
@@ -307,5 +307,76 @@ test_expect_success 'remote-http complains cleanly about malformed urls' '
        test_must_fail git remote-http http::/example.com/repo.git
 '
 
+test_expect_success 'redirects can be forbidden/allowed' '
+       test_must_fail git -c http.followRedirects=false \
+               clone $HTTPD_URL/dumb-redir/repo.git dumb-redir &&
+       git -c http.followRedirects=true \
+               clone $HTTPD_URL/dumb-redir/repo.git dumb-redir 2>stderr
+'
+
+test_expect_success 'redirects are reported to stderr' '
+       # just look for a snippet of the redirected-to URL
+       test_i18ngrep /dumb/ stderr
+'
+
+test_expect_success 'non-initial redirects can be forbidden' '
+       test_must_fail git -c http.followRedirects=initial \
+               clone $HTTPD_URL/redir-objects/repo.git redir-objects &&
+       git -c http.followRedirects=true \
+               clone $HTTPD_URL/redir-objects/repo.git redir-objects
+'
+
+test_expect_success 'http.followRedirects defaults to "initial"' '
+       test_must_fail git clone $HTTPD_URL/redir-objects/repo.git default
+'
+
+# The goal is for a clone of the "evil" repository, which has no objects
+# itself, to cause the client to fetch objects from the "victim" repository.
+test_expect_success 'set up evil alternates scheme' '
+       victim=$HTTPD_DOCUMENT_ROOT_PATH/victim.git &&
+       git init --bare "$victim" &&
+       git -C "$victim" --work-tree=. commit --allow-empty -m secret &&
+       git -C "$victim" repack -ad &&
+       git -C "$victim" update-server-info &&
+       sha1=$(git -C "$victim" rev-parse HEAD) &&
+
+       evil=$HTTPD_DOCUMENT_ROOT_PATH/evil.git &&
+       git init --bare "$evil" &&
+       # do this by hand to avoid object existence check
+       printf "%s\\t%s\\n" $sha1 refs/heads/master >"$evil/info/refs"
+'
+
+# Here we'll just redirect via HTTP. In a real-world attack these would be on
+# different servers, but we should reject it either way.
+test_expect_success 'http-alternates is a non-initial redirect' '
+       echo "$HTTPD_URL/dumb/victim.git/objects" \
+               >"$evil/objects/info/http-alternates" &&
+       test_must_fail git -c http.followRedirects=initial \
+               clone $HTTPD_URL/dumb/evil.git evil-initial &&
+       git -c http.followRedirects=true \
+               clone $HTTPD_URL/dumb/evil.git evil-initial
+'
+
+# Curl supports a lot of protocols that we'd prefer not to allow
+# http-alternates to use, but it's hard to test whether curl has
+# accessed, say, the SMTP protocol, because we are not running an SMTP server.
+# But we can check that it does not allow access to file://, which would
+# otherwise allow this clone to complete.
+test_expect_success 'http-alternates cannot point at funny protocols' '
+       echo "file://$victim/objects" >"$evil/objects/info/http-alternates" &&
+       test_must_fail git -c http.followRedirects=true \
+               clone "$HTTPD_URL/dumb/evil.git" evil-file
+'
+
+test_expect_success 'http-alternates triggers not-from-user protocol check' '
+       echo "$HTTPD_URL/dumb/victim.git/objects" \
+               >"$evil/objects/info/http-alternates" &&
+       test_config_global http.followRedirects true &&
+       test_must_fail git -c protocol.http.allow=user \
+               clone $HTTPD_URL/dumb/evil.git evil-user &&
+       git -c protocol.http.allow=always \
+               clone $HTTPD_URL/dumb/evil.git evil-user
+'
+
 stop_httpd
 test_done
index 1ec5b2747a2100d3ae043cde5a2436eed2d52aec..a51b7e20d32158d4b6609ba954e2ed59edaa6342 100755 (executable)
@@ -119,6 +119,10 @@ test_expect_success 'redirects re-root further requests' '
        git clone $HTTPD_URL/smart-redir-limited/repo.git repo-redir-limited
 '
 
+test_expect_success 're-rooting dies on insane schemes' '
+       test_must_fail git clone $HTTPD_URL/insane-redir/repo.git insane
+'
+
 test_expect_success 'clone from password-protected repository' '
        echo two >expect &&
        set_askpass user@host pass@host &&
@@ -276,6 +280,58 @@ test_expect_success 'large fetch-pack requests can be split across POSTs' '
        test_line_count = 2 posts
 '
 
+test_expect_success 'test allowreachablesha1inwant' '
+       test_when_finished "rm -rf test_reachable.git" &&
+       server="$HTTPD_DOCUMENT_ROOT_PATH/repo.git" &&
+       master_sha=$(git -C "$server" rev-parse refs/heads/master) &&
+       git -C "$server" config uploadpack.allowreachablesha1inwant 1 &&
+
+       git init --bare test_reachable.git &&
+       git -C test_reachable.git remote add origin "$HTTPD_URL/smart/repo.git" &&
+       git -C test_reachable.git fetch origin "$master_sha"
+'
+
+test_expect_success 'test allowreachablesha1inwant with unreachable' '
+       test_when_finished "rm -rf test_reachable.git; git reset --hard $(git rev-parse HEAD)" &&
+
+       #create unreachable sha
+       echo content >file2 &&
+       git add file2 &&
+       git commit -m two &&
+       git push public HEAD:refs/heads/doomed &&
+       git push public :refs/heads/doomed &&
+
+       server="$HTTPD_DOCUMENT_ROOT_PATH/repo.git" &&
+       master_sha=$(git -C "$server" rev-parse refs/heads/master) &&
+       git -C "$server" config uploadpack.allowreachablesha1inwant 1 &&
+
+       git init --bare test_reachable.git &&
+       git -C test_reachable.git remote add origin "$HTTPD_URL/smart/repo.git" &&
+       test_must_fail git -C test_reachable.git fetch origin "$(git rev-parse HEAD)"
+'
+
+test_expect_success 'test allowanysha1inwant with unreachable' '
+       test_when_finished "rm -rf test_reachable.git; git reset --hard $(git rev-parse HEAD)" &&
+
+       #create unreachable sha
+       echo content >file2 &&
+       git add file2 &&
+       git commit -m two &&
+       git push public HEAD:refs/heads/doomed &&
+       git push public :refs/heads/doomed &&
+
+       server="$HTTPD_DOCUMENT_ROOT_PATH/repo.git" &&
+       master_sha=$(git -C "$server" rev-parse refs/heads/master) &&
+       git -C "$server" config uploadpack.allowreachablesha1inwant 1 &&
+
+       git init --bare test_reachable.git &&
+       git -C test_reachable.git remote add origin "$HTTPD_URL/smart/repo.git" &&
+       test_must_fail git -C test_reachable.git fetch origin "$(git rev-parse HEAD)" &&
+
+       git -C "$server" config uploadpack.allowanysha1inwant 1 &&
+       git -C test_reachable.git fetch origin "$(git rev-parse HEAD)"
+'
+
 test_expect_success EXPENSIVE 'http can handle enormous ref negotiation' '
        (
                cd "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" &&
diff --git a/t/t5580-clone-push-unc.sh b/t/t5580-clone-push-unc.sh
new file mode 100755 (executable)
index 0000000..b195f71
--- /dev/null
@@ -0,0 +1,48 @@
+#!/bin/sh
+
+test_description='various UNC path tests (Windows-only)'
+. ./test-lib.sh
+
+if ! test_have_prereq MINGW; then
+       skip_all='skipping UNC path tests, requires Windows'
+       test_done
+fi
+
+UNCPATH="$(pwd)"
+case "$UNCPATH" in
+[A-Z]:*)
+       # Use administrative share e.g. \\localhost\C$\git-sdk-64\usr\src\git
+       # (we use forward slashes here because MSYS2 and Git accept them, and
+       # they are easier on the eyes)
+       UNCPATH="//localhost/${UNCPATH%%:*}\$/${UNCPATH#?:}"
+       test -d "$UNCPATH" || {
+               skip_all='could not access administrative share; skipping'
+               test_done
+       }
+       ;;
+*)
+       skip_all='skipping UNC path tests, cannot determine current path as UNC'
+       test_done
+       ;;
+esac
+
+test_expect_success setup '
+       test_commit initial
+'
+
+test_expect_success clone '
+       git clone "file://$UNCPATH" clone
+'
+
+test_expect_success push '
+       (
+               cd clone &&
+               git checkout -b to-push &&
+               test_commit to-push &&
+               git push origin HEAD
+       ) &&
+       rev="$(git -C clone rev-parse --verify refs/heads/to-push)" &&
+       test "$rev" = "$(git rev-parse --verify refs/heads/to-push)"
+'
+
+test_done
index a43339420019718b76963d5ced92ebb981b0f0ed..4241ea5b32db4a0a85810dfe6421a161ce55fc46 100755 (executable)
@@ -151,7 +151,7 @@ test_expect_success 'clone --mirror does not repeat tags' '
        git clone --mirror src mirror2 &&
        (cd mirror2 &&
         git show-ref 2> clone.err > clone.out) &&
-       test_must_fail grep Duplicate mirror2/clone.err &&
+       ! grep Duplicate mirror2/clone.err &&
        grep some-tag mirror2/clone.out
 
 '
index eec4137ca5b392743e29068f4fffae1ffb78d812..26ebb0375deb67be38974c7c5610f090a5a2a9aa 100755 (executable)
@@ -68,4 +68,22 @@ test_expect_success 'access alternate via relative path (subdir)' '
        EOF
 '
 
+# set variables outside test to avoid quote insanity; the \057 is '/',
+# which doesn't need quoting, but just confirms that de-quoting
+# is working.
+quoted='"one.git\057objects"'
+unquoted='two.git/objects'
+test_expect_success 'mix of quoted and unquoted alternates' '
+       check_obj "$quoted:$unquoted" <<-EOF
+       $one blob
+       $two blob
+'
+
+test_expect_success !MINGW 'broken quoting falls back to interpreting raw' '
+       mv one.git \"one.git &&
+       check_obj \"one.git/objects <<-EOF
+       $one blob
+       EOF
+'
+
 test_done
index b7a7f9d5886f1e2f3fc2d65bfcf1785b890638ac..c6c2661878c0ca8a22ad11e1229a664f3d009fee 100755 (executable)
@@ -4,6 +4,7 @@ test_description='ext::cmd remote "connect" helper'
 . ./test-lib.sh
 
 test_expect_success setup '
+       git config --global protocol.ext.allow user &&
        test_tick &&
        git commit --allow-empty -m initial &&
        test_tick &&
index 0d105d54174e061b20707de808b284314f730667..d911afd24cd7d43fc412adb34144b90b66082b73 100755 (executable)
@@ -18,6 +18,7 @@ test_proto "smart http" http "$HTTPD_URL/smart/repo.git"
 
 test_expect_success 'curl redirects respect whitelist' '
        test_must_fail env GIT_ALLOW_PROTOCOL=http:https \
+                          GIT_SMART_HTTP=0 \
                git clone "$HTTPD_URL/ftp-redir/repo.git" 2>stderr &&
        {
                test_i18ngrep "ftp.*disabled" stderr ||
@@ -29,5 +30,12 @@ test_expect_success 'curl limits redirects' '
        test_must_fail git clone "$HTTPD_URL/loop-redir/smart/repo.git"
 '
 
+test_expect_success 'http can be limited to from-user' '
+       git -c protocol.http.allow=user \
+               clone "$HTTPD_URL/smart/repo.git" plain.git &&
+       test_must_fail git -c protocol.http.allow=user \
+               clone "$HTTPD_URL/smart-redir-perm/repo.git" redir.git
+'
+
 stop_httpd
 test_done
index 5e5370feb40c851fa29bdec17d687eb5f22502bb..8c2c6eaef83fe90d1faa088fe65ee4a851b1e471 100755 (executable)
@@ -407,7 +407,7 @@ test_expect_success 'good merge base when good and bad are siblings' '
        test_i18ngrep "merge base must be tested" my_bisect_log.txt &&
        grep $HASH4 my_bisect_log.txt &&
        git bisect good > my_bisect_log.txt &&
-       test_must_fail grep "merge base must be tested" my_bisect_log.txt &&
+       ! grep "merge base must be tested" my_bisect_log.txt &&
        grep $HASH6 my_bisect_log.txt &&
        git bisect reset
 '
index 64a9850e3197dc2cbff00593f04a5fa196dbd632..8c617981a3a06c1ff49f03a2914bfdc31c0e293c 100755 (executable)
@@ -83,12 +83,24 @@ test_expect_success 'final^1^@ = final^1^1 final^1^2' '
        test_cmp expect actual
 '
 
+test_expect_success 'symbolic final^1^@ = final^1^1 final^1^2' '
+       git rev-parse --symbolic final^1^1 final^1^2 >expect &&
+       git rev-parse --symbolic final^1^@ >actual &&
+       test_cmp expect actual
+'
+
 test_expect_success 'final^1^! = final^1 ^final^1^1 ^final^1^2' '
        git rev-parse final^1 ^final^1^1 ^final^1^2 >expect &&
        git rev-parse final^1^! >actual &&
        test_cmp expect actual
 '
 
+test_expect_success 'symbolic final^1^! = final^1 ^final^1^1 ^final^1^2' '
+       git rev-parse --symbolic final^1 ^final^1^1 ^final^1^2 >expect &&
+       git rev-parse --symbolic final^1^! >actual &&
+       test_cmp expect actual
+'
+
 test_expect_success 'large graft octopus' '
        test_cmp_rev_output b31 "git rev-parse --verify b1^30"
 '
@@ -143,6 +155,12 @@ test_expect_success 'rev-parse merge^-2 = merge^2..merge' '
        test_cmp expect actual
 '
 
+test_expect_success 'symbolic merge^-1 = merge^1..merge' '
+       git rev-parse --symbolic merge^1..merge >expect &&
+       git rev-parse --symbolic merge^-1 >actual &&
+       test_cmp expect actual
+'
+
 test_expect_success 'rev-parse merge^-0 (invalid parent)' '
        test_must_fail git rev-parse merge^-0
 '
diff --git a/t/t6134-pathspec-in-submodule.sh b/t/t6134-pathspec-in-submodule.sh
new file mode 100755 (executable)
index 0000000..fd401ca
--- /dev/null
@@ -0,0 +1,36 @@
+#!/bin/sh
+
+test_description='test case exclude pathspec'
+
+. ./test-lib.sh
+
+test_expect_success 'setup a submodule' '
+       test_create_repo pretzel &&
+       : >pretzel/a &&
+       git -C pretzel add a &&
+       git -C pretzel commit -m "add a file" -- a &&
+       git submodule add ./pretzel sub &&
+       git commit -a -m "add submodule" &&
+       git submodule deinit --all
+'
+
+cat <<EOF >expect
+fatal: Pathspec 'sub/a' is in submodule 'sub'
+EOF
+
+test_expect_success 'error message for path inside submodule' '
+       echo a >sub/a &&
+       test_must_fail git add sub/a 2>actual &&
+       test_cmp expect actual
+'
+
+cat <<EOF >expect
+fatal: Pathspec '.' is in submodule 'sub'
+EOF
+
+test_expect_success 'error message for path inside submodule from within submodule' '
+       test_must_fail git -C sub add . 2>actual &&
+       test_cmp expect actual
+'
+
+test_done
index 039509a9cb94ef5c653df09e0453ac83157bf184..aea1dfc7148e4885e52a579ca60ee622c49b5693 100755 (executable)
@@ -563,4 +563,29 @@ test_expect_success 'do not dereference NULL upon %(HEAD) on unborn branch' '
        test_cmp expect actual
 '
 
+cat >trailers <<EOF
+Reviewed-by: A U Thor <author@example.com>
+Signed-off-by: A U Thor <author@example.com>
+EOF
+
+test_expect_success 'basic atom: head contents:trailers' '
+       echo "Some contents" > two &&
+       git add two &&
+       git commit -F - <<-EOF &&
+       trailers: this commit message has trailers
+
+       Some message contents
+
+       $(cat trailers)
+       EOF
+       git for-each-ref --format="%(contents:trailers)" refs/heads/master >actual &&
+       sanitize_pgp <actual >actual.clean &&
+       # git for-each-ref ends with a blank line
+       cat >expect <<-EOF &&
+       $(cat trailers)
+
+       EOF
+       test_cmp expect actual.clean
+'
+
 test_done
index 5d7d4146179bb43184f74dd646aacbba11cc8c8b..1762dfa6a306ca672e3d3430b020f1b01a16da7e 100755 (executable)
@@ -43,4 +43,29 @@ test_expect_success 'gc is not aborted due to a stale symref' '
        )
 '
 
+test_expect_success 'auto gc with too many loose objects does not attempt to create bitmaps' '
+       test_config gc.auto 3 &&
+       test_config gc.autodetach false &&
+       test_config pack.writebitmaps true &&
+       # We need to create two object whose sha1s start with 17
+       # since this is what git gc counts.  As it happens, these
+       # two blobs will do so.
+       test_commit 263 &&
+       test_commit 410 &&
+       # Our first gc will create a pack; our second will create a second pack
+       git gc --auto &&
+       ls .git/objects/pack | sort >existing_packs &&
+       test_commit 523 &&
+       test_commit 790 &&
+
+       git gc --auto 2>err &&
+       test_i18ngrep ! "^warning:" err &&
+       ls .git/objects/pack/ | sort >post_packs &&
+       comm -1 -3 existing_packs post_packs >new &&
+       comm -2 -3 existing_packs post_packs >del &&
+       test_line_count = 0 del && # No packs are deleted
+       test_line_count = 2 new # There is one new pack and its .idx
+'
+
+
 test_done
index 8b0f71a2ac15d65f977b0daa2a53ad47b64a043a..072e6c6b88447f21e89a0087d894ae8ab2868ad7 100755 (executable)
@@ -27,6 +27,30 @@ test_expect_success 'listing all tags in an empty tree should output nothing' '
        test $(git tag | wc -l) -eq 0
 '
 
+test_expect_success 'sort tags, ignore case' '
+       (
+               git init sort &&
+               cd sort &&
+               test_commit initial &&
+               git tag tag-one &&
+               git tag TAG-two &&
+               git tag -l >actual &&
+               cat >expected <<-\EOF &&
+               TAG-two
+               initial
+               tag-one
+               EOF
+               test_cmp expected actual &&
+               git tag -l -i >actual &&
+               cat >expected <<-\EOF &&
+               initial
+               tag-one
+               TAG-two
+               EOF
+               test_cmp expected actual
+       )
+'
+
 test_expect_success 'looking for a tag in an empty tree should fail' \
        '! (tag_exists mytag)'
 
@@ -47,6 +71,7 @@ test_expect_success 'creating a tag for an unknown revision should fail' '
 
 # commit used in the tests, test_tick is also called here to freeze the date:
 test_expect_success 'creating a tag using default HEAD should succeed' '
+       test_config core.logAllRefUpdates true &&
        test_tick &&
        echo foo >foo &&
        git add foo &&
@@ -66,6 +91,13 @@ test_expect_success '--create-reflog does not create reflog on failure' '
        test_must_fail git reflog exists refs/tags/mytag
 '
 
+test_expect_success 'option core.logAllRefUpdates=always creates reflog' '
+       test_when_finished "git tag -d tag_with_reflog" &&
+       test_config core.logAllRefUpdates always &&
+       git tag tag_with_reflog &&
+       git reflog exists refs/tags/tag_with_reflog
+'
+
 test_expect_success 'listing all tags if one exists should succeed' '
        git tag -l &&
        git tag
@@ -81,6 +113,9 @@ test_expect_success 'listing all tags if one exists should output that tag' '
 test_expect_success 'listing a tag using a matching pattern should succeed' \
        'git tag -l mytag'
 
+test_expect_success 'listing a tag with --ignore-case' \
+       'test $(git tag -l --ignore-case MYTAG) = mytag'
+
 test_expect_success \
        'listing a tag using a matching pattern should output that tag' \
        'test $(git tag -l mytag) = mytag'
@@ -122,11 +157,11 @@ test_expect_success '--force can create a tag with the name of one existing' '
        tag_exists mytag'
 
 test_expect_success '--force is moot with a non-existing tag name' '
+       test_when_finished git tag -d newtag forcetag &&
        git tag newtag >expect &&
        git tag --force forcetag >actual &&
        test_cmp expect actual
 '
-git tag -d newtag forcetag
 
 # deleting tags:
 
@@ -297,11 +332,9 @@ EOF
 '
 
 test_expect_success 'listing tags in column with column.*' '
-       git config column.tag row &&
-       git config column.ui dense &&
+       test_config column.tag row &&
+       test_config column.ui dense &&
        COLUMNS=40 git tag -l >actual &&
-       git config --unset column.ui &&
-       git config --unset column.tag &&
        cat >expected <<\EOF &&
 a1      aa1   cba     t210    t211
 v0.2.1  v1.0  v1.0.1  v1.1.3
@@ -314,9 +347,8 @@ test_expect_success 'listing tag with -n --column should fail' '
 '
 
 test_expect_success 'listing tags -n in column with column.ui ignored' '
-       git config column.ui "row dense" &&
+       test_config column.ui "row dense" &&
        COLUMNS=40 git tag -l -n >actual &&
-       git config --unset column.ui &&
        cat >expected <<\EOF &&
 a1              Foo
 aa1             Foo
@@ -847,6 +879,22 @@ test_expect_success GPG 'verifying a forged tag should fail' '
        test_must_fail git tag -v forged-tag
 '
 
+test_expect_success 'verifying a proper tag with --format pass and format accordingly' '
+       cat >expect <<-\EOF
+       tagname : signed-tag
+       EOF &&
+       git tag -v --format="tagname : %(tag)" "signed-tag" >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'verifying a forged tag with --format fail and format accordingly' '
+       cat >expect <<-\EOF
+       tagname : forged-tag
+       EOF &&
+       test_must_fail git tag -v --format="tagname : %(tag)" "forged-tag" >actual &&
+       test_cmp expect actual
+'
+
 # blank and empty messages for signed tags:
 
 get_tag_header empty-signed-tag $commit commit $time >expect
@@ -1200,11 +1248,10 @@ test_expect_success GPG,RFC1991 \
 '
 
 # try to sign with bad user.signingkey
-git config user.signingkey BobTheMouse
 test_expect_success GPG \
        'git tag -s fails if gpg is misconfigured (bad key)' \
-       'test_must_fail git tag -s -m tail tag-gpg-failure'
-git config --unset user.signingkey
+       'test_config user.signingkey BobTheMouse &&
+       test_must_fail git tag -s -m tail tag-gpg-failure'
 
 # try to produce invalid signature
 test_expect_success GPG \
@@ -1484,7 +1531,7 @@ test_expect_success 'reverse lexical sort' '
 '
 
 test_expect_success 'configured lexical sort' '
-       git config tag.sort "v:refname" &&
+       test_config tag.sort "v:refname" &&
        git tag -l "foo*" >actual &&
        cat >expect <<-\EOF &&
        foo1.3
@@ -1495,6 +1542,7 @@ test_expect_success 'configured lexical sort' '
 '
 
 test_expect_success 'option override configured sort' '
+       test_config tag.sort "v:refname" &&
        git tag -l --sort=-refname "foo*" >actual &&
        cat >expect <<-\EOF &&
        foo1.6
@@ -1509,13 +1557,12 @@ test_expect_success 'invalid sort parameter on command line' '
 '
 
 test_expect_success 'invalid sort parameter in configuratoin' '
-       git config tag.sort "v:notvalid" &&
+       test_config tag.sort "v:notvalid" &&
        test_must_fail git tag -l "foo*"
 '
 
 test_expect_success 'version sort with prerelease reordering' '
-       git config --unset tag.sort &&
-       git config versionsort.prereleaseSuffix -rc &&
+       test_config versionsort.prereleaseSuffix -rc &&
        git tag foo1.6-rc1 &&
        git tag foo1.6-rc2 &&
        git tag -l --sort=version:refname "foo*" >actual &&
@@ -1530,6 +1577,7 @@ test_expect_success 'version sort with prerelease reordering' '
 '
 
 test_expect_success 'reverse version sort with prerelease reordering' '
+       test_config versionsort.prereleaseSuffix -rc &&
        git tag -l --sort=-version:refname "foo*" >actual &&
        cat >expect <<-\EOF &&
        foo1.10
@@ -1541,6 +1589,103 @@ test_expect_success 'reverse version sort with prerelease reordering' '
        test_cmp expect actual
 '
 
+test_expect_success 'version sort with prerelease reordering and common leading character' '
+       test_config versionsort.prereleaseSuffix -before &&
+       git tag foo1.7-before1 &&
+       git tag foo1.7 &&
+       git tag foo1.7-after1 &&
+       git tag -l --sort=version:refname "foo1.7*" >actual &&
+       cat >expect <<-\EOF &&
+       foo1.7-before1
+       foo1.7
+       foo1.7-after1
+       EOF
+       test_cmp expect actual
+'
+
+test_expect_success 'version sort with prerelease reordering, multiple suffixes and common leading character' '
+       test_config versionsort.prereleaseSuffix -before &&
+       git config --add versionsort.prereleaseSuffix -after &&
+       git tag -l --sort=version:refname "foo1.7*" >actual &&
+       cat >expect <<-\EOF &&
+       foo1.7-before1
+       foo1.7-after1
+       foo1.7
+       EOF
+       test_cmp expect actual
+'
+
+test_expect_success 'version sort with prerelease reordering, multiple suffixes match the same tag' '
+       test_config versionsort.prereleaseSuffix -bar &&
+       git config --add versionsort.prereleaseSuffix -foo-baz &&
+       git config --add versionsort.prereleaseSuffix -foo-bar &&
+       git tag foo1.8-foo-bar &&
+       git tag foo1.8-foo-baz &&
+       git tag foo1.8 &&
+       git tag -l --sort=version:refname "foo1.8*" >actual &&
+       cat >expect <<-\EOF &&
+       foo1.8-foo-baz
+       foo1.8-foo-bar
+       foo1.8
+       EOF
+       test_cmp expect actual
+'
+
+test_expect_success 'version sort with prerelease reordering, multiple suffixes match starting at the same position' '
+       test_config versionsort.prereleaseSuffix -pre &&
+       git config --add versionsort.prereleaseSuffix -prerelease &&
+       git tag foo1.9-pre1 &&
+       git tag foo1.9-pre2 &&
+       git tag foo1.9-prerelease1 &&
+       git tag -l --sort=version:refname "foo1.9*" >actual &&
+       cat >expect <<-\EOF &&
+       foo1.9-pre1
+       foo1.9-pre2
+       foo1.9-prerelease1
+       EOF
+       test_cmp expect actual
+'
+
+test_expect_success 'version sort with general suffix reordering' '
+       test_config versionsort.suffix -alpha &&
+       git config --add versionsort.suffix -beta &&
+       git config --add versionsort.suffix ""  &&
+       git config --add versionsort.suffix -gamma &&
+       git config --add versionsort.suffix -delta &&
+       git tag foo1.10-alpha &&
+       git tag foo1.10-beta &&
+       git tag foo1.10-gamma &&
+       git tag foo1.10-delta &&
+       git tag foo1.10-unlisted-suffix &&
+       git tag -l --sort=version:refname "foo1.10*" >actual &&
+       cat >expect <<-\EOF &&
+       foo1.10-alpha
+       foo1.10-beta
+       foo1.10
+       foo1.10-unlisted-suffix
+       foo1.10-gamma
+       foo1.10-delta
+       EOF
+       test_cmp expect actual
+'
+
+test_expect_success 'versionsort.suffix overrides versionsort.prereleaseSuffix' '
+       test_config versionsort.suffix -before &&
+       test_config versionsort.prereleaseSuffix -after &&
+       git tag -l --sort=version:refname "foo1.7*" >actual &&
+       cat >expect <<-\EOF &&
+       foo1.7-before1
+       foo1.7
+       foo1.7-after1
+       EOF
+       test_cmp expect actual
+'
+
+test_expect_success 'version sort with very long prerelease suffix' '
+       test_config versionsort.prereleaseSuffix -very-looooooooooooooooooooooooong-prerelease-suffix &&
+       git tag -l --sort=version:refname
+'
+
 run_with_limited_stack () {
        (ulimit -s 128 && "$@")
 }
@@ -1569,13 +1714,11 @@ EOF"
 
 test_expect_success '--format should list tags as per format given' '
        cat >expect <<-\EOF &&
-       refname : refs/tags/foo1.10
-       refname : refs/tags/foo1.3
-       refname : refs/tags/foo1.6
-       refname : refs/tags/foo1.6-rc1
-       refname : refs/tags/foo1.6-rc2
+       refname : refs/tags/v1.0
+       refname : refs/tags/v1.0.1
+       refname : refs/tags/v1.1.3
        EOF
-       git tag -l --format="refname : %(refname)" "foo*" >actual &&
+       git tag -l --format="refname : %(refname)" "v1*" >actual &&
        test_cmp expect actual
 '
 
index 07079a41c4f6b9f89786d7eb9187655102ed9bd0..d62ccbb98e6148fa2677bbb763c17b3321168635 100755 (executable)
@@ -125,4 +125,20 @@ test_expect_success GPG 'verify multiple tags' '
        test_cmp expect.stderr actual.stderr
 '
 
+test_expect_success 'verifying tag with --format' '
+       cat >expect <<-\EOF
+       tagname : fourth-signed
+       EOF &&
+       git verify-tag --format="tagname : %(tag)" "fourth-signed" >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'verifying a forged tag with --format fail and format accordingly' '
+       cat >expect <<-\EOF
+       tagname : 7th forged-signed
+       EOF &&
+       test_must_fail git verify-tag --format="tagname : %(tag)" $(cat forged1.tag) >actual-forged &&
+       test_cmp expect actual-forged
+'
+
 test_done
index b77cce8e4066ac7f46ba1a02eab7215a4cdeaaae..c09ce0d4c1dbd8bc49595be4e3928032fbdc3c8c 100755 (executable)
@@ -152,6 +152,20 @@ test_expect_success 'submodule add to .gitignored path with --force' '
        )
 '
 
+test_expect_success 'submodule add to reconfigure existing submodule with --force' '
+       (
+               cd addtest-ignore &&
+               git submodule add --force bogus-url submod &&
+               git submodule add -b initial "$submodurl" submod-branch &&
+               test "bogus-url" = "$(git config -f .gitmodules submodule.submod.url)" &&
+               test "bogus-url" = "$(git config submodule.submod.url)" &&
+               # Restore the url
+               git submodule add --force "$submodurl" submod
+               test "$submodurl" = "$(git config -f .gitmodules submodule.submod.url)" &&
+               test "$submodurl" = "$(git config submodule.submod.url)"
+       )
+'
+
 test_expect_success 'submodule add --branch' '
        echo "refs/heads/initial" >expect-head &&
        cat <<-\EOF >expect-heads &&
index 64f322c4cc87493ebc060ae5837495563fe61958..347857fa7c7cb12a4bc9fd6a2f5373347a02db5c 100755 (executable)
@@ -140,6 +140,23 @@ test_expect_success 'submodule update --init --recursive from subdirectory' '
        test_i18ncmp expect2 actual2
 '
 
+cat <<EOF >expect2
+Submodule 'foo/sub' ($pwd/withsubs/../rebasing) registered for path 'sub'
+EOF
+
+test_expect_success 'submodule update --init from and of subdirectory' '
+       git init withsubs &&
+       (cd withsubs &&
+        mkdir foo &&
+        git submodule add "$(pwd)/../rebasing" foo/sub &&
+        (cd foo &&
+         git submodule deinit -f sub &&
+         git submodule update --init sub 2>../../actual2
+        )
+       ) &&
+       test_i18ncmp expect2 actual2
+'
+
 apos="'";
 test_expect_success 'submodule update does not fetch already present commits' '
        (cd submodule &&
@@ -424,6 +441,16 @@ test_expect_success 'submodule update - command in .git/config catches failure -
        test_i18ncmp actual expect
 '
 
+test_expect_success 'submodule update - command run for initial population of submodule' '
+       cat <<-\ EOF >expect
+       Execution of '\''false $submodulesha1'\'' failed in submodule path '\''submodule'\''
+       EOF &&
+       rm -rf super/submodule &&
+       test_must_fail git -C super submodule update >../actual &&
+       test_cmp expect actual &&
+       git -C super submodule update --checkout
+'
+
 cat << EOF >expect
 Execution of 'false $submodulesha1' failed in submodule path '../super/submodule'
 Failed to recurse into submodule path '../super'
@@ -476,6 +503,7 @@ test_expect_success 'submodule init picks up merge' '
 '
 
 test_expect_success 'submodule update --merge  - ignores --merge  for new submodules' '
+       test_config -C super submodule.submodule.update checkout &&
        (cd super &&
         rm -rf submodule &&
         git submodule update submodule &&
@@ -488,6 +516,7 @@ test_expect_success 'submodule update --merge  - ignores --merge  for new submod
 '
 
 test_expect_success 'submodule update --rebase - ignores --rebase for new submodules' '
+       test_config -C super submodule.submodule.update checkout &&
        (cd super &&
         rm -rf submodule &&
         git submodule update submodule &&
index 1c1e289ffd982ab74ed80fb776b3ecc4d7abf2f1..e159fc5035d08eee2c1577afd2ac792ddce2934c 100755 (executable)
@@ -125,4 +125,70 @@ test_expect_success 'ignoring missing submodule alternates passes clone and subm
        )
 '
 
+test_expect_success 'preparing second superproject with a nested submodule plus partial clone' '
+       test_create_repo supersuper &&
+       (
+               cd supersuper &&
+               echo "I am super super." >file &&
+               git add file &&
+               git commit -m B-super-super-initial
+               git submodule add "file://$base_dir/super" subwithsub &&
+               git commit -m B-super-super-added &&
+               git submodule update --init --recursive &&
+               git repack -ad
+       ) &&
+       git clone supersuper supersuper2 &&
+       (
+               cd supersuper2 &&
+               git submodule update --init
+       )
+'
+
+# At this point there are three root-level positories: A, B, super and super2
+
+test_expect_success 'nested submodule alternate in works and is actually used' '
+       test_when_finished "rm -rf supersuper-clone" &&
+       git clone --recursive --reference supersuper supersuper supersuper-clone &&
+       (
+               cd supersuper-clone &&
+               # test superproject has alternates setup correctly
+               test_alternate_is_used .git/objects/info/alternates . &&
+               # immediate submodule has alternate:
+               test_alternate_is_used .git/modules/subwithsub/objects/info/alternates subwithsub &&
+               # nested submodule also has alternate:
+               test_alternate_is_used .git/modules/subwithsub/modules/sub/objects/info/alternates subwithsub/sub
+       )
+'
+
+check_that_two_of_three_alternates_are_used() {
+       test_alternate_is_used .git/objects/info/alternates . &&
+       # immediate submodule has alternate:
+       test_alternate_is_used .git/modules/subwithsub/objects/info/alternates subwithsub &&
+       # but nested submodule has no alternate:
+       test_must_fail test_alternate_is_used .git/modules/subwithsub/modules/sub/objects/info/alternates subwithsub/sub
+}
+
+
+test_expect_success 'missing nested submodule alternate fails clone and submodule update' '
+       test_when_finished "rm -rf supersuper-clone" &&
+       test_must_fail git clone --recursive --reference supersuper2 supersuper2 supersuper-clone &&
+       (
+               cd supersuper-clone &&
+               check_that_two_of_three_alternates_are_used &&
+               # update of the submodule fails
+               test_must_fail git submodule update --init --recursive
+       )
+'
+
+test_expect_success 'missing nested submodule alternate in --reference-if-able mode' '
+       test_when_finished "rm -rf supersuper-clone" &&
+       git clone --recursive --reference-if-able supersuper2 supersuper2 supersuper-clone &&
+       (
+               cd supersuper-clone &&
+               check_that_two_of_three_alternates_are_used &&
+               # update of the submodule succeeds
+               git submodule update --init --recursive
+       )
+'
+
 test_done
index 47562ce4654db9d763cdf0c6d6b91724489110ff..eea36f1dbe37859c5b45ca18bb3c8f1080ff3f9a 100755 (executable)
@@ -93,6 +93,20 @@ test_expect_success 'error message contains blob reference' '
        )
 '
 
+test_expect_success 'using different treeishs works' '
+       (
+               cd super &&
+               git tag new_tag &&
+               tree=$(git rev-parse HEAD^{tree}) &&
+               commit=$(git rev-parse HEAD^{commit}) &&
+               test-submodule-config $commit b >expect &&
+               test-submodule-config $tree b >actual.1 &&
+               test-submodule-config new_tag b >actual.2 &&
+               test_cmp expect actual.1 &&
+               test_cmp expect actual.2
+       )
+'
+
 cat >super/expect_url <<EOF
 Submodule url: 'git@somewhere.else.net:a.git' for path 'b'
 Submodule url: 'git@somewhere.else.net:submodule.git' for path 'submodule'
@@ -120,12 +134,33 @@ test_expect_success 'reading of local configuration' '
                        "" submodule \
                                >actual &&
                test_cmp expect_local_path actual &&
-               git config submodule.a.url $old_a &&
-               git config submodule.submodule.url $old_submodule &&
+               git config submodule.a.url "$old_a" &&
+               git config submodule.submodule.url "$old_submodule" &&
                git config --unset submodule.a.path c
        )
 '
 
+cat >super/expect_url <<EOF
+Submodule url: '../submodule' for path 'b'
+Submodule url: 'git@somewhere.else.net:submodule.git' for path 'submodule'
+EOF
+
+test_expect_success 'reading of local configuration for uninitialized submodules' '
+       (
+               cd super &&
+               git submodule deinit -f b &&
+               old_submodule=$(git config submodule.submodule.url) &&
+               git config submodule.submodule.url git@somewhere.else.net:submodule.git &&
+               test-submodule-config --url \
+                       "" b \
+                       "" submodule \
+                               >actual &&
+               test_cmp expect_url actual &&
+               git config submodule.submodule.url "$old_submodule" &&
+               git submodule init b
+       )
+'
+
 cat >super/expect_fetchrecurse_die.err <<EOF
 fatal: bad submodule.submodule.fetchrecursesubmodules argument: blabla
 EOF
diff --git a/t/t7412-submodule-absorbgitdirs.sh b/t/t7412-submodule-absorbgitdirs.sh
new file mode 100755 (executable)
index 0000000..e2bbb44
--- /dev/null
@@ -0,0 +1,128 @@
+#!/bin/sh
+
+test_description='Test submodule absorbgitdirs
+
+This test verifies that `git submodue absorbgitdirs` moves a submodules git
+directory into the superproject.
+'
+
+. ./test-lib.sh
+
+test_expect_success 'setup a real submodule' '
+       git init sub1 &&
+       test_commit -C sub1 first &&
+       git submodule add ./sub1 &&
+       test_tick &&
+       git commit -m superproject
+'
+
+test_expect_success 'absorb the git dir' '
+       >expect.1 &&
+       >expect.2 &&
+       >actual.1 &&
+       >actual.2 &&
+       git status >expect.1 &&
+       git -C sub1 rev-parse HEAD >expect.2 &&
+       git submodule absorbgitdirs &&
+       git fsck &&
+       test -f sub1/.git &&
+       test -d .git/modules/sub1 &&
+       git status >actual.1 &&
+       git -C sub1 rev-parse HEAD >actual.2 &&
+       test_cmp expect.1 actual.1 &&
+       test_cmp expect.2 actual.2
+'
+
+test_expect_success 'absorbing does not fail for deinitalized submodules' '
+       test_when_finished "git submodule update --init" &&
+       git submodule deinit --all &&
+       git submodule absorbgitdirs &&
+       test -d .git/modules/sub1 &&
+       test -d sub1 &&
+       ! test -e sub1/.git
+'
+
+test_expect_success 'setup nested submodule' '
+       git init sub1/nested &&
+       test_commit -C sub1/nested first_nested &&
+       git -C sub1 submodule add ./nested &&
+       test_tick &&
+       git -C sub1 commit -m "add nested" &&
+       git add sub1 &&
+       git commit -m "sub1 to include nested submodule"
+'
+
+test_expect_success 'absorb the git dir in a nested submodule' '
+       git status >expect.1 &&
+       git -C sub1/nested rev-parse HEAD >expect.2 &&
+       git submodule absorbgitdirs &&
+       test -f sub1/nested/.git &&
+       test -d .git/modules/sub1/modules/nested &&
+       git status >actual.1 &&
+       git -C sub1/nested rev-parse HEAD >actual.2 &&
+       test_cmp expect.1 actual.1 &&
+       test_cmp expect.2 actual.2
+'
+
+test_expect_success 're-setup nested submodule' '
+       # un-absorb the direct submodule, to test if the nested submodule
+       # is still correct (needs a rewrite of the gitfile only)
+       rm -rf sub1/.git &&
+       mv .git/modules/sub1 sub1/.git &&
+       GIT_WORK_TREE=. git -C sub1 config --unset core.worktree &&
+       # fixup the nested submodule
+       echo "gitdir: ../.git/modules/nested" >sub1/nested/.git &&
+       GIT_WORK_TREE=../../../nested git -C sub1/.git/modules/nested config \
+               core.worktree "../../../nested" &&
+       # make sure this re-setup is correct
+       git status --ignore-submodules=none
+'
+
+test_expect_success 'absorb the git dir in a nested submodule' '
+       git status >expect.1 &&
+       git -C sub1/nested rev-parse HEAD >expect.2 &&
+       git submodule absorbgitdirs &&
+       test -f sub1/.git &&
+       test -f sub1/nested/.git &&
+       test -d .git/modules/sub1/modules/nested &&
+       git status >actual.1 &&
+       git -C sub1/nested rev-parse HEAD >actual.2 &&
+       test_cmp expect.1 actual.1 &&
+       test_cmp expect.2 actual.2
+'
+
+test_expect_success 'setup a gitlink with missing .gitmodules entry' '
+       git init sub2 &&
+       test_commit -C sub2 first &&
+       git add sub2 &&
+       git commit -m superproject
+'
+
+test_expect_success 'absorbing the git dir fails for incomplete submodules' '
+       git status >expect.1 &&
+       git -C sub2 rev-parse HEAD >expect.2 &&
+       test_must_fail git submodule absorbgitdirs &&
+       git -C sub2 fsck &&
+       test -d sub2/.git &&
+       git status >actual &&
+       git -C sub2 rev-parse HEAD >actual.2 &&
+       test_cmp expect.1 actual.1 &&
+       test_cmp expect.2 actual.2
+'
+
+test_expect_success 'setup a submodule with multiple worktrees' '
+       # first create another unembedded git dir in a new submodule
+       git init sub3 &&
+       test_commit -C sub3 first &&
+       git submodule add ./sub3 &&
+       test_tick &&
+       git commit -m "add another submodule" &&
+       git -C sub3 worktree add ../sub3_second_work_tree
+'
+
+test_expect_success 'absorbing fails for a submodule with multiple worktrees' '
+       test_must_fail git submodule absorbgitdirs sub3 2>error &&
+       test_i18ngrep "not supported" error
+'
+
+test_done
index d84897a67a3c365e280f88b36f43fc49e1ac9d7b..0b6da7ae1fd3d15f0d47783d3af50cb17d2c66df 100755 (executable)
@@ -155,6 +155,15 @@ test_expect_success 'amend --only ignores staged contents' '
        git diff --exit-code
 '
 
+test_expect_success 'allow-empty --only ignores staged contents' '
+       echo changed-again >file &&
+       git add file &&
+       git commit --allow-empty --only -m "empty" &&
+       git cat-file blob HEAD:file >file.actual &&
+       test_cmp file.expect file.actual &&
+       git diff --exit-code
+'
+
 test_expect_success 'set up editor' '
        cat >editor <<-\EOF &&
        #!/bin/sh
@@ -460,6 +469,42 @@ $alt" &&
        test_cmp expected actual
 '
 
+test_expect_success 'signoff respects trailer config' '
+
+       echo 5 >positive &&
+       git add positive &&
+       git commit -s -m "subject
+
+non-trailer line
+Myfooter: x" &&
+       git cat-file commit HEAD | sed -e "1,/^\$/d" > actual &&
+       (
+               echo subject
+               echo
+               echo non-trailer line
+               echo Myfooter: x
+               echo
+               echo "Signed-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>"
+       ) >expected &&
+       test_cmp expected actual &&
+
+       echo 6 >positive &&
+       git add positive &&
+       git -c "trailer.Myfooter.ifexists=add" commit -s -m "subject
+
+non-trailer line
+Myfooter: x" &&
+       git cat-file commit HEAD | sed -e "1,/^\$/d" > actual &&
+       (
+               echo subject
+               echo
+               echo non-trailer line
+               echo Myfooter: x
+               echo "Signed-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>"
+       ) >expected &&
+       test_cmp expected actual
+'
+
 test_expect_success 'multiple -m' '
 
        >negative &&
index 5c3db656dfaa0171598445720b62e63f13f67f44..458608cc1e7ca51e1a7e40017794b5f2c55d3db3 100755 (executable)
@@ -944,4 +944,23 @@ EOF
        test_i18ncmp expected actual
 '
 
+test_expect_success 'status: handle not-yet-started rebase -i gracefully' '
+       ONTO=$(git rev-parse --short HEAD^) &&
+       COMMIT=$(git rev-parse --short HEAD) &&
+       EDITOR="git status --untracked-files=no >actual" git rebase -i HEAD^ &&
+       cat >expected <<EOF &&
+On branch several_commits
+No commands done.
+Next command to do (1 remaining command):
+   pick $COMMIT four_commit
+  (use "git rebase --edit-todo" to view and edit)
+You are currently editing a commit while rebasing branch '\''several_commits'\'' on '\''$ONTO'\''.
+  (use "git commit --amend" to amend the current commit)
+  (use "git rebase --continue" once you are satisfied with your changes)
+
+nothing to commit (use -u to show untracked files)
+EOF
+       test_i18ncmp expected actual
+'
+
 test_done
index 85248a14b61d68b61932d595eb0fa8fcaa8506b1..2ebda509ac337f99c7ab5651734a5b20d4a0b6f4 100755 (executable)
@@ -154,6 +154,10 @@ test_expect_success 'test option parsing' '
        test_must_fail git merge -s foobar c1 &&
        test_must_fail git merge -s=foobar c1 &&
        test_must_fail git merge -m &&
+       test_must_fail git merge --abort foobar &&
+       test_must_fail git merge --abort --quiet &&
+       test_must_fail git merge --continue foobar &&
+       test_must_fail git merge --continue --quiet &&
        test_must_fail git merge
 '
 
@@ -763,4 +767,11 @@ test_expect_success 'merge nothing into void' '
        )
 '
 
+test_expect_success 'merge can be completed with --continue' '
+       git reset --hard c0 &&
+       git merge --no-ff --no-commit c1 &&
+       git merge --continue &&
+       verify_parents $c0 $c1
+'
+
 test_done
index f80bdb81e1f12124e32d5cd2c5c0ecdcd82dc782..e90413204ee32cafc3380244a5cf013eadcd72c1 100755 (executable)
@@ -105,7 +105,7 @@ test_expect_success 'not uptodate file porcelain checkout error' '
 '
 
 cat >expect <<\EOF
-error: Updating the following directories would lose untracked files in it:
+error: Updating the following directories would lose untracked files in them:
        rep
        rep2
 
index 6d9f21511fe1062565d8d08f60c385cffd94cac6..381b7df452e44622c46c8c3471f181b4568be10a 100755 (executable)
@@ -55,6 +55,22 @@ test_expect_success 'setup' '
        git rm file12 &&
        git commit -m "branch1 changes" &&
 
+       git checkout -b delete-base branch1 &&
+       mkdir -p a/a &&
+       (echo one; echo two; echo 3; echo 4) >a/a/file.txt &&
+       git add a/a/file.txt &&
+       git commit -m"base file" &&
+       git checkout -b move-to-b delete-base &&
+       mkdir -p b/b &&
+       git mv a/a/file.txt b/b/file.txt &&
+       (echo one; echo two; echo 4) >b/b/file.txt &&
+       git commit -a -m"move to b" &&
+       git checkout -b move-to-c delete-base &&
+       mkdir -p c/c &&
+       git mv a/a/file.txt c/c/file.txt &&
+       (echo one; echo two; echo 3) >c/c/file.txt &&
+       git commit -a -m"move to c" &&
+
        git checkout -b stash1 master &&
        echo stash1 change file11 >file11 &&
        git add file11 &&
@@ -86,6 +102,23 @@ test_expect_success 'setup' '
        git rm file11 &&
        git commit -m "master updates" &&
 
+       git clean -fdx &&
+       git checkout -b order-file-start master &&
+       echo start >a &&
+       echo start >b &&
+       git add a b &&
+       git commit -m start &&
+       git checkout -b order-file-side1 order-file-start &&
+       echo side1 >a &&
+       echo side1 >b &&
+       git add a b &&
+       git commit -m side1 &&
+       git checkout -b order-file-side2 order-file-start &&
+       echo side2 >a &&
+       echo side2 >b &&
+       git add a b &&
+       git commit -m side2 &&
+
        git config merge.tool mytool &&
        git config mergetool.mytool.cmd "cat \"\$REMOTE\" >\"\$MERGED\"" &&
        git config mergetool.mytool.trustExitCode true &&
@@ -94,7 +127,8 @@ test_expect_success 'setup' '
 '
 
 test_expect_success 'custom mergetool' '
-       git checkout -b test1 branch1 &&
+       test_when_finished "git reset --hard" &&
+       git checkout -b test$test_count branch1 &&
        git submodule update -N &&
        test_must_fail git merge master >/dev/null 2>&1 &&
        ( yes "" | git mergetool both >/dev/null 2>&1 ) &&
@@ -112,8 +146,13 @@ test_expect_success 'custom mergetool' '
 '
 
 test_expect_success 'mergetool crlf' '
+       test_when_finished "git reset --hard" &&
+       # This test_config line must go after the above reset line so that
+       # core.autocrlf is unconfigured before reset runs.  (The
+       # test_config command uses test_when_finished internally and
+       # test_when_finished is LIFO.)
        test_config core.autocrlf true &&
-       git checkout -b test2 branch1 &&
+       git checkout -b test$test_count branch1 &&
        test_must_fail git merge master >/dev/null 2>&1 &&
        ( yes "" | git mergetool file1 >/dev/null 2>&1 ) &&
        ( yes "" | git mergetool file2 >/dev/null 2>&1 ) &&
@@ -128,13 +167,12 @@ test_expect_success 'mergetool crlf' '
        test "$(printf x | cat subdir/file3 -)" = "$(printf "master new sub\r\nx")" &&
        git submodule update -N &&
        test "$(cat submod/bar)" = "master submodule" &&
-       git commit -m "branch1 resolved with mergetool - autocrlf" &&
-       test_config core.autocrlf false &&
-       git reset --hard
+       git commit -m "branch1 resolved with mergetool - autocrlf"
 '
 
 test_expect_success 'mergetool in subdir' '
-       git checkout -b test3 branch1 &&
+       test_when_finished "git reset --hard" &&
+       git checkout -b test$test_count branch1 &&
        git submodule update -N &&
        (
                cd subdir &&
@@ -145,8 +183,13 @@ test_expect_success 'mergetool in subdir' '
 '
 
 test_expect_success 'mergetool on file in parent dir' '
+       test_when_finished "git reset --hard" &&
+       git checkout -b test$test_count branch1 &&
+       git submodule update -N &&
        (
                cd subdir &&
+               test_must_fail git merge master >/dev/null 2>&1 &&
+               ( yes "" | git mergetool file3 >/dev/null 2>&1 ) &&
                ( yes "" | git mergetool ../file1 >/dev/null 2>&1 ) &&
                ( yes "" | git mergetool ../file2 ../spaced\ name >/dev/null 2>&1 ) &&
                ( yes "" | git mergetool ../both >/dev/null 2>&1 ) &&
@@ -161,7 +204,8 @@ test_expect_success 'mergetool on file in parent dir' '
 '
 
 test_expect_success 'mergetool skips autoresolved' '
-       git checkout -b test4 branch1 &&
+       test_when_finished "git reset --hard" &&
+       git checkout -b test$test_count branch1 &&
        git submodule update -N &&
        test_must_fail git merge master &&
        test -n "$(git ls-files -u)" &&
@@ -169,11 +213,12 @@ test_expect_success 'mergetool skips autoresolved' '
        ( yes "d" | git mergetool file12 >/dev/null 2>&1 ) &&
        ( yes "l" | git mergetool submod >/dev/null 2>&1 ) &&
        output="$(git mergetool --no-prompt)" &&
-       test "$output" = "No files need merging" &&
-       git reset --hard
+       test "$output" = "No files need merging"
 '
 
-test_expect_success 'mergetool merges all from subdir' '
+test_expect_success 'mergetool merges all from subdir (rerere disabled)' '
+       test_when_finished "git reset --hard" &&
+       git checkout -b test$test_count branch1 &&
        test_config rerere.enabled false &&
        (
                cd subdir &&
@@ -189,21 +234,41 @@ test_expect_success 'mergetool merges all from subdir' '
        )
 '
 
+test_expect_success 'mergetool merges all from subdir (rerere enabled)' '
+       test_when_finished "git reset --hard" &&
+       git checkout -b test$test_count branch1 &&
+       test_config rerere.enabled true &&
+       rm -rf .git/rr-cache &&
+       (
+               cd subdir &&
+               test_must_fail git merge master &&
+               ( yes "r" | git mergetool ../submod ) &&
+               ( yes "d" "d" | git mergetool --no-prompt ) &&
+               test "$(cat ../file1)" = "master updated" &&
+               test "$(cat ../file2)" = "master new" &&
+               test "$(cat file3)" = "master new sub" &&
+               ( cd .. && git submodule update -N ) &&
+               test "$(cat ../submod/bar)" = "master submodule" &&
+               git commit -m "branch2 resolved by mergetool from subdir"
+       )
+'
+
 test_expect_success 'mergetool skips resolved paths when rerere is active' '
+       test_when_finished "git reset --hard" &&
        test_config rerere.enabled true &&
        rm -rf .git/rr-cache &&
-       git checkout -b test5 branch1 &&
+       git checkout -b test$test_count branch1 &&
        git submodule update -N &&
        test_must_fail git merge master >/dev/null 2>&1 &&
        ( yes "l" | git mergetool --no-prompt submod >/dev/null 2>&1 ) &&
        ( yes "d" "d" | git mergetool --no-prompt >/dev/null 2>&1 ) &&
        git submodule update -N &&
        output="$(yes "n" | git mergetool --no-prompt)" &&
-       test "$output" = "No files need merging" &&
-       git reset --hard
+       test "$output" = "No files need merging"
 '
 
 test_expect_success 'conflicted stash sets up rerere'  '
+       test_when_finished "git reset --hard" &&
        test_config rerere.enabled true &&
        git checkout stash1 &&
        echo "Conflicting stash content" >file11 &&
@@ -231,67 +296,57 @@ test_expect_success 'conflicted stash sets up rerere'  '
 '
 
 test_expect_success 'mergetool takes partial path' '
-       git reset --hard &&
+       test_when_finished "git reset --hard" &&
        test_config rerere.enabled false &&
-       git checkout -b test12 branch1 &&
+       git checkout -b test$test_count branch1 &&
        git submodule update -N &&
        test_must_fail git merge master &&
 
        ( yes "" | git mergetool subdir ) &&
 
-       test "$(cat subdir/file3)" = "master new sub" &&
-       git reset --hard
+       test "$(cat subdir/file3)" = "master new sub"
 '
 
 test_expect_success 'mergetool delete/delete conflict' '
-       git checkout -b delete-base branch1 &&
-       mkdir -p a/a &&
-       (echo one; echo two; echo 3; echo 4) >a/a/file.txt &&
-       git add a/a/file.txt &&
-       git commit -m"base file" &&
-       git checkout -b move-to-b delete-base &&
-       mkdir -p b/b &&
-       git mv a/a/file.txt b/b/file.txt &&
-       (echo one; echo two; echo 4) >b/b/file.txt &&
-       git commit -a -m"move to b" &&
-       git checkout -b move-to-c delete-base &&
-       mkdir -p c/c &&
-       git mv a/a/file.txt c/c/file.txt &&
-       (echo one; echo two; echo 3) >c/c/file.txt &&
-       git commit -a -m"move to c" &&
+       test_when_finished "git reset --hard" &&
+       git checkout -b test$test_count move-to-c &&
        test_must_fail git merge move-to-b &&
        echo d | git mergetool a/a/file.txt &&
        ! test -f a/a/file.txt &&
-       git reset --hard HEAD &&
+       git reset --hard &&
        test_must_fail git merge move-to-b &&
        echo m | git mergetool a/a/file.txt &&
        test -f b/b/file.txt &&
-       git reset --hard HEAD &&
+       git reset --hard &&
        test_must_fail git merge move-to-b &&
        ! echo a | git mergetool a/a/file.txt &&
-       ! test -f a/a/file.txt &&
-       git reset --hard HEAD
+       ! test -f a/a/file.txt
 '
 
 test_expect_success 'mergetool produces no errors when keepBackup is used' '
+       test_when_finished "git reset --hard" &&
+       git checkout -b test$test_count move-to-c &&
        test_config mergetool.keepBackup true &&
        test_must_fail git merge move-to-b &&
        : >expect &&
        echo d | git mergetool a/a/file.txt 2>actual &&
        test_cmp expect actual &&
-       ! test -d a &&
-       git reset --hard HEAD
+       ! test -d a
 '
 
 test_expect_success 'mergetool honors tempfile config for deleted files' '
+       test_when_finished "git reset --hard" &&
+       git checkout -b test$test_count move-to-c &&
        test_config mergetool.keepTemporaries false &&
        test_must_fail git merge move-to-b &&
        echo d | git mergetool a/a/file.txt &&
-       ! test -d a &&
-       git reset --hard HEAD
+       ! test -d a
 '
 
 test_expect_success 'mergetool keeps tempfiles when aborting delete/delete' '
+       test_when_finished "git reset --hard" &&
+       test_when_finished "git clean -fdx" &&
+       git checkout -b test$test_count move-to-c &&
        test_config mergetool.keepTemporaries true &&
        test_must_fail git merge move-to-b &&
        ! (echo a; echo n) | git mergetool a/a/file.txt &&
@@ -302,18 +357,17 @@ test_expect_success 'mergetool keeps tempfiles when aborting delete/delete' '
        file_REMOTE_.txt
        EOF
        ls -1 a/a | sed -e "s/[0-9]*//g" >actual &&
-       test_cmp expect actual &&
-       git clean -fdx &&
-       git reset --hard HEAD
+       test_cmp expect actual
 '
 
 test_expect_success 'deleted vs modified submodule' '
-       git checkout -b test6 branch1 &&
+       test_when_finished "git reset --hard" &&
+       git checkout -b test$test_count branch1 &&
        git submodule update -N &&
        mv submod submod-movedaside &&
        git rm --cached submod &&
        git commit -m "Submodule deleted from branch" &&
-       git checkout -b test6.a test6 &&
+       git checkout -b test$test_count.a test$test_count &&
        test_must_fail git merge master &&
        test -n "$(git ls-files -u)" &&
        ( yes "" | git mergetool file1 file2 spaced\ name subdir/file3 >/dev/null 2>&1 ) &&
@@ -329,7 +383,7 @@ test_expect_success 'deleted vs modified submodule' '
        git commit -m "Merge resolved by keeping module" &&
 
        mv submod submod-movedaside &&
-       git checkout -b test6.b test6 &&
+       git checkout -b test$test_count.b test$test_count &&
        git submodule update -N &&
        test_must_fail git merge master &&
        test -n "$(git ls-files -u)" &&
@@ -343,9 +397,9 @@ test_expect_success 'deleted vs modified submodule' '
        git commit -m "Merge resolved by deleting module" &&
 
        mv submod-movedaside submod &&
-       git checkout -b test6.c master &&
+       git checkout -b test$test_count.c master &&
        git submodule update -N &&
-       test_must_fail git merge test6 &&
+       test_must_fail git merge test$test_count &&
        test -n "$(git ls-files -u)" &&
        ( yes "" | git mergetool file1 file2 spaced\ name subdir/file3 >/dev/null 2>&1 ) &&
        ( yes "" | git mergetool both >/dev/null 2>&1 ) &&
@@ -359,9 +413,9 @@ test_expect_success 'deleted vs modified submodule' '
        git commit -m "Merge resolved by deleting module" &&
        mv submod.orig submod &&
 
-       git checkout -b test6.d master &&
+       git checkout -b test$test_count.d master &&
        git submodule update -N &&
-       test_must_fail git merge test6 &&
+       test_must_fail git merge test$test_count &&
        test -n "$(git ls-files -u)" &&
        ( yes "" | git mergetool file1 file2 spaced\ name subdir/file3 >/dev/null 2>&1 ) &&
        ( yes "" | git mergetool both >/dev/null 2>&1 ) &&
@@ -372,19 +426,19 @@ test_expect_success 'deleted vs modified submodule' '
        test "$(cat submod/bar)" = "master submodule" &&
        output="$(git mergetool --no-prompt)" &&
        test "$output" = "No files need merging" &&
-       git commit -m "Merge resolved by keeping module" &&
-       git reset --hard HEAD
+       git commit -m "Merge resolved by keeping module"
 '
 
 test_expect_success 'file vs modified submodule' '
-       git checkout -b test7 branch1 &&
+       test_when_finished "git reset --hard" &&
+       git checkout -b test$test_count branch1 &&
        git submodule update -N &&
        mv submod submod-movedaside &&
        git rm --cached submod &&
        echo not a submodule >submod &&
        git add submod &&
        git commit -m "Submodule path becomes file" &&
-       git checkout -b test7.a branch1 &&
+       git checkout -b test$test_count.a branch1 &&
        test_must_fail git merge master &&
        test -n "$(git ls-files -u)" &&
        ( yes "" | git mergetool file1 file2 spaced\ name subdir/file3 >/dev/null 2>&1 ) &&
@@ -400,7 +454,7 @@ test_expect_success 'file vs modified submodule' '
        git commit -m "Merge resolved by keeping module" &&
 
        mv submod submod-movedaside &&
-       git checkout -b test7.b test7 &&
+       git checkout -b test$test_count.b test$test_count &&
        test_must_fail git merge master &&
        test -n "$(git ls-files -u)" &&
        ( yes "" | git mergetool file1 file2 spaced\ name subdir/file3 >/dev/null 2>&1 ) &&
@@ -413,11 +467,11 @@ test_expect_success 'file vs modified submodule' '
        test "$output" = "No files need merging" &&
        git commit -m "Merge resolved by keeping file" &&
 
-       git checkout -b test7.c master &&
+       git checkout -b test$test_count.c master &&
        rmdir submod && mv submod-movedaside submod &&
        test ! -e submod.orig &&
        git submodule update -N &&
-       test_must_fail git merge test7 &&
+       test_must_fail git merge test$test_count &&
        test -n "$(git ls-files -u)" &&
        ( yes "" | git mergetool file1 file2 spaced\ name subdir/file3 >/dev/null 2>&1 ) &&
        ( yes "" | git mergetool both >/dev/null 2>&1 ) &&
@@ -430,10 +484,10 @@ test_expect_success 'file vs modified submodule' '
        test "$output" = "No files need merging" &&
        git commit -m "Merge resolved by keeping file" &&
 
-       git checkout -b test7.d master &&
+       git checkout -b test$test_count.d master &&
        rmdir submod && mv submod.orig submod &&
        git submodule update -N &&
-       test_must_fail git merge test7 &&
+       test_must_fail git merge test$test_count &&
        test -n "$(git ls-files -u)" &&
        ( yes "" | git mergetool file1 file2 spaced\ name subdir/file3 >/dev/null 2>&1 ) &&
        ( yes "" | git mergetool both>/dev/null 2>&1 ) &&
@@ -448,7 +502,8 @@ test_expect_success 'file vs modified submodule' '
 '
 
 test_expect_success 'submodule in subdirectory' '
-       git checkout -b test10 branch1 &&
+       test_when_finished "git reset --hard" &&
+       git checkout -b test$test_count branch1 &&
        git submodule update -N &&
        (
                cd subdir &&
@@ -460,56 +515,57 @@ test_expect_success 'submodule in subdirectory' '
                git commit -m "add initial versions"
                )
        ) &&
+       test_when_finished "rm -rf subdir/subdir_module" &&
        git submodule add git://example.com/subsubmodule subdir/subdir_module &&
        git add subdir/subdir_module &&
        git commit -m "add submodule in subdirectory" &&
 
-       git checkout -b test10.a test10 &&
+       git checkout -b test$test_count.a test$test_count &&
        git submodule update -N &&
        (
        cd subdir/subdir_module &&
                git checkout -b super10.a &&
-               echo test10.a >file15 &&
+               echo test$test_count.a >file15 &&
                git add file15 &&
                git commit -m "on branch 10.a"
        ) &&
        git add subdir/subdir_module &&
-       git commit -m "change submodule in subdirectory on test10.a" &&
+       git commit -m "change submodule in subdirectory on test$test_count.a" &&
 
-       git checkout -b test10.b test10 &&
+       git checkout -b test$test_count.b test$test_count &&
        git submodule update -N &&
        (
                cd subdir/subdir_module &&
                git checkout -b super10.b &&
-               echo test10.b >file15 &&
+               echo test$test_count.b >file15 &&
                git add file15 &&
                git commit -m "on branch 10.b"
        ) &&
        git add subdir/subdir_module &&
-       git commit -m "change submodule in subdirectory on test10.b" &&
+       git commit -m "change submodule in subdirectory on test$test_count.b" &&
 
-       test_must_fail git merge test10.a >/dev/null 2>&1 &&
+       test_must_fail git merge test$test_count.a >/dev/null 2>&1 &&
        (
                cd subdir &&
                ( yes "l" | git mergetool subdir_module )
        ) &&
-       test "$(cat subdir/subdir_module/file15)" = "test10.b" &&
+       test "$(cat subdir/subdir_module/file15)" = "test$test_count.b" &&
        git submodule update -N &&
-       test "$(cat subdir/subdir_module/file15)" = "test10.b" &&
+       test "$(cat subdir/subdir_module/file15)" = "test$test_count.b" &&
        git reset --hard &&
        git submodule update -N &&
 
-       test_must_fail git merge test10.a >/dev/null 2>&1 &&
+       test_must_fail git merge test$test_count.a >/dev/null 2>&1 &&
        ( yes "r" | git mergetool subdir/subdir_module ) &&
-       test "$(cat subdir/subdir_module/file15)" = "test10.b" &&
+       test "$(cat subdir/subdir_module/file15)" = "test$test_count.b" &&
        git submodule update -N &&
-       test "$(cat subdir/subdir_module/file15)" = "test10.a" &&
-       git commit -m "branch1 resolved with mergetool" &&
-       rm -rf subdir/subdir_module
+       test "$(cat subdir/subdir_module/file15)" = "test$test_count.a" &&
+       git commit -m "branch1 resolved with mergetool"
 '
 
 test_expect_success 'directory vs modified submodule' '
-       git checkout -b test11 branch1 &&
+       test_when_finished "git reset --hard" &&
+       git checkout -b test$test_count branch1 &&
        mv submod submod-movedaside &&
        git rm --cached submod &&
        mkdir submod &&
@@ -523,7 +579,7 @@ test_expect_success 'directory vs modified submodule' '
        test "$(cat submod/file16)" = "not a submodule" &&
        rm -rf submod.orig &&
 
-       git reset --hard >/dev/null 2>&1 &&
+       git reset --hard &&
        test_must_fail git merge master &&
        test -n "$(git ls-files -u)" &&
        test ! -e submod.orig &&
@@ -535,113 +591,110 @@ test_expect_success 'directory vs modified submodule' '
        ( cd submod && git clean -f && git reset --hard ) &&
        git submodule update -N &&
        test "$(cat submod/bar)" = "master submodule" &&
-       git reset --hard >/dev/null 2>&1 && rm -rf submod-movedaside &&
+       git reset --hard &&
+       rm -rf submod-movedaside &&
 
-       git checkout -b test11.c master &&
+       git checkout -b test$test_count.c master &&
        git submodule update -N &&
-       test_must_fail git merge test11 &&
+       test_must_fail git merge test$test_count &&
        test -n "$(git ls-files -u)" &&
        ( yes "l" | git mergetool submod ) &&
        git submodule update -N &&
        test "$(cat submod/bar)" = "master submodule" &&
 
-       git reset --hard >/dev/null 2>&1 &&
+       git reset --hard &&
        git submodule update -N &&
-       test_must_fail git merge test11 &&
+       test_must_fail git merge test$test_count &&
        test -n "$(git ls-files -u)" &&
        test ! -e submod.orig &&
        ( yes "r" | git mergetool submod ) &&
        test "$(cat submod/file16)" = "not a submodule" &&
 
-       git reset --hard master >/dev/null 2>&1 &&
+       git reset --hard master &&
        ( cd submod && git clean -f && git reset --hard ) &&
        git submodule update -N
 '
 
 test_expect_success 'file with no base' '
-       git checkout -b test13 branch1 &&
+       test_when_finished "git reset --hard" &&
+       git checkout -b test$test_count branch1 &&
        test_must_fail git merge master &&
        git mergetool --no-prompt --tool mybase -- both &&
        >expected &&
-       test_cmp both expected &&
-       git reset --hard master >/dev/null 2>&1
+       test_cmp both expected
 '
 
 test_expect_success 'custom commands override built-ins' '
-       git checkout -b test14 branch1 &&
+       test_when_finished "git reset --hard" &&
+       git checkout -b test$test_count branch1 &&
        test_config mergetool.defaults.cmd "cat \"\$REMOTE\" >\"\$MERGED\"" &&
        test_config mergetool.defaults.trustExitCode true &&
        test_must_fail git merge master &&
        git mergetool --no-prompt --tool defaults -- both &&
        echo master both added >expected &&
-       test_cmp both expected &&
-       git reset --hard master >/dev/null 2>&1
+       test_cmp both expected
 '
 
 test_expect_success 'filenames seen by tools start with ./' '
-       git checkout -b test15 branch1 &&
+       test_when_finished "git reset --hard" &&
+       git checkout -b test$test_count branch1 &&
        test_config mergetool.writeToTemp false &&
        test_config mergetool.myecho.cmd "echo \"\$LOCAL\"" &&
        test_config mergetool.myecho.trustExitCode true &&
        test_must_fail git merge master &&
        git mergetool --no-prompt --tool myecho -- both >actual &&
-       grep ^\./both_LOCAL_ actual >/dev/null &&
-       git reset --hard master >/dev/null 2>&1
+       grep ^\./both_LOCAL_ actual >/dev/null
 '
 
 test_lazy_prereq MKTEMP '
        tempdir=$(mktemp -d -t foo.XXXXXX) &&
-       test -d "$tempdir"
+       test -d "$tempdir" &&
+       rmdir "$tempdir"
 '
 
 test_expect_success MKTEMP 'temporary filenames are used with mergetool.writeToTemp' '
-       git checkout -b test16 branch1 &&
+       test_when_finished "git reset --hard" &&
+       git checkout -b test$test_count branch1 &&
        test_config mergetool.writeToTemp true &&
        test_config mergetool.myecho.cmd "echo \"\$LOCAL\"" &&
        test_config mergetool.myecho.trustExitCode true &&
        test_must_fail git merge master &&
        git mergetool --no-prompt --tool myecho -- both >actual &&
-       test_must_fail grep ^\./both_LOCAL_ actual >/dev/null &&
-       grep /both_LOCAL_ actual >/dev/null &&
-       git reset --hard master >/dev/null 2>&1
+       ! grep ^\./both_LOCAL_ actual >/dev/null &&
+       grep /both_LOCAL_ actual >/dev/null
 '
 
 test_expect_success 'diff.orderFile configuration is honored' '
+       test_when_finished "git reset --hard" &&
+       git checkout -b test$test_count order-file-side2 &&
        test_config diff.orderFile order-file &&
        test_config mergetool.myecho.cmd "echo \"\$LOCAL\"" &&
        test_config mergetool.myecho.trustExitCode true &&
        echo b >order-file &&
        echo a >>order-file &&
-       git checkout -b order-file-start master &&
-       echo start >a &&
-       echo start >b &&
-       git add a b &&
-       git commit -m start &&
-       git checkout -b order-file-side1 order-file-start &&
-       echo side1 >a &&
-       echo side1 >b &&
-       git add a b &&
-       git commit -m side1 &&
-       git checkout -b order-file-side2 order-file-start &&
-       echo side2 >a &&
-       echo side2 >b &&
-       git add a b &&
-       git commit -m side2 &&
        test_must_fail git merge order-file-side1 &&
        cat >expect <<-\EOF &&
                Merging:
                b
                a
        EOF
+
+       # make sure "order-file" that is ambiguous between
+       # rev and path is understood correctly.
+       git branch order-file HEAD &&
+
        git mergetool --no-prompt --tool myecho >output &&
        git grep --no-index -h -A2 Merging: output >actual &&
-       test_cmp expect actual &&
-       git reset --hard >/dev/null
+       test_cmp expect actual
 '
 test_expect_success 'mergetool -Oorder-file is honored' '
+       test_when_finished "git reset --hard" &&
+       git checkout -b test$test_count order-file-side2 &&
        test_config diff.orderFile order-file &&
        test_config mergetool.myecho.cmd "echo \"\$LOCAL\"" &&
        test_config mergetool.myecho.trustExitCode true &&
+       echo b >order-file &&
+       echo a >>order-file &&
        test_must_fail git merge order-file-side1 &&
        cat >expect <<-\EOF &&
                Merging:
@@ -651,7 +704,7 @@ test_expect_success 'mergetool -Oorder-file is honored' '
        git mergetool -O/dev/null --no-prompt --tool myecho >output &&
        git grep --no-index -h -A2 Merging: output >actual &&
        test_cmp expect actual &&
-       git reset --hard >/dev/null 2>&1 &&
+       git reset --hard &&
 
        git config --unset diff.orderFile &&
        test_must_fail git merge order-file-side1 &&
@@ -662,8 +715,7 @@ test_expect_success 'mergetool -Oorder-file is honored' '
        EOF
        git mergetool -Oorder-file --no-prompt --tool myecho >output &&
        git grep --no-index -h -A2 Merging: output >actual &&
-       test_cmp expect actual &&
-       git reset --hard >/dev/null 2>&1
+       test_cmp expect actual
 '
 
 test_done
index de2405ccba29016d2b83e16482bcfcbe70429e46..19f0108f8a2c67c518a92d996be7a335dbb69af2 100755 (executable)
@@ -39,6 +39,10 @@ test_expect_success setup '
                echo "a+bc"
                echo "abc"
        } >ab &&
+       {
+               echo d &&
+               echo 0
+       } >d0 &&
        echo vvv >v &&
        echo ww w >w &&
        echo x x xx x >x &&
@@ -1105,36 +1109,36 @@ test_expect_success 'grep pattern with grep.patternType=fixed, =basic, =extended
 '
 
 test_expect_success 'grep -G -F -P -E pattern' '
-       >empty &&
-       test_must_fail git grep -G -F -P -E "a\x{2b}b\x{2a}c" ab >actual &&
-       test_cmp empty actual
+       echo "d0:d" >expected &&
+       git grep -G -F -P -E "[\d]" d0 >actual &&
+       test_cmp expected actual
 '
 
 test_expect_success 'grep pattern with grep.patternType=fixed, =basic, =perl, =extended' '
-       >empty &&
-       test_must_fail git \
+       echo "d0:d" >expected &&
+       git \
                -c grep.patterntype=fixed \
                -c grep.patterntype=basic \
                -c grep.patterntype=perl \
                -c grep.patterntype=extended \
-               grep "a\x{2b}b\x{2a}c" ab >actual &&
-       test_cmp empty actual
+               grep "[\d]" d0 >actual &&
+       test_cmp expected actual
 '
 
 test_expect_success LIBPCRE 'grep -G -F -E -P pattern' '
-       echo "ab:a+b*c" >expected &&
-       git grep -G -F -E -P "a\x{2b}b\x{2a}c" ab >actual &&
+       echo "d0:0" >expected &&
+       git grep -G -F -E -P "[\d]" d0 >actual &&
        test_cmp expected actual
 '
 
 test_expect_success LIBPCRE 'grep pattern with grep.patternType=fixed, =basic, =extended, =perl' '
-       echo "ab:a+b*c" >expected &&
+       echo "d0:0" >expected &&
        git \
                -c grep.patterntype=fixed \
                -c grep.patterntype=basic \
                -c grep.patterntype=extended \
                -c grep.patterntype=perl \
-               grep "a\x{2b}b\x{2a}c" ab >actual &&
+               grep "[\d]" d0 >actual &&
        test_cmp expected actual
 '
 
diff --git a/t/t7814-grep-recurse-submodules.sh b/t/t7814-grep-recurse-submodules.sh
new file mode 100755 (executable)
index 0000000..67247a0
--- /dev/null
@@ -0,0 +1,241 @@
+#!/bin/sh
+
+test_description='Test grep recurse-submodules feature
+
+This test verifies the recurse-submodules feature correctly greps across
+submodules.
+'
+
+. ./test-lib.sh
+
+test_expect_success 'setup directory structure and submodule' '
+       echo "foobar" >a &&
+       mkdir b &&
+       echo "bar" >b/b &&
+       git add a b &&
+       git commit -m "add a and b" &&
+       git init submodule &&
+       echo "foobar" >submodule/a &&
+       git -C submodule add a &&
+       git -C submodule commit -m "add a" &&
+       git submodule add ./submodule &&
+       git commit -m "added submodule"
+'
+
+test_expect_success 'grep correctly finds patterns in a submodule' '
+       cat >expect <<-\EOF &&
+       a:foobar
+       b/b:bar
+       submodule/a:foobar
+       EOF
+
+       git grep -e "bar" --recurse-submodules >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'grep and basic pathspecs' '
+       cat >expect <<-\EOF &&
+       submodule/a:foobar
+       EOF
+
+       git grep -e. --recurse-submodules -- submodule >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'grep and nested submodules' '
+       git init submodule/sub &&
+       echo "foobar" >submodule/sub/a &&
+       git -C submodule/sub add a &&
+       git -C submodule/sub commit -m "add a" &&
+       git -C submodule submodule add ./sub &&
+       git -C submodule add sub &&
+       git -C submodule commit -m "added sub" &&
+       git add submodule &&
+       git commit -m "updated submodule" &&
+
+       cat >expect <<-\EOF &&
+       a:foobar
+       b/b:bar
+       submodule/a:foobar
+       submodule/sub/a:foobar
+       EOF
+
+       git grep -e "bar" --recurse-submodules >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'grep and multiple patterns' '
+       cat >expect <<-\EOF &&
+       a:foobar
+       submodule/a:foobar
+       submodule/sub/a:foobar
+       EOF
+
+       git grep -e "bar" --and -e "foo" --recurse-submodules >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'grep and multiple patterns' '
+       cat >expect <<-\EOF &&
+       b/b:bar
+       EOF
+
+       git grep -e "bar" --and --not -e "foo" --recurse-submodules >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'basic grep tree' '
+       cat >expect <<-\EOF &&
+       HEAD:a:foobar
+       HEAD:b/b:bar
+       HEAD:submodule/a:foobar
+       HEAD:submodule/sub/a:foobar
+       EOF
+
+       git grep -e "bar" --recurse-submodules HEAD >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'grep tree HEAD^' '
+       cat >expect <<-\EOF &&
+       HEAD^:a:foobar
+       HEAD^:b/b:bar
+       HEAD^:submodule/a:foobar
+       EOF
+
+       git grep -e "bar" --recurse-submodules HEAD^ >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'grep tree HEAD^^' '
+       cat >expect <<-\EOF &&
+       HEAD^^:a:foobar
+       HEAD^^:b/b:bar
+       EOF
+
+       git grep -e "bar" --recurse-submodules HEAD^^ >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'grep tree and pathspecs' '
+       cat >expect <<-\EOF &&
+       HEAD:submodule/a:foobar
+       HEAD:submodule/sub/a:foobar
+       EOF
+
+       git grep -e "bar" --recurse-submodules HEAD -- submodule >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'grep tree and pathspecs' '
+       cat >expect <<-\EOF &&
+       HEAD:submodule/a:foobar
+       HEAD:submodule/sub/a:foobar
+       EOF
+
+       git grep -e "bar" --recurse-submodules HEAD -- "submodule*a" >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'grep tree and more pathspecs' '
+       cat >expect <<-\EOF &&
+       HEAD:submodule/a:foobar
+       EOF
+
+       git grep -e "bar" --recurse-submodules HEAD -- "submodul?/a" >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'grep tree and more pathspecs' '
+       cat >expect <<-\EOF &&
+       HEAD:submodule/sub/a:foobar
+       EOF
+
+       git grep -e "bar" --recurse-submodules HEAD -- "submodul*/sub/a" >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success !MINGW 'grep recurse submodule colon in name' '
+       git init parent &&
+       test_when_finished "rm -rf parent" &&
+       echo "foobar" >"parent/fi:le" &&
+       git -C parent add "fi:le" &&
+       git -C parent commit -m "add fi:le" &&
+
+       git init "su:b" &&
+       test_when_finished "rm -rf su:b" &&
+       echo "foobar" >"su:b/fi:le" &&
+       git -C "su:b" add "fi:le" &&
+       git -C "su:b" commit -m "add fi:le" &&
+
+       git -C parent submodule add "../su:b" "su:b" &&
+       git -C parent commit -m "add submodule" &&
+
+       cat >expect <<-\EOF &&
+       fi:le:foobar
+       su:b/fi:le:foobar
+       EOF
+       git -C parent grep -e "foobar" --recurse-submodules >actual &&
+       test_cmp expect actual &&
+
+       cat >expect <<-\EOF &&
+       HEAD:fi:le:foobar
+       HEAD:su:b/fi:le:foobar
+       EOF
+       git -C parent grep -e "foobar" --recurse-submodules HEAD >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'grep history with moved submoules' '
+       git init parent &&
+       test_when_finished "rm -rf parent" &&
+       echo "foobar" >parent/file &&
+       git -C parent add file &&
+       git -C parent commit -m "add file" &&
+
+       git init sub &&
+       test_when_finished "rm -rf sub" &&
+       echo "foobar" >sub/file &&
+       git -C sub add file &&
+       git -C sub commit -m "add file" &&
+
+       git -C parent submodule add ../sub dir/sub &&
+       git -C parent commit -m "add submodule" &&
+
+       cat >expect <<-\EOF &&
+       dir/sub/file:foobar
+       file:foobar
+       EOF
+       git -C parent grep -e "foobar" --recurse-submodules >actual &&
+       test_cmp expect actual &&
+
+       git -C parent mv dir/sub sub-moved &&
+       git -C parent commit -m "moved submodule" &&
+
+       cat >expect <<-\EOF &&
+       file:foobar
+       sub-moved/file:foobar
+       EOF
+       git -C parent grep -e "foobar" --recurse-submodules >actual &&
+       test_cmp expect actual &&
+
+       cat >expect <<-\EOF &&
+       HEAD^:dir/sub/file:foobar
+       HEAD^:file:foobar
+       EOF
+       git -C parent grep -e "foobar" --recurse-submodules HEAD^ >actual &&
+       test_cmp expect actual
+'
+
+test_incompatible_with_recurse_submodules ()
+{
+       test_expect_success "--recurse-submodules and $1 are incompatible" "
+               test_must_fail git grep -e. --recurse-submodules $1 2>actual &&
+               test_i18ngrep 'not supported with --recurse-submodules' actual
+       "
+}
+
+test_incompatible_with_recurse_submodules --untracked
+test_incompatible_with_recurse_submodules --no-index
+
+test_done
index ab79de95441f4f474525b48b14313f1d04172fce..380e1c1054de5d55a80cb558fea0791884ad7f38 100755 (executable)
@@ -86,4 +86,36 @@ test_expect_success 'blame with showEmail config true' '
        test_cmp expected_n result
 '
 
+test_expect_success 'set up abbrev tests' '
+       test_commit abbrev &&
+       sha1=$(git rev-parse --verify HEAD) &&
+       check_abbrev () {
+               expect=$1; shift
+               echo $sha1 | cut -c 1-$expect >expect &&
+               git blame "$@" abbrev.t >actual &&
+               perl -lne "/[0-9a-f]+/ and print \$&" <actual >actual.sha &&
+               test_cmp expect actual.sha
+       }
+'
+
+test_expect_success 'blame --abbrev=<n> works' '
+       # non-boundary commits get +1 for alignment
+       check_abbrev 31 --abbrev=30 HEAD &&
+       check_abbrev 30 --abbrev=30 ^HEAD
+'
+
+test_expect_success 'blame -l aligns regular and boundary commits' '
+       check_abbrev 40 -l HEAD &&
+       check_abbrev 39 -l ^HEAD
+'
+
+test_expect_success 'blame --abbrev=40 behaves like -l' '
+       check_abbrev 40 --abbrev=40 HEAD &&
+       check_abbrev 39 --abbrev=40 ^HEAD
+'
+
+test_expect_success '--no-abbrev works like --abbrev=40' '
+       check_abbrev 40 --no-abbrev
+'
+
 test_done
diff --git a/t/t8011-blame-split-file.sh b/t/t8011-blame-split-file.sh
new file mode 100755 (executable)
index 0000000..8311250
--- /dev/null
@@ -0,0 +1,117 @@
+#!/bin/sh
+
+test_description='
+The general idea is that we have a single file whose lines come from
+multiple other files, and those individual files were modified in the same
+commits. That means that we will see the same commit in multiple contexts,
+and each one should be attributed to the correct file.
+
+Note that we need to use "blame -C" to find the commit for all lines. We will
+not bother testing that the non-C case fails to find it. That is how blame
+behaves now, but it is not a property we want to make sure is retained.
+'
+. ./test-lib.sh
+
+# help avoid typing and reading long strings of similar lines
+# in the tests below
+generate_expect () {
+       while read nr data
+       do
+               i=0
+               while test $i -lt $nr
+               do
+                       echo $data
+                       i=$((i + 1))
+               done
+       done
+}
+
+test_expect_success 'setup split file case' '
+       # use lines long enough to trigger content detection
+       test_seq 1000 1010 >one &&
+       test_seq 2000 2010 >two &&
+       git add one two &&
+       test_commit base &&
+
+       sed "6s/^/modified /" <one >one.tmp &&
+       mv one.tmp one &&
+       sed "6s/^/modified /" <two >two.tmp &&
+       mv two.tmp two &&
+       git add -u &&
+       test_commit modified &&
+
+       cat one two >combined &&
+       git add combined &&
+       git rm one two &&
+       test_commit combined
+'
+
+test_expect_success 'setup simulated porcelain' '
+       # This just reads porcelain-ish output and tries
+       # to output the value of a given field for each line (either by
+       # reading the field that accompanies this line, or referencing
+       # the information found last time the commit was mentioned).
+       cat >read-porcelain.pl <<-\EOF
+       my $field = shift;
+       while (<>) {
+               if (/^[0-9a-f]{40} /) {
+                       flush();
+                       $hash = $&;
+               } elsif (/^$field (.*)/) {
+                       $cache{$hash} = $1;
+               }
+       }
+       flush();
+
+       sub flush {
+               return unless defined $hash;
+               if (defined $cache{$hash}) {
+                       print "$cache{$hash}\n";
+               } else {
+                       print "NONE\n";
+               }
+       }
+       EOF
+'
+
+for output in porcelain line-porcelain
+do
+       test_expect_success "generate --$output output" '
+               git blame --root -C --$output combined >output
+       '
+
+       test_expect_success "$output output finds correct commits" '
+               generate_expect >expect <<-\EOF &&
+               5 base
+               1 modified
+               10 base
+               1 modified
+               5 base
+               EOF
+               perl read-porcelain.pl summary <output >actual &&
+               test_cmp expect actual
+       '
+
+       test_expect_success "$output output shows correct filenames" '
+               generate_expect >expect <<-\EOF &&
+               11 one
+               11 two
+               EOF
+               perl read-porcelain.pl filename <output >actual &&
+               test_cmp expect actual
+       '
+
+       test_expect_success "$output output shows correct previous pointer" '
+               generate_expect >expect <<-EOF &&
+               5 NONE
+               1 $(git rev-parse modified^) one
+               10 NONE
+               1 $(git rev-parse modified^) two
+               5 NONE
+               EOF
+               perl read-porcelain.pl previous <output >actual &&
+               test_cmp expect actual
+       '
+done
+
+test_done
index 3dc4a3454d223d37e85de6fa4ae8656046370e99..0f398dd1603d941e158fd39faa0a218428224872 100755 (executable)
@@ -50,7 +50,7 @@ test_no_confirm () {
                --smtp-server="$(pwd)/fake.sendmail" \
                $@ \
                $patches >stdout &&
-               test_must_fail grep "Send this email" stdout &&
+               ! grep "Send this email" stdout &&
                >no_confirm_okay
 }
 
index 92a3aa8063f810bd2b8df68f3f0f30c2faf3bdc6..8a8ba65a2ae583aa5d0b0526e604a8f9613b5a5e 100755 (executable)
@@ -17,25 +17,12 @@ case "$GIT_SVN_LC_ALL" in
        ;;
 esac
 
-deepdir=nothing-above
-ceiling=$PWD
-
 test_expect_success 'git svn --version works anywhere' '
-       mkdir -p "$deepdir" && (
-               GIT_CEILING_DIRECTORIES="$ceiling" &&
-               export GIT_CEILING_DIRECTORIES &&
-               cd "$deepdir" &&
-               git svn --version
-       )
+       nongit git svn --version
 '
 
 test_expect_success 'git svn help works anywhere' '
-       mkdir -p "$deepdir" && (
-               GIT_CEILING_DIRECTORIES="$ceiling" &&
-               export GIT_CEILING_DIRECTORIES &&
-               cd "$deepdir" &&
-               git svn help
-       )
+       nongit git svn help
 '
 
 test_expect_success \
index 69a675052e2099f278c98ddf8bba12658741fba4..044f65e91660b79a89601c3613eb620807e48bb1 100755 (executable)
@@ -55,7 +55,7 @@ test_expect_success 'clone to target directory with --stdlayout' '
 test_expect_success 'init without -s/-T/-b/-t does not warn' '
        test ! -d trunk &&
        git svn init "$svnrepo"/project/trunk trunk 2>warning &&
-       test_must_fail grep -q prefix warning &&
+       ! grep -q prefix warning &&
        rm -rf trunk &&
        rm -f warning
        '
@@ -63,7 +63,7 @@ test_expect_success 'init without -s/-T/-b/-t does not warn' '
 test_expect_success 'clone without -s/-T/-b/-t does not warn' '
        test ! -d trunk &&
        git svn clone "$svnrepo"/project/trunk 2>warning &&
-       test_must_fail grep -q prefix warning &&
+       ! grep -q prefix warning &&
        rm -rf trunk &&
        rm -f warning
        '
@@ -86,7 +86,7 @@ EOF
 test_expect_success 'init with -s/-T/-b/-t assumes --prefix=origin/' '
        test ! -d project &&
        git svn init -s "$svnrepo"/project project 2>warning &&
-       test_must_fail grep -q prefix warning &&
+       ! grep -q prefix warning &&
        test_svn_configured_prefix "origin/" &&
        rm -rf project &&
        rm -f warning
@@ -95,7 +95,7 @@ test_expect_success 'init with -s/-T/-b/-t assumes --prefix=origin/' '
 test_expect_success 'clone with -s/-T/-b/-t assumes --prefix=origin/' '
        test ! -d project &&
        git svn clone -s "$svnrepo"/project 2>warning &&
-       test_must_fail grep -q prefix warning &&
+       ! grep -q prefix warning &&
        test_svn_configured_prefix "origin/" &&
        rm -rf project &&
        rm -f warning
@@ -104,7 +104,7 @@ test_expect_success 'clone with -s/-T/-b/-t assumes --prefix=origin/' '
 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 &&
-       test_must_fail grep -q prefix warning &&
+       ! grep -q prefix warning &&
        test_svn_configured_prefix "" &&
        rm -rf project &&
        rm -f warning
@@ -113,7 +113,7 @@ test_expect_success 'init with -s/-T/-b/-t and --prefix "" still works' '
 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 &&
-       test_must_fail grep -q prefix warning &&
+       ! grep -q prefix warning &&
        test_svn_configured_prefix "" &&
        rm -rf project &&
        rm -f warning
index 83acf68bc3c19770eb690ece139892ca75329216..dadc70b7d5705d11437d40a701dd5079247e6357 100755 (executable)
@@ -483,6 +483,48 @@ test_expect_success 'verify that lots of notes trigger a fanout scheme' '
 
 '
 
+# Create another notes tree from the one above
+SP=" "
+cat >>input <<INPUT_END
+commit refs/heads/other_commits
+committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+data <<COMMIT
+commit #$(($num_commit + 1))
+COMMIT
+
+from refs/heads/many_commits
+M 644 inline file
+data <<EOF
+file contents in commit #$(($num_commit + 1))
+EOF
+
+commit refs/notes/other_notes
+committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+data <<COMMIT
+committing one more note on a tree imported from a previous notes tree
+COMMIT
+
+M 040000 $(git log --no-walk --format=%T refs/notes/many_notes)$SP
+N inline :$(($num_commit + 1))
+data <<EOF
+note for commit #$(($num_commit + 1))
+EOF
+INPUT_END
+
+test_expect_success 'verify that importing a notes tree respects the fanout scheme' '
+       git fast-import <input &&
+
+       # None of the entries in the top-level notes tree should be a full SHA1
+       git ls-tree --name-only refs/notes/other_notes |
+       while read path
+       do
+               if test $(expr length "$path") -ge 40
+               then
+                       return 1
+               fi
+       done
+'
+
 cat >>expect_non-note1 << EOF
 This is not a note, but rather a regular file residing in a notes tree
 EOF
diff --git a/t/t9303-fast-import-compression.sh b/t/t9303-fast-import-compression.sh
new file mode 100755 (executable)
index 0000000..856219f
--- /dev/null
@@ -0,0 +1,67 @@
+#!/bin/sh
+
+test_description='compression setting of fast-import utility'
+. ./test-lib.sh
+
+# This should be moved to test-lib.sh together with the
+# copy in t0021 after both topics have graduated to 'master'.
+file_size () {
+       perl -e 'print -s $ARGV[0]' "$1"
+}
+
+import_large () {
+       (
+               echo blob
+               echo "data <<EOD"
+               printf "%2000000s\n" "$*"
+               echo EOD
+       ) | git "$@" fast-import
+}
+
+while read expect config
+do
+       test_expect_success "fast-import (packed) with $config" '
+               test_when_finished "rm -f .git/objects/pack/pack-*.*" &&
+               test_when_finished "rm -rf .git/objects/??" &&
+               import_large -c fastimport.unpacklimit=0 $config &&
+               sz=$(file_size .git/objects/pack/pack-*.pack) &&
+               case "$expect" in
+               small) test "$sz" -le 100000 ;;
+               large) test "$sz" -ge 100000 ;;
+               esac
+       '
+done <<\EOF
+large -c core.compression=0
+small -c core.compression=9
+large -c core.compression=0 -c pack.compression=0
+large -c core.compression=9 -c pack.compression=0
+small -c core.compression=0 -c pack.compression=9
+small -c core.compression=9 -c pack.compression=9
+large -c pack.compression=0
+small -c pack.compression=9
+EOF
+
+while read expect config
+do
+       test_expect_success "fast-import (loose) with $config" '
+               test_when_finished "rm -f .git/objects/pack/pack-*.*" &&
+               test_when_finished "rm -rf .git/objects/??" &&
+               import_large -c fastimport.unpacklimit=9 $config &&
+               sz=$(file_size .git/objects/??/????*) &&
+               case "$expect" in
+               small) test "$sz" -le 100000 ;;
+               large) test "$sz" -ge 100000 ;;
+               esac
+       '
+done <<\EOF
+large -c core.compression=0
+small -c core.compression=9
+large -c core.compression=0 -c core.loosecompression=0
+large -c core.compression=9 -c core.loosecompression=0
+small -c core.compression=0 -c core.loosecompression=9
+small -c core.compression=9 -c core.loosecompression=9
+large -c core.loosecompression=0
+small -c core.loosecompression=9
+EOF
+
+test_done
index 0730f18d0f83f4145c5a0dbfde784d71bdc57a1d..4849edc4ef6733b8cf42950b3cd5fe809a80cdde 100755 (executable)
@@ -131,6 +131,26 @@ test_expect_success 'clone two dirs, @all, conflicting files' '
        )
 '
 
+test_expect_success 'clone two dirs, each edited by submit, single git commit' '
+       (
+               cd "$cli" &&
+               echo sub1/f4 >sub1/f4 &&
+               p4 add sub1/f4 &&
+               echo sub2/f4 >sub2/f4 &&
+               p4 add sub2/f4 &&
+               p4 submit -d "sub1/f4 and sub2/f4"
+       ) &&
+       git p4 clone --dest="$git" //depot/sub1@all //depot/sub2@all &&
+       test_when_finished cleanup_git &&
+       (
+               cd "$git" &&
+               git ls-files >lines &&
+               test_line_count = 4 lines &&
+               git log --oneline p4/master >lines &&
+               test_line_count = 5 lines
+       )
+'
+
 revision_ranges="2000/01/01,#head \
                 1,2080/01/01 \
                 2000/01/01,2080/01/01 \
@@ -147,7 +167,7 @@ test_expect_success 'clone using non-numeric revision ranges' '
                (
                        cd "$git" &&
                        git ls-files >lines &&
-                       test_line_count = 6 lines
+                       test_line_count = 8 lines
                )
        done
 '
@@ -257,6 +277,26 @@ test_expect_success 'submit from detached head' '
        )
 '
 
+test_expect_success 'submit from worktree' '
+       test_when_finished cleanup_git &&
+       git p4 clone --dest="$git" //depot &&
+       (
+               cd "$git" &&
+               git worktree add ../worktree-test
+       ) &&
+       (
+               cd "$git/../worktree-test" &&
+               test_commit "worktree-commit" &&
+               git config git-p4.skipSubmitEdit true &&
+               git p4 submit
+       ) &&
+       (
+               cd "$cli" &&
+               p4 sync &&
+               test_path_is_file worktree-commit.t
+       )
+'
+
 test_expect_success 'kill p4d' '
        kill_p4d
 '
index 254d428b73fe4983298f57e0d87405002abdfbc2..1ab76c4246f215cfc0082bdbfd090e1622362140 100755 (executable)
@@ -269,6 +269,38 @@ test_expect_success 'submit works with two branches' '
        )
 '
 
+test_expect_success 'use --git-dir option and GIT_DIR' '
+       test_when_finished cleanup_git &&
+       git p4 clone //depot --destination="$git" &&
+       (
+               cd "$git" &&
+               git config git-p4.skipSubmitEdit true &&
+               test_commit first-change &&
+               git p4 submit --git-dir "$git"
+       ) &&
+       (
+               cd "$cli" &&
+               p4 sync &&
+               test_path_is_file first-change.t &&
+               echo "cli_file" >cli_file.t &&
+               p4 add cli_file.t &&
+               p4 submit -d "cli change"
+       ) &&
+       (git --git-dir "$git" p4 sync) &&
+       (cd "$git" && git checkout -q p4/master) &&
+       test_path_is_file "$git"/cli_file.t &&
+       (
+               cd "$cli" &&
+               echo "cli_file2" >cli_file2.t &&
+               p4 add cli_file2.t  &&
+               p4 submit -d "cli change2"
+       ) &&
+       (GIT_DIR="$git" git p4 sync) &&
+       (cd "$git" && git checkout -q p4/master) &&
+       test_path_is_file "$git"/cli_file2.t
+'
+
+
 test_expect_success 'kill p4d' '
        kill_p4d
 '
index 593152817dadaf1804f4a851c51b8bf1cbf52db9..e37239e657964e948e51e5ac186f5fdf4fab6003 100755 (executable)
@@ -413,6 +413,75 @@ test_expect_success 'submit --prepare-p4-only' '
        )
 '
 
+test_expect_success 'submit --shelve' '
+       test_when_finished cleanup_git &&
+       git p4 clone --dest="$git" //depot &&
+       (
+               cd "$cli" &&
+               p4 revert ... &&
+               cd "$git" &&
+               git config git-p4.skipSubmitEdit true &&
+               test_commit "shelveme1" &&
+               git p4 submit --origin=HEAD^ &&
+
+               echo 654321 >shelveme2.t &&
+               echo 123456 >>shelveme1.t &&
+               git add shelveme* &&
+               git commit -m"shelvetest" &&
+               git p4 submit --shelve --origin=HEAD^ &&
+
+               test_path_is_file shelveme1.t &&
+               test_path_is_file shelveme2.t
+       ) &&
+       (
+               cd "$cli" &&
+               change=$(p4 -G changes -s shelved -m 1 //depot/... | \
+                        marshal_dump change) &&
+               p4 describe -S $change | grep shelveme2 &&
+               p4 describe -S $change | grep 123456 &&
+               test_path_is_file shelveme1.t &&
+               test_path_is_missing shelveme2.t
+       )
+'
+
+# Update an existing shelved changelist
+
+test_expect_success 'submit --update-shelve' '
+       test_when_finished cleanup_git &&
+       git p4 clone --dest="$git" //depot &&
+       (
+               cd "$cli" &&
+               p4 revert ... &&
+               cd "$git" &&
+               git config git-p4.skipSubmitEdit true &&
+               test_commit "test-update-shelved-change" &&
+               git p4 submit --origin=HEAD^ --shelve &&
+
+               shelf_cl=$(p4 -G changes -s shelved -m 1 |\
+                       marshal_dump change) &&
+               test -n $shelf_cl &&
+               echo "updating shelved change list $shelf_cl" &&
+
+               echo "updated-line" >>shelf.t &&
+               echo added-file.t >added-file.t &&
+               git add shelf.t added-file.t &&
+               git rm -f test-update-shelved-change.t &&
+               git commit --amend -C HEAD &&
+               git show --stat HEAD &&
+               git p4 submit -v --origin HEAD^ --update-shelve $shelf_cl &&
+               echo "done git p4 submit"
+       ) &&
+       (
+               cd "$cli" &&
+               change=$(p4 -G changes -s shelved -m 1 //depot/... | \
+                        marshal_dump change) &&
+               p4 unshelve -c $change -s $change &&
+               grep -q updated-line shelf.t &&
+               p4 describe -S $change | grep added-file.t &&
+               test_path_is_missing test-update-shelved-change.t
+       )
+'
+
 test_expect_success 'kill p4d' '
        kill_p4d
 '
index 0fe23128070745750b54843bfb05a7822f41c285..bda222aa0270f3a93fa494b308aa174ebc942eca 100755 (executable)
@@ -118,21 +118,21 @@ test_expect_success 'not preserving user with mixed authorship' '
                make_change_by_user usernamefile3 Derek derek@example.com &&
                P4EDITOR=cat P4USER=alice P4PASSWD=secret &&
                export P4EDITOR P4USER P4PASSWD &&
-               git p4 commit |\
-               grep "git author derek@example.com does not match" &&
+               git p4 commit >actual &&
+               grep "git author derek@example.com does not match" actual &&
 
                make_change_by_user usernamefile3 Charlie charlie@example.com &&
-               git p4 commit |\
-               grep "git author charlie@example.com does not match" &&
+               git p4 commit >actual &&
+               grep "git author charlie@example.com does not match" actual &&
 
                make_change_by_user usernamefile3 alice alice@example.com &&
-               git p4 commit |\
-               test_must_fail grep "git author.*does not match" &&
+               git p4 commit >actual &&
+               ! grep "git author.*does not match" actual &&
 
                git config git-p4.skipUserNameCheck true &&
                make_change_by_user usernamefile3 Charlie charlie@example.com &&
-               git p4 commit |\
-               test_must_fail grep "git author.*does not match" &&
+               git p4 commit >actual &&
+               ! grep "git author.*does not match" actual &&
 
                p4_check_commit_author usernamefile3 alice
        )
index c89992cf95c7fab5b876f98bb5518bfe39344f4a..e7e0268e985072b6a7d8c9448dc0c3d9a9057da9 100755 (executable)
@@ -141,7 +141,7 @@ test_expect_success 'detect copies' '
                git diff-tree -r -C HEAD &&
                git p4 submit &&
                p4 filelog //depot/file8 &&
-               p4 filelog //depot/file8 | test_must_fail grep -q "branch from" &&
+               ! p4 filelog //depot/file8 | grep -q "branch from" &&
 
                echo "file9" >>file2 &&
                git commit -a -m "Differentiate file2" &&
@@ -154,7 +154,7 @@ test_expect_success 'detect copies' '
                git config git-p4.detectCopies true &&
                git p4 submit &&
                p4 filelog //depot/file9 &&
-               p4 filelog //depot/file9 | test_must_fail grep -q "branch from" &&
+               ! p4 filelog //depot/file9 | grep -q "branch from" &&
 
                echo "file10" >>file2 &&
                git commit -a -m "Differentiate file2" &&
@@ -202,7 +202,7 @@ test_expect_success 'detect copies' '
                git config git-p4.detectCopies $(($level + 2)) &&
                git p4 submit &&
                p4 filelog //depot/file12 &&
-               p4 filelog //depot/file12 | test_must_fail grep -q "branch from" &&
+               ! p4 filelog //depot/file12 | grep -q "branch from" &&
 
                echo "file13" >>file2 &&
                git commit -a -m "Differentiate file2" &&
index 110a7e792475fcf19ef782fae1d265ae81653853..ed80ca858c8f8352bd5a26b9a30e0c182d102ee9 100755 (executable)
@@ -42,6 +42,8 @@ test_expect_success 'Create repo with binary files' '
        (
                cd "$cli" &&
 
+               >file0.dat &&
+               p4 add file0.dat &&
                echo "content 1 txt 23 bytes" >file1.txt &&
                p4 add file1.txt &&
                echo "content 2-3 bin 25 bytes" >file2.dat &&
@@ -81,9 +83,9 @@ test_expect_success 'Store files in LFS based on size (>24 bytes)' '
                #
                # Git LFS (see https://git-lfs.github.com/)
                #
-               /file2.dat filter=lfs -text
-               /file4.bin filter=lfs -text
-               /path[[:space:]]with[[:space:]]spaces/file3.bin filter=lfs -text
+               /file2.dat filter=lfs diff=lfs merge=lfs -text
+               /file4.bin filter=lfs diff=lfs merge=lfs -text
+               /path[[:space:]]with[[:space:]]spaces/file3.bin filter=lfs diff=lfs merge=lfs -text
                EOF
                test_path_is_file .gitattributes &&
                test_cmp expect .gitattributes
@@ -109,7 +111,7 @@ test_expect_success 'Store files in LFS based on size (>25 bytes)' '
                #
                # Git LFS (see https://git-lfs.github.com/)
                #
-               /file4.bin filter=lfs -text
+               /file4.bin filter=lfs diff=lfs merge=lfs -text
                EOF
                test_path_is_file .gitattributes &&
                test_cmp expect .gitattributes
@@ -135,7 +137,7 @@ test_expect_success 'Store files in LFS based on extension (dat)' '
                #
                # Git LFS (see https://git-lfs.github.com/)
                #
-               *.dat filter=lfs -text
+               *.dat filter=lfs diff=lfs merge=lfs -text
                EOF
                test_path_is_file .gitattributes &&
                test_cmp expect .gitattributes
@@ -163,8 +165,8 @@ test_expect_success 'Store files in LFS based on size (>25 bytes) and extension
                #
                # Git LFS (see https://git-lfs.github.com/)
                #
-               *.dat filter=lfs -text
-               /file4.bin filter=lfs -text
+               *.dat filter=lfs diff=lfs merge=lfs -text
+               /file4.bin filter=lfs diff=lfs merge=lfs -text
                EOF
                test_path_is_file .gitattributes &&
                test_cmp expect .gitattributes
@@ -199,8 +201,8 @@ test_expect_success 'Remove file from repo and store files in LFS based on size
                #
                # Git LFS (see https://git-lfs.github.com/)
                #
-               /file2.dat filter=lfs -text
-               /path[[:space:]]with[[:space:]]spaces/file3.bin filter=lfs -text
+               /file2.dat filter=lfs diff=lfs merge=lfs -text
+               /path[[:space:]]with[[:space:]]spaces/file3.bin filter=lfs diff=lfs merge=lfs -text
                EOF
                test_path_is_file .gitattributes &&
                test_cmp expect .gitattributes
@@ -237,8 +239,8 @@ test_expect_success 'Add .gitattributes and store files in LFS based on size (>2
                #
                # Git LFS (see https://git-lfs.github.com/)
                #
-               /file2.dat filter=lfs -text
-               /path[[:space:]]with[[:space:]]spaces/file3.bin filter=lfs -text
+               /file2.dat filter=lfs diff=lfs merge=lfs -text
+               /path[[:space:]]with[[:space:]]spaces/file3.bin filter=lfs diff=lfs merge=lfs -text
                EOF
                test_path_is_file .gitattributes &&
                test_cmp expect .gitattributes
@@ -278,7 +280,7 @@ test_expect_success 'Add big files to repo and store files in LFS based on compr
                #
                # Git LFS (see https://git-lfs.github.com/)
                #
-               /file6.bin filter=lfs -text
+               /file6.bin filter=lfs diff=lfs merge=lfs -text
                EOF
                test_path_is_file .gitattributes &&
                test_cmp expect .gitattributes
diff --git a/t/t9830-git-p4-symlink-dir.sh b/t/t9830-git-p4-symlink-dir.sh
new file mode 100755 (executable)
index 0000000..3dc528b
--- /dev/null
@@ -0,0 +1,43 @@
+#!/bin/sh
+
+test_description='git p4 symlinked directories'
+
+. ./lib-git-p4.sh
+
+test_expect_success 'start p4d' '
+       start_p4d
+'
+
+test_expect_success 'symlinked directory' '
+       (
+               cd "$cli" &&
+               : >first_file.t &&
+               p4 add first_file.t &&
+               p4 submit -d "first change"
+       ) &&
+       git p4 clone --dest "$git" //depot &&
+       (
+               cd "$git" &&
+               mkdir -p some/sub/directory &&
+               mkdir -p other/subdir2 &&
+               : > other/subdir2/file.t &&
+               (cd some/sub/directory && ln -s ../../../other/subdir2 .) &&
+               git add some other &&
+               git commit -m "symlinks" &&
+               git config git-p4.skipSubmitEdit true &&
+               git p4 submit -v
+       ) &&
+       (
+               cd "$cli" &&
+               p4 sync &&
+               test -L some/sub/directory/subdir2
+               test_path_is_file some/sub/directory/subdir2/file.t
+       )
+
+'
+
+test_expect_success 'kill p4d' '
+       kill_p4d
+'
+
+test_done
index 2ba62fbc178e1c92dff493beebdc9683b36efd2a..a34e55f874ca06da4cae6ab5d46bc3263c58d521 100755 (executable)
@@ -257,12 +257,7 @@ test_expect_success SYMLINKS '__gitdir - resulting path avoids symlinks' '
 '
 
 test_expect_success '__gitdir - not a git repository' '
-       (
-               cd subdir/subsubdir &&
-               GIT_CEILING_DIRECTORIES="$TRASH_DIRECTORY" &&
-               export GIT_CEILING_DIRECTORIES &&
-               test_must_fail __gitdir
-       )
+       nongit test_must_fail __gitdir
 '
 
 test_expect_success '__gitcomp - trailing space - options' '
index fdaeb3a96bed361f53030cb6ea5c6bdde445163f..bd357704cce987afa79ec8fce038aa05f8c0a762 100644 (file)
@@ -157,16 +157,21 @@ debug () {
         GIT_TEST_GDB=1 "$@"
 }
 
-# Call test_commit with the arguments "<message> [<file> [<contents> [<tag>]]]"
+# Call test_commit with the arguments
+# [-C <directory>] <message> [<file> [<contents> [<tag>]]]"
 #
 # This will commit a file with the given contents and the given commit
 # message, and tag the resulting commit with the given tag name.
 #
 # <file>, <contents>, and <tag> all default to <message>.
+#
+# If the first argument is "-C", the second argument is used as a path for
+# the git invocations.
 
 test_commit () {
        notick= &&
        signoff= &&
+       indir= &&
        while test $# != 0
        do
                case "$1" in
@@ -176,21 +181,26 @@ test_commit () {
                --signoff)
                        signoff="$1"
                        ;;
+               -C)
+                       indir="$2"
+                       shift
+                       ;;
                *)
                        break
                        ;;
                esac
                shift
        done &&
+       indir=${indir:+"$indir"/} &&
        file=${2:-"$1.t"} &&
-       echo "${3-$1}" > "$file" &&
-       git add "$file" &&
+       echo "${3-$1}" > "$indir$file" &&
+       git ${indir:+ -C "$indir"} add "$file" &&
        if test -z "$notick"
        then
                test_tick
        fi &&
-       git commit $signoff -m "$1" &&
-       git tag "${4:-$1}"
+       git ${indir:+ -C "$indir"} commit $signoff -m "$1" &&
+       git ${indir:+ -C "$indir"} tag "${4:-$1}"
 }
 
 # Call test_merge with the arguments "<message> <commit>", where <commit>
@@ -994,3 +1004,17 @@ test_copy_bytes () {
                }
        ' - "$1"
 }
+
+# run "$@" inside a non-git directory
+nongit () {
+       test -d non-repo ||
+       mkdir non-repo ||
+       return 1
+
+       (
+               GIT_CEILING_DIRECTORIES=$(pwd) &&
+               export GIT_CEILING_DIRECTORIES &&
+               cd non-repo &&
+               "$@"
+       )
+}
index cde7fc7fcf355d04708126980d099df820cd00ce..86d77c16dd3abcedd3fd4937a73b142a6b83b7b6 100644 (file)
@@ -966,7 +966,8 @@ yes () {
 }
 
 # Fix some commands on Windows
-case $(uname -s) in
+uname_s=$(uname -s)
+case $uname_s in
 *MINGW*)
        # Windows has its own (incompatible) sort and find
        sort () {
@@ -1141,6 +1142,7 @@ test_lazy_prereq SANITY '
        return $status
 '
 
+test FreeBSD != $uname_s || GIT_UNZIP=${GIT_UNZIP:-/usr/local/bin/unzip}
 GIT_UNZIP=${GIT_UNZIP:-unzip}
 test_lazy_prereq UNZIP '
        "$GIT_UNZIP" -v
diff --git a/tag.c b/tag.c
index d1dcd18cd7b53e21fa15bab9baad05cf16a3b9de..243d1fdbbcb1424b0082e1c999920f6a50b32d68 100644 (file)
--- a/tag.c
+++ b/tag.c
@@ -3,6 +3,7 @@
 #include "commit.h"
 #include "tree.h"
 #include "blob.h"
+#include "gpg-interface.h"
 
 const char *tag_type = "tag";
 
@@ -24,7 +25,9 @@ static int run_gpg_verify(const char *buf, unsigned long size, unsigned flags)
 
        ret = check_signature(buf, payload_size, buf + payload_size,
                                size - payload_size, &sigc);
-       print_signature_buffer(&sigc, flags);
+
+       if (!(flags & GPG_VERIFY_OMIT_STATUS))
+               print_signature_buffer(&sigc, flags);
 
        signature_check_clear(&sigc);
        return ret;
index 64435f23a483dfc40e91437f0689bdfb9ac4b8f8..b2d9280f104aec7095dd2b37ff1f7165355b5388 100644 (file)
@@ -5,6 +5,7 @@
 #include "string-list.h"
 #include "strbuf.h"
 #include "argv-array.h"
+#include "quote.h"
 
 struct tmp_objdir {
        struct strbuf path;
@@ -79,12 +80,27 @@ static void remove_tmp_objdir_on_signal(int signo)
  */
 static void env_append(struct argv_array *env, const char *key, const char *val)
 {
-       const char *old = getenv(key);
+       struct strbuf quoted = STRBUF_INIT;
+       const char *old;
 
+       /*
+        * Avoid quoting if it's not necessary, for maximum compatibility
+        * with older parsers which don't understand the quoting.
+        */
+       if (*val == '"' || strchr(val, PATH_SEP)) {
+               strbuf_addch(&quoted, '"');
+               quote_c_style(val, &quoted, NULL, 1);
+               strbuf_addch(&quoted, '"');
+               val = quoted.buf;
+       }
+
+       old = getenv(key);
        if (!old)
                argv_array_pushf(env, "%s=%s", key, val);
        else
                argv_array_pushf(env, "%s=%s%c%s", key, old, PATH_SEP, val);
+
+       strbuf_release(&quoted);
 }
 
 static void env_replace(struct argv_array *env, const char *key, const char *val)
index f0ecde2d2f8b35c565ab176c76882a5fee8d8fb2..11f0b9fb40bcedbfcd3111fa8076ce0d9e1eb20f 100644 (file)
--- a/trailer.c
+++ b/trailer.c
@@ -46,6 +46,8 @@ static LIST_HEAD(conf_head);
 
 static char *separators = ":";
 
+static int configured;
+
 #define TRAILER_ARG_STRING "$ARG"
 
 static const char *git_generated_prefixes[] = {
@@ -102,12 +104,12 @@ static int same_trailer(struct trailer_item *a, struct arg_item *b)
        return same_token(a, b) && same_value(a, b);
 }
 
-static inline int contains_only_spaces(const char *str)
+static inline int is_blank_line(const char *str)
 {
        const char *s = str;
-       while (*s && isspace(*s))
+       while (*s && *s != '\n' && isspace(*s))
                s++;
-       return !*s;
+       return !*s || *s == '\n';
 }
 
 static inline void strbuf_replace(struct strbuf *sb, const char *a, const char *b)
@@ -546,6 +548,17 @@ static int git_trailer_config(const char *conf_key, const char *value, void *cb)
        return 0;
 }
 
+static void ensure_configured(void)
+{
+       if (configured)
+               return;
+
+       /* Default config must be setup first */
+       git_config(git_trailer_default_config, NULL);
+       git_config(git_trailer_config, NULL);
+       configured = 1;
+}
+
 static const char *token_from_item(struct arg_item *item, char *tok)
 {
        if (item->conf.key)
@@ -563,15 +576,32 @@ static int token_matches_item(const char *tok, struct arg_item *item, int tok_le
 }
 
 /*
- * Return the location of the first separator in line, or -1 if there is no
- * separator.
+ * If the given line is of the form
+ * "<token><optional whitespace><separator>..." or "<separator>...", return the
+ * location of the separator. Otherwise, return -1.  The optional whitespace
+ * is allowed there primarily to allow things like "Bug #43" where <token> is
+ * "Bug" and <separator> is "#".
+ *
+ * The separator-starts-line case (in which this function returns 0) is
+ * distinguished from the non-well-formed-line case (in which this function
+ * returns -1) because some callers of this function need such a distinction.
  */
 static int find_separator(const char *line, const char *separators)
 {
-       int loc = strcspn(line, separators);
-       if (!line[loc])
-               return -1;
-       return loc;
+       int whitespace_found = 0;
+       const char *c;
+       for (c = line; *c; c++) {
+               if (strchr(separators, *c))
+                       return c - line;
+               if (!whitespace_found && (isalnum(*c) || *c == '-'))
+                       continue;
+               if (c != line && (*c == ' ' || *c == '\t')) {
+                       whitespace_found = 1;
+                       continue;
+               }
+               break;
+       }
+       return -1;
 }
 
 /*
@@ -685,51 +715,71 @@ static void process_command_line_args(struct list_head *arg_head,
        free(cl_separators);
 }
 
-static struct strbuf **read_input_file(const char *file)
+static void read_input_file(struct strbuf *sb, const char *file)
 {
-       struct strbuf **lines;
-       struct strbuf sb = STRBUF_INIT;
-
        if (file) {
-               if (strbuf_read_file(&sb, file, 0) < 0)
+               if (strbuf_read_file(sb, file, 0) < 0)
                        die_errno(_("could not read input file '%s'"), file);
        } else {
-               if (strbuf_read(&sb, fileno(stdin), 0) < 0)
+               if (strbuf_read(sb, fileno(stdin), 0) < 0)
                        die_errno(_("could not read from stdin"));
        }
+}
 
-       lines = strbuf_split(&sb, '\n');
+static const char *next_line(const char *str)
+{
+       const char *nl = strchrnul(str, '\n');
+       return nl + !!*nl;
+}
 
-       strbuf_release(&sb);
+/*
+ * Return the position of the start of the last line. If len is 0, return -1.
+ */
+static int last_line(const char *buf, size_t len)
+{
+       int i;
+       if (len == 0)
+               return -1;
+       if (len == 1)
+               return 0;
+       /*
+        * Skip the last character (in addition to the null terminator),
+        * because if the last character is a newline, it is considered as part
+        * of the last line anyway.
+        */
+       i = len - 2;
 
-       return lines;
+       for (; i >= 0; i--) {
+               if (buf[i] == '\n')
+                       return i + 1;
+       }
+       return 0;
 }
 
 /*
- * Return the (0 based) index of the start of the patch or the line
- * count if there is no patch in the message.
+ * Return the position of the start of the patch or the length of str if there
+ * is no patch in the message.
  */
-static int find_patch_start(struct strbuf **lines, int count)
+static int find_patch_start(const char *str)
 {
-       int i;
+       const char *s;
 
-       /* Get the start of the patch part if any */
-       for (i = 0; i < count; i++) {
-               if (starts_with(lines[i]->buf, "---"))
-                       return i;
+       for (s = str; *s; s = next_line(s)) {
+               if (starts_with(s, "---"))
+                       return s - str;
        }
 
-       return count;
+       return s - str;
 }
 
 /*
- * Return the (0 based) index of the first trailer line or count if
- * there are no trailers. Trailers are searched only in the lines from
- * index (count - 1) down to index 0.
+ * Return the position of the first trailer line or len if there are no
+ * trailers.
  */
-static int find_trailer_start(struct strbuf **lines, int count)
+static int find_trailer_start(const char *buf, size_t len)
 {
-       int start, end_of_title, only_spaces = 1;
+       const char *s;
+       int end_of_title, l, only_spaces = 1;
        int recognized_prefix = 0, trailer_lines = 0, non_trailer_lines = 0;
        /*
         * Number of possible continuation lines encountered. This will be
@@ -741,13 +791,13 @@ static int find_trailer_start(struct strbuf **lines, int count)
        int possible_continuation_lines = 0;
 
        /* The first paragraph is the title and cannot be trailers */
-       for (start = 0; start < count; start++) {
-               if (lines[start]->buf[0] == comment_line_char)
+       for (s = buf; s < buf + len; s = next_line(s)) {
+               if (s[0] == comment_line_char)
                        continue;
-               if (contains_only_spaces(lines[start]->buf))
+               if (is_blank_line(s))
                        break;
        }
-       end_of_title = start;
+       end_of_title = s - buf;
 
        /*
         * Get the start of the trailers by looking starting from the end for a
@@ -755,30 +805,33 @@ static int find_trailer_start(struct strbuf **lines, int count)
         * trailers, or (ii) contains at least one Git-generated trailer and
         * consists of at least 25% trailers.
         */
-       for (start = count - 1; start >= end_of_title; start--) {
+       for (l = last_line(buf, len);
+            l >= end_of_title;
+            l = last_line(buf, l)) {
+               const char *bol = buf + l;
                const char **p;
                int separator_pos;
 
-               if (lines[start]->buf[0] == comment_line_char) {
+               if (bol[0] == comment_line_char) {
                        non_trailer_lines += possible_continuation_lines;
                        possible_continuation_lines = 0;
                        continue;
                }
-               if (contains_only_spaces(lines[start]->buf)) {
+               if (is_blank_line(bol)) {
                        if (only_spaces)
                                continue;
                        non_trailer_lines += possible_continuation_lines;
                        if (recognized_prefix &&
                            trailer_lines * 3 >= non_trailer_lines)
-                               return start + 1;
-                       if (trailer_lines && !non_trailer_lines)
-                               return start + 1;
-                       return count;
+                               return next_line(bol) - buf;
+                       else if (trailer_lines && !non_trailer_lines)
+                               return next_line(bol) - buf;
+                       return len;
                }
                only_spaces = 0;
 
                for (p = git_generated_prefixes; *p; p++) {
-                       if (starts_with(lines[start]->buf, *p)) {
+                       if (starts_with(bol, *p)) {
                                trailer_lines++;
                                possible_continuation_lines = 0;
                                recognized_prefix = 1;
@@ -786,8 +839,8 @@ static int find_trailer_start(struct strbuf **lines, int count)
                        }
                }
 
-               separator_pos = find_separator(lines[start]->buf, separators);
-               if (separator_pos >= 1 && !isspace(lines[start]->buf[0])) {
+               separator_pos = find_separator(bol, separators);
+               if (separator_pos >= 1 && !isspace(bol[0])) {
                        struct list_head *pos;
 
                        trailer_lines++;
@@ -797,13 +850,13 @@ static int find_trailer_start(struct strbuf **lines, int count)
                        list_for_each(pos, &conf_head) {
                                struct arg_item *item;
                                item = list_entry(pos, struct arg_item, list);
-                               if (token_matches_item(lines[start]->buf, item,
+                               if (token_matches_item(bol, item,
                                                       separator_pos)) {
                                        recognized_prefix = 1;
                                        break;
                                }
                        }
-               } else if (isspace(lines[start]->buf[0]))
+               } else if (isspace(bol[0]))
                        possible_continuation_lines++;
                else {
                        non_trailer_lines++;
@@ -814,97 +867,64 @@ static int find_trailer_start(struct strbuf **lines, int count)
                ;
        }
 
-       return count;
-}
-
-/* Get the index of the end of the trailers */
-static int find_trailer_end(struct strbuf **lines, int patch_start)
-{
-       struct strbuf sb = STRBUF_INIT;
-       int i, ignore_bytes;
-
-       for (i = 0; i < patch_start; i++)
-               strbuf_addbuf(&sb, lines[i]);
-       ignore_bytes = ignore_non_trailer(&sb);
-       strbuf_release(&sb);
-       for (i = patch_start - 1; i >= 0 && ignore_bytes > 0; i--)
-               ignore_bytes -= lines[i]->len;
-
-       return i + 1;
+       return len;
 }
 
-static int has_blank_line_before(struct strbuf **lines, int start)
+/* Return the position of the end of the trailers. */
+static int find_trailer_end(const char *buf, size_t len)
 {
-       for (;start >= 0; start--) {
-               if (lines[start]->buf[0] == comment_line_char)
-                       continue;
-               return contains_only_spaces(lines[start]->buf);
-       }
-       return 0;
+       return len - ignore_non_trailer(buf, len);
 }
 
-static void print_lines(FILE *outfile, struct strbuf **lines, int start, int end)
+static int ends_with_blank_line(const char *buf, size_t len)
 {
-       int i;
-       for (i = start; lines[i] && i < end; i++)
-               fprintf(outfile, "%s", lines[i]->buf);
+       int ll = last_line(buf, len);
+       if (ll < 0)
+               return 0;
+       return is_blank_line(buf + ll);
 }
 
 static int process_input_file(FILE *outfile,
-                             struct strbuf **lines,
+                             const char *str,
                              struct list_head *head)
 {
-       int count = 0;
-       int patch_start, trailer_start, trailer_end, i;
+       struct trailer_info info;
        struct strbuf tok = STRBUF_INIT;
        struct strbuf val = STRBUF_INIT;
-       struct trailer_item *last = NULL;
-
-       /* Get the line count */
-       while (lines[count])
-               count++;
+       int i;
 
-       patch_start = find_patch_start(lines, count);
-       trailer_end = find_trailer_end(lines, patch_start);
-       trailer_start = find_trailer_start(lines, trailer_end);
+       trailer_info_get(&info, str);
 
        /* Print lines before the trailers as is */
-       print_lines(outfile, lines, 0, trailer_start);
+       fwrite(str, 1, info.trailer_start - str, outfile);
 
-       if (!has_blank_line_before(lines, trailer_start - 1))
+       if (!info.blank_line_before_trailer)
                fprintf(outfile, "\n");
 
-       /* Parse trailer lines */
-       for (i = trailer_start; i < trailer_end; i++) {
+       for (i = 0; i < info.trailer_nr; i++) {
                int separator_pos;
-               if (lines[i]->buf[0] == comment_line_char)
+               char *trailer = info.trailers[i];
+               if (trailer[0] == comment_line_char)
                        continue;
-               if (last && isspace(lines[i]->buf[0])) {
-                       struct strbuf sb = STRBUF_INIT;
-                       strbuf_addf(&sb, "%s\n%s", last->value, lines[i]->buf);
-                       strbuf_strip_suffix(&sb, "\n");
-                       free(last->value);
-                       last->value = strbuf_detach(&sb, NULL);
-                       continue;
-               }
-               separator_pos = find_separator(lines[i]->buf, separators);
+               separator_pos = find_separator(trailer, separators);
                if (separator_pos >= 1) {
-                       parse_trailer(&tok, &val, NULL, lines[i]->buf,
+                       parse_trailer(&tok, &val, NULL, trailer,
                                      separator_pos);
-                       last = add_trailer_item(head,
-                                               strbuf_detach(&tok, NULL),
-                                               strbuf_detach(&val, NULL));
+                       add_trailer_item(head,
+                                        strbuf_detach(&tok, NULL),
+                                        strbuf_detach(&val, NULL));
                } else {
-                       strbuf_addbuf(&val, lines[i]);
+                       strbuf_addstr(&val, trailer);
                        strbuf_strip_suffix(&val, "\n");
                        add_trailer_item(head,
                                         NULL,
                                         strbuf_detach(&val, NULL));
-                       last = NULL;
                }
        }
 
-       return trailer_end;
+       trailer_info_release(&info);
+
+       return info.trailer_end - str;
 }
 
 static void free_all(struct list_head *head)
@@ -951,21 +971,19 @@ void process_trailers(const char *file, int in_place, int trim_empty, struct str
 {
        LIST_HEAD(head);
        LIST_HEAD(arg_head);
-       struct strbuf **lines;
+       struct strbuf sb = STRBUF_INIT;
        int trailer_end;
        FILE *outfile = stdout;
 
-       /* Default config must be setup first */
-       git_config(git_trailer_default_config, NULL);
-       git_config(git_trailer_config, NULL);
+       ensure_configured();
 
-       lines = read_input_file(file);
+       read_input_file(&sb, file);
 
        if (in_place)
                outfile = create_in_place_tempfile(file);
 
        /* Print the lines before the trailers */
-       trailer_end = process_input_file(outfile, lines, &head);
+       trailer_end = process_input_file(outfile, sb.buf, &head);
 
        process_command_line_args(&arg_head, trailers);
 
@@ -976,11 +994,62 @@ void process_trailers(const char *file, int in_place, int trim_empty, struct str
        free_all(&head);
 
        /* Print the lines after the trailers as is */
-       print_lines(outfile, lines, trailer_end, INT_MAX);
+       fwrite(sb.buf + trailer_end, 1, sb.len - trailer_end, outfile);
 
        if (in_place)
                if (rename_tempfile(&trailers_tempfile, file))
                        die_errno(_("could not rename temporary file to %s"), file);
 
-       strbuf_list_free(lines);
+       strbuf_release(&sb);
+}
+
+void trailer_info_get(struct trailer_info *info, const char *str)
+{
+       int patch_start, trailer_end, trailer_start;
+       struct strbuf **trailer_lines, **ptr;
+       char **trailer_strings = NULL;
+       size_t nr = 0, alloc = 0;
+       char **last = NULL;
+
+       ensure_configured();
+
+       patch_start = find_patch_start(str);
+       trailer_end = find_trailer_end(str, patch_start);
+       trailer_start = find_trailer_start(str, trailer_end);
+
+       trailer_lines = strbuf_split_buf(str + trailer_start,
+                                        trailer_end - trailer_start,
+                                        '\n',
+                                        0);
+       for (ptr = trailer_lines; *ptr; ptr++) {
+               if (last && isspace((*ptr)->buf[0])) {
+                       struct strbuf sb = STRBUF_INIT;
+                       strbuf_attach(&sb, *last, strlen(*last), strlen(*last));
+                       strbuf_addbuf(&sb, *ptr);
+                       *last = strbuf_detach(&sb, NULL);
+                       continue;
+               }
+               ALLOC_GROW(trailer_strings, nr + 1, alloc);
+               trailer_strings[nr] = strbuf_detach(*ptr, NULL);
+               last = find_separator(trailer_strings[nr], separators) >= 1
+                       ? &trailer_strings[nr]
+                       : NULL;
+               nr++;
+       }
+       strbuf_list_free(trailer_lines);
+
+       info->blank_line_before_trailer = ends_with_blank_line(str,
+                                                              trailer_start);
+       info->trailer_start = str + trailer_start;
+       info->trailer_end = str + trailer_end;
+       info->trailers = trailer_strings;
+       info->trailer_nr = nr;
+}
+
+void trailer_info_release(struct trailer_info *info)
+{
+       int i;
+       for (i = 0; i < info->trailer_nr; i++)
+               free(info->trailers[i]);
+       free(info->trailers);
 }
index 36b40b81761f95742c9c6fe7e94ba89f19aabfde..65cc5d79c6cecfce5cf3302dd7dcb6323f9f85dc 100644 (file)
--- a/trailer.h
+++ b/trailer.h
@@ -1,7 +1,32 @@
 #ifndef TRAILER_H
 #define TRAILER_H
 
+struct trailer_info {
+       /*
+        * True if there is a blank line before the location pointed to by
+        * trailer_start.
+        */
+       int blank_line_before_trailer;
+
+       /*
+        * Pointers to the start and end of the trailer block found. If there
+        * is no trailer block found, these 2 pointers point to the end of the
+        * input string.
+        */
+       const char *trailer_start, *trailer_end;
+
+       /*
+        * Array of trailers found.
+        */
+       char **trailers;
+       size_t trailer_nr;
+};
+
 void process_trailers(const char *file, int in_place, int trim_empty,
                      struct string_list *trailers);
 
+void trailer_info_get(struct trailer_info *info, const char *str);
+
+void trailer_info_release(struct trailer_info *info);
+
 #endif /* TRAILER_H */
index d57e8dec28d6890ce981a8422e9b8b60b697ecd6..d72e0894840fc384d67339b549a9a6bce7ba03ec 100644 (file)
@@ -664,21 +664,89 @@ static const struct string_list *protocol_whitelist(void)
        return enabled ? &allowed : NULL;
 }
 
-int is_transport_allowed(const char *type)
+enum protocol_allow_config {
+       PROTOCOL_ALLOW_NEVER = 0,
+       PROTOCOL_ALLOW_USER_ONLY,
+       PROTOCOL_ALLOW_ALWAYS
+};
+
+static enum protocol_allow_config parse_protocol_config(const char *key,
+                                                       const char *value)
 {
-       const struct string_list *allowed = protocol_whitelist();
-       return !allowed || string_list_has_string(allowed, type);
+       if (!strcasecmp(value, "always"))
+               return PROTOCOL_ALLOW_ALWAYS;
+       else if (!strcasecmp(value, "never"))
+               return PROTOCOL_ALLOW_NEVER;
+       else if (!strcasecmp(value, "user"))
+               return PROTOCOL_ALLOW_USER_ONLY;
+
+       die("unknown value for config '%s': %s", key, value);
 }
 
-void transport_check_allowed(const char *type)
+static enum protocol_allow_config get_protocol_config(const char *type)
 {
-       if (!is_transport_allowed(type))
-               die("transport '%s' not allowed", type);
+       char *key = xstrfmt("protocol.%s.allow", type);
+       char *value;
+
+       /* first check the per-protocol config */
+       if (!git_config_get_string(key, &value)) {
+               enum protocol_allow_config ret =
+                       parse_protocol_config(key, value);
+               free(key);
+               free(value);
+               return ret;
+       }
+       free(key);
+
+       /* if defined, fallback to user-defined default for unknown protocols */
+       if (!git_config_get_string("protocol.allow", &value)) {
+               enum protocol_allow_config ret =
+                       parse_protocol_config("protocol.allow", value);
+               free(value);
+               return ret;
+       }
+
+       /* fallback to built-in defaults */
+       /* known safe */
+       if (!strcmp(type, "http") ||
+           !strcmp(type, "https") ||
+           !strcmp(type, "git") ||
+           !strcmp(type, "ssh") ||
+           !strcmp(type, "file"))
+               return PROTOCOL_ALLOW_ALWAYS;
+
+       /* known scary; err on the side of caution */
+       if (!strcmp(type, "ext"))
+               return PROTOCOL_ALLOW_NEVER;
+
+       /* unknown; by default let them be used only directly by the user */
+       return PROTOCOL_ALLOW_USER_ONLY;
 }
 
-int transport_restrict_protocols(void)
+int is_transport_allowed(const char *type, int from_user)
 {
-       return !!protocol_whitelist();
+       const struct string_list *whitelist = protocol_whitelist();
+       if (whitelist)
+               return string_list_has_string(whitelist, type);
+
+       switch (get_protocol_config(type)) {
+       case PROTOCOL_ALLOW_ALWAYS:
+               return 1;
+       case PROTOCOL_ALLOW_NEVER:
+               return 0;
+       case PROTOCOL_ALLOW_USER_ONLY:
+               if (from_user < 0)
+                       from_user = git_env_bool("GIT_PROTOCOL_FROM_USER", 1);
+               return from_user;
+       }
+
+       die("BUG: invalid protocol_allow_config type");
+}
+
+void transport_check_allowed(const char *type)
+{
+       if (!is_transport_allowed(type, -1))
+               die("transport '%s' not allowed", type);
 }
 
 struct transport *transport_get(struct remote *remote, const char *url)
@@ -947,28 +1015,50 @@ int transport_push(struct transport *transport,
                        if (run_pre_push_hook(transport, remote_refs))
                                return -1;
 
-               if ((flags & TRANSPORT_RECURSE_SUBMODULES_ON_DEMAND) && !is_bare_repository()) {
+               if ((flags & (TRANSPORT_RECURSE_SUBMODULES_ON_DEMAND |
+                             TRANSPORT_RECURSE_SUBMODULES_ONLY)) &&
+                   !is_bare_repository()) {
                        struct ref *ref = remote_refs;
+                       struct sha1_array commits = SHA1_ARRAY_INIT;
+
                        for (; ref; ref = ref->next)
-                               if (!is_null_oid(&ref->new_oid) &&
-                                   !push_unpushed_submodules(ref->new_oid.hash,
-                                           transport->remote->name))
-                                   die ("Failed to push all needed submodules!");
+                               if (!is_null_oid(&ref->new_oid))
+                                       sha1_array_append(&commits, ref->new_oid.hash);
+
+                       if (!push_unpushed_submodules(&commits,
+                                                     transport->remote->name,
+                                                     pretend)) {
+                               sha1_array_clear(&commits);
+                               die("Failed to push all needed submodules!");
+                       }
+                       sha1_array_clear(&commits);
                }
 
-               if ((flags & (TRANSPORT_RECURSE_SUBMODULES_ON_DEMAND |
-                             TRANSPORT_RECURSE_SUBMODULES_CHECK)) && !is_bare_repository()) {
+               if (((flags & TRANSPORT_RECURSE_SUBMODULES_CHECK) ||
+                    ((flags & (TRANSPORT_RECURSE_SUBMODULES_ON_DEMAND |
+                               TRANSPORT_RECURSE_SUBMODULES_ONLY)) &&
+                     !pretend)) && !is_bare_repository()) {
                        struct ref *ref = remote_refs;
                        struct string_list needs_pushing = STRING_LIST_INIT_DUP;
+                       struct sha1_array commits = SHA1_ARRAY_INIT;
 
                        for (; ref; ref = ref->next)
-                               if (!is_null_oid(&ref->new_oid) &&
-                                   find_unpushed_submodules(ref->new_oid.hash,
-                                           transport->remote->name, &needs_pushing))
-                                       die_with_unpushed_submodules(&needs_pushing);
+                               if (!is_null_oid(&ref->new_oid))
+                                       sha1_array_append(&commits, ref->new_oid.hash);
+
+                       if (find_unpushed_submodules(&commits, transport->remote->name,
+                                               &needs_pushing)) {
+                               sha1_array_clear(&commits);
+                               die_with_unpushed_submodules(&needs_pushing);
+                       }
+                       string_list_clear(&needs_pushing, 0);
+                       sha1_array_clear(&commits);
                }
 
-               push_ret = transport->push_refs(transport, remote_refs, flags);
+               if (!(flags & TRANSPORT_RECURSE_SUBMODULES_ONLY))
+                       push_ret = transport->push_refs(transport, remote_refs, flags);
+               else
+                       push_ret = 0;
                err = push_had_errors(remote_refs);
                ret = push_ret | err;
 
@@ -980,7 +1070,8 @@ int transport_push(struct transport *transport,
                if (flags & TRANSPORT_PUSH_SET_UPSTREAM)
                        set_upstreams(transport, remote_refs, pretend);
 
-               if (!(flags & TRANSPORT_PUSH_DRY_RUN)) {
+               if (!(flags & (TRANSPORT_PUSH_DRY_RUN |
+                              TRANSPORT_RECURSE_SUBMODULES_ONLY))) {
                        struct ref *ref;
                        for (ref = remote_refs; ref; ref = ref->next)
                                transport_update_tracking_ref(transport->remote, ref, verbose);
@@ -1130,7 +1221,7 @@ static int refs_from_alternate_cb(struct alternate_object_database *e,
        const struct ref *extra;
        struct alternate_refs_data *cb = data;
 
-       other = xstrdup(real_path(e->path));
+       other = real_pathdup(e->path);
        len = strlen(other);
 
        while (other[len-1] == '/')
index b8e4ee8099260a74e5207048cf2837c9fd686568..e597b31b38d9d7bb374af203b80e4b6e83abbc3d 100644 (file)
@@ -131,21 +131,22 @@ struct transport {
        enum transport_family family;
 };
 
-#define TRANSPORT_PUSH_ALL 1
-#define TRANSPORT_PUSH_FORCE 2
-#define TRANSPORT_PUSH_DRY_RUN 4
-#define TRANSPORT_PUSH_MIRROR 8
-#define TRANSPORT_PUSH_PORCELAIN 16
-#define TRANSPORT_PUSH_SET_UPSTREAM 32
-#define TRANSPORT_RECURSE_SUBMODULES_CHECK 64
-#define TRANSPORT_PUSH_PRUNE 128
-#define TRANSPORT_RECURSE_SUBMODULES_ON_DEMAND 256
-#define TRANSPORT_PUSH_NO_HOOK 512
-#define TRANSPORT_PUSH_FOLLOW_TAGS 1024
-#define TRANSPORT_PUSH_CERT_ALWAYS 2048
-#define TRANSPORT_PUSH_CERT_IF_ASKED 4096
-#define TRANSPORT_PUSH_ATOMIC 8192
-#define TRANSPORT_PUSH_OPTIONS 16384
+#define TRANSPORT_PUSH_ALL                     (1<<0)
+#define TRANSPORT_PUSH_FORCE                   (1<<1)
+#define TRANSPORT_PUSH_DRY_RUN                 (1<<2)
+#define TRANSPORT_PUSH_MIRROR                  (1<<3)
+#define TRANSPORT_PUSH_PORCELAIN               (1<<4)
+#define TRANSPORT_PUSH_SET_UPSTREAM            (1<<5)
+#define TRANSPORT_RECURSE_SUBMODULES_CHECK     (1<<6)
+#define TRANSPORT_PUSH_PRUNE                   (1<<7)
+#define TRANSPORT_RECURSE_SUBMODULES_ON_DEMAND (1<<8)
+#define TRANSPORT_PUSH_NO_HOOK                 (1<<9)
+#define TRANSPORT_PUSH_FOLLOW_TAGS             (1<<10)
+#define TRANSPORT_PUSH_CERT_ALWAYS             (1<<11)
+#define TRANSPORT_PUSH_CERT_IF_ASKED           (1<<12)
+#define TRANSPORT_PUSH_ATOMIC                  (1<<13)
+#define TRANSPORT_PUSH_OPTIONS                 (1<<14)
+#define TRANSPORT_RECURSE_SUBMODULES_ONLY      (1<<15)
 
 extern int transport_summary_width(const struct ref *refs);
 
@@ -153,10 +154,17 @@ extern int transport_summary_width(const struct ref *refs);
 struct transport *transport_get(struct remote *, const char *);
 
 /*
- * Check whether a transport is allowed by the environment. Type should
- * generally be the URL scheme, as described in Documentation/git.txt
+ * Check whether a transport is allowed by the environment.
+ *
+ * Type should generally be the URL scheme, as described in
+ * Documentation/git.txt
+ *
+ * from_user specifies if the transport was given by the user.  If unknown pass
+ * a -1 to read from the environment to determine if the transport was given by
+ * the user.
+ *
  */
-int is_transport_allowed(const char *type);
+int is_transport_allowed(const char *type, int from_user);
 
 /*
  * Check whether a transport is allowed by the environment,
@@ -164,12 +172,6 @@ int is_transport_allowed(const char *type);
  */
 void transport_check_allowed(const char *type);
 
-/*
- * Returns true if the user has attempted to turn on protocol
- * restrictions at all.
- */
-int transport_restrict_protocols(void);
-
 /* Transport options which apply to git:// and scp-style URLs */
 
 /* The program to use on the remote side to send a pack */
index 828f4356be039bc07ec09665ac725341515a36ea..ff776056806dd40ddfb02f566b0cbd4222d0d970 100644 (file)
@@ -1004,6 +1004,19 @@ static enum interesting do_match(const struct name_entry *entry,
                                 */
                                if (ps->recursive && S_ISDIR(entry->mode))
                                        return entry_interesting;
+
+                               /*
+                                * When matching against submodules with
+                                * wildcard characters, ensure that the entry
+                                * at least matches up to the first wild
+                                * character.  More accurate matching can then
+                                * be performed in the submodule itself.
+                                */
+                               if (ps->recursive && S_ISGITLINK(entry->mode) &&
+                                   !ps_strncmp(item, match + baselen,
+                                               entry->path,
+                                               item->nowildcard_len - baselen))
+                                       return entry_interesting;
                        }
 
                        continue;
@@ -1040,6 +1053,21 @@ static enum interesting do_match(const struct name_entry *entry,
                        strbuf_setlen(base, base_offset + baselen);
                        return entry_interesting;
                }
+
+               /*
+                * When matching against submodules with
+                * wildcard characters, ensure that the entry
+                * at least matches up to the first wild
+                * character.  More accurate matching can then
+                * be performed in the submodule itself.
+                */
+               if (ps->recursive && S_ISGITLINK(entry->mode) &&
+                   !ps_strncmp(item, match, base->buf + base_offset,
+                               item->nowildcard_len)) {
+                       strbuf_setlen(base, base_offset + baselen);
+                       return entry_interesting;
+               }
+
                strbuf_setlen(base, base_offset + baselen);
 
                /*
index 47cdd2369d1919b7b7b267c622ad31e2ad6f24c0..02207be4fc47537168d1b1a7d1455af7e4c0df60 100644 (file)
@@ -25,7 +25,7 @@ static const struct interval zero_width[] = {
 { 0x0825, 0x0827 },
 { 0x0829, 0x082D },
 { 0x0859, 0x085B },
-{ 0x08E4, 0x0902 },
+{ 0x08D4, 0x0902 },
 { 0x093A, 0x093A },
 { 0x093C, 0x093C },
 { 0x0941, 0x0948 },
@@ -120,6 +120,7 @@ static const struct interval zero_width[] = {
 { 0x17C9, 0x17D3 },
 { 0x17DD, 0x17DD },
 { 0x180B, 0x180E },
+{ 0x1885, 0x1886 },
 { 0x18A9, 0x18A9 },
 { 0x1920, 0x1922 },
 { 0x1927, 0x1928 },
@@ -158,7 +159,7 @@ static const struct interval zero_width[] = {
 { 0x1CF4, 0x1CF4 },
 { 0x1CF8, 0x1CF9 },
 { 0x1DC0, 0x1DF5 },
-{ 0x1DFC, 0x1DFF },
+{ 0x1DFB, 0x1DFF },
 { 0x200B, 0x200F },
 { 0x202A, 0x202E },
 { 0x2060, 0x2064 },
@@ -171,13 +172,13 @@ static const struct interval zero_width[] = {
 { 0x3099, 0x309A },
 { 0xA66F, 0xA672 },
 { 0xA674, 0xA67D },
-{ 0xA69F, 0xA69F },
+{ 0xA69E, 0xA69F },
 { 0xA6F0, 0xA6F1 },
 { 0xA802, 0xA802 },
 { 0xA806, 0xA806 },
 { 0xA80B, 0xA80B },
 { 0xA825, 0xA826 },
-{ 0xA8C4, 0xA8C4 },
+{ 0xA8C4, 0xA8C5 },
 { 0xA8E0, 0xA8F1 },
 { 0xA926, 0xA92D },
 { 0xA947, 0xA951 },
@@ -204,7 +205,7 @@ static const struct interval zero_width[] = {
 { 0xABED, 0xABED },
 { 0xFB1E, 0xFB1E },
 { 0xFE00, 0xFE0F },
-{ 0xFE20, 0xFE2D },
+{ 0xFE20, 0xFE2F },
 { 0xFEFF, 0xFEFF },
 { 0xFFF9, 0xFFFB },
 { 0x101FD, 0x101FD },
@@ -228,16 +229,21 @@ static const struct interval zero_width[] = {
 { 0x11173, 0x11173 },
 { 0x11180, 0x11181 },
 { 0x111B6, 0x111BE },
+{ 0x111CA, 0x111CC },
 { 0x1122F, 0x11231 },
 { 0x11234, 0x11234 },
 { 0x11236, 0x11237 },
+{ 0x1123E, 0x1123E },
 { 0x112DF, 0x112DF },
 { 0x112E3, 0x112EA },
-{ 0x11301, 0x11301 },
+{ 0x11300, 0x11301 },
 { 0x1133C, 0x1133C },
 { 0x11340, 0x11340 },
 { 0x11366, 0x1136C },
 { 0x11370, 0x11374 },
+{ 0x11438, 0x1143F },
+{ 0x11442, 0x11444 },
+{ 0x11446, 0x11446 },
 { 0x114B3, 0x114B8 },
 { 0x114BA, 0x114BA },
 { 0x114BF, 0x114C0 },
@@ -245,6 +251,7 @@ static const struct interval zero_width[] = {
 { 0x115B2, 0x115B5 },
 { 0x115BC, 0x115BD },
 { 0x115BF, 0x115C0 },
+{ 0x115DC, 0x115DD },
 { 0x11633, 0x1163A },
 { 0x1163D, 0x1163D },
 { 0x1163F, 0x11640 },
@@ -252,6 +259,16 @@ static const struct interval zero_width[] = {
 { 0x116AD, 0x116AD },
 { 0x116B0, 0x116B5 },
 { 0x116B7, 0x116B7 },
+{ 0x1171D, 0x1171F },
+{ 0x11722, 0x11725 },
+{ 0x11727, 0x1172B },
+{ 0x11C30, 0x11C36 },
+{ 0x11C38, 0x11C3D },
+{ 0x11C3F, 0x11C3F },
+{ 0x11C92, 0x11CA7 },
+{ 0x11CAA, 0x11CB0 },
+{ 0x11CB2, 0x11CB3 },
+{ 0x11CB5, 0x11CB6 },
 { 0x16AF0, 0x16AF4 },
 { 0x16B30, 0x16B36 },
 { 0x16F8F, 0x16F92 },
@@ -262,31 +279,59 @@ static const struct interval zero_width[] = {
 { 0x1D185, 0x1D18B },
 { 0x1D1AA, 0x1D1AD },
 { 0x1D242, 0x1D244 },
+{ 0x1DA00, 0x1DA36 },
+{ 0x1DA3B, 0x1DA6C },
+{ 0x1DA75, 0x1DA75 },
+{ 0x1DA84, 0x1DA84 },
+{ 0x1DA9B, 0x1DA9F },
+{ 0x1DAA1, 0x1DAAF },
+{ 0x1E000, 0x1E006 },
+{ 0x1E008, 0x1E018 },
+{ 0x1E01B, 0x1E021 },
+{ 0x1E023, 0x1E024 },
+{ 0x1E026, 0x1E02A },
 { 0x1E8D0, 0x1E8D6 },
+{ 0x1E944, 0x1E94A },
 { 0xE0001, 0xE0001 },
 { 0xE0020, 0xE007F },
 { 0xE0100, 0xE01EF }
 };
 static const struct interval double_width[] = {
-{ /* plane */ 0x0, 0x1C },
-{ /* plane */ 0x1C, 0x21 },
-{ /* plane */ 0x21, 0x22 },
-{ /* plane */ 0x22, 0x23 },
-{ /* plane */ 0x0, 0x0 },
-{ /* plane */ 0x0, 0x0 },
-{ /* plane */ 0x0, 0x0 },
-{ /* plane */ 0x0, 0x0 },
-{ /* plane */ 0x0, 0x0 },
-{ /* plane */ 0x0, 0x0 },
-{ /* plane */ 0x0, 0x0 },
-{ /* plane */ 0x0, 0x0 },
-{ /* plane */ 0x0, 0x0 },
-{ /* plane */ 0x0, 0x0 },
-{ /* plane */ 0x0, 0x0 },
-{ /* plane */ 0x0, 0x0 },
-{ /* plane */ 0x0, 0x0 },
 { 0x1100, 0x115F },
+{ 0x231A, 0x231B },
 { 0x2329, 0x232A },
+{ 0x23E9, 0x23EC },
+{ 0x23F0, 0x23F0 },
+{ 0x23F3, 0x23F3 },
+{ 0x25FD, 0x25FE },
+{ 0x2614, 0x2615 },
+{ 0x2648, 0x2653 },
+{ 0x267F, 0x267F },
+{ 0x2693, 0x2693 },
+{ 0x26A1, 0x26A1 },
+{ 0x26AA, 0x26AB },
+{ 0x26BD, 0x26BE },
+{ 0x26C4, 0x26C5 },
+{ 0x26CE, 0x26CE },
+{ 0x26D4, 0x26D4 },
+{ 0x26EA, 0x26EA },
+{ 0x26F2, 0x26F3 },
+{ 0x26F5, 0x26F5 },
+{ 0x26FA, 0x26FA },
+{ 0x26FD, 0x26FD },
+{ 0x2705, 0x2705 },
+{ 0x270A, 0x270B },
+{ 0x2728, 0x2728 },
+{ 0x274C, 0x274C },
+{ 0x274E, 0x274E },
+{ 0x2753, 0x2755 },
+{ 0x2757, 0x2757 },
+{ 0x2795, 0x2797 },
+{ 0x27B0, 0x27B0 },
+{ 0x27BF, 0x27BF },
+{ 0x2B1B, 0x2B1C },
+{ 0x2B50, 0x2B50 },
+{ 0x2B55, 0x2B55 },
 { 0x2E80, 0x2E99 },
 { 0x2E9B, 0x2EF3 },
 { 0x2F00, 0x2FD5 },
@@ -313,11 +358,49 @@ static const struct interval double_width[] = {
 { 0xFE68, 0xFE6B },
 { 0xFF01, 0xFF60 },
 { 0xFFE0, 0xFFE6 },
+{ 0x16FE0, 0x16FE0 },
+{ 0x17000, 0x187EC },
+{ 0x18800, 0x18AF2 },
 { 0x1B000, 0x1B001 },
+{ 0x1F004, 0x1F004 },
+{ 0x1F0CF, 0x1F0CF },
+{ 0x1F18E, 0x1F18E },
+{ 0x1F191, 0x1F19A },
 { 0x1F200, 0x1F202 },
-{ 0x1F210, 0x1F23A },
+{ 0x1F210, 0x1F23B },
 { 0x1F240, 0x1F248 },
 { 0x1F250, 0x1F251 },
+{ 0x1F300, 0x1F320 },
+{ 0x1F32D, 0x1F335 },
+{ 0x1F337, 0x1F37C },
+{ 0x1F37E, 0x1F393 },
+{ 0x1F3A0, 0x1F3CA },
+{ 0x1F3CF, 0x1F3D3 },
+{ 0x1F3E0, 0x1F3F0 },
+{ 0x1F3F4, 0x1F3F4 },
+{ 0x1F3F8, 0x1F43E },
+{ 0x1F440, 0x1F440 },
+{ 0x1F442, 0x1F4FC },
+{ 0x1F4FF, 0x1F53D },
+{ 0x1F54B, 0x1F54E },
+{ 0x1F550, 0x1F567 },
+{ 0x1F57A, 0x1F57A },
+{ 0x1F595, 0x1F596 },
+{ 0x1F5A4, 0x1F5A4 },
+{ 0x1F5FB, 0x1F64F },
+{ 0x1F680, 0x1F6C5 },
+{ 0x1F6CC, 0x1F6CC },
+{ 0x1F6D0, 0x1F6D2 },
+{ 0x1F6EB, 0x1F6EC },
+{ 0x1F6F4, 0x1F6F6 },
+{ 0x1F910, 0x1F91E },
+{ 0x1F920, 0x1F927 },
+{ 0x1F930, 0x1F930 },
+{ 0x1F933, 0x1F93E },
+{ 0x1F940, 0x1F94B },
+{ 0x1F950, 0x1F95E },
+{ 0x1F980, 0x1F991 },
+{ 0x1F9C0, 0x1F9C0 },
 { 0x20000, 0x2FFFD },
 { 0x30000, 0x3FFFD }
 };
index ea6bdd20e0491554e88f4b84bd3b6354867021bc..3a8ee19fe837aae6939c3a6b902f6b067dcde9e4 100644 (file)
@@ -52,6 +52,41 @@ static const char *unpack_plumbing_errors[NB_UNPACK_TREES_ERROR_TYPES] = {
          ? ((o)->msgs[(type)])      \
          : (unpack_plumbing_errors[(type)]) )
 
+static const char *super_prefixed(const char *path)
+{
+       /*
+        * It is necessary and sufficient to have two static buffers
+        * here, as the return value of this function is fed to
+        * error() using the unpack_*_errors[] templates we see above.
+        */
+       static struct strbuf buf[2] = {STRBUF_INIT, STRBUF_INIT};
+       static int super_prefix_len = -1;
+       static unsigned idx = ARRAY_SIZE(buf) - 1;
+
+       if (super_prefix_len < 0) {
+               const char *super_prefix = get_super_prefix();
+               if (!super_prefix) {
+                       super_prefix_len = 0;
+               } else {
+                       int i;
+                       for (i = 0; i < ARRAY_SIZE(buf); i++)
+                               strbuf_addstr(&buf[i], super_prefix);
+                       super_prefix_len = buf[0].len;
+               }
+       }
+
+       if (!super_prefix_len)
+               return path;
+
+       if (++idx >= ARRAY_SIZE(buf))
+               idx = 0;
+
+       strbuf_setlen(&buf[idx], super_prefix_len);
+       strbuf_addstr(&buf[idx], path);
+
+       return buf[idx].buf;
+}
+
 void setup_unpack_trees_porcelain(struct unpack_trees_options *opts,
                                  const char *cmd)
 {
@@ -78,7 +113,7 @@ void setup_unpack_trees_porcelain(struct unpack_trees_options *opts,
                xstrfmt(msg, cmd, cmd);
 
        msgs[ERROR_NOT_UPTODATE_DIR] =
-               _("Updating the following directories would lose untracked files in it:\n%s");
+               _("Updating the following directories would lose untracked files in them:\n%s");
 
        if (!strcmp(cmd, "checkout"))
                msg = advice_commit_before_merge
@@ -172,7 +207,7 @@ static int add_rejected_path(struct unpack_trees_options *o,
                             const char *path)
 {
        if (!o->show_all_errors)
-               return error(ERRORMSG(o, e), path);
+               return error(ERRORMSG(o, e), super_prefixed(path));
 
        /*
         * Otherwise, insert in a list for future display by
@@ -196,7 +231,7 @@ static void display_error_msgs(struct unpack_trees_options *o)
                        something_displayed = 1;
                        for (i = 0; i < rejects->nr; i++)
                                strbuf_addf(&path, "\t%s\n", rejects->items[i].string);
-                       error(ERRORMSG(o, e), path.buf);
+                       error(ERRORMSG(o, e), super_prefixed(path.buf));
                        strbuf_release(&path);
                }
                string_list_clear(rejects, 0);
@@ -218,29 +253,42 @@ static void unlink_entry(const struct cache_entry *ce)
        schedule_dir_for_removal(ce->name, ce_namelen(ce));
 }
 
-static int check_updates(struct unpack_trees_options *o,
-                        const struct checkout *state)
+static struct progress *get_progress(struct unpack_trees_options *o)
 {
        unsigned cnt = 0, total = 0;
+       struct index_state *index = &o->result;
+
+       if (!o->update || !o->verbose_update)
+               return NULL;
+
+       for (; cnt < index->cache_nr; cnt++) {
+               const struct cache_entry *ce = index->cache[cnt];
+               if (ce->ce_flags & (CE_UPDATE | CE_WT_REMOVE))
+                       total++;
+       }
+
+       return start_progress_delay(_("Checking out files"),
+                                   total, 50, 1);
+}
+
+static int check_updates(struct unpack_trees_options *o)
+{
+       unsigned cnt = 0;
+       int errs = 0;
        struct progress *progress = NULL;
        struct index_state *index = &o->result;
+       struct checkout state = CHECKOUT_INIT;
        int i;
-       int errs = 0;
 
-       if (o->update && o->verbose_update) {
-               for (total = cnt = 0; cnt < index->cache_nr; cnt++) {
-                       const struct cache_entry *ce = index->cache[cnt];
-                       if (ce->ce_flags & (CE_UPDATE | CE_WT_REMOVE))
-                               total++;
-               }
+       state.force = 1;
+       state.quiet = 1;
+       state.refresh_cache = 1;
+       state.istate = index;
 
-               progress = start_progress_delay(_("Checking out files"),
-                                               total, 50, 1);
-               cnt = 0;
-       }
+       progress = get_progress(o);
 
        if (o->update)
-               git_attr_set_direction(GIT_ATTR_CHECKOUT, &o->result);
+               git_attr_set_direction(GIT_ATTR_CHECKOUT, index);
        for (i = 0; i < index->cache_nr; i++) {
                const struct cache_entry *ce = index->cache[i];
 
@@ -248,10 +296,9 @@ static int check_updates(struct unpack_trees_options *o,
                        display_progress(progress, ++cnt);
                        if (o->update && !o->dry_run)
                                unlink_entry(ce);
-                       continue;
                }
        }
-       remove_marked_cache_entries(&o->result);
+       remove_marked_cache_entries(index);
        remove_scheduled_dirs();
 
        for (i = 0; i < index->cache_nr; i++) {
@@ -264,7 +311,7 @@ static int check_updates(struct unpack_trees_options *o,
                        display_progress(progress, ++cnt);
                        ce->ce_flags &= ~CE_UPDATE;
                        if (o->update && !o->dry_run) {
-                               errs |= checkout_entry(ce, state, NULL);
+                               errs |= checkout_entry(ce, &state, NULL);
                        }
                }
        }
@@ -1094,14 +1141,9 @@ int unpack_trees(unsigned len, struct tree_desc *t, struct unpack_trees_options
        int i, ret;
        static struct cache_entry *dfc;
        struct exclude_list el;
-       struct checkout state = CHECKOUT_INIT;
 
        if (len > MAX_UNPACK_TREES)
                die("unpack_trees takes at most %d trees", MAX_UNPACK_TREES);
-       state.force = 1;
-       state.quiet = 1;
-       state.refresh_cache = 1;
-       state.istate = &o->result;
 
        memset(&el, 0, sizeof(el));
        if (!core_apply_sparse_checkout || !o->update)
@@ -1238,7 +1280,7 @@ int unpack_trees(unsigned len, struct tree_desc *t, struct unpack_trees_options
        }
 
        o->src_index = NULL;
-       ret = check_updates(o, &state) ? (-2) : 0;
+       ret = check_updates(o) ? (-2) : 0;
        if (o->dst_index) {
                if (!ret) {
                        if (!o->result.cache_tree)
@@ -1918,7 +1960,9 @@ int bind_merge(const struct cache_entry * const *src,
                             o->merge_size);
        if (a && old)
                return o->gently ? -1 :
-                       error(ERRORMSG(o, ERROR_BIND_OVERLAP), a->name, old->name);
+                       error(ERRORMSG(o, ERROR_BIND_OVERLAP),
+                             super_prefixed(a->name),
+                             super_prefixed(old->name));
        if (!a)
                return keep_entry(old, o);
        else
diff --git a/update_unicode.sh b/update_unicode.sh
deleted file mode 100755 (executable)
index 27af77c..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-#!/bin/sh
-#See http://www.unicode.org/reports/tr44/
-#
-#Me Enclosing_Mark  an enclosing combining mark
-#Mn Nonspacing_Mark a nonspacing combining mark (zero advance width)
-#Cf Format          a format control character
-#
-UNICODEWIDTH_H=../unicode_width.h
-if ! test -d unicode; then
-       mkdir unicode
-fi &&
-( cd unicode &&
-       if ! test -f UnicodeData.txt; then
-               wget http://www.unicode.org/Public/UCD/latest/ucd/UnicodeData.txt
-       fi &&
-       if ! test -f EastAsianWidth.txt; then
-               wget http://www.unicode.org/Public/UCD/latest/ucd/EastAsianWidth.txt
-       fi &&
-       if ! test -d uniset; then
-               git clone https://github.com/depp/uniset.git
-       fi &&
-       (
-               cd uniset &&
-               if ! test -x uniset; then
-                       autoreconf -i &&
-                       ./configure --enable-warnings=-Werror CFLAGS='-O0 -ggdb'
-               fi &&
-               make
-       ) &&
-       UNICODE_DIR=. && export UNICODE_DIR &&
-       cat >$UNICODEWIDTH_H <<-EOF
-       static const struct interval zero_width[] = {
-               $(uniset/uniset --32 cat:Me,Mn,Cf + U+1160..U+11FF - U+00AD |
-                 grep -v plane)
-       };
-       static const struct interval double_width[] = {
-               $(uniset/uniset --32 eaw:F,W)
-       };
-       EOF
-)
index e0db8b42be2d6ba400da987f8cb2ba573c5eda01..7597ba3405e161d59608e18ec580946c60f9e6d2 100644 (file)
@@ -46,6 +46,8 @@ static int no_progress, daemon_mode;
 #define ALLOW_TIP_SHA1 01
 /* Allow request of a sha1 if it is reachable from a ref (possibly hidden ref). */
 #define ALLOW_REACHABLE_SHA1   02
+/* Allow request of any sha1. Implies ALLOW_TIP_SHA1 and ALLOW_REACHABLE_SHA1. */
+#define ALLOW_ANY_SHA1 07
 static unsigned int allow_unadvertised_object_request;
 static int shallow_nr;
 static struct object_array have_obj;
@@ -825,7 +827,8 @@ static void receive_needs(void)
                            sha1_to_hex(sha1_buf));
                if (!(o->flags & WANTED)) {
                        o->flags |= WANTED;
-                       if (!is_our_ref(o))
+                       if (!((allow_unadvertised_object_request & ALLOW_ANY_SHA1) == ALLOW_ANY_SHA1
+                             || is_our_ref(o)))
                                has_non_tip = 1;
                        add_object_array(o, NULL, &want_obj);
                }
@@ -1008,6 +1011,11 @@ static int upload_pack_config(const char *var, const char *value, void *unused)
                        allow_unadvertised_object_request |= ALLOW_REACHABLE_SHA1;
                else
                        allow_unadvertised_object_request &= ~ALLOW_REACHABLE_SHA1;
+       } else if (!strcmp("uploadpack.allowanysha1inwant", var)) {
+               if (git_config_bool(var, value))
+                       allow_unadvertised_object_request |= ALLOW_ANY_SHA1;
+               else
+                       allow_unadvertised_object_request &= ~ALLOW_ANY_SHA1;
        } else if (!strcmp("uploadpack.keepalive", var)) {
                keepalive = git_config_int(var, value);
                if (!keepalive)
diff --git a/usage.c b/usage.c
index 17f52c1b5ce631eed1cdf3447d80e7223a2e6f01..ad6d2910fb58e2f27a52646bd79a0442e689517f 100644 (file)
--- a/usage.c
+++ b/usage.c
@@ -7,21 +7,19 @@
 #include "cache.h"
 
 static FILE *error_handle;
-static int tweaked_error_buffering;
 
 void vreportf(const char *prefix, const char *err, va_list params)
 {
+       char msg[4096];
        FILE *fh = error_handle ? error_handle : stderr;
+       char *p;
 
-       fflush(fh);
-       if (!tweaked_error_buffering) {
-               setvbuf(fh, NULL, _IOLBF, 0);
-               tweaked_error_buffering = 1;
+       vsnprintf(msg, sizeof(msg), err, params);
+       for (p = msg; *p; p++) {
+               if (iscntrl(*p) && *p != '\t' && *p != '\n')
+                       *p = '?';
        }
-
-       fputs(prefix, fh);
-       vfprintf(fh, err, params);
-       fputc('\n', fh);
+       fprintf(fh, "%s%s\n", prefix, msg);
 }
 
 static NORETURN void usage_builtin(const char *err, va_list params)
@@ -93,7 +91,6 @@ void set_die_is_recursing_routine(int (*routine)(void))
 void set_error_handle(FILE *fh)
 {
        error_handle = fh;
-       tweaked_error_buffering = 0;
 }
 
 void NORETURN usagef(const char *err, ...)
diff --git a/utf8.c b/utf8.c
index 00e10c86ad7ea7bcc2d53a90a2f608dd66d47462..0c8e011a58cae3c683851007ec81828ad8284471 100644 (file)
--- a/utf8.c
+++ b/utf8.c
@@ -489,6 +489,28 @@ char *reencode_string_iconv(const char *in, size_t insz, iconv_t conv, int *outs
        return out;
 }
 
+static const char *fallback_encoding(const char *name)
+{
+       /*
+        * Some platforms do not have the variously spelled variants of
+        * UTF-8, so let's fall back to trying the most official
+        * spelling. We do so only as a fallback in case the platform
+        * does understand the user's spelling, but not our official
+        * one.
+        */
+       if (is_encoding_utf8(name))
+               return "UTF-8";
+
+       /*
+        * Even though latin-1 is still seen in e-mail
+        * headers, some platforms only install ISO-8859-1.
+        */
+       if (!strcasecmp(name, "latin-1"))
+               return "ISO-8859-1";
+
+       return name;
+}
+
 char *reencode_string_len(const char *in, int insz,
                          const char *out_encoding, const char *in_encoding,
                          int *outsz)
@@ -501,17 +523,9 @@ char *reencode_string_len(const char *in, int insz,
 
        conv = iconv_open(out_encoding, in_encoding);
        if (conv == (iconv_t) -1) {
-               /*
-                * Some platforms do not have the variously spelled variants of
-                * UTF-8, so let's fall back to trying the most official
-                * spelling. We do so only as a fallback in case the platform
-                * does understand the user's spelling, but not our official
-                * one.
-                */
-               if (is_encoding_utf8(in_encoding))
-                       in_encoding = "UTF-8";
-               if (is_encoding_utf8(out_encoding))
-                       out_encoding = "UTF-8";
+               in_encoding = fallback_encoding(in_encoding);
+               out_encoding = fallback_encoding(out_encoding);
+
                conv = iconv_open(out_encoding, in_encoding);
                if (conv == (iconv_t) -1)
                        return NULL;
index 80bfd109fa1285a24dbfa8e9aabdfc3b3bd59801..9f81dc1062bc1f7f243afa8c0404ff5100fc0ef8 100644 (file)
 static const struct string_list *prereleases;
 static int initialized;
 
+struct suffix_match {
+       int conf_pos;
+       int start;
+       int len;
+};
+
+static void find_better_matching_suffix(const char *tagname, const char *suffix,
+                                       int suffix_len, int start, int conf_pos,
+                                       struct suffix_match *match)
+{
+       /*
+        * A better match either starts earlier or starts at the same offset
+        * but is longer.
+        */
+       int end = match->len < suffix_len ? match->start : match->start-1;
+       int i;
+       for (i = start; i <= end; i++)
+               if (starts_with(tagname + i, suffix)) {
+                       match->conf_pos = conf_pos;
+                       match->start = i;
+                       match->len = suffix_len;
+                       break;
+               }
+}
+
 /*
- * p1 and p2 point to the first different character in two strings. If
- * either p1 or p2 starts with a prerelease suffix, it will be forced
- * to be on top.
- *
- * If both p1 and p2 start with (different) suffix, the order is
- * determined by config file.
+ * off is the offset of the first different character in the two strings
+ * s1 and s2. If either s1 or s2 contains a prerelease suffix containing
+ * that offset or a suffix ends right before that offset, then that
+ * string will be forced to be on top.
  *
- * Note that we don't have to deal with the situation when both p1 and
- * p2 start with the same suffix because the common part is already
- * consumed by the caller.
+ * If both s1 and s2 contain a (different) suffix around that position,
+ * their order is determined by the order of those two suffixes in the
+ * configuration.
+ * If any of the strings contains more than one different suffixes around
+ * that position, then that string is sorted according to the contained
+ * suffix which starts at the earliest offset in that string.
+ * If more than one different contained suffixes start at that earliest
+ * offset, then that string is sorted according to the longest of those
+ * suffixes.
  *
  * Return non-zero if *diff contains the return value for versioncmp()
  */
-static int swap_prereleases(const void *p1_,
-                           const void *p2_,
+static int swap_prereleases(const char *s1,
+                           const char *s2,
+                           int off,
                            int *diff)
 {
-       const char *p1 = p1_;
-       const char *p2 = p2_;
-       int i, i1 = -1, i2 = -1;
+       int i;
+       struct suffix_match match1 = { -1, off, -1 };
+       struct suffix_match match2 = { -1, off, -1 };
 
        for (i = 0; i < prereleases->nr; i++) {
                const char *suffix = prereleases->items[i].string;
-               if (i1 == -1 && starts_with(p1, suffix))
-                       i1 = i;
-               if (i2 == -1 && starts_with(p2, suffix))
-                       i2 = i;
+               int start, suffix_len = strlen(suffix);
+               if (suffix_len < off)
+                       start = off - suffix_len;
+               else
+                       start = 0;
+               find_better_matching_suffix(s1, suffix, suffix_len, start,
+                                           i, &match1);
+               find_better_matching_suffix(s2, suffix, suffix_len, start,
+                                           i, &match2);
        }
-       if (i1 == -1 && i2 == -1)
+       if (match1.conf_pos == -1 && match2.conf_pos == -1)
                return 0;
-       if (i1 >= 0 && i2 >= 0)
-               *diff = i1 - i2;
-       else if (i1 >= 0)
+       if (match1.conf_pos == match2.conf_pos)
+               /* Found the same suffix in both, e.g. "-rc" in "v1.0-rcX"
+                * and "v1.0-rcY": the caller should decide based on "X"
+                * and "Y". */
+               return 0;
+
+       if (match1.conf_pos >= 0 && match2.conf_pos >= 0)
+               *diff = match1.conf_pos - match2.conf_pos;
+       else if (match1.conf_pos >= 0)
                *diff = -1;
-       else /* if (i2 >= 0) */
+       else /* if (match2.conf_pos >= 0) */
                *diff = 1;
        return 1;
 }
@@ -118,10 +159,18 @@ int versioncmp(const char *s1, const char *s2)
        }
 
        if (!initialized) {
+               const struct string_list *deprecated_prereleases;
                initialized = 1;
-               prereleases = git_config_get_value_multi("versionsort.prereleasesuffix");
+               prereleases = git_config_get_value_multi("versionsort.suffix");
+               deprecated_prereleases = git_config_get_value_multi("versionsort.prereleasesuffix");
+               if (prereleases) {
+                       if (deprecated_prereleases)
+                               warning("ignoring versionsort.prereleasesuffix because versionsort.suffix is set");
+               } else
+                       prereleases = deprecated_prereleases;
        }
-       if (prereleases && swap_prereleases(p1 - 1, p2 - 1, &diff))
+       if (prereleases && swap_prereleases(s1, s2, (const char *) p1 - s1 - 1,
+                                           &diff))
                return diff;
 
        state = result_type[state * 3 + (((c2 == '0') + (isdigit (c2) != 0)))];
index f7869f8d6072c98c3e9be3387a9a3c19508e13ea..d633761575bff4811fa4f3f3822807b1f77f5ecb 100644 (file)
@@ -88,21 +88,13 @@ static struct worktree *get_main_worktree(void)
 
        strbuf_addf(&path, "%s/HEAD", get_git_common_dir());
 
-       if (parse_ref(path.buf, &head_ref, &is_detached) < 0)
-               goto done;
-
-       worktree = xmalloc(sizeof(struct worktree));
+       worktree = xcalloc(1, sizeof(*worktree));
        worktree->path = strbuf_detach(&worktree_path, NULL);
-       worktree->id = NULL;
        worktree->is_bare = is_bare;
-       worktree->head_ref = NULL;
        worktree->is_detached = is_detached;
-       worktree->is_current = 0;
-       add_head_info(&head_ref, worktree);
-       worktree->lock_reason = NULL;
-       worktree->lock_reason_valid = 0;
+       if (!parse_ref(path.buf, &head_ref, &is_detached))
+               add_head_info(&head_ref, worktree);
 
-done:
        strbuf_release(&path);
        strbuf_release(&worktree_path);
        strbuf_release(&head_ref);
@@ -138,16 +130,11 @@ static struct worktree *get_linked_worktree(const char *id)
        if (parse_ref(path.buf, &head_ref, &is_detached) < 0)
                goto done;
 
-       worktree = xmalloc(sizeof(struct worktree));
+       worktree = xcalloc(1, sizeof(*worktree));
        worktree->path = strbuf_detach(&worktree_path, NULL);
        worktree->id = xstrdup(id);
-       worktree->is_bare = 0;
-       worktree->head_ref = NULL;
        worktree->is_detached = is_detached;
-       worktree->is_current = 0;
        add_head_info(&head_ref, worktree);
-       worktree->lock_reason = NULL;
-       worktree->lock_reason_valid = 0;
 
 done:
        strbuf_release(&path);
@@ -158,7 +145,7 @@ static struct worktree *get_linked_worktree(const char *id)
 
 static void mark_current_worktree(struct worktree **worktrees)
 {
-       char *git_dir = xstrdup(absolute_path(get_git_dir()));
+       char *git_dir = absolute_pathdup(get_git_dir());
        int i;
 
        for (i = 0; worktrees[i]; i++) {
@@ -173,7 +160,14 @@ static void mark_current_worktree(struct worktree **worktrees)
        free(git_dir);
 }
 
-struct worktree **get_worktrees(void)
+static int compare_worktree(const void *a_, const void *b_)
+{
+       const struct worktree *const *a = a_;
+       const struct worktree *const *b = b_;
+       return fspathcmp((*a)->path, (*b)->path);
+}
+
+struct worktree **get_worktrees(unsigned flags)
 {
        struct worktree **list = NULL;
        struct strbuf path = STRBUF_INIT;
@@ -183,8 +177,7 @@ struct worktree **get_worktrees(void)
 
        list = xmalloc(alloc * sizeof(struct worktree *));
 
-       if ((list[counter] = get_main_worktree()))
-               counter++;
+       list[counter++] = get_main_worktree();
 
        strbuf_addf(&path, "%s/worktrees", get_git_common_dir());
        dir = opendir(path.buf);
@@ -205,6 +198,13 @@ struct worktree **get_worktrees(void)
        ALLOC_GROW(list, counter + 1, alloc);
        list[counter] = NULL;
 
+       if (flags & GWT_SORT_LINKED)
+               /*
+                * don't sort the first item (main worktree), which will
+                * always be the first
+                */
+               QSORT(list + 1, counter - 1, compare_worktree);
+
        mark_current_worktree(list);
        return list;
 }
@@ -255,7 +255,7 @@ struct worktree *find_worktree(struct worktree **list,
                return wt;
 
        arg = prefix_filename(prefix, strlen(prefix), arg);
-       path = xstrdup(real_path(arg));
+       path = real_pathdup(arg);
        for (; *list; list++)
                if (!fspathcmp(path, real_path((*list)->path)))
                        break;
@@ -341,7 +341,7 @@ const struct worktree *find_shared_symref(const char *symref,
 
        if (worktrees)
                free_worktrees(worktrees);
-       worktrees = get_worktrees();
+       worktrees = get_worktrees(0);
 
        for (i = 0; worktrees[i]; i++) {
                struct worktree *wt = worktrees[i];
@@ -380,3 +380,53 @@ const struct worktree *find_shared_symref(const char *symref,
 
        return existing;
 }
+
+int submodule_uses_worktrees(const char *path)
+{
+       char *submodule_gitdir;
+       struct strbuf sb = STRBUF_INIT;
+       DIR *dir;
+       struct dirent *d;
+       int ret = 0;
+       struct repository_format format;
+
+       submodule_gitdir = git_pathdup_submodule(path, "%s", "");
+       if (!submodule_gitdir)
+               return 0;
+
+       /* The env would be set for the superproject. */
+       get_common_dir_noenv(&sb, submodule_gitdir);
+
+       /*
+        * The check below is only known to be good for repository format
+        * version 0 at the time of writing this code.
+        */
+       strbuf_addstr(&sb, "/config");
+       read_repository_format(&format, sb.buf);
+       if (format.version != 0) {
+               strbuf_release(&sb);
+               return 1;
+       }
+
+       /* Replace config by worktrees. */
+       strbuf_setlen(&sb, sb.len - strlen("config"));
+       strbuf_addstr(&sb, "worktrees");
+
+       /* See if there is any file inside the worktrees directory. */
+       dir = opendir(sb.buf);
+       strbuf_release(&sb);
+       free(submodule_gitdir);
+
+       if (!dir)
+               return 0;
+
+       while ((d = readdir(dir)) != NULL) {
+               if (is_dot_or_dotdot(d->d_name))
+                       continue;
+
+               ret = 1;
+               break;
+       }
+       closedir(dir);
+       return ret;
+}
index 90e1311fa73fa6bdde5249d68818eacb6dc8edd0..6bfb985203070e3051f82348568840f5577bf0dc 100644 (file)
@@ -15,6 +15,8 @@ struct worktree {
 
 /* Functions for acting on the information about worktrees. */
 
+#define GWT_SORT_LINKED (1 << 0) /* keeps linked worktrees sorted */
+
 /*
  * Get the worktrees.  The primary worktree will always be the first returned,
  * and linked worktrees will be pointed to by 'next' in each subsequent
@@ -23,7 +25,12 @@ struct worktree {
  * The caller is responsible for freeing the memory from the returned
  * worktree(s).
  */
-extern struct worktree **get_worktrees(void);
+extern struct worktree **get_worktrees(unsigned flags);
+
+/*
+ * Returns 1 if linked worktrees exist, 0 otherwise.
+ */
+extern int submodule_uses_worktrees(const char *path);
 
 /*
  * Return git dir of the worktree. Note that the path may be relative.
index a2e9d332d8332bb1dbeea26b683c5e3f032a822e..d47012048f81c92a82758d87f8726cb919501104 100644 (file)
@@ -628,7 +628,7 @@ static void wt_status_collect_changes_initial(struct wt_status *s)
                        d->index_status = DIFF_STATUS_ADDED;
                        /* Leave {mode,oid}_head zero for adds. */
                        d->mode_index = ce->ce_mode;
-                       hashcpy(d->oid_index.hash, ce->oid.hash);
+                       oidcpy(&d->oid_index, &ce->oid);
                }
        }
 }
@@ -1135,14 +1135,17 @@ static void abbrev_sha1_in_line(struct strbuf *line)
        strbuf_list_free(split);
 }
 
-static void read_rebase_todolist(const char *fname, struct string_list *lines)
+static int read_rebase_todolist(const char *fname, struct string_list *lines)
 {
        struct strbuf line = STRBUF_INIT;
        FILE *f = fopen(git_path("%s", fname), "r");
 
-       if (!f)
+       if (!f) {
+               if (errno == ENOENT)
+                       return -1;
                die_errno("Could not open file %s for reading",
                          git_path("%s", fname));
+       }
        while (!strbuf_getline_lf(&line, f)) {
                if (line.len && line.buf[0] == comment_line_char)
                        continue;
@@ -1152,6 +1155,7 @@ static void read_rebase_todolist(const char *fname, struct string_list *lines)
                abbrev_sha1_in_line(&line);
                string_list_append(lines, line.buf);
        }
+       return 0;
 }
 
 static void show_rebase_information(struct wt_status *s,
@@ -1166,8 +1170,10 @@ static void show_rebase_information(struct wt_status *s,
                struct string_list yet_to_do = STRING_LIST_INIT_DUP;
 
                read_rebase_todolist("rebase-merge/done", &have_done);
-               read_rebase_todolist("rebase-merge/git-rebase-todo", &yet_to_do);
-
+               if (read_rebase_todolist("rebase-merge/git-rebase-todo",
+                                        &yet_to_do))
+                       status_printf_ln(s, color,
+                               _("git-rebase-todo is missing."));
                if (have_done.nr == 0)
                        status_printf_ln(s, color, _("No commands done."));
                else {
@@ -2096,7 +2102,7 @@ static void wt_porcelain_v2_print_unmerged_entry(
                if (strcmp(ce->name, it->string) || !stage)
                        break;
                stages[stage - 1].mode = ce->ce_mode;
-               hashcpy(stages[stage - 1].oid.hash, ce->oid.hash);
+               oidcpy(&stages[stage - 1].oid, &ce->oid);
                sum |= (1 << (stage - 1));
        }
        if (sum != d->stagemask)
@@ -2258,11 +2264,12 @@ int has_uncommitted_changes(int ignore_submodules)
 int require_clean_work_tree(const char *action, const char *hint, int ignore_submodules, int gently)
 {
        struct lock_file *lock_file = xcalloc(1, sizeof(*lock_file));
-       int err = 0;
+       int err = 0, fd;
 
-       hold_locked_index(lock_file, 0);
+       fd = hold_locked_index(lock_file, 0);
        refresh_cache(REFRESH_QUIET);
-       update_index_if_able(&the_index, lock_file);
+       if (0 <= fd)
+               update_index_if_able(&the_index, lock_file);
        rollback_lock_file(lock_file);
 
        if (has_unstaged_changes(ignore_submodules)) {
index 8db16d4ae6def5657bc51fa2b9b354a7c0267201..b090ad8eacfe6ed171aa14b39901a8042ab678d9 100644 (file)
@@ -41,8 +41,7 @@ extern "C" {
 
 #define XDF_IGNORE_BLANK_LINES (1 << 7)
 
-#define XDF_COMPACTION_HEURISTIC (1 << 8)
-#define XDF_INDENT_HEURISTIC (1 << 9)
+#define XDF_INDENT_HEURISTIC (1 << 8)
 
 #define XDL_EMIT_FUNCNAMES (1 << 0)
 #define XDL_EMIT_FUNCCONTEXT (1 << 2)
index 760fbb6db7583f6d0ec5eed9b9c63ea6a0e7abe7..93a65680a18284041ce57f61191d20dcc763e022 100644 (file)
@@ -400,11 +400,6 @@ static xdchange_t *xdl_add_change(xdchange_t *xscr, long i1, long i2, long chg1,
 }
 
 
-static int is_blank_line(xrecord_t *rec, long flags)
-{
-       return xdl_blankline(rec->ptr, rec->size, flags);
-}
-
 static int recs_match(xrecord_t *rec1, xrecord_t *rec2, long flags)
 {
        return (rec1->ha == rec2->ha &&
@@ -821,7 +816,6 @@ int xdl_change_compact(xdfile_t *xdf, xdfile_t *xdfo, long flags) {
        struct xdlgroup g, go;
        long earliest_end, end_matching_other;
        long groupsize;
-       unsigned int blank_lines;
 
        group_init(xdf, &g);
        group_init(xdfo, &go);
@@ -846,13 +840,6 @@ int xdl_change_compact(xdfile_t *xdf, xdfile_t *xdfo, long flags) {
                         */
                        end_matching_other = -1;
 
-                       /*
-                        * Boolean value that records whether there are any blank
-                        * lines that could be made to be the last line of this
-                        * group.
-                        */
-                       blank_lines = 0;
-
                        /* Shift the group backward as much as possible: */
                        while (!group_slide_up(xdf, &g, flags))
                                if (group_previous(xdfo, &go))
@@ -869,11 +856,6 @@ int xdl_change_compact(xdfile_t *xdf, xdfile_t *xdfo, long flags) {
 
                        /* Now shift the group forward as far as possible: */
                        while (1) {
-                               if (!blank_lines)
-                                       blank_lines = is_blank_line(
-                                                       xdf->recs[g.end - 1],
-                                                       flags);
-
                                if (group_slide_down(xdf, &g, flags))
                                        break;
                                if (group_next(xdfo, &go))
@@ -906,21 +888,6 @@ int xdl_change_compact(xdfile_t *xdf, xdfile_t *xdfo, long flags) {
                                if (group_previous(xdfo, &go))
                                        xdl_bug("group sync broken sliding to match");
                        }
-               } else if ((flags & XDF_COMPACTION_HEURISTIC) && blank_lines) {
-                       /*
-                        * Compaction heuristic: if it is possible to shift the
-                        * group to make its bottom line a blank line, do so.
-                        *
-                        * As we already shifted the group forward as far as
-                        * possible in the earlier loop, we only need to handle
-                        * backward shifts, not forward ones.
-                        */
-                       while (!is_blank_line(xdf->recs[g.end - 1], flags)) {
-                               if (group_slide_up(xdf, &g, flags))
-                                       xdl_bug("blank line disappeared");
-                               if (group_previous(xdfo, &go))
-                                       xdl_bug("group sync broken sliding to blank line");
-                       }
                } else if (flags & XDF_INDENT_HEURISTIC) {
                        /*
                         * Indent heuristic: a group of pure add/delete lines
index 027192a1c7f12214c0ff6787296769ce708ba407..04d7b32e4e4a75b9d5762f3d3a2a2f9c236075a0 100644 (file)
@@ -264,110 +264,6 @@ static unsigned long xdl_hash_record_with_whitespace(char const **data,
        return ha;
 }
 
-#ifdef XDL_FAST_HASH
-
-#define REPEAT_BYTE(x)  ((~0ul / 0xff) * (x))
-
-#define ONEBYTES       REPEAT_BYTE(0x01)
-#define NEWLINEBYTES   REPEAT_BYTE(0x0a)
-#define HIGHBITS       REPEAT_BYTE(0x80)
-
-/* Return the high bit set in the first byte that is a zero */
-static inline unsigned long has_zero(unsigned long a)
-{
-       return ((a - ONEBYTES) & ~a) & HIGHBITS;
-}
-
-static inline long count_masked_bytes(unsigned long mask)
-{
-       if (sizeof(long) == 8) {
-               /*
-                * Jan Achrenius on G+: microoptimized version of
-                * the simpler "(mask & ONEBYTES) * ONEBYTES >> 56"
-                * that works for the bytemasks without having to
-                * mask them first.
-                */
-               /*
-                * return mask * 0x0001020304050608 >> 56;
-                *
-                * Doing it like this avoids warnings on 32-bit machines.
-                */
-               long a = (REPEAT_BYTE(0x01) / 0xff + 1);
-               return mask * a >> (sizeof(long) * 7);
-       } else {
-               /* Carl Chatfield / Jan Achrenius G+ version for 32-bit */
-               /* (000000 0000ff 00ffff ffffff) -> ( 1 1 2 3 ) */
-               long a = (0x0ff0001 + mask) >> 23;
-               /* Fix the 1 for 00 case */
-               return a & mask;
-       }
-}
-
-unsigned long xdl_hash_record(char const **data, char const *top, long flags)
-{
-       unsigned long hash = 5381;
-       unsigned long a = 0, mask = 0;
-       char const *ptr = *data;
-       char const *end = top - sizeof(unsigned long) + 1;
-
-       if (flags & XDF_WHITESPACE_FLAGS)
-               return xdl_hash_record_with_whitespace(data, top, flags);
-
-       ptr -= sizeof(unsigned long);
-       do {
-               hash += hash << 5;
-               hash ^= a;
-               ptr += sizeof(unsigned long);
-               if (ptr >= end)
-                       break;
-               a = *(unsigned long *)ptr;
-               /* Do we have any '\n' bytes in this word? */
-               mask = has_zero(a ^ NEWLINEBYTES);
-       } while (!mask);
-
-       if (ptr >= end) {
-               /*
-                * There is only a partial word left at the end of the
-                * buffer. Because we may work with a memory mapping,
-                * we have to grab the rest byte by byte instead of
-                * blindly reading it.
-                *
-                * To avoid problems with masking in a signed value,
-                * we use an unsigned char here.
-                */
-               const char *p;
-               for (p = top - 1; p >= ptr; p--)
-                       a = (a << 8) + *((const unsigned char *)p);
-               mask = has_zero(a ^ NEWLINEBYTES);
-               if (!mask)
-                       /*
-                        * No '\n' found in the partial word.  Make a
-                        * mask that matches what we read.
-                        */
-                       mask = 1UL << (8 * (top - ptr) + 7);
-       }
-
-       /* The mask *below* the first high bit set */
-       mask = (mask - 1) & ~mask;
-       mask >>= 7;
-       hash += hash << 5;
-       hash ^= a & mask;
-
-       /* Advance past the last (possibly partial) word */
-       ptr += count_masked_bytes(mask);
-
-       if (ptr < top) {
-               assert(*ptr == '\n');
-               ptr++;
-       }
-
-       *data = ptr;
-
-       return hash;
-}
-
-#else /* XDL_FAST_HASH */
-
 unsigned long xdl_hash_record(char const **data, char const *top, long flags) {
        unsigned long ha = 5381;
        char const *ptr = *data;
@@ -384,8 +280,6 @@ unsigned long xdl_hash_record(char const **data, char const *top, long flags) {
        return ha;
 }
 
-#endif /* XDL_FAST_HASH */
-
 unsigned int xdl_hashbits(unsigned int size) {
        unsigned int val = 1, bits = 0;