Merge branch 'bc/object-id'
authorJunio C Hamano <gitster@pobox.com>
Mon, 6 Nov 2017 05:24:27 +0000 (14:24 +0900)
committerJunio C Hamano <gitster@pobox.com>
Mon, 6 Nov 2017 05:24:27 +0000 (14:24 +0900)
Conversion from uchar[20] to struct object_id continues.

* bc/object-id: (25 commits)
  refs/files-backend: convert static functions to object_id
  refs: convert read_raw_ref backends to struct object_id
  refs: convert peel_object to struct object_id
  refs: convert resolve_ref_unsafe to struct object_id
  worktree: convert struct worktree to object_id
  refs: convert resolve_gitlink_ref to struct object_id
  Convert remaining callers of resolve_gitlink_ref to object_id
  sha1_file: convert index_path and index_fd to struct object_id
  refs: convert reflog_expire parameter to struct object_id
  refs: convert read_ref_at to struct object_id
  refs: convert peel_ref to struct object_id
  builtin/pack-objects: convert to struct object_id
  pack-bitmap: convert traverse_bitmap_commit_list to object_id
  refs: convert dwim_log to struct object_id
  builtin/reflog: convert remaining unsigned char uses to object_id
  refs: convert dwim_ref and expand_ref to struct object_id
  refs: convert read_ref and read_ref_full to object_id
  refs: convert resolve_refdup and refs_resolve_refdup to struct object_id
  Convert check_connected to use struct object_id
  refs: update ref transactions to use struct object_id
  ...

103 files changed:
Documentation/RelNotes/2.14.3.txt [new file with mode: 0644]
Documentation/RelNotes/2.15.0.txt
Documentation/RelNotes/2.16.0.txt [new file with mode: 0644]
Documentation/config.txt
Documentation/diff-heuristic-options.txt [deleted file]
Documentation/diff-options.txt
Documentation/git-annotate.txt
Documentation/git-blame.txt
Documentation/git-branch.txt
Documentation/git-checkout.txt
Documentation/git-config.txt
Documentation/git-filter-branch.txt
Documentation/git-merge.txt
Documentation/git-rev-parse.txt
Documentation/merge-options.txt
Documentation/pull-fetch-param.txt
Documentation/rev-list-options.txt
GIT-VERSION-GEN
RelNotes
advice.c
advice.h
apply.c
apply.h
bisect.c
bisect.h
builtin/am.c
builtin/apply.c
builtin/bisect--helper.c
builtin/branch.c
builtin/checkout-index.c
builtin/checkout.c
builtin/clean.c
builtin/clone.c
builtin/commit.c
builtin/describe.c
builtin/diff.c
builtin/difftool.c
builtin/grep.c
builtin/merge-ours.c
builtin/pull.c
builtin/remote.c
builtin/show-branch.c
builtin/submodule--helper.c
builtin/tag.c
cache-tree.c
cache.h
color.c
column.c
config.c
contrib/completion/git-completion.bash
diff.c
diff.h
dir.c
git-bisect.sh
git-filter-branch.sh
git-submodule.sh
lockfile.h
log-tree.c
merge-recursive.c
merge.c
path.c
pathspec.c
po/TEAMS
po/bg.po
po/ca.po
po/de.po
po/es.po [new file with mode: 0644]
po/fr.po
po/git.pot
po/ko.po
po/ru.po
po/sv.po
po/vi.po
po/zh_CN.po
read-cache.c
refs/files-backend.c
revision.c
run-command.c
sequencer.c
sha1_file.c
sha1_name.c
t/helper/test-ref-store.c
t/perf/p4211-line-log.sh
t/t0000-basic.sh
t/t0027-auto-crlf.sh
t/t1404-update-ref-errors.sh
t/t3404-rebase-interactive.sh
t/t3600-rm.sh
t/t3700-add.sh
t/t4015-diff-whitespace.sh
t/t5521-pull-options.sh
t/t6006-rev-list-format.sh
t/t6030-bisect-porcelain.sh
t/t6300-for-each-ref.sh
t/t7004-tag.sh
t/t7006-pager.sh
t/t7061-wtstatus-ignore.sh
t/t7520-ignored-hook-warning.sh [new file with mode: 0755]
tempfile.h
worktree.c
wt-status.c
xdiff-interface.c
xdiff-interface.h

diff --git a/Documentation/RelNotes/2.14.3.txt b/Documentation/RelNotes/2.14.3.txt
new file mode 100644 (file)
index 0000000..977c9e8
--- /dev/null
@@ -0,0 +1,99 @@
+Git v2.14.3 Release Notes
+=========================
+
+Fixes since v2.14.2
+-------------------
+
+ * A helper function to read a single whole line into strbuf
+   mistakenly triggered OOM error at EOF under certain conditions,
+   which has been fixed.
+
+ * In addition to "cc: <a@dd.re.ss> # cruft", "cc: a@dd.re.ss # cruft"
+   was taught to "git send-email" as a valid way to tell it that it
+   needs to also send a carbon copy to <a@dd.re.ss> in the trailer
+   section.
+
+ * Fix regression to "gitk --bisect" by a recent update.
+
+ * Unlike "git commit-tree < file", "git commit-tree -F file" did not
+   pass the contents of the file verbatim and instead completed an
+   incomplete line at the end, if exists.  The latter has been updated
+   to match the behaviour of the former.
+
+ * "git archive", especially when used with pathspec, stored an empty
+   directory in its output, even though Git itself never does so.
+   This has been fixed.
+
+ * API error-proofing which happens to also squelch warnings from GCC.
+
+ * "git gc" tries to avoid running two instances at the same time by
+   reading and writing pid/host from and to a lock file; it used to
+   use an incorrect fscanf() format when reading, which has been
+   corrected.
+
+ * The test linter has been taught that we do not like "echo -e".
+
+ * Code cmp.std.c nitpick.
+
+ * "git describe --match" learned to take multiple patterns in v2.13
+   series, but the feature ignored the patterns after the first one
+   and did not work at all.  This has been fixed.
+
+ * "git cat-file --textconv" started segfaulting recently, which
+   has been corrected.
+
+ * The built-in pattern to detect the "function header" for HTML did
+   not match <H1>..<H6> elements without any attributes, which has
+   been fixed.
+
+ * "git mailinfo" was loose in decoding quoted printable and produced
+   garbage when the two letters after the equal sign are not
+   hexadecimal.  This has been fixed.
+
+ * The documentation for '-X<option>' for merges was misleadingly
+   written to suggest that "-s theirs" exists, which is not the case.
+
+ * Spell the name of our system as "Git" in the output from
+   request-pull script.
+
+ * Fixes for a handful memory access issues identified by valgrind.
+
+ * Backports a moral equivalent of 2015 fix to the poll emulation from
+   the upstream gnulib to fix occasional breakages on HPE NonStop.
+
+ * In the "--format=..." option of the "git for-each-ref" command (and
+   its friends, i.e. the listing mode of "git branch/tag"), "%(atom:)"
+   (e.g. "%(refname:)", "%(body:)" used to error out.  Instead, treat
+   them as if the colon and an empty string that follows it were not
+   there.
+
+ * Users with "color.ui = always" in their configuration were broken
+   by a recent change that made plumbing commands to pay attention to
+   them as the patch created internally by "git add -p" were colored
+   (heh) and made unusable.  This has been fixed.
+
+ * "git branch -M a b" while on a branch that is completely unrelated
+   to either branch a or branch b misbehaved when multiple worktree
+   was in use.  This has been fixed.
+
+ * "git fast-export" with -M/-C option issued "copy" instruction on a
+   path that is simultaneously modified, which was incorrect.
+
+ * The checkpoint command "git fast-import" did not flush updates to
+   refs and marks unless at least one object was created since the
+   last checkpoint, which has been corrected, as these things can
+   happen without any new object getting created.
+
+ * The scripts to drive TravisCI has been reorganized and then an
+   optimization to avoid spending cycles on a branch whose tip is
+   tagged has been implemented.
+
+ * "git fetch <there> <src>:<dst>" allows an object name on the <src>
+   side when the other side accepts such a request since Git v2.5, but
+   the documentation was left stale.
+
+ * A regression in 2.11 that made the code to read the list of
+   alternate object stores overrun the end of the string has been
+   fixed.
+
+Also contains various documentation updates and code clean-ups.
index 748f3c9..248ba70 100644 (file)
@@ -133,7 +133,6 @@ Performance, Internal Implementation, Development Support etc.
  * A helper function to read a single whole line into strbuf
    mistakenly triggered OOM error at EOF under certain conditions,
    which has been fixed.
-   (merge 642956cf45 rs/strbuf-getwholeline-fix later to maint).
 
  * The "ref-store" code reorganization continues.
 
@@ -342,7 +341,6 @@ Fixes since v2.14
    was taught to "git send-email" as a valid way to tell it that it
    needs to also send a carbon copy to <a@dd.re.ss> in the trailer
    section.
-   (merge cc90750677 mm/send-email-cc-cruft later to maint).
 
  * "git branch -M a b" while on a branch that is completely unrelated
    to either branch a or branch b misbehaved when multiple worktree
@@ -356,7 +354,6 @@ Fixes since v2.14
    garbage collection.
 
  * A regression to "gitk --bisect" by a recent update has been fixed.
-   (merge 1d0538e486 mh/packed-ref-store-prep later to maint).
 
  * "git -c submodule.recurse=yes pull" did not work as if the
    "--recurse-submodules" option was given from the command line.
@@ -366,7 +363,6 @@ Fixes since v2.14
    pass the contents of the file verbatim and instead completed an
    incomplete line at the end, if exists.  The latter has been updated
    to match the behaviour of the former.
-   (merge c818e74332 rk/commit-tree-make-F-verbatim later to maint).
 
  * Many codepaths did not diagnose write failures correctly when disks
    go full, due to their misuse of write_in_full() helper function,
@@ -379,10 +375,8 @@ Fixes since v2.14
  * "git archive", especially when used with pathspec, stored an empty
    directory in its output, even though Git itself never does so.
    This has been fixed.
-   (merge 4318094047 rs/archive-excluded-directory later to maint).
 
  * API error-proofing which happens to also squelch warnings from GCC.
-   (merge c788c54cde tg/refs-allowed-flags later to maint).
 
  * The explanation of the cut-line in the commit log editor has been
    slightly tweaked.
@@ -392,7 +386,6 @@ Fixes since v2.14
    reading and writing pid/host from and to a lock file; it used to
    use an incorrect fscanf() format when reading, which has been
    corrected.
-   (merge afe2fab72c aw/gc-lockfile-fscanf-fix later to maint).
 
  * The scripts to drive TravisCI has been reorganized and then an
    optimization to avoid spending cycles on a branch whose tip is
@@ -400,10 +393,8 @@ Fixes since v2.14
    (merge 8376eb4a8f ls/travis-scriptify later to maint).
 
  * The test linter has been taught that we do not like "echo -e".
-   (merge 1a6d46895d tb/test-lint-echo-e later to maint).
 
  * Code cmp.std.c nitpick.
-   (merge ac7da78ede mh/for-each-string-list-item-empty-fix later to maint).
 
  * A regression fix for 2.11 that made the code to read the list of
    alternate object stores overrun the end of the string.
@@ -412,7 +403,6 @@ Fixes since v2.14
  * "git describe --match" learned to take multiple patterns in v2.13
    series, but the feature ignored the patterns after the first one
    and did not work at all.  This has been fixed.
-   (merge da769d2986 jk/describe-omit-some-refs later to maint).
 
  * "git filter-branch" cannot reproduce a history with a tag without
    the tagger field, which only ancient versions of Git allowed to be
@@ -421,17 +411,14 @@ Fixes since v2.14
 
  * "git cat-file --textconv" started segfaulting recently, which
    has been corrected.
-   (merge cc0ea7c9e5 jk/diff-blob later to maint).
 
  * The built-in pattern to detect the "function header" for HTML did
    not match <H1>..<H6> elements without any attributes, which has
    been fixed.
-   (merge 9c03caca2c ik/userdiff-html-h-element-fix later to maint).
 
  * "git mailinfo" was loose in decoding quoted printable and produced
    garbage when the two letters after the equal sign are not
    hexadecimal.  This has been fixed.
-   (merge c8cf423eab rs/mailinfo-qp-decode-fix later to maint).
 
  * The machinery to create xdelta used in pack files received the
    sizes of the data in size_t, but lost the higher bits of them by
@@ -445,7 +432,6 @@ Fixes since v2.14
 
  * The documentation for '-X<option>' for merges was misleadingly
    written to suggest that "-s theirs" exists, which is not the case.
-   (merge c25d98b2a7 jc/merge-x-theirs-docfix later to maint).
 
  * "git fast-export" with -M/-C option issued "copy" instruction on a
    path that is simultaneously modified, which was incorrect.
@@ -471,65 +457,52 @@ Fixes since v2.14
 
  * Spell the name of our system as "Git" in the output from
    request-pull script.
-   (merge e66d7c37a5 ar/request-pull-phrasofix later to maint).
 
  * Fixes for a handful memory access issues identified by valgrind.
-   (merge 2944a94c6b tg/memfixes later to maint).
 
  * Backports a moral equivalent of 2015 fix to the poll() emulation
    from the upstream gnulib to fix occasional breakages on HPE NonStop.
-   (merge 61b2a1acaa rb/compat-poll-fix later to maint).
 
  * Users with "color.ui = always" in their configuration were broken
    by a recent change that made plumbing commands to pay attention to
    them as the patch created internally by "git add -p" were colored
-   (heh) and made unusable.  Fix this regression by redefining
-   'always' to mean the same thing as 'auto'.
-   (merge 6be4595edb jk/ui-color-always-to-auto-maint later to maint).
+   (heh) and made unusable.  This has been fixed by reverting the
+   offending change.
 
  * In the "--format=..." option of the "git for-each-ref" command (and
    its friends, i.e. the listing mode of "git branch/tag"), "%(atom:)"
    (e.g. "%(refname:)", "%(body:)" used to error out.  Instead, treat
    them as if the colon and an empty string that follows it were not
    there.
-   (merge bea4dbeafd tb/ref-filter-empty-modifier later to maint).
 
  * An ancient bug that made Git misbehave with creation/renaming of
    refs has been fixed.
 
+ * "git fetch <there> <src>:<dst>" allows an object name on the <src>
+   side when the other side accepts such a request since Git v2.5, but
+   the documentation was left stale.
+   (merge 83558a412a jc/fetch-refspec-doc-update later to maint).
+
+ * Update the documentation for "git filter-branch" so that the filter
+   options are listed in the same order as they are applied, as
+   described in an earlier part of the doc.
+   (merge 07c4984508 dg/filter-branch-filter-order-doc later to maint).
+
+ * A possible oom error is now caught as a fatal error, instead of
+   continuing and dereferencing NULL.
+   (merge 55d7d15847 ao/path-use-xmalloc later to maint).
+
  * Other minor doc, test and build updates and code cleanups.
    (merge f094b89a4d ma/parse-maybe-bool later to maint).
-   (merge 39b00fa4d4 jk/drop-sha1-entry-pos later to maint).
    (merge 6cdf8a7929 ma/ts-cleanups later to maint).
    (merge 7560f547e6 ma/up-to-date later to maint).
    (merge 0db3dc75f3 rs/apply-epoch later to maint).
-   (merge 74f1bd912b dw/diff-highlight-makefile-fix later to maint).
-   (merge f991761eb8 jk/config-lockfile-leak-fix later to maint).
-   (merge 150efef1e7 ma/pkt-line-leakfix later to maint).
-   (merge 5554451de6 mg/timestamp-t-fix later to maint).
    (merge 276d0e35c0 ma/split-symref-update-fix later to maint).
-   (merge 3bc4b8f7c7 bb/doc-eol-dirty later to maint).
-   (merge c1bb33c99c jk/system-path-cleanup later to maint).
-   (merge ab46e6fc72 cc/subprocess-handshake-missing-capabilities later to maint).
-   (merge f7a32dd97f kd/doc-for-each-ref later to maint).
-   (merge be94568bc7 ez/doc-duplicated-words-fix later to maint).
-   (merge 01e4be6c3d ks/test-readme-phrasofix later to maint).
-   (merge 217bb56d4f hn/typofix later to maint).
-   (merge c08fd6388c jk/doc-read-tree-table-asciidoctor-fix later to maint).
-   (merge c3342b362e ks/doc-use-camelcase-for-config-name later to maint).
-   (merge 0bca165fdb jk/validate-headref-fix later to maint).
-   (merge 93dbefb389 mr/doc-negative-pathspec later to maint).
-   (merge 5e633326e4 ad/doc-markup-fix later to maint).
-   (merge 9ca356fa8b rs/cocci-de-paren-call-params later to maint).
-   (merge 7099153e8d rs/tag-null-pointer-arith-fix later to maint).
-   (merge 0e187d758c rs/run-command-use-alloc-array later to maint).
-   (merge e0222159fa jn/strbuf-doc-re-reuse later to maint).
-   (merge 97487ea11a rs/qsort-s later to maint).
-   (merge a9155c50bd sb/branch-avoid-repeated-strbuf-release later to maint).
    (merge f777623514 ks/branch-tweak-error-message-for-extra-args later to maint).
    (merge 33f3c683ec ks/verify-filename-non-option-error-message-tweak later to maint).
-   (merge b3ea7dd32d jk/sha1-loose-object-info-fix later to maint).
-   (merge 2720f6db5d rs/fsck-null-return-from-lookup later to maint).
-   (merge 99b7b687a6 rs/rs-mailmap later to maint).
-   (merge 7823655082 tb/complete-describe later to maint).
    (merge 7cbbf9d6a2 ls/filter-process-delayed later to maint).
+   (merge 488aa65c8f wk/merge-options-gpg-sign-doc later to maint).
+   (merge e61cb19a27 jc/branch-force-doc-readability-fix later to maint).
+   (merge 32fceba3fd np/config-path-doc later to maint).
+   (merge e38c681fb7 sb/rev-parse-show-superproject-root later to maint).
+   (merge 4f851dc883 sg/rev-list-doc-reorder-fix later to maint).
diff --git a/Documentation/RelNotes/2.16.0.txt b/Documentation/RelNotes/2.16.0.txt
new file mode 100644 (file)
index 0000000..f1dd8c8
--- /dev/null
@@ -0,0 +1,84 @@
+Git 2.16 Release Notes
+======================
+
+Backward compatibility notes and other notable changes.
+
+ * Use of an empty string as a pathspec element that is used for
+   'everything matches' is now an error.
+
+
+Updates since v2.15
+-------------------
+
+UI, Workflows & Features
+
+ * An empty string as a pathspec element that means "everything"
+   i.e. 'git add ""', is now illegal.  We started this by first
+   deprecating and warning a pathspec that has such an element in
+   2.11 (Nov 2016).
+
+
+Performance, Internal Implementation, Development Support etc.
+
+ * An earlier update made it possible to use an on-stack in-core
+   lockfile structure (as opposed to having to deliberately leak an
+   on-heap one).  Many codepaths have been updated to take advantage
+   of this new facility.
+   (merge b74c90fb41 ma/lockfile-fixes later to maint).
+
+ * Calling cmd_foo() as if it is a general purpose helper function is
+   a no-no.  Correct two instances of such to set an example.
+   (merge a92b1095d1 jc/no-cmd-as-subroutine later to maint).
+
+ * We try to see if somebody runs our test suite with a shell that
+   does not support "local" like bash/dash does.
+   (merge 01d3a526ad mh/test-local-canary later to maint).
+
+
+Also contains various documentation updates and code clean-ups.
+
+
+Fixes since v2.15
+-----------------
+
+ * "auto" as a value for the columnar output configuration ought to
+   judge "is the output consumed by humans?" with the same criteria as
+   "auto" for coloured output configuration, i.e. either the standard
+   output stream is going to tty, or a pager is in use.  We forgot the
+   latter, which has been fixed.
+   (merge 965ff23a43 kd/auto-col-with-pager-fix later to maint).
+
+ * The experimental "color moved lines differently in diff output"
+   feature was buggy around "ignore whitespace changes" edges, whihch
+   has been corrected.
+   (merge b66b507292 jk/diff-color-moved-fix later to maint).
+
+ * Instead of using custom line comparison and hashing functions to
+   implement "moved lines" coloring in the diff output, use the pair
+   of these functions from lower-layer xdiff/ code.
+   (merge 01be97c2b2 sb/diff-color-moved-use-xdl-recmatch later to maint).
+
+ * Some codepaths did not check for errors when asking what branch the
+   HEAD points at, which have been fixed.
+   (merge dbd2b55cb7 jk/misc-resolve-ref-unsafe-fixes later to maint).
+
+ * "git commit", after making a commit, did not check for errors when
+   asking on what branch it made the commit, which has been correted.
+   (merge c26de08370 ao/check-resolve-ref-unsafe-result later to maint).
+
+ * "git status --ignored -u" did not stop at a working tree of a
+   separate project that is embedded in an ignored directory and
+   listed files in that other project, instead of just showing the
+   directory itself as ignored.
+   (merge fadb4820c4 js/submodule-in-excluded later to maint).
+
+ * A broken access to object databases in recent update to "git grep
+   --recurse-submodules" has been fixed.
+   (merge 9560e6245a bw/grep-recurse-submodules later to maint).
+
+ * A recent regression in "git rebase -i" that broke execution of git
+   commands from subdirectories via "exec" insn has been fixed.
+   (merge 09d7b6c6fa jk/rebase-i-exec-gitdir-fix later to maint).
+
+ * Other minor doc, test and build updates and code cleanups.
+   (merge bab76141da cn/diff-indent-no-longer-is-experimental later to maint).
index b53c994..5642def 100644 (file)
@@ -351,6 +351,9 @@ advice.*::
        addEmbeddedRepo::
                Advice on what to do when you've accidentally added one
                git repo inside of another.
+       ignoredHook::
+               Advice shown if an hook is ignored because the hook is not
+               set as executable.
 --
 
 core.fileMode::
@@ -1058,10 +1061,10 @@ clean.requireForce::
 
 color.branch::
        A boolean to enable/disable color in the output of
-       linkgit:git-branch[1]. May be set to `false` (or `never`) to
-       disable color entirely, `auto` (or `true` or `always`) in which
-       case colors are used only when the output is to a terminal.  If
-       unset, then the value of `color.ui` is used (`auto` by default).
+       linkgit:git-branch[1]. May be set to `always`,
+       `false` (or `never`) or `auto` (or `true`), in which case colors are used
+       only when the output is to a terminal. If unset, then the
+       value of `color.ui` is used (`auto` by default).
 
 color.branch.<slot>::
        Use customized color for branch coloration. `<slot>` is one of
@@ -1072,11 +1075,12 @@ color.branch.<slot>::
 
 color.diff::
        Whether to use ANSI escape sequences to add color to patches.
-       If this is set to `true` or `auto`, linkgit:git-diff[1],
+       If this is set to `always`, linkgit:git-diff[1],
        linkgit:git-log[1], and linkgit:git-show[1] will use color
-       when output is to the terminal. The value `always` is a
-       historical synonym for `auto`.  If unset, then the value of
-       `color.ui` is used (`auto` by default).
+       for all patches.  If it is set to `true` or `auto`, those
+       commands will only use color when output is to the terminal.
+       If unset, then the value of `color.ui` is used (`auto` by
+       default).
 +
 This does not affect linkgit:git-format-patch[1] or the
 'git-diff-{asterisk}' plumbing commands.  Can be overridden on the
@@ -1140,12 +1144,12 @@ color.grep.<slot>::
 --
 
 color.interactive::
-       When set to `true` or `auto`, use colors for interactive prompts
+       When set to `always`, always use colors for interactive prompts
        and displays (such as those used by "git-add --interactive" and
-       "git-clean --interactive") when the output is to the terminal.
-       When false (or `never`), never show colors. The value `always`
-       is a historical synonym for `auto`.  If unset, then the value of
-       `color.ui` is used (`auto` by default).
+       "git-clean --interactive"). When false (or `never`), never.
+       When set to `true` or `auto`, use colors only when the output is
+       to the terminal. If unset, then the value of `color.ui` is
+       used (`auto` by default).
 
 color.interactive.<slot>::
        Use customized color for 'git add --interactive' and 'git clean
@@ -1192,10 +1196,10 @@ color.ui::
        configuration to set a default for the `--color` option.  Set it
        to `false` or `never` if you prefer Git commands not to use
        color unless enabled explicitly with some other configuration
-       or the `--color` option. Set it to `true` or `auto` to enable
-       color when output is written to the terminal (this is also the
-       default since Git 1.8.4). The value `always` is a historical
-       synonym for `auto`.
+       or the `--color` option. Set it to `always` if you want all
+       output not intended for machine consumption to use color, to
+       `true` or `auto` (this is the default since Git 1.8.4) if you
+       want such output to use color when written to the terminal.
 
 column.ui::
        Specify whether supported commands should output in columns.
diff --git a/Documentation/diff-heuristic-options.txt b/Documentation/diff-heuristic-options.txt
deleted file mode 100644 (file)
index d4f3d95..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
---indent-heuristic::
---no-indent-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 a88c767..dd0dba5 100644 (file)
@@ -63,7 +63,12 @@ ifndef::git-format-patch[]
        Synonym for `-p --raw`.
 endif::git-format-patch[]
 
-include::diff-heuristic-options.txt[]
+--indent-heuristic::
+       Enable the heuristic that shift diff hunk boundaries to make patches
+       easier to read. This is the default.
+
+--no-indent-heuristic::
+       Disable the indent heuristic.
 
 --minimal::
        Spend extra time to make sure the smallest possible
index 94be4b8..05fd482 100644 (file)
@@ -23,7 +23,6 @@ familiar command name for people coming from other SCM systems.
 OPTIONS
 -------
 include::blame-options.txt[]
-include::diff-heuristic-options.txt[]
 
 SEE ALSO
 --------
index fdc3aea..16323eb 100644 (file)
@@ -89,8 +89,6 @@ include::blame-options.txt[]
        abbreviated object name, use <n>+1 digits. Note that 1 column
        is used for a caret to mark the boundary commit.
 
-include::diff-heuristic-options.txt[]
-
 
 THE PORCELAIN FORMAT
 --------------------
index fe029ac..d6587c5 100644 (file)
@@ -104,8 +104,8 @@ OPTIONS
 
 -f::
 --force::
-       Reset <branchname> to <startpoint> if <branchname> exists
-       already. Without `-f` 'git branch' refuses to change an existing branch.
+       Reset <branchname> to <startpoint>, even if <branchname> exists
+       already. Without `-f`, 'git branch' refuses to change an existing branch.
        In combination with `-d` (or `--delete`), allow deleting the
        branch irrespective of its merged status. In combination with
        `-m` (or `--move`), allow renaming the branch even if the new
index bd268a8..e108b0f 100644 (file)
@@ -13,7 +13,8 @@ SYNOPSIS
 'git checkout' [-q] [-f] [-m] [--detach] <commit>
 'git checkout' [-q] [-f] [-m] [[-b|-B|--orphan] <new_branch>] [<start_point>]
 'git checkout' [-f|--ours|--theirs|-m|--conflict=<style>] [<tree-ish>] [--] <paths>...
-'git checkout' [-p|--patch] [<tree-ish>] [--] [<paths>...]
+'git checkout' [<tree-ish>] [--] <pathspec>...
+'git checkout' (-p|--patch) [<tree-ish>] [--] [<paths>...]
 
 DESCRIPTION
 -----------
@@ -78,20 +79,13 @@ be used to detach HEAD at the tip of the branch (`git checkout
 +
 Omitting <branch> detaches HEAD at the tip of the current branch.
 
-'git checkout' [-p|--patch] [<tree-ish>] [--] <pathspec>...::
+'git checkout' [<tree-ish>] [--] <pathspec>...::
 
-       When <paths> or `--patch` are given, 'git checkout' does *not*
-       switch branches.  It updates the named paths in the working tree
-       from the index file or from a named <tree-ish> (most often a
-       commit).  In this case, the `-b` and `--track` options are
-       meaningless and giving either of them results in an error.  The
-       <tree-ish> argument can be used to specify a specific tree-ish
-       (i.e.  commit, tag or tree) to update the index for the given
-       paths before updating the working tree.
-+
-'git checkout' with <paths> or `--patch` is used to restore modified or
-deleted paths to their original contents from the index or replace paths
-with the contents from a named <tree-ish> (most often a commit-ish).
+       Overwrite paths in the working tree by replacing with the
+       contents in the index or in the <tree-ish> (most often a
+       commit).  When a <tree-ish> is given, the paths that
+       match the <pathspec> are updated both in the index and in
+       the working tree.
 +
 The index may contain unmerged entries because of a previous failed merge.
 By default, if you try to check out such an entry from the index, the
@@ -101,6 +95,14 @@ specific side of the merge can be checked out of the index by
 using `--ours` or `--theirs`.  With `-m`, changes made to the working tree
 file can be discarded to re-create the original conflicted merge result.
 
+'git checkout' (-p|--patch) [<tree-ish>] [--] [<pathspec>...]::
+       This is similar to the "check out paths to the working tree
+       from either the index or from a tree-ish" mode described
+       above, but lets you use the interactive interface to show
+       the "diff" output and choose which hunks to use in the
+       result.  See below for the description of `--patch` option.
+
+
 OPTIONS
 -------
 -q::
index 83f86b9..4edd09f 100644 (file)
@@ -174,11 +174,11 @@ See also <<FILES>>.
        either --bool or --int, as described above.
 
 --path::
-       'git-config' will expand leading '{tilde}' to the value of
-       '$HOME', and '{tilde}user' to the home directory for the
+       `git config` will expand a leading `~` to the value of
+       `$HOME`, and `~user` to the home directory for the
        specified user.  This option has no effect when setting the
-       value (but you can use 'git config bla {tilde}/' from the
-       command line to let your shell do the expansion).
+       value (but you can use `git config section.variable ~/`
+       from the command line to let your shell do the expansion).
 
 -z::
 --null::
index bebdcde..3a52e4d 100644 (file)
@@ -8,11 +8,11 @@ git-filter-branch - Rewrite branches
 SYNOPSIS
 --------
 [verse]
-'git filter-branch' [--setup <command>] [--env-filter <command>]
-       [--tree-filter <command>] [--index-filter <command>]
-       [--parent-filter <command>] [--msg-filter <command>]
-       [--commit-filter <command>] [--tag-name-filter <command>]
-       [--subdirectory-filter <directory>] [--prune-empty]
+'git filter-branch' [--setup <command>] [--subdirectory-filter <directory>]
+       [--env-filter <command>] [--tree-filter <command>]
+       [--index-filter <command>] [--parent-filter <command>]
+       [--msg-filter <command>] [--commit-filter <command>]
+       [--tag-name-filter <command>] [--prune-empty]
        [--original <namespace>] [-d <directory>] [-f | --force]
        [--state-branch <branch>] [--] [<rev-list options>...]
 
@@ -89,6 +89,11 @@ OPTIONS
        can be used or modified in the following filter steps except
        the commit filter, for technical reasons.
 
+--subdirectory-filter <directory>::
+       Only look at the history which touches the given subdirectory.
+       The result will contain that directory (and only that) as its
+       project root. Implies <<Remap_to_ancestor>>.
+
 --env-filter <command>::
        This filter may be used if you only need to modify the environment
        in which the commit will be performed.  Specifically, you might
@@ -167,11 +172,6 @@ be removed, buyer beware. There is also no support for changing the
 author or timestamp (or the tag message for that matter). Tags which point
 to other tags will be rewritten to point to the underlying commit.
 
---subdirectory-filter <directory>::
-       Only look at the history which touches the given subdirectory.
-       The result will contain that directory (and only that) as its
-       project root. Implies <<Remap_to_ancestor>>.
-
 --prune-empty::
        Some filters will generate empty commits that leave the tree untouched.
        This option instructs git-filter-branch to remove such commits if they
index 4df6431..d5dfd84 100644 (file)
@@ -64,20 +64,6 @@ OPTIONS
 -------
 include::merge-options.txt[]
 
---signoff::
-       Add Signed-off-by line by the committer at the end of the commit
-       log message.  The meaning of a signoff depends on the project,
-       but it typically certifies that committer has
-       the rights to submit this work under the same license and
-       agrees to a Developer Certificate of Origin
-       (see http://developercertificate.org/ for more information).
-
--S[<keyid>]::
---gpg-sign[=<keyid>]::
-       GPG-sign the resulting merge commit. The `keyid` argument is
-       optional and defaults to the committer identity; if specified,
-       it must be stuck to the option without a space.
-
 -m <msg>::
        Set the commit message to be used for the merge commit (in
        case one is created).
index 0917b82..95326b8 100644 (file)
@@ -264,7 +264,7 @@ print a message to stderr and exit with nonzero status.
 --show-toplevel::
        Show the absolute path of the top-level directory.
 
---show-superproject-working-tree
+--show-superproject-working-tree::
        Show the absolute path of the root of the superproject's
        working tree (if exists) that uses the current repository as
        its submodule.  Outputs nothing if the current repository is
index 4e32304..3888c3f 100644 (file)
@@ -42,6 +42,12 @@ set to `no` at the beginning of them.
        current `HEAD` is already up to date or the merge can be
        resolved as a fast-forward.
 
+-S[<keyid>]::
+--gpg-sign[=<keyid>]::
+       GPG-sign the resulting merge commit. The `keyid` argument is
+       optional and defaults to the committer identity; if specified,
+       it must be stuck to the option without a space.
+
 --log[=<n>]::
 --no-log::
        In addition to branch names, populate the log message with
@@ -51,6 +57,16 @@ set to `no` at the beginning of them.
 With --no-log do not list one-line descriptions from the
 actual commits being merged.
 
+--signoff::
+--no-signoff::
+       Add Signed-off-by line by the committer at the end of the commit
+       log message.  The meaning of a signoff depends on the project,
+       but it typically certifies that committer has
+       the rights to submit this work under the same license and
+       agrees to a Developer Certificate of Origin
+       (see http://developercertificate.org/ for more information).
++
+With --no-signoff do not add a Signed-off-by line.
 
 --stat::
 -n::
index 1ebbf1d..c579793 100644 (file)
@@ -23,9 +23,11 @@ ifdef::git-pull[]
 endif::git-pull[]
 +
 The format of a <refspec> parameter is an optional plus
-`+`, followed by the source ref <src>, followed
+`+`, followed by the source <src>, followed
 by a colon `:`, followed by the destination ref <dst>.
-The colon can be omitted when <dst> is empty.
+The colon can be omitted when <dst> is empty.  <src> is
+typically a ref, but it can also be a fully spelled hex object
+name.
 +
 `tag <tag>` means the same as `refs/tags/<tag>:refs/tags/<tag>`;
 it requests fetching everything up to the given tag.
index 7d860bf..13501e1 100644 (file)
@@ -799,11 +799,11 @@ endif::git-rev-list[]
 
 --parents::
        Print also the parents of the commit (in the form "commit parent...").
-       Also enables parent rewriting, see 'History Simplification' below.
+       Also enables parent rewriting, see 'History Simplification' above.
 
 --children::
        Print also the children of the commit (in the form "commit child...").
-       Also enables parent rewriting, see 'History Simplification' below.
+       Also enables parent rewriting, see 'History Simplification' above.
 
 ifdef::git-rev-list[]
 --timestamp::
@@ -846,7 +846,7 @@ you would get an output like this:
        to be drawn properly.
        Cannot be combined with `--no-walk`.
 +
-This enables parent rewriting, see 'History Simplification' below.
+This enables parent rewriting, see 'History Simplification' above.
 +
 This implies the `--topo-order` option by default, but the
 `--date-order` option may also be specified.
index 0e88e23..a9dbc3f 100755 (executable)
@@ -1,7 +1,7 @@
 #!/bin/sh
 
 GVF=GIT-VERSION-FILE
-DEF_VER=v2.15.0-rc1
+DEF_VER=v2.15.0
 
 LF='
 '
index 80ae7a3..bec73d6 120000 (symlink)
--- a/RelNotes
+++ b/RelNotes
@@ -1 +1 @@
-Documentation/RelNotes/2.15.0.txt
\ No newline at end of file
+Documentation/RelNotes/2.16.0.txt
\ No newline at end of file
index d81e1cb..c6169bc 100644 (file)
--- a/advice.c
+++ b/advice.c
@@ -17,6 +17,7 @@ int advice_set_upstream_failure = 1;
 int advice_object_name_warning = 1;
 int advice_rm_hints = 1;
 int advice_add_embedded_repo = 1;
+int advice_ignored_hook = 1;
 
 static struct {
        const char *name;
@@ -38,6 +39,7 @@ static struct {
        { "objectnamewarning", &advice_object_name_warning },
        { "rmhints", &advice_rm_hints },
        { "addembeddedrepo", &advice_add_embedded_repo },
+       { "ignoredhook", &advice_ignored_hook },
 
        /* make this an alias for backward compatibility */
        { "pushnonfastforward", &advice_push_update_rejected }
index c84a445..f525d6f 100644 (file)
--- a/advice.h
+++ b/advice.h
@@ -19,6 +19,7 @@ extern int advice_set_upstream_failure;
 extern int advice_object_name_warning;
 extern int advice_rm_hints;
 extern int advice_add_embedded_repo;
+extern int advice_ignored_hook;
 
 int git_default_advice_config(const char *var, const char *value);
 __attribute__((format (printf, 1, 2)))
diff --git a/apply.c b/apply.c
index c022af5..d676deb 100644 (file)
--- a/apply.c
+++ b/apply.c
@@ -75,13 +75,10 @@ static int parse_ignorewhitespace_option(struct apply_state *state,
 }
 
 int init_apply_state(struct apply_state *state,
-                    const char *prefix,
-                    struct lock_file *lock_file)
+                    const char *prefix)
 {
        memset(state, 0, sizeof(*state));
        state->prefix = prefix;
-       state->lock_file = lock_file;
-       state->newfd = -1;
        state->apply = 1;
        state->line_termination = '\n';
        state->p_value = 1;
@@ -146,8 +143,6 @@ int check_apply_state(struct apply_state *state, int force_apply)
        }
        if (state->check_index)
                state->unsafe_paths = 0;
-       if (!state->lock_file)
-               return error("BUG: state->lock_file should not be NULL");
 
        if (state->apply_verbosity <= verbosity_silent) {
                state->saved_error_routine = get_error_routine();
@@ -4709,13 +4704,13 @@ static int apply_patch(struct apply_state *state,
                state->apply = 0;
 
        state->update_index = state->check_index && state->apply;
-       if (state->update_index && state->newfd < 0) {
+       if (state->update_index && !is_lock_file_locked(&state->lock_file)) {
                if (state->index_file)
-                       state->newfd = hold_lock_file_for_update(state->lock_file,
-                                                                state->index_file,
-                                                                LOCK_DIE_ON_ERROR);
+                       hold_lock_file_for_update(&state->lock_file,
+                                                 state->index_file,
+                                                 LOCK_DIE_ON_ERROR);
                else
-                       state->newfd = hold_locked_index(state->lock_file, LOCK_DIE_ON_ERROR);
+                       hold_locked_index(&state->lock_file, LOCK_DIE_ON_ERROR);
        }
 
        if (state->check_index && read_apply_cache(state) < 0) {
@@ -4911,22 +4906,18 @@ int apply_all_patches(struct apply_state *state,
        }
 
        if (state->update_index) {
-               res = write_locked_index(&the_index, state->lock_file, COMMIT_LOCK);
+               res = write_locked_index(&the_index, &state->lock_file, COMMIT_LOCK);
                if (res) {
                        error(_("Unable to write new index file"));
                        res = -128;
                        goto end;
                }
-               state->newfd = -1;
        }
 
        res = !!errs;
 
 end:
-       if (state->newfd >= 0) {
-               rollback_lock_file(state->lock_file);
-               state->newfd = -1;
-       }
+       rollback_lock_file(&state->lock_file);
 
        if (state->apply_verbosity <= verbosity_silent) {
                set_error_routine(state->saved_error_routine);
diff --git a/apply.h b/apply.h
index d9b3957..dc4a019 100644 (file)
--- a/apply.h
+++ b/apply.h
@@ -36,9 +36,8 @@ enum apply_verbosity {
 struct apply_state {
        const char *prefix;
 
-       /* These are lock_file related */
-       struct lock_file *lock_file;
-       int newfd;
+       /* Lock file */
+       struct lock_file lock_file;
 
        /* These control what gets looked at and modified */
        int apply; /* this is not a dry-run */
@@ -116,8 +115,7 @@ extern int apply_parse_options(int argc, const char **argv,
                               int *force_apply, int *options,
                               const char * const *apply_usage);
 extern int init_apply_state(struct apply_state *state,
-                           const char *prefix,
-                           struct lock_file *lock_file);
+                           const char *prefix);
 extern void clear_apply_state(struct apply_state *state);
 extern int check_apply_state(struct apply_state *state, int force_apply);
 
index c09f7bb..fda2c4a 100644 (file)
--- a/bisect.c
+++ b/bisect.c
@@ -433,7 +433,12 @@ static int read_bisect_refs(void)
 
 static GIT_PATH_FUNC(git_path_bisect_names, "BISECT_NAMES")
 static GIT_PATH_FUNC(git_path_bisect_expected_rev, "BISECT_EXPECTED_REV")
+static GIT_PATH_FUNC(git_path_bisect_ancestors_ok, "BISECT_ANCESTORS_OK")
+static GIT_PATH_FUNC(git_path_bisect_run, "BISECT_RUN")
+static GIT_PATH_FUNC(git_path_bisect_start, "BISECT_START")
+static GIT_PATH_FUNC(git_path_bisect_log, "BISECT_LOG")
 static GIT_PATH_FUNC(git_path_bisect_terms, "BISECT_TERMS")
+static GIT_PATH_FUNC(git_path_head_name, "head-name")
 
 static void read_bisect_paths(struct argv_array *array)
 {
@@ -1045,3 +1050,40 @@ int estimate_bisect_steps(int all)
 
        return (e < 3 * x) ? n : n - 1;
 }
+
+static int mark_for_removal(const char *refname, const struct object_id *oid,
+                           int flag, void *cb_data)
+{
+       struct string_list *refs = cb_data;
+       char *ref = xstrfmt("refs/bisect%s", refname);
+       string_list_append(refs, ref);
+       return 0;
+}
+
+int bisect_clean_state(void)
+{
+       int result = 0;
+
+       /* There may be some refs packed during bisection */
+       struct string_list refs_for_removal = STRING_LIST_INIT_NODUP;
+       for_each_ref_in("refs/bisect", mark_for_removal, (void *) &refs_for_removal);
+       string_list_append(&refs_for_removal, xstrdup("BISECT_HEAD"));
+       result = delete_refs("bisect: remove", &refs_for_removal, REF_NODEREF);
+       refs_for_removal.strdup_strings = 1;
+       string_list_clear(&refs_for_removal, 0);
+       unlink_or_warn(git_path_bisect_expected_rev());
+       unlink_or_warn(git_path_bisect_ancestors_ok());
+       unlink_or_warn(git_path_bisect_log());
+       unlink_or_warn(git_path_bisect_names());
+       unlink_or_warn(git_path_bisect_run());
+       unlink_or_warn(git_path_bisect_terms());
+       /* Cleanup head-name if it got left by an old version of git-bisect */
+       unlink_or_warn(git_path_head_name());
+       /*
+        * Cleanup BISECT_START last to support the --no-checkout option
+        * introduced in the commit 4796e823a.
+        */
+       unlink_or_warn(git_path_bisect_start());
+
+       return result;
+}
index acd12ef..0ae63d4 100644 (file)
--- a/bisect.h
+++ b/bisect.h
@@ -28,4 +28,6 @@ extern int estimate_bisect_steps(int all);
 
 extern void read_bisect_terms(const char **bad, const char **good);
 
+extern int bisect_clean_state(void);
+
 #endif
index c9bb14a..4b6f153 100644 (file)
@@ -1134,11 +1134,11 @@ static const char *msgnum(const struct am_state *state)
  */
 static void refresh_and_write_cache(void)
 {
-       struct lock_file *lock_file = xcalloc(1, sizeof(struct lock_file));
+       struct lock_file lock_file = LOCK_INIT;
 
-       hold_locked_index(lock_file, LOCK_DIE_ON_ERROR);
+       hold_locked_index(&lock_file, LOCK_DIE_ON_ERROR);
        refresh_cache(REFRESH_QUIET);
-       if (write_locked_index(&the_index, lock_file, COMMIT_LOCK))
+       if (write_locked_index(&the_index, &lock_file, COMMIT_LOCK))
                die(_("unable to write index file"));
 }
 
@@ -1488,11 +1488,10 @@ static int run_apply(const struct am_state *state, const char *index_file)
        struct argv_array apply_opts = ARGV_ARRAY_INIT;
        struct apply_state apply_state;
        int res, opts_left;
-       static struct lock_file lock_file;
        int force_apply = 0;
        int options = 0;
 
-       if (init_apply_state(&apply_state, NULL, &lock_file))
+       if (init_apply_state(&apply_state, NULL))
                die("BUG: init_apply_state() failed");
 
        argv_array_push(&apply_opts, "apply");
@@ -1946,15 +1945,14 @@ next:
  */
 static int fast_forward_to(struct tree *head, struct tree *remote, int reset)
 {
-       struct lock_file *lock_file;
+       struct lock_file lock_file = LOCK_INIT;
        struct unpack_trees_options opts;
        struct tree_desc t[2];
 
        if (parse_tree(head) || parse_tree(remote))
                return -1;
 
-       lock_file = xcalloc(1, sizeof(struct lock_file));
-       hold_locked_index(lock_file, LOCK_DIE_ON_ERROR);
+       hold_locked_index(&lock_file, LOCK_DIE_ON_ERROR);
 
        refresh_cache(REFRESH_QUIET);
 
@@ -1970,11 +1968,11 @@ static int fast_forward_to(struct tree *head, struct tree *remote, int reset)
        init_tree_desc(&t[1], remote->buffer, remote->size);
 
        if (unpack_trees(2, t, &opts)) {
-               rollback_lock_file(lock_file);
+               rollback_lock_file(&lock_file);
                return -1;
        }
 
-       if (write_locked_index(&the_index, lock_file, COMMIT_LOCK))
+       if (write_locked_index(&the_index, &lock_file, COMMIT_LOCK))
                die(_("unable to write new index file"));
 
        return 0;
@@ -1986,15 +1984,14 @@ static int fast_forward_to(struct tree *head, struct tree *remote, int reset)
  */
 static int merge_tree(struct tree *tree)
 {
-       struct lock_file *lock_file;
+       struct lock_file lock_file = LOCK_INIT;
        struct unpack_trees_options opts;
        struct tree_desc t[1];
 
        if (parse_tree(tree))
                return -1;
 
-       lock_file = xcalloc(1, sizeof(struct lock_file));
-       hold_locked_index(lock_file, LOCK_DIE_ON_ERROR);
+       hold_locked_index(&lock_file, LOCK_DIE_ON_ERROR);
 
        memset(&opts, 0, sizeof(opts));
        opts.head_idx = 1;
@@ -2005,11 +2002,11 @@ static int merge_tree(struct tree *tree)
        init_tree_desc(&t[0], tree->buffer, tree->size);
 
        if (unpack_trees(1, t, &opts)) {
-               rollback_lock_file(lock_file);
+               rollback_lock_file(&lock_file);
                return -1;
        }
 
-       if (write_locked_index(&the_index, lock_file, COMMIT_LOCK))
+       if (write_locked_index(&the_index, &lock_file, COMMIT_LOCK))
                die(_("unable to write new index file"));
 
        return 0;
index 81b9a61..48d3989 100644 (file)
@@ -9,8 +9,6 @@ static const char * const apply_usage[] = {
        NULL
 };
 
-static struct lock_file lock_file;
-
 int cmd_apply(int argc, const char **argv, const char *prefix)
 {
        int force_apply = 0;
@@ -18,7 +16,7 @@ int cmd_apply(int argc, const char **argv, const char *prefix)
        int ret;
        struct apply_state state;
 
-       if (init_apply_state(&state, prefix, &lock_file))
+       if (init_apply_state(&state, prefix))
                exit(128);
 
        argc = apply_parse_options(argc, argv,
index 3324229..35d2105 100644 (file)
 #include "cache.h"
 #include "parse-options.h"
 #include "bisect.h"
+#include "refs.h"
+
+static GIT_PATH_FUNC(git_path_bisect_terms, "BISECT_TERMS")
+static GIT_PATH_FUNC(git_path_bisect_expected_rev, "BISECT_EXPECTED_REV")
+static GIT_PATH_FUNC(git_path_bisect_ancestors_ok, "BISECT_ANCESTORS_OK")
 
 static const char * const git_bisect_helper_usage[] = {
        N_("git bisect--helper --next-all [--no-checkout]"),
+       N_("git bisect--helper --write-terms <bad_term> <good_term>"),
+       N_("git bisect--helper --bisect-clean-state"),
        NULL
 };
 
+/*
+ * Check whether the string `term` belongs to the set of strings
+ * included in the variable arguments.
+ */
+LAST_ARG_MUST_BE_NULL
+static int one_of(const char *term, ...)
+{
+       int res = 0;
+       va_list matches;
+       const char *match;
+
+       va_start(matches, term);
+       while (!res && (match = va_arg(matches, const char *)))
+               res = !strcmp(term, match);
+       va_end(matches);
+
+       return res;
+}
+
+static int check_term_format(const char *term, const char *orig_term)
+{
+       int res;
+       char *new_term = xstrfmt("refs/bisect/%s", term);
+
+       res = check_refname_format(new_term, 0);
+       free(new_term);
+
+       if (res)
+               return error(_("'%s' is not a valid term"), term);
+
+       if (one_of(term, "help", "start", "skip", "next", "reset",
+                       "visualize", "replay", "log", "run", "terms", NULL))
+               return error(_("can't use the builtin command '%s' as a term"), term);
+
+       /*
+        * In theory, nothing prevents swapping completely good and bad,
+        * but this situation could be confusing and hasn't been tested
+        * enough. Forbid it for now.
+        */
+
+       if ((strcmp(orig_term, "bad") && one_of(term, "bad", "new", NULL)) ||
+                (strcmp(orig_term, "good") && one_of(term, "good", "old", NULL)))
+               return error(_("can't change the meaning of the term '%s'"), term);
+
+       return 0;
+}
+
+static int write_terms(const char *bad, const char *good)
+{
+       FILE *fp = NULL;
+       int res;
+
+       if (!strcmp(bad, good))
+               return error(_("please use two different terms"));
+
+       if (check_term_format(bad, "bad") || check_term_format(good, "good"))
+               return -1;
+
+       fp = fopen(git_path_bisect_terms(), "w");
+       if (!fp)
+               return error_errno(_("could not open the file BISECT_TERMS"));
+
+       res = fprintf(fp, "%s\n%s\n", bad, good);
+       res |= fclose(fp);
+       return (res < 0) ? -1 : 0;
+}
+
+static int is_expected_rev(const char *expected_hex)
+{
+       struct strbuf actual_hex = STRBUF_INIT;
+       int res = 0;
+       if (strbuf_read_file(&actual_hex, git_path_bisect_expected_rev(), 0) >= 40) {
+               strbuf_trim(&actual_hex);
+               res = !strcmp(actual_hex.buf, expected_hex);
+       }
+       strbuf_release(&actual_hex);
+       return res;
+}
+
+static void check_expected_revs(const char **revs, int rev_nr)
+{
+       int i;
+
+       for (i = 0; i < rev_nr; i++) {
+               if (!is_expected_rev(revs[i])) {
+                       unlink_or_warn(git_path_bisect_ancestors_ok());
+                       unlink_or_warn(git_path_bisect_expected_rev());
+               }
+       }
+}
+
 int cmd_bisect__helper(int argc, const char **argv, const char *prefix)
 {
-       int next_all = 0;
+       enum {
+               NEXT_ALL = 1,
+               WRITE_TERMS,
+               BISECT_CLEAN_STATE,
+               CHECK_EXPECTED_REVS
+       } cmdmode = 0;
        int no_checkout = 0;
        struct option options[] = {
-               OPT_BOOL(0, "next-all", &next_all,
-                        N_("perform 'git bisect next'")),
+               OPT_CMDMODE(0, "next-all", &cmdmode,
+                        N_("perform 'git bisect next'"), NEXT_ALL),
+               OPT_CMDMODE(0, "write-terms", &cmdmode,
+                        N_("write the terms to .git/BISECT_TERMS"), WRITE_TERMS),
+               OPT_CMDMODE(0, "bisect-clean-state", &cmdmode,
+                        N_("cleanup the bisection state"), BISECT_CLEAN_STATE),
+               OPT_CMDMODE(0, "check-expected-revs", &cmdmode,
+                        N_("check for expected revs"), CHECK_EXPECTED_REVS),
                OPT_BOOL(0, "no-checkout", &no_checkout,
                         N_("update BISECT_HEAD instead of checking out the current commit")),
                OPT_END()
@@ -23,9 +132,25 @@ int cmd_bisect__helper(int argc, const char **argv, const char *prefix)
        argc = parse_options(argc, argv, prefix, options,
                             git_bisect_helper_usage, 0);
 
-       if (!next_all)
+       if (!cmdmode)
                usage_with_options(git_bisect_helper_usage, options);
 
-       /* next-all */
-       return bisect_next_all(prefix, no_checkout);
+       switch (cmdmode) {
+       case NEXT_ALL:
+               return bisect_next_all(prefix, no_checkout);
+       case WRITE_TERMS:
+               if (argc != 2)
+                       return error(_("--write-terms requires two arguments"));
+               return write_terms(argv[0], argv[1]);
+       case BISECT_CLEAN_STATE:
+               if (argc != 0)
+                       return error(_("--bisect-clean-state requires no arguments"));
+               return bisect_clean_state();
+       case CHECK_EXPECTED_REVS:
+               check_expected_revs(argv, argc);
+               return 0;
+       default:
+               return error("BUG: unknown subcommand '%d'", cmdmode);
+       }
+       return 0;
 }
index c5f88b5..b1ed649 100644 (file)
@@ -93,7 +93,7 @@ static int git_branch_config(const char *var, const char *value, void *cb)
                        return config_error_nonbool(var);
                return color_parse(value, branch_colors[slot]);
        }
-       return git_default_config(var, value, cb);
+       return git_color_default_config(var, value, cb);
 }
 
 static const char *branch_get_color(enum color_branch ix)
index 39c8be0..b0e78b8 100644 (file)
@@ -129,8 +129,6 @@ static const char * const builtin_checkout_index_usage[] = {
        NULL
 };
 
-static struct lock_file lock_file;
-
 static int option_parse_stage(const struct option *opt,
                              const char *arg, int unset)
 {
@@ -150,7 +148,7 @@ static int option_parse_stage(const struct option *opt,
 int cmd_checkout_index(int argc, const char **argv, const char *prefix)
 {
        int i;
-       int newfd = -1;
+       struct lock_file lock_file = LOCK_INIT;
        int all = 0;
        int read_from_stdin = 0;
        int prefix_length;
@@ -206,7 +204,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, LOCK_DIE_ON_ERROR);
+               hold_locked_index(&lock_file, LOCK_DIE_ON_ERROR);
        }
 
        /* Check out named files first */
@@ -251,7 +249,7 @@ int cmd_checkout_index(int argc, const char **argv, const char *prefix)
        if (all)
                checkout_all(prefix, prefix_length);
 
-       if (0 <= newfd &&
+       if (is_lock_file_locked(&lock_file) &&
            write_locked_index(&the_index, &lock_file, COMMIT_LOCK))
                die("Unable to write new index file");
        return 0;
index 463a337..6c2b4cd 100644 (file)
@@ -247,7 +247,7 @@ static int checkout_paths(const struct checkout_opts *opts,
        struct object_id rev;
        struct commit *head;
        int errs = 0;
-       struct lock_file *lock_file;
+       struct lock_file lock_file = LOCK_INIT;
 
        if (opts->track != BRANCH_TRACK_UNSPECIFIED)
                die(_("'%s' cannot be used with updating paths"), "--track");
@@ -275,9 +275,7 @@ static int checkout_paths(const struct checkout_opts *opts,
                return run_add_interactive(revision, "--patch=checkout",
                                           &opts->pathspec);
 
-       lock_file = xcalloc(1, sizeof(struct lock_file));
-
-       hold_locked_index(lock_file, LOCK_DIE_ON_ERROR);
+       hold_locked_index(&lock_file, LOCK_DIE_ON_ERROR);
        if (read_cache_preload(&opts->pathspec) < 0)
                return error(_("index file corrupt"));
 
@@ -376,7 +374,7 @@ static int checkout_paths(const struct checkout_opts *opts,
        }
        errs |= finish_delayed_checkout(&state);
 
-       if (write_locked_index(&the_index, lock_file, COMMIT_LOCK))
+       if (write_locked_index(&the_index, &lock_file, COMMIT_LOCK))
                die(_("unable to write new index file"));
 
        read_ref_full("HEAD", 0, &rev, NULL);
@@ -472,9 +470,9 @@ static int merge_working_tree(const struct checkout_opts *opts,
                              int *writeout_error)
 {
        int ret;
-       struct lock_file *lock_file = xcalloc(1, sizeof(struct lock_file));
+       struct lock_file lock_file = LOCK_INIT;
 
-       hold_locked_index(lock_file, LOCK_DIE_ON_ERROR);
+       hold_locked_index(&lock_file, LOCK_DIE_ON_ERROR);
        if (read_cache_preload(NULL) < 0)
                return error(_("index file corrupt"));
 
@@ -591,7 +589,7 @@ static int merge_working_tree(const struct checkout_opts *opts,
        if (!cache_tree_fully_valid(active_cache_tree))
                cache_tree_update(&the_index, WRITE_TREE_SILENT | WRITE_TREE_REPAIR);
 
-       if (write_locked_index(&the_index, lock_file, COMMIT_LOCK))
+       if (write_locked_index(&the_index, &lock_file, COMMIT_LOCK))
                die(_("unable to write new index file"));
 
        if (!opts->force && !opts->quiet)
index 733b6d3..189e206 100644 (file)
@@ -126,7 +126,8 @@ static int git_clean_config(const char *var, const char *value, void *cb)
                return 0;
        }
 
-       return git_default_config(var, value, cb);
+       /* inspect the color.ui config variable and others */
+       return git_color_default_config(var, value, cb);
 }
 
 static const char *clean_get_color(enum color_clean ix)
index 695bdd7..cf6eddc 100644 (file)
@@ -706,7 +706,7 @@ static int checkout(int submodule_progress)
 {
        struct object_id oid;
        char *head;
-       struct lock_file *lock_file;
+       struct lock_file lock_file = LOCK_INIT;
        struct unpack_trees_options opts;
        struct tree *tree;
        struct tree_desc t;
@@ -733,8 +733,7 @@ static int checkout(int submodule_progress)
        /* We need to be in the new work tree for the checkout */
        setup_work_tree();
 
-       lock_file = xcalloc(1, sizeof(struct lock_file));
-       hold_locked_index(lock_file, LOCK_DIE_ON_ERROR);
+       hold_locked_index(&lock_file, LOCK_DIE_ON_ERROR);
 
        memset(&opts, 0, sizeof opts);
        opts.update = 1;
@@ -750,7 +749,7 @@ static int checkout(int submodule_progress)
        if (unpack_trees(1, &t, &opts) < 0)
                die(_("unable to checkout working tree"));
 
-       if (write_locked_index(&the_index, lock_file, COMMIT_LOCK))
+       if (write_locked_index(&the_index, &lock_file, COMMIT_LOCK))
                die(_("unable to write new index file"));
 
        err |= run_hook_le(NULL, "post-checkout", sha1_to_hex(null_sha1),
index f9c9676..c38542e 100644 (file)
@@ -355,7 +355,7 @@ static const char *prepare_index(int argc, const char **argv, const char *prefix
 
                refresh_cache_or_die(refresh_flags);
 
-               if (write_locked_index(&the_index, &index_lock, CLOSE_LOCK))
+               if (write_locked_index(&the_index, &index_lock, 0))
                        die(_("unable to create temporary index"));
 
                old_index_env = getenv(INDEX_ENVIRONMENT);
@@ -374,7 +374,7 @@ static const char *prepare_index(int argc, const char **argv, const char *prefix
                if (update_main_cache_tree(WRITE_TREE_SILENT) == 0) {
                        if (reopen_lock_file(&index_lock) < 0)
                                die(_("unable to write index file"));
-                       if (write_locked_index(&the_index, &index_lock, CLOSE_LOCK))
+                       if (write_locked_index(&the_index, &index_lock, 0))
                                die(_("unable to update temporary index"));
                } else
                        warning(_("Failed to update main cache tree"));
@@ -401,7 +401,7 @@ static const char *prepare_index(int argc, const char **argv, const char *prefix
                add_files_to_cache(also ? prefix : NULL, &pathspec, 0);
                refresh_cache_or_die(refresh_flags);
                update_main_cache_tree(WRITE_TREE_SILENT);
-               if (write_locked_index(&the_index, &index_lock, CLOSE_LOCK))
+               if (write_locked_index(&the_index, &index_lock, 0))
                        die(_("unable to write new_index file"));
                commit_style = COMMIT_NORMAL;
                ret = get_lock_file_path(&index_lock);
@@ -474,7 +474,7 @@ static const char *prepare_index(int argc, const char **argv, const char *prefix
        add_remove_files(&partial);
        refresh_cache(REFRESH_QUIET);
        update_main_cache_tree(WRITE_TREE_SILENT);
-       if (write_locked_index(&the_index, &index_lock, CLOSE_LOCK))
+       if (write_locked_index(&the_index, &index_lock, 0))
                die(_("unable to write new_index file"));
 
        hold_lock_file_for_update(&false_lock,
@@ -486,7 +486,7 @@ static const char *prepare_index(int argc, const char **argv, const char *prefix
        add_remove_files(&partial);
        refresh_cache(REFRESH_QUIET);
 
-       if (write_locked_index(&the_index, &false_lock, CLOSE_LOCK))
+       if (write_locked_index(&the_index, &false_lock, 0))
                die(_("unable to write temporary index file"));
 
        discard_cache();
@@ -1492,6 +1492,8 @@ static void print_summary(const char *prefix, const struct object_id *oid,
        diff_setup_done(&rev.diffopt);
 
        head = resolve_ref_unsafe("HEAD", 0, NULL, NULL);
+       if (!head)
+               die_errno(_("unable to resolve HEAD after creating commit"));
        if (!strcmp(head, "HEAD"))
                head = _("detached HEAD");
        else
index 352f882..e14e162 100644 (file)
@@ -7,12 +7,12 @@
 #include "builtin.h"
 #include "exec_cmd.h"
 #include "parse-options.h"
+#include "revision.h"
 #include "diff.h"
 #include "hashmap.h"
 #include "argv-array.h"
 #include "run-command.h"
 
-#define SEEN           (1u << 0)
 #define MAX_TAGS       (FLAG_BITS - 1)
 
 static const char * const describe_usage[] = {
@@ -543,7 +543,9 @@ int cmd_describe(int argc, const char **argv, const char *prefix)
                        }
                } else if (dirty) {
                        static struct lock_file index_lock;
-                       int fd;
+                       struct rev_info revs;
+                       struct argv_array args = ARGV_ARRAY_INIT;
+                       int fd, result;
 
                        read_cache_preload(NULL);
                        refresh_index(&the_index, REFRESH_QUIET|REFRESH_UNMERGED,
@@ -552,8 +554,13 @@ int cmd_describe(int argc, const char **argv, const char *prefix)
                        if (0 <= fd)
                                update_index_if_able(&the_index, &index_lock);
 
-                       if (!cmd_diff_index(ARRAY_SIZE(diff_index_args) - 1,
-                                           diff_index_args, prefix))
+                       init_revisions(&revs, prefix);
+                       argv_array_pushv(&args, diff_index_args);
+                       if (setup_revisions(args.argc, args.argv, &revs, NULL) != 1)
+                               BUG("malformed internal diff-index command line");
+                       result = run_diff_index(&revs, 0);
+
+                       if (!diff_result_code(&revs.diffopt, result))
                                suffix = NULL;
                        else
                                suffix = dirty;
index f5bbd4d..aa6f746 100644 (file)
@@ -203,17 +203,16 @@ static int builtin_diff_combined(struct rev_info *revs,
 
 static void refresh_index_quietly(void)
 {
-       struct lock_file *lock_file;
+       struct lock_file lock_file = LOCK_INIT;
        int fd;
 
-       lock_file = xcalloc(1, sizeof(struct lock_file));
-       fd = hold_locked_index(lock_file, 0);
+       fd = hold_locked_index(&lock_file, 0);
        if (fd < 0)
                return;
        discard_cache();
        read_cache();
        refresh_cache(REFRESH_QUIET|REFRESH_UNMERGED);
-       update_index_if_able(&the_index, lock_file);
+       update_index_if_able(&the_index, &lock_file);
 }
 
 static int builtin_diff_files(struct rev_info *revs, int argc, const char **argv)
index b2d3ba7..bcc79d1 100644 (file)
@@ -616,7 +616,6 @@ static int run_dir_diff(const char *extcmd, int symlinks, const char *prefix,
                        if (hold_lock_file_for_update(&lock, buf.buf, 0) < 0 ||
                            write_locked_index(&wtindex, &lock, COMMIT_LOCK)) {
                                ret = error("could not write %s", buf.buf);
-                               rollback_lock_file(&lock);
                                goto finish;
                        }
                        changed_files(&wt_modified, buf.buf, workdir);
index 19e2394..5a6cfe6 100644 (file)
@@ -275,7 +275,7 @@ static int wait_all(void)
 static int grep_cmd_config(const char *var, const char *value, void *cb)
 {
        int st = grep_config(var, value, cb);
-       if (git_default_config(var, value, cb) < 0)
+       if (git_color_default_config(var, value, cb) < 0)
                st = -1;
 
        if (!strcmp(var, "grep.threads")) {
@@ -431,7 +431,9 @@ static int grep_submodule(struct grep_opt *opt, struct repository *superproject,
         * store is no longer global and instead is a member of the repository
         * object.
         */
+       grep_read_lock();
        add_to_alternates_memory(submodule.objectdir);
+       grep_read_unlock();
 
        if (oid) {
                struct object *object;
index 6844116..beb0623 100644 (file)
@@ -9,26 +9,24 @@
  */
 #include "git-compat-util.h"
 #include "builtin.h"
+#include "diff.h"
 
 static const char builtin_merge_ours_usage[] =
        "git merge-ours <base>... -- HEAD <remote>...";
 
-static const char *diff_index_args[] = {
-       "diff-index", "--quiet", "--cached", "HEAD", "--", NULL
-};
-#define NARGS (ARRAY_SIZE(diff_index_args) - 1)
-
 int cmd_merge_ours(int argc, const char **argv, const char *prefix)
 {
        if (argc == 2 && !strcmp(argv[1], "-h"))
                usage(builtin_merge_ours_usage);
 
        /*
-        * We need to exit with 2 if the index does not match our HEAD tree,
-        * because the current index is what we will be committing as the
-        * merge result.
+        * The contents of the current index becomes the tree we
+        * commit.  The index must match HEAD, or this merge cannot go
+        * through.
         */
-       if (cmd_diff_index(NARGS, diff_index_args, prefix))
+       if (read_cache() < 0)
+               die_errno("read_cache failed");
+       if (index_differs_from("HEAD", 0, 0))
                exit(2);
        exit(0);
 }
index 9b2d67f..a28f0ff 100644 (file)
@@ -86,6 +86,7 @@ static int recurse_submodules = RECURSE_SUBMODULES_DEFAULT;
 static enum rebase_type opt_rebase = -1;
 static char *opt_diffstat;
 static char *opt_log;
+static char *opt_signoff;
 static char *opt_squash;
 static char *opt_commit;
 static char *opt_edit;
@@ -142,6 +143,9 @@ static struct option pull_options[] = {
        OPT_PASSTHRU(0, "log", &opt_log, N_("n"),
                N_("add (at most <n>) entries from shortlog to merge commit message"),
                PARSE_OPT_OPTARG),
+       OPT_PASSTHRU(0, "signoff", &opt_signoff, NULL,
+               N_("add Signed-off-by:"),
+               PARSE_OPT_OPTARG),
        OPT_PASSTHRU(0, "squash", &opt_squash, NULL,
                N_("create a single commit instead of doing a merge"),
                PARSE_OPT_NOARG),
@@ -594,6 +598,8 @@ static int run_merge(void)
                argv_array_push(&args, opt_diffstat);
        if (opt_log)
                argv_array_push(&args, opt_log);
+       if (opt_signoff)
+               argv_array_push(&args, opt_signoff);
        if (opt_squash)
                argv_array_push(&args, opt_squash);
        if (opt_commit)
index 0fddc64..a04ea50 100644 (file)
@@ -565,7 +565,7 @@ static int read_remote_branches(const char *refname,
                item = string_list_append(rename->remote_branches, xstrdup(refname));
                symref = resolve_ref_unsafe(refname, RESOLVE_REF_READING,
                                            NULL, &flag);
-               if (flag & REF_ISSYMREF)
+               if (symref && (flag & REF_ISSYMREF))
                        item->util = xstrdup(symref);
                else
                        item->util = NULL;
index 8bf42e5..2e24b5c 100644 (file)
@@ -554,7 +554,7 @@ static int git_show_branch_config(const char *var, const char *value, void *cb)
                return 0;
        }
 
-       return git_default_config(var, value, cb);
+       return git_color_default_config(var, value, cb);
 }
 
 static int omit_in_dense(struct commit *commit, struct commit **rev, int n)
index 5946a7c..2086f0e 100644 (file)
 #include "remote.h"
 #include "refs.h"
 #include "connect.h"
+#include "revision.h"
+#include "diffcore.h"
+#include "diff.h"
+
+#define OPT_QUIET (1 << 0)
+#define OPT_CACHED (1 << 1)
+#define OPT_RECURSIVE (1 << 2)
+
+typedef void (*each_submodule_fn)(const struct cache_entry *list_item,
+                                 void *cb_data);
 
 static char *get_default_remote(void)
 {
@@ -219,6 +229,64 @@ static int resolve_relative_url_test(int argc, const char **argv, const char *pr
        return 0;
 }
 
+/* the result should be freed by the caller. */
+static char *get_submodule_displaypath(const char *path, const char *prefix)
+{
+       const char *super_prefix = get_super_prefix();
+
+       if (prefix && super_prefix) {
+               BUG("cannot have prefix '%s' and superprefix '%s'",
+                   prefix, super_prefix);
+       } else if (prefix) {
+               struct strbuf sb = STRBUF_INIT;
+               char *displaypath = xstrdup(relative_path(path, prefix, &sb));
+               strbuf_release(&sb);
+               return displaypath;
+       } else if (super_prefix) {
+               return xstrfmt("%s%s", super_prefix, path);
+       } else {
+               return xstrdup(path);
+       }
+}
+
+static char *compute_rev_name(const char *sub_path, const char* object_id)
+{
+       struct strbuf sb = STRBUF_INIT;
+       const char ***d;
+
+       static const char *describe_bare[] = { NULL };
+
+       static const char *describe_tags[] = { "--tags", NULL };
+
+       static const char *describe_contains[] = { "--contains", NULL };
+
+       static const char *describe_all_always[] = { "--all", "--always", NULL };
+
+       static const char **describe_argv[] = { describe_bare, describe_tags,
+                                               describe_contains,
+                                               describe_all_always, NULL };
+
+       for (d = describe_argv; *d; d++) {
+               struct child_process cp = CHILD_PROCESS_INIT;
+               prepare_submodule_repo_env(&cp.env_array);
+               cp.dir = sub_path;
+               cp.git_cmd = 1;
+               cp.no_stderr = 1;
+
+               argv_array_push(&cp.args, "describe");
+               argv_array_pushv(&cp.args, *d);
+               argv_array_push(&cp.args, object_id);
+
+               if (!capture_command(&cp, &sb, 0)) {
+                       strbuf_strip_suffix(&sb, "\n");
+                       return strbuf_detach(&sb, NULL);
+               }
+       }
+
+       strbuf_release(&sb);
+       return NULL;
+}
+
 struct module_list {
        const struct cache_entry **entries;
        int alloc, nr;
@@ -328,21 +396,29 @@ static int module_list(int argc, const char **argv, const char *prefix)
        return 0;
 }
 
-static void init_submodule(const char *path, const char *prefix, int quiet)
+static void for_each_listed_submodule(const struct module_list *list,
+                                     each_submodule_fn fn, void *cb_data)
+{
+       int i;
+       for (i = 0; i < list->nr; i++)
+               fn(list->entries[i], cb_data);
+}
+
+struct init_cb {
+       const char *prefix;
+       unsigned int flags;
+};
+
+#define INIT_CB_INIT { NULL, 0 }
+
+static void init_submodule(const char *path, const char *prefix,
+                          unsigned int flags)
 {
        const struct submodule *sub;
        struct strbuf sb = STRBUF_INIT;
        char *upd = NULL, *url = NULL, *displaypath;
 
-       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);
+       displaypath = get_submodule_displaypath(path, prefix);
 
        sub = submodule_from_path(&null_oid, path);
 
@@ -357,9 +433,9 @@ static void init_submodule(const char *path, const char *prefix, int quiet)
         * Set active flag for the submodule being initialized
         */
        if (!is_submodule_active(the_repository, path)) {
-               strbuf_reset(&sb);
                strbuf_addf(&sb, "submodule.%s.active", sub->name);
                git_config_set_gently(sb.buf, "true");
+               strbuf_reset(&sb);
        }
 
        /*
@@ -367,7 +443,6 @@ static void init_submodule(const char *path, const char *prefix, int quiet)
         * To look up the url in .git/config, we must not fall back to
         * .gitmodules, so look it up directly.
         */
-       strbuf_reset(&sb);
        strbuf_addf(&sb, "submodule.%s.url", sub->name);
        if (git_config_get_string(sb.buf, &url)) {
                if (!sub->url)
@@ -399,14 +474,14 @@ static void init_submodule(const char *path, const char *prefix, int quiet)
                if (git_config_set_gently(sb.buf, url))
                        die(_("Failed to register url for submodule path '%s'"),
                            displaypath);
-               if (!quiet)
+               if (!(flags & OPT_QUIET))
                        fprintf(stderr,
                                _("Submodule '%s' (%s) registered for path '%s'\n"),
                                sub->name, url, displaypath);
        }
+       strbuf_reset(&sb);
 
        /* Copy "update" setting when it is not set yet */
-       strbuf_reset(&sb);
        strbuf_addf(&sb, "submodule.%s.update", sub->name);
        if (git_config_get_string(sb.buf, &upd) &&
            sub->update_strategy.type != SM_UPDATE_UNSPECIFIED) {
@@ -426,12 +501,18 @@ static void init_submodule(const char *path, const char *prefix, int quiet)
        free(upd);
 }
 
+static void init_submodule_cb(const struct cache_entry *list_item, void *cb_data)
+{
+       struct init_cb *info = cb_data;
+       init_submodule(list_item->name, info->prefix, info->flags);
+}
+
 static int module_init(int argc, const char **argv, const char *prefix)
 {
+       struct init_cb info = INIT_CB_INIT;
        struct pathspec pathspec;
        struct module_list list = MODULE_LIST_INIT;
        int quiet = 0;
-       int i;
 
        struct option module_init_options[] = {
                OPT__QUIET(&quiet, N_("Suppress output for initializing a submodule")),
@@ -456,8 +537,165 @@ static int module_init(int argc, const char **argv, const char *prefix)
        if (!argc && git_config_get_value_multi("submodule.active"))
                module_list_active(&list);
 
-       for (i = 0; i < list.nr; i++)
-               init_submodule(list.entries[i]->name, prefix, quiet);
+       info.prefix = prefix;
+       if (quiet)
+               info.flags |= OPT_QUIET;
+
+       for_each_listed_submodule(&list, init_submodule_cb, &info);
+
+       return 0;
+}
+
+struct status_cb {
+       const char *prefix;
+       unsigned int flags;
+};
+
+#define STATUS_CB_INIT { NULL, 0 }
+
+static void print_status(unsigned int flags, char state, const char *path,
+                        const struct object_id *oid, const char *displaypath)
+{
+       if (flags & OPT_QUIET)
+               return;
+
+       printf("%c%s %s", state, oid_to_hex(oid), displaypath);
+
+       if (state == ' ' || state == '+')
+               printf(" (%s)", compute_rev_name(path, oid_to_hex(oid)));
+
+       printf("\n");
+}
+
+static int handle_submodule_head_ref(const char *refname,
+                                    const struct object_id *oid, int flags,
+                                    void *cb_data)
+{
+       struct object_id *output = cb_data;
+       if (oid)
+               oidcpy(output, oid);
+
+       return 0;
+}
+
+static void status_submodule(const char *path, const struct object_id *ce_oid,
+                            unsigned int ce_flags, const char *prefix,
+                            unsigned int flags)
+{
+       char *displaypath;
+       struct argv_array diff_files_args = ARGV_ARRAY_INIT;
+       struct rev_info rev;
+       int diff_files_result;
+
+       if (!submodule_from_path(&null_oid, path))
+               die(_("no submodule mapping found in .gitmodules for path '%s'"),
+                     path);
+
+       displaypath = get_submodule_displaypath(path, prefix);
+
+       if ((CE_STAGEMASK & ce_flags) >> CE_STAGESHIFT) {
+               print_status(flags, 'U', path, &null_oid, displaypath);
+               goto cleanup;
+       }
+
+       if (!is_submodule_active(the_repository, path)) {
+               print_status(flags, '-', path, ce_oid, displaypath);
+               goto cleanup;
+       }
+
+       argv_array_pushl(&diff_files_args, "diff-files",
+                        "--ignore-submodules=dirty", "--quiet", "--",
+                        path, NULL);
+
+       git_config(git_diff_basic_config, NULL);
+       init_revisions(&rev, prefix);
+       rev.abbrev = 0;
+       diff_files_args.argc = setup_revisions(diff_files_args.argc,
+                                              diff_files_args.argv,
+                                              &rev, NULL);
+       diff_files_result = run_diff_files(&rev, 0);
+
+       if (!diff_result_code(&rev.diffopt, diff_files_result)) {
+               print_status(flags, ' ', path, ce_oid,
+                            displaypath);
+       } else if (!(flags & OPT_CACHED)) {
+               struct object_id oid;
+
+               if (refs_head_ref(get_submodule_ref_store(path),
+                                 handle_submodule_head_ref, &oid))
+                       die(_("could not resolve HEAD ref inside the"
+                             "submodule '%s'"), path);
+
+               print_status(flags, '+', path, &oid, displaypath);
+       } else {
+               print_status(flags, '+', path, ce_oid, displaypath);
+       }
+
+       if (flags & OPT_RECURSIVE) {
+               struct child_process cpr = CHILD_PROCESS_INIT;
+
+               cpr.git_cmd = 1;
+               cpr.dir = path;
+               prepare_submodule_repo_env(&cpr.env_array);
+
+               argv_array_push(&cpr.args, "--super-prefix");
+               argv_array_pushf(&cpr.args, "%s/", displaypath);
+               argv_array_pushl(&cpr.args, "submodule--helper", "status",
+                                "--recursive", NULL);
+
+               if (flags & OPT_CACHED)
+                       argv_array_push(&cpr.args, "--cached");
+
+               if (flags & OPT_QUIET)
+                       argv_array_push(&cpr.args, "--quiet");
+
+               if (run_command(&cpr))
+                       die(_("failed to recurse into submodule '%s'"), path);
+       }
+
+cleanup:
+       argv_array_clear(&diff_files_args);
+       free(displaypath);
+}
+
+static void status_submodule_cb(const struct cache_entry *list_item,
+                               void *cb_data)
+{
+       struct status_cb *info = cb_data;
+       status_submodule(list_item->name, &list_item->oid, list_item->ce_flags,
+                        info->prefix, info->flags);
+}
+
+static int module_status(int argc, const char **argv, const char *prefix)
+{
+       struct status_cb info = STATUS_CB_INIT;
+       struct pathspec pathspec;
+       struct module_list list = MODULE_LIST_INIT;
+       int quiet = 0;
+
+       struct option module_status_options[] = {
+               OPT__QUIET(&quiet, N_("Suppress submodule status output")),
+               OPT_BIT(0, "cached", &info.flags, N_("Use commit stored in the index instead of the one stored in the submodule HEAD"), OPT_CACHED),
+               OPT_BIT(0, "recursive", &info.flags, N_("recurse into nested submodules"), OPT_RECURSIVE),
+               OPT_END()
+       };
+
+       const char *const git_submodule_helper_usage[] = {
+               N_("git submodule status [--quiet] [--cached] [--recursive] [<path>...]"),
+               NULL
+       };
+
+       argc = parse_options(argc, argv, prefix, module_status_options,
+                            git_submodule_helper_usage, 0);
+
+       if (module_list_compute(argc, argv, prefix, &pathspec, &list) < 0)
+               return 1;
+
+       info.prefix = prefix;
+       if (quiet)
+               info.flags |= OPT_QUIET;
+
+       for_each_listed_submodule(&list, status_submodule_cb, &info);
 
        return 0;
 }
@@ -1259,6 +1497,7 @@ static struct cmd_struct commands[] = {
        {"resolve-relative-url", resolve_relative_url, 0},
        {"resolve-relative-url-test", resolve_relative_url_test, 0},
        {"init", module_init, SUPPORT_SUPER_PREFIX},
+       {"status", module_status, SUPPORT_SUPER_PREFIX},
        {"remote-branch", resolve_remote_submodule_branch, 0},
        {"push-check", push_check, 0},
        {"absorb-git-dirs", absorb_git_dirs, SUPPORT_SUPER_PREFIX},
index 8c458b9..a7e6a5b 100644 (file)
@@ -158,7 +158,7 @@ static int git_tag_config(const char *var, const char *value, void *cb)
 
        if (starts_with(var, "column."))
                return git_column_config(var, value, "tag", &colopts);
-       return git_default_config(var, value, cb);
+       return git_color_default_config(var, value, cb);
 }
 
 static void write_tag_body(int fd, const struct object_id *oid)
index d3f7401..e03e72c 100644 (file)
@@ -602,11 +602,11 @@ static struct cache_tree *cache_tree_find(struct cache_tree *it, const char *pat
 
 int write_index_as_tree(unsigned char *sha1, struct index_state *index_state, const char *index_path, int flags, const char *prefix)
 {
-       int entries, was_valid, newfd;
+       int entries, was_valid;
        struct lock_file lock_file = LOCK_INIT;
        int ret = 0;
 
-       newfd = hold_lock_file_for_update(&lock_file, index_path, LOCK_DIE_ON_ERROR);
+       hold_lock_file_for_update(&lock_file, index_path, LOCK_DIE_ON_ERROR);
 
        entries = read_index_from(index_state, index_path);
        if (entries < 0) {
@@ -625,10 +625,7 @@ int write_index_as_tree(unsigned char *sha1, struct index_state *index_state, co
                        ret = WRITE_TREE_UNMERGED_INDEX;
                        goto out;
                }
-               if (0 <= newfd) {
-                       if (!write_locked_index(index_state, &lock_file, COMMIT_LOCK))
-                               newfd = -1;
-               }
+               write_locked_index(index_state, &lock_file, COMMIT_LOCK);
                /* Not being able to write is fine -- we are only interested
                 * in updating the cache-tree part, and if the next caller
                 * ends up using the old index with unupdated cache-tree part
@@ -650,8 +647,7 @@ int write_index_as_tree(unsigned char *sha1, struct index_state *index_state, co
                hashcpy(sha1, index_state->cache_tree->oid.hash);
 
 out:
-       if (0 <= newfd)
-               rollback_lock_file(&lock_file);
+       rollback_lock_file(&lock_file);
        return ret;
 }
 
diff --git a/cache.h b/cache.h
index 6440e2b..d74f00d 100644 (file)
--- a/cache.h
+++ b/cache.h
@@ -602,9 +602,28 @@ extern int do_read_index(struct index_state *istate, const char *path,
 extern int read_index_from(struct index_state *, const char *path);
 extern int is_index_unborn(struct index_state *);
 extern int read_index_unmerged(struct index_state *);
+
+/* For use with `write_locked_index()`. */
 #define COMMIT_LOCK            (1 << 0)
-#define CLOSE_LOCK             (1 << 1)
+
+/*
+ * Write the index while holding an already-taken lock. Close the lock,
+ * and if `COMMIT_LOCK` is given, commit it.
+ *
+ * Unless a split index is in use, write the index into the lockfile.
+ *
+ * With a split index, write the shared index to a temporary file,
+ * adjust its permissions and rename it into place, then write the
+ * split index to the lockfile. If the temporary file for the shared
+ * index cannot be created, fall back to the behavior described in
+ * the previous paragraph.
+ *
+ * With `COMMIT_LOCK`, the lock is always committed or rolled back.
+ * Without it, the lock is closed, but neither committed nor rolled
+ * back.
+ */
 extern int write_locked_index(struct index_state *, struct lock_file *lock, unsigned flags);
+
 extern int discard_index(struct index_state *);
 extern void move_index_extensions(struct index_state *dst, struct index_state *src);
 extern int unmerged_index(const struct index_state *);
@@ -716,6 +735,10 @@ extern void fill_stat_cache_info(struct cache_entry *ce, struct stat *st);
 extern int refresh_index(struct index_state *, unsigned int flags, const struct pathspec *pathspec, char *seen, const char *header_msg);
 extern struct cache_entry *refresh_cache_entry(struct cache_entry *, unsigned int);
 
+/*
+ * Opportunistically update the index but do not complain if we can't.
+ * The lockfile is always committed or rolled back.
+ */
 extern void update_index_if_able(struct index_state *, struct lock_file *);
 
 extern int hold_locked_index(struct lock_file *, int);
diff --git a/color.c b/color.c
index 9c0dc82..9a9261a 100644 (file)
--- a/color.c
+++ b/color.c
@@ -308,7 +308,7 @@ int git_config_colorbool(const char *var, const char *value)
                if (!strcasecmp(value, "never"))
                        return 0;
                if (!strcasecmp(value, "always"))
-                       return var ? GIT_COLOR_AUTO : 1;
+                       return 1;
                if (!strcasecmp(value, "auto"))
                        return GIT_COLOR_AUTO;
        }
@@ -368,6 +368,14 @@ int git_color_config(const char *var, const char *value, void *cb)
        return 0;
 }
 
+int git_color_default_config(const char *var, const char *value, void *cb)
+{
+       if (git_color_config(var, value, cb) < 0)
+               return -1;
+
+       return git_default_config(var, value, cb);
+}
+
 void color_print_strbuf(FILE *fp, const char *color, const struct strbuf *sb)
 {
        if (*color)
index ff7bdab..49ab85b 100644 (file)
--- a/column.c
+++ b/column.c
@@ -224,7 +224,7 @@ int finalize_colopts(unsigned int *colopts, int stdout_is_tty)
                if (stdout_is_tty < 0)
                        stdout_is_tty = isatty(1);
                *colopts &= ~COL_ENABLE_MASK;
-               if (stdout_is_tty)
+               if (stdout_is_tty || pager_in_use())
                        *colopts |= COL_ENABLED;
        }
        return 0;
index 4831c12..903abf9 100644 (file)
--- a/config.c
+++ b/config.c
@@ -16,7 +16,6 @@
 #include "string-list.h"
 #include "utf8.h"
 #include "dir.h"
-#include "color.h"
 
 struct config_source {
        struct config_source *prev;
@@ -1351,9 +1350,6 @@ int git_default_config(const char *var, const char *value, void *dummy)
        if (starts_with(var, "advice."))
                return git_default_advice_config(var, value);
 
-       if (git_color_config(var, value, dummy) < 0)
-               return -1;
-
        if (!strcmp(var, "pager.color") || !strcmp(var, "color.pager")) {
                pager_use_color = git_config_bool(var,value);
                return 0;
@@ -2755,7 +2751,7 @@ static int git_config_copy_or_rename_section_in_file(const char *config_filename
 {
        int ret = 0, remove = 0;
        char *filename_buf = NULL;
-       struct lock_file *lock;
+       struct lock_file lock = LOCK_INIT;
        int out_fd;
        char buf[1024];
        FILE *config_file = NULL;
@@ -2770,8 +2766,7 @@ static int git_config_copy_or_rename_section_in_file(const char *config_filename
        if (!config_filename)
                config_filename = filename_buf = git_pathdup("config");
 
-       lock = xcalloc(1, sizeof(struct lock_file));
-       out_fd = hold_lock_file_for_update(lock, config_filename, 0);
+       out_fd = hold_lock_file_for_update(&lock, config_filename, 0);
        if (out_fd < 0) {
                ret = error("could not lock config file %s", config_filename);
                goto out;
@@ -2790,9 +2785,9 @@ static int git_config_copy_or_rename_section_in_file(const char *config_filename
                goto out;
        }
 
-       if (chmod(get_lock_file_path(lock), st.st_mode & 07777) < 0) {
+       if (chmod(get_lock_file_path(&lock), st.st_mode & 07777) < 0) {
                ret = error_errno("chmod on %s failed",
-                                 get_lock_file_path(lock));
+                                 get_lock_file_path(&lock));
                goto out;
        }
 
@@ -2816,7 +2811,7 @@ static int git_config_copy_or_rename_section_in_file(const char *config_filename
                         */
                        if (copystr.len > 0) {
                                if (write_in_full(out_fd, copystr.buf, copystr.len) != copystr.len) {
-                                       ret = write_error(get_lock_file_path(lock));
+                                       ret = write_error(get_lock_file_path(&lock));
                                        goto out;
                                }
                                strbuf_reset(&copystr);
@@ -2832,7 +2827,7 @@ static int git_config_copy_or_rename_section_in_file(const char *config_filename
                                store.baselen = strlen(new_name);
                                if (!copy) {
                                        if (write_section(out_fd, new_name) < 0) {
-                                               ret = write_error(get_lock_file_path(lock));
+                                               ret = write_error(get_lock_file_path(&lock));
                                                goto out;
                                        }
                                        /*
@@ -2866,7 +2861,7 @@ static int git_config_copy_or_rename_section_in_file(const char *config_filename
                }
 
                if (write_in_full(out_fd, output, length) < 0) {
-                       ret = write_error(get_lock_file_path(lock));
+                       ret = write_error(get_lock_file_path(&lock));
                        goto out;
                }
        }
@@ -2878,7 +2873,7 @@ static int git_config_copy_or_rename_section_in_file(const char *config_filename
         */
        if (copystr.len > 0) {
                if (write_in_full(out_fd, copystr.buf, copystr.len) != copystr.len) {
-                       ret = write_error(get_lock_file_path(lock));
+                       ret = write_error(get_lock_file_path(&lock));
                        goto out;
                }
                strbuf_reset(&copystr);
@@ -2887,13 +2882,13 @@ static int git_config_copy_or_rename_section_in_file(const char *config_filename
        fclose(config_file);
        config_file = NULL;
 commit_and_out:
-       if (commit_lock_file(lock) < 0)
+       if (commit_lock_file(&lock) < 0)
                ret = error_errno("could not write config file %s",
                                  config_filename);
 out:
        if (config_file)
                fclose(config_file);
-       rollback_lock_file(lock);
+       rollback_lock_file(&lock);
 out_no_rollback:
        free(filename_buf);
        return ret;
index 0e16f01..fcd8331 100644 (file)
@@ -2350,6 +2350,7 @@ _git_config ()
                advice.rmHints
                advice.statusHints
                advice.statusUoption
+               advice.ignoredHook
                alias.
                am.keepcr
                am.threeWay
diff --git a/diff.c b/diff.c
index 69f0357..e6814b9 100644 (file)
--- a/diff.c
+++ b/diff.c
@@ -358,6 +358,9 @@ int git_diff_ui_config(const char *var, const char *value, void *cb)
                return 0;
        }
 
+       if (git_color_config(var, value, cb) < 0)
+               return -1;
+
        return git_diff_basic_config(var, value, cb);
 }
 
@@ -704,81 +707,14 @@ struct moved_entry {
        struct moved_entry *next_line;
 };
 
-static int next_byte(const char **cp, const char **endp,
-                    const struct diff_options *diffopt)
-{
-       int retval;
-
-       if (*cp > *endp)
-               return -1;
-
-       if (DIFF_XDL_TST(diffopt, IGNORE_WHITESPACE_CHANGE)) {
-               while (*cp < *endp && isspace(**cp))
-                       (*cp)++;
-               /*
-                * After skipping a couple of whitespaces, we still have to
-                * account for one space.
-                */
-               return (int)' ';
-       }
-
-       if (DIFF_XDL_TST(diffopt, IGNORE_WHITESPACE)) {
-               while (*cp < *endp && isspace(**cp))
-                       (*cp)++;
-               /* return the first non-ws character via the usual below */
-       }
-
-       retval = (unsigned char)(**cp);
-       (*cp)++;
-       return retval;
-}
-
 static int moved_entry_cmp(const struct diff_options *diffopt,
                           const struct moved_entry *a,
                           const struct moved_entry *b,
                           const void *keydata)
 {
-       const char *ap = a->es->line, *ae = a->es->line + a->es->len;
-       const char *bp = b->es->line, *be = b->es->line + b->es->len;
-
-       if (!(diffopt->xdl_opts & XDF_WHITESPACE_FLAGS))
-               return a->es->len != b->es->len  || memcmp(ap, bp, a->es->len);
-
-       if (DIFF_XDL_TST(diffopt, IGNORE_WHITESPACE_AT_EOL)) {
-               while (ae > ap && isspace(*ae))
-                       ae--;
-               while (be > bp && isspace(*be))
-                       be--;
-       }
-
-       while (1) {
-               int ca, cb;
-               ca = next_byte(&ap, &ae, diffopt);
-               cb = next_byte(&bp, &be, diffopt);
-               if (ca != cb)
-                       return 1;
-               if (ca < 0)
-                       return 0;
-       }
-}
-
-static unsigned get_string_hash(struct emitted_diff_symbol *es, struct diff_options *o)
-{
-       if (o->xdl_opts & XDF_WHITESPACE_FLAGS) {
-               static struct strbuf sb = STRBUF_INIT;
-               const char *ap = es->line, *ae = es->line + es->len;
-               int c;
-
-               strbuf_reset(&sb);
-               while (ae > ap && isspace(*ae))
-                       ae--;
-               while ((c = next_byte(&ap, &ae, o)) > 0)
-                       strbuf_addch(&sb, c);
-
-               return memhash(sb.buf, sb.len);
-       } else {
-               return memhash(es->line, es->len);
-       }
+       return !xdiff_compare_lines(a->es->line, a->es->len,
+                                   b->es->line, b->es->len,
+                                   diffopt->xdl_opts);
 }
 
 static struct moved_entry *prepare_entry(struct diff_options *o,
@@ -787,7 +723,7 @@ static struct moved_entry *prepare_entry(struct diff_options *o,
        struct moved_entry *ret = xmalloc(sizeof(*ret));
        struct emitted_diff_symbol *l = &o->emitted_symbols->buf[line_no];
 
-       ret->ent.hash = get_string_hash(l, o);
+       ret->ent.hash = xdiff_hash_string(l->line, l->len, o->xdl_opts);
        ret->es = l;
        ret->next_line = NULL;
 
diff --git a/diff.h b/diff.h
index aca150b..398b87b 100644 (file)
--- a/diff.h
+++ b/diff.h
@@ -180,6 +180,7 @@ struct diff_options {
        pathchange_fn_t pathchange;
        change_fn_t change;
        add_remove_fn_t add_remove;
+       void *change_fn_data;
        diff_format_fn_t format_callback;
        void *format_callback_data;
        diff_prefix_fn_t output_prefix;
diff --git a/dir.c b/dir.c
index f09a31e..fc2bdc7 100644 (file)
--- a/dir.c
+++ b/dir.c
@@ -1392,7 +1392,7 @@ static enum path_treatment treat_directory(struct dir_struct *dir,
                if (!(dir->flags & DIR_NO_GITLINKS)) {
                        struct object_id oid;
                        if (resolve_gitlink_ref(dirname, "HEAD", &oid) == 0)
-                               return path_untracked;
+                               return exclude ? path_excluded : path_untracked;
                }
                return path_recurse;
        }
index ae3cb01..0138a88 100755 (executable)
@@ -186,7 +186,7 @@ bisect_start() {
        #
        # Get rid of any old bisect state.
        #
-       bisect_clean_state || exit
+       git bisect--helper --bisect-clean-state || exit
 
        #
        # Change state.
@@ -195,7 +195,7 @@ bisect_start() {
        # We have to trap this to be able to clean up using
        # "bisect_clean_state".
        #
-       trap 'bisect_clean_state' 0
+       trap 'git bisect--helper --bisect-clean-state' 0
        trap 'exit 255' 1 2 3 15
 
        #
@@ -209,7 +209,7 @@ bisect_start() {
        eval "$eval true" &&
        if test $must_write_terms -eq 1
        then
-               write_terms "$TERM_BAD" "$TERM_GOOD"
+               git bisect--helper --write-terms "$TERM_BAD" "$TERM_GOOD" || exit
        fi &&
        echo "git bisect start$orig_args" >>"$GIT_DIR/BISECT_LOG" || exit
        #
@@ -237,22 +237,6 @@ bisect_write() {
        test -n "$nolog" || echo "git bisect $state $rev" >>"$GIT_DIR/BISECT_LOG"
 }
 
-is_expected_rev() {
-       test -f "$GIT_DIR/BISECT_EXPECTED_REV" &&
-       test "$1" = $(cat "$GIT_DIR/BISECT_EXPECTED_REV")
-}
-
-check_expected_revs() {
-       for _rev in "$@"; do
-               if ! is_expected_rev "$_rev"
-               then
-                       rm -f "$GIT_DIR/BISECT_ANCESTORS_OK"
-                       rm -f "$GIT_DIR/BISECT_EXPECTED_REV"
-                       return
-               fi
-       done
-}
-
 bisect_skip() {
        all=''
        for arg in "$@"
@@ -280,7 +264,7 @@ bisect_state() {
                rev=$(git rev-parse --verify "$bisected_head") ||
                        die "$(eval_gettext "Bad rev input: \$bisected_head")"
                bisect_write "$state" "$rev"
-               check_expected_revs "$rev" ;;
+               git bisect--helper --check-expected-revs "$rev" ;;
        2,"$TERM_BAD"|*,"$TERM_GOOD"|*,skip)
                shift
                hash_list=''
@@ -294,7 +278,7 @@ bisect_state() {
                do
                        bisect_write "$state" "$rev"
                done
-               check_expected_revs $hash_list ;;
+               git bisect--helper --check-expected-revs $hash_list ;;
        *,"$TERM_BAD")
                die "$(eval_gettext "'git bisect \$TERM_BAD' can take only one argument.")" ;;
        *)
@@ -430,27 +414,7 @@ bisect_reset() {
                die "$(eval_gettext "Could not check out original HEAD '\$branch'.
 Try 'git bisect reset <commit>'.")"
        fi
-       bisect_clean_state
-}
-
-bisect_clean_state() {
-       # There may be some refs packed during bisection.
-       git for-each-ref --format='%(refname) %(objectname)' refs/bisect/\* |
-       while read ref hash
-       do
-               git update-ref -d $ref $hash || exit
-       done
-       rm -f "$GIT_DIR/BISECT_EXPECTED_REV" &&
-       rm -f "$GIT_DIR/BISECT_ANCESTORS_OK" &&
-       rm -f "$GIT_DIR/BISECT_LOG" &&
-       rm -f "$GIT_DIR/BISECT_NAMES" &&
-       rm -f "$GIT_DIR/BISECT_RUN" &&
-       rm -f "$GIT_DIR/BISECT_TERMS" &&
-       # Cleanup head-name if it got left by an old version of git-bisect
-       rm -f "$GIT_DIR/head-name" &&
-       git update-ref -d --no-deref BISECT_HEAD &&
-       # clean up BISECT_START last
-       rm -f "$GIT_DIR/BISECT_START"
+       git bisect--helper --bisect-clean-state || exit
 }
 
 bisect_replay () {
@@ -557,45 +521,6 @@ get_terms () {
        fi
 }
 
-write_terms () {
-       TERM_BAD=$1
-       TERM_GOOD=$2
-       if test "$TERM_BAD" = "$TERM_GOOD"
-       then
-               die "$(gettext "please use two different terms")"
-       fi
-       check_term_format "$TERM_BAD" bad
-       check_term_format "$TERM_GOOD" good
-       printf '%s\n%s\n' "$TERM_BAD" "$TERM_GOOD" >"$GIT_DIR/BISECT_TERMS"
-}
-
-check_term_format () {
-       term=$1
-       git check-ref-format refs/bisect/"$term" ||
-       die "$(eval_gettext "'\$term' is not a valid term")"
-       case "$term" in
-       help|start|terms|skip|next|reset|visualize|replay|log|run)
-               die "$(eval_gettext "can't use the builtin command '\$term' as a term")"
-               ;;
-       bad|new)
-               if test "$2" != bad
-               then
-                       # In theory, nothing prevents swapping
-                       # completely good and bad, but this situation
-                       # could be confusing and hasn't been tested
-                       # enough. Forbid it for now.
-                       die "$(eval_gettext "can't change the meaning of term '\$term'")"
-               fi
-               ;;
-       good|old)
-               if test "$2" != good
-               then
-                       die "$(eval_gettext "can't change the meaning of term '\$term'")"
-               fi
-               ;;
-       esac
-}
-
 check_and_set_terms () {
        cmd="$1"
        case "$cmd" in
@@ -609,13 +534,17 @@ check_and_set_terms () {
                bad|good)
                        if ! test -s "$GIT_DIR/BISECT_TERMS"
                        then
-                               write_terms bad good
+                               TERM_BAD=bad
+                               TERM_GOOD=good
+                               git bisect--helper --write-terms "$TERM_BAD" "$TERM_GOOD" || exit
                        fi
                        ;;
                new|old)
                        if ! test -s "$GIT_DIR/BISECT_TERMS"
                        then
-                               write_terms new old
+                               TERM_BAD=new
+                               TERM_GOOD=old
+                               git bisect--helper --write-terms "$TERM_BAD" "$TERM_GOOD" || exit
                        fi
                        ;;
                esac ;;
index 3365a3b..1b7e4b2 100755 (executable)
@@ -81,11 +81,11 @@ set_ident () {
        finish_ident COMMITTER
 }
 
-USAGE="[--setup <command>] [--env-filter <command>]
+USAGE="[--setup <command>] [--subdirectory-filter <directory>] [--env-filter <command>]
        [--tree-filter <command>] [--index-filter <command>]
        [--parent-filter <command>] [--msg-filter <command>]
        [--commit-filter <command>] [--tag-name-filter <command>]
-       [--subdirectory-filter <directory>] [--original <namespace>]
+       [--original <namespace>]
        [-d <directory>] [-f | --force] [--state-branch <branch>]
        [--] [<rev-list options>...]"
 
@@ -154,6 +154,10 @@ do
        --setup)
                filter_setup="$OPTARG"
                ;;
+       --subdirectory-filter)
+               filter_subdir="$OPTARG"
+               remap_to_ancestor=t
+               ;;
        --env-filter)
                filter_env="$OPTARG"
                ;;
@@ -175,10 +179,6 @@ do
        --tag-name-filter)
                filter_tag_name="$OPTARG"
                ;;
-       --subdirectory-filter)
-               filter_subdir="$OPTARG"
-               remap_to_ancestor=t
-               ;;
        --original)
                orig_namespace=$(expr "$OPTARG/" : '\(.*[^/]\)/*$')/
                ;;
index 66d1ae8..156255a 100755 (executable)
@@ -758,18 +758,6 @@ cmd_update()
        }
 }
 
-set_name_rev () {
-       revname=$( (
-               sanitize_submodule_env
-               cd "$1" && {
-                       git describe "$2" 2>/dev/null ||
-                       git describe --tags "$2" 2>/dev/null ||
-                       git describe --contains "$2" 2>/dev/null ||
-                       git describe --all --always "$2"
-               }
-       ) )
-       test -z "$revname" || revname=" ($revname)"
-}
 #
 # Show commit summary for submodules in index or working tree
 #
@@ -1016,54 +1004,7 @@ cmd_status()
                shift
        done
 
-       {
-               git submodule--helper list --prefix "$wt_prefix" "$@" ||
-               echo "#unmatched" $?
-       } |
-       while read -r mode sha1 stage sm_path
-       do
-               die_if_unmatched "$mode" "$sha1"
-               name=$(git submodule--helper name "$sm_path") || exit
-               displaypath=$(git submodule--helper relative-path "$prefix$sm_path" "$wt_prefix")
-               if test "$stage" = U
-               then
-                       say "U$sha1 $displaypath"
-                       continue
-               fi
-               if ! git submodule--helper is-active "$sm_path" ||
-               {
-                       ! test -d "$sm_path"/.git &&
-                       ! test -f "$sm_path"/.git
-               }
-               then
-                       say "-$sha1 $displaypath"
-                       continue;
-               fi
-               if git diff-files --ignore-submodules=dirty --quiet -- "$sm_path"
-               then
-                       set_name_rev "$sm_path" "$sha1"
-                       say " $sha1 $displaypath$revname"
-               else
-                       if test -z "$cached"
-                       then
-                               sha1=$(sanitize_submodule_env; cd "$sm_path" && git rev-parse --verify HEAD)
-                       fi
-                       set_name_rev "$sm_path" "$sha1"
-                       say "+$sha1 $displaypath$revname"
-               fi
-
-               if test -n "$recursive"
-               then
-                       (
-                               prefix="$displaypath/"
-                               sanitize_submodule_env
-                               wt_prefix=
-                               cd "$sm_path" &&
-                               eval cmd_status
-                       ) ||
-                       die "$(eval_gettext "Failed to recurse into submodule path '\$sm_path'")"
-               fi
-       done
+       git ${wt_prefix:+-C "$wt_prefix"} ${prefix:+--super-prefix "$prefix"} submodule--helper status ${GIT_QUIET:+--quiet} ${cached:+--cached} ${recursive:+--recursive} "$@"
 }
 #
 # Sync remote urls for submodules
index 7c1c484..f401c97 100644 (file)
@@ -240,8 +240,8 @@ extern char *get_locked_file_path(struct lock_file *lk);
  * If the lockfile is still open, close it (and the file pointer if it
  * has been opened using `fdopen_lock_file()`) without renaming the
  * lockfile over the file being locked. Return 0 upon success. On
- * failure to `close(2)`, return a negative value and roll back the
- * lock file. Usually `commit_lock_file()`, `commit_lock_file_to()`,
+ * failure to `close(2)`, return a negative value (the lockfile is not
+ * rolled back). Usually `commit_lock_file()`, `commit_lock_file_to()`,
  * or `rollback_lock_file()` should eventually be called.
  */
 static inline int close_lock_file_gently(struct lock_file *lk)
index cea0562..580b3a9 100644 (file)
@@ -198,7 +198,7 @@ static const struct name_decoration *current_pointed_by_HEAD(const struct name_d
 
        /* Now resolve and find the matching current branch */
        branch_name = resolve_ref_unsafe("HEAD", 0, NULL, &rru_flags);
-       if (!(rru_flags & REF_ISSYMREF))
+       if (!branch_name || !(rru_flags & REF_ISSYMREF))
                return NULL;
 
        if (!starts_with(branch_name, "refs/"))
index 1d3f8f0..24c5c26 100644 (file)
@@ -2162,7 +2162,7 @@ int merge_recursive_generic(struct merge_options *o,
                            struct commit **result)
 {
        int clean;
-       struct lock_file *lock = xcalloc(1, sizeof(struct lock_file));
+       struct lock_file lock = LOCK_INIT;
        struct commit *head_commit = get_ref(head, o->branch1);
        struct commit *next_commit = get_ref(merge, o->branch2);
        struct commit_list *ca = NULL;
@@ -2178,14 +2178,14 @@ int merge_recursive_generic(struct merge_options *o,
                }
        }
 
-       hold_locked_index(lock, LOCK_DIE_ON_ERROR);
+       hold_locked_index(&lock, LOCK_DIE_ON_ERROR);
        clean = merge_recursive(o, head_commit, next_commit, ca,
                        result);
        if (clean < 0)
                return clean;
 
        if (active_cache_changed &&
-           write_locked_index(&the_index, lock, COMMIT_LOCK))
+           write_locked_index(&the_index, &lock, COMMIT_LOCK))
                return err(o, _("Unable to write index."));
 
        return clean ? 0 : 1;
diff --git a/merge.c b/merge.c
index 1d441ad..e5d796c 100644 (file)
--- a/merge.c
+++ b/merge.c
@@ -53,11 +53,11 @@ int checkout_fast_forward(const struct object_id *head,
        struct tree_desc t[MAX_UNPACK_TREES];
        int i, nr_trees = 0;
        struct dir_struct dir;
-       struct lock_file *lock_file = xcalloc(1, sizeof(struct lock_file));
+       struct lock_file lock_file = LOCK_INIT;
 
        refresh_cache(REFRESH_QUIET);
 
-       if (hold_locked_index(lock_file, LOCK_REPORT_ON_ERROR) < 0)
+       if (hold_locked_index(&lock_file, LOCK_REPORT_ON_ERROR) < 0)
                return -1;
 
        memset(&trees, 0, sizeof(trees));
@@ -91,9 +91,7 @@ int checkout_fast_forward(const struct object_id *head,
        }
        if (unpack_trees(nr_trees, t, &opts))
                return -1;
-       if (write_locked_index(&the_index, lock_file, COMMIT_LOCK)) {
-               rollback_lock_file(lock_file);
+       if (write_locked_index(&the_index, &lock_file, COMMIT_LOCK))
                return error(_("unable to write new index file"));
-       }
        return 0;
 }
diff --git a/path.c b/path.c
index 2e09a7b..da8b655 100644 (file)
--- a/path.c
+++ b/path.c
@@ -192,7 +192,7 @@ static void *add_to_trie(struct trie *root, const char *key, void *value)
                 * Split this node: child will contain this node's
                 * existing children.
                 */
-               child = malloc(sizeof(*child));
+               child = xmalloc(sizeof(*child));
                memcpy(child->children, root->children, sizeof(root->children));
 
                child->len = root->len - i - 1;
index cdefdc7..82eb39c 100644 (file)
@@ -532,7 +532,7 @@ void parse_pathspec(struct pathspec *pathspec,
 {
        struct pathspec_item *item;
        const char *entry = argv ? *argv : NULL;
-       int i, n, prefixlen, warn_empty_string, nr_exclude = 0;
+       int i, n, prefixlen, nr_exclude = 0;
 
        memset(pathspec, 0, sizeof(*pathspec));
 
@@ -565,13 +565,10 @@ void parse_pathspec(struct pathspec *pathspec,
        }
 
        n = 0;
-       warn_empty_string = 1;
        while (argv[n]) {
-               if (*argv[n] == '\0' && warn_empty_string) {
-                       warning(_("empty strings as pathspecs will be made invalid in upcoming releases. "
-                                 "please use . instead if you meant to match all paths"));
-                       warn_empty_string = 0;
-               }
+               if (*argv[n] == '\0')
+                       die("empty string is not a valid pathspec. "
+                                 "please use . instead if you meant to match all paths");
                n++;
        }
 
index b3184cb..cc5b235 100644 (file)
--- a/po/TEAMS
+++ b/po/TEAMS
@@ -20,6 +20,10 @@ Members:     Thomas Rast <tr@thomasrast.ch>
                Matthias Rüster <matthias.ruester@gmail.com>
                Magnus Görlitz <magnus.goerlitz@googlemail.com>
 
+Language:      es (Spanish)
+Repository:    https://github.com/ChrisADR/git-po
+Leader:                Christopher Díaz <christopher.diaz.riv@gmail.com>
+
 Language:      fr (French)
 Repository:    https://github.com/jnavila/git
 Leader:                Jean-Noël Avila <jn.avila@free.fr>
index 19be171..45bf4cc 100644 (file)
--- a/po/bg.po
+++ b/po/bg.po
@@ -82,6 +82,8 @@
 # alternate алтернативен източник
 # superproject обхващащ проект
 # split index разделяне на индекса
+# truncate отрязвам
+# format string форматиращ низ
 # ------------------------
 # „$var“ - може да не сработва за shell има gettext и eval_gettext - проверка - намират се лесно по „$
 # ------------------------
@@ -94,8 +96,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: git master\n"
 "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2017-07-24 21:54+0800\n"
-"PO-Revision-Date: 2017-07-24 17:26+0200\n"
+"POT-Creation-Date: 2017-10-08 09:48+0800\n"
+"PO-Revision-Date: 2017-10-14 11:52+0200\n"
 "Last-Translator: Alexander Shopov <ash@kambanaria.org>\n"
 "Language-Team: Bulgarian <dict@fsa-bg.org>\n"
 "Language: bg\n"
@@ -139,14 +141,14 @@ msgid ""
 "Fix them up in the work tree, and then use 'git add/rm <file>'\n"
 "as appropriate to mark resolution and make a commit."
 msgstr ""
-"Редактирайте ги в работното дърво, и тогава ползвайте „git add/rm ФАЙЛ“\n"
+"Редактирайте ги в работното дърво, и тогава ползвайте „git add/rm ФАЙЛ“,\n"
 "за да отбележите коригирането им.  След това извършете подаването."
 
 #: advice.c:112
 msgid "Exiting because of an unresolved conflict."
 msgstr "Изход от програмата заради некоригиран конфликт."
 
-#: advice.c:117 builtin/merge.c:1184
+#: advice.c:117 builtin/merge.c:1211
 msgid "You have not concluded your merge (MERGE_HEAD exists)."
 msgstr "Не сте завършили сливане.  (Указателят „MERGE_HEAD“ съществува)."
 
@@ -197,90 +199,90 @@ msgstr "непозната опция за знаците за интервал
 msgid "unrecognized whitespace ignore option '%s'"
 msgstr "непозната опция за игнориране на знаците за интервали „%s“"
 
-#: apply.c:126
+#: apply.c:125
 msgid "--reject and --3way cannot be used together."
 msgstr "опциите „--reject“ и „--3way“ са несъвместими"
 
-#: apply.c:128
+#: apply.c:127
 msgid "--cached and --3way cannot be used together."
 msgstr "опциите „--cached“ и „--3way“ са несъвместими"
 
-#: apply.c:131
+#: apply.c:130
 msgid "--3way outside a repository"
 msgstr "като „--3way“, но извън хранилище"
 
-#: apply.c:142
+#: apply.c:141
 msgid "--index outside a repository"
 msgstr "като „--index“, но извън хранилище"
 
-#: apply.c:145
+#: apply.c:144
 msgid "--cached outside a repository"
 msgstr "като „--cached“, но извън хранилище"
 
-#: apply.c:836
+#: apply.c:845
 #, c-format
 msgid "Cannot prepare timestamp regexp %s"
 msgstr "Регулярният израз за времето „%s“ не може за бъде компилиран"
 
-#: apply.c:845
+#: apply.c:854
 #, c-format
 msgid "regexec returned %d for input: %s"
 msgstr "Регулярният израз върна %d при подадена последователност „%s“ на входа"
 
-#: apply.c:929
+#: apply.c:928
 #, c-format
 msgid "unable to find filename in patch at line %d"
 msgstr "Липсва име на файл на ред %d от кръпката"
 
-#: apply.c:967
+#: apply.c:966
 #, c-format
 msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d"
 msgstr ""
 "git apply: лош изход от командата „git-diff“ — на ред %2$d се очакваше „/dev/"
 "null“, а бе получен „%1$s“"
 
-#: apply.c:973
+#: apply.c:972
 #, c-format
 msgid "git apply: bad git-diff - inconsistent new filename on line %d"
 msgstr ""
 "git apply: лош изход от командата „git-diff“ — на ред %d бе получено "
 "неправилно име на нов файл"
 
-#: apply.c:974
+#: apply.c:973
 #, c-format
 msgid "git apply: bad git-diff - inconsistent old filename on line %d"
 msgstr ""
 "git apply: лош изход от командата „git-diff“ — на ред %d бе получено "
 "неправилно име на стар файл"
 
-#: apply.c:979
+#: apply.c:978
 #, c-format
 msgid "git apply: bad git-diff - expected /dev/null on line %d"
 msgstr ""
 "git apply: лош изход от командата „git-diff“ — на ред %d се очакваше „/dev/"
 "null“"
 
-#: apply.c:1008
+#: apply.c:1007
 #, c-format
 msgid "invalid mode on line %d: %s"
 msgstr "грешен режим на ред №%d: %s"
 
-#: apply.c:1326
+#: apply.c:1325
 #, c-format
 msgid "inconsistent header lines %d and %d"
 msgstr "несъвместими заглавни части на редове №%d и №%d"
 
-#: apply.c:1498
+#: apply.c:1497
 #, c-format
 msgid "recount: unexpected line: %.*s"
 msgstr "при повторното преброяване бе получен неочакван ред: „%.*s“"
 
-#: apply.c:1567
+#: apply.c:1566
 #, c-format
 msgid "patch fragment without header at line %d: %.*s"
 msgstr "част от кръпка без заглавна част на ред %d: %.*s"
 
-#: apply.c:1587
+#: apply.c:1586
 #, c-format
 msgid ""
 "git diff header lacks filename information when removing %d leading pathname "
@@ -295,71 +297,71 @@ msgstr[1] ""
 "След съкращаването на първите %d части от компонентите на пътя, в заглавната "
 "част на „git diff“ липсва информация за име на файл (ред: %d)"
 
-#: apply.c:1600
+#: apply.c:1599
 #, c-format
 msgid "git diff header lacks filename information (line %d)"
 msgstr ""
 "в заглавната част на „git diff“ липсва информация за име на файл (ред: %d)"
 
-#: apply.c:1770
+#: apply.c:1787
 msgid "new file depends on old contents"
 msgstr "новият файл зависи от старото съдържание на файла"
 
-#: apply.c:1772
+#: apply.c:1789
 msgid "deleted file still has contents"
 msgstr "изтритият файл не е празен"
 
-#: apply.c:1806
+#: apply.c:1823
 #, c-format
 msgid "corrupt patch at line %d"
 msgstr "грешка в кръпката на ред %d"
 
-#: apply.c:1843
+#: apply.c:1860
 #, c-format
 msgid "new file %s depends on old contents"
 msgstr "новият файл „%s“ зависи от старото съдържание на файла"
 
-#: apply.c:1845
+#: apply.c:1862
 #, c-format
 msgid "deleted file %s still has contents"
 msgstr "изтритият файл „%s“ не е празен"
 
-#: apply.c:1848
+#: apply.c:1865
 #, c-format
 msgid "** warning: file %s becomes empty but is not deleted"
 msgstr "● предупреждение: файлът „%s“ вече е празен, но не е изтрит"
 
-#: apply.c:1995
+#: apply.c:2012
 #, c-format
 msgid "corrupt binary patch at line %d: %.*s"
 msgstr "грешка в двоичната кръпка на ред %d: %.*s"
 
-#: apply.c:2032
+#: apply.c:2049
 #, c-format
 msgid "unrecognized binary patch at line %d"
 msgstr "неразпозната двоичната кръпка на ред %d"
 
-#: apply.c:2193
+#: apply.c:2209
 #, c-format
 msgid "patch with only garbage at line %d"
 msgstr "кръпката е с изцяло повредени данни на ред %d"
 
-#: apply.c:2276
+#: apply.c:2295
 #, c-format
 msgid "unable to read symlink %s"
 msgstr "символната връзка „%s“ не може да бъде прочетена"
 
-#: apply.c:2280
+#: apply.c:2299
 #, c-format
 msgid "unable to open or read %s"
 msgstr "файлът „%s“ не може да бъде отворен или прочетен"
 
-#: apply.c:2933
+#: apply.c:2958
 #, c-format
 msgid "invalid start of line: '%c'"
 msgstr "неправилно начало на ред: „%c“"
 
-#: apply.c:3052
+#: apply.c:3077
 #, c-format
 msgid "Hunk #%d succeeded at %d (offset %d line)."
 msgid_plural "Hunk #%d succeeded at %d (offset %d lines)."
@@ -368,13 +370,13 @@ msgstr[0] ""
 msgstr[1] ""
 "%d-то парче код бе успешно приложено на ред %d (отместване от %d реда)."
 
-#: apply.c:3064
+#: apply.c:3089
 #, c-format
 msgid "Context reduced to (%ld/%ld) to apply fragment at %d"
 msgstr ""
 "Контекстът е намален на (%ld/%ld) за прилагането на парчето код на ред %d"
 
-#: apply.c:3070
+#: apply.c:3095
 #, c-format
 msgid ""
 "while searching for:\n"
@@ -383,316 +385,316 @@ msgstr ""
 "при търсене за:\n"
 "%.*s"
 
-#: apply.c:3092
+#: apply.c:3117
 #, c-format
 msgid "missing binary patch data for '%s'"
 msgstr "липсват данните за двоичната кръпка за „%s“"
 
-#: apply.c:3100
+#: apply.c:3125
 #, c-format
 msgid "cannot reverse-apply a binary patch without the reverse hunk to '%s'"
 msgstr ""
 "двоичната кръпка не може да се приложи в обратна посока, когато обратното "
 "парче за „%s“ липсва"
 
-#: apply.c:3146
+#: apply.c:3171
 #, c-format
 msgid "cannot apply binary patch to '%s' without full index line"
 msgstr "към „%s“ не може да се приложи двоична кръпка без пълен индекс"
 
-#: apply.c:3156
+#: apply.c:3181
 #, c-format
 msgid ""
 "the patch applies to '%s' (%s), which does not match the current contents."
 msgstr "кръпката съответства на „%s“ (%s), който не съвпада по съдържание."
 
-#: apply.c:3164
+#: apply.c:3189
 #, c-format
 msgid "the patch applies to an empty '%s' but it is not empty"
 msgstr "кръпката съответства на „%s“, който трябва да е празен, но не е"
 
-#: apply.c:3182
+#: apply.c:3207
 #, c-format
 msgid "the necessary postimage %s for '%s' cannot be read"
 msgstr ""
 "необходимият резултат след операцията  — „%s“ за „%s“ не може да бъде "
 "прочетен"
 
-#: apply.c:3195
+#: apply.c:3220
 #, c-format
 msgid "binary patch does not apply to '%s'"
 msgstr "двоичната кръпка не може да бъде приложена върху „%s“"
 
-#: apply.c:3201
+#: apply.c:3226
 #, c-format
 msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)"
 msgstr ""
 "двоичната кръпка за „%s“ води до неправилни резултати (очакваше се: „%s“, а "
 "бе получено: „%s“)"
 
-#: apply.c:3222
+#: apply.c:3247
 #, c-format
 msgid "patch failed: %s:%ld"
 msgstr "неуспешно прилагане на кръпка: „%s:%ld“"
 
-#: apply.c:3344
+#: apply.c:3369
 #, c-format
 msgid "cannot checkout %s"
 msgstr "„%s“ не може да се изтегли"
 
-#: apply.c:3392 apply.c:3403 apply.c:3449 setup.c:277
+#: apply.c:3418 apply.c:3429 apply.c:3475 setup.c:277
 #, c-format
 msgid "failed to read %s"
 msgstr "файлът „%s“ не може да бъде прочетен"
 
-#: apply.c:3400
+#: apply.c:3426
 #, c-format
 msgid "reading from '%s' beyond a symbolic link"
 msgstr "изчитане на „%s“ след проследяване на символна връзка"
 
-#: apply.c:3429 apply.c:3669
+#: apply.c:3455 apply.c:3695
 #, c-format
 msgid "path %s has been renamed/deleted"
 msgstr "обектът с път „%s“ е преименуван или изтрит"
 
-#: apply.c:3512 apply.c:3683
+#: apply.c:3538 apply.c:3709
 #, c-format
 msgid "%s: does not exist in index"
 msgstr "„%s“ не съществува в индекса"
 
-#: apply.c:3521 apply.c:3691
+#: apply.c:3547 apply.c:3717
 #, c-format
 msgid "%s: does not match index"
 msgstr "„%s“ не съответства на индекса"
 
-#: apply.c:3556
+#: apply.c:3582
 msgid "repository lacks the necessary blob to fall back on 3-way merge."
 msgstr ""
 "в хранилището липсват необходимите обекти BLOB, за да се премине към тройно "
 "сливане."
 
-#: apply.c:3559
+#: apply.c:3585
 #, c-format
 msgid "Falling back to three-way merge...\n"
 msgstr "Преминаване към тройно сливане…\n"
 
-#: apply.c:3575 apply.c:3579
+#: apply.c:3601 apply.c:3605
 #, c-format
 msgid "cannot read the current contents of '%s'"
 msgstr "текущото съдържание на „%s“ не може да бъде прочетено"
 
-#: apply.c:3591
+#: apply.c:3617
 #, c-format
 msgid "Failed to fall back on three-way merge...\n"
 msgstr "Неуспешно преминаване към тройно сливане…\n"
 
-#: apply.c:3605
+#: apply.c:3631
 #, c-format
 msgid "Applied patch to '%s' with conflicts.\n"
 msgstr "Конфликти при прилагането на кръпката към „%s“.\n"
 
-#: apply.c:3610
+#: apply.c:3636
 #, c-format
 msgid "Applied patch to '%s' cleanly.\n"
 msgstr "Кръпката бе приложена чисто към „%s“.\n"
 
-#: apply.c:3636
+#: apply.c:3662
 msgid "removal patch leaves file contents"
 msgstr "изтриващата кръпка оставя файла непразен"
 
-#: apply.c:3708
+#: apply.c:3734
 #, c-format
 msgid "%s: wrong type"
 msgstr "„%s“: неправилен вид"
 
-#: apply.c:3710
+#: apply.c:3736
 #, c-format
 msgid "%s has type %o, expected %o"
 msgstr "„%s“ е от вид „%o“, а се очакваше „%o“"
 
-#: apply.c:3860 apply.c:3862
+#: apply.c:3886 apply.c:3888
 #, c-format
 msgid "invalid path '%s'"
 msgstr "неправилен път: „%s“"
 
-#: apply.c:3918
+#: apply.c:3944
 #, c-format
 msgid "%s: already exists in index"
 msgstr "„%s“: вече съществува в индекса"
 
-#: apply.c:3921
+#: apply.c:3947
 #, c-format
 msgid "%s: already exists in working directory"
 msgstr "„%s“: вече съществува в работното дърво"
 
-#: apply.c:3941
+#: apply.c:3967
 #, c-format
 msgid "new mode (%o) of %s does not match old mode (%o)"
 msgstr "новите права за достъп (%o) на „%s“ не съвпадат със старите (%o)"
 
-#: apply.c:3946
+#: apply.c:3972
 #, c-format
 msgid "new mode (%o) of %s does not match old mode (%o) of %s"
 msgstr ""
 "новите права за достъп (%o) на „%s“ не съвпадат със старите (%o) на „%s“"
 
-#: apply.c:3966
+#: apply.c:3992
 #, c-format
 msgid "affected file '%s' is beyond a symbolic link"
 msgstr "засегнатият файл „%s“ е след символна връзка"
 
-#: apply.c:3970
+#: apply.c:3996
 #, c-format
 msgid "%s: patch does not apply"
 msgstr "Кръпката „%s“ не може да бъде приложена"
 
-#: apply.c:3985
+#: apply.c:4011
 #, c-format
 msgid "Checking patch %s..."
 msgstr "Проверяване на кръпката „%s“…"
 
-#: apply.c:4076
+#: apply.c:4102
 #, c-format
 msgid "sha1 information is lacking or useless for submodule %s"
 msgstr ""
 "информацията за сумата по SHA1 за подмодула липсва или не е достатъчна (%s)."
 
-#: apply.c:4083
+#: apply.c:4109
 #, c-format
 msgid "mode change for %s, which is not in current HEAD"
 msgstr "смяна на режима на достъпа на „%s“, който не е в текущия връх „HEAD“"
 
-#: apply.c:4086
+#: apply.c:4112
 #, c-format
 msgid "sha1 information is lacking or useless (%s)."
 msgstr "информацията за сумата по SHA1 липсва или не е достатъчна (%s)."
 
-#: apply.c:4091 builtin/checkout.c:235 builtin/reset.c:138
+#: apply.c:4117 builtin/checkout.c:235 builtin/reset.c:148
 #, c-format
 msgid "make_cache_entry failed for path '%s'"
 msgstr "неуспешно създаване на запис в кеша чрез „make_cache_entry“ за „%s“"
 
-#: apply.c:4095
+#: apply.c:4121
 #, c-format
 msgid "could not add %s to temporary index"
 msgstr "„%s“ не може да се добави към временния индекс"
 
-#: apply.c:4105
+#: apply.c:4131
 #, c-format
 msgid "could not write temporary index to %s"
 msgstr "временният индекс не може да се запази в „%s“"
 
-#: apply.c:4243
+#: apply.c:4269
 #, c-format
 msgid "unable to remove %s from index"
 msgstr "„%s“ не може да се извади от индекса"
 
-#: apply.c:4278
+#: apply.c:4304
 #, c-format
 msgid "corrupt patch for submodule %s"
 msgstr "повредена кръпка за модула „%s“"
 
-#: apply.c:4284
+#: apply.c:4310
 #, c-format
 msgid "unable to stat newly created file '%s'"
 msgstr ""
 "не може да се получи информация чрез „stat“ за новосъздадения файл „%s“"
 
-#: apply.c:4292
+#: apply.c:4318
 #, c-format
 msgid "unable to create backing store for newly created file %s"
 msgstr ""
 "не може да се за създаде мястото за съхранение на новосъздадения файл „%s“"
 
-#: apply.c:4298 apply.c:4442
+#: apply.c:4324 apply.c:4468
 #, c-format
 msgid "unable to add cache entry for %s"
 msgstr "не може да се добави запис в кеша за „%s“"
 
-#: apply.c:4339
+#: apply.c:4365
 #, c-format
 msgid "failed to write to '%s'"
 msgstr "в „%s“ не може да се пише"
 
-#: apply.c:4343
+#: apply.c:4369
 #, c-format
 msgid "closing file '%s'"
 msgstr "затваряне на файла „%s“"
 
-#: apply.c:4413
+#: apply.c:4439
 #, c-format
 msgid "unable to write file '%s' mode %o"
 msgstr "файлът „%s“ не може да се запише с режим на достъп „%o“"
 
-#: apply.c:4511
+#: apply.c:4537
 #, c-format
 msgid "Applied patch %s cleanly."
 msgstr "Кръпката „%s“ бе приложена чисто."
 
-#: apply.c:4519
+#: apply.c:4545
 msgid "internal error"
 msgstr "вътрешна грешка"
 
-#: apply.c:4522
+#: apply.c:4548
 #, 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 отхвърлени парчета…"
 
-#: apply.c:4533
+#: apply.c:4559
 #, c-format
 msgid "truncating .rej filename to %.*s.rej"
 msgstr "съкращаване на името на файла с отхвърлените парчета на „ %.*s.rej“"
 
-#: apply.c:4541 builtin/fetch.c:738 builtin/fetch.c:988
+#: apply.c:4567 builtin/fetch.c:760 builtin/fetch.c:1010
 #, c-format
 msgid "cannot open %s"
 msgstr "„%s“ не може да бъде отворен"
 
-#: apply.c:4555
+#: apply.c:4581
 #, c-format
 msgid "Hunk #%d applied cleanly."
 msgstr "%d-то парче бе успешно приложено."
 
-#: apply.c:4559
+#: apply.c:4585
 #, c-format
 msgid "Rejected hunk #%d."
 msgstr "%d-то парче бе отхвърлено."
 
-#: apply.c:4669
+#: apply.c:4695
 #, c-format
 msgid "Skipped patch '%s'."
 msgstr "Пропусната кръпка: „%s“"
 
-#: apply.c:4677
+#: apply.c:4703
 msgid "unrecognized input"
 msgstr "непознат вход"
 
-#: apply.c:4696
+#: apply.c:4722
 msgid "unable to read index file"
 msgstr "индексът не може да бъде записан"
 
-#: apply.c:4833
+#: apply.c:4859
 #, c-format
 msgid "can't open patch '%s': %s"
 msgstr "кръпката „%s“ не може да бъде отворена: %s"
 
-#: apply.c:4860
+#: apply.c:4886
 #, c-format
 msgid "squelched %d whitespace error"
 msgid_plural "squelched %d whitespace errors"
 msgstr[0] "пренебрегната е %d грешка в знаците за интервали"
 msgstr[1] "пренебрегнати са %d грешки в знаците за интервали"
 
-#: apply.c:4866 apply.c:4881
+#: apply.c:4892 apply.c:4907
 #, c-format
 msgid "%d line adds whitespace errors."
 msgid_plural "%d lines add whitespace errors."
 msgstr[0] "%d ред добавя грешки в знаците за интервали."
 msgstr[1] "%d реда добавят грешки в знаците за интервали."
 
-#: apply.c:4874
+#: apply.c:4900
 #, c-format
 msgid "%d line applied after fixing whitespace errors."
 msgid_plural "%d lines applied after fixing whitespace errors."
@@ -701,138 +703,139 @@ msgstr[0] ""
 msgstr[1] ""
 "Добавени са %d реда след корекцията на грешките в знаците за интервали."
 
-#: apply.c:4890 builtin/add.c:513 builtin/mv.c:299 builtin/rm.c:391
+#: apply.c:4916 builtin/add.c:515 builtin/mv.c:298 builtin/rm.c:390
 msgid "Unable to write new index file"
 msgstr "Новият индекс не може да бъде записан"
 
-#: apply.c:4921 apply.c:4924 builtin/am.c:2257 builtin/am.c:2260
-#: builtin/clone.c:115 builtin/fetch.c:93 builtin/pull.c:187
-#: builtin/submodule--helper.c:304 builtin/submodule--helper.c:629
-#: builtin/submodule--helper.c:632 builtin/submodule--helper.c:973
-#: builtin/submodule--helper.c:976 builtin/submodule--helper.c:1161
+#: apply.c:4947 apply.c:4950 builtin/am.c:2256 builtin/am.c:2259
+#: builtin/clone.c:116 builtin/fetch.c:115 builtin/pull.c:187
+#: builtin/submodule--helper.c:301 builtin/submodule--helper.c:622
+#: builtin/submodule--helper.c:625 builtin/submodule--helper.c:992
+#: builtin/submodule--helper.c:995 builtin/submodule--helper.c:1212
 #: git-add--interactive.perl:197
 msgid "path"
 msgstr "път"
 
-#: apply.c:4922
+#: apply.c:4948
 msgid "don't apply changes matching the given path"
 msgstr "без прилагане на промените напасващи на дадения път"
 
-#: apply.c:4925
+#: apply.c:4951
 msgid "apply changes matching the given path"
 msgstr "прилагане на промените напасващи на дадения път"
 
-#: apply.c:4927 builtin/am.c:2266
+#: apply.c:4953 builtin/am.c:2265
 msgid "num"
 msgstr "БРОЙ"
 
-#: apply.c:4928
+#: apply.c:4954
 msgid "remove <num> leading slashes from traditional diff paths"
 msgstr "премахване на този БРОЙ водещи елементи от пътищата в разликата"
 
-#: apply.c:4931
+#: apply.c:4957
 msgid "ignore additions made by the patch"
 msgstr "игнориране на редовете добавени от тази кръпка"
 
-#: apply.c:4933
+#: apply.c:4959
 msgid "instead of applying the patch, output diffstat for the input"
 msgstr "извеждане на статистика на промените без прилагане на кръпката"
 
-#: apply.c:4937
+#: apply.c:4963
 msgid "show number of added and deleted lines in decimal notation"
 msgstr "извеждане на броя на добавените и изтритите редове"
 
-#: apply.c:4939
+#: apply.c:4965
 msgid "instead of applying the patch, output a summary for the input"
 msgstr "извеждане на статистика на входните данни без прилагане на кръпката"
 
-#: apply.c:4941
+#: apply.c:4967
 msgid "instead of applying the patch, see if the patch is applicable"
 msgstr "проверка дали кръпката може да се приложи, без действително прилагане"
 
-#: apply.c:4943
+#: apply.c:4969
 msgid "make sure the patch is applicable to the current index"
 msgstr "проверка дали кръпката може да бъде приложена към текущия индекс"
 
-#: apply.c:4945
+#: apply.c:4971
 msgid "apply a patch without touching the working tree"
 msgstr "прилагане на кръпката без промяна на работното дърво"
 
-#: apply.c:4947
+#: apply.c:4973
 msgid "accept a patch that touches outside the working area"
 msgstr "прилагане на кръпка, която променя и файлове извън работното дърво"
 
-#: apply.c:4949
+#: apply.c:4975
 msgid "also apply the patch (use with --stat/--summary/--check)"
 msgstr ""
 "кръпката да бъде приложена.  Опцията се комбинира с „--check“/„--stat“/„--"
 "summary“"
 
-#: apply.c:4951
+#: apply.c:4977
 msgid "attempt three-way merge if a patch does not apply"
 msgstr "пробване с тройно сливане, ако кръпката не може да се приложи директно"
 
-#: apply.c:4953
+#: apply.c:4979
 msgid "build a temporary index based on embedded index information"
 msgstr ""
 "създаване на временен индекс на база на включената информация за индекса"
 
-#: apply.c:4956 builtin/checkout-index.c:170 builtin/ls-files.c:515
+#: apply.c:4982 builtin/checkout-index.c:170 builtin/ls-files.c:513
 msgid "paths are separated with NUL character"
 msgstr "разделяне на пътищата с нулевия знак „NUL“"
 
-#: apply.c:4958
+#: apply.c:4984
 msgid "ensure at least <n> lines of context match"
 msgstr "да се осигури контекст от поне такъв БРОЙ съвпадащи редове"
 
-#: apply.c:4959 builtin/am.c:2245
+#: apply.c:4985 builtin/am.c:2244 builtin/interpret-trailers.c:95
+#: builtin/interpret-trailers.c:97 builtin/interpret-trailers.c:99
 msgid "action"
 msgstr "действие"
 
-#: apply.c:4960
+#: apply.c:4986
 msgid "detect new or modified lines that have whitespace errors"
 msgstr "засичане на нови или променени редове с грешки в знаците за интервали"
 
-#: apply.c:4963 apply.c:4966
+#: apply.c:4989 apply.c:4992
 msgid "ignore changes in whitespace when finding context"
 msgstr ""
 "игнориране на промените в знаците за интервали при откриване на контекста"
 
-#: apply.c:4969
+#: apply.c:4995
 msgid "apply the patch in reverse"
 msgstr "прилагане на кръпката в обратна посока"
 
-#: apply.c:4971
+#: apply.c:4997
 msgid "don't expect at least one line of context"
 msgstr "без изискване на дори и един ред контекст"
 
-#: apply.c:4973
+#: apply.c:4999
 msgid "leave the rejected hunks in corresponding *.rej files"
 msgstr "оставяне на отхвърлените парчета във файлове с разширение „.rej“"
 
-#: apply.c:4975
+#: apply.c:5001
 msgid "allow overlapping hunks"
 msgstr "позволяване на застъпващи се парчета"
 
-#: apply.c:4976 builtin/add.c:270 builtin/check-ignore.c:21
-#: builtin/commit.c:1340 builtin/count-objects.c:95 builtin/fsck.c:651
-#: builtin/log.c:1877 builtin/mv.c:123 builtin/read-tree.c:125
+#: apply.c:5002 builtin/add.c:272 builtin/check-ignore.c:21
+#: builtin/commit.c:1347 builtin/count-objects.c:96 builtin/fsck.c:640
+#: builtin/log.c:1889 builtin/mv.c:123 builtin/read-tree.c:125
 msgid "be verbose"
 msgstr "повече подробности"
 
-#: apply.c:4978
+#: apply.c:5004
 msgid "tolerate incorrectly detected missing new-line at the end of file"
 msgstr "пренебрегване на неправилно липсващ знак за нов ред в края на файл"
 
-#: apply.c:4981
+#: apply.c:5007
 msgid "do not trust the line counts in the hunk headers"
 msgstr "без доверяване на номерата на редовете в заглавните части на парчетата"
 
-#: apply.c:4983 builtin/am.c:2254
+#: apply.c:5009 builtin/am.c:2253
 msgid "root"
 msgstr "НАЧАЛНА_ДИРЕКТОРИЯ"
 
-#: apply.c:4984
+#: apply.c:5010
 msgid "prepend <root> to all filenames"
 msgstr "добавяне на тази НАЧАЛНА_ДИРЕКТОРИЯ към имената на всички файлове"
 
@@ -855,108 +858,108 @@ msgstr ""
 msgid "git archive --remote <repo> [--exec <cmd>] --list"
 msgstr "git archive --remote ХРАНИЛИЩЕ [--exec КОМАНДА] --list"
 
-#: archive.c:333 builtin/add.c:154 builtin/add.c:492 builtin/rm.c:300
+#: archive.c:351 builtin/add.c:156 builtin/add.c:494 builtin/rm.c:299
 #, c-format
 msgid "pathspec '%s' did not match any files"
 msgstr "пътят „%s“ не съвпада с никой файл"
 
-#: archive.c:418
+#: archive.c:436
 msgid "fmt"
 msgstr "ФОРМАТ"
 
-#: archive.c:418
+#: archive.c:436
 msgid "archive format"
 msgstr "ФОРМАТ на архива"
 
-#: archive.c:419 builtin/log.c:1446
+#: archive.c:437 builtin/log.c:1452
 msgid "prefix"
 msgstr "ПРЕФИКС"
 
-#: archive.c:420
+#: archive.c:438
 msgid "prepend prefix to each pathname in the archive"
 msgstr "добавяне на този ПРЕФИКС към всеки път в архива"
 
-#: archive.c:421 builtin/blame.c:693 builtin/blame.c:694 builtin/config.c:61
-#: builtin/fast-export.c:989 builtin/fast-export.c:991 builtin/grep.c:1080
-#: builtin/hash-object.c:102 builtin/ls-files.c:549 builtin/ls-files.c:552
-#: builtin/notes.c:404 builtin/notes.c:567 builtin/read-tree.c:120
+#: archive.c:439 builtin/blame.c:693 builtin/blame.c:694 builtin/config.c:61
+#: builtin/fast-export.c:1005 builtin/fast-export.c:1007 builtin/grep.c:859
+#: builtin/hash-object.c:102 builtin/ls-files.c:547 builtin/ls-files.c:550
+#: builtin/notes.c:405 builtin/notes.c:568 builtin/read-tree.c:120
 #: parse-options.h:153
 msgid "file"
 msgstr "ФАЙЛ"
 
-#: archive.c:422 builtin/archive.c:89
+#: archive.c:440 builtin/archive.c:89
 msgid "write the archive to this file"
 msgstr "запазване на архива в този ФАЙЛ"
 
-#: archive.c:424
+#: archive.c:442
 msgid "read .gitattributes in working directory"
 msgstr "изчитане на „.gitattributes“ в работната директория"
 
-#: archive.c:425
+#: archive.c:443
 msgid "report archived files on stderr"
 msgstr "извеждане на архивираните файлове на стандартната грешка"
 
-#: archive.c:426
+#: archive.c:444
 msgid "store only"
 msgstr "само съхранение без компресиране"
 
-#: archive.c:427
+#: archive.c:445
 msgid "compress faster"
 msgstr "бързо компресиране"
 
-#: archive.c:435
+#: archive.c:453
 msgid "compress better"
 msgstr "добро компресиране"
 
-#: archive.c:438
+#: archive.c:456
 msgid "list supported archive formats"
 msgstr "извеждане на списъка с поддържаните формати"
 
-#: archive.c:440 builtin/archive.c:90 builtin/clone.c:105 builtin/clone.c:108
-#: builtin/submodule--helper.c:641 builtin/submodule--helper.c:982
+#: archive.c:458 builtin/archive.c:90 builtin/clone.c:106 builtin/clone.c:109
+#: builtin/submodule--helper.c:634 builtin/submodule--helper.c:1001
 msgid "repo"
 msgstr "хранилище"
 
-#: archive.c:441 builtin/archive.c:91
+#: archive.c:459 builtin/archive.c:91
 msgid "retrieve the archive from remote repository <repo>"
 msgstr "изтегляне на архива от отдалеченото ХРАНИЛИЩЕ"
 
-#: archive.c:442 builtin/archive.c:92 builtin/notes.c:488
+#: archive.c:460 builtin/archive.c:92 builtin/notes.c:489
 msgid "command"
 msgstr "команда"
 
-#: archive.c:443 builtin/archive.c:93
+#: archive.c:461 builtin/archive.c:93
 msgid "path to the remote git-upload-archive command"
 msgstr "път към отдалечената команда „git-upload-archive“"
 
-#: archive.c:450
+#: archive.c:468
 msgid "Unexpected option --remote"
 msgstr "Неочаквана опция „--remote“"
 
-#: archive.c:452
+#: archive.c:470
 msgid "Option --exec can only be used together with --remote"
 msgstr "Опцията „--exec“ изисква „--remote“"
 
-#: archive.c:454
+#: archive.c:472
 msgid "Unexpected option --output"
 msgstr "Неочаквана опция „--output“"
 
-#: archive.c:476
+#: archive.c:494
 #, c-format
 msgid "Unknown archive format '%s'"
 msgstr "Непознат формат на архив: „%s“"
 
-#: archive.c:483
+#: archive.c:501
 #, c-format
 msgid "Argument not supported for format '%s': -%d"
 msgstr "Аргументът не се поддържа за форма̀та „%s“: -%d"
 
-#: attr.c:214
+#: attr.c:218
 #, c-format
 msgid "%.*s is not a valid attribute name"
 msgstr "„%.*s“ е неправилно име за атрибут"
 
-#: attr.c:410
+#: attr.c:415
 msgid ""
 "Negative patterns are ignored in git attributes\n"
 "Use '\\!' for literal leading exclamation."
@@ -1033,31 +1036,31 @@ msgstr ""
 msgid "Bisecting: a merge base must be tested\n"
 msgstr "Двоично търсене: трябва да се провери база за сливане\n"
 
-#: bisect.c:849
+#: bisect.c:850
 #, c-format
 msgid "a %s revision is needed"
 msgstr "необходима е версия „%s“"
 
-#: bisect.c:866 builtin/notes.c:175 builtin/tag.c:256
+#: bisect.c:867 builtin/notes.c:175 builtin/tag.c:234
 #, c-format
 msgid "could not create file '%s'"
 msgstr "файлът „%s“ не може да бъде създаден"
 
-#: bisect.c:917
+#: bisect.c:918
 #, c-format
 msgid "could not read file '%s'"
 msgstr "файлът „%s“ не може да бъде прочетен"
 
-#: bisect.c:947
+#: bisect.c:948
 msgid "reading bisect refs failed"
 msgstr "неуспешно прочитане на указателите за двоично търсене"
 
-#: bisect.c:967
+#: bisect.c:968
 #, c-format
 msgid "%s was both %s and %s\n"
 msgstr "„%s“ e както „%s“, така и „%s“\n"
 
-#: bisect.c:975
+#: bisect.c:976
 #, c-format
 msgid ""
 "No testable commit found.\n"
@@ -1066,7 +1069,7 @@ msgstr ""
 "Липсва подходящо за тестване подаване.\n"
 "Проверете параметрите за пътищата.\n"
 
-#: bisect.c:994
+#: bisect.c:995
 #, c-format
 msgid "(roughly %d step)"
 msgid_plural "(roughly %d steps)"
@@ -1076,7 +1079,7 @@ msgstr[1] "(приблизително %d стъпки)"
 #. TRANSLATORS: the last %s will be replaced with "(roughly %d
 #. steps)" translation.
 #.
-#: bisect.c:1000
+#: bisect.c:1001
 #, 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"
@@ -1097,10 +1100,10 @@ msgstr ""
 "Едновременното задаване на опциите „--reverse“ и „--first-parent“ изисква "
 "указването на крайно подаване"
 
-#: blame.c:1797 bundle.c:164 ref-filter.c:1919 sequencer.c:1166
-#: sequencer.c:2328 builtin/commit.c:1058 builtin/log.c:356 builtin/log.c:907
-#: builtin/log.c:1357 builtin/log.c:1683 builtin/log.c:1926 builtin/merge.c:360
-#: builtin/shortlog.c:177
+#: blame.c:1797 bundle.c:169 ref-filter.c:1932 sequencer.c:1168
+#: sequencer.c:2351 builtin/commit.c:1065 builtin/log.c:357 builtin/log.c:911
+#: builtin/log.c:1361 builtin/log.c:1690 builtin/log.c:1938 builtin/merge.c:369
+#: builtin/shortlog.c:191
 msgid "revision walk setup failed"
 msgstr "неуспешно настройване на обхождането на версиите"
 
@@ -1142,45 +1145,44 @@ msgstr ""
 
 #: branch.c:93
 #, c-format
-msgid "Branch %s set up to track remote branch %s from %s by rebasing."
+msgid "Branch '%s' set up to track remote branch '%s' from '%s' by rebasing."
 msgstr ""
-"Ð\9aлонÑ\8aÑ\82 â\80\9e%sâ\80\9c Ñ\89е Ñ\81леди ÐºÐ»Ð¾Ð½Ð° â\80\9e%sâ\80\9c Ð¾Ñ\82 Ð¾Ñ\82далеÑ\87еноÑ\82о Ñ\85Ñ\80анилиÑ\89е „%s“ чрез "
+"Ð\9aлонÑ\8aÑ\82 â\80\9e%sâ\80\9c Ñ\89е Ñ\81леди Ð¾Ñ\82далеÑ\87ениÑ\8f ÐºÐ»Ð¾Ð½ â\80\9e%sâ\80\9c Ð¾Ñ\82 Ñ\85Ñ\80анилиÑ\89еÑ\82о „%s“ чрез "
 "пребазиране."
 
 #: branch.c:94
 #, c-format
-msgid "Branch %s set up to track remote branch %s from %s."
-msgstr "Ð\9aлонÑ\8aÑ\82 â\80\9e%sâ\80\9c Ñ\89е Ñ\81леди ÐºÐ»Ð¾Ð½Ð° â\80\9e%sâ\80\9c Ð¾Ñ\82 Ð¾Ñ\82далеÑ\87еноÑ\82о Ñ\85Ñ\80анилиÑ\89е „%s“."
+msgid "Branch '%s' set up to track remote branch '%s' from '%s'."
+msgstr "Ð\9aлонÑ\8aÑ\82 â\80\9e%sâ\80\9c Ñ\89е Ñ\81леди Ð¾Ñ\82далеÑ\87ениÑ\8f ÐºÐ»Ð¾Ð½ â\80\9e%sâ\80\9c Ð¾Ñ\82 Ñ\85Ñ\80анилиÑ\89еÑ\82о „%s“."
 
 #: branch.c:98
 #, c-format
-msgid "Branch %s set up to track local branch %s by rebasing."
-msgstr ""
-"Клонът „%s“ ще следи клона „%s“ от локалното хранилище чрез пребазиране."
+msgid "Branch '%s' set up to track local branch '%s' by rebasing."
+msgstr "Клонът „%s“ ще следи локалния клон „%s“ чрез пребазиране."
 
 #: branch.c:99
 #, c-format
-msgid "Branch %s set up to track local branch %s."
-msgstr "Ð\9aлонÑ\8aÑ\82 â\80\9e%sâ\80\9c Ñ\89е Ñ\81леди ÐºÐ»Ð¾Ð½Ð° â\80\9e%sâ\80\9c Ð¾Ñ\82 Ð»Ð¾ÐºÐ°Ð»Ð½Ð¾Ñ\82о Ñ\85Ñ\80анилиÑ\89е."
+msgid "Branch '%s' set up to track local branch '%s'."
+msgstr "Ð\9aлонÑ\8aÑ\82 â\80\9e%sâ\80\9c Ñ\89е Ñ\81леди Ð»Ð¾ÐºÐ°Ð»Ð½Ð¸Ñ\8f ÐºÐ»Ð¾Ð½ â\80\9e%sâ\80\9c."
 
 #: branch.c:104
 #, c-format
-msgid "Branch %s set up to track remote ref %s by rebasing."
+msgid "Branch '%s' set up to track remote ref '%s' by rebasing."
 msgstr "Клонът „%s“ ще следи отдалечения указател „%s“ чрез пребазиране."
 
 #: branch.c:105
 #, c-format
-msgid "Branch %s set up to track remote ref %s."
+msgid "Branch '%s' set up to track remote ref '%s'."
 msgstr "Клонът „%s“ ще следи отдалечения указател „%s“."
 
 #: branch.c:109
 #, c-format
-msgid "Branch %s set up to track local ref %s by rebasing."
+msgid "Branch '%s' set up to track local ref '%s' by rebasing."
 msgstr "Клонът „%s“ ще следи локалния указател „%s“ чрез пребазиране."
 
 #: branch.c:110
 #, c-format
-msgid "Branch %s set up to track local ref %s."
+msgid "Branch '%s' set up to track local ref '%s'."
 msgstr "Клонът „%s“ ще следи локалния указател „%s“."
 
 #: branch.c:119
@@ -1202,21 +1204,21 @@ msgstr "„%s“ не е позволено име за клон."
 msgid "A branch named '%s' already exists."
 msgstr "Вече съществува клон с име „%s“."
 
-#: branch.c:198
+#: branch.c:197
 msgid "Cannot force update the current branch."
 msgstr "Текущият клон не може да бъде принудително обновен."
 
-#: branch.c:218
+#: branch.c:217
 #, c-format
 msgid "Cannot setup tracking information; starting point '%s' is not a branch."
 msgstr "Зададените настройки за следенето са грешни — началото „%s“ не е клон."
 
-#: branch.c:220
+#: branch.c:219
 #, c-format
 msgid "the requested upstream branch '%s' does not exist"
 msgstr "заявеният отдалечен клон „%s“ не съществува"
 
-#: branch.c:222
+#: branch.c:221
 msgid ""
 "\n"
 "If you are planning on basing your work on an upstream\n"
@@ -1235,22 +1237,22 @@ msgstr ""
 "може да използвате „git push -u“, за да настроите към кой клон да се "
 "изтласква."
 
-#: branch.c:265
+#: branch.c:264
 #, c-format
 msgid "Not a valid object name: '%s'."
 msgstr "Неправилно име на обект: „%s“"
 
-#: branch.c:285
+#: branch.c:284
 #, c-format
 msgid "Ambiguous object name: '%s'."
 msgstr "Името на обект не е еднозначно: „%s“"
 
-#: branch.c:290
+#: branch.c:289
 #, c-format
 msgid "Not a valid branch point: '%s'."
 msgstr "Неправилно място за начало на клон: „%s“"
 
-#: branch.c:344
+#: branch.c:343
 #, c-format
 msgid "'%s' is already checked out at '%s'"
 msgstr "„%s“ вече е изтеглен в „%s“"
@@ -1270,7 +1272,9 @@ msgstr "Файлът „%s“ не изглежда да е пратка на gi
 msgid "unrecognized header: %s%s (%d)"
 msgstr "непозната заглавна част: %s%s (%d)"
 
-#: bundle.c:88 sequencer.c:1344 sequencer.c:1770 builtin/commit.c:778
+#: bundle.c:88 sequencer.c:1346 sequencer.c:1793 sequencer.c:2500
+#: sequencer.c:2583 sequencer.c:2609 sequencer.c:2687 sequencer.c:2807
+#: sequencer.c:2949 builtin/commit.c:782
 #, c-format
 msgid "could not open '%s'"
 msgstr "„%s“ не може да се отвори"
@@ -1279,57 +1283,57 @@ msgstr "„%s“ не може да се отвори"
 msgid "Repository lacks these prerequisite commits:"
 msgstr "В хранилището липсват следните необходими подавания:"
 
-#: bundle.c:186
+#: bundle.c:193
 #, c-format
 msgid "The bundle contains this ref:"
 msgid_plural "The bundle contains these %d refs:"
 msgstr[0] "Пратката съдържа следния указател:"
 msgstr[1] "Пратката съдържа следните %d указатели:"
 
-#: bundle.c:193
+#: bundle.c:200
 msgid "The bundle records a complete history."
 msgstr "Пратката съдържа пълна история."
 
-#: bundle.c:195
+#: bundle.c:202
 #, c-format
 msgid "The bundle requires this ref:"
 msgid_plural "The bundle requires these %d refs:"
 msgstr[0] "Пратката изисква следния указател:"
 msgstr[1] "Пратката изисква следните %d указатели:"
 
-#: bundle.c:254
+#: bundle.c:261
 msgid "Could not spawn pack-objects"
 msgstr "Командата „git pack-objects“ не може да бъде стартирана"
 
-#: bundle.c:265
+#: bundle.c:272
 msgid "pack-objects died"
 msgstr "Командата „git pack-objects“ не завърши успешно"
 
-#: bundle.c:307
+#: bundle.c:314
 msgid "rev-list died"
 msgstr "Командата „git rev-list“ не завърши успешно"
 
-#: bundle.c:356
+#: bundle.c:363
 #, c-format
 msgid "ref '%s' is excluded by the rev-list options"
 msgstr ""
 "указателят „%s“ не е бил включен поради опциите зададени на „git rev-list“"
 
-#: bundle.c:446 builtin/log.c:173 builtin/log.c:1589 builtin/shortlog.c:282
+#: bundle.c:453 builtin/log.c:174 builtin/log.c:1597 builtin/shortlog.c:296
 #, c-format
 msgid "unrecognized argument: %s"
 msgstr "непознат аргумент: %s"
 
-#: bundle.c:454
+#: bundle.c:461
 msgid "Refusing to create empty bundle."
 msgstr "Създаването на празна пратка е невъзможно."
 
-#: bundle.c:466
+#: bundle.c:473
 #, c-format
 msgid "cannot create '%s'"
 msgstr "Файлът „%s“ не може да бъде създаден"
 
-#: bundle.c:494
+#: bundle.c:501
 msgid "index-pack died"
 msgstr "Командата „git index-pack“ не завърши успешно"
 
@@ -1338,8 +1342,8 @@ msgstr "Командата „git index-pack“ не завърши успешн
 msgid "invalid color value: %.*s"
 msgstr "неправилна стойност за цвят: %.*s"
 
-#: commit.c:41 sequencer.c:1582 builtin/am.c:420 builtin/am.c:456
-#: builtin/am.c:1469 builtin/am.c:2107
+#: commit.c:41 sequencer.c:1600 builtin/am.c:421 builtin/am.c:465
+#: builtin/am.c:1467 builtin/am.c:2105
 #, c-format
 msgid "could not parse %s"
 msgstr "„%s“ не може да се анализира"
@@ -1349,7 +1353,7 @@ msgstr "„%s“ не може да се анализира"
 msgid "%s %s is not a commit!"
 msgstr "%s %s не е подаване!"
 
-#: commit.c:1511
+#: commit.c:1517
 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"
@@ -1363,156 +1367,156 @@ msgstr ""
 msgid "memory exhausted"
 msgstr "паметта свърши"
 
-#: config.c:186
+#: config.c:187
 msgid "relative config include conditionals must come from files"
 msgstr "относителните условни изрази за вмъкване трябва да идват от файлове"
 
-#: config.c:720
+#: config.c:721
 #, c-format
 msgid "bad config line %d in blob %s"
 msgstr "неправилен ред за настройки %d в BLOB „%s“"
 
-#: config.c:724
+#: config.c:725
 #, c-format
 msgid "bad config line %d in file %s"
 msgstr "неправилен ред за настройки %d във файла „%s“"
 
-#: config.c:728
+#: config.c:729
 #, c-format
 msgid "bad config line %d in standard input"
 msgstr "неправилен ред за настройки %d на стандартния вход"
 
-#: config.c:732
+#: config.c:733
 #, c-format
 msgid "bad config line %d in submodule-blob %s"
 msgstr "неправилен ред за настройки %d в BLOB за подмодул „%s“"
 
-#: config.c:736
+#: config.c:737
 #, c-format
 msgid "bad config line %d in command line %s"
 msgstr "неправилен ред за настройки %d на командния ред „%s“"
 
-#: config.c:740
+#: config.c:741
 #, c-format
 msgid "bad config line %d in %s"
 msgstr "неправилен ред за настройки %d в „%s“"
 
-#: config.c:868
+#: config.c:869
 msgid "out of range"
 msgstr "извън диапазона"
 
-#: config.c:868
+#: config.c:869
 msgid "invalid unit"
 msgstr "неправилна мерна единица"
 
-#: config.c:874
+#: config.c:875
 #, c-format
 msgid "bad numeric config value '%s' for '%s': %s"
 msgstr "неправилна числова стойност „%s“ за „%s“: %s"
 
-#: config.c:879
+#: config.c:880
 #, c-format
 msgid "bad numeric config value '%s' for '%s' in blob %s: %s"
 msgstr "неправилна числова стойност „%s“ за „%s“ в BLOB „%s“: %s"
 
-#: config.c:882
+#: config.c:883
 #, c-format
 msgid "bad numeric config value '%s' for '%s' in file %s: %s"
 msgstr "неправилна числова стойност „%s“ за „%s“ във файла „%s“: %s"
 
-#: config.c:885
+#: config.c:886
 #, c-format
 msgid "bad numeric config value '%s' for '%s' in standard input: %s"
 msgstr "неправилна числова стойност „%s“ за „%s“ на стандартния вход: %s"
 
-#: config.c:888
+#: config.c:889
 #, c-format
 msgid "bad numeric config value '%s' for '%s' in submodule-blob %s: %s"
 msgstr "неправилна числова стойност „%s“ за „%s“ в BLOB от подмодул „%s“: %s"
 
-#: config.c:891
+#: config.c:892
 #, c-format
 msgid "bad numeric config value '%s' for '%s' in command line %s: %s"
 msgstr "неправилна числова стойност „%s“ за „%s“ на командния ред „%s“: %s"
 
-#: config.c:894
+#: config.c:895
 #, c-format
 msgid "bad numeric config value '%s' for '%s' in %s: %s"
 msgstr "неправилна числова стойност „%s“ за „%s“ в %s: %s"
 
-#: config.c:989
+#: config.c:990
 #, c-format
 msgid "failed to expand user dir in: '%s'"
 msgstr "домашната папка на потребителя не може да бъде открита: „%s“"
 
-#: config.c:1084 config.c:1095
+#: config.c:1085 config.c:1096
 #, c-format
 msgid "bad zlib compression level %d"
 msgstr "неправилно ниво на компресиране: %d"
 
-#: config.c:1212
+#: config.c:1213
 #, c-format
 msgid "invalid mode for object creation: %s"
 msgstr "неправилен режим за създаването на обекти: %s"
 
-#: config.c:1368
+#: config.c:1372
 #, c-format
 msgid "bad pack compression level %d"
 msgstr "неправилно ниво на компресиране при пакетиране: %d"
 
-#: config.c:1564
+#: config.c:1568
 msgid "unable to parse command-line config"
 msgstr "неправилни настройки от командния ред"
 
-#: config.c:1894
+#: config.c:1900
 msgid "unknown error occurred while reading the configuration files"
 msgstr "неочаквана грешка при изчитането на конфигурационните файлове"
 
-#: config.c:2064
+#: config.c:2087
 #, c-format
 msgid "Invalid %s: '%s'"
 msgstr "Неправилен %s: „%s“"
 
-#: config.c:2085
+#: config.c:2130
 #, c-format
 msgid "unknown core.untrackedCache value '%s'; using 'keep' default value"
 msgstr ""
 "непозната стойност „%s“ за настройката „core.untrackedCache“. Ще се ползва "
 "стандартната стойност „keep“ (запазване)"
 
-#: config.c:2111
+#: config.c:2156
 #, c-format
 msgid "splitIndex.maxPercentChange value '%d' should be between 0 and 100"
 msgstr ""
 "стойността на „splitIndex.maxPercentChange“ трябва да е между 1 и 100, а не "
 "%d"
 
-#: config.c:2122
+#: config.c:2167
 #, c-format
 msgid "unable to parse '%s' from command-line config"
 msgstr "неразпозната стойност „%s“ от командния ред"
 
-#: config.c:2124
+#: config.c:2169
 #, c-format
 msgid "bad config variable '%s' in file '%s' at line %d"
 msgstr "неправилна настройка „%s“ във файла „%s“ на ред №%d"
 
-#: config.c:2183
+#: config.c:2228
 #, c-format
 msgid "%s has multiple values"
 msgstr "зададени са няколко стойности за „%s“"
 
-#: config.c:2517 config.c:2745
+#: config.c:2571 config.c:2789
 #, c-format
 msgid "fstat on %s failed"
 msgstr "неуспешно изпълнение на „fstat“ върху „%s“"
 
-#: config.c:2635
+#: config.c:2678
 #, c-format
 msgid "could not set '%s' to '%s'"
 msgstr "„%s“ не може да се зададе да е „%s“"
 
-#: config.c:2637 builtin/remote.c:775
+#: config.c:2680 builtin/remote.c:776
 #, c-format
 msgid "could not unset '%s'"
 msgstr "„%s“ не може да се премахне"
@@ -1533,19 +1537,19 @@ msgstr ""
 "Проверете дали то съществува и дали имате права\n"
 "за достъп."
 
-#: connected.c:63 builtin/fsck.c:191 builtin/prune.c:141
+#: connected.c:64 builtin/fsck.c:183 builtin/prune.c:141
 msgid "Checking connectivity"
 msgstr "Проверка на връзката"
 
-#: connected.c:75
+#: connected.c:76
 msgid "Could not run 'git rev-list'"
 msgstr "Командата „git rev-list“ не може да бъде изпълнена."
 
-#: connected.c:95
+#: connected.c:96
 msgid "failed write to rev-list"
 msgstr "неуспешен запис на списъка с версиите"
 
-#: connected.c:102
+#: connected.c:103
 msgid "failed to close rev-list's stdin"
 msgstr "стандартният вход на списъка с версиите не може да бъде затворен"
 
@@ -1658,29 +1662,38 @@ msgstr "файлът с подредбата на съответствията 
 msgid "Performing inexact rename detection"
 msgstr "Търсене на преименувания на обекти съчетани с промени"
 
-#: diff.c:63
+#: diff.c:74
 #, c-format
 msgid "option '%s' requires a value"
 msgstr "опцията „%s“ изисква стойност"
 
-#: diff.c:125
+#: diff.c:152
 #, c-format
 msgid "  Failed to parse dirstat cut-off percentage '%s'\n"
 msgstr ""
 "  Неуспешно разпознаване на „%s“ като процент-праг за статистиката по "
 "директории\n"
 
-#: diff.c:130
+#: diff.c:157
 #, c-format
 msgid "  Unknown dirstat parameter '%s'\n"
 msgstr "  Непознат параметър „%s“ за статистиката по директории'\n"
 
-#: diff.c:282
+#: diff.c:281
+msgid ""
+"color moved setting must be one of 'no', 'default', 'zebra', 'dimmed_zebra', "
+"'plain'"
+msgstr ""
+"настройката за цвят за преместване трябва да е една от: „no“ (без), "
+"„default“ (стандартно), „zebra“ (райе), „dimmed_zebra“ (притъмнено райе), "
+"„plain“ (обикновено)"
+
+#: diff.c:341
 #, c-format
 msgid "Unknown value for 'diff.submodule' config variable: '%s'"
 msgstr "Непозната стойност „%s“ за настройката „diff.submodule“"
 
-#: diff.c:342
+#: diff.c:398
 #, c-format
 msgid ""
 "Found errors in 'diff.dirstat' config variable:\n"
@@ -1689,23 +1702,23 @@ msgstr ""
 "Грешки в настройката „diff.dirstat“:\n"
 "%s"
 
-#: diff.c:3101
+#: diff.c:3861
 #, c-format
 msgid "external diff died, stopping at %s"
 msgstr ""
 "външната програма за разлики завърши неуспешно.  Спиране на работата при „%s“"
 
-#: diff.c:3427
+#: diff.c:4189
 msgid "--name-only, --name-status, --check and -s are mutually exclusive"
 msgstr ""
 "Опциите „--name-only“, „--name-status“, „--check“ и „-s“ са несъвместими "
 "една с друга"
 
-#: diff.c:3517
+#: diff.c:4279
 msgid "--follow requires exactly one pathspec"
 msgstr "Опцията „--follow“ изисква точно един път"
 
-#: diff.c:3680
+#: diff.c:4445
 #, c-format
 msgid ""
 "Failed to parse --dirstat/-X option parameter:\n"
@@ -1714,230 +1727,234 @@ msgstr ""
 "Неразпознат параметър към опцията „--dirstat/-X“:\n"
 "%s"
 
-#: diff.c:3694
+#: diff.c:4459
 #, c-format
 msgid "Failed to parse --submodule option parameter: '%s'"
 msgstr "Неразпознат параметър към опцията „--submodule“: „%s“"
 
-#: diff.c:4716
+#: diff.c:5505
 msgid "inexact rename detection was skipped due to too many files."
 msgstr ""
 "търсенето на преименувания на обекти съчетани с промени се прескача поради "
 "многото файлове."
 
-#: diff.c:4719
+#: diff.c:5508
 msgid "only found copies from modified paths due to too many files."
 msgstr ""
 "установени са точните копия на променените пътища поради многото файлове."
 
-#: diff.c:4722
+#: diff.c:5511
 #, c-format
 msgid ""
 "you may want to set your %s variable to at least %d and retry the command."
 msgstr "задайте променливата „%s“ да е поне %d и отново изпълнете командата."
 
-#: dir.c:1948
+#: dir.c:1983
 msgid "failed to get kernel name and information"
 msgstr "името и версията на ядрото не бяха получени"
 
-#: dir.c:2067
+#: dir.c:2102
 msgid "Untracked cache is disabled on this system or location."
 msgstr ""
 "Кеша за неследените файлове е изключен на тази система или местоположение."
 
-#: dir.c:2846 dir.c:2851
+#: dir.c:2885 dir.c:2890
 #, c-format
 msgid "could not create directories for %s"
 msgstr "директориите за „%s“ не може да бъдат създадени"
 
-#: dir.c:2876
+#: dir.c:2915
 #, c-format
 msgid "could not migrate git directory from '%s' to '%s'"
 msgstr "директорията на git не може да се мигрира от „%s“ до „%s“"
 
-#: entry.c:281
+#: entry.c:176
+msgid "Filtering content"
+msgstr "Филтриране на съдържанието"
+
+#: entry.c:417
 #, c-format
 msgid "could not stat file '%s'"
 msgstr "неуспешно изпълнение на „stat“ върху файла „%s“"
 
-#: fetch-pack.c:251
+#: fetch-pack.c:252
 msgid "git fetch-pack: expected shallow list"
 msgstr "git fetch-pack: очаква се плитък списък"
 
-#: fetch-pack.c:263
+#: fetch-pack.c:264
 msgid "git fetch-pack: expected ACK/NAK, got EOF"
 msgstr "git fetch-pack: очакваше се „ACK“/„NAK“, а бе получен „EOF“"
 
-#: fetch-pack.c:282 builtin/archive.c:63
+#: fetch-pack.c:283 builtin/archive.c:63
 #, c-format
 msgid "remote error: %s"
 msgstr "отдалечена грешка: %s"
 
-#: fetch-pack.c:283
+#: fetch-pack.c:284
 #, c-format
 msgid "git fetch-pack: expected ACK/NAK, got '%s'"
 msgstr "git fetch-pack: очакваше се „ACK“/„NAK“, а бе получен „%s“"
 
-#: fetch-pack.c:335
+#: fetch-pack.c:336
 msgid "--stateless-rpc requires multi_ack_detailed"
 msgstr "опцията „--stateless-rpc“ изисква  „multi_ack_detailed“"
 
-#: fetch-pack.c:421
+#: fetch-pack.c:422
 #, c-format
 msgid "invalid shallow line: %s"
 msgstr "неправилен плитък ред: „%s“"
 
-#: fetch-pack.c:427
+#: fetch-pack.c:428
 #, c-format
 msgid "invalid unshallow line: %s"
 msgstr "неправилен неплитък ред: „%s“"
 
-#: fetch-pack.c:429
+#: fetch-pack.c:430
 #, c-format
 msgid "object not found: %s"
 msgstr "обектът „%s“ липсва"
 
-#: fetch-pack.c:432
+#: fetch-pack.c:433
 #, c-format
 msgid "error in object: %s"
 msgstr "грешка в обекта: „%s“"
 
-#: fetch-pack.c:434
+#: fetch-pack.c:435
 #, c-format
 msgid "no shallow found: %s"
 msgstr "не е открит плитък обект: %s"
 
-#: fetch-pack.c:437
+#: fetch-pack.c:438
 #, c-format
 msgid "expected shallow/unshallow, got %s"
 msgstr "очаква се плитък или не обект, а бе получено: %s"
 
-#: fetch-pack.c:476
+#: fetch-pack.c:477
 #, c-format
 msgid "got %s %d %s"
 msgstr "получено бе %s %d %s"
 
-#: fetch-pack.c:490
+#: fetch-pack.c:491
 #, c-format
 msgid "invalid commit %s"
 msgstr "неправилно подаване: „%s“"
 
-#: fetch-pack.c:523
+#: fetch-pack.c:524
 msgid "giving up"
 msgstr "преустановяване"
 
-#: fetch-pack.c:533 progress.c:237
+#: fetch-pack.c:534 progress.c:242
 msgid "done"
 msgstr "действието завърши"
 
-#: fetch-pack.c:545
+#: fetch-pack.c:546
 #, c-format
 msgid "got %s (%d) %s"
 msgstr "получено бе %s (%d) %s"
 
-#: fetch-pack.c:591
+#: fetch-pack.c:592
 #, c-format
 msgid "Marking %s as complete"
 msgstr "Отбелязване на „%s“ като пълно"
 
-#: fetch-pack.c:775
+#: fetch-pack.c:776
 #, c-format
 msgid "already have %s (%s)"
 msgstr "вече има „%s“ (%s)"
 
-#: fetch-pack.c:813
+#: fetch-pack.c:814
 msgid "fetch-pack: unable to fork off sideband demultiplexer"
 msgstr "fetch-pack: не може да се създаде процес за демултиплексора"
 
-#: fetch-pack.c:821
+#: fetch-pack.c:822
 msgid "protocol error: bad pack header"
 msgstr "протоколна грешка: неправилна заглавна част на пакет"
 
-#: fetch-pack.c:877
+#: fetch-pack.c:878
 #, c-format
 msgid "fetch-pack: unable to fork off %s"
 msgstr "fetch-pack: не може да се създаде процес за „%s“"
 
-#: fetch-pack.c:893
+#: fetch-pack.c:894
 #, c-format
 msgid "%s failed"
 msgstr "неуспешно изпълнение на „%s“"
 
-#: fetch-pack.c:895
+#: fetch-pack.c:896
 msgid "error in sideband demultiplexer"
 msgstr "грешка в демултиплексора"
 
-#: fetch-pack.c:922
+#: fetch-pack.c:923
 msgid "Server does not support shallow clients"
 msgstr "Сървърът не поддържа плитки клиенти"
 
-#: fetch-pack.c:926
+#: fetch-pack.c:927
 msgid "Server supports multi_ack_detailed"
 msgstr "Сървърът поддържа „multi_ack_detailed“"
 
-#: fetch-pack.c:929
+#: fetch-pack.c:930
 msgid "Server supports no-done"
 msgstr "Сървърът поддържа „no-done“"
 
-#: fetch-pack.c:935
+#: fetch-pack.c:936
 msgid "Server supports multi_ack"
 msgstr "Сървърът поддържа „multi_ack“"
 
-#: fetch-pack.c:939
+#: fetch-pack.c:940
 msgid "Server supports side-band-64k"
 msgstr "Сървърът поддържа „side-band-64k“"
 
-#: fetch-pack.c:943
+#: fetch-pack.c:944
 msgid "Server supports side-band"
 msgstr "Сървърът поддържа „side-band“"
 
-#: fetch-pack.c:947
+#: fetch-pack.c:948
 msgid "Server supports allow-tip-sha1-in-want"
 msgstr "Сървърът поддържа „allow-tip-sha1-in-want“"
 
-#: fetch-pack.c:951
+#: fetch-pack.c:952
 msgid "Server supports allow-reachable-sha1-in-want"
 msgstr "Сървърът поддържа „allow-reachable-sha1-in-want“"
 
-#: fetch-pack.c:961
+#: fetch-pack.c:962
 msgid "Server supports ofs-delta"
 msgstr "Сървърът поддържа „ofs-delta“"
 
-#: fetch-pack.c:968
+#: fetch-pack.c:969
 #, c-format
 msgid "Server version is %.*s"
 msgstr "Версията на сървъра е: %.*s"
 
-#: fetch-pack.c:974
+#: fetch-pack.c:975
 msgid "Server does not support --shallow-since"
 msgstr "Сървърът не поддържа опцията „--shallow-since“"
 
-#: fetch-pack.c:978
+#: fetch-pack.c:979
 msgid "Server does not support --shallow-exclude"
 msgstr "Сървърът не поддържа опцията „--shallow-exclude“"
 
-#: fetch-pack.c:980
+#: fetch-pack.c:981
 msgid "Server does not support --deepen"
 msgstr "Сървърът не поддържа опцията „--deepen“"
 
-#: fetch-pack.c:991
+#: fetch-pack.c:992
 msgid "no common commits"
 msgstr "няма общи подавания"
 
-#: fetch-pack.c:1003
+#: fetch-pack.c:1004
 msgid "git fetch-pack: fetch failed."
 msgstr "git fetch-pack: неуспешно доставяне."
 
-#: fetch-pack.c:1165
+#: fetch-pack.c:1166
 msgid "no matching remote head"
 msgstr "не може да бъде открит подходящ връх от отдалеченото хранилище"
 
-#: fetch-pack.c:1187
+#: fetch-pack.c:1188
 #, c-format
 msgid "no such remote ref %s"
 msgstr "такъв отдалечен указател няма: %s"
 
-#: fetch-pack.c:1190
+#: fetch-pack.c:1191
 #, c-format
 msgid "Server does not allow request for unadvertised object %s"
 msgstr "Сървърът не позволява заявка за необявен „%s“"
@@ -1950,7 +1967,7 @@ msgstr "Програмата „gpg“ не подписа данните."
 msgid "could not create temporary file"
 msgstr "не може да се създаде временен файл"
 
-#: gpg-interface.c:213
+#: gpg-interface.c:214
 #, c-format
 msgid "failed writing detached signature to '%s'"
 msgstr "Програмата не успя да запише самостоятелния подпис в „%s“"
@@ -1960,20 +1977,20 @@ msgstr "Програмата не успя да запише самостоят
 msgid "ignore invalid color '%.*s' in log.graphColors"
 msgstr "прескачане на неправилния цвят „%.*s“ в „log.graphColors“"
 
-#: grep.c:1981
+#: grep.c:1970
 #, c-format
 msgid "'%s': unable to read %s"
 msgstr "„%s“: файлът сочен от „%s“ не може да бъде прочетен"
 
-#: grep.c:1998 builtin/clone.c:403 builtin/diff.c:81 builtin/rm.c:134
+#: grep.c:1987 builtin/clone.c:404 builtin/diff.c:81 builtin/rm.c:134
 #, c-format
 msgid "failed to stat '%s'"
 msgstr "не може да бъде получена информация чрез „stat“ за „%s“"
 
-#: grep.c:2009
+#: grep.c:1998
 #, c-format
 msgid "'%s': short read"
-msgstr "â\80\9e%sâ\80\9c: Ð¸Ð·Ñ\87иÑ\82анеÑ\82о Ð²Ñ\8aÑ\80на Ð¿Ð¾-малко Ð±Ð°Ð¹Ñ\82ове Ð¾Ñ\82 Ð·Ð°Ñ\8fвениÑ\82е"
+msgstr "â\80\9e%sâ\80\9c: Ð¸Ð·Ñ\87иÑ\82анеÑ\82о Ð²Ñ\8aÑ\80на Ð¿Ð¾-малко Ð±Ð°Ð¹Ñ\82ове Ð¾Ñ\82 Ð¾Ñ\87акваноÑ\82о"
 
 #: help.c:179
 #, c-format
@@ -2120,12 +2137,12 @@ msgstr "не може да се ползва празно име като иде
 msgid "name consists only of disallowed characters: %s"
 msgstr "името съдържа само непозволени знаци: „%s“"
 
-#: ident.c:416 builtin/commit.c:612
+#: ident.c:416 builtin/commit.c:616
 #, c-format
 msgid "invalid date format: %s"
 msgstr "неправилен формат на дата: %s"
 
-#: lockfile.c:152
+#: lockfile.c:151
 #, c-format
 msgid ""
 "Unable to create '%s.lock': %s.\n"
@@ -2144,7 +2161,7 @@ msgstr ""
 "причина е, че някой процес на git в това хранилище е забил.  За да\n"
 "продължите работа, ще трябва ръчно да изтриете файла:"
 
-#: lockfile.c:160
+#: lockfile.c:159
 #, c-format
 msgid "Unable to create '%s.lock': %s"
 msgstr "Файлът-ключалка „%s.lock“ не може да бъде създаден: %s"
@@ -2153,80 +2170,80 @@ msgstr "Файлът-ключалка „%s.lock“ не може да бъде
 msgid "failed to read the cache"
 msgstr "кешът не може да бъде прочетен"
 
-#: merge.c:96 builtin/am.c:1980 builtin/am.c:2015 builtin/checkout.c:377
-#: builtin/checkout.c:591 builtin/clone.c:753
+#: merge.c:96 builtin/am.c:1978 builtin/am.c:2013 builtin/checkout.c:380
+#: builtin/checkout.c:595 builtin/clone.c:754
 msgid "unable to write new index file"
 msgstr "неуспешно записване на новия индекс"
 
-#: merge-recursive.c:210
+#: merge-recursive.c:235
 msgid "(bad commit)\n"
 msgstr "(лошо подаване)\n"
 
-#: merge-recursive.c:232 merge-recursive.c:240
+#: merge-recursive.c:257 merge-recursive.c:265
 #, c-format
 msgid "addinfo_cache failed for path '%s'"
 msgstr "неуспешно изпълнение на „addinfo_cache“ за пътя „%s“"
 
-#: merge-recursive.c:304
+#: merge-recursive.c:329
 msgid "error building trees"
 msgstr "грешка при изграждане на дърветата"
 
-#: merge-recursive.c:728
+#: merge-recursive.c:752
 #, c-format
 msgid "failed to create path '%s'%s"
 msgstr "грешка при създаването на пътя „%s“%s"
 
-#: merge-recursive.c:739
+#: merge-recursive.c:763
 #, c-format
 msgid "Removing %s to make room for subdirectory\n"
 msgstr "Изтриване на „%s“, за да се освободи място за поддиректория\n"
 
-#: merge-recursive.c:753 merge-recursive.c:772
+#: merge-recursive.c:777 merge-recursive.c:796
 msgid ": perhaps a D/F conflict?"
 msgstr ": възможно е да има конфликт директория/файл."
 
-#: merge-recursive.c:762
+#: merge-recursive.c:786
 #, c-format
 msgid "refusing to lose untracked file at '%s'"
 msgstr ""
 "преустановяване на действието, за да не се изтрие неследеният файл „%s“"
 
-#: merge-recursive.c:804 builtin/cat-file.c:36
+#: merge-recursive.c:828 builtin/cat-file.c:37
 #, c-format
 msgid "cannot read object %s '%s'"
 msgstr "обектът „%s“ (%s) не може да бъде прочетен"
 
-#: merge-recursive.c:806
+#: merge-recursive.c:830
 #, c-format
 msgid "blob expected for %s '%s'"
 msgstr "обектът „%s“ (%s) се очакваше да е BLOB, а не е"
 
-#: merge-recursive.c:830
+#: merge-recursive.c:854
 #, c-format
 msgid "failed to open '%s': %s"
 msgstr "„%s“ не може да се отвори: %s"
 
-#: merge-recursive.c:841
+#: merge-recursive.c:865
 #, c-format
 msgid "failed to symlink '%s': %s"
 msgstr "неуспешно създаване на символната връзка „%s“: %s"
 
-#: merge-recursive.c:846
+#: merge-recursive.c:870
 #, c-format
 msgid "do not know what to do with %06o %s '%s'"
 msgstr ""
 "не е ясно какво да се прави с обекта „%2$s“ (%3$s) с права за достъп „%1$06o“"
 
-#: merge-recursive.c:986
+#: merge-recursive.c:1010
 msgid "Failed to execute internal merge"
 msgstr "Неуспешно вътрешно сливане"
 
-#: merge-recursive.c:990
+#: merge-recursive.c:1014
 #, c-format
 msgid "Unable to add %s to database"
 msgstr "„%s“ не може да се добави в базата с данни"
 
-#: merge-recursive.c:1093
+#: merge-recursive.c:1117
 #, c-format
 msgid ""
 "CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
@@ -2235,7 +2252,7 @@ msgstr ""
 "КОНФЛИКТ (%s/изтриване): „%s“ е изтрит в %s, а „%s“ в %s.  Версия %s на „%s“ "
 "е оставена в дървото."
 
-#: merge-recursive.c:1098
+#: merge-recursive.c:1122
 #, c-format
 msgid ""
 "CONFLICT (%s/delete): %s deleted in %s and %s to %s in %s. Version %s of %s "
@@ -2244,7 +2261,7 @@ msgstr ""
 "КОНФЛИКТ (%s/изтриване): „%s“ е изтрит в %s, а „%s“ е преименуван на „%s“ в "
 "%s.  Версия %s на „%s“ е оставена в дървото."
 
-#: merge-recursive.c:1105
+#: merge-recursive.c:1129
 #, c-format
 msgid ""
 "CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
@@ -2253,7 +2270,7 @@ msgstr ""
 "КОНФЛИКТ (%s/изтриване): „%s“ е изтрит в %s, а „%s“ в %s.  Версия %s на „%s“ "
 "е оставена в дървото: %s."
 
-#: merge-recursive.c:1110
+#: merge-recursive.c:1134
 #, c-format
 msgid ""
 "CONFLICT (%s/delete): %s deleted in %s and %s to %s in %s. Version %s of %s "
@@ -2262,20 +2279,20 @@ msgstr ""
 "КОНФЛИКТ (%s/изтриване): „%s“ е изтрит в %s, а „%s“ е преименуван на „%s“ в "
 "%s.  Версия %s на „%s“ е оставена в дървото: %s."
 
-#: merge-recursive.c:1144
+#: merge-recursive.c:1168
 msgid "rename"
 msgstr "преименуване"
 
-#: merge-recursive.c:1144
+#: merge-recursive.c:1168
 msgid "renamed"
 msgstr "преименуван"
 
-#: merge-recursive.c:1201
+#: merge-recursive.c:1225
 #, c-format
 msgid "%s is a directory in %s adding as %s instead"
 msgstr "„%s“ е директория в „%s“, затова се добавя като „%s“"
 
-#: merge-recursive.c:1226
+#: merge-recursive.c:1250
 #, c-format
 msgid ""
 "CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
@@ -2284,143 +2301,143 @@ msgstr ""
 "КОНФЛИКТ (преименуване/преименуване): „%s“ е преименуван на „%s“ в клон "
 "„%s“, а „%s“ е преименуван на „%s“ в „%s“/%s."
 
-#: merge-recursive.c:1231
+#: merge-recursive.c:1255
 msgid " (left unresolved)"
 msgstr " (некоригиран конфликт)"
 
-#: merge-recursive.c:1293
+#: merge-recursive.c:1317
 #, c-format
 msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s"
 msgstr ""
 "КОНФЛИКТ (преименуване/преименуване): „%s“ е преименуван на „%s“ в клон "
 "„%s“, а „%s“ е преименуван на „%s“ в „%s“"
 
-#: merge-recursive.c:1326
+#: merge-recursive.c:1350
 #, c-format
 msgid "Renaming %s to %s and %s to %s instead"
 msgstr "Преименуване на „%s“ на „%s“, а „%s“ на „%s“"
 
-#: merge-recursive.c:1529
+#: merge-recursive.c:1553
 #, c-format
 msgid "CONFLICT (rename/add): Rename %s->%s in %s. %s added in %s"
 msgstr ""
 "КОНФЛИКТ (преименуване/добавяне): „%s“ е преименуван на „%s“ в клон „%s“, а "
 "„%s“ е добавен в „%s“"
 
-#: merge-recursive.c:1544
+#: merge-recursive.c:1568
 #, c-format
 msgid "Adding merged %s"
 msgstr "Добавяне на слетия „%s“"
 
-#: merge-recursive.c:1551 merge-recursive.c:1781
+#: merge-recursive.c:1575 merge-recursive.c:1805
 #, c-format
 msgid "Adding as %s instead"
 msgstr "Добавяне като „%s“"
 
-#: merge-recursive.c:1608
+#: merge-recursive.c:1632
 #, c-format
 msgid "cannot read object %s"
 msgstr "обектът „%s“ не може да се прочете"
 
-#: merge-recursive.c:1611
+#: merge-recursive.c:1635
 #, c-format
 msgid "object %s is not a blob"
 msgstr "обектът „%s“ не е BLOB"
 
-#: merge-recursive.c:1680
+#: merge-recursive.c:1704
 msgid "modify"
 msgstr "промяна"
 
-#: merge-recursive.c:1680
+#: merge-recursive.c:1704
 msgid "modified"
 msgstr "променен"
 
-#: merge-recursive.c:1690
+#: merge-recursive.c:1714
 msgid "content"
 msgstr "съдържание"
 
-#: merge-recursive.c:1697
+#: merge-recursive.c:1721
 msgid "add/add"
 msgstr "добавяне/добавяне"
 
-#: merge-recursive.c:1733
+#: merge-recursive.c:1757
 #, c-format
 msgid "Skipped %s (merged same as existing)"
 msgstr "Прескачане на „%s“ (слетият резултат е идентичен със сегашния)"
 
-#: merge-recursive.c:1747
+#: merge-recursive.c:1771
 #, c-format
 msgid "Auto-merging %s"
 msgstr "Автоматично сливане на „%s“"
 
-#: merge-recursive.c:1751 git-submodule.sh:945
+#: merge-recursive.c:1775 git-submodule.sh:944
 msgid "submodule"
 msgstr "ПОДМОДУЛ"
 
-#: merge-recursive.c:1752
+#: merge-recursive.c:1776
 #, c-format
 msgid "CONFLICT (%s): Merge conflict in %s"
 msgstr "КОНФЛИКТ (%s): Конфликт при сливане на „%s“"
 
-#: merge-recursive.c:1846
+#: merge-recursive.c:1870
 #, c-format
 msgid "Removing %s"
 msgstr "Изтриване на „%s“"
 
-#: merge-recursive.c:1872
+#: merge-recursive.c:1896
 msgid "file/directory"
 msgstr "файл/директория"
 
-#: merge-recursive.c:1878
+#: merge-recursive.c:1902
 msgid "directory/file"
 msgstr "директория/файл"
 
-#: merge-recursive.c:1884
+#: merge-recursive.c:1908
 #, c-format
 msgid "CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s"
 msgstr ""
 "КОНФЛИКТ (%s): Съществува директория на име „%s“ в „%s“.  Добавяне на „%s“ "
 "като „%s“"
 
-#: merge-recursive.c:1893
+#: merge-recursive.c:1917
 #, c-format
 msgid "Adding %s"
 msgstr "Добавяне на „%s“"
 
-#: merge-recursive.c:1930
-msgid "Already up-to-date!"
+#: merge-recursive.c:1954
+msgid "Already up to date!"
 msgstr "Вече е обновено!"
 
-#: merge-recursive.c:1939
+#: merge-recursive.c:1963
 #, c-format
 msgid "merging of trees %s and %s failed"
 msgstr "неуспешно сливане на дърветата „%s“ и „%s“"
 
-#: merge-recursive.c:2022
+#: merge-recursive.c:2060
 msgid "Merging:"
 msgstr "Сливане:"
 
-#: merge-recursive.c:2035
+#: merge-recursive.c:2073
 #, c-format
 msgid "found %u common ancestor:"
 msgid_plural "found %u common ancestors:"
 msgstr[0] "открит е %u общ предшественик:"
 msgstr[1] "открити са %u общи предшественици:"
 
-#: merge-recursive.c:2074
+#: merge-recursive.c:2112
 msgid "merge returned no commit"
 msgstr "сливането не върна подаване"
 
-#: merge-recursive.c:2137
+#: merge-recursive.c:2175
 #, c-format
 msgid "Could not parse object '%s'"
 msgstr "Неуспешен анализ на обекта „%s“"
 
-#: merge-recursive.c:2151 builtin/merge.c:646 builtin/merge.c:793
+#: merge-recursive.c:2189 builtin/merge.c:655 builtin/merge.c:814
 msgid "Unable to write index."
 msgstr "Индексът не може да бъде прочетен"
 
-#: notes-merge.c:273
+#: notes-merge.c:272
 #, c-format
 msgid ""
 "You have not concluded your previous notes merge (%s exists).\n"
@@ -2437,7 +2454,7 @@ msgstr ""
 "\n"
 "    git notes merge --abort"
 
-#: notes-merge.c:280
+#: notes-merge.c:279
 #, c-format
 msgid "You have not concluded your notes merge (%s exists)."
 msgstr ""
@@ -2468,16 +2485,35 @@ msgstr ""
 msgid "Bad %s value: '%s'"
 msgstr "Зададена е лоша стойност на променливата „%s“: „%s“"
 
-#: object.c:240
+#: object.c:239
 #, c-format
 msgid "unable to parse object: %s"
 msgstr "обектът „%s“ не може да бъде анализиран"
 
+#: packfile.c:556
+msgid "offset before end of packfile (broken .idx?)"
+msgstr ""
+"отместване преди края на пакетния файл (възможно е индексът да е повреден)"
+
+#: packfile.c:1683
+#, c-format
+msgid "offset before start of pack index for %s (corrupt index?)"
+msgstr ""
+"отместване преди началото на индекса на пакетния файл „%s“ (възможно е "
+"индексът да е повреден)"
+
+#: packfile.c:1687
+#, c-format
+msgid "offset beyond end of pack index for %s (truncated index?)"
+msgstr ""
+"отместване преди края на индекса на пакетния файл „%s“ (възможно е индексът "
+"да е отрязан)"
+
 #: parse-options.c:573
 msgid "..."
 msgstr "…"
 
-#: parse-options.c:591
+#: parse-options.c:592
 #, c-format
 msgid "usage: %s"
 msgstr "употреба: %s"
@@ -2485,17 +2521,17 @@ msgstr "употреба: %s"
 #. TRANSLATORS: the colon here should align with the
 #. one in "usage: %s" translation.
 #.
-#: parse-options.c:597
+#: parse-options.c:598
 #, c-format
 msgid "   or: %s"
 msgstr "     или: %s"
 
-#: parse-options.c:600
+#: parse-options.c:601
 #, c-format
 msgid "    %s"
 msgstr "    %s"
 
-#: parse-options.c:634
+#: parse-options.c:640
 msgid "-NUM"
 msgstr "-ЧИСЛО"
 
@@ -2504,7 +2540,7 @@ msgstr "-ЧИСЛО"
 msgid "malformed object name '%s'"
 msgstr "неправилно име на обект „%s“"
 
-#: path.c:890
+#: path.c:891
 #, c-format
 msgid "Could not make %s writable by group"
 msgstr "Не могат да се дадат права за запис в директорията „%s“ на групата"
@@ -2578,7 +2614,7 @@ msgstr "„%s“ (клавиш: „%c“)"
 msgid "%s: pathspec magic not supported by this command: %s"
 msgstr "%s: магическите пътища не се поддържат от командата „%s“"
 
-#: pathspec.c:575
+#: pathspec.c:571
 msgid ""
 "empty strings as pathspecs will be made invalid in upcoming releases. please "
 "use . instead if you meant to match all paths"
@@ -2587,12 +2623,12 @@ msgstr ""
 "следващи версии на Git.  Ако искате съвпадение с всички пътища, използвайте: "
 "„.“"
 
-#: pathspec.c:599
+#: pathspec.c:595
 #, c-format
 msgid "pathspec '%s' is beyond a symbolic link"
 msgstr "пътят „%s“ е след символна връзка"
 
-#: pretty.c:963
+#: pretty.c:962
 msgid "unable to parse --pretty format"
 msgstr "аргументът към опцията „--pretty“ не може да се анализира"
 
@@ -2615,50 +2651,51 @@ msgstr ""
 "„GIT_INDEX_VERSION“.\n"
 "Ще се ползва версия %i"
 
-#: read-cache.c:2308 builtin/merge.c:1019
+#: read-cache.c:2316 builtin/merge.c:1046
 #, c-format
 msgid "could not close '%s'"
 msgstr "„%s“ не може да се затвори"
 
-#: read-cache.c:2383 sequencer.c:1353 sequencer.c:2054
+#: read-cache.c:2394 sequencer.c:1355 sequencer.c:2077
 #, c-format
 msgid "could not stat '%s'"
 msgstr "неуспешно изпълнение на „stat“ върху „%s“"
 
-#: read-cache.c:2396
+#: read-cache.c:2407
 #, c-format
 msgid "unable to open git dir: %s"
 msgstr "не може да се отвори директорията на git: %s"
 
-#: read-cache.c:2408
+#: read-cache.c:2419
 #, c-format
 msgid "unable to unlink: %s"
 msgstr "неуспешно изтриване на „%s“"
 
-#: refs.c:622
+#: refs.c:638
 #, c-format
 msgid "Could not open '%s' for writing"
 msgstr "„%s“ не може да бъде отворен за запис"
 
-#: refs.c:1769
+#: refs.c:1779
 msgid "ref updates forbidden inside quarantine environment"
 msgstr "обновяванията на указатели са забранени в среди под карантина"
 
-#: refs/files-backend.c:1664
+#: refs/files-backend.c:1136
+#, c-format
+msgid "could not remove reference %s"
+msgstr "Указателят „%s“ не може да бъде изтрит"
+
+#: refs/files-backend.c:1150 refs/packed-backend.c:1430
+#: refs/packed-backend.c:1440
 #, c-format
 msgid "could not delete reference %s: %s"
 msgstr "Указателят „%s“ не може да бъде изтрит: %s"
 
-#: refs/files-backend.c:1667
+#: refs/files-backend.c:1153 refs/packed-backend.c:1443
 #, c-format
 msgid "could not delete references: %s"
 msgstr "Указателите не може да бъдат изтрити: %s"
 
-#: refs/files-backend.c:1676
-#, c-format
-msgid "could not remove reference %s"
-msgstr "Указателят „%s“ не може да бъде изтрит"
-
 #: ref-filter.c:35 wt-status.c:1811
 msgid "gone"
 msgstr "изтрит"
@@ -2678,157 +2715,157 @@ msgstr "назад с %d"
 msgid "ahead %d, behind %d"
 msgstr "напред с %d, назад с %d"
 
-#: ref-filter.c:105
+#: ref-filter.c:104
 #, c-format
 msgid "expected format: %%(color:<color>)"
 msgstr "очакван формат: %%(color:ЦВЯТ)"
 
-#: ref-filter.c:107
+#: ref-filter.c:106
 #, c-format
 msgid "unrecognized color: %%(color:%s)"
 msgstr "непознат цвят: %%(color:%s)"
 
-#: ref-filter.c:121
+#: ref-filter.c:126
 #, c-format
 msgid "Integer value expected refname:lstrip=%s"
 msgstr "очаква се цяло число за „refname:lstrip=%s“"
 
-#: ref-filter.c:125
+#: ref-filter.c:130
 #, c-format
 msgid "Integer value expected refname:rstrip=%s"
 msgstr "очаква се цяло число за „refname:rstrip=%s“"
 
-#: ref-filter.c:127
+#: ref-filter.c:132
 #, c-format
 msgid "unrecognized %%(%s) argument: %s"
 msgstr "непознат аргумент за „%%(%s)“: %s"
 
-#: ref-filter.c:167
+#: ref-filter.c:172
 #, c-format
 msgid "%%(body) does not take arguments"
 msgstr "%%(body) не приема аргументи"
 
-#: ref-filter.c:174
+#: ref-filter.c:179
 #, c-format
 msgid "%%(subject) does not take arguments"
 msgstr "%%(subject) не приема аргументи"
 
-#: ref-filter.c:181
+#: ref-filter.c:186
 #, c-format
 msgid "%%(trailers) does not take arguments"
 msgstr "%%(trailers) не приема аргументи"
 
-#: ref-filter.c:200
+#: ref-filter.c:205
 #, c-format
 msgid "positive value expected contents:lines=%s"
 msgstr "очаква се положителна стойност за „contents:lines=%s“"
 
-#: ref-filter.c:202
+#: ref-filter.c:207
 #, c-format
 msgid "unrecognized %%(contents) argument: %s"
 msgstr "непознат аргумент за %%(contents): %s"
 
-#: ref-filter.c:215
+#: ref-filter.c:220
 #, c-format
 msgid "positive value expected objectname:short=%s"
 msgstr "очаква се положителна стойност за „objectname:short=%s“"
 
-#: ref-filter.c:219
+#: ref-filter.c:224
 #, c-format
 msgid "unrecognized %%(objectname) argument: %s"
 msgstr "непознат аргумент за %%(objectname): %s"
 
-#: ref-filter.c:246
+#: ref-filter.c:251
 #, c-format
 msgid "expected format: %%(align:<width>,<position>)"
 msgstr "очакван формат: %%(align:ШИРОЧИНА,ПОЗИЦИЯ)"
 
-#: ref-filter.c:258
+#: ref-filter.c:263
 #, c-format
 msgid "unrecognized position:%s"
 msgstr "непозната позиция: %s"
 
-#: ref-filter.c:262
+#: ref-filter.c:267
 #, c-format
 msgid "unrecognized width:%s"
 msgstr "непозната широчина: %s"
 
-#: ref-filter.c:268
+#: ref-filter.c:273
 #, c-format
 msgid "unrecognized %%(align) argument: %s"
 msgstr "непознат аргумент за %%(align): %s"
 
-#: ref-filter.c:272
+#: ref-filter.c:277
 #, c-format
 msgid "positive width expected with the %%(align) atom"
 msgstr "очаква се положителна широчина с лексемата „%%(align)“"
 
-#: ref-filter.c:287
+#: ref-filter.c:292
 #, c-format
 msgid "unrecognized %%(if) argument: %s"
 msgstr "непознат аргумент за „%%(if)“: %s"
 
-#: ref-filter.c:378
+#: ref-filter.c:382
 #, c-format
 msgid "malformed field name: %.*s"
 msgstr "неправилно име на обект: „%.*s“"
 
-#: ref-filter.c:404
+#: ref-filter.c:408
 #, c-format
 msgid "unknown field name: %.*s"
 msgstr "непознато име на обект: „%.*s“"
 
-#: ref-filter.c:508
+#: ref-filter.c:520
 #, c-format
 msgid "format: %%(if) atom used without a %%(then) atom"
 msgstr "формат: лексемата %%(if) е използвана без съответната ѝ %%(then)"
 
-#: ref-filter.c:568
+#: ref-filter.c:580
 #, c-format
 msgid "format: %%(then) atom used without an %%(if) atom"
 msgstr "формат: лексемата %%(then) е използвана без съответната ѝ %%(if)"
 
-#: ref-filter.c:570
+#: ref-filter.c:582
 #, c-format
 msgid "format: %%(then) atom used more than once"
 msgstr "формат: лексемата %%(then) е използвана повече от един път"
 
-#: ref-filter.c:572
+#: ref-filter.c:584
 #, c-format
 msgid "format: %%(then) atom used after %%(else)"
 msgstr "формат: лексемата %%(then) е използвана след %%(else)"
 
-#: ref-filter.c:598
+#: ref-filter.c:610
 #, c-format
 msgid "format: %%(else) atom used without an %%(if) atom"
 msgstr "формат: лексемата %%(else) е използвана без съответната ѝ %%(if)"
 
-#: ref-filter.c:600
+#: ref-filter.c:612
 #, c-format
 msgid "format: %%(else) atom used without a %%(then) atom"
 msgstr "формат: лексемата %%(else) е използвана без съответната ѝ %%(then)"
 
-#: ref-filter.c:602
+#: ref-filter.c:614
 #, c-format
 msgid "format: %%(else) atom used more than once"
 msgstr "формат: лексемата %%(else) е използвана повече от един път"
 
-#: ref-filter.c:615
+#: ref-filter.c:627
 #, c-format
 msgid "format: %%(end) atom used without corresponding atom"
 msgstr "формат: лексемата %%(end) е използвана без съответната ѝ"
 
-#: ref-filter.c:670
+#: ref-filter.c:682
 #, c-format
 msgid "malformed format string %s"
-msgstr "неправилен низ за форматиране „%s“"
+msgstr "неправилен форматиращ низ „%s“"
 
-#: ref-filter.c:1254
+#: ref-filter.c:1268
 #, c-format
 msgid "(no branch, rebasing %s)"
 msgstr "(извън клон, пребазиране на „%s“)"
 
-#: ref-filter.c:1257
+#: ref-filter.c:1271
 #, c-format
 msgid "(no branch, bisect started on %s)"
 msgstr "(извън клон, двоично търсене от „%s“)"
@@ -2836,7 +2873,7 @@ msgstr "(извън клон, двоично търсене от „%s“)"
 #. TRANSLATORS: make sure this matches "HEAD
 #. detached at " in wt-status.c
 #.
-#: ref-filter.c:1265
+#: ref-filter.c:1279
 #, c-format
 msgid "(HEAD detached at %s)"
 msgstr "(Указателят „HEAD“ не е свързан и е при „%s“)"
@@ -2844,110 +2881,110 @@ msgstr "(Указателят „HEAD“ не е свързан и е при „
 #. TRANSLATORS: make sure this matches "HEAD
 #. detached from " in wt-status.c
 #.
-#: ref-filter.c:1272
+#: ref-filter.c:1286
 #, c-format
 msgid "(HEAD detached from %s)"
 msgstr "Указателят „HEAD“ не е свързан и е отделѐн от „%s“"
 
-#: ref-filter.c:1276
+#: ref-filter.c:1290
 msgid "(no branch)"
 msgstr "(извън клон)"
 
-#: ref-filter.c:1426 ref-filter.c:1457
+#: ref-filter.c:1439 ref-filter.c:1470
 #, c-format
 msgid "missing object %s for %s"
 msgstr "обектът „%s“ липсва за „%s“"
 
-#: ref-filter.c:1429 ref-filter.c:1460
+#: ref-filter.c:1442 ref-filter.c:1473
 #, c-format
 msgid "parse_object_buffer failed on %s for %s"
 msgstr "неуспешно анализиране чрез „parse_object_buffer“ на „%s“ за „%s“"
 
-#: ref-filter.c:1760
+#: ref-filter.c:1773
 #, c-format
 msgid "malformed object at '%s'"
 msgstr "обект със сгрешен формат при „%s“"
 
-#: ref-filter.c:1827
+#: ref-filter.c:1840
 #, c-format
 msgid "ignoring ref with broken name %s"
 msgstr "игнориране на указателя с грешно име „%s“"
 
-#: ref-filter.c:1832
+#: ref-filter.c:1845
 #, c-format
 msgid "ignoring broken ref %s"
 msgstr "игнориране на повредения указател „%s“"
 
-#: ref-filter.c:2095
+#: ref-filter.c:2107
 #, c-format
 msgid "format: %%(end) atom missing"
 msgstr "грешка във форма̀та: липсва лексемата %%(end)"
 
-#: ref-filter.c:2176
+#: ref-filter.c:2201
 #, c-format
 msgid "malformed object name %s"
 msgstr "неправилно име на обект „%s“"
 
-#: remote.c:747
+#: remote.c:750
 #, c-format
 msgid "Cannot fetch both %s and %s to %s"
 msgstr "Невъзможно е да се доставят едновременно и „%s“, и „%s“ към „%s“"
 
-#: remote.c:751
+#: remote.c:754
 #, c-format
 msgid "%s usually tracks %s, not %s"
 msgstr "„%s“ обикновено следи „%s“, а не „%s“"
 
-#: remote.c:755
+#: remote.c:758
 #, c-format
 msgid "%s tracks both %s and %s"
 msgstr "„%s“ следи както „%s“, така и „%s“"
 
-#: remote.c:763
+#: remote.c:766
 msgid "Internal error"
 msgstr "Вътрешна грешка"
 
-#: remote.c:1680 remote.c:1782
+#: remote.c:1681 remote.c:1783
 msgid "HEAD does not point to a branch"
 msgstr "Указателят „HEAD“ не сочи към клон"
 
-#: remote.c:1689
+#: remote.c:1690
 #, c-format
 msgid "no such branch: '%s'"
 msgstr "няма клон на име „%s“"
 
-#: remote.c:1692
+#: remote.c:1693
 #, c-format
 msgid "no upstream configured for branch '%s'"
 msgstr "не е зададен клон-източник за клона „%s“"
 
-#: remote.c:1698
+#: remote.c:1699
 #, c-format
 msgid "upstream branch '%s' not stored as a remote-tracking branch"
 msgstr "клонът-източник „%s“ не е съхранен като следящ клон"
 
-#: remote.c:1713
+#: remote.c:1714
 #, c-format
 msgid "push destination '%s' on remote '%s' has no local tracking branch"
 msgstr ""
 "липсва локален следящ клон за местоположението за изтласкване „%s“ в "
 "хранилището „%s“"
 
-#: remote.c:1725
+#: remote.c:1726
 #, c-format
 msgid "branch '%s' has no remote for pushing"
 msgstr "няма информация клонът „%s“ да следи някой друг"
 
-#: remote.c:1736
+#: remote.c:1737
 #, c-format
 msgid "push refspecs for '%s' do not include '%s'"
 msgstr "указателят за изтласкване на „%s“ не включва „%s“"
 
-#: remote.c:1749
+#: remote.c:1750
 msgid "push has no destination (push.default is 'nothing')"
 msgstr "указателят за изтласкване не включва цел („push.default“ е „nothing“)"
 
-#: remote.c:1771
+#: remote.c:1772
 msgid "cannot resolve 'simple' push to a single destination"
 msgstr "простото (simple) изтласкване не съответства на една цел"
 
@@ -2962,7 +2999,7 @@ msgstr "  (за да коригирате това, използвайте „gi
 
 #: remote.c:2083
 #, c-format
-msgid "Your branch is up-to-date with '%s'.\n"
+msgid "Your branch is up to date with '%s'.\n"
 msgstr "Клонът е актуализиран към „%s“.\n"
 
 #: remote.c:2087
@@ -3007,16 +3044,16 @@ msgstr[1] ""
 msgid "  (use \"git pull\" to merge the remote branch into yours)\n"
 msgstr "  (слейте отдалечения клон в локалния чрез „git pull“)\n"
 
-#: revision.c:2187
+#: revision.c:2256
 msgid "your current branch appears to be broken"
 msgstr "Текущият клон е повреден"
 
-#: revision.c:2190
+#: revision.c:2259
 #, c-format
 msgid "your current branch '%s' does not have any commits yet"
 msgstr "Текущият клон „%s“ е без подавания "
 
-#: revision.c:2384
+#: revision.c:2453
 msgid "--first-parent is incompatible with --bisect"
 msgstr "опциите „--first-parent“ и „--bisect“ са несъвместими"
 
@@ -3059,24 +3096,24 @@ msgstr "получаващата страна не поддържа изтлас
 msgid "the receiving end does not support push options"
 msgstr "отсрещната страна не поддържа опции при изтласкване"
 
-#: sequencer.c:216
+#: sequencer.c:218
 msgid "revert"
 msgstr "отмяна"
 
-#: sequencer.c:218
+#: sequencer.c:220
 msgid "cherry-pick"
 msgstr "отбиране"
 
-#: sequencer.c:220
+#: sequencer.c:222
 msgid "rebase -i"
 msgstr "rebase -i"
 
-#: sequencer.c:222
+#: sequencer.c:224
 #, c-format
 msgid "Unknown action: %d"
 msgstr "Неизвестно действие: %d"
 
-#: sequencer.c:279
+#: sequencer.c:281
 msgid ""
 "after resolving the conflicts, mark the corrected paths\n"
 "with 'git add <paths>' or 'git rm <paths>'"
@@ -3084,7 +3121,7 @@ msgstr ""
 "след коригирането на конфликтите, отбележете съответните\n"
 "пътища с „git add ПЪТ…“ или „git rm ПЪТ…“."
 
-#: sequencer.c:282
+#: sequencer.c:284
 msgid ""
 "after resolving the conflicts, mark the corrected paths\n"
 "with 'git add <paths>' or 'git rm <paths>'\n"
@@ -3094,42 +3131,43 @@ msgstr ""
 "пътища с „git add ПЪТ…“ или „git rm ПЪТ…“, след което\n"
 "подайте резултата с командата „git commit'“."
 
-#: sequencer.c:295 sequencer.c:1685
+#: sequencer.c:297 sequencer.c:1704
 #, c-format
 msgid "could not lock '%s'"
 msgstr "„%s“ не може да се заключи"
 
-#: sequencer.c:298 sequencer.c:1563 sequencer.c:1690 sequencer.c:1704
+#: sequencer.c:300 sequencer.c:1581 sequencer.c:1709 sequencer.c:1723
+#: sequencer.c:2733 sequencer.c:2749
 #, c-format
 msgid "could not write to '%s'"
 msgstr "в „%s“ не може да се пише"
 
-#: sequencer.c:302
+#: sequencer.c:304
 #, c-format
 msgid "could not write eol to '%s'"
 msgstr "краят на ред не може да се запише в „%s“"
 
-#: sequencer.c:306 sequencer.c:1568 sequencer.c:1692
+#: sequencer.c:308 sequencer.c:1586 sequencer.c:1711
 #, c-format
 msgid "failed to finalize '%s'."
 msgstr "„%s“ не може да се завърши."
 
-#: sequencer.c:330 sequencer.c:817 sequencer.c:1589 builtin/am.c:258
-#: builtin/commit.c:750 builtin/merge.c:1017
+#: sequencer.c:332 sequencer.c:819 sequencer.c:1607 builtin/am.c:259
+#: builtin/commit.c:754 builtin/merge.c:1044
 #, c-format
 msgid "could not read '%s'"
 msgstr "файлът „%s“ не може да бъде прочетен"
 
-#: sequencer.c:356
+#: sequencer.c:358
 #, c-format
 msgid "your local changes would be overwritten by %s."
 msgstr "локалните ви промени ще бъдат презаписани при %s."
 
-#: sequencer.c:360
+#: sequencer.c:362
 msgid "commit your changes or stash them to proceed."
 msgstr "подайте или скатайте промените, за да продължите"
 
-#: sequencer.c:389
+#: sequencer.c:391
 #, c-format
 msgid "%s: fast-forward"
 msgstr "%s: превъртане"
@@ -3137,20 +3175,20 @@ msgstr "%s: превъртане"
 #. TRANSLATORS: %s will be "revert", "cherry-pick" or
 #. "rebase -i".
 #.
-#: sequencer.c:472
+#: sequencer.c:474
 #, c-format
 msgid "%s: Unable to write new index file"
 msgstr "%s: новият индекс не може да бъде запазен"
 
-#: sequencer.c:491
+#: sequencer.c:493
 msgid "could not resolve HEAD commit\n"
 msgstr "подаването сочено от указателя „HEAD“ не може да бъде открито\n"
 
-#: sequencer.c:511
+#: sequencer.c:513
 msgid "unable to update cache tree\n"
 msgstr "дървото на кеша не може да бъде обновено\n"
 
-#: sequencer.c:595
+#: sequencer.c:597
 #, c-format
 msgid ""
 "you have staged changes in your working tree\n"
@@ -3179,17 +3217,17 @@ msgstr ""
 "\n"
 "    git rebase --continue\n"
 
-#: sequencer.c:697
+#: sequencer.c:699
 #, c-format
 msgid "could not parse commit %s\n"
 msgstr "подаването „%s“ не може да бъде анализирано\n"
 
-#: sequencer.c:702
+#: sequencer.c:704
 #, c-format
 msgid "could not parse parent commit %s\n"
 msgstr "родителското подаване „%s“ не може да бъде анализирано\n"
 
-#: sequencer.c:824
+#: sequencer.c:826
 #, c-format
 msgid ""
 "unexpected 1st line of squash message:\n"
@@ -3200,7 +3238,7 @@ msgstr ""
 "\n"
 "    %.*s"
 
-#: sequencer.c:830
+#: sequencer.c:832
 #, c-format
 msgid ""
 "invalid 1st line of squash message:\n"
@@ -3211,239 +3249,240 @@ msgstr ""
 "\n"
 "    %.*s"
 
-#: sequencer.c:836 sequencer.c:861
+#: sequencer.c:838 sequencer.c:863
 #, c-format
 msgid "This is a combination of %d commits."
 msgstr "Това е обединение от %d подавания"
 
-#: sequencer.c:845
+#: sequencer.c:847 sequencer.c:2681
 msgid "need a HEAD to fixup"
 msgstr "За смачкване ви трябва указател „HEAD“"
 
-#: sequencer.c:847
+#: sequencer.c:849
 msgid "could not read HEAD"
 msgstr "указателят „HEAD“ не може да се прочете"
 
-#: sequencer.c:849
+#: sequencer.c:851
 msgid "could not read HEAD's commit message"
 msgstr ""
 "съобщението за подаване към указателя „HEAD“ не може да бъде прочетено: %s"
 
-#: sequencer.c:855
+#: sequencer.c:857
 #, c-format
 msgid "cannot write '%s'"
 msgstr "„%s“ не може да се запази"
 
-#: sequencer.c:864 git-rebase--interactive.sh:445
+#: sequencer.c:866 git-rebase--interactive.sh:446
 msgid "This is the 1st commit message:"
 msgstr "Това е 1-то съобщение при подаване:"
 
-#: sequencer.c:872
+#: sequencer.c:874
 #, c-format
 msgid "could not read commit message of %s"
 msgstr "съобщението за подаване към „%s“ не може да бъде прочетено"
 
-#: sequencer.c:879
+#: sequencer.c:881
 #, c-format
 msgid "This is the commit message #%d:"
 msgstr "Това е съобщение при подаване №%d:"
 
-#: sequencer.c:884
+#: sequencer.c:886
 #, c-format
 msgid "The commit message #%d will be skipped:"
 msgstr "Съобщение при подаване №%d ще бъде прескочено:"
 
-#: sequencer.c:889
+#: sequencer.c:891
 #, c-format
 msgid "unknown command: %d"
 msgstr "непозната команда: %d"
 
-#: sequencer.c:955
+#: sequencer.c:957
 msgid "your index file is unmerged."
 msgstr "индексът не е слят."
 
-#: sequencer.c:973
+#: sequencer.c:975
 #, c-format
 msgid "commit %s is a merge but no -m option was given."
 msgstr "подаването „%s“ е сливане, но не е дадена опцията „-m“"
 
-#: sequencer.c:981
+#: sequencer.c:983
 #, c-format
 msgid "commit %s does not have parent %d"
 msgstr "подаването „%s“ няма родител %d"
 
-#: sequencer.c:985
+#: sequencer.c:987
 #, c-format
 msgid "mainline was specified but commit %s is not a merge."
 msgstr "указано е базово подаване, но подаването „%s“ не е сливане."
 
-#: sequencer.c:991
+#: sequencer.c:993
 #, c-format
 msgid "cannot get commit message for %s"
 msgstr "неуспешно извличане на съобщението за подаване на „%s“"
 
 #. TRANSLATORS: The first %s will be a "todo" command like
 #. "revert" or "pick", the second %s a SHA1.
-#: sequencer.c:1012
+#: sequencer.c:1014
 #, c-format
 msgid "%s: cannot parse parent commit %s"
 msgstr "%s: неразпозната стойност за родителското подаване „%s“"
 
-#: sequencer.c:1075 sequencer.c:1830
+#: sequencer.c:1077 sequencer.c:1853
 #, c-format
 msgid "could not rename '%s' to '%s'"
 msgstr "„%s“ не може да се преименува на „%s“"
 
-#: sequencer.c:1126
+#: sequencer.c:1128
 #, c-format
 msgid "could not revert %s... %s"
 msgstr "подаването „%s“… не може да бъде отменено: „%s“"
 
-#: sequencer.c:1127
+#: sequencer.c:1129
 #, c-format
 msgid "could not apply %s... %s"
 msgstr "подаването „%s“… не може да бъде приложено: „%s“"
 
-#: sequencer.c:1169
+#: sequencer.c:1171
 msgid "empty commit set passed"
 msgstr "зададено е празно множество от подавания"
 
-#: sequencer.c:1179
+#: sequencer.c:1181
 #, c-format
 msgid "git %s: failed to read the index"
 msgstr "git %s: неуспешно изчитане на индекса"
 
-#: sequencer.c:1186
+#: sequencer.c:1188
 #, c-format
 msgid "git %s: failed to refresh the index"
 msgstr "git %s: неуспешно обновяване на индекса"
 
-#: sequencer.c:1306
+#: sequencer.c:1308
 #, c-format
 msgid "invalid line %d: %.*s"
 msgstr "неправилен ред %d: %.*s"
 
-#: sequencer.c:1314
+#: sequencer.c:1316
 #, c-format
 msgid "cannot '%s' without a previous commit"
 msgstr "Без предишно подаване не може да се изпълни „%s“"
 
-#: sequencer.c:1347
+#: sequencer.c:1349 sequencer.c:2503 sequencer.c:2588 sequencer.c:2614
+#: sequencer.c:2691 sequencer.c:2810 sequencer.c:2951
 #, c-format
 msgid "could not read '%s'."
 msgstr "от „%s“ не може да се чете."
 
-#: sequencer.c:1359
+#: sequencer.c:1361
 msgid "please fix this using 'git rebase --edit-todo'."
 msgstr "коригирайте това чрез „git rebase --edit-todo“."
 
-#: sequencer.c:1361
+#: sequencer.c:1363
 #, c-format
 msgid "unusable instruction sheet: '%s'"
 msgstr "неизползваем файл с описание на предстоящите действия: „%s“"
 
-#: sequencer.c:1366
+#: sequencer.c:1368
 msgid "no commits parsed."
 msgstr "никое от подаванията не може да се разпознае."
 
-#: sequencer.c:1377
+#: sequencer.c:1379
 msgid "cannot cherry-pick during a revert."
 msgstr ""
 "по време на отмяна на подаване не може да се извърши отбиране на подаване."
 
-#: sequencer.c:1379
+#: sequencer.c:1381
 msgid "cannot revert during a cherry-pick."
 msgstr "по време на отбиране не може да се извърши отмяна на подаване."
 
-#: sequencer.c:1442
+#: sequencer.c:1448
 #, c-format
 msgid "invalid key: %s"
 msgstr "неправилен ключ: „%s“"
 
-#: sequencer.c:1445
+#: sequencer.c:1451
 #, c-format
 msgid "invalid value for %s: %s"
 msgstr "неправилна стойност за „%s“: „%s“"
 
-#: sequencer.c:1502
+#: sequencer.c:1517
 #, c-format
 msgid "malformed options sheet: '%s'"
 msgstr "неправилен файл с опции: „%s“"
 
-#: sequencer.c:1540
+#: sequencer.c:1555
 msgid "a cherry-pick or revert is already in progress"
 msgstr ""
 "в момента вече се извършва отбиране на подавания или пребазиране на клона"
 
-#: sequencer.c:1541
+#: sequencer.c:1556
 msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
 msgstr "използвайте „git cherry-pick (--continue | --quit | --abort)“"
 
-#: sequencer.c:1544
+#: sequencer.c:1559
 #, c-format
 msgid "could not create sequencer directory '%s'"
 msgstr "директорията за секвенсора „%s“ не може да бъде създадена"
 
-#: sequencer.c:1558
+#: sequencer.c:1574
 msgid "could not lock HEAD"
 msgstr "указателят „HEAD“ не може да се заключи"
 
-#: sequencer.c:1614 sequencer.c:2188
+#: sequencer.c:1632 sequencer.c:2211
 msgid "no cherry-pick or revert in progress"
 msgstr ""
 "в момента не се извършва отбиране на подавания или пребазиране на клона"
 
-#: sequencer.c:1616
+#: sequencer.c:1634
 msgid "cannot resolve HEAD"
 msgstr "Подаването сочено от указателя „HEAD“ не може да бъде открито"
 
-#: sequencer.c:1618 sequencer.c:1652
+#: sequencer.c:1636 sequencer.c:1671
 msgid "cannot abort from a branch yet to be born"
 msgstr ""
 "действието не може да бъде преустановено, когато сте на клон, който тепърва "
 "предстои да бъде създаден"
 
-#: sequencer.c:1638 builtin/grep.c:929
+#: sequencer.c:1657 builtin/grep.c:711
 #, c-format
 msgid "cannot open '%s'"
 msgstr "„%s“ не може да бъде отворен"
 
-#: sequencer.c:1640
+#: sequencer.c:1659
 #, c-format
 msgid "cannot read '%s': %s"
 msgstr "„%s“ не може да бъде прочетен: %s"
 
-#: sequencer.c:1641
+#: sequencer.c:1660
 msgid "unexpected end of file"
 msgstr "неочакван край на файл"
 
-#: sequencer.c:1647
+#: sequencer.c:1666
 #, c-format
 msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
 msgstr ""
 "запазеният преди започването на отбирането файл за указателя „HEAD“ — „%s“ е "
 "повреден"
 
-#: sequencer.c:1658
+#: sequencer.c:1677
 msgid "You seem to have moved HEAD. Not rewinding, check your HEAD!"
 msgstr ""
 "Изглежда указателят „HEAD“ е променен.  Проверете към какво сочи.\n"
 "Не се правят промени."
 
-#: sequencer.c:1795 sequencer.c:2086
+#: sequencer.c:1818 sequencer.c:2109
 msgid "cannot read HEAD"
 msgstr "указателят „HEAD“ не може да бъде прочетен"
 
-#: sequencer.c:1835 builtin/difftool.c:633
+#: sequencer.c:1858 builtin/difftool.c:640
 #, c-format
 msgid "could not copy '%s' to '%s'"
 msgstr "„%s“ не може да се копира като „%s“"
 
-#: sequencer.c:1851
+#: sequencer.c:1874
 msgid "could not read index"
 msgstr "индексът не може да бъде прочетен"
 
-#: sequencer.c:1856
+#: sequencer.c:1879
 #, c-format
 msgid ""
 "execution failed: %s\n"
@@ -3458,11 +3497,11 @@ msgstr ""
 "    git rebase --continue\n"
 "\n"
 
-#: sequencer.c:1862
+#: sequencer.c:1885
 msgid "and made changes to the index and/or the working tree\n"
 msgstr "и промени индекса и/или работното дърво\n"
 
-#: sequencer.c:1868
+#: sequencer.c:1891
 #, c-format
 msgid ""
 "execution succeeded: %s\n"
@@ -3479,17 +3518,17 @@ msgstr ""
 "    git rebase --continue\n"
 "\n"
 
-#: sequencer.c:1925
+#: sequencer.c:1948
 #, c-format
 msgid "Applied autostash.\n"
 msgstr "Автоматично скатаното е приложено.\n"
 
-#: sequencer.c:1937
+#: sequencer.c:1960
 #, c-format
 msgid "cannot store %s"
 msgstr "„%s“ не може да бъде запазен"
 
-#: sequencer.c:1940 git-rebase.sh:173
+#: sequencer.c:1963 git-rebase.sh:175
 #, c-format
 msgid ""
 "Applying autostash resulted in conflicts.\n"
@@ -3500,57 +3539,57 @@ msgstr ""
 "надеждно скатани.  Можете да пробвате да ги приложите чрез „git stash pop“\n"
 "или да ги изхвърлите чрез „git stash drop“, когато поискате.\n"
 
-#: sequencer.c:2022
+#: sequencer.c:2045
 #, c-format
 msgid "Stopped at %s...  %.*s\n"
 msgstr "Спиране при „%s“…  %.*s\n"
 
-#: sequencer.c:2064
+#: sequencer.c:2087
 #, c-format
 msgid "unknown command %d"
 msgstr "непозната команда %d"
 
-#: sequencer.c:2094
+#: sequencer.c:2117
 msgid "could not read orig-head"
 msgstr "указателят за „orig-head“ не може да се прочете"
 
-#: sequencer.c:2099
+#: sequencer.c:2122 sequencer.c:2678
 msgid "could not read 'onto'"
 msgstr "указателят за „onto“ не може да се прочете"
 
-#: sequencer.c:2106
+#: sequencer.c:2129
 #, c-format
 msgid "could not update %s"
 msgstr "„%s“ не може да се обнови"
 
-#: sequencer.c:2113
+#: sequencer.c:2136
 #, c-format
 msgid "could not update HEAD to %s"
 msgstr "„HEAD“ не може да бъде обновен до „%s“"
 
-#: sequencer.c:2197
+#: sequencer.c:2220
 msgid "cannot rebase: You have unstaged changes."
 msgstr "не може да пребазирате, защото има промени, които не са в индекса."
 
-#: sequencer.c:2202
+#: sequencer.c:2225
 msgid "could not remove CHERRY_PICK_HEAD"
 msgstr "указателят „CHERRY_PICK_HEAD“ не може да бъде изтрит"
 
-#: sequencer.c:2211
+#: sequencer.c:2234
 msgid "cannot amend non-existing commit"
 msgstr "несъществуващо подаване не може да се поправи"
 
-#: sequencer.c:2213
+#: sequencer.c:2236
 #, c-format
 msgid "invalid file: '%s'"
 msgstr "неправилен файл: „%s“"
 
-#: sequencer.c:2215
+#: sequencer.c:2238
 #, c-format
 msgid "invalid contents: '%s'"
 msgstr "неправилно съдържание: „%s“"
 
-#: sequencer.c:2218
+#: sequencer.c:2241
 msgid ""
 "\n"
 "You have uncommitted changes in your working tree. Please, commit them\n"
@@ -3560,24 +3599,111 @@ msgstr ""
 "В работното дърво има неподадени промени.  Първо ги подайте, а след това\n"
 "отново изпълнете „git rebase --continue“."
 
-#: sequencer.c:2228
+#: sequencer.c:2251
 msgid "could not commit staged changes."
 msgstr "промените в индекса не могат да бъдат подадени."
 
-#: sequencer.c:2308
+#: sequencer.c:2331
 #, c-format
 msgid "%s: can't cherry-pick a %s"
 msgstr "%s: не може да се отбере „%s“"
 
-#: sequencer.c:2312
+#: sequencer.c:2335
 #, c-format
 msgid "%s: bad revision"
 msgstr "%s: неправилна версия"
 
-#: sequencer.c:2345
+#: sequencer.c:2368
 msgid "can't revert as initial commit"
 msgstr "първоначалното подаване не може да бъде отменено"
 
+#: sequencer.c:2471
+msgid "make_script: unhandled options"
+msgstr "make_script: неподдържани опции"
+
+#: sequencer.c:2474
+msgid "make_script: error preparing revisions"
+msgstr "make_script: грешка при подготовката на версии"
+
+#: sequencer.c:2510
+#, c-format
+msgid "unusable todo list: '%s'"
+msgstr "неуспешно изтриване на списъка за изпълнение: „%s“"
+
+#: sequencer.c:2516
+#, c-format
+msgid "unable to open '%s' for writing"
+msgstr "„%s“ не може да бъде отворен за запис"
+
+#: sequencer.c:2561
+#, c-format
+msgid "unrecognized setting %s for optionrebase.missingCommitsCheck. Ignoring."
+msgstr ""
+"Непозната стойност „%s“ за настройката „optionrebase.missingCommitsCheck“.  "
+"Настройката се прескача."
+
+#: sequencer.c:2641
+#, c-format
+msgid ""
+"Warning: some commits may have been dropped accidentally.\n"
+"Dropped commits (newer to older):\n"
+msgstr ""
+"Предупреждение: някои подавания може да са пропуснати.\n"
+"Пропуснати подавания (новите са най-отгоре):\n"
+
+#: sequencer.c:2648
+#, c-format
+msgid ""
+"To avoid this message, use \"drop\" to explicitly remove a commit.\n"
+"\n"
+"Use 'git config rebase.missingCommitsCheck' to change the level of "
+"warnings.\n"
+"The possible behaviours are: ignore, warn, error.\n"
+"\n"
+msgstr ""
+"За да не получавате това съобщение, изрично ползвайте командата „drop“.\n"
+"\n"
+"Настройката „rebase.missingCommitsCheck“ управлява нивото на предупреждение\n"
+"Възможните стойности са „ignore“ (пренебрегване), „warn“ (само "
+"предупреждение)\n"
+"или „error“ (считане за грешка).\n"
+
+#: sequencer.c:2660
+#, c-format
+msgid ""
+"You can fix this with 'git rebase --edit-todo' and then run 'git rebase --"
+"continue'.\n"
+"Or you can abort the rebase with 'git rebase --abort'.\n"
+msgstr ""
+"Може да промените това с командите „git rebase --edit-todo“ и „git rebase --"
+"continue“ след това.\n"
+"Може и да преустановите пребазирането с командата „git rebase --abort“.\n"
+
+#: sequencer.c:2708
+#, c-format
+msgid "could not parse commit '%s'"
+msgstr "подаването „%s“ не може да бъде анализирано"
+
+#: sequencer.c:2727 sequencer.c:2742 wrapper.c:225 wrapper.c:395
+#: builtin/am.c:775
+#, c-format
+msgid "could not open '%s' for writing"
+msgstr "„%s“ не може да бъде отворен за запис"
+
+#: sequencer.c:2756
+#, c-format
+msgid "could not truncate '%s'"
+msgstr "неуспешно отрязване чрез „truncate“ върху „%s“"
+
+#: sequencer.c:2848
+msgid "the script was already rearranged."
+msgstr "скриптът вече е преподреден."
+
+#: sequencer.c:2953
+#, c-format
+msgid "could not finish '%s'"
+msgstr "„%s“ не може да се завърши"
+
 #: setup.c:171
 #, c-format
 msgid ""
@@ -3614,36 +3740,36 @@ msgstr ""
 "\n"
 "    git КОМАНДА [ВЕРСИЯ…] -- [ФАЙЛ…]"
 
-#: setup.c:504
+#: setup.c:499
 #, c-format
 msgid "Expected git repo version <= %d, found %d"
 msgstr "Очаква се версия на хранилището на git <= %d, а не %d"
 
-#: setup.c:512
+#: setup.c:507
 msgid "unknown repository extensions found:"
 msgstr "открити са непознати разширения в хранилището:"
 
-#: setup.c:810
+#: setup.c:806
 #, c-format
 msgid "Not a git repository (or any of the parent directories): %s"
 msgstr ""
 "Нито тази, нито която и да е от по-горните директории, не е хранилище на "
 "git: %s"
 
-#: setup.c:812 builtin/index-pack.c:1652
+#: setup.c:808 builtin/index-pack.c:1653
 msgid "Cannot come back to cwd"
 msgstr "Процесът не може да се върне към предишната работна директория"
 
-#: setup.c:1050
+#: setup.c:1046
 msgid "Unable to read current working directory"
 msgstr "Текущата работна директория не може да бъде прочетена"
 
-#: setup.c:1062 setup.c:1068
+#: setup.c:1058 setup.c:1064
 #, c-format
 msgid "Cannot change to '%s'"
 msgstr "Не може да се влезе в директорията „%s“"
 
-#: setup.c:1081
+#: setup.c:1077
 #, c-format
 msgid ""
 "Not a git repository (or any parent up to mount point %s)\n"
@@ -3654,7 +3780,7 @@ msgstr ""
 "Git работи в рамките на една файлова система, защото променливата на средата "
 "„GIT_DISCOVERY_ACROSS_FILESYSTEM“ не е зададена."
 
-#: setup.c:1173
+#: setup.c:1159
 #, c-format
 msgid ""
 "Problem with core.sharedRepository filemode value (0%.3o).\n"
@@ -3664,60 +3790,41 @@ msgstr ""
 "(0%.3o).\n"
 "Собственикът на файла трябва да има права за писане и четене."
 
-#: sha1_file.c:560
+#: sha1_file.c:528
 #, c-format
 msgid "path '%s' does not exist"
 msgstr "пътят „%s“ не съществува."
 
-#: sha1_file.c:586
+#: sha1_file.c:554
 #, c-format
 msgid "reference repository '%s' as a linked checkout is not supported yet."
 msgstr "все още не се поддържа еталонно хранилище „%s“ като свързано."
 
-#: sha1_file.c:592
+#: sha1_file.c:560
 #, c-format
 msgid "reference repository '%s' is not a local repository."
 msgstr "еталонното хранилище „%s“ не е локално"
 
-#: sha1_file.c:598
+#: sha1_file.c:566
 #, c-format
 msgid "reference repository '%s' is shallow"
 msgstr "еталонното хранилище „%s“ е плитко"
 
-#: sha1_file.c:606
+#: sha1_file.c:574
 #, c-format
 msgid "reference repository '%s' is grafted"
 msgstr "еталонното хранилище „%s“ е с присаждане"
 
-#: sha1_file.c:1245
-msgid "offset before end of packfile (broken .idx?)"
-msgstr ""
-"отместване преди края на пакетния файл (възможно е индексът да е повреден)"
-
-#: sha1_file.c:2729
-#, c-format
-msgid "offset before start of pack index for %s (corrupt index?)"
-msgstr ""
-"отместване преди началото на индекса на пакетния файл „%s“ (възможно е "
-"индексът да е повреден)"
-
-#: sha1_file.c:2733
-#, c-format
-msgid "offset beyond end of pack index for %s (truncated index?)"
-msgstr ""
-"отместване преди края на индекса на пакетния файл „%s“ (възможно е индексът "
-"да е отрязан)"
-
-#: sha1_name.c:419
+#: sha1_name.c:420
 #, c-format
 msgid "short SHA1 %s is ambiguous"
 msgstr "късият SHA1 „%s“ не е еднозначен"
 
-#: sha1_name.c:430
+#: sha1_name.c:431
 msgid "The candidates are:"
 msgstr "Възможностите са:"
 
-#: sha1_name.c:589
+#: sha1_name.c:590
 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"
@@ -3741,66 +3848,71 @@ msgstr ""
 "спрете това съобщение като изпълните командата:\n"
 "„git config advice.objectNameWarning false“"
 
-#: submodule.c:70 submodule.c:104
+#: submodule.c:93 submodule.c:127
 msgid "Cannot change unmerged .gitmodules, resolve merge conflicts first"
 msgstr ""
 "Неслетите файлове „.gitmodules“ не могат да бъдат променяни.  Първо "
 "коригирайте конфликтите"
 
-#: submodule.c:74 submodule.c:108
+#: submodule.c:97 submodule.c:131
 #, c-format
 msgid "Could not find section in .gitmodules where path=%s"
 msgstr "Във файла „.gitmodules“ липсва раздел за директория „path=%s“"
 
-#: submodule.c:82
+#: submodule.c:105
 #, c-format
 msgid "Could not update .gitmodules entry %s"
 msgstr "Записът „%s“ във файла „.gitmodules“ не може да бъде променен"
 
-#: submodule.c:115
+#: submodule.c:138
 #, c-format
 msgid "Could not remove .gitmodules entry for %s"
 msgstr "Записът „%s“ във файла „.gitmodules“ не може да бъде изтрит"
 
-#: submodule.c:126
+#: submodule.c:149
 msgid "staging updated .gitmodules failed"
 msgstr "неуспешно добавяне на променения файл „.gitmodules“ в индекса"
 
-#: submodule.c:165
-msgid "negative values not allowed for submodule.fetchJobs"
-msgstr "Настройката „submodule.fetchJobs“ не приема отрицателни стойности"
-
-#: submodule.c:376
+#: submodule.c:309
 #, c-format
 msgid "in unpopulated submodule '%s'"
 msgstr "в неподготвения подмодул „%s“"
 
-#: submodule.c:407
+#: submodule.c:340
 #, c-format
 msgid "Pathspec '%s' is in submodule '%.*s'"
 msgstr "Пътят „%s“ е в подмодула „%.*s“"
 
-#: submodule.c:1337
+#: submodule.c:799
+#, c-format
+msgid "submodule entry '%s' (%s) is a %s, not a commit"
+msgstr "записът за подмодула „%s“ (%s) е %s, а не подаване!"
+
+#: submodule.c:1021 builtin/branch.c:641 builtin/submodule--helper.c:1149
+msgid "Failed to resolve HEAD as a valid ref."
+msgstr "Не може да се открие към какво сочи указателят „HEAD“"
+
+#: submodule.c:1304
 #, c-format
 msgid "'%s' not recognized as a git repository"
 msgstr "„%s“ не е хранилище на git"
 
-#: submodule.c:1475
+#: submodule.c:1442
 #, c-format
 msgid "could not start 'git status' in submodule '%s'"
 msgstr "командата „git status“ не може да се изпълни в подмодула „%s“"
 
-#: submodule.c:1488
+#: submodule.c:1455
 #, c-format
 msgid "could not run 'git status' in submodule '%s'"
 msgstr "командата „git status“ не може да се изпълни в подмодула „%s“"
 
-#: submodule.c:1581
+#: submodule.c:1548
 #, c-format
 msgid "submodule '%s' has dirty index"
 msgstr "индексът на подмодула „%s“ не е чист"
 
-#: submodule.c:1845
+#: submodule.c:1809
 #, c-format
 msgid ""
 "relocate_gitdir for submodule '%s' with more than one worktree not supported"
@@ -3808,18 +3920,18 @@ msgstr ""
 "не се поддържа „relocate_gitdir“ за подмодула „%s“, който има повече от едно "
 "работно дърво"
 
-#: submodule.c:1857 submodule.c:1913
+#: submodule.c:1821 submodule.c:1877
 #, c-format
 msgid "could not lookup name for submodule '%s'"
 msgstr "името на подмодула „%s“ не може да бъде намерено"
 
-#: submodule.c:1861 builtin/submodule--helper.c:678
-#: builtin/submodule--helper.c:688
+#: submodule.c:1825 builtin/submodule--helper.c:671
+#: builtin/submodule--helper.c:681
 #, c-format
 msgid "could not create directory '%s'"
 msgstr "Директорията „%s“ не може да бъде създадена"
 
-#: submodule.c:1864
+#: submodule.c:1828
 #, c-format
 msgid ""
 "Migrating git directory of '%s%s' from\n"
@@ -3830,94 +3942,98 @@ msgstr ""
 "„%s“ към\n"
 "„%s“\n"
 
-#: submodule.c:1948
+#: submodule.c:1912
 #, c-format
 msgid "could not recurse into submodule '%s'"
 msgstr "неуспешна обработка на поддиректориите в подмодула „%s“"
 
-#: submodule.c:1992
+#: submodule.c:1956
 msgid "could not start ls-files in .."
 msgstr "„ls-stat“ не може да се стартира в „..“"
 
-#: submodule.c:2012
+#: submodule.c:1976
 msgid "BUG: returned path string doesn't match cwd?"
 msgstr "ГРЕШКА: полученият низ за пътя не съвпада с върнатото от „cwd“"
 
-#: submodule.c:2031
+#: submodule.c:1995
 #, c-format
 msgid "ls-tree returned unexpected return code %d"
 msgstr "„ls-tree“ завърши с неочакван изходен код: %d"
 
-#: submodule-config.c:420
+#: submodule-config.c:263
+msgid "negative values not allowed for submodule.fetchjobs"
+msgstr "настройката „submodule.fetchjobs“ не приема отрицателни стойности"
+
+#: submodule-config.c:436
 #, c-format
 msgid "invalid value for %s"
 msgstr "Неправилна стойност за „%s“"
 
-#: trailer.c:241
+#: trailer.c:238
 #, c-format
 msgid "running trailer command '%s' failed"
 msgstr "неуспешно изпълнение на завършващата команда „%s“"
 
-#: trailer.c:474 trailer.c:478 trailer.c:482 trailer.c:536 trailer.c:540
-#: trailer.c:544
+#: trailer.c:485 trailer.c:490 trailer.c:495 trailer.c:549 trailer.c:553
+#: trailer.c:557
 #, c-format
 msgid "unknown value '%s' for key '%s'"
 msgstr "непозната стойност „%s“ за настройката „%s“"
 
-#: trailer.c:526 trailer.c:531 builtin/remote.c:290
+#: trailer.c:539 trailer.c:544 builtin/remote.c:290
 #, c-format
 msgid "more than one %s"
 msgstr "стойността „%s“ се повтаря в настройките"
 
-#: trailer.c:703
+#: trailer.c:730
 #, c-format
 msgid "empty trailer token in trailer '%.*s'"
 msgstr "празна завършваща лексема в епилога „%.*s“"
 
-#: trailer.c:723
+#: trailer.c:750
 #, c-format
 msgid "could not read input file '%s'"
 msgstr "входният файл „%s“ не може да бъде прочетен"
 
-#: trailer.c:726
+#: trailer.c:753
 msgid "could not read from stdin"
 msgstr "от стандартния вход не може да се чете"
 
-#: trailer.c:950 builtin/am.c:45
+#: trailer.c:1008 builtin/am.c:46
 #, c-format
 msgid "could not stat %s"
 msgstr "Не може да се получи информация чрез „stat“ за „%s“"
 
-#: trailer.c:952
+#: trailer.c:1010
 #, c-format
 msgid "file %s is not a regular file"
 msgstr "„%s“ не е обикновен файл"
 
-#: trailer.c:954
+#: trailer.c:1012
 #, c-format
 msgid "file %s is not writable by user"
 msgstr "„%s“: няма права за записване на файла"
 
-#: trailer.c:966
+#: trailer.c:1024
 msgid "could not open temporary file"
 msgstr "временният файл не може да се отвори"
 
-#: trailer.c:1002
+#: trailer.c:1064
 #, c-format
 msgid "could not rename temporary file to %s"
 msgstr "временният файл не може да се преименува на „%s“"
 
-#: transport.c:63
+#: transport.c:62
 #, c-format
 msgid "Would set upstream of '%s' to '%s' of '%s'\n"
 msgstr "Клонът „%s“ ще следи „%s“ от „%s“\n"
 
-#: transport.c:152
+#: transport.c:151
 #, c-format
 msgid "transport: invalid depth option '%s'"
 msgstr "transport: неправилна опция за дълбочина: %s"
 
-#: transport.c:890
+#: transport.c:888
 #, c-format
 msgid ""
 "The following submodule paths contain changes that can\n"
@@ -3926,7 +4042,7 @@ msgstr ""
 "Следните пътища за подмодули съдържат промени,\n"
 "които липсват от всички отдалечени хранилища:\n"
 
-#: transport.c:894
+#: transport.c:892
 #, c-format
 msgid ""
 "\n"
@@ -3951,7 +4067,7 @@ msgstr ""
 "    git push\n"
 "\n"
 
-#: transport.c:902
+#: transport.c:900
 msgid "Aborting."
 msgstr "Преустановяване на действието."
 
@@ -3972,11 +4088,11 @@ msgstr "неправилни права за достъп в запис в дъ
 msgid "empty filename in tree entry"
 msgstr "празно име на файл в запис в дърво"
 
-#: tree-walk.c:113
+#: tree-walk.c:114
 msgid "too-short tree file"
 msgstr "прекалено кратък файл-дърво"
 
-#: unpack-trees.c:105
+#: unpack-trees.c:106
 #, c-format
 msgid ""
 "Your local changes to the following files would be overwritten by checkout:\n"
@@ -3985,7 +4101,7 @@ msgstr ""
 "Изтеглянето ще презапише локалните промени на тези файлове:\n"
 "%%sПодайте или скатайте промените, за да преминете към нов клон."
 
-#: unpack-trees.c:107
+#: unpack-trees.c:108
 #, c-format
 msgid ""
 "Your local changes to the following files would be overwritten by checkout:\n"
@@ -3994,7 +4110,7 @@ msgstr ""
 "Изтеглянето ще презапише локалните промени на тези файлове:\n"
 "%%s"
 
-#: unpack-trees.c:110
+#: unpack-trees.c:111
 #, c-format
 msgid ""
 "Your local changes to the following files would be overwritten by merge:\n"
@@ -4003,7 +4119,7 @@ msgstr ""
 "Сливането ще презапише локалните промени на тези файлове:\n"
 "%%sПодайте или скатайте промените, за да слеете."
 
-#: unpack-trees.c:112
+#: unpack-trees.c:113
 #, c-format
 msgid ""
 "Your local changes to the following files would be overwritten by merge:\n"
@@ -4012,7 +4128,7 @@ msgstr ""
 "Сливането ще презапише локалните промени на тези файлове:\n"
 "%%s"
 
-#: unpack-trees.c:115
+#: unpack-trees.c:116
 #, c-format
 msgid ""
 "Your local changes to the following files would be overwritten by %s:\n"
@@ -4021,7 +4137,7 @@ msgstr ""
 "„%s“ ще презапише локалните промени на тези файлове:\n"
 "%%sПодайте или скатайте промените, за да извършите „%s“."
 
-#: unpack-trees.c:117
+#: unpack-trees.c:118
 #, c-format
 msgid ""
 "Your local changes to the following files would be overwritten by %s:\n"
@@ -4030,7 +4146,7 @@ msgstr ""
 "„%s“ ще презапише локалните промени на тези файлове:\n"
 "%%s"
 
-#: unpack-trees.c:122
+#: unpack-trees.c:123
 #, c-format
 msgid ""
 "Updating the following directories would lose untracked files in them:\n"
@@ -4039,7 +4155,7 @@ msgstr ""
 "Обновяването на следните директории ще изтрие неследените файлове в тях:\n"
 "%s"
 
-#: unpack-trees.c:126
+#: unpack-trees.c:127
 #, c-format
 msgid ""
 "The following untracked working tree files would be removed by checkout:\n"
@@ -4048,7 +4164,7 @@ msgstr ""
 "Изтеглянето ще изтрие тези неследени файлове в работното дърво:\n"
 "%%sПреместете ги или ги изтрийте, за да преминете на друг клон."
 
-#: unpack-trees.c:128
+#: unpack-trees.c:129
 #, c-format
 msgid ""
 "The following untracked working tree files would be removed by checkout:\n"
@@ -4057,7 +4173,7 @@ msgstr ""
 "Изтеглянето ще изтрие тези неследени файлове в работното дърво:\n"
 "%%s"
 
-#: unpack-trees.c:131
+#: unpack-trees.c:132
 #, c-format
 msgid ""
 "The following untracked working tree files would be removed by merge:\n"
@@ -4066,7 +4182,7 @@ msgstr ""
 "Сливането ще изтрие тези неследени файлове в работното дърво:\n"
 "%%sПреместете ги или ги изтрийте, за да слеете."
 
-#: unpack-trees.c:133
+#: unpack-trees.c:134
 #, c-format
 msgid ""
 "The following untracked working tree files would be removed by merge:\n"
@@ -4075,7 +4191,7 @@ msgstr ""
 "Сливането ще изтрие тези неследени файлове в работното дърво:\n"
 "%%s"
 
-#: unpack-trees.c:136
+#: unpack-trees.c:137
 #, c-format
 msgid ""
 "The following untracked working tree files would be removed by %s:\n"
@@ -4084,7 +4200,7 @@ msgstr ""
 "„%s“ ще изтрие тези неследени файлове в работното дърво:\n"
 "%%sПреместете ги или ги изтрийте, за да извършите „%s“."
 
-#: unpack-trees.c:138
+#: unpack-trees.c:139
 #, c-format
 msgid ""
 "The following untracked working tree files would be removed by %s:\n"
@@ -4093,7 +4209,7 @@ msgstr ""
 "„%s“ ще изтрие тези неследени файлове в работното дърво:\n"
 "%%s"
 
-#: unpack-trees.c:143
+#: unpack-trees.c:144
 #, c-format
 msgid ""
 "The following untracked working tree files would be overwritten by "
@@ -4103,7 +4219,7 @@ msgstr ""
 "Изтеглянето ще презапише тези неследени файлове в работното дърво:\n"
 "%%sПреместете ги или ги изтрийте, за да смените клон."
 
-#: unpack-trees.c:145
+#: unpack-trees.c:146
 #, c-format
 msgid ""
 "The following untracked working tree files would be overwritten by "
@@ -4113,7 +4229,7 @@ msgstr ""
 "Изтеглянето ще презапише тези неследени файлове в работното дърво:\n"
 "%%s"
 
-#: unpack-trees.c:148
+#: unpack-trees.c:149
 #, c-format
 msgid ""
 "The following untracked working tree files would be overwritten by merge:\n"
@@ -4122,7 +4238,7 @@ msgstr ""
 "Сливането ще презапише тези неследени файлове в работното дърво:\n"
 "%%sПреместете ги или ги изтрийте, за да слеете."
 
-#: unpack-trees.c:150
+#: unpack-trees.c:151
 #, c-format
 msgid ""
 "The following untracked working tree files would be overwritten by merge:\n"
@@ -4131,7 +4247,7 @@ msgstr ""
 "Сливането ще презапише тези неследени файлове в работното дърво:\n"
 "%%s"
 
-#: unpack-trees.c:153
+#: unpack-trees.c:154
 #, c-format
 msgid ""
 "The following untracked working tree files would be overwritten by %s:\n"
@@ -4140,7 +4256,7 @@ msgstr ""
 "„%s“ ще презапише тези неследени файлове в работното дърво:\n"
 "%%sПреместете ги или ги изтрийте, за да извършите „%s“."
 
-#: unpack-trees.c:155
+#: unpack-trees.c:156
 #, c-format
 msgid ""
 "The following untracked working tree files would be overwritten by %s:\n"
@@ -4149,22 +4265,22 @@ msgstr ""
 "„%s“ ще презапише тези неследени файлове в работното дърво:\n"
 "%%s"
 
-#: unpack-trees.c:162
+#: unpack-trees.c:163
 #, c-format
 msgid "Entry '%s' overlaps with '%s'.  Cannot bind."
 msgstr "Записът за „%s“ съвпада с този за „%s“.  Не може да се присвои."
 
-#: unpack-trees.c:165
+#: unpack-trees.c:166
 #, c-format
 msgid ""
-"Cannot update sparse checkout: the following entries are not up-to-date:\n"
+"Cannot update sparse checkout: the following entries are not up to date:\n"
 "%s"
 msgstr ""
 "Частичното изтегляне не може да бъде обновено: следните записи не са "
 "актуални:\n"
 "%s"
 
-#: unpack-trees.c:167
+#: unpack-trees.c:168
 #, c-format
 msgid ""
 "The following working tree files would be overwritten by sparse checkout "
@@ -4175,7 +4291,7 @@ msgstr ""
 "дърво:\n"
 "%s"
 
-#: unpack-trees.c:169
+#: unpack-trees.c:170
 #, c-format
 msgid ""
 "The following working tree files would be removed by sparse checkout "
@@ -4186,7 +4302,7 @@ msgstr ""
 "дърво:\n"
 "%s"
 
-#: unpack-trees.c:171
+#: unpack-trees.c:172
 #, c-format
 msgid ""
 "Cannot update submodule:\n"
@@ -4195,17 +4311,12 @@ msgstr ""
 "Подмодулът не може да бъде обновен:\n"
 "„%s“"
 
-#: unpack-trees.c:248
+#: unpack-trees.c:249
 #, c-format
 msgid "Aborting\n"
 msgstr "Преустановяване на действието\n"
 
-#: unpack-trees.c:277
-#, c-format
-msgid "submodule update strategy not supported for submodule '%s'"
-msgstr "подмодулът „%s“ не поддържа стратегията за обновяване като подмодул"
-
-#: unpack-trees.c:346
+#: unpack-trees.c:331
 msgid "Checking out files"
 msgstr "Изтегляне на файлове"
 
@@ -4248,13 +4359,8 @@ msgstr "„%s“ не може да бъде прочетен"
 msgid "could not open '%s' for reading and writing"
 msgstr "„%s“ не може да бъде отворен и за четене, и за запис"
 
-#: wrapper.c:225 wrapper.c:395 builtin/am.c:766
-#, c-format
-msgid "could not open '%s' for writing"
-msgstr "„%s“ не може да бъде отворен за запис"
-
-#: wrapper.c:227 wrapper.c:397 builtin/am.c:319 builtin/am.c:757
-#: builtin/am.c:849 builtin/merge.c:1014
+#: wrapper.c:227 wrapper.c:397 builtin/am.c:320 builtin/am.c:766
+#: builtin/am.c:858 builtin/merge.c:1041
 #, c-format
 msgid "could not open '%s' for reading"
 msgstr "файлът не може да бъде прочетен: „%s“"
@@ -4278,205 +4384,205 @@ msgstr "„%s“ не може да бъде записан"
 msgid "could not close %s"
 msgstr "„%s“ не може да се затвори"
 
-#: wt-status.c:152
+#: wt-status.c:150
 msgid "Unmerged paths:"
 msgstr "Неслети пътища:"
 
-#: wt-status.c:179 wt-status.c:206
+#: wt-status.c:177 wt-status.c:204
 #, c-format
 msgid "  (use \"git reset %s <file>...\" to unstage)"
 msgstr "  (използвайте „git reset %s ФАЙЛ…“, за да извадите ФАЙЛа от индекса)"
 
-#: wt-status.c:181 wt-status.c:208
+#: wt-status.c:179 wt-status.c:206
 msgid "  (use \"git rm --cached <file>...\" to unstage)"
 msgstr ""
 "  (използвайте „git rm --cached %s ФАЙЛ…“, за да извадите ФАЙЛа от индекса)"
 
-#: wt-status.c:185
+#: wt-status.c:183
 msgid "  (use \"git add <file>...\" to mark resolution)"
 msgstr ""
 "  (използвайте „git add ФАЙЛ…“, за да укажете разрешаването на конфликта)"
 
-#: wt-status.c:187 wt-status.c:191
+#: wt-status.c:185 wt-status.c:189
 msgid "  (use \"git add/rm <file>...\" as appropriate to mark resolution)"
 msgstr ""
 "  (използвайте „git add/rm ФАЙЛ…“, според решението, което избирате за "
 "конфликта)"
 
-#: wt-status.c:189
+#: wt-status.c:187
 msgid "  (use \"git rm <file>...\" to mark resolution)"
 msgstr ""
 "  (използвайте „git rm ФАЙЛ…“, за да укажете разрешаването на конфликта)"
 
-#: wt-status.c:200 wt-status.c:981
+#: wt-status.c:198 wt-status.c:979
 msgid "Changes to be committed:"
 msgstr "Промени, които ще бъдат подадени:"
 
-#: wt-status.c:218 wt-status.c:990
+#: wt-status.c:216 wt-status.c:988
 msgid "Changes not staged for commit:"
 msgstr "Промени, които не са в индекса за подаване:"
 
-#: wt-status.c:222
+#: wt-status.c:220
 msgid "  (use \"git add <file>...\" to update what will be committed)"
 msgstr ""
 "  (използвайте „git add ФАЙЛ…“, за да обновите съдържанието за подаване)"
 
-#: wt-status.c:224
+#: wt-status.c:222
 msgid "  (use \"git add/rm <file>...\" to update what will be committed)"
 msgstr ""
 "  (използвайте „git add/rm ФАЙЛ…“, за да обновите съдържанието за подаване)"
 
-#: wt-status.c:225
+#: wt-status.c:223
 msgid ""
 "  (use \"git checkout -- <file>...\" to discard changes in working directory)"
 msgstr ""
 "  (използвайте „git checkout -- ФАЙЛ…“, за да отхвърлите промените в "
 "работното дърво)"
 
-#: wt-status.c:227
+#: wt-status.c:225
 msgid "  (commit or discard the untracked or modified content in submodules)"
 msgstr ""
 "  (подайте или отхвърлете неследеното или промененото съдържание в "
 "подмодулите)"
 
-#: wt-status.c:239
+#: wt-status.c:237
 #, c-format
 msgid "  (use \"git %s <file>...\" to include in what will be committed)"
 msgstr ""
 "  (използвайте „git %s ФАЙЛ…“, за да определите какво включвате в подаването)"
 
-#: wt-status.c:254
+#: wt-status.c:252
 msgid "both deleted:"
 msgstr "изтрити в двата случая:"
 
-#: wt-status.c:256
+#: wt-status.c:254
 msgid "added by us:"
 msgstr "добавени от вас:"
 
-#: wt-status.c:258
+#: wt-status.c:256
 msgid "deleted by them:"
 msgstr "изтрити от тях:"
 
-#: wt-status.c:260
+#: wt-status.c:258
 msgid "added by them:"
 msgstr "добавени от тях:"
 
-#: wt-status.c:262
+#: wt-status.c:260
 msgid "deleted by us:"
 msgstr "изтрити от вас:"
 
-#: wt-status.c:264
+#: wt-status.c:262
 msgid "both added:"
 msgstr "добавени и в двата случая:"
 
-#: wt-status.c:266
+#: wt-status.c:264
 msgid "both modified:"
 msgstr "променени и в двата случая:"
 
-#: wt-status.c:276
+#: wt-status.c:274
 msgid "new file:"
 msgstr "нов файл:"
 
-#: wt-status.c:278
+#: wt-status.c:276
 msgid "copied:"
 msgstr "копиран:"
 
-#: wt-status.c:280
+#: wt-status.c:278
 msgid "deleted:"
 msgstr "изтрит:"
 
-#: wt-status.c:282
+#: wt-status.c:280
 msgid "modified:"
 msgstr "променен:"
 
-#: wt-status.c:284
+#: wt-status.c:282
 msgid "renamed:"
 msgstr "преименуван:"
 
-#: wt-status.c:286
+#: wt-status.c:284
 msgid "typechange:"
 msgstr "смяна на вида:"
 
-#: wt-status.c:288
+#: wt-status.c:286
 msgid "unknown:"
 msgstr "непозната промяна:"
 
-#: wt-status.c:290
+#: wt-status.c:288
 msgid "unmerged:"
 msgstr "неслят:"
 
-#: wt-status.c:372
+#: wt-status.c:370
 msgid "new commits, "
 msgstr "нови подавания, "
 
-#: wt-status.c:374
+#: wt-status.c:372
 msgid "modified content, "
 msgstr "променено съдържание, "
 
-#: wt-status.c:376
+#: wt-status.c:374
 msgid "untracked content, "
 msgstr "неследено съдържание, "
 
-#: wt-status.c:821
+#: wt-status.c:819
 #, c-format
 msgid "Your stash currently has %d entry"
 msgid_plural "Your stash currently has %d entries"
 msgstr[0] "Има %d скатаване."
 msgstr[1] "Има %d скатавания."
 
-#: wt-status.c:853
+#: wt-status.c:851
 msgid "Submodules changed but not updated:"
 msgstr "Подмодулите са променени, но не са обновени:"
 
-#: wt-status.c:855
+#: wt-status.c:853
 msgid "Submodule changes to be committed:"
 msgstr "Промени в подмодулите за подаване:"
 
-#: wt-status.c:937
+#: wt-status.c:935
 msgid ""
-"Do not touch the line above.\n"
-"Everything below will be removed."
+"Do not modify or remove the line above.\n"
+"Everything below it will be ignored."
 msgstr ""
-"Не променяйте горния ред.\n"
+"Ð\9dе Ð¿Ñ\80оменÑ\8fйÑ\82е Ð¸ Ð½Ðµ Ð¸Ð·Ñ\82Ñ\80ивайÑ\82е Ð³Ð¾Ñ\80ниÑ\8f Ñ\80ед.\n"
 "Всичко отдолу ще бъде изтрито."
 
-#: wt-status.c:1049
+#: wt-status.c:1048
 msgid "You have unmerged paths."
 msgstr "Някои пътища не са слети."
 
-#: wt-status.c:1052
+#: wt-status.c:1051
 msgid "  (fix conflicts and run \"git commit\")"
 msgstr "  (коригирайте конфликтите и изпълнете „git commit“)"
 
-#: wt-status.c:1054
+#: wt-status.c:1053
 msgid "  (use \"git merge --abort\" to abort the merge)"
 msgstr "  (използвайте „git merge --abort“, за да преустановите сливането)"
 
-#: wt-status.c:1059
+#: wt-status.c:1058
 msgid "All conflicts fixed but you are still merging."
 msgstr "Всички конфликти са решени, но продължавате сливането."
 
-#: wt-status.c:1062
+#: wt-status.c:1061
 msgid "  (use \"git commit\" to conclude merge)"
 msgstr "  (използвайте „git commit“, за да завършите сливането)"
 
-#: wt-status.c:1072
+#: wt-status.c:1071
 msgid "You are in the middle of an am session."
 msgstr "В момента прилагате поредица от кръпки чрез „git am“."
 
-#: wt-status.c:1075
+#: wt-status.c:1074
 msgid "The current patch is empty."
 msgstr "Текущата кръпка е празна."
 
-#: wt-status.c:1079
+#: wt-status.c:1078
 msgid "  (fix conflicts and then run \"git am --continue\")"
 msgstr "  (коригирайте конфликтите и изпълнете „git am --continue“)"
 
-#: wt-status.c:1081
+#: wt-status.c:1080
 msgid "  (use \"git am --skip\" to skip this patch)"
 msgstr "  (използвайте „git am --skip“, за да пропуснете тази кръпка)"
 
-#: wt-status.c:1083
+#: wt-status.c:1082
 msgid "  (use \"git am --abort\" to restore the original branch)"
 msgstr ""
 "  (използвайте „git am --abort“, за да възстановите първоначалния клон)"
@@ -4780,7 +4886,7 @@ msgstr "освен това в индекса има неподадени про
 msgid "cannot %s: Your index contains uncommitted changes."
 msgstr "не може да извършите „%s“, защото в индекса има неподадени промени."
 
-#: compat/precompose_utf8.c:58 builtin/clone.c:436
+#: compat/precompose_utf8.c:58 builtin/clone.c:437
 #, c-format
 msgid "failed to unlink '%s'"
 msgstr "неуспешно изтриване на „%s“"
@@ -4794,7 +4900,7 @@ msgstr "git add [ОПЦИЯ…] [--] ПЪТ…"
 msgid "unexpected diff status %c"
 msgstr "неочакван изходен код при генериране на разлика: %c"
 
-#: builtin/add.c:87 builtin/commit.c:292
+#: builtin/add.c:87 builtin/commit.c:291
 msgid "updating files failed"
 msgstr "неуспешно обновяване на файловете"
 
@@ -4803,114 +4909,114 @@ msgstr "неуспешно обновяване на файловете"
 msgid "remove '%s'\n"
 msgstr "изтриване на „%s“\n"
 
-#: builtin/add.c:151
+#: builtin/add.c:153
 msgid "Unstaged changes after refreshing the index:"
 msgstr "Промени, които и след обновяването на индекса не са добавени към него:"
 
-#: builtin/add.c:211 builtin/rev-parse.c:873
+#: builtin/add.c:213 builtin/rev-parse.c:888
 msgid "Could not read the index"
 msgstr "Индексът не може да бъде прочетен"
 
-#: builtin/add.c:222
+#: builtin/add.c:224
 #, c-format
 msgid "Could not open '%s' for writing."
 msgstr "Файлът „%s“ не може да бъде отворен за запис."
 
-#: builtin/add.c:226
+#: builtin/add.c:228
 msgid "Could not write patch"
 msgstr "Кръпката не може да бъде записана"
 
-#: builtin/add.c:229
+#: builtin/add.c:231
 msgid "editing patch failed"
 msgstr "неуспешно редактиране на кръпка"
 
-#: builtin/add.c:232
+#: builtin/add.c:234
 #, c-format
 msgid "Could not stat '%s'"
 msgstr "Не може да се получи информация чрез „stat“ за файла „%s“"
 
-#: builtin/add.c:234
+#: builtin/add.c:236
 msgid "Empty patch. Aborted."
 msgstr "Празна кръпка, преустановяване на действието."
 
-#: builtin/add.c:239
+#: builtin/add.c:241
 #, c-format
 msgid "Could not apply '%s'"
 msgstr "Кръпката „%s“ не може да бъде приложена"
 
-#: builtin/add.c:249
+#: builtin/add.c:251
 msgid "The following paths are ignored by one of your .gitignore files:\n"
 msgstr ""
 "Следните пътища ще бъдат игнорирани според някой от файловете „.gitignore“:\n"
 
-#: builtin/add.c:269 builtin/clean.c:907 builtin/fetch.c:110 builtin/mv.c:124
+#: builtin/add.c:271 builtin/clean.c:910 builtin/fetch.c:132 builtin/mv.c:124
 #: builtin/prune-packed.c:55 builtin/pull.c:201 builtin/push.c:529
-#: builtin/remote.c:1332 builtin/rm.c:242 builtin/send-pack.c:164
+#: builtin/remote.c:1333 builtin/rm.c:242 builtin/send-pack.c:164
 msgid "dry run"
 msgstr "пробно изпълнение"
 
-#: builtin/add.c:272
+#: builtin/add.c:274
 msgid "interactive picking"
 msgstr "интерактивно отбиране на промени"
 
-#: builtin/add.c:273 builtin/checkout.c:1162 builtin/reset.c:299
+#: builtin/add.c:275 builtin/checkout.c:1172 builtin/reset.c:310
 msgid "select hunks interactively"
 msgstr "интерактивен избор на парчета код"
 
-#: builtin/add.c:274
+#: builtin/add.c:276
 msgid "edit current diff and apply"
 msgstr "редактиране на текущата разлика и прилагане"
 
-#: builtin/add.c:275
+#: builtin/add.c:277
 msgid "allow adding otherwise ignored files"
 msgstr "добавяне и на иначе игнорираните файлове"
 
-#: builtin/add.c:276
+#: builtin/add.c:278
 msgid "update tracked files"
 msgstr "обновяване на следените файлове"
 
-#: builtin/add.c:277
+#: builtin/add.c:279
 msgid "record only the fact that the path will be added later"
 msgstr "отбелязване само на факта, че пътят ще бъде добавен по-късно"
 
-#: builtin/add.c:278
+#: builtin/add.c:280
 msgid "add changes from all tracked and untracked files"
 msgstr "добавяне на всички промени в следените и неследените файлове"
 
-#: builtin/add.c:281
+#: builtin/add.c:283
 msgid "ignore paths removed in the working tree (same as --no-all)"
 msgstr ""
 "игнориране на пътищата, които са изтрити от работното дърво (същото като „--"
 "no-all“)"
 
-#: builtin/add.c:283
+#: builtin/add.c:285
 msgid "don't add, only refresh the index"
 msgstr "без добавяне на нови файлове, само обновяване на индекса"
 
-#: builtin/add.c:284
+#: builtin/add.c:286
 msgid "just skip files which cannot be added because of errors"
 msgstr ""
 "прескачане на файловете, които не могат да бъдат добавени поради грешки"
 
-#: builtin/add.c:285
+#: builtin/add.c:287
 msgid "check if - even missing - files are ignored in dry run"
 msgstr ""
 "проверка, че при пробно изпълнение всички файлове, дори и изтритите, се "
 "игнорират"
 
-#: builtin/add.c:286 builtin/update-index.c:952
+#: builtin/add.c:288 builtin/update-index.c:954
 msgid "(+/-)x"
 msgstr "(+/-)x"
 
-#: builtin/add.c:286 builtin/update-index.c:953
+#: builtin/add.c:288 builtin/update-index.c:955
 msgid "override the executable bit of the listed files"
 msgstr "изрично задаване на стойността на флага дали файлът е изпълним"
 
-#: builtin/add.c:288
+#: builtin/add.c:290
 msgid "warn when adding an embedded repository"
 msgstr "предупреждаване при добавяне на вградено хранилище"
 
-#: builtin/add.c:303
+#: builtin/add.c:305
 #, c-format
 msgid ""
 "You've added another git repository inside your current repository.\n"
@@ -4927,10 +5033,8 @@ msgid ""
 "\n"
 "See \"git help submodule\" for more information."
 msgstr ""
-"Изтеглили сте допълнително хранилище в текущото.  Когато клонирате "
-"обхващащото\n"
-"хранилище няма да получити вграденото, защото външното хранилище няма "
-"представа\n"
+"Изтеглили сте допълнително хранилище в текущото.  Когато клонирате обхващащото\n"
+"хранилище няма да получите вграденото, защото външното хранилище няма представа\n"
 "за вътрешното.  За да добавите подмодул, изпълнете:\n"
 "\n"
 "    git submodule add АДРЕС %s\n"
@@ -4941,152 +5045,152 @@ msgstr ""
 "\n"
 "За повече информация погледнете „git help submodule“."
 
-#: builtin/add.c:331
+#: builtin/add.c:333
 #, c-format
 msgid "adding embedded git repository: %s"
 msgstr "добавяне на вградено хранилище: %s"
 
-#: builtin/add.c:349
+#: builtin/add.c:351
 #, c-format
 msgid "Use -f if you really want to add them.\n"
 msgstr "Използвайте опцията „-f“, за да ги добавите наистина.\n"
 
-#: builtin/add.c:357
+#: builtin/add.c:359
 msgid "adding files failed"
 msgstr "неуспешно добавяне на файлове"
 
-#: builtin/add.c:394
+#: builtin/add.c:396
 msgid "-A and -u are mutually incompatible"
 msgstr "опциите „-A“ и „-u“ са несъвместими"
 
-#: builtin/add.c:401
+#: builtin/add.c:403
 msgid "Option --ignore-missing can only be used together with --dry-run"
 msgstr "Опцията „--ignore-missing“ е съвместима само с „--dry-run“"
 
-#: builtin/add.c:405
+#: builtin/add.c:407
 #, c-format
 msgid "--chmod param '%s' must be either -x or +x"
 msgstr "параметърът към „--chmod“ — „%s“ може да е или „-x“, или „+x“"
 
-#: builtin/add.c:420
+#: builtin/add.c:422
 #, c-format
 msgid "Nothing specified, nothing added.\n"
 msgstr "Нищо не е зададено и нищо не е добавено.\n"
 
-#: builtin/add.c:421
+#: builtin/add.c:423
 #, c-format
 msgid "Maybe you wanted to say 'git add .'?\n"
 msgstr "Вероятно искахте да използвате „git add .“?\n"
 
-#: builtin/add.c:426 builtin/check-ignore.c:176 builtin/checkout.c:282
-#: builtin/checkout.c:475 builtin/clean.c:954 builtin/commit.c:351
-#: builtin/mv.c:144 builtin/reset.c:238 builtin/rm.c:272
-#: builtin/submodule--helper.c:244
+#: builtin/add.c:428 builtin/check-ignore.c:176 builtin/checkout.c:282
+#: builtin/checkout.c:479 builtin/clean.c:957 builtin/commit.c:350
+#: builtin/mv.c:143 builtin/reset.c:249 builtin/rm.c:271
+#: builtin/submodule--helper.c:243
 msgid "index file corrupt"
 msgstr "файлът с индекса е повреден"
 
-#: builtin/am.c:413
+#: builtin/am.c:414
 msgid "could not parse author script"
 msgstr "скриптът за автор не може да се анализира"
 
-#: builtin/am.c:489
+#: builtin/am.c:498
 #, c-format
 msgid "'%s' was deleted by the applypatch-msg hook"
 msgstr "„%s“ бе изтрит от куката „applypatch-msg“"
 
-#: builtin/am.c:530
+#: builtin/am.c:539
 #, c-format
 msgid "Malformed input line: '%s'."
 msgstr "Даденият входен ред е с неправилен формат: „%s“."
 
-#: builtin/am.c:567
+#: builtin/am.c:576
 #, c-format
 msgid "Failed to copy notes from '%s' to '%s'"
 msgstr "Бележката не може да се копира от „%s“ към „%s“"
 
-#: builtin/am.c:593
+#: builtin/am.c:602
 msgid "fseek failed"
 msgstr "неуспешно изпълнение на „fseek“"
 
-#: builtin/am.c:777
+#: builtin/am.c:786
 #, c-format
 msgid "could not parse patch '%s'"
 msgstr "кръпката „%s“ не може да се анализира"
 
-#: builtin/am.c:842
+#: builtin/am.c:851
 msgid "Only one StGIT patch series can be applied at once"
 msgstr ""
 "Само една серия кръпки от „StGIT“ може да бъде прилагана в даден момент"
 
-#: builtin/am.c:889
+#: builtin/am.c:899
 msgid "invalid timestamp"
 msgstr "неправилна стойност за време"
 
-#: builtin/am.c:892 builtin/am.c:900
+#: builtin/am.c:904 builtin/am.c:916
 msgid "invalid Date line"
 msgstr "неправилен ред за дата „Date“"
 
-#: builtin/am.c:897
+#: builtin/am.c:911
 msgid "invalid timezone offset"
 msgstr "неправилно отместване на часовия пояс"
 
-#: builtin/am.c:986
+#: builtin/am.c:1004
 msgid "Patch format detection failed."
 msgstr "Форматът на кръпката не може да бъде определен."
 
-#: builtin/am.c:991 builtin/clone.c:401
+#: builtin/am.c:1009 builtin/clone.c:402
 #, c-format
 msgid "failed to create directory '%s'"
 msgstr "директорията „%s“ не може да бъде създадена"
 
-#: builtin/am.c:995
+#: builtin/am.c:1013
 msgid "Failed to split patches."
 msgstr "Кръпките не могат да бъдат разделени."
 
-#: builtin/am.c:1120 builtin/commit.c:377
+#: builtin/am.c:1142 builtin/commit.c:376
 msgid "unable to write index file"
 msgstr "индексът не може да бъде записан"
 
-#: builtin/am.c:1171
+#: builtin/am.c:1193
 #, c-format
 msgid "When you have resolved this problem, run \"%s --continue\"."
 msgstr "След коригирането на този проблем изпълнете „%s --continue“."
 
-#: builtin/am.c:1172
+#: builtin/am.c:1194
 #, c-format
 msgid "If you prefer to skip this patch, run \"%s --skip\" instead."
 msgstr "Ако предпочитате да прескочите тази кръпка, изпълнете „%s --skip“."
 
-#: builtin/am.c:1173
+#: builtin/am.c:1195
 #, c-format
 msgid "To restore the original branch and stop patching, run \"%s --abort\"."
 msgstr "За да се върнете към първоначалното състояние, изпълнете „%s --abort“."
 
-#: builtin/am.c:1304
+#: builtin/am.c:1302
 msgid "Patch is empty."
 msgstr "Кръпката е празна."
 
-#: builtin/am.c:1370
+#: builtin/am.c:1368
 #, c-format
 msgid "invalid ident line: %.*s"
 msgstr "грешен ред с идентичност: %.*s"
 
-#: builtin/am.c:1392
+#: builtin/am.c:1390
 #, c-format
 msgid "unable to parse commit %s"
 msgstr "подаването не може да бъде анализирано: %s"
 
-#: builtin/am.c:1586
+#: builtin/am.c:1584
 msgid "Repository lacks necessary blobs to fall back on 3-way merge."
 msgstr ""
 "В хранилището липсват необходимите обекти BLOB, за да се премине към тройно "
 "сливане."
 
-#: builtin/am.c:1588
+#: builtin/am.c:1586
 msgid "Using index info to reconstruct a base tree..."
 msgstr "Базовото дърво се реконструира от информацията в индекса…"
 
-#: builtin/am.c:1607
+#: builtin/am.c:1605
 msgid ""
 "Did you hand edit your patch?\n"
 "It does not apply to blobs recorded in its index."
@@ -5094,39 +5198,39 @@ msgstr ""
 "Кръпката не може да се приложи към обектите BLOB в индекса.\n"
 "Да не би да сте я редактирали на ръка?"
 
-#: builtin/am.c:1613
+#: builtin/am.c:1611
 msgid "Falling back to patching base and 3-way merge..."
 msgstr "Преминаване към прилагане на кръпка към базата и тройно сливане…"
 
-#: builtin/am.c:1638
+#: builtin/am.c:1636
 msgid "Failed to merge in the changes."
 msgstr "Неуспешно сливане на промените."
 
-#: builtin/am.c:1662 builtin/merge.c:632
+#: builtin/am.c:1660 builtin/merge.c:641
 msgid "git write-tree failed to write a tree"
 msgstr "Командата „git write-tree“ не успя да запише обект-дърво"
 
-#: builtin/am.c:1669
+#: builtin/am.c:1667
 msgid "applying to an empty history"
 msgstr "прилагане върху празна история"
 
-#: builtin/am.c:1682 builtin/commit.c:1767 builtin/merge.c:803
-#: builtin/merge.c:828
+#: builtin/am.c:1680 builtin/commit.c:1776 builtin/merge.c:824
+#: builtin/merge.c:849
 msgid "failed to write commit object"
 msgstr "обектът за подаването не може да бъде записан"
 
-#: builtin/am.c:1715 builtin/am.c:1719
+#: builtin/am.c:1713 builtin/am.c:1717
 #, c-format
 msgid "cannot resume: %s does not exist."
 msgstr "не може да се продължи — „%s“ не съществува."
 
-#: builtin/am.c:1735
+#: builtin/am.c:1733
 msgid "cannot be interactive without stdin connected to a terminal."
 msgstr ""
 "За интерактивно изпълнение е необходимо стандартният\n"
 "вход да е свързан с терминал, а в момента не е."
 
-#: builtin/am.c:1740
+#: builtin/am.c:1738
 msgid "Commit Body is:"
 msgstr "Тялото на кръпката за прилагане е:"
 
@@ -5134,38 +5238,38 @@ msgstr "Тялото на кръпката за прилагане е:"
 #. in your translation. The program will only accept English
 #. input at this point.
 #.
-#: builtin/am.c:1750
+#: builtin/am.c:1748
 msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all: "
 msgstr ""
 "Прилагане? „y“ — да/„n“ — не/„e“ — редактиране/„v“ — преглед/„a“ — приемане "
 "на всичко:"
 
-#: builtin/am.c:1800
+#: builtin/am.c:1798
 #, c-format
 msgid "Dirty index: cannot apply patches (dirty: %s)"
 msgstr ""
 "Индексът не е чист: кръпките не могат да бъдат приложени (замърсени са: %s)"
 
-#: builtin/am.c:1840 builtin/am.c:1912
+#: builtin/am.c:1838 builtin/am.c:1910
 #, c-format
 msgid "Applying: %.*s"
 msgstr "Прилагане: %.*s"
 
-#: builtin/am.c:1856
+#: builtin/am.c:1854
 msgid "No changes -- Patch already applied."
 msgstr "Без промени — кръпката вече е приложена."
 
-#: builtin/am.c:1864
+#: builtin/am.c:1862
 #, c-format
 msgid "Patch failed at %s %.*s"
 msgstr "Неуспешно прилагане на кръпка при %s %.*s“"
 
-#: builtin/am.c:1870
+#: builtin/am.c:1868
 #, c-format
 msgid "The copy of the patch that failed is found in: %s"
 msgstr "Дубликат на проблемната кръпка се намира в: %s"
 
-#: builtin/am.c:1915
+#: builtin/am.c:1913
 msgid ""
 "No changes - did you forget to use 'git add'?\n"
 "If there is nothing left to stage, chances are that something else\n"
@@ -5175,7 +5279,7 @@ msgstr ""
 "Ако няма друга промяна за включване в индекса, най-вероятно някоя друга\n"
 "кръпка е довела до същите промени и в такъв случай просто пропуснете тази."
 
-#: builtin/am.c:1922
+#: builtin/am.c:1920
 msgid ""
 "You still have unmerged paths in your index.\n"
 "You should 'git add' each file with resolved conflicts to mark them as "
@@ -5186,17 +5290,17 @@ msgstr ""
 "След корекция на конфликтите изпълнете „git add“ върху поправените файлове.\n"
 "За да приемете „изтрити от тях“, изпълнете „git rm“ върху изтритите файлове."
 
-#: builtin/am.c:2031 builtin/am.c:2035 builtin/am.c:2047 builtin/reset.c:323
-#: builtin/reset.c:331
+#: builtin/am.c:2029 builtin/am.c:2033 builtin/am.c:2045 builtin/reset.c:332
+#: builtin/reset.c:340
 #, c-format
 msgid "Could not parse object '%s'."
 msgstr "„%s“ не е разпознат като обект."
 
-#: builtin/am.c:2083
+#: builtin/am.c:2081
 msgid "failed to clean index"
 msgstr "индексът не може да бъде изчистен"
 
-#: builtin/am.c:2117
+#: builtin/am.c:2116
 msgid ""
 "You seem to have moved HEAD since the last 'am' failure.\n"
 "Not rewinding to ORIG_HEAD"
@@ -5207,139 +5311,138 @@ msgstr ""
 "сочи към\n"
 "„ORIG_HEAD“"
 
-#: builtin/am.c:2180
+#: builtin/am.c:2179
 #, c-format
 msgid "Invalid value for --patch-format: %s"
 msgstr "Неправилна стойност за „--patch-format“: „%s“"
 
-#: builtin/am.c:2213
+#: builtin/am.c:2212
 msgid "git am [<options>] [(<mbox> | <Maildir>)...]"
 msgstr "git am [ОПЦИЯ…] [(ФАЙЛ_С_ПОЩА|ДИРЕКТОРИЯ_С_ПОЩА)…]"
 
-#: builtin/am.c:2214
+#: builtin/am.c:2213
 msgid "git am [<options>] (--continue | --skip | --abort)"
 msgstr "git am [ОПЦИЯ…] (--continue | --quit | --abort)"
 
-#: builtin/am.c:2220
+#: builtin/am.c:2219
 msgid "run interactively"
 msgstr "интерактивна работа"
 
-#: builtin/am.c:2222
+#: builtin/am.c:2221
 msgid "historical option -- no-op"
 msgstr "изоставена опция, съществува по исторически причини, нищо не прави"
 
-#: builtin/am.c:2224
+#: builtin/am.c:2223
 msgid "allow fall back on 3way merging if needed"
 msgstr "да се преминава към тройно сливане при нужда."
 
-#: builtin/am.c:2225 builtin/init-db.c:484 builtin/prune-packed.c:57
+#: builtin/am.c:2224 builtin/init-db.c:484 builtin/prune-packed.c:57
 #: builtin/repack.c:180
 msgid "be quiet"
 msgstr "без извеждане на информация"
 
-#: builtin/am.c:2227
+#: builtin/am.c:2226
 msgid "add a Signed-off-by line to the commit message"
 msgstr "добавяне на ред за подпис „Signed-off-by“ в съобщението за подаване"
 
-#: builtin/am.c:2230
+#: builtin/am.c:2229
 msgid "recode into utf8 (default)"
 msgstr "прекодиране в UTF-8 (стандартно)"
 
-#: builtin/am.c:2232
+#: builtin/am.c:2231
 msgid "pass -k flag to git-mailinfo"
 msgstr "подаване на опцията „-k“ на командата „git-mailinfo“"
 
-#: builtin/am.c:2234
+#: builtin/am.c:2233
 msgid "pass -b flag to git-mailinfo"
 msgstr "подаване на опцията „-b“ на командата „git-mailinfo“"
 
-#: builtin/am.c:2236
+#: builtin/am.c:2235
 msgid "pass -m flag to git-mailinfo"
 msgstr "подаване на опцията „-m“ на командата „git-mailinfo“"
 
-#: builtin/am.c:2238
+#: builtin/am.c:2237
 msgid "pass --keep-cr flag to git-mailsplit for mbox format"
 msgstr ""
 "подаване на опцията „--keep-cr“ на командата „git-mailsplit“ за формат „mbox“"
 
-#: builtin/am.c:2241
+#: builtin/am.c:2240
 msgid "do not pass --keep-cr flag to git-mailsplit independent of am.keepcr"
 msgstr ""
 "без подаване на опцията „--keep-cr“ на командата „git-mailsplit“ независимо "
 "от „am.keepcr“"
 
-#: builtin/am.c:2244
+#: builtin/am.c:2243
 msgid "strip everything before a scissors line"
 msgstr "пропускане на всичко преди реда за отрязване"
 
-#: builtin/am.c:2246 builtin/am.c:2249 builtin/am.c:2252 builtin/am.c:2255
-#: builtin/am.c:2258 builtin/am.c:2261 builtin/am.c:2264 builtin/am.c:2267
-#: builtin/am.c:2273
+#: builtin/am.c:2245 builtin/am.c:2248 builtin/am.c:2251 builtin/am.c:2254
+#: builtin/am.c:2257 builtin/am.c:2260 builtin/am.c:2263 builtin/am.c:2266
+#: builtin/am.c:2272
 msgid "pass it through git-apply"
 msgstr "прекарване през „git-apply“"
 
-#: builtin/am.c:2263 builtin/fmt-merge-msg.c:663 builtin/fmt-merge-msg.c:666
-#: builtin/grep.c:1064 builtin/merge.c:202 builtin/pull.c:142
-#: builtin/pull.c:197 builtin/repack.c:189 builtin/repack.c:193
-#: builtin/repack.c:195 builtin/show-branch.c:631 builtin/show-ref.c:169
-#: builtin/tag.c:399 parse-options.h:132 parse-options.h:134
-#: parse-options.h:245
+#: builtin/am.c:2262 builtin/fmt-merge-msg.c:664 builtin/fmt-merge-msg.c:667
+#: builtin/grep.c:843 builtin/merge.c:205 builtin/pull.c:142 builtin/pull.c:197
+#: builtin/repack.c:189 builtin/repack.c:193 builtin/repack.c:195
+#: builtin/show-branch.c:631 builtin/show-ref.c:169 builtin/tag.c:377
+#: parse-options.h:132 parse-options.h:134 parse-options.h:245
 msgid "n"
 msgstr "БРОЙ"
 
-#: builtin/am.c:2269 builtin/branch.c:596 builtin/for-each-ref.c:38
-#: builtin/replace.c:444 builtin/tag.c:434 builtin/verify-tag.c:39
+#: builtin/am.c:2268 builtin/branch.c:622 builtin/for-each-ref.c:38
+#: builtin/replace.c:444 builtin/tag.c:412 builtin/verify-tag.c:39
 msgid "format"
 msgstr "ФОРМАТ"
 
-#: builtin/am.c:2270
+#: builtin/am.c:2269
 msgid "format the patch(es) are in"
 msgstr "формат на кръпките"
 
-#: builtin/am.c:2276
+#: builtin/am.c:2275
 msgid "override error message when patch failure occurs"
 msgstr "избрано от вас съобщение за грешка при прилагане на кръпки"
 
-#: builtin/am.c:2278
+#: builtin/am.c:2277
 msgid "continue applying patches after resolving a conflict"
 msgstr "продължаване на прилагането на кръпки след коригирането на конфликт"
 
-#: builtin/am.c:2281
+#: builtin/am.c:2280
 msgid "synonyms for --continue"
 msgstr "синоними на „--continue“"
 
-#: builtin/am.c:2284
+#: builtin/am.c:2283
 msgid "skip the current patch"
 msgstr "прескачане на текущата кръпка"
 
-#: builtin/am.c:2287
+#: builtin/am.c:2286
 msgid "restore the original branch and abort the patching operation."
 msgstr ""
 "възстановяване на първоначалното състояние на клона и преустановяване на "
 "прилагането на кръпката."
 
-#: builtin/am.c:2291
+#: builtin/am.c:2290
 msgid "lie about committer date"
 msgstr "дата за подаване различна от първоначалната"
 
-#: builtin/am.c:2293
+#: builtin/am.c:2292
 msgid "use current timestamp for author date"
 msgstr "използване на текущото време като това за автор"
 
-#: builtin/am.c:2295 builtin/commit.c:1605 builtin/merge.c:233
-#: builtin/pull.c:172 builtin/revert.c:112 builtin/tag.c:414
+#: builtin/am.c:2294 builtin/commit.c:1614 builtin/merge.c:236
+#: builtin/pull.c:172 builtin/revert.c:112 builtin/tag.c:392
 msgid "key-id"
 msgstr "ИДЕНТИФИКАТОР_НА_КЛЮЧ"
 
-#: builtin/am.c:2296
+#: builtin/am.c:2295
 msgid "GPG-sign commits"
 msgstr "подписване на подаванията с GPG"
 
-#: builtin/am.c:2299
+#: builtin/am.c:2298
 msgid "(internal use for git-rebase)"
 msgstr "(ползва се вътрешно за „git-rebase“)"
 
-#: builtin/am.c:2317
+#: builtin/am.c:2316
 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."
@@ -5347,18 +5450,18 @@ msgstr ""
 "Опциите „-b“/„--binary“ отдавна не правят нищо и\n"
 "ще бъдат премахнати в бъдеще.  Не ги ползвайте."
 
-#: builtin/am.c:2324
+#: builtin/am.c:2323
 msgid "failed to read the index"
 msgstr "неуспешно изчитане на индекса"
 
-#: builtin/am.c:2339
+#: builtin/am.c:2338
 #, c-format
 msgid "previous rebase directory %s still exists but mbox given."
 msgstr ""
 "предишната директория за пребазиране „%s“ все още съществува, а е зададен "
 "файл „mbox“."
 
-#: builtin/am.c:2363
+#: builtin/am.c:2362
 #, c-format
 msgid ""
 "Stray %s directory found.\n"
@@ -5367,7 +5470,7 @@ msgstr ""
 "Открита е излишна директория „%s“.\n"
 "Можете да я изтриете с командата „git am --abort“."
 
-#: builtin/am.c:2369
+#: builtin/am.c:2368
 msgid "Resolve operation not in progress, we are not resuming."
 msgstr "В момента не тече операция по коригиране и няма как да се продължи."
 
@@ -5590,14 +5693,18 @@ msgid "git branch [<options>] (-m | -M) [<old-branch>] <new-branch>"
 msgstr "git branch [ОПЦИЯ…] (-m | -M) [СТАР_КЛОН] НОВ_КЛОН"
 
 #: builtin/branch.c:31
+msgid "git branch [<options>] (-c | -C) [<old-branch>] <new-branch>"
+msgstr "git branch [ОПЦИЯ…] (-c | -C) [СТАР_КЛОН] НОВ_КЛОН"
+
+#: builtin/branch.c:32
 msgid "git branch [<options>] [-r | -a] [--points-at]"
 msgstr "git branch [ОПЦИЯ…] [-r | -a] [--points-at]"
 
-#: builtin/branch.c:32
+#: builtin/branch.c:33
 msgid "git branch [<options>] [-r | -a] [--format]"
 msgstr "git branch [ОПЦИЯ…] [-r | -a] [--format]"
 
-#: builtin/branch.c:145
+#: builtin/branch.c:146
 #, c-format
 msgid ""
 "deleting branch '%s' that has been merged to\n"
@@ -5606,7 +5713,7 @@ msgstr ""
 "изтриване на клона „%s“, който е слят към „%s“,\n"
 "    но още не е слят към върха „HEAD“."
 
-#: builtin/branch.c:149
+#: builtin/branch.c:150
 #, c-format
 msgid ""
 "not deleting branch '%s' that is not yet merged to\n"
@@ -5615,12 +5722,12 @@ msgstr ""
 "отказване на изтриване на клона „%s“, който не е слят към\n"
 "    „%s“, но е слят към върха „HEAD“."
 
-#: builtin/branch.c:163
+#: builtin/branch.c:164
 #, c-format
 msgid "Couldn't look up commit object for '%s'"
 msgstr "Обектът-подаване за „%s“ не може да бъде открит"
 
-#: builtin/branch.c:167
+#: builtin/branch.c:168
 #, c-format
 msgid ""
 "The branch '%s' is not fully merged.\n"
@@ -5629,92 +5736,113 @@ msgstr ""
 "Клонът „%s“ не е слят напълно.  Ако сте сигурни, че искате\n"
 "да го изтриете, изпълнете „git branch -D %s“."
 
-#: builtin/branch.c:180
+#: builtin/branch.c:181
 msgid "Update of config-file failed"
 msgstr "Неуспешно обновяване на конфигурационния файл"
 
-#: builtin/branch.c:211
+#: builtin/branch.c:212
 msgid "cannot use -a with -d"
 msgstr "Опцията „-a“ е несъвместима с опцията „-d“"
 
-#: builtin/branch.c:217
+#: builtin/branch.c:218
 msgid "Couldn't look up commit object for HEAD"
 msgstr "Обектът-подаване, сочен от указателя „HEAD“, не може да бъде открит"
 
-#: builtin/branch.c:231
+#: builtin/branch.c:232
 #, c-format
 msgid "Cannot delete branch '%s' checked out at '%s'"
 msgstr "Не можете да изтриете клона „%s“, който е изтеглен в пътя „%s“"
 
-#: builtin/branch.c:246
+#: builtin/branch.c:247
 #, c-format
 msgid "remote-tracking branch '%s' not found."
 msgstr "следящият клон „%s“ не може да бъде открит."
 
-#: builtin/branch.c:247
+#: builtin/branch.c:248
 #, c-format
 msgid "branch '%s' not found."
 msgstr "клонът „%s“ не може да бъде открит."
 
-#: builtin/branch.c:262
+#: builtin/branch.c:263
 #, c-format
 msgid "Error deleting remote-tracking branch '%s'"
 msgstr "Грешка при изтриването на следящия клон „%s“"
 
-#: builtin/branch.c:263
+#: builtin/branch.c:264
 #, c-format
 msgid "Error deleting branch '%s'"
 msgstr "Грешка при изтриването на клона „%s“"
 
-#: builtin/branch.c:270
+#: builtin/branch.c:271
 #, c-format
 msgid "Deleted remote-tracking branch %s (was %s).\n"
 msgstr "Изтрит следящ клон „%s“ (той сочеше към „%s“).\n"
 
-#: builtin/branch.c:271
+#: builtin/branch.c:272
 #, c-format
 msgid "Deleted branch %s (was %s).\n"
 msgstr "Изтрит клон „%s“ (той сочеше към „%s“).\n"
 
-#: builtin/branch.c:445
+#: builtin/branch.c:417 builtin/tag.c:58
+msgid "unable to parse format string"
+msgstr "форматиращият низ не може да бъде анализиран: %s"
+
+#: builtin/branch.c:450
 #, c-format
 msgid "Branch %s is being rebased at %s"
 msgstr "Клонът „%s“ се пребазира върху „%s“"
 
-#: builtin/branch.c:449
+#: builtin/branch.c:454
 #, c-format
 msgid "Branch %s is being bisected at %s"
 msgstr "Търси се двоично в клона „%s“ при „%s“"
 
-#: builtin/branch.c:464
+#: builtin/branch.c:470
+msgid "cannot copy the current branch while not on any."
+msgstr "не можете да копирате текущия клон, защото сте извън който и да е клон"
+
+#: builtin/branch.c:472
 msgid "cannot rename the current branch while not on any."
 msgstr ""
 "не можете да преименувате текущия клон, защото сте извън който и да е клон"
 
-#: builtin/branch.c:474
+#: builtin/branch.c:483
 #, c-format
 msgid "Invalid branch name: '%s'"
 msgstr "Неправилно име на клон: „%s“"
 
-#: builtin/branch.c:491
+#: builtin/branch.c:504
 msgid "Branch rename failed"
 msgstr "Неуспешно преименуване на клон"
 
-#: builtin/branch.c:494
+#: builtin/branch.c:506
+msgid "Branch copy failed"
+msgstr "Неуспешно копиране на клон"
+
+#: builtin/branch.c:510
+#, c-format
+msgid "Copied a misnamed branch '%s' away"
+msgstr "Клонът с неправилно име „%s“ е копиран"
+
+#: builtin/branch.c:513
 #, c-format
 msgid "Renamed a misnamed branch '%s' away"
-msgstr "Ð\9dа ÐºÐ»Ð¾Ð½Ð° Ñ\81 Ð½ÐµÐ¿Ñ\80авилно Ð¸Ð¼Ðµ â\80\9e%sâ\80\9c Ðµ Ð´Ð°Ð´ÐµÐ½Ð¾ Ñ\81лÑ\83жебно Ð¸Ð¼Ðµ"
+msgstr "Ð\9aлонÑ\8aÑ\82 Ñ\81 Ð½ÐµÐ¿Ñ\80авилно Ð¸Ð¼Ðµ â\80\9e%sâ\80\9c Ðµ Ð¿Ñ\80еименÑ\83ван"
 
-#: builtin/branch.c:497
+#: builtin/branch.c:519
 #, c-format
 msgid "Branch renamed to %s, but HEAD is not updated!"
 msgstr "Клонът е преименуван на „%s“, но указателят „HEAD“ не е обновен"
 
-#: builtin/branch.c:506
+#: builtin/branch.c:528
 msgid "Branch is renamed, but update of config-file failed"
 msgstr "Клонът е преименуван, но конфигурационният файл не е обновен"
 
-#: builtin/branch.c:522
+#: builtin/branch.c:530
+msgid "Branch is copied, but update of config-file failed"
+msgstr "Клонът е копиран, но конфигурационният файл не е обновен"
+
+#: builtin/branch.c:546
 #, c-format
 msgid ""
 "Please edit the description for the branch\n"
@@ -5725,179 +5853,187 @@ msgstr ""
 "  %s\n"
 "Редовете, които започват с „%c“, ще бъдат пропуснати.\n"
 
-#: builtin/branch.c:555
+#: builtin/branch.c:579
 msgid "Generic options"
 msgstr "Общи настройки"
 
-#: builtin/branch.c:557
+#: builtin/branch.c:581
 msgid "show hash and subject, give twice for upstream branch"
 msgstr ""
 "извеждане на хеша и темата.  Повтарянето на опцията прибавя отдалечените "
 "клони"
 
-#: builtin/branch.c:558
+#: builtin/branch.c:582
 msgid "suppress informational messages"
 msgstr "без информационни съобщения"
 
-#: builtin/branch.c:559
+#: builtin/branch.c:583
 msgid "set up tracking mode (see git-pull(1))"
 msgstr "задаване на режима на следене (виж git-pull(1))"
 
-#: builtin/branch.c:561
-msgid "change upstream info"
-msgstr "смяна на следения клон"
+#: builtin/branch.c:585
+msgid "do not use"
+msgstr "да не се ползва"
 
-#: builtin/branch.c:563
+#: builtin/branch.c:587
 msgid "upstream"
 msgstr "клон-източник"
 
-#: builtin/branch.c:563
+#: builtin/branch.c:587
 msgid "change the upstream info"
 msgstr "смяна на клона-източник"
 
-#: builtin/branch.c:564
+#: builtin/branch.c:588
 msgid "Unset the upstream info"
 msgstr "без клон-източник"
 
-#: builtin/branch.c:565
+#: builtin/branch.c:589
 msgid "use colored output"
 msgstr "цветен изход"
 
-#: builtin/branch.c:566
+#: builtin/branch.c:590
 msgid "act on remote-tracking branches"
 msgstr "действие върху следящите клони"
 
-#: builtin/branch.c:568 builtin/branch.c:570
+#: builtin/branch.c:592 builtin/branch.c:594
 msgid "print only branches that contain the commit"
 msgstr "извеждане само на клоните, които съдържат това ПОДАВАНЕ"
 
-#: builtin/branch.c:569 builtin/branch.c:571
+#: builtin/branch.c:593 builtin/branch.c:595
 msgid "print only branches that don't contain the commit"
 msgstr "извеждане само на клоните, които не съдържат това ПОДАВАНЕ"
 
-#: builtin/branch.c:574
+#: builtin/branch.c:598
 msgid "Specific git-branch actions:"
 msgstr "Специални действия на „git-branch“:"
 
-#: builtin/branch.c:575
+#: builtin/branch.c:599
 msgid "list both remote-tracking and local branches"
 msgstr "извеждане както на следящите, така и на локалните клони"
 
-#: builtin/branch.c:577
+#: builtin/branch.c:601
 msgid "delete fully merged branch"
 msgstr "изтриване на клони, които са напълно слети"
 
-#: builtin/branch.c:578
+#: builtin/branch.c:602
 msgid "delete branch (even if not merged)"
 msgstr "изтриване и на клони, които не са напълно слети"
 
-#: builtin/branch.c:579
+#: builtin/branch.c:603
 msgid "move/rename a branch and its reflog"
 msgstr ""
 "преместване/преименуване на клон и принадлежащият му журнал на указателите"
 
-#: builtin/branch.c:580
+#: builtin/branch.c:604
 msgid "move/rename a branch, even if target exists"
 msgstr "преместване/преименуване на клон, дори ако има вече клон с такова име"
 
-#: builtin/branch.c:581
+#: builtin/branch.c:605
+msgid "copy a branch and its reflog"
+msgstr "копиране на клон и принадлежащия му журнал на указателите"
+
+#: builtin/branch.c:606
+msgid "copy a branch, even if target exists"
+msgstr "копиране на клон, дори ако има вече клон с такова име"
+
+#: builtin/branch.c:607
 msgid "list branch names"
 msgstr "извеждане на имената на клоните"
 
-#: builtin/branch.c:582
+#: builtin/branch.c:608
 msgid "create the branch's reflog"
 msgstr "създаване на журнала на указателите на клона"
 
-#: builtin/branch.c:584
+#: builtin/branch.c:610
 msgid "edit the description for the branch"
 msgstr "редактиране на описанието на клона"
 
-#: builtin/branch.c:585
+#: builtin/branch.c:611
 msgid "force creation, move/rename, deletion"
 msgstr "принудително създаване, преместване, преименуване, изтриване"
 
-#: builtin/branch.c:586
+#: builtin/branch.c:612
 msgid "print only branches that are merged"
 msgstr "извеждане само на слетите клони"
 
-#: builtin/branch.c:587
+#: builtin/branch.c:613
 msgid "print only branches that are not merged"
 msgstr "извеждане само на неслетите клони"
 
-#: builtin/branch.c:588
+#: builtin/branch.c:614
 msgid "list branches in columns"
 msgstr "извеждане по колони"
 
-#: builtin/branch.c:589 builtin/for-each-ref.c:39 builtin/tag.c:427
+#: builtin/branch.c:615 builtin/for-each-ref.c:40 builtin/tag.c:405
 msgid "key"
 msgstr "КЛЮЧ"
 
-#: builtin/branch.c:590 builtin/for-each-ref.c:40 builtin/tag.c:428
+#: builtin/branch.c:616 builtin/for-each-ref.c:41 builtin/tag.c:406
 msgid "field name to sort on"
 msgstr "име на полето, по което да е подредбата"
 
-#: builtin/branch.c:592 builtin/for-each-ref.c:42 builtin/notes.c:407
-#: builtin/notes.c:410 builtin/notes.c:570 builtin/notes.c:573
-#: builtin/tag.c:430
+#: builtin/branch.c:618 builtin/for-each-ref.c:43 builtin/notes.c:408
+#: builtin/notes.c:411 builtin/notes.c:571 builtin/notes.c:574
+#: builtin/tag.c:408
 msgid "object"
 msgstr "ОБЕКТ"
 
-#: builtin/branch.c:593
+#: builtin/branch.c:619
 msgid "print only branches of the object"
 msgstr "извеждане само на клоните на ОБЕКТА"
 
-#: builtin/branch.c:595 builtin/for-each-ref.c:48 builtin/tag.c:435
+#: builtin/branch.c:621 builtin/for-each-ref.c:49 builtin/tag.c:415
 msgid "sorting and filtering are case insensitive"
 msgstr "подредбата и филтрирането третират еднакво малките и главните букви"
 
-#: builtin/branch.c:596 builtin/for-each-ref.c:38 builtin/tag.c:434
+#: builtin/branch.c:622 builtin/for-each-ref.c:38 builtin/tag.c:413
 #: builtin/verify-tag.c:39
 msgid "format to use for the output"
 msgstr "ФОРМАТ за изхода"
 
-#: builtin/branch.c:615
-msgid "Failed to resolve HEAD as a valid ref."
-msgstr "Не може да се открие към какво сочи указателят „HEAD“"
-
-#: builtin/branch.c:619 builtin/clone.c:728
+#: builtin/branch.c:645 builtin/clone.c:729
 msgid "HEAD not found below refs/heads!"
 msgstr "В директорията „refs/heads“ липсва файл „HEAD“"
 
-#: builtin/branch.c:642
+#: builtin/branch.c:668
 msgid "--column and --verbose are incompatible"
 msgstr "Опциите „--column“ и „--verbose“ са несъвместими"
 
-#: builtin/branch.c:653 builtin/branch.c:705
+#: builtin/branch.c:680 builtin/branch.c:732 builtin/branch.c:741
 msgid "branch name required"
 msgstr "Необходимо е име на клон"
 
-#: builtin/branch.c:681
+#: builtin/branch.c:708
 msgid "Cannot give description to detached HEAD"
 msgstr "Не може да зададете описание на несвързан „HEAD“"
 
-#: builtin/branch.c:686
+#: builtin/branch.c:713
 msgid "cannot edit description of more than one branch"
 msgstr "Не може да редактирате описанието на повече от един клон едновременно"
 
-#: builtin/branch.c:693
+#: builtin/branch.c:720
 #, c-format
 msgid "No commit on branch '%s' yet."
 msgstr "В клона „%s“ все още няма подавания."
 
-#: builtin/branch.c:696
+#: builtin/branch.c:723
 #, c-format
 msgid "No branch named '%s'."
 msgstr "Липсва клон на име „%s“."
 
-#: builtin/branch.c:711
-msgid "too many branches for a rename<