summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitattributes4
-rw-r--r--.gitignore3
-rw-r--r--Documentation/Makefile2
-rw-r--r--Documentation/RelNotes/2.19.0.txt31
-rw-r--r--Documentation/config.txt32
-rw-r--r--Documentation/git-branch.txt9
-rw-r--r--Documentation/git-format-patch.txt29
-rw-r--r--Documentation/git-interpret-trailers.txt10
-rw-r--r--Documentation/git-multi-pack-index.txt56
-rw-r--r--Documentation/git-pack-objects.txt97
-rw-r--r--Documentation/git-repack.txt5
-rw-r--r--Documentation/git-rerere.txt6
-rw-r--r--Documentation/technical/multi-pack-index.txt109
-rw-r--r--Documentation/technical/pack-format.txt77
-rw-r--r--Documentation/technical/rerere.txt186
-rwxr-xr-xGIT-VERSION-GEN2
-rw-r--r--Makefile7
-rw-r--r--bisect.c1
-rw-r--r--builtin.h1
-rw-r--r--builtin/am.c1
-rw-r--r--builtin/branch.c23
-rw-r--r--builtin/checkout.c120
-rw-r--r--builtin/clone.c1
-rw-r--r--builtin/commit.c1
-rw-r--r--builtin/count-objects.c2
-rw-r--r--builtin/fetch.c1
-rw-r--r--builtin/fmt-merge-msg.c1
-rw-r--r--builtin/fsck.c4
-rw-r--r--builtin/gc.c4
-rw-r--r--builtin/interpret-trailers.c1
-rw-r--r--builtin/log.c140
-rw-r--r--builtin/merge-base.c1
-rw-r--r--builtin/merge.c1
-rw-r--r--builtin/multi-pack-index.c47
-rw-r--r--builtin/pack-objects.c205
-rw-r--r--builtin/pack-redundant.c4
-rw-r--r--builtin/pull.c1
-rw-r--r--builtin/range-diff.c25
-rw-r--r--builtin/receive-pack.c1
-rw-r--r--builtin/remote.c1
-rw-r--r--builtin/repack.c18
-rw-r--r--builtin/rerere.c4
-rw-r--r--builtin/rev-list.c2
-rw-r--r--builtin/rev-parse.c1
-rw-r--r--builtin/submodule--helper.c218
-rw-r--r--cache-tree.c80
-rw-r--r--cache-tree.h1
-rw-r--r--cache.h1
-rw-r--r--command-list.txt1
-rw-r--r--commit-graph.c18
-rw-r--r--commit-graph.h6
-rw-r--r--commit-reach.c665
-rw-r--r--commit-reach.h77
-rw-r--r--commit.c364
-rw-r--r--commit.h31
-rw-r--r--config.mak.uname12
-rw-r--r--delta-islands.c502
-rw-r--r--delta-islands.h11
-rw-r--r--diff-lib.c4
-rw-r--r--diff.c106
-rw-r--r--diff.h5
-rw-r--r--dir.c9
-rw-r--r--entry.c31
-rw-r--r--fast-import.c5
-rwxr-xr-xgit-submodule.sh29
-rw-r--r--git.c1
-rw-r--r--http-backend.c6
-rw-r--r--http-push.c2
-rw-r--r--interdiff.c28
-rw-r--r--interdiff.h8
-rw-r--r--log-tree.c52
-rw-r--r--merge-recursive.c19
-rw-r--r--merge-recursive.h1
-rw-r--r--midx.c930
-rw-r--r--midx.h47
-rw-r--r--name-hash.c4
-rw-r--r--notes-merge.c1
-rw-r--r--object-store.h15
-rw-r--r--object.h4
-rw-r--r--pack-bitmap-write.c1
-rw-r--r--pack-bitmap.c27
-rw-r--r--pack-bitmap.h7
-rw-r--r--pack-objects.c33
-rw-r--r--pack-objects.h59
-rw-r--r--packfile.c199
-rw-r--r--packfile.h10
-rw-r--r--po/bg.po7357
-rw-r--r--po/de.po5179
-rw-r--r--po/es.po7324
-rw-r--r--po/fr.po7374
-rw-r--r--po/git.pot7128
-rw-r--r--po/ru.po10148
-rw-r--r--po/sv.po7373
-rw-r--r--po/vi.po7376
-rw-r--r--po/zh_CN.po7411
-rw-r--r--preload-index.c4
-rw-r--r--pretty.c3
-rw-r--r--range-diff.c48
-rw-r--r--range-diff.h5
-rw-r--r--read-cache.c16
-rw-r--r--ref-filter.c148
-rw-r--r--remote.c50
-rw-r--r--remote.h1
-rw-r--r--rerere.c243
-rw-r--r--revision.c6
-rw-r--r--revision.h16
-rw-r--r--sequencer.c59
-rw-r--r--sequencer.h9
-rw-r--r--server-info.c4
-rw-r--r--sha1-name.c71
-rw-r--r--shallow.c1
-rw-r--r--submodule.c15
-rw-r--r--submodule.h2
-rw-r--r--t/README4
-rw-r--r--t/chainlint.sed67
-rw-r--r--t/chainlint/here-doc.expect2
-rw-r--r--t/chainlint/here-doc.test7
-rw-r--r--t/chainlint/subshell-here-doc.expect1
-rw-r--r--t/chainlint/subshell-here-doc.test4
-rwxr-xr-xt/check-non-portable-shell.pl3
-rw-r--r--t/helper/test-reach.c130
-rw-r--r--t/helper/test-read-midx.c51
-rw-r--r--t/helper/test-tool.c2
-rw-r--r--t/helper/test-tool.h2
-rwxr-xr-xt/lib-submodule-update.sh5
-rw-r--r--t/perf/README25
-rwxr-xr-xt/perf/aggregate.perl69
-rwxr-xr-xt/perf/p5311-pack-bitmaps-fetch.sh45
-rw-r--r--t/perf/perf-lib.sh74
-rw-r--r--t/t0019/parse_json.perl3
-rwxr-xr-xt/t0028-working-tree-encoding.sh6
-rwxr-xr-xt/t1090-sparse-checkout-scope.sh14
-rwxr-xr-xt/t1404-update-ref-errors.sh6
-rwxr-xr-xt/t3206-range-diff.sh57
-rwxr-xr-xt/t3401-rebase-and-am-rename.sh110
-rwxr-xr-xt/t3404-rebase-interactive.sh18
-rwxr-xr-xt/t4013-diff-various.sh2
-rwxr-xr-xt/t4014-format-patch.sh34
-rwxr-xr-xt/t4200-rerere.sh65
-rwxr-xr-xt/t4205-log-pretty-formats.sh23
-rwxr-xr-xt/t5310-pack-bitmaps.sh2
-rwxr-xr-xt/t5318-commit-graph.sh2
-rwxr-xr-xt/t5319-multi-pack-index.sh217
-rwxr-xr-xt/t5320-delta-islands.sh143
-rwxr-xr-xt/t5552-skipping-fetch-negotiator.sh12
-rwxr-xr-xt/t5562-http-backend-content-length.sh11
-rwxr-xr-xt/t5601-clone.sh8
-rwxr-xr-xt/t5703-upload-pack-ref-in-want.sh4
-rwxr-xr-xt/t6018-rev-list-glob.sh2
-rwxr-xr-xt/t6300-for-each-ref.sh23
-rwxr-xr-xt/t6600-test-reach.sh242
-rwxr-xr-xt/t7400-submodule-basic.sh5
-rwxr-xr-xt/t7501-commit.sh16
-rwxr-xr-xt/t7513-interpret-trailers.sh42
-rw-r--r--t/test-lib-functions.sh2
-rw-r--r--t/test-lib.sh10
-rw-r--r--trace.c69
-rw-r--r--trace.h15
-rw-r--r--trailer.c62
-rw-r--r--trailer.h4
-rw-r--r--unpack-trees.c201
-rw-r--r--unpack-trees.h1
-rw-r--r--upload-pack.c58
163 files changed, 47733 insertions, 26525 deletions
diff --git a/.gitattributes b/.gitattributes
index 1bdc91e..49b3051 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -9,3 +9,7 @@
/command-list.txt eol=lf
/GIT-VERSION-GEN eol=lf
/mergetools/* eol=lf
+/Documentation/git-merge.txt conflict-marker-size=32
+/Documentation/gitk.txt conflict-marker-size=32
+/Documentation/user-manual.txt conflict-marker-size=32
+/t/t????-*.sh conflict-marker-size=32
diff --git a/.gitignore b/.gitignore
index ffceea7..9d1363a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -99,8 +99,9 @@
/git-mergetool--lib
/git-mktag
/git-mktree
-/git-name-rev
+/git-multi-pack-index
/git-mv
+/git-name-rev
/git-notes
/git-p4
/git-pack-redundant
diff --git a/Documentation/Makefile b/Documentation/Makefile
index a42dcfc..95f6a32 100644
--- a/Documentation/Makefile
+++ b/Documentation/Makefile
@@ -344,7 +344,7 @@ $(OBSOLETE_HTML): %.html : %.txto asciidoc.conf
mv $@+ $@
manpage-base-url.xsl: manpage-base-url.xsl.in
- sed "s|@@MAN_BASE_URL@@|$(MAN_BASE_URL)|" $< > $@
+ $(QUIET_GEN)sed "s|@@MAN_BASE_URL@@|$(MAN_BASE_URL)|" $< > $@
%.1 %.5 %.7 : %.xml manpage-base-url.xsl
$(QUIET_XMLTO)$(RM) $@ && \
diff --git a/Documentation/RelNotes/2.19.0.txt b/Documentation/RelNotes/2.19.0.txt
index 6a33158..a06ccf6 100644
--- a/Documentation/RelNotes/2.19.0.txt
+++ b/Documentation/RelNotes/2.19.0.txt
@@ -126,9 +126,6 @@ Performance, Internal Implementation, Development Support etc.
* Build and test procedure for netrc credential helper (in contrib/)
has been updated.
- * The conversion to pass "the_repository" and then "a_repository"
- throughout the object access API continues.
-
* Remove unused function definitions and declarations from ewah
bitmap subsystem.
@@ -267,6 +264,11 @@ Performance, Internal Implementation, Development Support etc.
config.txt file but are described in another file that is included
by it, which has been corrected.
+ * The test linter code has learned that the end of here-doc mark
+ "EOF" can be quoted in a double-quote pair, not just in a
+ single-quote pair.
+
+
Fixes since v2.18
-----------------
@@ -311,11 +313,6 @@ Fixes since v2.18
to the submodule was changed in the range of commits in the
superproject, sometimes showing "(null)". This has been corrected.
- * "git submodule" did not correctly adjust core.worktree setting that
- indicates whether/where a submodule repository has its associated
- working tree across various state transitions, which has been
- corrected.
-
* Bugfix for "rebase -i" corner case regression.
(merge a9279c6785 pw/rebase-i-keep-reword-after-conflict later to maint).
@@ -556,6 +553,23 @@ Fixes since v2.18
which has been fixed.
(merge 9bf5d4c4e2 nd/config-core-checkstat-doc later to maint).
+ * Recent "git rebase -i" update started to write bogusly formatted
+ author-script, with a matching broken reading code. These are
+ fixed.
+
+ * Recent addition of "directory rename" heuristics to the
+ merge-recursive backend makes the command susceptible to false
+ positives and false negatives. In the context of "git am -3",
+ which does not know about surrounding unmodified paths and thus
+ cannot inform the merge machinery about the full trees involved,
+ this risk is particularly severe. As such, the heuristic is
+ disabled for "git am -3" to keep the machinery "more stupid but
+ predictable".
+
+ * "git merge-base" in 2.19-rc1 has performance regression when the
+ (experimental) commit-graph feature is in use, which has been
+ mitigated.
+
* Code cleanup, docfix, build fix, etc.
(merge aee9be2ebe sg/update-ref-stdin-cleanup later to maint).
(merge 037714252f jc/clean-after-sanity-tests later to maint).
@@ -598,3 +612,4 @@ Fixes since v2.18
(merge 79b04f9b60 sg/t3903-missing-fix later to maint).
(merge 2745817028 sg/t3420-autostash-fix later to maint).
(merge 7afb0d6777 sg/test-rebase-editor-fix later to maint).
+ (merge 6c6ce21baa es/freebsd-iconv-portability later to maint).
diff --git a/Documentation/config.txt b/Documentation/config.txt
index eb66a11..112041f 100644
--- a/Documentation/config.txt
+++ b/Documentation/config.txt
@@ -937,6 +937,11 @@ core.useReplaceRefs::
option was given on the command line. See linkgit:git[1] and
linkgit:git-replace[1] for more information.
+core.multiPackIndex::
+ Use the multi-pack-index file to track multiple packfiles using a
+ single index. See link:technical/multi-pack-index.html[the
+ multi-pack-index design document].
+
core.sparseCheckout::
Enable "sparse checkout" feature. See section "Sparse checkout" in
linkgit:git-read-tree[1] for more information.
@@ -1154,6 +1159,14 @@ and by linkgit:git-worktree[1] when 'git worktree add' refers to a
remote branch. This setting might be used for other checkout-like
commands or functionality in the future.
+checkout.optimizeNewBranch
+ Optimizes the performance of "git checkout -b <new_branch>" when
+ using sparse-checkout. When set to true, git will not update the
+ repo based on the current sparse-checkout settings. This means it
+ will not update the skip-worktree bit in the index nor add/remove
+ files in the working directory to reflect the current sparse checkout
+ settings nor will it show the local changes.
+
clean.requireForce::
A boolean to make git-clean do nothing unless given -f,
-i or -n. Defaults to true.
@@ -2671,6 +2684,21 @@ Note that changing the compression level will not automatically recompress
all existing objects. You can force recompression by passing the -F option
to linkgit:git-repack[1].
+pack.island::
+ An extended regular expression configuring a set of delta
+ islands. See "DELTA ISLANDS" in linkgit:git-pack-objects[1]
+ for details.
+
+pack.islandCore::
+ Specify an island name which gets to have its objects be
+ packed first. This creates a kind of pseudo-pack at the front
+ of one pack, so that the objects from the specified island are
+ hopefully faster to copy into any pack that should be served
+ to a user requesting these objects. In practice this means
+ that the island specified should likely correspond to what is
+ the most commonly cloned in the repo. See also "DELTA ISLANDS"
+ in linkgit:git-pack-objects[1].
+
pack.deltaCacheSize::
The maximum memory in bytes used for caching deltas in
linkgit:git-pack-objects[1] before writing them out to a pack.
@@ -3205,6 +3233,10 @@ repack.packKeptObjects::
index is being written (either via `--write-bitmap-index` or
`repack.writeBitmaps`).
+repack.useDeltaIslands::
+ If set to true, makes `git repack` act as if `--delta-islands`
+ was passed. Defaults to `false`.
+
repack.writeBitmaps::
When true, git will write a bitmap index when packing all
objects to disk (e.g., when `git repack -a` is run). This
diff --git a/Documentation/git-branch.txt b/Documentation/git-branch.txt
index 9767b2b..bf5316f 100644
--- a/Documentation/git-branch.txt
+++ b/Documentation/git-branch.txt
@@ -14,7 +14,7 @@ SYNOPSIS
[(--merged | --no-merged) [<commit>]]
[--contains [<commit]] [--no-contains [<commit>]]
[--points-at <object>] [--format=<format>] [<pattern>...]
-'git branch' [--track | --no-track] [-l] [-f] <branchname> [<start-point>]
+'git branch' [--track | --no-track] [-f] <branchname> [<start-point>]
'git branch' (--set-upstream-to=<upstream> | -u <upstream>) [<branchname>]
'git branch' --unset-upstream [<branchname>]
'git branch' (-m | -M) [<oldbranch>] <newbranch>
@@ -100,8 +100,6 @@ OPTIONS
The negated form `--no-create-reflog` only overrides an earlier
`--create-reflog`, but currently does not negate the setting of
`core.logAllRefUpdates`.
-+
-The `-l` option is a deprecated synonym for `--create-reflog`.
-f::
--force::
@@ -156,14 +154,11 @@ This option is only applicable in non-verbose mode.
--all::
List both remote-tracking branches and local branches.
+-l::
--list::
List branches. With optional `<pattern>...`, e.g. `git
branch --list 'maint-*'`, list only the branches that match
the pattern(s).
-+
-This should not be confused with `git branch -l <branchname>`,
-which creates a branch named `<branchname>` with a reflog.
-See `--create-reflog` above for details.
-v::
-vv::
diff --git a/Documentation/git-format-patch.txt b/Documentation/git-format-patch.txt
index b41e132..aba4c5f 100644
--- a/Documentation/git-format-patch.txt
+++ b/Documentation/git-format-patch.txt
@@ -23,6 +23,8 @@ SYNOPSIS
[(--reroll-count|-v) <n>]
[--to=<email>] [--cc=<email>]
[--[no-]cover-letter] [--quiet] [--notes[=<ref>]]
+ [--interdiff=<previous>]
+ [--range-diff=<previous> [--creation-factor=<percent>]]
[--progress]
[<common diff options>]
[ <since> | <revision range> ]
@@ -228,6 +230,33 @@ feeding the result to `git send-email`.
containing the branch description, shortlog and the overall diffstat. You can
fill in a description in the file before sending it out.
+--interdiff=<previous>::
+ As a reviewer aid, insert an interdiff into the cover letter,
+ or as commentary of the lone patch of a 1-patch series, showing
+ the differences between the previous version of the patch series and
+ the series currently being formatted. `previous` is a single revision
+ naming the tip of the previous series which shares a common base with
+ the series being formatted (for example `git format-patch
+ --cover-letter --interdiff=feature/v1 -3 feature/v2`).
+
+--range-diff=<previous>::
+ As a reviewer aid, insert a range-diff (see linkgit:git-range-diff[1])
+ into the cover letter, or as commentary of the lone patch of a
+ 1-patch series, showing the differences between the previous
+ version of the patch series and the series currently being formatted.
+ `previous` can be a single revision naming the tip of the previous
+ series if it shares a common base with the series being formatted (for
+ example `git format-patch --cover-letter --range-diff=feature/v1 -3
+ feature/v2`), or a revision range if the two versions of the series are
+ disjoint (for example `git format-patch --cover-letter
+ --range-diff=feature/v1~3..feature/v1 -3 feature/v2`).
+
+--creation-factor=<percent>::
+ Used with `--range-diff`, tweak the heuristic which matches up commits
+ between the previous and current series of patches by adjusting the
+ creation/deletion cost fudge factor. See linkgit:git-range-diff[1])
+ for details.
+
--notes[=<ref>]::
Append the notes (see linkgit:git-notes[1]) for the commit
after the three-dash line.
diff --git a/Documentation/git-interpret-trailers.txt b/Documentation/git-interpret-trailers.txt
index b8fafb1..a5e8b36 100644
--- a/Documentation/git-interpret-trailers.txt
+++ b/Documentation/git-interpret-trailers.txt
@@ -56,8 +56,9 @@ least one Git-generated or user-configured trailer and consists of at
least 25% trailers.
The group must be preceded by one or more empty (or whitespace-only) lines.
The group must either be at the end of the message or be the last
-non-whitespace lines before a line that starts with '---'. Such three
-minus signs start the patch part of the message.
+non-whitespace lines before a line that starts with '---' (followed by a
+space or the end of the line). Such three minus signs start the patch
+part of the message. See also `--no-divider` below.
When reading trailers, there can be whitespaces after the
token, the separator and the value. There can also be whitespaces
@@ -125,6 +126,11 @@ OPTIONS
A convenience alias for `--only-trailers --only-input
--unfold`.
+--no-divider::
+ Do not treat `---` as the end of the commit message. Use this
+ when you know your input contains just the commit message itself
+ (and not an email or the output of `git format-patch`).
+
CONFIGURATION VARIABLES
-----------------------
diff --git a/Documentation/git-multi-pack-index.txt b/Documentation/git-multi-pack-index.txt
new file mode 100644
index 0000000..1f97e79
--- /dev/null
+++ b/Documentation/git-multi-pack-index.txt
@@ -0,0 +1,56 @@
+git-multi-pack-index(1)
+=======================
+
+NAME
+----
+git-multi-pack-index - Write and verify multi-pack-indexes
+
+
+SYNOPSIS
+--------
+[verse]
+'git multi-pack-index' [--object-dir=<dir>] <verb>
+
+DESCRIPTION
+-----------
+Write or verify a multi-pack-index (MIDX) file.
+
+OPTIONS
+-------
+
+--object-dir=<dir>::
+ Use given directory for the location of Git objects. We check
+ `<dir>/packs/multi-pack-index` for the current MIDX file, and
+ `<dir>/packs` for the pack-files to index.
+
+write::
+ When given as the verb, write a new MIDX file to
+ `<dir>/packs/multi-pack-index`.
+
+
+EXAMPLES
+--------
+
+* Write a MIDX file for the packfiles in the current .git folder.
++
+-----------------------------------------------
+$ git multi-pack-index write
+-----------------------------------------------
+
+* Write a MIDX file for the packfiles in an alternate object store.
++
+-----------------------------------------------
+$ git multi-pack-index --object-dir <alt> write
+-----------------------------------------------
+
+
+SEE ALSO
+--------
+See link:technical/multi-pack-index.html[The Multi-Pack-Index Design
+Document] and link:technical/pack-format.html[The Multi-Pack-Index
+Format] for more information on the multi-pack-index feature.
+
+
+GIT
+---
+Part of the linkgit:git[1] suite
diff --git a/Documentation/git-pack-objects.txt b/Documentation/git-pack-objects.txt
index d95b472..40c825c 100644
--- a/Documentation/git-pack-objects.txt
+++ b/Documentation/git-pack-objects.txt
@@ -289,6 +289,103 @@ Unexpected missing object will raise an error.
--unpack-unreachable::
Keep unreachable objects in loose form. This implies `--revs`.
+--delta-islands::
+ Restrict delta matches based on "islands". See DELTA ISLANDS
+ below.
+
+
+DELTA ISLANDS
+-------------
+
+When possible, `pack-objects` tries to reuse existing on-disk deltas to
+avoid having to search for new ones on the fly. This is an important
+optimization for serving fetches, because it means the server can avoid
+inflating most objects at all and just send the bytes directly from
+disk. This optimization can't work when an object is stored as a delta
+against a base which the receiver does not have (and which we are not
+already sending). In that case the server "breaks" the delta and has to
+find a new one, which has a high CPU cost. Therefore it's important for
+performance that the set of objects in on-disk delta relationships match
+what a client would fetch.
+
+In a normal repository, this tends to work automatically. The objects
+are mostly reachable from the branches and tags, and that's what clients
+fetch. Any deltas we find on the server are likely to be between objects
+the client has or will have.
+
+But in some repository setups, you may have several related but separate
+groups of ref tips, with clients tending to fetch those groups
+independently. For example, imagine that you are hosting several "forks"
+of a repository in a single shared object store, and letting clients
+view them as separate repositories through `GIT_NAMESPACE` or separate
+repos using the alternates mechanism. A naive repack may find that the
+optimal delta for an object is against a base that is only found in
+another fork. But when a client fetches, they will not have the base
+object, and we'll have to find a new delta on the fly.
+
+A similar situation may exist if you have many refs outside of
+`refs/heads/` and `refs/tags/` that point to related objects (e.g.,
+`refs/pull` or `refs/changes` used by some hosting providers). By
+default, clients fetch only heads and tags, and deltas against objects
+found only in those other groups cannot be sent as-is.
+
+Delta islands solve this problem by allowing you to group your refs into
+distinct "islands". Pack-objects computes which objects are reachable
+from which islands, and refuses to make a delta from an object `A`
+against a base which is not present in all of `A`'s islands. This
+results in slightly larger packs (because we miss some delta
+opportunities), but guarantees that a fetch of one island will not have
+to recompute deltas on the fly due to crossing island boundaries.
+
+When repacking with delta islands the delta window tends to get
+clogged with candidates that are forbidden by the config. Repacking
+with a big --window helps (and doesn't take as long as it otherwise
+might because we can reject some object pairs based on islands before
+doing any computation on the content).
+
+Islands are configured via the `pack.island` option, which can be
+specified multiple times. Each value is a left-anchored regular
+expressions matching refnames. For example:
+
+-------------------------------------------
+[pack]
+island = refs/heads/
+island = refs/tags/
+-------------------------------------------
+
+puts heads and tags into an island (whose name is the empty string; see
+below for more on naming). Any refs which do not match those regular
+expressions (e.g., `refs/pull/123`) is not in any island. Any object
+which is reachable only from `refs/pull/` (but not heads or tags) is
+therefore not a candidate to be used as a base for `refs/heads/`.
+
+Refs are grouped into islands based on their "names", and two regexes
+that produce the same name are considered to be in the same
+island. The names are computed from the regexes by concatenating any
+capture groups from the regex, with a '-' dash in between. (And if
+there are no capture groups, then the name is the empty string, as in
+the above example.) This allows you to create arbitrary numbers of
+islands. Only up to 14 such capture groups are supported though.
+
+For example, imagine you store the refs for each fork in
+`refs/virtual/ID`, where `ID` is a numeric identifier. You might then
+configure:
+
+-------------------------------------------
+[pack]
+island = refs/virtual/([0-9]+)/heads/
+island = refs/virtual/([0-9]+)/tags/
+island = refs/virtual/([0-9]+)/(pull)/
+-------------------------------------------
+
+That puts the heads and tags for each fork in their own island (named
+"1234" or similar), and the pull refs for each go into their own
+"1234-pull".
+
+Note that we pick a single island for each regex to go into, using "last
+one wins" ordering (which allows repo-specific config to take precedence
+over user-wide config, and so forth).
+
SEE ALSO
--------
linkgit:git-rev-list[1]
diff --git a/Documentation/git-repack.txt b/Documentation/git-repack.txt
index d056250..aa0cc8b 100644
--- a/Documentation/git-repack.txt
+++ b/Documentation/git-repack.txt
@@ -160,6 +160,11 @@ depth is 4095.
being removed. In addition, any unreachable loose objects will
be packed (and their loose counterparts removed).
+-i::
+--delta-islands::
+ Pass the `--delta-islands` option to `git-pack-objects`, see
+ linkgit:git-pack-objects[1].
+
Configuration
-------------
diff --git a/Documentation/git-rerere.txt b/Documentation/git-rerere.txt
index 031f31f..df310d2 100644
--- a/Documentation/git-rerere.txt
+++ b/Documentation/git-rerere.txt
@@ -211,6 +211,12 @@ would conflict the same way as the test merge you resolved earlier.
'git rerere' will be run by 'git rebase' to help you resolve this
conflict.
+[NOTE] 'git rerere' relies on the conflict markers in the file to
+detect the conflict. If the file already contains lines that look the
+same as lines with conflict markers, 'git rerere' may fail to record a
+conflict resolution. To work around this, the `conflict-marker-size`
+setting in linkgit:gitattributes[5] can be used.
+
GIT
---
Part of the linkgit:git[1] suite
diff --git a/Documentation/technical/multi-pack-index.txt b/Documentation/technical/multi-pack-index.txt
new file mode 100644
index 0000000..d7e5763
--- /dev/null
+++ b/Documentation/technical/multi-pack-index.txt
@@ -0,0 +1,109 @@
+Multi-Pack-Index (MIDX) Design Notes
+====================================
+
+The Git object directory contains a 'pack' directory containing
+packfiles (with suffix ".pack") and pack-indexes (with suffix
+".idx"). The pack-indexes provide a way to lookup objects and
+navigate to their offset within the pack, but these must come
+in pairs with the packfiles. This pairing depends on the file
+names, as the pack-index differs only in suffix with its pack-
+file. While the pack-indexes provide fast lookup per packfile,
+this performance degrades as the number of packfiles increases,
+because abbreviations need to inspect every packfile and we are
+more likely to have a miss on our most-recently-used packfile.
+For some large repositories, repacking into a single packfile
+is not feasible due to storage space or excessive repack times.
+
+The multi-pack-index (MIDX for short) stores a list of objects
+and their offsets into multiple packfiles. It contains:
+
+- A list of packfile names.
+- A sorted list of object IDs.
+- A list of metadata for the ith object ID including:
+ - A value j referring to the jth packfile.
+ - An offset within the jth packfile for the object.
+- If large offsets are required, we use another list of large
+ offsets similar to version 2 pack-indexes.
+
+Thus, we can provide O(log N) lookup time for any number
+of packfiles.
+
+Design Details
+--------------
+
+- The MIDX is stored in a file named 'multi-pack-index' in the
+ .git/objects/pack directory. This could be stored in the pack
+ directory of an alternate. It refers only to packfiles in that
+ same directory.
+
+- The pack.multiIndex config setting must be on to consume MIDX files.
+
+- The file format includes parameters for the object ID hash
+ function, so a future change of hash algorithm does not require
+ a change in format.
+
+- The MIDX keeps only one record per object ID. If an object appears
+ in multiple packfiles, then the MIDX selects the copy in the most-
+ recently modified packfile.
+
+- If there exist packfiles in the pack directory not registered in
+ the MIDX, then those packfiles are loaded into the `packed_git`
+ list and `packed_git_mru` cache.
+
+- The pack-indexes (.idx files) remain in the pack directory so we
+ can delete the MIDX file, set core.midx to false, or downgrade
+ without any loss of information.
+
+- The MIDX file format uses a chunk-based approach (similar to the
+ commit-graph file) that allows optional data to be added.
+
+Future Work
+-----------
+
+- Add a 'verify' subcommand to the 'git midx' builtin to verify the
+ contents of the multi-pack-index file match the offsets listed in
+ the corresponding pack-indexes.
+
+- The multi-pack-index allows many packfiles, especially in a context
+ where repacking is expensive (such as a very large repo), or
+ unexpected maintenance time is unacceptable (such as a high-demand
+ build machine). However, the multi-pack-index needs to be rewritten
+ in full every time. We can extend the format to be incremental, so
+ writes are fast. By storing a small "tip" multi-pack-index that
+ points to large "base" MIDX files, we can keep writes fast while
+ still reducing the number of binary searches required for object
+ lookups.
+
+- The reachability bitmap is currently paired directly with a single
+ packfile, using the pack-order as the object order to hopefully
+ compress the bitmaps well using run-length encoding. This could be
+ extended to pair a reachability bitmap with a multi-pack-index. If
+ the multi-pack-index is extended to store a "stable object order"
+ (a function Order(hash) = integer that is constant for a given hash,
+ even as the multi-pack-index is updated) then a reachability bitmap
+ could point to a multi-pack-index and be updated independently.
+
+- Packfiles can be marked as "special" using empty files that share
+ the initial name but replace ".pack" with ".keep" or ".promisor".
+ We can add an optional chunk of data to the multi-pack-index that
+ records flags of information about the packfiles. This allows new
+ states, such as 'repacked' or 'redeltified', that can help with
+ pack maintenance in a multi-pack environment. It may also be
+ helpful to organize packfiles by object type (commit, tree, blob,
+ etc.) and use this metadata to help that maintenance.
+
+- The partial clone feature records special "promisor" packs that
+ may point to objects that are not stored locally, but available
+ on request to a server. The multi-pack-index does not currently
+ track these promisor packs.
+
+Related Links
+-------------
+[0] https://bugs.chromium.org/p/git/issues/detail?id=6
+ Chromium work item for: Multi-Pack Index (MIDX)
+
+[1] https://public-inbox.org/git/20180107181459.222909-1-dstolee@microsoft.com/
+ An earlier RFC for the multi-pack-index feature
+
+[2] https://public-inbox.org/git/alpine.DEB.2.20.1803091557510.23109@alexmv-linux/
+ Git Merge 2018 Contributor's summit notes (includes discussion of MIDX)
diff --git a/Documentation/technical/pack-format.txt b/Documentation/technical/pack-format.txt
index 70a99fd..cab5bdd 100644
--- a/Documentation/technical/pack-format.txt
+++ b/Documentation/technical/pack-format.txt
@@ -252,3 +252,80 @@ Pack file entry: <+
corresponding packfile.
20-byte SHA-1-checksum of all of the above.
+
+== multi-pack-index (MIDX) files have the following format:
+
+The multi-pack-index files refer to multiple pack-files and loose objects.
+
+In order to allow extensions that add extra data to the MIDX, we organize
+the body into "chunks" and provide a lookup table at the beginning of the
+body. The header includes certain length values, such as the number of packs,
+the number of base MIDX files, hash lengths and types.
+
+All 4-byte numbers are in network order.
+
+HEADER:
+
+ 4-byte signature:
+ The signature is: {'M', 'I', 'D', 'X'}
+
+ 1-byte version number:
+ Git only writes or recognizes version 1.
+
+ 1-byte Object Id Version
+ Git only writes or recognizes version 1 (SHA1).
+
+ 1-byte number of "chunks"
+
+ 1-byte number of base multi-pack-index files:
+ This value is currently always zero.
+
+ 4-byte number of pack files
+
+CHUNK LOOKUP:
+
+ (C + 1) * 12 bytes providing the chunk offsets:
+ First 4 bytes describe chunk id. Value 0 is a terminating label.
+ Other 8 bytes provide offset in current file for chunk to start.
+ (Chunks are provided in file-order, so you can infer the length
+ using the next chunk position if necessary.)
+
+ The remaining data in the body is described one chunk at a time, and
+ these chunks may be given in any order. Chunks are required unless
+ otherwise specified.
+
+CHUNK DATA:
+
+ Packfile Names (ID: {'P', 'N', 'A', 'M'})
+ Stores the packfile names as concatenated, null-terminated strings.
+ Packfiles must be listed in lexicographic order for fast lookups by
+ name. This is the only chunk not guaranteed to be a multiple of four
+ bytes in length, so should be the last chunk for alignment reasons.
+
+ OID Fanout (ID: {'O', 'I', 'D', 'F'})
+ The ith entry, F[i], stores the number of OIDs with first
+ byte at most i. Thus F[255] stores the total
+ number of objects.
+
+ OID Lookup (ID: {'O', 'I', 'D', 'L'})
+ The OIDs for all objects in the MIDX are stored in lexicographic
+ order in this chunk.
+
+ Object Offsets (ID: {'O', 'O', 'F', 'F'})
+ Stores two 4-byte values for every object.
+ 1: The pack-int-id for the pack storing this object.
+ 2: The offset within the pack.
+ If all offsets are less than 2^31, then the large offset chunk
+ will not exist and offsets are stored as in IDX v1.
+ If there is at least one offset value larger than 2^32-1, then
+ the large offset chunk must exist. If the large offset chunk
+ exists and the 31st bit is on, then removing that bit reveals
+ the row in the large offsets containing the 8-byte offset of
+ this object.
+
+ [Optional] Object Large Offsets (ID: {'L', 'O', 'F', 'F'})
+ 8-byte offsets into large packfiles.
+
+TRAILER:
+
+ 20-byte SHA1-checksum of the above contents.
diff --git a/Documentation/technical/rerere.txt b/Documentation/technical/rerere.txt
new file mode 100644
index 0000000..aa22d7a
--- /dev/null
+++ b/Documentation/technical/rerere.txt
@@ -0,0 +1,186 @@
+Rerere
+======
+
+This document describes the rerere logic.
+
+Conflict normalization
+----------------------
+
+To ensure recorded conflict resolutions can be looked up in the rerere
+database, even when branches are merged in a different order,
+different branches are merged that result in the same conflict, or
+when different conflict style settings are used, rerere normalizes the
+conflicts before writing them to the rerere database.
+
+Different conflict styles and branch names are normalized by stripping
+the labels from the conflict markers, and removing the common ancestor
+version from the `diff3` conflict style. Branches that are merged
+in different order are normalized by sorting the conflict hunks. More
+on each of those steps in the following sections.
+
+Once these two normalization operations are applied, a conflict ID is
+calculated based on the normalized conflict, which is later used by
+rerere to look up the conflict in the rerere database.
+
+Removing the common ancestor version
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Say we have three branches AB, AC and AC2. The common ancestor of
+these branches has a file with a line containing the string "A" (for
+brevity this is called "line A" in the rest of the document). In
+branch AB this line is changed to "B", in AC, this line is changed to
+"C", and branch AC2 is forked off of AC, after the line was changed to
+"C".
+
+Forking a branch ABAC off of branch AB and then merging AC into it, we
+get a conflict like the following:
+
+ <<<<<<< HEAD
+ B
+ =======
+ C
+ >>>>>>> AC
+
+Doing the analogous with AC2 (forking a branch ABAC2 off of branch AB
+and then merging branch AC2 into it), using the diff3 conflict style,
+we get a conflict like the following:
+
+ <<<<<<< HEAD
+ B
+ ||||||| merged common ancestors
+ A
+ =======
+ C
+ >>>>>>> AC2
+
+By resolving this conflict, to leave line D, the user declares:
+
+ After examining what branches AB and AC did, I believe that making
+ line A into line D is the best thing to do that is compatible with
+ what AB and AC wanted to do.
+
+As branch AC2 refers to the same commit as AC, the above implies that
+this is also compatible what AB and AC2 wanted to do.
+
+By extension, this means that rerere should recognize that the above
+conflicts are the same. To do this, the labels on the conflict
+markers are stripped, and the common ancestor version is removed. The above
+examples would both result in the following normalized conflict:
+
+ <<<<<<<
+ B
+ =======
+ C
+ >>>>>>>
+
+Sorting hunks
+~~~~~~~~~~~~~
+
+As before, lets imagine that a common ancestor had a file with line A
+its early part, and line X in its late part. And then four branches
+are forked that do these things:
+
+ - AB: changes A to B
+ - AC: changes A to C
+ - XY: changes X to Y
+ - XZ: changes X to Z
+
+Now, forking a branch ABAC off of branch AB and then merging AC into
+it, and forking a branch ACAB off of branch AC and then merging AB
+into it, would yield the conflict in a different order. The former
+would say "A became B or C, what now?" while the latter would say "A
+became C or B, what now?"
+
+As a reminder, the act of merging AC into ABAC and resolving the
+conflict to leave line D means that the user declares:
+
+ After examining what branches AB and AC did, I believe that
+ making line A into line D is the best thing to do that is
+ compatible with what AB and AC wanted to do.
+
+So the conflict we would see when merging AB into ACAB should be
+resolved the same way---it is the resolution that is in line with that
+declaration.
+
+Imagine that similarly previously a branch XYXZ was forked from XY,
+and XZ was merged into it, and resolved "X became Y or Z" into "X
+became W".
+
+Now, if a branch ABXY was forked from AB and then merged XY, then ABXY
+would have line B in its early part and line Y in its later part.
+Such a merge would be quite clean. We can construct 4 combinations
+using these four branches ((AB, AC) x (XY, XZ)).
+
+Merging ABXY and ACXZ would make "an early A became B or C, a late X
+became Y or Z" conflict, while merging ACXY and ABXZ would make "an
+early A became C or B, a late X became Y or Z". We can see there are
+4 combinations of ("B or C", "C or B") x ("X or Y", "Y or X").
+
+By sorting, the conflict is given its canonical name, namely, "an
+early part became B or C, a late part becames X or Y", and whenever
+any of these four patterns appear, and we can get to the same conflict
+and resolution that we saw earlier.
+
+Without the sorting, we'd have to somehow find a previous resolution
+from combinatorial explosion.
+
+Conflict ID calculation
+~~~~~~~~~~~~~~~~~~~~~~~
+
+Once the conflict normalization is done, the conflict ID is calculated
+as the sha1 hash of the conflict hunks appended to each other,
+separated by <NUL> characters. The conflict markers are stripped out
+before the sha1 is calculated. So in the example above, where we
+merge branch AC which changes line A to line C, into branch AB, which
+changes line A to line C, the conflict ID would be
+SHA1('B<NUL>C<NUL>').
+
+If there are multiple conflicts in one file, the sha1 is calculated
+the same way with all hunks appended to each other, in the order in
+which they appear in the file, separated by a <NUL> character.
+
+Nested conflicts
+~~~~~~~~~~~~~~~~
+
+Nested conflicts are handled very similarly to "simple" conflicts.
+Similar to simple conflicts, the conflict is first normalized by
+stripping the labels from conflict markers, stripping the common ancestor
+version, and the sorting the conflict hunks, both for the outer and the
+inner conflict. This is done recursively, so any number of nested
+conflicts can be handled.
+
+Note that this only works for conflict markers that "cleanly nest". If
+there are any unmatched conflict markers, rerere will fail to handle
+the conflict and record a conflict resolution.
+
+The only difference is in how the conflict ID is calculated. For the
+inner conflict, the conflict markers themselves are not stripped out
+before calculating the sha1.
+
+Say we have the following conflict for example:
+
+ <<<<<<< HEAD
+ 1
+ =======
+ <<<<<<< HEAD
+ 3
+ =======
+ 2
+ >>>>>>> branch-2
+ >>>>>>> branch-3~
+
+After stripping out the labels of the conflict markers, and sorting
+the hunks, the conflict would look as follows:
+
+ <<<<<<<
+ 1
+ =======
+ <<<<<<<
+ 2
+ =======
+ 3
+ >>>>>>>
+ >>>>>>>
+
+and finally the conflict ID would be calculated as:
+`sha1('1<NUL><<<<<<<\n3\n=======\n2\n>>>>>>><NUL>')`
diff --git a/GIT-VERSION-GEN b/GIT-VERSION-GEN
index cad3b59..e9dc8f7 100755
--- a/GIT-VERSION-GEN
+++ b/GIT-VERSION-GEN
@@ -1,7 +1,7 @@
#!/bin/sh
GVF=GIT-VERSION-FILE
-DEF_VER=v2.19.0-rc1
+DEF_VER=v2.19.0
LF='
'
diff --git a/Makefile b/Makefile
index 5a969f5..b567ccc 100644
--- a/Makefile
+++ b/Makefile
@@ -722,7 +722,9 @@ TEST_BUILTINS_OBJS += test-mktemp.o
TEST_BUILTINS_OBJS += test-online-cpus.o
TEST_BUILTINS_OBJS += test-path-utils.o
TEST_BUILTINS_OBJS += test-prio-queue.o
+TEST_BUILTINS_OBJS += test-reach.o
TEST_BUILTINS_OBJS += test-read-cache.o
+TEST_BUILTINS_OBJS += test-read-midx.o
TEST_BUILTINS_OBJS += test-ref-store.o
TEST_BUILTINS_OBJS += test-regex.o
TEST_BUILTINS_OBJS += test-repository.o
@@ -835,6 +837,7 @@ LIB_OBJS += column.o
LIB_OBJS += combine-diff.o
LIB_OBJS += commit.o
LIB_OBJS += commit-graph.o
+LIB_OBJS += commit-reach.o
LIB_OBJS += compat/obstack.o
LIB_OBJS += compat/terminal.o
LIB_OBJS += config.o
@@ -847,6 +850,7 @@ LIB_OBJS += csum-file.o
LIB_OBJS += ctype.o
LIB_OBJS += date.o
LIB_OBJS += decorate.o
+LIB_OBJS += delta-islands.o
LIB_OBJS += diffcore-break.o
LIB_OBJS += diffcore-delta.o
LIB_OBJS += diffcore-order.o
@@ -880,6 +884,7 @@ LIB_OBJS += linear-assignment.o
LIB_OBJS += help.o
LIB_OBJS += hex.o
LIB_OBJS += ident.o
+LIB_OBJS += interdiff.o
LIB_OBJS += json-writer.o
LIB_OBJS += kwset.o
LIB_OBJS += levenshtein.o
@@ -900,6 +905,7 @@ LIB_OBJS += merge.o
LIB_OBJS += merge-blobs.o
LIB_OBJS += merge-recursive.o
LIB_OBJS += mergesort.o
+LIB_OBJS += midx.o
LIB_OBJS += name-hash.o
LIB_OBJS += negotiator/default.o
LIB_OBJS += negotiator/skipping.o
@@ -1060,6 +1066,7 @@ BUILTIN_OBJS += builtin/merge-recursive.o
BUILTIN_OBJS += builtin/merge-tree.o
BUILTIN_OBJS += builtin/mktag.o
BUILTIN_OBJS += builtin/mktree.o
+BUILTIN_OBJS += builtin/multi-pack-index.o
BUILTIN_OBJS += builtin/mv.o
BUILTIN_OBJS += builtin/name-rev.o
BUILTIN_OBJS += builtin/notes.o
diff --git a/bisect.c b/bisect.c
index 7c1d8f1..958e72c 100644
--- a/bisect.c
+++ b/bisect.c
@@ -13,6 +13,7 @@
#include "sha1-array.h"
#include "argv-array.h"
#include "commit-slab.h"
+#include "commit-reach.h"
static struct oid_array good_revs;
static struct oid_array skipped_revs;
diff --git a/builtin.h b/builtin.h
index 99206df..962f048 100644
--- a/builtin.h
+++ b/builtin.h
@@ -191,6 +191,7 @@ extern int cmd_merge_recursive(int argc, const char **argv, const char *prefix);
extern int cmd_merge_tree(int argc, const char **argv, const char *prefix);
extern int cmd_mktag(int argc, const char **argv, const char *prefix);
extern int cmd_mktree(int argc, const char **argv, const char *prefix);
+extern int cmd_multi_pack_index(int argc, const char **argv, const char *prefix);
extern int cmd_mv(int argc, const char **argv, const char *prefix);
extern int cmd_name_rev(int argc, const char **argv, const char *prefix);
extern int cmd_notes(int argc, const char **argv, const char *prefix);
diff --git a/builtin/am.c b/builtin/am.c
index e54110d..162a048 100644
--- a/builtin/am.c
+++ b/builtin/am.c
@@ -1598,6 +1598,7 @@ static int fall_back_threeway(const struct am_state *state, const char *index_pa
o.branch1 = "HEAD";
their_tree_name = xstrfmt("%.*s", linelen(state->msg), state->msg);
o.branch2 = their_tree_name;
+ o.detect_directory_renames = 0;
if (state->quiet)
o.verbosity = 0;
diff --git a/builtin/branch.c b/builtin/branch.c
index bbd006a..c396c41 100644
--- a/builtin/branch.c
+++ b/builtin/branch.c
@@ -23,6 +23,7 @@
#include "ref-filter.h"
#include "worktree.h"
#include "help.h"
+#include "commit-reach.h"
static const char * const builtin_branch_usage[] = {
N_("git branch [<options>] [-r | -a] [--merged | --no-merged]"),
@@ -37,7 +38,6 @@ static const char * const builtin_branch_usage[] = {
static const char *head;
static struct object_id head_oid;
-static int used_deprecated_reflog_option;
static int branch_use_color = -1;
static char branch_colors[][COLOR_MAXLEN] = {
@@ -578,14 +578,6 @@ static int edit_branch_description(const char *branch_name)
return 0;
}
-static int deprecated_reflog_option_cb(const struct option *opt,
- const char *arg, int unset)
-{
- used_deprecated_reflog_option = 1;
- *(int *)opt->value = !unset;
- return 0;
-}
-
int cmd_branch(int argc, const char **argv, const char *prefix)
{
int delete = 0, rename = 0, copy = 0, force = 0, list = 0;
@@ -627,14 +619,8 @@ int cmd_branch(int argc, const char **argv, const char *prefix)
OPT_BIT('M', NULL, &rename, N_("move/rename a branch, even if target exists"), 2),
OPT_BIT('c', "copy", &copy, N_("copy a branch and its reflog"), 1),
OPT_BIT('C', NULL, &copy, N_("copy a branch, even if target exists"), 2),
- OPT_BOOL(0, "list", &list, N_("list branch names")),
+ OPT_BOOL('l', "list", &list, N_("list branch names")),
OPT_BOOL(0, "create-reflog", &reflog, N_("create the branch's reflog")),
- {
- OPTION_CALLBACK, 'l', NULL, &reflog, NULL,
- N_("deprecated synonym for --create-reflog"),
- PARSE_OPT_NOARG | PARSE_OPT_HIDDEN,
- deprecated_reflog_option_cb
- },
OPT_BOOL(0, "edit-description", &edit_description,
N_("edit the description for the branch")),
OPT__FORCE(&force, N_("force creation, move/rename, deletion"), PARSE_OPT_NOCOMPLETE),
@@ -707,11 +693,6 @@ int cmd_branch(int argc, const char **argv, const char *prefix)
if (list)
setup_auto_pager("branch", 1);
- if (used_deprecated_reflog_option && !list) {
- warning("the '-l' alias for '--create-reflog' is deprecated;");
- warning("it will be removed in a future version of Git");
- }
-
if (delete) {
if (!argc)
die(_("branch name required"));
diff --git a/builtin/checkout.c b/builtin/checkout.c
index 082e3a9..b30b487 100644
--- a/builtin/checkout.c
+++ b/builtin/checkout.c
@@ -25,6 +25,8 @@
#include "submodule.h"
#include "advice.h"
+static int checkout_optimize_new_branch;
+
static const char * const checkout_usage[] = {
N_("git checkout [<options>] <branch>"),
N_("git checkout [<options>] [<branch>] -- <file>..."),
@@ -42,6 +44,10 @@ struct checkout_opts {
int ignore_skipworktree;
int ignore_other_worktrees;
int show_progress;
+ /*
+ * If new checkout options are added, skip_merge_working_tree
+ * should be updated accordingly.
+ */
const char *new_branch;
const char *new_branch_force;
@@ -472,6 +478,98 @@ static void setup_branch_path(struct branch_info *branch)
branch->path = strbuf_detach(&buf, NULL);
}
+/*
+ * Skip merging the trees, updating the index and working directory if and
+ * only if we are creating a new branch via "git checkout -b <new_branch>."
+ */
+static int skip_merge_working_tree(const struct checkout_opts *opts,
+ const struct branch_info *old_branch_info,
+ const struct branch_info *new_branch_info)
+{
+ /*
+ * Do the merge if sparse checkout is on and the user has not opted in
+ * to the optimized behavior
+ */
+ if (core_apply_sparse_checkout && !checkout_optimize_new_branch)
+ return 0;
+
+ /*
+ * We must do the merge if we are actually moving to a new commit.
+ */
+ if (!old_branch_info->commit || !new_branch_info->commit ||
+ oidcmp(&old_branch_info->commit->object.oid, &new_branch_info->commit->object.oid))
+ return 0;
+
+ /*
+ * opts->patch_mode cannot be used with switching branches so is
+ * not tested here
+ */
+
+ /*
+ * opts->quiet only impacts output so doesn't require a merge
+ */
+
+ /*
+ * Honor the explicit request for a three-way merge or to throw away
+ * local changes
+ */
+ if (opts->merge || opts->force)
+ return 0;
+
+ /*
+ * --detach is documented as "updating the index and the files in the
+ * working tree" but this optimization skips those steps so fall through
+ * to the regular code path.
+ */
+ if (opts->force_detach)
+ return 0;
+
+ /*
+ * opts->writeout_stage cannot be used with switching branches so is
+ * not tested here
+ */
+
+ /*
+ * Honor the explicit ignore requests
+ */
+ if (!opts->overwrite_ignore || opts->ignore_skipworktree ||
+ opts->ignore_other_worktrees)
+ return 0;
+
+ /*
+ * opts->show_progress only impacts output so doesn't require a merge
+ */
+
+ /*
+ * If we aren't creating a new branch any changes or updates will
+ * happen in the existing branch. Since that could only be updating
+ * the index and working directory, we don't want to skip those steps
+ * or we've defeated any purpose in running the command.
+ */
+ if (!opts->new_branch)
+ return 0;
+
+ /*
+ * new_branch_force is defined to "create/reset and checkout a branch"
+ * so needs to go through the merge to do the reset
+ */
+ if (opts->new_branch_force)
+ return 0;
+
+ /*
+ * A new orphaned branch requrires the index and the working tree to be
+ * adjusted to <start_point>
+ */
+ if (opts->new_orphan_branch)
+ return 0;
+
+ /*
+ * Remaining variables are not checkout options but used to track state
+ */
+
+ return 1;
+}
+
static int merge_working_tree(const struct checkout_opts *opts,
struct branch_info *old_branch_info,
struct branch_info *new_branch_info,
@@ -846,10 +944,19 @@ static int switch_branches(const struct checkout_opts *opts,
parse_commit_or_die(new_branch_info->commit);
}
- ret = merge_working_tree(opts, &old_branch_info, new_branch_info, &writeout_error);
- if (ret) {
- free(path_to_free);
- return ret;
+ /* optimize the "checkout -b <new_branch> path */
+ if (skip_merge_working_tree(opts, &old_branch_info, new_branch_info)) {
+ if (!checkout_optimize_new_branch && !opts->quiet) {
+ if (read_cache_preload(NULL) < 0)
+ return error(_("index file corrupt"));
+ show_local_changes(&new_branch_info->commit->object, &opts->diff_options);
+ }
+ } else {
+ ret = merge_working_tree(opts, &old_branch_info, new_branch_info, &writeout_error);
+ if (ret) {
+ free(path_to_free);
+ return ret;
+ }
}
if (!opts->quiet && !old_branch_info.path && old_branch_info.commit && new_branch_info->commit != old_branch_info.commit)
@@ -864,6 +971,11 @@ static int switch_branches(const struct checkout_opts *opts,
static int git_checkout_config(const char *var, const char *value, void *cb)
{
+ if (!strcmp(var, "checkout.optimizenewbranch")) {
+ checkout_optimize_new_branch = git_config_bool(var, value);
+ return 0;
+ }
+
if (!strcmp(var, "diff.ignoresubmodules")) {
struct checkout_opts *opts = cb;
handle_ignore_submodules_arg(&opts->diff_options, value);
diff --git a/builtin/clone.c b/builtin/clone.c
index fd2c3ef..15b142d 100644
--- a/builtin/clone.c
+++ b/builtin/clone.c
@@ -748,6 +748,7 @@ static int checkout(int submodule_progress)
memset(&opts, 0, sizeof opts);
opts.update = 1;
opts.merge = 1;
+ opts.clone = 1;
opts.fn = oneway_merge;
opts.verbose_update = (option_verbosity >= 0);
opts.src_index = &the_index;
diff --git a/builtin/commit.c b/builtin/commit.c
index 0d9828e..fa3e532 100644
--- a/builtin/commit.c
+++ b/builtin/commit.c
@@ -33,6 +33,7 @@
#include "sequencer.h"
#include "mailmap.h"
#include "help.h"
+#include "commit-reach.h"
static const char * const builtin_commit_usage[] = {
N_("git commit [<options>] [--] <pathspec>..."),
diff --git a/builtin/count-objects.c b/builtin/count-objects.c
index d51e2ce..a7cad05 100644
--- a/builtin/count-objects.c
+++ b/builtin/count-objects.c
@@ -123,7 +123,7 @@ int cmd_count_objects(int argc, const char **argv, const char *prefix)
struct strbuf pack_buf = STRBUF_INIT;
struct strbuf garbage_buf = STRBUF_INIT;
- for (p = get_packed_git(the_repository); p; p = p->next) {
+ for (p = get_all_packs(the_repository); p; p = p->next) {
if (!p->pack_local)
continue;
if (open_pack_index(p))
diff --git a/builtin/fetch.c b/builtin/fetch.c
index 84e0e80..dc0931f 100644
--- a/builtin/fetch.c
+++ b/builtin/fetch.c
@@ -22,6 +22,7 @@
#include "utf8.h"
#include "packfile.h"
#include "list-objects-filter-options.h"
+#include "commit-reach.h"
static const char * const builtin_fetch_usage[] = {
N_("git fetch [<options>] [<repository> [<refspec>...]]"),
diff --git a/builtin/fmt-merge-msg.c b/builtin/fmt-merge-msg.c
index 268f0c2..59a4034 100644
--- a/builtin/fmt-merge-msg.c
+++ b/builtin/fmt-merge-msg.c
@@ -12,6 +12,7 @@
#include "fmt-merge-msg.h"
#include "gpg-interface.h"
#include "repository.h"
+#include "commit-reach.h"
static const char * const fmt_merge_msg_usage[] = {
N_("git fmt-merge-msg [-m <message>] [--log[=<n>] | --no-log] [--file <file>]"),
diff --git a/builtin/fsck.c b/builtin/fsck.c
index 250f5af..63c8578 100644
--- a/builtin/fsck.c
+++ b/builtin/fsck.c
@@ -740,7 +740,7 @@ int cmd_fsck(int argc, const char **argv, const char *prefix)
struct progress *progress = NULL;
if (show_progress) {
- for (p = get_packed_git(the_repository); p;
+ for (p = get_all_packs(the_repository); p;
p = p->next) {
if (open_pack_index(p))
continue;
@@ -749,7 +749,7 @@ int cmd_fsck(int argc, const char **argv, const char *prefix)
progress = start_progress(_("Checking objects"), total);
}
- for (p = get_packed_git(the_repository); p;
+ for (p = get_all_packs(the_repository); p;
p = p->next) {
/* verify gives error messages itself */
if (verify_pack(p, fsck_obj_buffer,
diff --git a/builtin/gc.c b/builtin/gc.c
index 5706944..2b59226 100644
--- a/builtin/gc.c
+++ b/builtin/gc.c
@@ -183,7 +183,7 @@ static struct packed_git *find_base_packs(struct string_list *packs,
{
struct packed_git *p, *base = NULL;
- for (p = get_packed_git(the_repository); p; p = p->next) {
+ for (p = get_all_packs(the_repository); p; p = p->next) {
if (!p->pack_local)
continue;
if (limit) {
@@ -208,7 +208,7 @@ static int too_many_packs(void)
if (gc_auto_pack_limit <= 0)
return 0;
- for (cnt = 0, p = get_packed_git(the_repository); p; p = p->next) {
+ for (cnt = 0, p = get_all_packs(the_repository); p; p = p->next) {
if (!p->pack_local)
continue;
if (p->pack_keep)
diff --git a/builtin/interpret-trailers.c b/builtin/interpret-trailers.c
index b742539..4b87e0d 100644
--- a/builtin/interpret-trailers.c
+++ b/builtin/interpret-trailers.c
@@ -104,6 +104,7 @@ int cmd_interpret_trailers(int argc, const char **argv, const char *prefix)
OPT_BOOL(0, "unfold", &opts.unfold, N_("join whitespace-continued values")),
{ OPTION_CALLBACK, 0, "parse", &opts, NULL, N_("set parsing options"),
PARSE_OPT_NOARG | PARSE_OPT_NONEG, parse_opt_parse },
+ OPT_BOOL(0, "no-divider", &opts.no_divider, N_("do not treat --- specially")),
OPT_CALLBACK(0, "trailer", &trailers, N_("trailer"),
N_("trailer(s) to add"), option_parse_trailer),
OPT_END()
diff --git a/builtin/log.c b/builtin/log.c
index 98d668b..1dbb9d8 100644
--- a/builtin/log.c
+++ b/builtin/log.c
@@ -31,6 +31,9 @@
#include "progress.h"
#include "commit-slab.h"
#include "repository.h"
+#include "commit-reach.h"
+#include "interdiff.h"
+#include "range-diff.h"
#define MAIL_DEFAULT_WRAP 72
@@ -998,6 +1001,26 @@ static char *find_branch_name(struct rev_info *rev)
return branch;
}
+static void show_diffstat(struct rev_info *rev,
+ struct commit *origin, struct commit *head)
+{
+ struct diff_options opts;
+
+ memcpy(&opts, &rev->diffopt, sizeof(opts));
+ opts.output_format = DIFF_FORMAT_SUMMARY | DIFF_FORMAT_DIFFSTAT;
+ opts.stat_width = MAIL_DEFAULT_WRAP;
+
+ diff_setup_done(&opts);
+
+ diff_tree_oid(get_commit_tree_oid(origin),
+ get_commit_tree_oid(head),
+ "", &opts);
+ diffcore_std(&opts);
+ diff_flush(&opts);
+
+ fprintf(rev->diffopt.file, "\n");
+}
+
static void make_cover_letter(struct rev_info *rev, int use_stdout,
struct commit *origin,
int nr, struct commit **list,
@@ -1011,7 +1034,6 @@ static void make_cover_letter(struct rev_info *rev, int use_stdout,
struct strbuf sb = STRBUF_INIT;
int i;
const char *encoding = "UTF-8";
- struct diff_options opts;
int need_8bit_cte = 0;
struct pretty_print_context pp = {0};
struct commit *head = list[0];
@@ -1061,25 +1083,20 @@ static void make_cover_letter(struct rev_info *rev, int use_stdout,
shortlog_output(&log);
- /*
- * We can only do diffstat with a unique reference point
- */
- if (!origin)
- return;
-
- memcpy(&opts, &rev->diffopt, sizeof(opts));
- opts.output_format = DIFF_FORMAT_SUMMARY | DIFF_FORMAT_DIFFSTAT;
- opts.stat_width = MAIL_DEFAULT_WRAP;
+ /* We can only do diffstat with a unique reference point */
+ if (origin)
+ show_diffstat(rev, origin, head);
- diff_setup_done(&opts);
-
- diff_tree_oid(get_commit_tree_oid(origin),
- get_commit_tree_oid(head),
- "", &opts);
- diffcore_std(&opts);
- diff_flush(&opts);
+ if (rev->idiff_oid1) {
+ fprintf_ln(rev->diffopt.file, "%s", rev->idiff_title);
+ show_interdiff(rev, 0);
+ }
- fprintf(rev->diffopt.file, "\n");
+ if (rev->rdiff1) {
+ fprintf_ln(rev->diffopt.file, "%s", rev->rdiff_title);
+ show_range_diff(rev->rdiff1, rev->rdiff2,
+ rev->creation_factor, 1, &rev->diffopt);
+ }
}
static const char *clean_message_id(const char *msg_id)
@@ -1419,6 +1436,36 @@ static void print_bases(struct base_tree_info *bases, FILE *file)
oidclr(&bases->base_commit);
}
+static const char *diff_title(struct strbuf *sb, int reroll_count,
+ const char *generic, const char *rerolled)
+{
+ if (reroll_count <= 0)
+ strbuf_addstr(sb, generic);
+ else /* RFC may be v0, so allow -v1 to diff against v0 */
+ strbuf_addf(sb, rerolled, reroll_count - 1);
+ return sb->buf;
+}
+
+static void infer_range_diff_ranges(struct strbuf *r1,
+ struct strbuf *r2,
+ const char *prev,
+ struct commit *origin,
+ struct commit *head)
+{
+ const char *head_oid = oid_to_hex(&head->object.oid);
+
+ if (!strstr(prev, "..")) {
+ strbuf_addf(r1, "%s..%s", head_oid, prev);
+ strbuf_addf(r2, "%s..%s", prev, head_oid);
+ } else if (!origin) {
+ die(_("failed to infer range-diff ranges"));
+ } else {
+ strbuf_addstr(r1, prev);
+ strbuf_addf(r2, "%s..%s",
+ oid_to_hex(&origin->object.oid), head_oid);
+ }
+}
+
int cmd_format_patch(int argc, const char **argv, const char *prefix)
{
struct commit *commit;
@@ -1446,6 +1493,13 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
struct base_tree_info bases;
int show_progress = 0;
struct progress *progress = NULL;
+ struct oid_array idiff_prev = OID_ARRAY_INIT;
+ struct strbuf idiff_title = STRBUF_INIT;
+ const char *rdiff_prev = NULL;
+ struct strbuf rdiff1 = STRBUF_INIT;
+ struct strbuf rdiff2 = STRBUF_INIT;
+ struct strbuf rdiff_title = STRBUF_INIT;
+ int creation_factor = -1;
const struct option builtin_format_patch_options[] = {
{ OPTION_CALLBACK, 'n', "numbered", &numbered, NULL,
@@ -1519,6 +1573,13 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
OPT__QUIET(&quiet, N_("don't print the patch filenames")),
OPT_BOOL(0, "progress", &show_progress,
N_("show progress while generating patches")),
+ OPT_CALLBACK(0, "interdiff", &idiff_prev, N_("rev"),
+ N_("show changes against <rev> in cover letter or single patch"),
+ parse_opt_object_name),
+ OPT_STRING(0, "range-diff", &rdiff_prev, N_("refspec"),
+ N_("show changes against <refspec> in cover letter or single patch")),
+ OPT_INTEGER(0, "creation-factor", &creation_factor,
+ N_("percentage by which creation is weighted")),
OPT_END()
};
@@ -1704,7 +1765,7 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
if (rev.pending.nr == 2) {
struct object_array_entry *o = rev.pending.objects;
if (oideq(&o[0].item->oid, &o[1].item->oid))
- return 0;
+ goto done;
}
get_patch_ids(&rev, &ids);
}
@@ -1728,7 +1789,7 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
}
if (nr == 0)
/* nothing to do */
- return 0;
+ goto done;
total = nr;
if (cover_letter == -1) {
if (config_cover_letter == COVER_AUTO)
@@ -1741,6 +1802,35 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
if (numbered)
rev.total = total + start_number - 1;
+ if (idiff_prev.nr) {
+ if (!cover_letter && total != 1)
+ die(_("--interdiff requires --cover-letter or single patch"));
+ rev.idiff_oid1 = &idiff_prev.oid[idiff_prev.nr - 1];
+ rev.idiff_oid2 = get_commit_tree_oid(list[0]);
+ rev.idiff_title = diff_title(&idiff_title, reroll_count,
+ _("Interdiff:"),
+ _("Interdiff against v%d:"));
+ }
+
+ if (creation_factor < 0)
+ creation_factor = RANGE_DIFF_CREATION_FACTOR_DEFAULT;
+ else if (!rdiff_prev)
+ die(_("--creation-factor requires --range-diff"));
+
+ if (rdiff_prev) {
+ if (!cover_letter && total != 1)
+ die(_("--range-diff requires --cover-letter or single patch"));
+
+ infer_range_diff_ranges(&rdiff1, &rdiff2, rdiff_prev,
+ origin, list[0]);
+ rev.rdiff1 = rdiff1.buf;
+ rev.rdiff2 = rdiff2.buf;
+ rev.creation_factor = creation_factor;
+ rev.rdiff_title = diff_title(&rdiff_title, reroll_count,
+ _("Range-diff:"),
+ _("Range-diff against v%d:"));
+ }
+
if (!signature) {
; /* --no-signature inhibits all signatures */
} else if (signature && signature != git_version_string) {
@@ -1778,6 +1868,9 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
print_signature(rev.diffopt.file);
total++;
start_number--;
+ /* interdiff/range-diff in cover-letter; omit from patches */
+ rev.idiff_oid1 = NULL;
+ rev.rdiff1 = NULL;
}
rev.add_signoff = do_signoff;
@@ -1858,6 +1951,13 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
string_list_clear(&extra_hdr, 0);
if (ignore_if_in_upstream)
free_patch_ids(&ids);
+
+done:
+ oid_array_clear(&idiff_prev);
+ strbuf_release(&idiff_title);
+ strbuf_release(&rdiff1);
+ strbuf_release(&rdiff2);
+ strbuf_release(&rdiff_title);
return 0;
}
diff --git a/builtin/merge-base.c b/builtin/merge-base.c
index 08d91b1..1c92099 100644
--- a/builtin/merge-base.c
+++ b/builtin/merge-base.c
@@ -7,6 +7,7 @@
#include "revision.h"
#include "parse-options.h"
#include "repository.h"
+#include "commit-reach.h"
static int show_merge_base(struct commit **rev, int rev_nr, int show_all)
{
diff --git a/builtin/merge.c b/builtin/merge.c
index 8d85d31..e331ca6 100644
--- a/builtin/merge.c
+++ b/builtin/merge.c
@@ -36,6 +36,7 @@
#include "packfile.h"
#include "tag.h"
#include "alias.h"
+#include "commit-reach.h"
#define DEFAULT_TWOHEAD (1<<0)
#define DEFAULT_OCTOPUS (1<<1)
diff --git a/builtin/multi-pack-index.c b/builtin/multi-pack-index.c
new file mode 100644
index 0000000..2633efd
--- /dev/null
+++ b/builtin/multi-pack-index.c
@@ -0,0 +1,47 @@
+#include "builtin.h"
+#include "cache.h"
+#include "config.h"
+#include "parse-options.h"
+#include "midx.h"
+
+static char const * const builtin_multi_pack_index_usage[] = {
+ N_("git multi-pack-index [--object-dir=<dir>] write"),
+ NULL
+};
+
+static struct opts_multi_pack_index {
+ const char *object_dir;
+} opts;
+
+int cmd_multi_pack_index(int argc, const char **argv,
+ const char *prefix)
+{
+ static struct option builtin_multi_pack_index_options[] = {
+ OPT_FILENAME(0, "object-dir", &opts.object_dir,
+ N_("object directory containing set of packfile and pack-index pairs")),
+ OPT_END(),
+ };
+
+ git_config(git_default_config, NULL);
+
+ argc = parse_options(argc, argv, prefix,
+ builtin_multi_pack_index_options,
+ builtin_multi_pack_index_usage, 0);
+
+ if (!opts.object_dir)
+ opts.object_dir = get_object_directory();
+
+ if (argc == 0)
+ usage_with_options(builtin_multi_pack_index_usage,
+ builtin_multi_pack_index_options);
+
+ if (argc > 1) {
+ die(_("too many arguments"));
+ return 1;
+ }
+
+ if (!strcmp(argv[0], "write"))
+ return write_midx_file(opts.object_dir);
+
+ die(_("unrecognized verb: %s"), argv[0]);
+}
diff --git a/builtin/pack-objects.c b/builtin/pack-objects.c
index 64156f6..5041818 100644
--- a/builtin/pack-objects.c
+++ b/builtin/pack-objects.c
@@ -24,6 +24,7 @@
#include "streaming.h"
#include "thread-utils.h"
#include "pack-bitmap.h"
+#include "delta-islands.h"
#include "reachable.h"
#include "sha1-array.h"
#include "argv-array.h"
@@ -31,6 +32,7 @@
#include "packfile.h"
#include "object-store.h"
#include "dir.h"
+#include "midx.h"
#define IN_PACK(obj) oe_in_pack(&to_pack, obj)
#define SIZE(obj) oe_size(&to_pack, obj)
@@ -40,6 +42,7 @@
#define DELTA_CHILD(obj) oe_delta_child(&to_pack, obj)
#define DELTA_SIBLING(obj) oe_delta_sibling(&to_pack, obj)
#define SET_DELTA(obj, val) oe_set_delta(&to_pack, obj, val)
+#define SET_DELTA_EXT(obj, oid) oe_set_delta_ext(&to_pack, obj, oid)
#define SET_DELTA_SIZE(obj, val) oe_set_delta_size(&to_pack, obj, val)
#define SET_DELTA_CHILD(obj, val) oe_set_delta_child(&to_pack, obj, val)
#define SET_DELTA_SIBLING(obj, val) oe_set_delta_sibling(&to_pack, obj, val)
@@ -59,6 +62,8 @@ static struct packing_data to_pack;
static struct pack_idx_entry **written_list;
static uint32_t nr_result, nr_written, nr_seen;
+static struct bitmap_index *bitmap_git;
+static uint32_t write_layer;
static int non_empty;
static int reuse_delta = 1, reuse_object = 1;
@@ -79,6 +84,7 @@ static unsigned long pack_size_limit;
static int depth = 50;
static int delta_search_threads;
static int pack_to_stdout;
+static int thin;
static int num_preferred_base;
static struct progress *progress_state;
@@ -93,6 +99,8 @@ static uint16_t write_bitmap_options;
static int exclude_promisor_objects;
+static int use_delta_islands;
+
static unsigned long delta_cache_size = 0;
static unsigned long max_delta_cache_size = DEFAULT_DELTA_CACHE_SIZE;
static unsigned long cache_max_small_delta_size = 1000;
@@ -612,7 +620,7 @@ static inline void add_to_write_order(struct object_entry **wo,
unsigned int *endp,
struct object_entry *e)
{
- if (e->filled)
+ if (e->filled || oe_layer(&to_pack, e) != write_layer)
return;
wo[(*endp)++] = e;
e->filled = 1;
@@ -672,48 +680,15 @@ static void add_family_to_write_order(struct object_entry **wo,
add_descendants_to_write_order(wo, endp, root);
}
-static struct object_entry **compute_write_order(void)
+static void compute_layer_order(struct object_entry **wo, unsigned int *wo_end)
{
- unsigned int i, wo_end, last_untagged;
-
- struct object_entry **wo;
+ unsigned int i, last_untagged;
struct object_entry *objects = to_pack.objects;
for (i = 0; i < to_pack.nr_objects; i++) {
- objects[i].tagged = 0;
- objects[i].filled = 0;
- SET_DELTA_CHILD(&objects[i], NULL);
- SET_DELTA_SIBLING(&objects[i], NULL);
- }
-
- /*
- * Fully connect delta_child/delta_sibling network.
- * Make sure delta_sibling is sorted in the original
- * recency order.
- */
- for (i = to_pack.nr_objects; i > 0;) {
- struct object_entry *e = &objects[--i];
- if (!DELTA(e))
- continue;
- /* Mark me as the first child */
- e->delta_sibling_idx = DELTA(e)->delta_child_idx;
- SET_DELTA_CHILD(DELTA(e), e);
- }
-
- /*
- * Mark objects that are at the tip of tags.
- */
- for_each_tag_ref(mark_tagged, NULL);
-
- /*
- * Give the objects in the original recency order until
- * we see a tagged tip.
- */
- ALLOC_ARRAY(wo, to_pack.nr_objects);
- for (i = wo_end = 0; i < to_pack.nr_objects; i++) {
if (objects[i].tagged)
break;
- add_to_write_order(wo, &wo_end, &objects[i]);
+ add_to_write_order(wo, wo_end, &objects[i]);
}
last_untagged = i;
@@ -722,7 +697,7 @@ static struct object_entry **compute_write_order(void)
*/
for (; i < to_pack.nr_objects; i++) {
if (objects[i].tagged)
- add_to_write_order(wo, &wo_end, &objects[i]);
+ add_to_write_order(wo, wo_end, &objects[i]);
}
/*
@@ -732,7 +707,7 @@ static struct object_entry **compute_write_order(void)
if (oe_type(&objects[i]) != OBJ_COMMIT &&
oe_type(&objects[i]) != OBJ_TAG)
continue;
- add_to_write_order(wo, &wo_end, &objects[i]);
+ add_to_write_order(wo, wo_end, &objects[i]);
}
/*
@@ -741,17 +716,61 @@ static struct object_entry **compute_write_order(void)
for (i = last_untagged; i < to_pack.nr_objects; i++) {
if (oe_type(&objects[i]) != OBJ_TREE)
continue;
- add_to_write_order(wo, &wo_end, &objects[i]);
+ add_to_write_order(wo, wo_end, &objects[i]);
}
/*
* Finally all the rest in really tight order
*/
for (i = last_untagged; i < to_pack.nr_objects; i++) {
- if (!objects[i].filled)
- add_family_to_write_order(wo, &wo_end, &objects[i]);
+ if (!objects[i].filled && oe_layer(&to_pack, &objects[i]) == write_layer)
+ add_family_to_write_order(wo, wo_end, &objects[i]);
+ }
+}
+
+static struct object_entry **compute_write_order(void)
+{
+ uint32_t max_layers = 1;
+ unsigned int i, wo_end;
+
+ struct object_entry **wo;
+ struct object_entry *objects = to_pack.objects;
+
+ for (i = 0; i < to_pack.nr_objects; i++) {
+ objects[i].tagged = 0;
+ objects[i].filled = 0;
+ SET_DELTA_CHILD(&objects[i], NULL);
+ SET_DELTA_SIBLING(&objects[i], NULL);
}
+ /*
+ * Fully connect delta_child/delta_sibling network.
+ * Make sure delta_sibling is sorted in the original
+ * recency order.
+ */
+ for (i = to_pack.nr_objects; i > 0;) {
+ struct object_entry *e = &objects[--i];
+ if (!DELTA(e))
+ continue;
+ /* Mark me as the first child */
+ e->delta_sibling_idx = DELTA(e)->delta_child_idx;
+ SET_DELTA_CHILD(DELTA(e), e);
+ }
+
+ /*
+ * Mark objects that are at the tip of tags.
+ */
+ for_each_tag_ref(mark_tagged, NULL);
+
+ if (use_delta_islands)
+ max_layers = compute_pack_layers(&to_pack);
+
+ ALLOC_ARRAY(wo, to_pack.nr_objects);
+ wo_end = 0;
+
+ for (; write_layer < max_layers; ++write_layer)
+ compute_layer_order(wo, &wo_end);
+
if (wo_end != to_pack.nr_objects)
die(_("ordered %u objects, expected %"PRIu32),
wo_end, to_pack.nr_objects);
@@ -1040,6 +1059,7 @@ static int want_object_in_pack(const struct object_id *oid,
{
int want;
struct list_head *pos;
+ struct multi_pack_index *m;
if (!exclude && local && has_loose_object_nonlocal(oid))
return 0;
@@ -1054,6 +1074,32 @@ static int want_object_in_pack(const struct object_id *oid,
if (want != -1)
return want;
}
+
+ for (m = get_multi_pack_index(the_repository); m; m = m->next) {
+ struct pack_entry e;
+ if (fill_midx_entry(oid, &e, m)) {
+ struct packed_git *p = e.p;
+ off_t offset;
+
+ if (p == *found_pack)
+ offset = *found_offset;
+ else
+ offset = find_pack_entry_one(oid->hash, p);
+
+ if (offset) {
+ if (!*found_pack) {
+ if (!is_pack_valid(p))
+ continue;
+ *found_offset = offset;
+ *found_pack = p;
+ }
+ want = want_found_object(exclude, p);
+ if (want != -1)
+ return want;
+ }
+ }
+ }
+
list_for_each(pos, get_packed_git_mru(the_repository)) {
struct packed_git *p = list_entry(pos, struct packed_git, mru);
off_t offset;
@@ -1510,11 +1556,16 @@ static void check_object(struct object_entry *entry)
break;
}
- if (base_ref && (base_entry = packlist_find(&to_pack, base_ref, NULL))) {
+ if (base_ref && (
+ (base_entry = packlist_find(&to_pack, base_ref, NULL)) ||
+ (thin &&
+ bitmap_has_sha1_in_uninteresting(bitmap_git, base_ref))) &&
+ in_same_island(&entry->idx.oid, &base_entry->idx.oid)) {
/*
* If base_ref was set above that means we wish to
- * reuse delta data, and we even found that base
- * in the list of objects we want to pack. Goodie!
+ * reuse delta data, and either we found that object in
+ * the list of objects we want to pack, or it's one we
+ * know the receiver has.
*
* Depth value does not matter - find_deltas() will
* never consider reused delta as the base object to
@@ -1523,10 +1574,16 @@ static void check_object(struct object_entry *entry)
*/
oe_set_type(entry, entry->in_pack_type);
SET_SIZE(entry, in_pack_size); /* delta size */
- SET_DELTA(entry, base_entry);
SET_DELTA_SIZE(entry, in_pack_size);
- entry->delta_sibling_idx = base_entry->delta_child_idx;
- SET_DELTA_CHILD(base_entry, entry);
+
+ if (base_entry) {
+ SET_DELTA(entry, base_entry);
+ entry->delta_sibling_idx = base_entry->delta_child_idx;
+ SET_DELTA_CHILD(base_entry, entry);
+ } else {
+ SET_DELTA_EXT(entry, base_ref);
+ }
+
unuse_pack(&w_curs);
return;
}
@@ -1826,6 +1883,11 @@ static int type_size_sort(const void *_a, const void *_b)
return -1;
if (a->preferred_base < b->preferred_base)
return 1;
+ if (use_delta_islands) {
+ int island_cmp = island_delta_cmp(&a->idx.oid, &b->idx.oid);
+ if (island_cmp)
+ return island_cmp;
+ }
if (a_size > b_size)
return -1;
if (a_size < b_size)
@@ -1986,6 +2048,9 @@ static int try_delta(struct unpacked *trg, struct unpacked *src,
if (trg_size < src_size / 32)
return 0;
+ if (!in_same_island(&trg->entry->idx.oid, &src->entry->idx.oid))
+ return 0;
+
/* Load data if not already done */
if (!trg->data) {
read_lock();
@@ -2528,6 +2593,9 @@ static void prepare_pack(int window, int depth)
uint32_t i, nr_deltas;
unsigned n;
+ if (use_delta_islands)
+ resolve_tree_islands(progress, &to_pack);
+
get_object_details();
/*
@@ -2691,6 +2759,9 @@ static void show_commit(struct commit *commit, void *data)
if (write_bitmap_index)
index_commit_for_bitmap(commit);
+
+ if (use_delta_islands)
+ propagate_island_marks(commit);
}
static void show_object(struct object *obj, const char *name, void *data)
@@ -2698,6 +2769,19 @@ static void show_object(struct object *obj, const char *name, void *data)
add_preferred_base_object(name);
add_object_entry(&obj->oid, obj->type, name, 0);
obj->flags |= OBJECT_ADDED;
+
+ if (use_delta_islands) {
+ const char *p;
+ unsigned depth = 0;
+ struct object_entry *ent;
+
+ for (p = strchr(name, '/'); p; p = strchr(p + 1, '/'))
+ depth++;
+
+ ent = packlist_find(&to_pack, obj->oid.hash, NULL);
+ if (ent && depth > oe_tree_depth(&to_pack, ent))
+ oe_set_tree_depth(&to_pack, ent, depth);
+ }
}
static void show_object__ma_allow_any(struct object *obj, const char *name, void *data)
@@ -2806,7 +2890,7 @@ static void add_objects_in_unpacked_packs(struct rev_info *revs)
memset(&in_pack, 0, sizeof(in_pack));
- for (p = get_packed_git(the_repository); p; p = p->next) {
+ for (p = get_all_packs(the_repository); p; p = p->next) {
struct object_id oid;
struct object *o;
@@ -2870,7 +2954,7 @@ static int has_sha1_pack_kept_or_nonlocal(const struct object_id *oid)
struct packed_git *p;
p = (last_found != (void *)1) ? last_found :
- get_packed_git(the_repository);
+ get_all_packs(the_repository);
while (p) {
if ((!p->pack_local || p->pack_keep ||
@@ -2880,7 +2964,7 @@ static int has_sha1_pack_kept_or_nonlocal(const struct object_id *oid)
return 1;
}
if (p == last_found)
- p = get_packed_git(the_repository);
+ p = get_all_packs(the_repository);
else
p = p->next;
if (p == last_found)
@@ -2916,7 +3000,7 @@ static void loosen_unused_packed_objects(struct rev_info *revs)
uint32_t i;
struct object_id oid;
- for (p = get_packed_git(the_repository); p; p = p->next) {
+ for (p = get_all_packs(the_repository); p; p = p->next) {
if (!p->pack_local || p->pack_keep || p->pack_keep_in_core)
continue;
@@ -2951,7 +3035,6 @@ static int pack_options_allow_reuse(void)
static int get_object_list_from_bitmap(struct rev_info *revs)
{
- struct bitmap_index *bitmap_git;
if (!(bitmap_git = prepare_bitmap_walk(revs)))
return -1;
@@ -2967,7 +3050,6 @@ static int get_object_list_from_bitmap(struct rev_info *revs)
}
traverse_bitmap_commit_list(bitmap_git, &add_object_entry_from_bitmap);
- free_bitmap_index(bitmap_git);
return 0;
}
@@ -3025,6 +3107,9 @@ static void get_object_list(int ac, const char **av)
if (use_bitmap_index && !get_object_list_from_bitmap(&revs))
return;
+ if (use_delta_islands)
+ load_delta_islands();
+
if (prepare_revision_walk(&revs))
die(_("revision walk setup failed"));
mark_edges_uninteresting(&revs, show_edge);
@@ -3063,7 +3148,7 @@ static void add_extra_kept_packs(const struct string_list *names)
if (!names->nr)
return;
- for (p = get_packed_git(the_repository); p; p = p->next) {
+ for (p = get_all_packs(the_repository); p; p = p->next) {
const char *name = basename(p->pack_name);
int i;
@@ -3115,7 +3200,6 @@ static int option_parse_unpack_unreachable(const struct option *opt,
int cmd_pack_objects(int argc, const char **argv, const char *prefix)
{
int use_internal_rev_list = 0;
- int thin = 0;
int shallow = 0;
int all_progress_implied = 0;
struct argv_array rp = ARGV_ARRAY_INIT;
@@ -3204,6 +3288,8 @@ int cmd_pack_objects(int argc, const char **argv, const char *prefix)
option_parse_missing_action },
OPT_BOOL(0, "exclude-promisor-objects", &exclude_promisor_objects,
N_("do not pack objects in promisor packfiles")),
+ OPT_BOOL(0, "delta-islands", &use_delta_islands,
+ N_("respect islands during delta compression")),
OPT_END(),
};
@@ -3330,13 +3416,16 @@ int cmd_pack_objects(int argc, const char **argv, const char *prefix)
if (pack_to_stdout || !rev_list_all)
write_bitmap_index = 0;
+ if (use_delta_islands)
+ argv_array_push(&rp, "--topo-order");
+
if (progress && all_progress_implied)
progress = 2;
add_extra_kept_packs(&keep_pack_list);
if (ignore_packed_keep_on_disk) {
struct packed_git *p;
- for (p = get_packed_git(the_repository); p; p = p->next)
+ for (p = get_all_packs(the_repository); p; p = p->next)
if (p->pack_local && p->pack_keep)
break;
if (!p) /* no keep-able packs found */
@@ -3349,7 +3438,7 @@ int cmd_pack_objects(int argc, const char **argv, const char *prefix)
* it also covers non-local objects
*/
struct packed_git *p;
- for (p = get_packed_git(the_repository); p; p = p->next) {
+ for (p = get_all_packs(the_repository); p; p = p->next) {
if (!p->pack_local) {
have_non_local_packs = 1;
break;
diff --git a/builtin/pack-redundant.c b/builtin/pack-redundant.c
index 0494dce..cf9a9aa 100644
--- a/builtin/pack-redundant.c
+++ b/builtin/pack-redundant.c
@@ -577,7 +577,7 @@ static struct pack_list * add_pack(struct packed_git *p)
static struct pack_list * add_pack_file(const char *filename)
{
- struct packed_git *p = get_packed_git(the_repository);
+ struct packed_git *p = get_all_packs(the_repository);
if (strlen(filename) < 40)
die("Bad pack filename: %s", filename);
@@ -592,7 +592,7 @@ static struct pack_list * add_pack_file(const char *filename)
static void load_all(void)
{
- struct packed_git *p = get_packed_git(the_repository);
+ struct packed_git *p = get_all_packs(the_repository);
while (p) {
add_pack(p);
diff --git a/builtin/pull.c b/builtin/pull.c
index 09b0269..b2055d1 100644
--- a/builtin/pull.c
+++ b/builtin/pull.c
@@ -22,6 +22,7 @@
#include "tempfile.h"
#include "lockfile.h"
#include "wt-status.h"
+#include "commit-reach.h"
enum rebase_type {
REBASE_INVALID = -1,
diff --git a/builtin/range-diff.c b/builtin/range-diff.c
index 0aa9bed..96af537 100644
--- a/builtin/range-diff.c
+++ b/builtin/range-diff.c
@@ -11,14 +11,9 @@ N_("git range-diff [<options>] <base> <old-tip> <new-tip>"),
NULL
};
-static struct strbuf *output_prefix_cb(struct diff_options *opt, void *data)
-{
- return data;
-}
-
int cmd_range_diff(int argc, const char **argv, const char *prefix)
{
- int creation_factor = 60;
+ int creation_factor = RANGE_DIFF_CREATION_FACTOR_DEFAULT;
struct diff_options diffopt = { NULL };
int simple_color = -1;
struct option options[] = {
@@ -29,17 +24,11 @@ int cmd_range_diff(int argc, const char **argv, const char *prefix)
OPT_END()
};
int i, j, res = 0;
- struct strbuf four_spaces = STRBUF_INIT;
struct strbuf range1 = STRBUF_INIT, range2 = STRBUF_INIT;
git_config(git_diff_ui_config, NULL);
diff_setup(&diffopt);
- diffopt.output_format = DIFF_FORMAT_PATCH;
- diffopt.flags.suppress_diff_headers = 1;
- diffopt.output_prefix = output_prefix_cb;
- strbuf_addstr(&four_spaces, " ");
- diffopt.output_prefix_data = &four_spaces;
argc = parse_options(argc, argv, NULL, options,
builtin_range_diff_usage, PARSE_OPT_KEEP_UNKNOWN |
@@ -63,12 +52,9 @@ int cmd_range_diff(int argc, const char **argv, const char *prefix)
options + ARRAY_SIZE(options) - 1, /* OPT_END */
builtin_range_diff_usage, 0);
- if (simple_color < 1) {
- if (!simple_color)
- /* force color when --dual-color was used */
- diffopt.use_color = 1;
- diffopt.flags.dual_color_diffed_diffs = 1;
- }
+ /* force color when --dual-color was used */
+ if (!simple_color)
+ diffopt.use_color = 1;
if (argc == 2) {
if (!strstr(argv[0], ".."))
@@ -106,11 +92,10 @@ int cmd_range_diff(int argc, const char **argv, const char *prefix)
}
res = show_range_diff(range1.buf, range2.buf, creation_factor,
- &diffopt);
+ simple_color < 1, &diffopt);
strbuf_release(&range1);
strbuf_release(&range2);
- strbuf_release(&four_spaces);
return res;
}
diff --git a/builtin/receive-pack.c b/builtin/receive-pack.c
index 5bb163d..a3bb13a 100644
--- a/builtin/receive-pack.c
+++ b/builtin/receive-pack.c
@@ -27,6 +27,7 @@
#include "packfile.h"
#include "object-store.h"
#include "protocol.h"
+#include "commit-reach.h"
static const char * const receive_pack_usage[] = {
N_("git receive-pack <git-dir>"),
diff --git a/builtin/remote.c b/builtin/remote.c
index c171323..40c6f8a 100644
--- a/builtin/remote.c
+++ b/builtin/remote.c
@@ -10,6 +10,7 @@
#include "refspec.h"
#include "object-store.h"
#include "argv-array.h"
+#include "commit-reach.h"
static const char * const builtin_remote_usage[] = {
N_("git remote [-v | --verbose]"),
diff --git a/builtin/repack.c b/builtin/repack.c
index d588603..c6a7943 100644
--- a/builtin/repack.c
+++ b/builtin/repack.c
@@ -8,12 +8,14 @@
#include "strbuf.h"
#include "string-list.h"
#include "argv-array.h"
+#include "midx.h"
#include "packfile.h"
#include "object-store.h"
static int delta_base_offset = 1;
static int pack_kept_objects = -1;
static int write_bitmaps;
+static int use_delta_islands;
static char *packdir, *packtmp;
static const char *const git_repack_usage[] = {
@@ -42,6 +44,10 @@ static int repack_config(const char *var, const char *value, void *cb)
write_bitmaps = git_config_bool(var, value);
return 0;
}
+ if (!strcmp(var, "repack.usedeltaislands")) {
+ use_delta_islands = git_config_bool(var, value);
+ return 0;
+ }
return git_default_config(var, value, cb);
}
@@ -280,6 +286,7 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
int keep_unreachable = 0;
struct string_list keep_pack_list = STRING_LIST_INIT_NODUP;
int no_update_server_info = 0;
+ int midx_cleared = 0;
struct pack_objects_args po_args = {NULL};
struct option builtin_repack_options[] = {
@@ -301,6 +308,8 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
N_("pass --local to git-pack-objects")),
OPT_BOOL('b', "write-bitmap-index", &write_bitmaps,
N_("write bitmap index")),
+ OPT_BOOL('i', "delta-islands", &use_delta_islands,
+ N_("pass --delta-islands to git-pack-objects")),
OPT_STRING(0, "unpack-unreachable", &unpack_unreachable, N_("approxidate"),
N_("with -A, do not loosen objects older than this")),
OPT_BOOL('k', "keep-unreachable", &keep_unreachable,
@@ -361,6 +370,8 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
argv_array_push(&cmd.args, "--exclude-promisor-objects");
if (write_bitmaps)
argv_array_push(&cmd.args, "--write-bitmap-index");
+ if (use_delta_islands)
+ argv_array_push(&cmd.args, "--delta-islands");
if (pack_everything & ALL_INTO_ONE) {
get_non_kept_pack_filenames(&existing_packs, &keep_pack_list);
@@ -418,6 +429,13 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
for_each_string_list_item(item, &names) {
for (ext = 0; ext < ARRAY_SIZE(exts); ext++) {
char *fname, *fname_old;
+
+ if (!midx_cleared) {
+ /* if we move a packfile, it will invalidated the midx */
+ clear_midx_file(get_object_directory());
+ midx_cleared = 1;
+ }
+
fname = mkpathdup("%s/pack-%s%s", packdir,
item->string, exts[ext].name);
if (!file_exists(fname)) {
diff --git a/builtin/rerere.c b/builtin/rerere.c
index 0bc4029..5ed941b 100644
--- a/builtin/rerere.c
+++ b/builtin/rerere.c
@@ -75,7 +75,7 @@ int cmd_rerere(int argc, const char **argv, const char *prefix)
if (!strcmp(argv[0], "forget")) {
struct pathspec pathspec;
if (argc < 2)
- warning("'git rerere forget' without paths is deprecated");
+ warning(_("'git rerere forget' without paths is deprecated"));
parse_pathspec(&pathspec, 0, PATHSPEC_PREFER_CWD,
prefix, argv + 1);
return rerere_forget(&pathspec);
@@ -107,7 +107,7 @@ int cmd_rerere(int argc, const char **argv, const char *prefix)
const char *path = merge_rr.items[i].string;
const struct rerere_id *id = merge_rr.items[i].util;
if (diff_two(rerere_path(id, "preimage"), path, path, path))
- die("unable to generate diff for %s", rerere_path(id, NULL));
+ die(_("unable to generate diff for '%s'"), rerere_path(id, NULL));
}
} else
usage_with_options(rerere_usage, options);
diff --git a/builtin/rev-list.c b/builtin/rev-list.c
index 5b07f3f..ed0ea7d 100644
--- a/builtin/rev-list.c
+++ b/builtin/rev-list.c
@@ -493,7 +493,7 @@ int cmd_rev_list(int argc, const char **argv, const char *prefix)
if ((!revs.commits && reflog_walk_empty(revs.reflog_info) &&
(!(revs.tag_objects || revs.tree_objects || revs.blob_objects) &&
!revs.pending.nr) &&
- !revs.rev_input_given) ||
+ !revs.rev_input_given && !revs.read_from_stdin) ||
revs.diff)
usage(rev_list_usage);
diff --git a/builtin/rev-parse.c b/builtin/rev-parse.c
index 0f09bbb..455f622 100644
--- a/builtin/rev-parse.c
+++ b/builtin/rev-parse.c
@@ -14,6 +14,7 @@
#include "revision.h"
#include "split-index.h"
#include "submodule.h"
+#include "commit-reach.h"
#define DO_REVS 1
#define DO_NOREV 2
diff --git a/builtin/submodule--helper.c b/builtin/submodule--helper.c
index b56028b..4084487 100644
--- a/builtin/submodule--helper.c
+++ b/builtin/submodule--helper.c
@@ -1123,8 +1123,6 @@ static void deinit_submodule(const char *path, const char *prefix,
if (!(flags & OPT_QUIET))
printf(format, displaypath);
- submodule_unset_core_worktree(sub);
-
strbuf_release(&sb_rm);
}
@@ -1445,6 +1443,72 @@ static int module_clone(int argc, const char **argv, const char *prefix)
return 0;
}
+static void determine_submodule_update_strategy(struct repository *r,
+ int just_cloned,
+ const char *path,
+ const char *update,
+ struct submodule_update_strategy *out)
+{
+ const struct submodule *sub = submodule_from_path(r, &null_oid, path);
+ char *key;
+ const char *val;
+
+ key = xstrfmt("submodule.%s.update", sub->name);
+
+ if (update) {
+ trace_printf("parsing update");
+ if (parse_submodule_update_strategy(update, out) < 0)
+ die(_("Invalid update mode '%s' for submodule path '%s'"),
+ update, path);
+ } else if (!repo_config_get_string_const(r, key, &val)) {
+ if (parse_submodule_update_strategy(val, out) < 0)
+ die(_("Invalid update mode '%s' configured for submodule path '%s'"),
+ val, path);
+ } else if (sub->update_strategy.type != SM_UPDATE_UNSPECIFIED) {
+ trace_printf("loaded thing");
+ out->type = sub->update_strategy.type;
+ out->command = sub->update_strategy.command;
+ } else
+ out->type = SM_UPDATE_CHECKOUT;
+
+ if (just_cloned &&
+ (out->type == SM_UPDATE_MERGE ||
+ out->type == SM_UPDATE_REBASE ||
+ out->type == SM_UPDATE_NONE))
+ out->type = SM_UPDATE_CHECKOUT;
+
+ free(key);
+}
+
+static int module_update_module_mode(int argc, const char **argv, const char *prefix)
+{
+ const char *path, *update = NULL;
+ int just_cloned;
+ struct submodule_update_strategy update_strategy = { .type = SM_UPDATE_CHECKOUT };
+
+ if (argc < 3 || argc > 4)
+ die("submodule--helper update-module-clone expects <just-cloned> <path> [<update>]");
+
+ just_cloned = git_config_int("just_cloned", argv[1]);
+ path = argv[2];
+
+ if (argc == 4)
+ update = argv[3];
+
+ determine_submodule_update_strategy(the_repository,
+ just_cloned, path, update,
+ &update_strategy);
+ fputs(submodule_strategy_to_string(&update_strategy), stdout);
+
+ return 0;
+}
+
+struct update_clone_data {
+ const struct submodule *sub;
+ struct object_id oid;
+ unsigned just_cloned;
+};
+
struct submodule_update_clone {
/* index into 'list', the list of submodules to look into for cloning */
int current;
@@ -1464,8 +1528,9 @@ struct submodule_update_clone {
const char *recursive_prefix;
const char *prefix;
- /* Machine-readable status lines to be consumed by git-submodule.sh */
- struct string_list projectlines;
+ /* to be consumed by git-submodule.sh */
+ struct update_clone_data *update_clone;
+ int update_clone_nr; int update_clone_alloc;
/* If we want to stop as fast as possible and return an error */
unsigned quickstop : 1;
@@ -1473,11 +1538,13 @@ struct submodule_update_clone {
/* failed clones to be retried again */
const struct cache_entry **failed_clones;
int failed_clones_nr, failed_clones_alloc;
+
+ int max_jobs;
};
#define SUBMODULE_UPDATE_CLONE_INIT {0, MODULE_LIST_INIT, 0, \
SUBMODULE_UPDATE_STRATEGY_INIT, 0, 0, -1, STRING_LIST_INIT_DUP, 0, \
NULL, NULL, NULL, \
- STRING_LIST_INIT_DUP, 0, NULL, 0, 0}
+ NULL, 0, 0, 0, NULL, 0, 0, 0}
static void next_submodule_warn_missing(struct submodule_update_clone *suc,
@@ -1571,11 +1638,12 @@ static int prepare_to_clone_next_submodule(const struct cache_entry *ce,
strbuf_addf(&sb, "%s/.git", ce->name);
needs_cloning = !file_exists(sb.buf);
- strbuf_reset(&sb);
- strbuf_addf(&sb, "%06o %s %d %d\t%s\n", ce->ce_mode,
- oid_to_hex(&ce->oid), ce_stage(ce),
- needs_cloning, ce->name);
- string_list_append(&suc->projectlines, sb.buf);
+ ALLOC_GROW(suc->update_clone, suc->update_clone_nr + 1,
+ suc->update_clone_alloc);
+ oidcpy(&suc->update_clone[suc->update_clone_nr].oid, &ce->oid);
+ suc->update_clone[suc->update_clone_nr].just_cloned = needs_cloning;
+ suc->update_clone[suc->update_clone_nr].sub = sub;
+ suc->update_clone_nr++;
if (!needs_cloning)
goto cleanup;
@@ -1716,11 +1784,44 @@ static int git_update_clone_config(const char *var, const char *value,
return 0;
}
+static void update_submodule(struct update_clone_data *ucd)
+{
+ fprintf(stdout, "dummy %s %d\t%s\n",
+ oid_to_hex(&ucd->oid),
+ ucd->just_cloned,
+ ucd->sub->path);
+}
+
+static int update_submodules(struct submodule_update_clone *suc)
+{
+ int i;
+
+ run_processes_parallel(suc->max_jobs,
+ update_clone_get_next_task,
+ update_clone_start_failure,
+ update_clone_task_finished,
+ suc);
+
+ /*
+ * We saved the output and put it out all at once now.
+ * That means:
+ * - the listener does not have to interleave their (checkout)
+ * work with our fetching. The writes involved in a
+ * checkout involve more straightforward sequential I/O.
+ * - the listener can avoid doing any work if fetching failed.
+ */
+ if (suc->quickstop)
+ return 1;
+
+ for (i = 0; i < suc->update_clone_nr; i++)
+ update_submodule(&suc->update_clone[i]);
+
+ return 0;
+}
+
static int update_clone(int argc, const char **argv, const char *prefix)
{
const char *update = NULL;
- int max_jobs = 1;
- struct string_list_item *item;
struct pathspec pathspec;
struct submodule_update_clone suc = SUBMODULE_UPDATE_CLONE_INIT;
@@ -1742,7 +1843,7 @@ static int update_clone(int argc, const char **argv, const char *prefix)
OPT_STRING(0, "depth", &suc.depth, "<depth>",
N_("Create a shallow clone truncated to the "
"specified number of revisions")),
- OPT_INTEGER('j', "jobs", &max_jobs,
+ OPT_INTEGER('j', "jobs", &suc.max_jobs,
N_("parallel jobs")),
OPT_BOOL(0, "recommend-shallow", &suc.recommend_shallow,
N_("whether the initial clone should follow the shallow recommendation")),
@@ -1758,8 +1859,8 @@ static int update_clone(int argc, const char **argv, const char *prefix)
};
suc.prefix = prefix;
- update_clone_config_from_gitmodules(&max_jobs);
- git_config(git_update_clone_config, &max_jobs);
+ update_clone_config_from_gitmodules(&suc.max_jobs);
+ git_config(git_update_clone_config, &suc.max_jobs);
argc = parse_options(argc, argv, prefix, module_update_clone_options,
git_submodule_helper_usage, 0);
@@ -1774,27 +1875,7 @@ static int update_clone(int argc, const char **argv, const char *prefix)
if (pathspec.nr)
suc.warn_if_uninitialized = 1;
- run_processes_parallel(max_jobs,
- update_clone_get_next_task,
- update_clone_start_failure,
- update_clone_task_finished,
- &suc);
-
- /*
- * We saved the output and put it out all at once now.
- * That means:
- * - the listener does not have to interleave their (checkout)
- * work with our fetching. The writes involved in a
- * checkout involve more straightforward sequential I/O.
- * - the listener can avoid doing any work if fetching failed.
- */
- if (suc.quickstop)
- return 1;
-
- for_each_string_list_item(item, &suc.projectlines)
- fprintf(stdout, "%s", item->string);
-
- return 0;
+ return update_submodules(&suc);
}
static int resolve_relative_path(int argc, const char **argv, const char *prefix)
@@ -1940,6 +2021,45 @@ static int push_check(int argc, const char **argv, const char *prefix)
return 0;
}
+static int ensure_core_worktree(int argc, const char **argv, const char *prefix)
+{
+ const struct submodule *sub;
+ const char *path;
+ char *cw;
+ struct repository subrepo;
+
+ if (argc != 2)
+ BUG("submodule--helper connect-gitdir-workingtree <name> <path>");
+
+ path = argv[1];
+
+ sub = submodule_from_path(the_repository, &null_oid, path);
+ if (!sub)
+ BUG("We could get the submodule handle before?");
+
+ if (repo_submodule_init(&subrepo, the_repository, path))
+ die(_("could not get a repository handle for submodule '%s'"), path);
+
+ if (!repo_config_get_string(&subrepo, "core.worktree", &cw)) {
+ char *cfg_file, *abs_path;
+ const char *rel_path;
+ struct strbuf sb = STRBUF_INIT;
+
+ cfg_file = repo_git_path(&subrepo, "config");
+
+ abs_path = absolute_pathdup(path);
+ rel_path = relative_path(abs_path, subrepo.gitdir, &sb);
+
+ git_config_set_in_file(cfg_file, "core.worktree", rel_path);
+
+ free(cfg_file);
+ free(abs_path);
+ strbuf_release(&sb);
+ }
+
+ return 0;
+}
+
static int absorb_git_dirs(int argc, const char **argv, const char *prefix)
{
int i;
@@ -2005,29 +2125,6 @@ static int check_name(int argc, const char **argv, const char *prefix)
return 0;
}
-static int connect_gitdir_workingtree(int argc, const char **argv, const char *prefix)
-{
- struct strbuf sb = STRBUF_INIT;
- const char *name, *path;
- char *sm_gitdir;
-
- if (argc != 3)
- BUG("submodule--helper connect-gitdir-workingtree <name> <path>");
-
- name = argv[1];
- path = argv[2];
-
- strbuf_addf(&sb, "%s/modules/%s", get_git_dir(), name);
- sm_gitdir = absolute_pathdup(sb.buf);
-
- connect_work_tree_and_git_dir(path, sm_gitdir, 0);
-
- strbuf_release(&sb);
- free(sm_gitdir);
-
- return 0;
-}
-
#define SUPPORT_SUPER_PREFIX (1<<0)
struct cmd_struct {
@@ -2040,8 +2137,9 @@ static struct cmd_struct commands[] = {
{"list", module_list, 0},
{"name", module_name, 0},
{"clone", module_clone, 0},
+ {"update-module-mode", module_update_module_mode, 0},
{"update-clone", update_clone, 0},
- {"connect-gitdir-workingtree", connect_gitdir_workingtree, 0},
+ {"ensure-core-worktree", ensure_core_worktree, 0},
{"relative-path", resolve_relative_path, 0},
{"resolve-relative-url", resolve_relative_url, 0},
{"resolve-relative-url-test", resolve_relative_url_test, 0},
diff --git a/cache-tree.c b/cache-tree.c
index b49bb5c..5ce5146 100644
--- a/cache-tree.c
+++ b/cache-tree.c
@@ -4,6 +4,7 @@
#include "tree-walk.h"
#include "cache-tree.h"
#include "object-store.h"
+#include "replace-object.h"
#ifndef DEBUG
#define DEBUG 0
@@ -433,7 +434,9 @@ int cache_tree_update(struct index_state *istate, int flags)
if (i)
return i;
+ trace_performance_enter();
i = update_one(it, cache, entries, "", 0, &skip, flags);
+ trace_performance_leave("cache_tree_update");
if (i < 0)
return i;
istate->cache_changed |= CACHE_TREE_CHANGED;
@@ -718,3 +721,80 @@ int cache_tree_matches_traversal(struct cache_tree *root,
return it->entry_count;
return 0;
}
+
+static void verify_one(struct index_state *istate,
+ struct cache_tree *it,
+ struct strbuf *path)
+{
+ int i, pos, len = path->len;
+ struct strbuf tree_buf = STRBUF_INIT;
+ struct object_id new_oid;
+
+ for (i = 0; i < it->subtree_nr; i++) {
+ strbuf_addf(path, "%s/", it->down[i]->name);
+ verify_one(istate, it->down[i]->cache_tree, path);
+ strbuf_setlen(path, len);
+ }
+
+ if (it->entry_count < 0 ||
+ /* no verification on tests (t7003) that replace trees */
+ lookup_replace_object(the_repository, &it->oid) != &it->oid)
+ return;
+
+ if (path->len) {
+ pos = index_name_pos(istate, path->buf, path->len);
+ pos = -pos - 1;
+ } else {
+ pos = 0;
+ }
+
+ i = 0;
+ while (i < it->entry_count) {
+ struct cache_entry *ce = istate->cache[pos + i];
+ const char *slash;
+ struct cache_tree_sub *sub = NULL;
+ const struct object_id *oid;
+ const char *name;
+ unsigned mode;
+ int entlen;
+
+ if (ce->ce_flags & (CE_STAGEMASK | CE_INTENT_TO_ADD | CE_REMOVE))
+ BUG("%s with flags 0x%x should not be in cache-tree",
+ ce->name, ce->ce_flags);
+ name = ce->name + path->len;
+ slash = strchr(name, '/');
+ if (slash) {
+ entlen = slash - name;
+ sub = find_subtree(it, ce->name + path->len, entlen, 0);
+ if (!sub || sub->cache_tree->entry_count < 0)
+ BUG("bad subtree '%.*s'", entlen, name);
+ oid = &sub->cache_tree->oid;
+ mode = S_IFDIR;
+ i += sub->cache_tree->entry_count;
+ } else {
+ oid = &ce->oid;
+ mode = ce->ce_mode;
+ entlen = ce_namelen(ce) - path->len;
+ i++;
+ }
+ strbuf_addf(&tree_buf, "%o %.*s%c", mode, entlen, name, '\0');
+ strbuf_add(&tree_buf, oid->hash, the_hash_algo->rawsz);
+ }
+ hash_object_file(tree_buf.buf, tree_buf.len, tree_type, &new_oid);
+ if (oidcmp(&new_oid, &it->oid))
+ BUG("cache-tree for path %.*s does not match. "
+ "Expected %s got %s", len, path->buf,
+ oid_to_hex(&new_oid), oid_to_hex(&it->oid));
+ strbuf_setlen(path, len);
+ strbuf_release(&tree_buf);
+}
+
+void cache_tree_verify(struct index_state *istate)
+{
+ struct strbuf path = STRBUF_INIT;
+
+ if (!istate->cache_tree)
+ return;
+ verify_one(istate, istate->cache_tree, &path);
+ strbuf_release(&path);
+}
diff --git a/cache-tree.h b/cache-tree.h
index fc0c842..0ab6784 100644
--- a/cache-tree.h
+++ b/cache-tree.h
@@ -32,6 +32,7 @@ struct cache_tree *cache_tree_read(const char *buffer, unsigned long size);
int cache_tree_fully_valid(struct cache_tree *);
int cache_tree_update(struct index_state *, int);
+void cache_tree_verify(struct index_state *);
/* bitmasks to write_cache_as_tree flags */
#define WRITE_TREE_MISSING_OK 1
diff --git a/cache.h b/cache.h
index d97db26..d508f3d 100644
--- a/cache.h
+++ b/cache.h
@@ -1528,6 +1528,7 @@ struct checkout {
unsigned force:1,
quiet:1,
not_new:1,
+ clone:1,
refresh_cache:1;
};
#define CHECKOUT_INIT { NULL, "" }
diff --git a/command-list.txt b/command-list.txt
index a9dda3b..c36ea3c 100644
--- a/command-list.txt
+++ b/command-list.txt
@@ -123,6 +123,7 @@ git-merge-index plumbingmanipulators
git-merge-one-file purehelpers
git-mergetool ancillarymanipulators complete
git-merge-tree ancillaryinterrogators
+git-multi-pack-index plumbingmanipulators
git-mktag plumbingmanipulators
git-mktree plumbingmanipulators
git-mv mainporcelain worktree
diff --git a/commit-graph.c b/commit-graph.c
index 64ce794..ae6cabb 100644
--- a/commit-graph.c
+++ b/commit-graph.c
@@ -233,6 +233,24 @@ static int prepare_commit_graph(struct repository *r)
return !!r->objects->commit_graph;
}
+int generation_numbers_enabled(struct repository *r)
+{
+ uint32_t first_generation;
+ struct commit_graph *g;
+ if (!prepare_commit_graph(r))
+ return 0;
+
+ g = r->objects->commit_graph;
+
+ if (!g->num_commits)
+ return 0;
+
+ first_generation = get_be32(g->chunk_commit_data +
+ g->hash_len + 8) >> 2;
+
+ return !!first_generation;
+}
+
static void close_commit_graph(void)
{
free_commit_graph(the_repository->objects->commit_graph);
diff --git a/commit-graph.h b/commit-graph.h
index eea62f8..698f09e 100644
--- a/commit-graph.h
+++ b/commit-graph.h
@@ -52,6 +52,12 @@ struct commit_graph {
struct commit_graph *load_commit_graph_one(const char *graph_file);
+/*
+ * Return 1 if and only if the repository has a commit-graph
+ * file and generation numbers are computed in that file.
+ */
+int generation_numbers_enabled(struct repository *r);
+
void write_commit_graph_reachable(const char *obj_dir, int append);
void write_commit_graph(const char *obj_dir,
struct string_list *pack_indexes,
diff --git a/commit-reach.c b/commit-reach.c
new file mode 100644
index 0000000..622eeb3
--- /dev/null
+++ b/commit-reach.c
@@ -0,0 +1,665 @@
+#include "cache.h"
+#include "commit.h"
+#include "commit-graph.h"
+#include "decorate.h"
+#include "prio-queue.h"
+#include "tree.h"
+#include "ref-filter.h"
+#include "revision.h"
+#include "tag.h"
+#include "commit-reach.h"
+
+/* Remember to update object flag allocation in object.h */
+#define REACHABLE (1u<<15)
+#define PARENT1 (1u<<16)
+#define PARENT2 (1u<<17)
+#define STALE (1u<<18)
+#define RESULT (1u<<19)
+
+static const unsigned all_flags = (PARENT1 | PARENT2 | STALE | RESULT);
+
+static int queue_has_nonstale(struct prio_queue *queue)
+{
+ int i;
+ for (i = 0; i < queue->nr; i++) {
+ struct commit *commit = queue->array[i].data;
+ if (!(commit->object.flags & STALE))
+ return 1;
+ }
+ return 0;
+}
+
+/* all input commits in one and twos[] must have been parsed! */
+static struct commit_list *paint_down_to_common(struct commit *one, int n,
+ struct commit **twos,
+ int min_generation)
+{
+ struct prio_queue queue = { compare_commits_by_gen_then_commit_date };
+ struct commit_list *result = NULL;
+ int i;
+ uint32_t last_gen = GENERATION_NUMBER_INFINITY;
+
+ if (!min_generation)
+ queue.compare = compare_commits_by_commit_date;
+
+ one->object.flags |= PARENT1;
+ if (!n) {
+ commit_list_append(one, &result);
+ return result;
+ }
+ prio_queue_put(&queue, one);
+
+ for (i = 0; i < n; i++) {
+ twos[i]->object.flags |= PARENT2;
+ prio_queue_put(&queue, twos[i]);
+ }
+
+ while (queue_has_nonstale(&queue)) {
+ struct commit *commit = prio_queue_get(&queue);
+ struct commit_list *parents;
+ int flags;
+
+ if (min_generation && commit->generation > last_gen)
+ BUG("bad generation skip %8x > %8x at %s",
+ commit->generation, last_gen,
+ oid_to_hex(&commit->object.oid));
+ last_gen = commit->generation;
+
+ if (commit->generation < min_generation)
+ break;
+
+ flags = commit->object.flags & (PARENT1 | PARENT2 | STALE);
+ if (flags == (PARENT1 | PARENT2)) {
+ if (!(commit->object.flags & RESULT)) {
+ commit->object.flags |= RESULT;
+ commit_list_insert_by_date(commit, &result);
+ }
+ /* Mark parents of a found merge stale */
+ flags |= STALE;
+ }
+ parents = commit->parents;
+ while (parents) {
+ struct commit *p = parents->item;
+ parents = parents->next;
+ if ((p->object.flags & flags) == flags)
+ continue;
+ if (parse_commit(p))
+ return NULL;
+ p->object.flags |= flags;
+ prio_queue_put(&queue, p);
+ }
+ }
+
+ clear_prio_queue(&queue);
+ return result;
+}
+
+static struct commit_list *merge_bases_many(struct commit *one, int n, struct commit **twos)
+{
+ struct commit_list *list = NULL;
+ struct commit_list *result = NULL;
+ int i;
+
+ for (i = 0; i < n; i++) {
+ if (one == twos[i])
+ /*
+ * We do not mark this even with RESULT so we do not
+ * have to clean it up.
+ */
+ return commit_list_insert(one, &result);
+ }
+
+ if (parse_commit(one))
+ return NULL;
+ for (i = 0; i < n; i++) {
+ if (parse_commit(twos[i]))
+ return NULL;
+ }
+
+ list = paint_down_to_common(one, n, twos, 0);
+
+ while (list) {
+ struct commit *commit = pop_commit(&list);
+ if (!(commit->object.flags & STALE))
+ commit_list_insert_by_date(commit, &result);
+ }
+ return result;
+}
+
+struct commit_list *get_octopus_merge_bases(struct commit_list *in)
+{
+ struct commit_list *i, *j, *k, *ret = NULL;
+
+ if (!in)
+ return ret;
+
+ commit_list_insert(in->item, &ret);
+
+ for (i = in->next; i; i = i->next) {
+ struct commit_list *new_commits = NULL, *end = NULL;
+
+ for (j = ret; j; j = j->next) {
+ struct commit_list *bases;
+ bases = get_merge_bases(i->item, j->item);
+ if (!new_commits)
+ new_commits = bases;
+ else
+ end->next = bases;
+ for (k = bases; k; k = k->next)
+ end = k;
+ }
+ ret = new_commits;
+ }
+ return ret;
+}
+
+static int remove_redundant(struct commit **array, int cnt)
+{
+ /*
+ * Some commit in the array may be an ancestor of
+ * another commit. Move such commit to the end of
+ * the array, and return the number of commits that
+ * are independent from each other.
+ */
+ struct commit **work;
+ unsigned char *redundant;
+ int *filled_index;
+ int i, j, filled;
+
+ work = xcalloc(cnt, sizeof(*work));
+ redundant = xcalloc(cnt, 1);
+ ALLOC_ARRAY(filled_index, cnt - 1);
+
+ for (i = 0; i < cnt; i++)
+ parse_commit(array[i]);
+ for (i = 0; i < cnt; i++) {
+ struct commit_list *common;
+ uint32_t min_generation = array[i]->generation;
+
+ if (redundant[i])
+ continue;
+ for (j = filled = 0; j < cnt; j++) {
+ if (i == j || redundant[j])
+ continue;
+ filled_index[filled] = j;
+ work[filled++] = array[j];
+
+ if (array[j]->generation < min_generation)
+ min_generation = array[j]->generation;
+ }
+ common = paint_down_to_common(array[i], filled, work,
+ min_generation);
+ if (array[i]->object.flags & PARENT2)
+ redundant[i] = 1;
+ for (j = 0; j < filled; j++)
+ if (work[j]->object.flags & PARENT1)
+ redundant[filled_index[j]] = 1;
+ clear_commit_marks(array[i], all_flags);
+ clear_commit_marks_many(filled, work, all_flags);
+ free_commit_list(common);
+ }
+
+ /* Now collect the result */
+ COPY_ARRAY(work, array, cnt);
+ for (i = filled = 0; i < cnt; i++)
+ if (!redundant[i])
+ array[filled++] = work[i];
+ for (j = filled, i = 0; i < cnt; i++)
+ if (redundant[i])
+ array[j++] = work[i];
+ free(work);
+ free(redundant);
+ free(filled_index);
+ return filled;
+}
+
+static struct commit_list *get_merge_bases_many_0(struct commit *one,
+ int n,
+ struct commit **twos,
+ int cleanup)
+{
+ struct commit_list *list;
+ struct commit **rslt;
+ struct commit_list *result;
+ int cnt, i;
+
+ result = merge_bases_many(one, n, twos);
+ for (i = 0; i < n; i++) {
+ if (one == twos[i])
+ return result;
+ }
+ if (!result || !result->next) {
+ if (cleanup) {
+ clear_commit_marks(one, all_flags);
+ clear_commit_marks_many(n, twos, all_flags);
+ }
+ return result;
+ }
+
+ /* There are more than one */
+ cnt = commit_list_count(result);
+ rslt = xcalloc(cnt, sizeof(*rslt));
+ for (list = result, i = 0; list; list = list->next)
+ rslt[i++] = list->item;
+ free_commit_list(result);
+
+ clear_commit_marks(one, all_flags);
+ clear_commit_marks_many(n, twos, all_flags);
+
+ cnt = remove_redundant(rslt, cnt);
+ result = NULL;
+ for (i = 0; i < cnt; i++)
+ commit_list_insert_by_date(rslt[i], &result);
+ free(rslt);
+ return result;
+}
+
+struct commit_list *get_merge_bases_many(struct commit *one,
+ int n,
+ struct commit **twos)
+{
+ return get_merge_bases_many_0(one, n, twos, 1);
+}
+
+struct commit_list *get_merge_bases_many_dirty(struct commit *one,
+ int n,
+ struct commit **twos)
+{
+ return get_merge_bases_many_0(one, n, twos, 0);
+}
+
+struct commit_list *get_merge_bases(struct commit *one, struct commit *two)
+{
+ return get_merge_bases_many_0(one, 1, &two, 1);
+}
+
+/*
+ * Is "commit" a descendant of one of the elements on the "with_commit" list?
+ */
+int is_descendant_of(struct commit *commit, struct commit_list *with_commit)
+{
+ if (!with_commit)
+ return 1;
+
+ if (generation_numbers_enabled(the_repository)) {
+ struct commit_list *from_list = NULL;
+ int result;
+ commit_list_insert(commit, &from_list);
+ result = can_all_from_reach(from_list, with_commit, 0);
+ free_commit_list(from_list);
+ return result;
+ } else {
+ while (with_commit) {
+ struct commit *other;
+
+ other = with_commit->item;
+ with_commit = with_commit->next;
+ if (in_merge_bases(other, commit))
+ return 1;
+ }
+ return 0;
+ }
+}
+
+/*
+ * Is "commit" an ancestor of one of the "references"?
+ */
+int in_merge_bases_many(struct commit *commit, int nr_reference, struct commit **reference)
+{
+ struct commit_list *bases;
+ int ret = 0, i;
+ uint32_t min_generation = GENERATION_NUMBER_INFINITY;
+
+ if (parse_commit(commit))
+ return ret;
+ for (i = 0; i < nr_reference; i++) {
+ if (parse_commit(reference[i]))
+ return ret;
+ if (reference[i]->generation < min_generation)
+ min_generation = reference[i]->generation;
+ }
+
+ if (commit->generation > min_generation)
+ return ret;
+
+ bases = paint_down_to_common(commit, nr_reference, reference, commit->generation);
+ if (commit->object.flags & PARENT2)
+ ret = 1;
+ clear_commit_marks(commit, all_flags);
+ clear_commit_marks_many(nr_reference, reference, all_flags);
+ free_commit_list(bases);
+ return ret;
+}
+
+/*
+ * Is "commit" an ancestor of (i.e. reachable from) the "reference"?
+ */
+int in_merge_bases(struct commit *commit, struct commit *reference)
+{
+ return in_merge_bases_many(commit, 1, &reference);
+}
+
+struct commit_list *reduce_heads(struct commit_list *heads)
+{
+ struct commit_list *p;
+ struct commit_list *result = NULL, **tail = &result;
+ struct commit **array;
+ int num_head, i;
+
+ if (!heads)
+ return NULL;
+
+ /* Uniquify */
+ for (p = heads; p; p = p->next)
+ p->item->object.flags &= ~STALE;
+ for (p = heads, num_head = 0; p; p = p->next) {
+ if (p->item->object.flags & STALE)
+ continue;
+ p->item->object.flags |= STALE;
+ num_head++;
+ }
+ array = xcalloc(num_head, sizeof(*array));
+ for (p = heads, i = 0; p; p = p->next) {
+ if (p->item->object.flags & STALE) {
+ array[i++] = p->item;
+ p->item->object.flags &= ~STALE;
+ }
+ }
+ num_head = remove_redundant(array, num_head);
+ for (i = 0; i < num_head; i++)
+ tail = &commit_list_insert(array[i], tail)->next;
+ free(array);
+ return result;
+}
+
+void reduce_heads_replace(struct commit_list **heads)
+{
+ struct commit_list *result = reduce_heads(*heads);
+ free_commit_list(*heads);
+ *heads = result;
+}
+
+int ref_newer(const struct object_id *new_oid, const struct object_id *old_oid)
+{
+ struct object *o;
+ struct commit *old_commit, *new_commit;
+ struct commit_list *old_commit_list = NULL;
+
+ /*
+ * Both new_commit and old_commit must be commit-ish and new_commit is descendant of
+ * old_commit. Otherwise we require --force.
+ */
+ o = deref_tag(the_repository, parse_object(the_repository, old_oid),
+ NULL, 0);
+ if (!o || o->type != OBJ_COMMIT)
+ return 0;
+ old_commit = (struct commit *) o;
+
+ o = deref_tag(the_repository, parse_object(the_repository, new_oid),
+ NULL, 0);
+ if (!o || o->type != OBJ_COMMIT)
+ return 0;
+ new_commit = (struct commit *) o;
+
+ if (parse_commit(new_commit) < 0)
+ return 0;
+
+ commit_list_insert(old_commit, &old_commit_list);
+ return is_descendant_of(new_commit, old_commit_list);
+}
+
+/*
+ * Mimicking the real stack, this stack lives on the heap, avoiding stack
+ * overflows.
+ *
+ * At each recursion step, the stack items points to the commits whose
+ * ancestors are to be inspected.
+ */
+struct contains_stack {
+ int nr, alloc;
+ struct contains_stack_entry {
+ struct commit *commit;
+ struct commit_list *parents;
+ } *contains_stack;
+};
+
+static int in_commit_list(const struct commit_list *want, struct commit *c)
+{
+ for (; want; want = want->next)
+ if (!oidcmp(&want->item->object.oid, &c->object.oid))
+ return 1;
+ return 0;
+}
+
+/*
+ * Test whether the candidate is contained in the list.
+ * Do not recurse to find out, though, but return -1 if inconclusive.
+ */
+static enum contains_result contains_test(struct commit *candidate,
+ const struct commit_list *want,
+ struct contains_cache *cache,
+ uint32_t cutoff)
+{
+ enum contains_result *cached = contains_cache_at(cache, candidate);
+
+ /* If we already have the answer cached, return that. */
+ if (*cached)
+ return *cached;
+
+ /* or are we it? */
+ if (in_commit_list(want, candidate)) {
+ *cached = CONTAINS_YES;
+ return CONTAINS_YES;
+ }
+
+ /* Otherwise, we don't know; prepare to recurse */
+ parse_commit_or_die(candidate);
+
+ if (candidate->generation < cutoff)
+ return CONTAINS_NO;
+
+ return CONTAINS_UNKNOWN;
+}
+
+static void push_to_contains_stack(struct commit *candidate, struct contains_stack *contains_stack)
+{
+ ALLOC_GROW(contains_stack->contains_stack, contains_stack->nr + 1, contains_stack->alloc);
+ contains_stack->contains_stack[contains_stack->nr].commit = candidate;
+ contains_stack->contains_stack[contains_stack->nr++].parents = candidate->parents;
+}
+
+static enum contains_result contains_tag_algo(struct commit *candidate,
+ const struct commit_list *want,
+ struct contains_cache *cache)
+{
+ struct contains_stack contains_stack = { 0, 0, NULL };
+ enum contains_result result;
+ uint32_t cutoff = GENERATION_NUMBER_INFINITY;
+ const struct commit_list *p;
+
+ for (p = want; p; p = p->next) {
+ struct commit *c = p->item;
+ load_commit_graph_info(the_repository, c);
+ if (c->generation < cutoff)
+ cutoff = c->generation;
+ }
+
+ result = contains_test(candidate, want, cache, cutoff);
+ if (result != CONTAINS_UNKNOWN)
+ return result;
+
+ push_to_contains_stack(candidate, &contains_stack);
+ while (contains_stack.nr) {
+ struct contains_stack_entry *entry = &contains_stack.contains_stack[contains_stack.nr - 1];
+ struct commit *commit = entry->commit;
+ struct commit_list *parents = entry->parents;
+
+ if (!parents) {
+ *contains_cache_at(cache, commit) = CONTAINS_NO;
+ contains_stack.nr--;
+ }
+ /*
+ * If we just popped the stack, parents->item has been marked,
+ * therefore contains_test will return a meaningful yes/no.
+ */
+ else switch (contains_test(parents->item, want, cache, cutoff)) {
+ case CONTAINS_YES:
+ *contains_cache_at(cache, commit) = CONTAINS_YES;
+ contains_stack.nr--;
+ break;
+ case CONTAINS_NO:
+ entry->parents = parents->next;
+ break;
+ case CONTAINS_UNKNOWN:
+ push_to_contains_stack(parents->item, &contains_stack);
+ break;
+ }
+ }
+ free(contains_stack.contains_stack);
+ return contains_test(candidate, want, cache, cutoff);
+}
+
+int commit_contains(struct ref_filter *filter, struct commit *commit,
+ struct commit_list *list, struct contains_cache *cache)
+{
+ if (filter->with_commit_tag_algo)
+ return contains_tag_algo(commit, list, cache) == CONTAINS_YES;
+ return is_descendant_of(commit, list);
+}
+
+static int compare_commits_by_gen(const void *_a, const void *_b)
+{
+ const struct commit *a = (const struct commit *)_a;
+ const struct commit *b = (const struct commit *)_b;
+
+ if (a->generation < b->generation)
+ return -1;
+ if (a->generation > b->generation)
+ return 1;
+ return 0;
+}
+
+int can_all_from_reach_with_flag(struct object_array *from,
+ unsigned int with_flag,
+ unsigned int assign_flag,
+ time_t min_commit_date,
+ uint32_t min_generation)
+{
+ struct commit **list = NULL;
+ int i;
+ int result = 1;
+
+ ALLOC_ARRAY(list, from->nr);
+ for (i = 0; i < from->nr; i++) {
+ list[i] = (struct commit *)from->objects[i].item;
+
+ if (parse_commit(list[i]) ||
+ list[i]->generation < min_generation)
+ return 0;
+ }
+
+ QSORT(list, from->nr, compare_commits_by_gen);
+
+ for (i = 0; i < from->nr; i++) {
+ /* DFS from list[i] */
+ struct commit_list *stack = NULL;
+
+ list[i]->object.flags |= assign_flag;
+ commit_list_insert(list[i], &stack);
+
+ while (stack) {
+ struct commit_list *parent;
+
+ if (stack->item->object.flags & with_flag) {
+ pop_commit(&stack);
+ continue;
+ }
+
+ for (parent = stack->item->parents; parent; parent = parent->next) {
+ if (parent->item->object.flags & (with_flag | RESULT))
+ stack->item->object.flags |= RESULT;
+
+ if (!(parent->item->object.flags & assign_flag)) {
+ parent->item->object.flags |= assign_flag;
+
+ if (parse_commit(parent->item) ||
+ parent->item->date < min_commit_date ||
+ parent->item->generation < min_generation)
+ continue;
+
+ commit_list_insert(parent->item, &stack);
+ break;
+ }
+ }
+
+ if (!parent)
+ pop_commit(&stack);
+ }
+
+ if (!(list[i]->object.flags & (with_flag | RESULT))) {
+ result = 0;
+ goto cleanup;
+ }
+ }
+
+cleanup:
+ for (i = 0; i < from->nr; i++) {
+ clear_commit_marks(list[i], RESULT);
+ clear_commit_marks(list[i], assign_flag);
+ }
+ return result;
+}
+
+int can_all_from_reach(struct commit_list *from, struct commit_list *to,
+ int cutoff_by_min_date)
+{
+ struct object_array from_objs = OBJECT_ARRAY_INIT;
+ time_t min_commit_date = cutoff_by_min_date ? from->item->date : 0;
+ struct commit_list *from_iter = from, *to_iter = to;
+ int result;
+ uint32_t min_generation = GENERATION_NUMBER_INFINITY;
+
+ while (from_iter) {
+ add_object_array(&from_iter->item->object, NULL, &from_objs);
+
+ if (!parse_commit(from_iter->item)) {
+ if (from_iter->item->date < min_commit_date)
+ min_commit_date = from_iter->item->date;
+
+ if (from_iter->item->generation < min_generation)
+ min_generation = from_iter->item->generation;
+ }
+
+ from_iter = from_iter->next;
+ }
+
+ while (to_iter) {
+ if (!parse_commit(to_iter->item)) {
+ if (to_iter->item->date < min_commit_date)
+ min_commit_date = to_iter->item->date;
+
+ if (to_iter->item->generation < min_generation)
+ min_generation = to_iter->item->generation;
+ }
+
+ to_iter->item->object.flags |= PARENT2;
+
+ to_iter = to_iter->next;
+ }
+
+ result = can_all_from_reach_with_flag(&from_objs, PARENT2, PARENT1,
+ min_commit_date, min_generation);
+
+ while (from) {
+ clear_commit_marks(from->item, PARENT1);
+ from = from->next;
+ }
+
+ while (to) {
+ clear_commit_marks(to->item, PARENT2);
+ to = to->next;
+ }
+
+ object_array_clear(&from_objs);
+ return result;
+}
diff --git a/commit-reach.h b/commit-reach.h
new file mode 100644
index 0000000..7d313e2
--- /dev/null
+++ b/commit-reach.h
@@ -0,0 +1,77 @@
+#ifndef __COMMIT_REACH_H__
+#define __COMMIT_REACH_H__
+
+#include "commit-slab.h"
+
+struct commit;
+struct commit_list;
+struct contains_cache;
+struct ref_filter;
+
+struct commit_list *get_merge_bases_many(struct commit *one,
+ int n,
+ struct commit **twos);
+struct commit_list *get_merge_bases_many_dirty(struct commit *one,
+ int n,
+ struct commit **twos);
+struct commit_list *get_merge_bases(struct commit *one, struct commit *two);
+struct commit_list *get_octopus_merge_bases(struct commit_list *in);
+
+/* To be used only when object flags after this call no longer matter */
+struct commit_list *get_merge_bases_many_dirty(struct commit *one, int n, struct commit **twos);
+
+int is_descendant_of(struct commit *commit, struct commit_list *with_commit);
+int in_merge_bases_many(struct commit *commit, int nr_reference, struct commit **reference);
+int in_merge_bases(struct commit *commit, struct commit *reference);
+
+/*
+ * Takes a list of commits and returns a new list where those
+ * have been removed that can be reached from other commits in
+ * the list. It is useful for, e.g., reducing the commits
+ * randomly thrown at the git-merge command and removing
+ * redundant commits that the user shouldn't have given to it.
+ *
+ * This function destroys the STALE bit of the commit objects'
+ * flags.
+ */
+struct commit_list *reduce_heads(struct commit_list *heads);
+
+/*
+ * Like `reduce_heads()`, except it replaces the list. Use this
+ * instead of `foo = reduce_heads(foo);` to avoid memory leaks.
+ */
+void reduce_heads_replace(struct commit_list **heads);
+
+int ref_newer(const struct object_id *new_oid, const struct object_id *old_oid);
+
+/*
+ * Unknown has to be "0" here, because that's the default value for
+ * contains_cache slab entries that have not yet been assigned.
+ */
+enum contains_result {
+ CONTAINS_UNKNOWN = 0,
+ CONTAINS_NO,
+ CONTAINS_YES
+};
+
+define_commit_slab(contains_cache, enum contains_result);
+
+int commit_contains(struct ref_filter *filter, struct commit *commit,
+ struct commit_list *list, struct contains_cache *cache);
+
+/*
+ * Determine if every commit in 'from' can reach at least one commit
+ * that is marked with 'with_flag'. As we traverse, use 'assign_flag'
+ * as a marker for commits that are already visited. Do not walk
+ * commits with date below 'min_commit_date' or generation below
+ * 'min_generation'.
+ */
+int can_all_from_reach_with_flag(struct object_array *from,
+ unsigned int with_flag,
+ unsigned int assign_flag,
+ time_t min_commit_date,
+ uint32_t min_generation);
+int can_all_from_reach(struct commit_list *from, struct commit_list *to,
+ int commit_date_cutoff);
+
+#endif
diff --git a/commit.c b/commit.c
index 1b94a8c..d0f199e 100644
--- a/commit.c
+++ b/commit.c
@@ -843,364 +843,6 @@ void sort_in_topological_order(struct commit_list **list, enum rev_sort_order so
clear_author_date_slab(&author_date);
}
-/* merge-base stuff */
-
-/* Remember to update object flag allocation in object.h */
-#define PARENT1 (1u<<16)
-#define PARENT2 (1u<<17)
-#define STALE (1u<<18)
-#define RESULT (1u<<19)
-
-static const unsigned all_flags = (PARENT1 | PARENT2 | STALE | RESULT);
-
-static int queue_has_nonstale(struct prio_queue *queue)
-{
- int i;
- for (i = 0; i < queue->nr; i++) {
- struct commit *commit = queue->array[i].data;
- if (!(commit->object.flags & STALE))
- return 1;
- }
- return 0;
-}
-
-/* all input commits in one and twos[] must have been parsed! */
-static struct commit_list *paint_down_to_common(struct commit *one, int n,
- struct commit **twos,
- int min_generation)
-{
- struct prio_queue queue = { compare_commits_by_gen_then_commit_date };
- struct commit_list *result = NULL;
- int i;
- uint32_t last_gen = GENERATION_NUMBER_INFINITY;
-
- one->object.flags |= PARENT1;
- if (!n) {
- commit_list_append(one, &result);
- return result;
- }
- prio_queue_put(&queue, one);
-
- for (i = 0; i < n; i++) {
- twos[i]->object.flags |= PARENT2;
- prio_queue_put(&queue, twos[i]);
- }
-
- while (queue_has_nonstale(&queue)) {
- struct commit *commit = prio_queue_get(&queue);
- struct commit_list *parents;
- int flags;
-
- if (commit->generation > last_gen)
- BUG("bad generation skip %8x > %8x at %s",
- commit->generation, last_gen,
- oid_to_hex(&commit->object.oid));
- last_gen = commit->generation;
-
- if (commit->generation < min_generation)
- break;
-
- flags = commit->object.flags & (PARENT1 | PARENT2 | STALE);
- if (flags == (PARENT1 | PARENT2)) {
- if (!(commit->object.flags & RESULT)) {
- commit->object.flags |= RESULT;
- commit_list_insert_by_date(commit, &result);
- }
- /* Mark parents of a found merge stale */
- flags |= STALE;
- }
- parents = commit->parents;
- while (parents) {
- struct commit *p = parents->item;
- parents = parents->next;
- if ((p->object.flags & flags) == flags)
- continue;
- if (parse_commit(p))
- return NULL;
- p->object.flags |= flags;
- prio_queue_put(&queue, p);
- }
- }
-
- clear_prio_queue(&queue);
- return result;
-}
-
-static struct commit_list *merge_bases_many(struct commit *one, int n, struct commit **twos)
-{
- struct commit_list *list = NULL;
- struct commit_list *result = NULL;
- int i;
-
- for (i = 0; i < n; i++) {
- if (one == twos[i])
- /*
- * We do not mark this even with RESULT so we do not
- * have to clean it up.
- */
- return commit_list_insert(one, &result);
- }
-
- if (parse_commit(one))
- return NULL;
- for (i = 0; i < n; i++) {
- if (parse_commit(twos[i]))
- return NULL;
- }
-
- list = paint_down_to_common(one, n, twos, 0);
-
- while (list) {
- struct commit *commit = pop_commit(&list);
- if (!(commit->object.flags & STALE))
- commit_list_insert_by_date(commit, &result);
- }
- return result;
-}
-
-struct commit_list *get_octopus_merge_bases(struct commit_list *in)
-{
- struct commit_list *i, *j, *k, *ret = NULL;
-
- if (!in)
- return ret;
-
- commit_list_insert(in->item, &ret);
-
- for (i = in->next; i; i = i->next) {
- struct commit_list *new_commits = NULL, *end = NULL;
-
- for (j = ret; j; j = j->next) {
- struct commit_list *bases;
- bases = get_merge_bases(i->item, j->item);
- if (!new_commits)
- new_commits = bases;
- else
- end->next = bases;
- for (k = bases; k; k = k->next)
- end = k;
- }
- ret = new_commits;
- }
- return ret;
-}
-
-static int remove_redundant(struct commit **array, int cnt)
-{
- /*
- * Some commit in the array may be an ancestor of
- * another commit. Move such commit to the end of
- * the array, and return the number of commits that
- * are independent from each other.
- */
- struct commit **work;
- unsigned char *redundant;
- int *filled_index;
- int i, j, filled;
-
- work = xcalloc(cnt, sizeof(*work));
- redundant = xcalloc(cnt, 1);
- ALLOC_ARRAY(filled_index, cnt - 1);
-
- for (i = 0; i < cnt; i++)
- parse_commit(array[i]);
- for (i = 0; i < cnt; i++) {
- struct commit_list *common;
- uint32_t min_generation = array[i]->generation;
-
- if (redundant[i])
- continue;
- for (j = filled = 0; j < cnt; j++) {
- if (i == j || redundant[j])
- continue;
- filled_index[filled] = j;
- work[filled++] = array[j];
-
- if (array[j]->generation < min_generation)
- min_generation = array[j]->generation;
- }
- common = paint_down_to_common(array[i], filled, work,
- min_generation);
- if (array[i]->object.flags & PARENT2)
- redundant[i] = 1;
- for (j = 0; j < filled; j++)
- if (work[j]->object.flags & PARENT1)
- redundant[filled_index[j]] = 1;
- clear_commit_marks(array[i], all_flags);
- clear_commit_marks_many(filled, work, all_flags);
- free_commit_list(common);
- }
-
- /* Now collect the result */
- COPY_ARRAY(work, array, cnt);
- for (i = filled = 0; i < cnt; i++)
- if (!redundant[i])
- array[filled++] = work[i];
- for (j = filled, i = 0; i < cnt; i++)
- if (redundant[i])
- array[j++] = work[i];
- free(work);
- free(redundant);
- free(filled_index);
- return filled;
-}
-
-static struct commit_list *get_merge_bases_many_0(struct commit *one,
- int n,
- struct commit **twos,
- int cleanup)
-{
- struct commit_list *list;
- struct commit **rslt;
- struct commit_list *result;
- int cnt, i;
-
- result = merge_bases_many(one, n, twos);
- for (i = 0; i < n; i++) {
- if (one == twos[i])
- return result;
- }
- if (!result || !result->next) {
- if (cleanup) {
- clear_commit_marks(one, all_flags);
- clear_commit_marks_many(n, twos, all_flags);
- }
- return result;
- }
-
- /* There are more than one */
- cnt = commit_list_count(result);
- rslt = xcalloc(cnt, sizeof(*rslt));
- for (list = result, i = 0; list; list = list->next)
- rslt[i++] = list->item;
- free_commit_list(result);
-
- clear_commit_marks(one, all_flags);
- clear_commit_marks_many(n, twos, all_flags);
-
- cnt = remove_redundant(rslt, cnt);
- result = NULL;
- for (i = 0; i < cnt; i++)
- commit_list_insert_by_date(rslt[i], &result);
- free(rslt);
- return result;
-}
-
-struct commit_list *get_merge_bases_many(struct commit *one,
- int n,
- struct commit **twos)
-{
- return get_merge_bases_many_0(one, n, twos, 1);
-}
-
-struct commit_list *get_merge_bases_many_dirty(struct commit *one,
- int n,
- struct commit **twos)
-{
- return get_merge_bases_many_0(one, n, twos, 0);
-}
-
-struct commit_list *get_merge_bases(struct commit *one, struct commit *two)
-{
- return get_merge_bases_many_0(one, 1, &two, 1);
-}
-
-/*
- * Is "commit" a descendant of one of the elements on the "with_commit" list?
- */
-int is_descendant_of(struct commit *commit, struct commit_list *with_commit)
-{
- if (!with_commit)
- return 1;
- while (with_commit) {
- struct commit *other;
-
- other = with_commit->item;
- with_commit = with_commit->next;
- if (in_merge_bases(other, commit))
- return 1;
- }
- return 0;
-}
-
-/*
- * Is "commit" an ancestor of one of the "references"?
- */
-int in_merge_bases_many(struct commit *commit, int nr_reference, struct commit **reference)
-{
- struct commit_list *bases;
- int ret = 0, i;
- uint32_t min_generation = GENERATION_NUMBER_INFINITY;
-
- if (parse_commit(commit))
- return ret;
- for (i = 0; i < nr_reference; i++) {
- if (parse_commit(reference[i]))
- return ret;
- if (reference[i]->generation < min_generation)
- min_generation = reference[i]->generation;
- }
-
- if (commit->generation > min_generation)
- return ret;
-
- bases = paint_down_to_common(commit, nr_reference, reference, commit->generation);
- if (commit->object.flags & PARENT2)
- ret = 1;
- clear_commit_marks(commit, all_flags);
- clear_commit_marks_many(nr_reference, reference, all_flags);
- free_commit_list(bases);
- return ret;
-}
-
-/*
- * Is "commit" an ancestor of (i.e. reachable from) the "reference"?
- */
-int in_merge_bases(struct commit *commit, struct commit *reference)
-{
- return in_merge_bases_many(commit, 1, &reference);
-}
-
-struct commit_list *reduce_heads(struct commit_list *heads)
-{
- struct commit_list *p;
- struct commit_list *result = NULL, **tail = &result;
- struct commit **array;
- int num_head, i;
-
- if (!heads)
- return NULL;
-
- /* Uniquify */
- for (p = heads; p; p = p->next)
- p->item->object.flags &= ~STALE;
- for (p = heads, num_head = 0; p; p = p->next) {
- if (p->item->object.flags & STALE)
- continue;
- p->item->object.flags |= STALE;
- num_head++;
- }
- array = xcalloc(num_head, sizeof(*array));
- for (p = heads, i = 0; p; p = p->next) {
- if (p->item->object.flags & STALE) {
- array[i++] = p->item;
- p->item->object.flags &= ~STALE;
- }
- }
- num_head = remove_redundant(array, num_head);
- for (i = 0; i < num_head; i++)
- tail = &commit_list_insert(array[i], tail)->next;
- free(array);
- return result;
-}
-
-void reduce_heads_replace(struct commit_list **heads)
-{
- struct commit_list *result = reduce_heads(*heads);
- free_commit_list(*heads);
- *heads = result;
-}
-
static const char gpg_sig_header[] = "gpgsig";
static const int gpg_sig_header_len = sizeof(gpg_sig_header) - 1;
@@ -1784,10 +1426,10 @@ const char *find_commit_header(const char *msg, const char *key, size_t *out_len
* Returns the number of bytes from the tail to ignore, to be fed as
* the second parameter to append_signoff().
*/
-int ignore_non_trailer(const char *buf, size_t len)
+size_t ignore_non_trailer(const char *buf, size_t len)
{
- int boc = 0;
- int bol = 0;
+ size_t boc = 0;
+ size_t bol = 0;
int in_old_conflicts_block = 0;
size_t cutoff = wt_status_locate_end(buf, len);
diff --git a/commit.h b/commit.h
index da0db36..2b1a734 100644
--- a/commit.h
+++ b/commit.h
@@ -204,13 +204,6 @@ struct commit_graft *read_graft_line(struct strbuf *line);
int register_commit_graft(struct repository *r, struct commit_graft *, int);
struct commit_graft *lookup_commit_graft(struct repository *r, const struct object_id *oid);
-extern struct commit_list *get_merge_bases(struct commit *rev1, struct commit *rev2);
-extern struct commit_list *get_merge_bases_many(struct commit *one, int n, struct commit **twos);
-extern struct commit_list *get_octopus_merge_bases(struct commit_list *in);
-
-/* To be used only when object flags after this call no longer matter */
-extern struct commit_list *get_merge_bases_many_dirty(struct commit *one, int n, struct commit **twos);
-
/* largest positive number a signed 32-bit integer can contain */
#define INFINITE_DEPTH 0x7fffffff
@@ -258,32 +251,10 @@ extern int delayed_reachability_test(struct shallow_info *si, int c);
extern void prune_shallow(int show_only);
extern struct trace_key trace_shallow;
-int is_descendant_of(struct commit *, struct commit_list *);
-int in_merge_bases(struct commit *, struct commit *);
-int in_merge_bases_many(struct commit *, int, struct commit **);
-
extern int interactive_add(int argc, const char **argv, const char *prefix, int patch);
extern int run_add_interactive(const char *revision, const char *patch_mode,
const struct pathspec *pathspec);
-/*
- * Takes a list of commits and returns a new list where those
- * have been removed that can be reached from other commits in
- * the list. It is useful for, e.g., reducing the commits
- * randomly thrown at the git-merge command and removing
- * redundant commits that the user shouldn't have given to it.
- *
- * This function destroys the STALE bit of the commit objects'
- * flags.
- */
-extern struct commit_list *reduce_heads(struct commit_list *heads);
-
-/*
- * Like `reduce_heads()`, except it replaces the list. Use this
- * instead of `foo = reduce_heads(foo);` to avoid memory leaks.
- */
-extern void reduce_heads_replace(struct commit_list **heads);
-
struct commit_extra_header {
struct commit_extra_header *next;
char *key;
@@ -322,7 +293,7 @@ extern const char *find_commit_header(const char *msg, const char *key,
size_t *out_len);
/* Find the end of the log message, the right place for a new trailer. */
-extern int ignore_non_trailer(const char *buf, size_t len);
+extern size_t ignore_non_trailer(const char *buf, size_t len);
typedef int (*each_mergetag_fn)(struct commit *commit, struct commit_extra_header *extra,
void *cb_data);
diff --git a/config.mak.uname b/config.mak.uname
index 2be2f19..e47af72 100644
--- a/config.mak.uname
+++ b/config.mak.uname
@@ -192,7 +192,17 @@ ifeq ($(uname_O),Cygwin)
endif
ifeq ($(uname_S),FreeBSD)
NEEDS_LIBICONV = YesPlease
- OLD_ICONV = YesPlease
+ # Versions up to 10.1 require OLD_ICONV; 10.2 and beyond don't.
+ # A typical version string looks like "10.2-RELEASE".
+ ifeq ($(shell expr "$(uname_R)" : '[1-9]\.'),2)
+ OLD_ICONV = YesPlease
+ endif
+ ifeq ($(firstword $(subst -, ,$(uname_R))),10.0)
+ OLD_ICONV = YesPlease
+ endif
+ ifeq ($(firstword $(subst -, ,$(uname_R))),10.1)
+ OLD_ICONV = YesPlease
+ endif
NO_MEMMEM = YesPlease
BASIC_CFLAGS += -I/usr/local/include
BASIC_LDFLAGS += -L/usr/local/lib
diff --git a/delta-islands.c b/delta-islands.c
new file mode 100644
index 0000000..8e5018e
--- /dev/null
+++ b/delta-islands.c
@@ -0,0 +1,502 @@
+#include "cache.h"
+#include "attr.h"
+#include "object.h"
+#include "blob.h"
+#include "commit.h"
+#include "tag.h"
+#include "tree.h"
+#include "delta.h"
+#include "pack.h"
+#include "tree-walk.h"
+#include "diff.h"
+#include "revision.h"
+#include "list-objects.h"
+#include "progress.h"
+#include "refs.h"
+#include "khash.h"
+#include "pack-bitmap.h"
+#include "pack-objects.h"
+#include "delta-islands.h"
+#include "sha1-array.h"
+#include "config.h"
+
+KHASH_INIT(str, const char *, void *, 1, kh_str_hash_func, kh_str_hash_equal)
+
+static khash_sha1 *island_marks;
+static unsigned island_counter;
+static unsigned island_counter_core;
+
+static kh_str_t *remote_islands;
+
+struct remote_island {
+ uint64_t hash;
+ struct oid_array oids;
+};
+
+struct island_bitmap {
+ uint32_t refcount;
+ uint32_t bits[FLEX_ARRAY];
+};
+
+static uint32_t island_bitmap_size;
+
+/*
+ * Allocate a new bitmap; if "old" is not NULL, the new bitmap will be a copy
+ * of "old". Otherwise, the new bitmap is empty.
+ */
+static struct island_bitmap *island_bitmap_new(const struct island_bitmap *old)
+{
+ size_t size = sizeof(struct island_bitmap) + (island_bitmap_size * 4);
+ struct island_bitmap *b = xcalloc(1, size);
+
+ if (old)
+ memcpy(b, old, size);
+
+ b->refcount = 1;
+ return b;
+}
+
+static void island_bitmap_or(struct island_bitmap *a, const struct island_bitmap *b)
+{
+ uint32_t i;
+
+ for (i = 0; i < island_bitmap_size; ++i)
+ a->bits[i] |= b->bits[i];
+}
+
+static int island_bitmap_is_subset(struct island_bitmap *self,
+ struct island_bitmap *super)
+{
+ uint32_t i;
+
+ if (self == super)
+ return 1;
+
+ for (i = 0; i < island_bitmap_size; ++i) {
+ if ((self->bits[i] & super->bits[i]) != self->bits[i])
+ return 0;
+ }
+
+ return 1;
+}
+
+#define ISLAND_BITMAP_BLOCK(x) (x / 32)
+#define ISLAND_BITMAP_MASK(x) (1 << (x % 32))
+
+static void island_bitmap_set(struct island_bitmap *self, uint32_t i)
+{
+ self->bits[ISLAND_BITMAP_BLOCK(i)] |= ISLAND_BITMAP_MASK(i);
+}
+
+static int island_bitmap_get(struct island_bitmap *self, uint32_t i)
+{
+ return (self->bits[ISLAND_BITMAP_BLOCK(i)] & ISLAND_BITMAP_MASK(i)) != 0;
+}
+
+int in_same_island(const struct object_id *trg_oid, const struct object_id *src_oid)
+{
+ khiter_t trg_pos, src_pos;
+
+ /* If we aren't using islands, assume everything goes together. */
+ if (!island_marks)
+ return 1;
+
+ /*
+ * If we don't have a bitmap for the target, we can delta it
+ * against anything -- it's not an important object
+ */
+ trg_pos = kh_get_sha1(island_marks, trg_oid->hash);
+ if (trg_pos >= kh_end(island_marks))
+ return 1;
+
+ /*
+ * if the source (our delta base) doesn't have a bitmap,
+ * we don't want to base any deltas on it!
+ */
+ src_pos = kh_get_sha1(island_marks, src_oid->hash);
+ if (src_pos >= kh_end(island_marks))
+ return 0;
+
+ return island_bitmap_is_subset(kh_value(island_marks, trg_pos),
+ kh_value(island_marks, src_pos));
+}
+
+int island_delta_cmp(const struct object_id *a, const struct object_id *b)
+{
+ khiter_t a_pos, b_pos;
+ struct island_bitmap *a_bitmap = NULL, *b_bitmap = NULL;
+
+ if (!island_marks)
+ return 0;
+
+ a_pos = kh_get_sha1(island_marks, a->hash);
+ if (a_pos < kh_end(island_marks))
+ a_bitmap = kh_value(island_marks, a_pos);
+
+ b_pos = kh_get_sha1(island_marks, b->hash);
+ if (b_pos < kh_end(island_marks))
+ b_bitmap = kh_value(island_marks, b_pos);
+
+ if (a_bitmap) {
+ if (!b_bitmap || !island_bitmap_is_subset(a_bitmap, b_bitmap))
+ return -1;
+ }
+ if (b_bitmap) {
+ if (!a_bitmap || !island_bitmap_is_subset(b_bitmap, a_bitmap))
+ return 1;
+ }
+
+ return 0;
+}
+
+static struct island_bitmap *create_or_get_island_marks(struct object *obj)
+{
+ khiter_t pos;
+ int hash_ret;
+
+ pos = kh_put_sha1(island_marks, obj->oid.hash, &hash_ret);
+ if (hash_ret)
+ kh_value(island_marks, pos) = island_bitmap_new(NULL);
+
+ return kh_value(island_marks, pos);
+}
+
+static void set_island_marks(struct object *obj, struct island_bitmap *marks)
+{
+ struct island_bitmap *b;
+ khiter_t pos;
+ int hash_ret;
+
+ pos = kh_put_sha1(island_marks, obj->oid.hash, &hash_ret);
+ if (hash_ret) {
+ /*
+ * We don't have one yet; make a copy-on-write of the
+ * parent.
+ */
+ marks->refcount++;
+ kh_value(island_marks, pos) = marks;
+ return;
+ }
+
+ /*
+ * We do have it. Make sure we split any copy-on-write before
+ * updating.
+ */
+ b = kh_value(island_marks, pos);
+ if (b->refcount > 1) {
+ b->refcount--;
+ b = kh_value(island_marks, pos) = island_bitmap_new(b);
+ }
+ island_bitmap_or(b, marks);
+}
+
+static void mark_remote_island_1(struct remote_island *rl, int is_core_island)
+{
+ uint32_t i;
+
+ for (i = 0; i < rl->oids.nr; ++i) {
+ struct island_bitmap *marks;
+ struct object *obj = parse_object(the_repository, &rl->oids.oid[i]);
+
+ if (!obj)
+ continue;
+
+ marks = create_or_get_island_marks(obj);
+ island_bitmap_set(marks, island_counter);
+
+ if (is_core_island && obj->type == OBJ_COMMIT)
+ obj->flags |= NEEDS_BITMAP;
+
+ /* If it was a tag, also make sure we hit the underlying object. */
+ while (obj && obj->type == OBJ_TAG) {
+ obj = ((struct tag *)obj)->tagged;
+ if (obj) {
+ parse_object(the_repository, &obj->oid);
+ marks = create_or_get_island_marks(obj);
+ island_bitmap_set(marks, island_counter);
+ }
+ }
+ }
+
+ if (is_core_island)
+ island_counter_core = island_counter;
+
+ island_counter++;
+}
+
+struct tree_islands_todo {
+ struct object_entry *entry;
+ unsigned int depth;
+};
+
+static int tree_depth_compare(const void *a, const void *b)
+{
+ const struct tree_islands_todo *todo_a = a;
+ const struct tree_islands_todo *todo_b = b;
+
+ return todo_a->depth - todo_b->depth;
+}
+
+void resolve_tree_islands(int progress, struct packing_data *to_pack)
+{
+ struct progress *progress_state = NULL;
+ struct tree_islands_todo *todo;
+ int nr = 0;
+ int i;
+
+ if (!island_marks)
+ return;
+
+ /*
+ * We process only trees, as commits and tags have already been handled
+ * (and passed their marks on to root trees, as well. We must make sure
+ * to process them in descending tree-depth order so that marks
+ * propagate down the tree properly, even if a sub-tree is found in
+ * multiple parent trees.
+ */
+ ALLOC_ARRAY(todo, to_pack->nr_objects);
+ for (i = 0; i < to_pack->nr_objects; i++) {
+ if (oe_type(&to_pack->objects[i]) == OBJ_TREE) {
+ todo[nr].entry = &to_pack->objects[i];
+ todo[nr].depth = oe_tree_depth(to_pack, &to_pack->objects[i]);
+ nr++;
+ }
+ }
+ QSORT(todo, nr, tree_depth_compare);
+
+ if (progress)
+ progress_state = start_progress(_("Propagating island marks"), nr);
+
+ for (i = 0; i < nr; i++) {
+ struct object_entry *ent = todo[i].entry;
+ struct island_bitmap *root_marks;
+ struct tree *tree;
+ struct tree_desc desc;
+ struct name_entry entry;
+ khiter_t pos;
+
+ pos = kh_get_sha1(island_marks, ent->idx.oid.hash);
+ if (pos >= kh_end(island_marks))
+ continue;
+
+ root_marks = kh_value(island_marks, pos);
+
+ tree = lookup_tree(the_repository, &ent->idx.oid);
+ if (!tree || parse_tree(tree) < 0)
+ die(_("bad tree object %s"), oid_to_hex(&ent->idx.oid));
+
+ init_tree_desc(&desc, tree->buffer, tree->size);
+ while (tree_entry(&desc, &entry)) {
+ struct object *obj;
+
+ if (S_ISGITLINK(entry.mode))
+ continue;
+
+ obj = lookup_object(the_repository, entry.oid->hash);
+ if (!obj)
+ continue;
+
+ set_island_marks(obj, root_marks);
+ }
+
+ free_tree_buffer(tree);
+
+ display_progress(progress_state, i+1);
+ }
+
+ stop_progress(&progress_state);
+ free(todo);
+}
+
+static regex_t *island_regexes;
+static unsigned int island_regexes_alloc, island_regexes_nr;
+static const char *core_island_name;
+
+static int island_config_callback(const char *k, const char *v, void *cb)
+{
+ if (!strcmp(k, "pack.island")) {
+ struct strbuf re = STRBUF_INIT;
+
+ if (!v)
+ return config_error_nonbool(k);
+
+ ALLOC_GROW(island_regexes, island_regexes_nr + 1, island_regexes_alloc);
+
+ if (*v != '^')
+ strbuf_addch(&re, '^');
+ strbuf_addstr(&re, v);
+
+ if (regcomp(&island_regexes[island_regexes_nr], re.buf, REG_EXTENDED))
+ die(_("failed to load island regex for '%s': %s"), k, re.buf);
+
+ strbuf_release(&re);
+ island_regexes_nr++;
+ return 0;
+ }
+
+ if (!strcmp(k, "pack.islandcore"))
+ return git_config_string(&core_island_name, k, v);
+
+ return 0;
+}
+
+static void add_ref_to_island(const char *island_name, const struct object_id *oid)
+{
+ uint64_t sha_core;
+ struct remote_island *rl = NULL;
+
+ int hash_ret;
+ khiter_t pos = kh_put_str(remote_islands, island_name, &hash_ret);
+
+ if (hash_ret) {
+ kh_key(remote_islands, pos) = xstrdup(island_name);
+ kh_value(remote_islands, pos) = xcalloc(1, sizeof(struct remote_island));
+ }
+
+ rl = kh_value(remote_islands, pos);
+ oid_array_append(&rl->oids, oid);
+
+ memcpy(&sha_core, oid->hash, sizeof(uint64_t));
+ rl->hash += sha_core;
+}
+
+static int find_island_for_ref(const char *refname, const struct object_id *oid,
+ int flags, void *data)
+{
+ /*
+ * We should advertise 'ARRAY_SIZE(matches) - 2' as the max,
+ * so we can diagnose below a config with more capture groups
+ * than we support.
+ */
+ regmatch_t matches[16];
+ int i, m;
+ struct strbuf island_name = STRBUF_INIT;
+
+ /* walk backwards to get last-one-wins ordering */
+ for (i = island_regexes_nr - 1; i >= 0; i--) {
+ if (!regexec(&island_regexes[i], refname,
+ ARRAY_SIZE(matches), matches, 0))
+ break;
+ }
+
+ if (i < 0)
+ return 0;
+
+ if (matches[ARRAY_SIZE(matches) - 1].rm_so != -1)
+ warning(_("island regex from config has "
+ "too many capture groups (max=%d)"),
+ (int)ARRAY_SIZE(matches) - 2);
+
+ for (m = 1; m < ARRAY_SIZE(matches); m++) {
+ regmatch_t *match = &matches[m];
+
+ if (match->rm_so == -1)
+ continue;
+
+ if (island_name.len)
+ strbuf_addch(&island_name, '-');
+
+ strbuf_add(&island_name, refname + match->rm_so, match->rm_eo - match->rm_so);
+ }
+
+ add_ref_to_island(island_name.buf, oid);
+ strbuf_release(&island_name);
+ return 0;
+}
+
+static struct remote_island *get_core_island(void)
+{
+ if (core_island_name) {
+ khiter_t pos = kh_get_str(remote_islands, core_island_name);
+ if (pos < kh_end(remote_islands))
+ return kh_value(remote_islands, pos);
+ }
+
+ return NULL;
+}
+
+static void deduplicate_islands(void)
+{
+ struct remote_island *island, *core = NULL, **list;
+ unsigned int island_count, dst, src, ref, i = 0;
+
+ island_count = kh_size(remote_islands);
+ ALLOC_ARRAY(list, island_count);
+
+ kh_foreach_value(remote_islands, island, {
+ list[i++] = island;
+ });
+
+ for (ref = 0; ref + 1 < island_count; ref++) {
+ for (src = ref + 1, dst = src; src < island_count; src++) {
+ if (list[ref]->hash == list[src]->hash)
+ continue;
+
+ if (src != dst)
+ list[dst] = list[src];
+
+ dst++;
+ }
+ island_count = dst;
+ }
+
+ island_bitmap_size = (island_count / 32) + 1;
+ core = get_core_island();
+
+ for (i = 0; i < island_count; ++i) {
+ mark_remote_island_1(list[i], core && list[i]->hash == core->hash);
+ }
+
+ free(list);
+}
+
+void load_delta_islands(void)
+{
+ island_marks = kh_init_sha1();
+ remote_islands = kh_init_str();
+
+ git_config(island_config_callback, NULL);
+ for_each_ref(find_island_for_ref, NULL);
+ deduplicate_islands();
+
+ fprintf(stderr, _("Marked %d islands, done.\n"), island_counter);
+}
+
+void propagate_island_marks(struct commit *commit)
+{
+ khiter_t pos = kh_get_sha1(island_marks, commit->object.oid.hash);
+
+ if (pos < kh_end(island_marks)) {
+ struct commit_list *p;
+ struct island_bitmap *root_marks = kh_value(island_marks, pos);
+
+ parse_commit(commit);
+ set_island_marks(&get_commit_tree(commit)->object, root_marks);
+ for (p = commit->parents; p; p = p->next)
+ set_island_marks(&p->item->object, root_marks);
+ }
+}
+
+int compute_pack_layers(struct packing_data *to_pack)
+{
+ uint32_t i;
+
+ if (!core_island_name || !island_marks)
+ return 1;
+
+ for (i = 0; i < to_pack->nr_objects; ++i) {
+ struct object_entry *entry = &to_pack->objects[i];
+ khiter_t pos = kh_get_sha1(island_marks, entry->idx.oid.hash);
+
+ oe_set_layer(to_pack, entry, 1);
+
+ if (pos < kh_end(island_marks)) {
+ struct island_bitmap *bitmap = kh_value(island_marks, pos);
+
+ if (island_bitmap_get(bitmap, island_counter_core))
+ oe_set_layer(to_pack, entry, 0);
+ }
+ }
+
+ return 2;
+}
diff --git a/delta-islands.h b/delta-islands.h
new file mode 100644
index 0000000..f972573
--- /dev/null
+++ b/delta-islands.h
@@ -0,0 +1,11 @@
+#ifndef DELTA_ISLANDS_H
+#define DELTA_ISLANDS_H
+
+int island_delta_cmp(const struct object_id *a, const struct object_id *b);
+int in_same_island(const struct object_id *, const struct object_id *);
+void resolve_tree_islands(int progress, struct packing_data *to_pack);
+void load_delta_islands(void);
+void propagate_island_marks(struct commit *commit);
+int compute_pack_layers(struct packing_data *to_pack);
+
+#endif /* DELTA_ISLANDS_H */
diff --git a/diff-lib.c b/diff-lib.c
index 8866b1d..30bf9a2 100644
--- a/diff-lib.c
+++ b/diff-lib.c
@@ -518,11 +518,11 @@ static int diff_cache(struct rev_info *revs,
int run_diff_index(struct rev_info *revs, int cached)
{
struct object_array_entry *ent;
- uint64_t start = getnanotime();
if (revs->pending.nr != 1)
BUG("run_diff_index must be passed exactly one tree");
+ trace_performance_enter();
ent = revs->pending.objects;
if (diff_cache(revs, &ent->item->oid, ent->name, cached))
exit(128);
@@ -531,7 +531,7 @@ int run_diff_index(struct rev_info *revs, int cached)
diffcore_fix_diff_index(&revs->diffopt);
diffcore_std(&revs->diffopt);
diff_flush(&revs->diffopt);
- trace_performance_since(start, "diff-index");
+ trace_performance_leave("diff-index");
return 0;
}
diff --git a/diff.c b/diff.c
index 605ba4b..71ff247 100644
--- a/diff.c
+++ b/diff.c
@@ -624,42 +624,54 @@ static void check_blank_at_eof(mmfile_t *mf1, mmfile_t *mf2,
}
static void emit_line_0(struct diff_options *o,
- const char *set, unsigned reverse, const char *reset,
+ const char *set_sign, const char *set, unsigned reverse, const char *reset,
int first, const char *line, int len)
{
int has_trailing_newline, has_trailing_carriage_return;
- int nofirst;
+ int needs_reset = 0; /* at the end of the line */
FILE *file = o->file;
- if (first)
- fputs(diff_line_prefix(o), file);
- else if (!len)
- return;
+ fputs(diff_line_prefix(o), file);
- if (len == 0) {
- has_trailing_newline = (first == '\n');
- has_trailing_carriage_return = (!has_trailing_newline &&
- (first == '\r'));
- nofirst = has_trailing_newline || has_trailing_carriage_return;
- } else {
- has_trailing_newline = (len > 0 && line[len-1] == '\n');
- if (has_trailing_newline)
- len--;
- has_trailing_carriage_return = (len > 0 && line[len-1] == '\r');
- if (has_trailing_carriage_return)
- len--;
- nofirst = 0;
+ has_trailing_newline = (len > 0 && line[len-1] == '\n');
+ if (has_trailing_newline)
+ len--;
+
+ has_trailing_carriage_return = (len > 0 && line[len-1] == '\r');
+ if (has_trailing_carriage_return)
+ len--;
+
+ if (!len && !first)
+ goto end_of_line;
+
+ if (reverse && want_color(o->use_color)) {
+ fputs(GIT_COLOR_REVERSE, file);
+ needs_reset = 1;
}
- if (len || !nofirst) {
- if (reverse && want_color(o->use_color))
- fputs(GIT_COLOR_REVERSE, file);
+ if (set_sign) {
+ fputs(set_sign, file);
+ needs_reset = 1;
+ }
+
+ if (first)
+ fputc(first, file);
+
+ if (!len)
+ goto end_of_line;
+
+ if (set) {
+ if (set_sign && set != set_sign)
+ fputs(reset, file);
fputs(set, file);
- if (first && !nofirst)
- fputc(first, file);
- fwrite(line, len, 1, file);
- fputs(reset, file);
+ needs_reset = 1;
}
+ fwrite(line, len, 1, file);
+ needs_reset = 1; /* 'line' may contain color codes. */
+
+end_of_line:
+ if (needs_reset)
+ fputs(reset, file);
if (has_trailing_carriage_return)
fputc('\r', file);
if (has_trailing_newline)
@@ -669,7 +681,7 @@ static void emit_line_0(struct diff_options *o,
static void emit_line(struct diff_options *o, const char *set, const char *reset,
const char *line, int len)
{
- emit_line_0(o, set, 0, reset, line[0], line+1, len-1);
+ emit_line_0(o, set, NULL, 0, reset, 0, line, len);
}
enum diff_symbol {
@@ -1187,9 +1199,9 @@ static void dim_moved_lines(struct diff_options *o)
}
static void emit_line_ws_markup(struct diff_options *o,
- const char *set, const char *reset,
- const char *line, int len,
- const char *set_sign, char sign,
+ const char *set_sign, const char *set,
+ const char *reset,
+ char sign, const char *line, int len,
unsigned ws_rule, int blank_at_eof)
{
const char *ws = NULL;
@@ -1201,18 +1213,15 @@ static void emit_line_ws_markup(struct diff_options *o,
}
if (!ws && !set_sign)
- emit_line_0(o, set, 0, reset, sign, line, len);
+ emit_line_0(o, set, NULL, 0, reset, sign, line, len);
else if (!ws) {
- /* Emit just the prefix, then the rest. */
- emit_line_0(o, set_sign ? set_sign : set, !!set_sign, reset,
- sign, "", 0);
- emit_line_0(o, set, 0, reset, 0, line, len);
+ emit_line_0(o, set_sign, set, !!set_sign, reset, sign, line, len);
} else if (blank_at_eof)
/* Blank line at EOF - paint '+' as well */
- emit_line_0(o, ws, 0, reset, sign, line, len);
+ emit_line_0(o, ws, NULL, 0, reset, sign, line, len);
else {
/* Emit just the prefix, then the rest. */
- emit_line_0(o, set_sign ? set_sign : set, !!set_sign, reset,
+ emit_line_0(o, set_sign ? set_sign : set, NULL, !!set_sign, reset,
sign, "", 0);
ws_check_emit(line, len, ws_rule,
o->file, set, reset, ws);
@@ -1236,7 +1245,7 @@ static void emit_diff_symbol_from_struct(struct diff_options *o,
context = diff_get_color_opt(o, DIFF_CONTEXT);
reset = diff_get_color_opt(o, DIFF_RESET);
putc('\n', o->file);
- emit_line_0(o, context, 0, reset, '\\',
+ emit_line_0(o, context, NULL, 0, reset, '\\',
nneof, strlen(nneof));
break;
case DIFF_SYMBOL_SUBMODULE_HEADER:
@@ -1274,7 +1283,9 @@ static void emit_diff_symbol_from_struct(struct diff_options *o,
else if (c == '-')
set = diff_get_color_opt(o, DIFF_FILE_OLD);
}
- emit_line_ws_markup(o, set, reset, line, len, set_sign, ' ',
+ emit_line_ws_markup(o, set_sign, set, reset,
+ o->output_indicators[OUTPUT_INDICATOR_CONTEXT],
+ line, len,
flags & (DIFF_SYMBOL_CONTENT_WS_MASK), 0);
break;
case DIFF_SYMBOL_PLUS:
@@ -1317,7 +1328,9 @@ static void emit_diff_symbol_from_struct(struct diff_options *o,
set = diff_get_color_opt(o, DIFF_CONTEXT_BOLD);
flags &= ~DIFF_SYMBOL_CONTENT_WS_MASK;
}
- emit_line_ws_markup(o, set, reset, line, len, set_sign, '+',
+ emit_line_ws_markup(o, set_sign, set, reset,
+ o->output_indicators[OUTPUT_INDICATOR_NEW],
+ line, len,
flags & DIFF_SYMBOL_CONTENT_WS_MASK,
flags & DIFF_SYMBOL_CONTENT_BLANK_LINE_EOF);
break;
@@ -1360,7 +1373,9 @@ static void emit_diff_symbol_from_struct(struct diff_options *o,
else
set = diff_get_color_opt(o, DIFF_CONTEXT_DIM);
}
- emit_line_ws_markup(o, set, reset, line, len, set_sign, '-',
+ emit_line_ws_markup(o, set_sign, set, reset,
+ o->output_indicators[OUTPUT_INDICATOR_OLD],
+ line, len,
flags & DIFF_SYMBOL_CONTENT_WS_MASK, 0);
break;
case DIFF_SYMBOL_WORDS_PORCELAIN:
@@ -4370,6 +4385,9 @@ void diff_setup(struct diff_options *options)
options->file = stdout;
+ options->output_indicators[OUTPUT_INDICATOR_NEW] = '+';
+ options->output_indicators[OUTPUT_INDICATOR_OLD] = '-';
+ options->output_indicators[OUTPUT_INDICATOR_CONTEXT] = ' ';
options->abbrev = DEFAULT_ABBREV;
options->line_termination = '\n';
options->break_opt = -1;
@@ -4847,6 +4865,12 @@ int diff_opt_parse(struct diff_options *options,
options->output_format |= DIFF_FORMAT_DIFFSTAT;
} else if (!strcmp(arg, "--no-compact-summary"))
options->flags.stat_with_summary = 0;
+ else if (skip_prefix(arg, "--output-indicator-new=", &arg))
+ options->output_indicators[OUTPUT_INDICATOR_NEW] = arg[0];
+ else if (skip_prefix(arg, "--output-indicator-old=", &arg))
+ options->output_indicators[OUTPUT_INDICATOR_OLD] = arg[0];
+ else if (skip_prefix(arg, "--output-indicator-context=", &arg))
+ options->output_indicators[OUTPUT_INDICATOR_CONTEXT] = arg[0];
/* renames options */
else if (starts_with(arg, "-B") ||
diff --git a/diff.h b/diff.h
index 89544e6..a30cc35 100644
--- a/diff.h
+++ b/diff.h
@@ -194,6 +194,11 @@ struct diff_options {
FILE *file;
int close_file;
+#define OUTPUT_INDICATOR_NEW 0
+#define OUTPUT_INDICATOR_OLD 1
+#define OUTPUT_INDICATOR_CONTEXT 2
+ char output_indicators[3];
+
struct pathspec pathspec;
pathchange_fn_t pathchange;
change_fn_t change;
diff --git a/dir.c b/dir.c
index 8ee9fe8..47c2fca 100644
--- a/dir.c
+++ b/dir.c
@@ -2268,10 +2268,13 @@ int read_directory(struct dir_struct *dir, struct index_state *istate,
const char *path, int len, const struct pathspec *pathspec)
{
struct untracked_cache_dir *untracked;
- uint64_t start = getnanotime();
- if (has_symlink_leading_path(path, len))
+ trace_performance_enter();
+
+ if (has_symlink_leading_path(path, len)) {
+ trace_performance_leave("read directory %.*s", len, path);
return dir->nr;
+ }
untracked = validate_untracked_cache(dir, len, pathspec);
if (!untracked)
@@ -2307,7 +2310,7 @@ int read_directory(struct dir_struct *dir, struct index_state *istate,
dir->nr = i;
}
- trace_performance_since(start, "read directory %.*s", len, path);
+ trace_performance_leave("read directory %.*s", len, path);
if (dir->untracked) {
static int force_untracked_cache = -1;
static struct trace_key trace_untracked_stats = TRACE_KEY_INIT(UNTRACKED_STATS);
diff --git a/entry.c b/entry.c
index 2a2ab6c..5d136c5 100644
--- a/entry.c
+++ b/entry.c
@@ -399,6 +399,34 @@ static int check_path(const char *path, int len, struct stat *st, int skiplen)
return lstat(path, st);
}
+static void mark_colliding_entries(const struct checkout *state,
+ struct cache_entry *ce, struct stat *st)
+{
+ int i, trust_ino = check_stat;
+
+#if defined(GIT_WINDOWS_NATIVE)
+ trust_ino = 0;
+#endif
+
+ ce->ce_flags |= CE_MATCHED;
+
+ for (i = 0; i < state->istate->cache_nr; i++) {
+ struct cache_entry *dup = state->istate->cache[i];
+
+ if (dup == ce)
+ break;
+
+ if (dup->ce_flags & (CE_MATCHED | CE_VALID | CE_SKIP_WORKTREE))
+ continue;
+
+ if ((trust_ino && dup->ce_stat_data.sd_ino == st->st_ino) ||
+ (!trust_ino && !fspathcmp(ce->name, dup->name))) {
+ dup->ce_flags |= CE_MATCHED;
+ break;
+ }
+ }
+}
+
/*
* Write the contents from ce out to the working tree.
*
@@ -456,6 +484,9 @@ int checkout_entry(struct cache_entry *ce,
return -1;
}
+ if (state->clone)
+ mark_colliding_entries(state, ce, &st);
+
/*
* We unlink the old file, to get the new one with the
* right permissions (including umask, which is nasty
diff --git a/fast-import.c b/fast-import.c
index 67a53b7..95600c7 100644
--- a/fast-import.c
+++ b/fast-import.c
@@ -171,6 +171,7 @@ Format of STDIN stream:
#include "packfile.h"
#include "object-store.h"
#include "mem-pool.h"
+#include "commit-reach.h"
#define PACK_ID_BITS 16
#define MAX_PACK_ID ((1<<PACK_ID_BITS)-1)
@@ -1068,7 +1069,7 @@ static int store_object(
duplicate_count_by_type[type]++;
return 1;
} else if (find_sha1_pack(oid.hash,
- get_packed_git(the_repository))) {
+ get_all_packs(the_repository))) {
e->type = type;
e->pack_id = MAX_PACK_ID;
e->idx.offset = 1; /* just not zero! */
@@ -1266,7 +1267,7 @@ static void stream_blob(uintmax_t len, struct object_id *oidout, uintmax_t mark)
truncate_pack(&checkpoint);
} else if (find_sha1_pack(oid.hash,
- get_packed_git(the_repository))) {
+ get_all_packs(the_repository))) {
e->type = OBJ_BLOB;
e->pack_id = MAX_PACK_ID;
e->idx.offset = 1; /* just not zero! */
diff --git a/git-submodule.sh b/git-submodule.sh
index f7fd803..1b568e2 100755
--- a/git-submodule.sh
+++ b/git-submodule.sh
@@ -534,31 +534,19 @@ cmd_update()
"$@" || echo "#unmatched" $?
} | {
err=
- while read -r mode sha1 stage just_cloned sm_path
+ while read -r quickabort sha1 just_cloned sm_path
do
- die_if_unmatched "$mode" "$sha1"
+ die_if_unmatched "$quickabort" "$sha1"
- name=$(git submodule--helper name "$sm_path") || exit
- if ! test -z "$update"
- then
- update_module=$update
- else
- update_module=$(git config submodule."$name".update)
- if test -z "$update_module"
- then
- update_module="checkout"
- fi
- fi
+ git submodule--helper ensure-core-worktree "$sm_path"
+
+ update_module=$(git submodule--helper update-module-mode $just_cloned "$sm_path" $update)
displaypath=$(git submodule--helper relative-path "$prefix$sm_path" "$wt_prefix")
if test $just_cloned -eq 1
then
subsha1=
- case "$update_module" in
- merge | rebase | none)
- update_module=checkout ;;
- esac
else
subsha1=$(sanitize_submodule_env; cd "$sm_path" &&
git rev-parse --verify HEAD) ||
@@ -580,11 +568,6 @@ cmd_update()
die "$(eval_gettext "Unable to find current \${remote_name}/\${branch} revision in submodule path '\$sm_path'")"
fi
- if ! $(git config -f "$(git rev-parse --git-common-dir)/modules/$name/config" core.worktree) 2>/dev/null
- then
- git submodule--helper connect-gitdir-workingtree "$name" "$sm_path"
- fi
-
if test "$subsha1" != "$sha1" || test -n "$force"
then
subforce=$force
@@ -635,7 +618,7 @@ cmd_update()
must_die_on_failure=yes
;;
*)
- die "$(eval_gettext "Invalid update mode '$update_module' for submodule '$name'")"
+ die "$(eval_gettext "Invalid update mode '$update_module' for submodule path '$path'")"
esac
if (sanitize_submodule_env; cd "$sm_path" && $command "$sha1")
diff --git a/git.c b/git.c
index c27c387..a6f4b44 100644
--- a/git.c
+++ b/git.c
@@ -508,6 +508,7 @@ static struct cmd_struct commands[] = {
{ "merge-tree", cmd_merge_tree, RUN_SETUP | NO_PARSEOPT },
{ "mktag", cmd_mktag, RUN_SETUP | NO_PARSEOPT },
{ "mktree", cmd_mktree, RUN_SETUP },
+ { "multi-pack-index", cmd_multi_pack_index, RUN_SETUP_GENTLY },
{ "mv", cmd_mv, RUN_SETUP | NEED_WORK_TREE },
{ "name-rev", cmd_name_rev, RUN_SETUP },
{ "notes", cmd_notes, RUN_SETUP },
diff --git a/http-backend.c b/http-backend.c
index 88c38c8..9e894f1 100644
--- a/http-backend.c
+++ b/http-backend.c
@@ -353,7 +353,7 @@ static ssize_t get_content_length(void)
ssize_t val = -1;
const char *str = getenv("CONTENT_LENGTH");
- if (str && !git_parse_ssize_t(str, &val))
+ if (str && *str && !git_parse_ssize_t(str, &val))
die("failed to parse CONTENT_LENGTH: %s", str);
return val;
}
@@ -595,13 +595,13 @@ static void get_info_packs(struct strbuf *hdr, char *arg)
size_t cnt = 0;
select_getanyfile(hdr);
- for (p = get_packed_git(the_repository); p; p = p->next) {
+ for (p = get_all_packs(the_repository); p; p = p->next) {
if (p->pack_local)
cnt++;
}
strbuf_grow(&buf, cnt * 53 + 2);
- for (p = get_packed_git(the_repository); p; p = p->next) {
+ for (p = get_all_packs(the_repository); p; p = p->next) {
if (p->pack_local)
strbuf_addf(&buf, "P %s\n", p->pack_name + objdirlen + 6);
}
diff --git a/http-push.c b/http-push.c
index 283495c..1bbb0cd 100644
--- a/http-push.c
+++ b/http-push.c
@@ -14,7 +14,7 @@
#include "argv-array.h"
#include "packfile.h"
#include "object-store.h"
-
+#include "commit-reach.h"
#ifdef EXPAT_NEEDS_XMLPARSE_H
#include <xmlparse.h>
diff --git a/interdiff.c b/interdiff.c
new file mode 100644
index 0000000..c81d680
--- /dev/null
+++ b/interdiff.c
@@ -0,0 +1,28 @@
+#include "cache.h"
+#include "commit.h"
+#include "revision.h"
+#include "interdiff.h"
+
+static struct strbuf *idiff_prefix_cb(struct diff_options *opt, void *data)
+{
+ return data;
+}
+
+void show_interdiff(struct rev_info *rev, int indent)
+{
+ struct diff_options opts;
+ struct strbuf prefix = STRBUF_INIT;
+
+ memcpy(&opts, &rev->diffopt, sizeof(opts));
+ opts.output_format = DIFF_FORMAT_PATCH;
+ opts.output_prefix = idiff_prefix_cb;
+ strbuf_addchars(&prefix, ' ', indent);
+ opts.output_prefix_data = &prefix;
+ diff_setup_done(&opts);
+
+ diff_tree_oid(rev->idiff_oid1, rev->idiff_oid2, "", &opts);
+ diffcore_std(&opts);
+ diff_flush(&opts);
+
+ strbuf_release(&prefix);
+}
diff --git a/interdiff.h b/interdiff.h
new file mode 100644
index 0000000..01c730a
--- /dev/null
+++ b/interdiff.h
@@ -0,0 +1,8 @@
+#ifndef INTERDIFF_H
+#define INTERDIFF_H
+
+struct rev_info;
+
+void show_interdiff(struct rev_info *, int indent);
+
+#endif
diff --git a/log-tree.c b/log-tree.c
index 2edff78..7a83e99 100644
--- a/log-tree.c
+++ b/log-tree.c
@@ -15,6 +15,8 @@
#include "sequencer.h"
#include "line-log.h"
#include "help.h"
+#include "interdiff.h"
+#include "range-diff.h"
static struct decoration name_decoration = { "object names" };
static int decoration_loaded;
@@ -542,6 +544,16 @@ static int show_mergetag(struct rev_info *opt, struct commit *commit)
return for_each_mergetag(show_one_mergetag, commit, opt);
}
+static void next_commentary_block(struct rev_info *opt, struct strbuf *sb)
+{
+ const char *x = opt->shown_dashes ? "\n" : "---\n";
+ if (sb)
+ strbuf_addstr(sb, x);
+ else
+ fputs(x, opt->diffopt.file);
+ opt->shown_dashes = 1;
+}
+
void show_log(struct rev_info *opt)
{
struct strbuf msgbuf = STRBUF_INIT;
@@ -699,10 +711,8 @@ void show_log(struct rev_info *opt)
if ((ctx.fmt != CMIT_FMT_USERFORMAT) &&
ctx.notes_message && *ctx.notes_message) {
- if (cmit_fmt_is_mail(ctx.fmt)) {
- strbuf_addstr(&msgbuf, "---\n");
- opt->shown_dashes = 1;
- }
+ if (cmit_fmt_is_mail(ctx.fmt))
+ next_commentary_block(opt, &msgbuf);
strbuf_addstr(&msgbuf, ctx.notes_message);
}
@@ -729,6 +739,33 @@ void show_log(struct rev_info *opt)
strbuf_release(&msgbuf);
free(ctx.notes_message);
+
+ if (cmit_fmt_is_mail(ctx.fmt) && opt->idiff_oid1) {
+ struct diff_queue_struct dq;
+
+ memcpy(&dq, &diff_queued_diff, sizeof(diff_queued_diff));
+ DIFF_QUEUE_CLEAR(&diff_queued_diff);
+
+ next_commentary_block(opt, NULL);
+ fprintf_ln(opt->diffopt.file, "%s", opt->idiff_title);
+ show_interdiff(opt, 2);
+
+ memcpy(&diff_queued_diff, &dq, sizeof(diff_queued_diff));
+ }
+
+ if (cmit_fmt_is_mail(ctx.fmt) && opt->rdiff1) {
+ struct diff_queue_struct dq;
+
+ memcpy(&dq, &diff_queued_diff, sizeof(diff_queued_diff));
+ DIFF_QUEUE_CLEAR(&diff_queued_diff);
+
+ next_commentary_block(opt, NULL);
+ fprintf_ln(opt->diffopt.file, "%s", opt->rdiff_title);
+ show_range_diff(opt->rdiff1, opt->rdiff2,
+ opt->creation_factor, 1, &opt->diffopt);
+
+ memcpy(&diff_queued_diff, &dq, sizeof(diff_queued_diff));
+ }
}
int log_tree_diff_flush(struct rev_info *opt)
@@ -766,9 +803,10 @@ int log_tree_diff_flush(struct rev_info *opt)
/*
* We may have shown three-dashes line early
- * between notes and the log message, in which
- * case we only want a blank line after the
- * notes without (an extra) three-dashes line.
+ * between generated commentary (notes, etc.)
+ * and the log message, in which case we only
+ * want a blank line after the commentary
+ * without (an extra) three-dashes line.
* Otherwise, we show the three-dashes line if
* we are showing the patch with diffstat, but
* in that case, there is no extra blank line
diff --git a/merge-recursive.c b/merge-recursive.c
index 2904cb8..45a163c 100644
--- a/merge-recursive.c
+++ b/merge-recursive.c
@@ -27,6 +27,7 @@
#include "dir.h"
#include "submodule.h"
#include "revision.h"
+#include "commit-reach.h"
struct path_hashmap_entry {
struct hashmap_entry e;
@@ -2869,12 +2870,19 @@ static int detect_and_process_renames(struct merge_options *o,
head_pairs = get_diffpairs(o, common, head);
merge_pairs = get_diffpairs(o, common, merge);
- dir_re_head = get_directory_renames(head_pairs, head);
- dir_re_merge = get_directory_renames(merge_pairs, merge);
+ if (o->detect_directory_renames) {
+ dir_re_head = get_directory_renames(head_pairs, head);
+ dir_re_merge = get_directory_renames(merge_pairs, merge);
- handle_directory_level_conflicts(o,
- dir_re_head, head,
- dir_re_merge, merge);
+ handle_directory_level_conflicts(o,
+ dir_re_head, head,
+ dir_re_merge, merge);
+ } else {
+ dir_re_head = xmalloc(sizeof(*dir_re_head));
+ dir_re_merge = xmalloc(sizeof(*dir_re_merge));
+ dir_rename_init(dir_re_head);
+ dir_rename_init(dir_re_merge);
+ }
ri->head_renames = get_renames(o, head_pairs,
dir_re_merge, dir_re_head, head,
@@ -3586,6 +3594,7 @@ void init_merge_options(struct merge_options *o)
o->renormalize = 0;
o->diff_detect_rename = -1;
o->merge_detect_rename = -1;
+ o->detect_directory_renames = 1;
merge_recursive_config(o);
merge_verbosity = getenv("GIT_MERGE_VERBOSITY");
if (merge_verbosity)
diff --git a/merge-recursive.h b/merge-recursive.h
index 0c46a5a..e6a0828 100644
--- a/merge-recursive.h
+++ b/merge-recursive.h
@@ -20,6 +20,7 @@ struct merge_options {
unsigned renormalize : 1;
long xdl_opts;
int verbosity;
+ int detect_directory_renames;
int diff_detect_rename;
int merge_detect_rename;
int diff_rename_limit;
diff --git a/midx.c b/midx.c
new file mode 100644
index 0000000..f3e8dbc
--- /dev/null
+++ b/midx.c
@@ -0,0 +1,930 @@
+#include "cache.h"
+#include "config.h"
+#include "csum-file.h"
+#include "dir.h"
+#include "lockfile.h"
+#include "packfile.h"
+#include "object-store.h"
+#include "sha1-lookup.h"
+#include "midx.h"
+
+#define MIDX_SIGNATURE 0x4d494458 /* "MIDX" */
+#define MIDX_VERSION 1
+#define MIDX_BYTE_FILE_VERSION 4
+#define MIDX_BYTE_HASH_VERSION 5
+#define MIDX_BYTE_NUM_CHUNKS 6
+#define MIDX_BYTE_NUM_PACKS 8
+#define MIDX_HASH_VERSION 1
+#define MIDX_HEADER_SIZE 12
+#define MIDX_HASH_LEN 20
+#define MIDX_MIN_SIZE (MIDX_HEADER_SIZE + MIDX_HASH_LEN)
+
+#define MIDX_MAX_CHUNKS 5
+#define MIDX_CHUNK_ALIGNMENT 4
+#define MIDX_CHUNKID_PACKNAMES 0x504e414d /* "PNAM" */
+#define MIDX_CHUNKID_OIDFANOUT 0x4f494446 /* "OIDF" */
+#define MIDX_CHUNKID_OIDLOOKUP 0x4f49444c /* "OIDL" */
+#define MIDX_CHUNKID_OBJECTOFFSETS 0x4f4f4646 /* "OOFF" */
+#define MIDX_CHUNKID_LARGEOFFSETS 0x4c4f4646 /* "LOFF" */
+#define MIDX_CHUNKLOOKUP_WIDTH (sizeof(uint32_t) + sizeof(uint64_t))
+#define MIDX_CHUNK_FANOUT_SIZE (sizeof(uint32_t) * 256)
+#define MIDX_CHUNK_OFFSET_WIDTH (2 * sizeof(uint32_t))
+#define MIDX_CHUNK_LARGE_OFFSET_WIDTH (sizeof(uint64_t))
+#define MIDX_LARGE_OFFSET_NEEDED 0x80000000
+
+static char *get_midx_filename(const char *object_dir)
+{
+ return xstrfmt("%s/pack/multi-pack-index", object_dir);
+}
+
+struct multi_pack_index *load_multi_pack_index(const char *object_dir, int local)
+{
+ struct multi_pack_index *m = NULL;
+ int fd;
+ struct stat st;
+ size_t midx_size;
+ void *midx_map = NULL;
+ uint32_t hash_version;
+ char *midx_name = get_midx_filename(object_dir);
+ uint32_t i;
+ const char *cur_pack_name;
+
+ fd = git_open(midx_name);
+
+ if (fd < 0)
+ goto cleanup_fail;
+ if (fstat(fd, &st)) {
+ error_errno(_("failed to read %s"), midx_name);
+ goto cleanup_fail;
+ }
+
+ midx_size = xsize_t(st.st_size);
+
+ if (midx_size < MIDX_MIN_SIZE) {
+ error(_("multi-pack-index file %s is too small"), midx_name);
+ goto cleanup_fail;
+ }
+
+ FREE_AND_NULL(midx_name);
+
+ midx_map = xmmap(NULL, midx_size, PROT_READ, MAP_PRIVATE, fd, 0);
+
+ FLEX_ALLOC_MEM(m, object_dir, object_dir, strlen(object_dir));
+ m->fd = fd;
+ m->data = midx_map;
+ m->data_len = midx_size;
+ m->local = local;
+
+ m->signature = get_be32(m->data);
+ if (m->signature != MIDX_SIGNATURE) {
+ error(_("multi-pack-index signature 0x%08x does not match signature 0x%08x"),
+ m->signature, MIDX_SIGNATURE);
+ goto cleanup_fail;
+ }
+
+ m->version = m->data[MIDX_BYTE_FILE_VERSION];
+ if (m->version != MIDX_VERSION) {
+ error(_("multi-pack-index version %d not recognized"),
+ m->version);
+ goto cleanup_fail;
+ }
+
+ hash_version = m->data[MIDX_BYTE_HASH_VERSION];
+ if (hash_version != MIDX_HASH_VERSION) {
+ error(_("hash version %u does not match"), hash_version);
+ goto cleanup_fail;
+ }
+ m->hash_len = MIDX_HASH_LEN;
+
+ m->num_chunks = m->data[MIDX_BYTE_NUM_CHUNKS];
+
+ m->num_packs = get_be32(m->data + MIDX_BYTE_NUM_PACKS);
+
+ for (i = 0; i < m->num_chunks; i++) {
+ uint32_t chunk_id = get_be32(m->data + MIDX_HEADER_SIZE +
+ MIDX_CHUNKLOOKUP_WIDTH * i);
+ uint64_t chunk_offset = get_be64(m->data + MIDX_HEADER_SIZE + 4 +
+ MIDX_CHUNKLOOKUP_WIDTH * i);
+
+ switch (chunk_id) {
+ case MIDX_CHUNKID_PACKNAMES:
+ m->chunk_pack_names = m->data + chunk_offset;
+ break;
+
+ case MIDX_CHUNKID_OIDFANOUT:
+ m->chunk_oid_fanout = (uint32_t *)(m->data + chunk_offset);
+ break;
+
+ case MIDX_CHUNKID_OIDLOOKUP:
+ m->chunk_oid_lookup = m->data + chunk_offset;
+ break;
+
+ case MIDX_CHUNKID_OBJECTOFFSETS:
+ m->chunk_object_offsets = m->data + chunk_offset;
+ break;
+
+ case MIDX_CHUNKID_LARGEOFFSETS:
+ m->chunk_large_offsets = m->data + chunk_offset;
+ break;
+
+ case 0:
+ die(_("terminating multi-pack-index chunk id appears earlier than expected"));
+ break;
+
+ default:
+ /*
+ * Do nothing on unrecognized chunks, allowing future
+ * extensions to add optional chunks.
+ */
+ break;
+ }
+ }
+
+ if (!m->chunk_pack_names)
+ die(_("multi-pack-index missing required pack-name chunk"));
+ if (!m->chunk_oid_fanout)
+ die(_("multi-pack-index missing required OID fanout chunk"));
+ if (!m->chunk_oid_lookup)
+ die(_("multi-pack-index missing required OID lookup chunk"));
+ if (!m->chunk_object_offsets)
+ die(_("multi-pack-index missing required object offsets chunk"));
+
+ m->num_objects = ntohl(m->chunk_oid_fanout[255]);
+
+ m->pack_names = xcalloc(m->num_packs, sizeof(*m->pack_names));
+ m->packs = xcalloc(m->num_packs, sizeof(*m->packs));
+
+ cur_pack_name = (const char *)m->chunk_pack_names;
+ for (i = 0; i < m->num_packs; i++) {
+ m->pack_names[i] = cur_pack_name;
+
+ cur_pack_name += strlen(cur_pack_name) + 1;
+
+ if (i && strcmp(m->pack_names[i], m->pack_names[i - 1]) <= 0) {
+ error(_("multi-pack-index pack names out of order: '%s' before '%s'"),
+ m->pack_names[i - 1],
+ m->pack_names[i]);
+ goto cleanup_fail;
+ }
+ }
+
+ return m;
+
+cleanup_fail:
+ free(m);
+ free(midx_name);
+ if (midx_map)
+ munmap(midx_map, midx_size);
+ if (0 <= fd)
+ close(fd);
+ return NULL;
+}
+
+static void close_midx(struct multi_pack_index *m)
+{
+ uint32_t i;
+ munmap((unsigned char *)m->data, m->data_len);
+ close(m->fd);
+ m->fd = -1;
+
+ for (i = 0; i < m->num_packs; i++) {
+ if (m->packs[i]) {
+ close_pack(m->packs[i]);
+ free(m->packs);
+ }
+ }
+ FREE_AND_NULL(m->packs);
+ FREE_AND_NULL(m->pack_names);
+}
+
+int prepare_midx_pack(struct multi_pack_index *m, uint32_t pack_int_id)
+{
+ struct strbuf pack_name = STRBUF_INIT;
+
+ if (pack_int_id >= m->num_packs)
+ BUG("bad pack-int-id");
+
+ if (m->packs[pack_int_id])
+ return 0;
+
+ strbuf_addf(&pack_name, "%s/pack/%s", m->object_dir,
+ m->pack_names[pack_int_id]);
+
+ m->packs[pack_int_id] = add_packed_git(pack_name.buf, pack_name.len, m->local);
+ strbuf_release(&pack_name);
+ return !m->packs[pack_int_id];
+}
+
+int bsearch_midx(const struct object_id *oid, struct multi_pack_index *m, uint32_t *result)
+{
+ return bsearch_hash(oid->hash, m->chunk_oid_fanout, m->chunk_oid_lookup,
+ MIDX_HASH_LEN, result);
+}
+
+struct object_id *nth_midxed_object_oid(struct object_id *oid,
+ struct multi_pack_index *m,
+ uint32_t n)
+{
+ if (n >= m->num_objects)
+ return NULL;
+
+ hashcpy(oid->hash, m->chunk_oid_lookup + m->hash_len * n);
+ return oid;
+}
+
+static off_t nth_midxed_offset(struct multi_pack_index *m, uint32_t pos)
+{
+ const unsigned char *offset_data;
+ uint32_t offset32;
+
+ offset_data = m->chunk_object_offsets + pos * MIDX_CHUNK_OFFSET_WIDTH;
+ offset32 = get_be32(offset_data + sizeof(uint32_t));
+
+ if (m->chunk_large_offsets && offset32 & MIDX_LARGE_OFFSET_NEEDED) {
+ if (sizeof(offset32) < sizeof(uint64_t))
+ die(_("multi-pack-index stores a 64-bit offset, but off_t is too small"));
+
+ offset32 ^= MIDX_LARGE_OFFSET_NEEDED;
+ return get_be64(m->chunk_large_offsets + sizeof(uint64_t) * offset32);
+ }
+
+ return offset32;
+}
+
+static uint32_t nth_midxed_pack_int_id(struct multi_pack_index *m, uint32_t pos)
+{
+ return get_be32(m->chunk_object_offsets + pos * MIDX_CHUNK_OFFSET_WIDTH);
+}
+
+static int nth_midxed_pack_entry(struct multi_pack_index *m, struct pack_entry *e, uint32_t pos)
+{
+ uint32_t pack_int_id;
+ struct packed_git *p;
+
+ if (pos >= m->num_objects)
+ return 0;
+
+ pack_int_id = nth_midxed_pack_int_id(m, pos);
+
+ if (prepare_midx_pack(m, pack_int_id))
+ die(_("error preparing packfile from multi-pack-index"));
+ p = m->packs[pack_int_id];
+
+ /*
+ * We are about to tell the caller where they can locate the
+ * requested object. We better make sure the packfile is
+ * still here and can be accessed before supplying that
+ * answer, as it may have been deleted since the MIDX was
+ * loaded!
+ */
+ if (!is_pack_valid(p))
+ return 0;
+
+ if (p->num_bad_objects) {
+ uint32_t i;
+ struct object_id oid;
+ nth_midxed_object_oid(&oid, m, pos);
+ for (i = 0; i < p->num_bad_objects; i++)
+ if (!hashcmp(oid.hash,
+ p->bad_object_sha1 + the_hash_algo->rawsz * i))
+ return 0;
+ }
+
+ e->offset = nth_midxed_offset(m, pos);
+ e->p = p;
+
+ return 1;
+}
+
+int fill_midx_entry(const struct object_id *oid, struct pack_entry *e, struct multi_pack_index *m)
+{
+ uint32_t pos;
+
+ if (!bsearch_midx(oid, m, &pos))
+ return 0;
+
+ return nth_midxed_pack_entry(m, e, pos);
+}
+
+int midx_contains_pack(struct multi_pack_index *m, const char *idx_name)
+{
+ uint32_t first = 0, last = m->num_packs;
+
+ while (first < last) {
+ uint32_t mid = first + (last - first) / 2;
+ const char *current;
+ int cmp;
+
+ current = m->pack_names[mid];
+ cmp = strcmp(idx_name, current);
+ if (!cmp)
+ return 1;
+ if (cmp > 0) {
+ first = mid + 1;
+ continue;
+ }
+ last = mid;
+ }
+
+ return 0;
+}
+
+int prepare_multi_pack_index_one(struct repository *r, const char *object_dir, int local)
+{
+ struct multi_pack_index *m;
+ struct multi_pack_index *m_search;
+ int config_value;
+
+ if (repo_config_get_bool(r, "core.multipackindex", &config_value) ||
+ !config_value)
+ return 0;
+
+ for (m_search = r->objects->multi_pack_index; m_search; m_search = m_search->next)
+ if (!strcmp(object_dir, m_search->object_dir))
+ return 1;
+
+ m = load_multi_pack_index(object_dir, local);
+
+ if (m) {
+ m->next = r->objects->multi_pack_index;
+ r->objects->multi_pack_index = m;
+ return 1;
+ }
+
+ return 0;
+}
+
+static size_t write_midx_header(struct hashfile *f,
+ unsigned char num_chunks,
+ uint32_t num_packs)
+{
+ unsigned char byte_values[4];
+
+ hashwrite_be32(f, MIDX_SIGNATURE);
+ byte_values[0] = MIDX_VERSION;
+ byte_values[1] = MIDX_HASH_VERSION;
+ byte_values[2] = num_chunks;
+ byte_values[3] = 0; /* unused */
+ hashwrite(f, byte_values, sizeof(byte_values));
+ hashwrite_be32(f, num_packs);
+
+ return MIDX_HEADER_SIZE;
+}
+
+struct pack_list {
+ struct packed_git **list;
+ char **names;
+ uint32_t nr;
+ uint32_t alloc_list;
+ uint32_t alloc_names;
+ size_t pack_name_concat_len;
+ struct multi_pack_index *m;
+};
+
+static void add_pack_to_midx(const char *full_path, size_t full_path_len,
+ const char *file_name, void *data)
+{
+ struct pack_list *packs = (struct pack_list *)data;
+
+ if (ends_with(file_name, ".idx")) {
+ if (packs->m && midx_contains_pack(packs->m, file_name))
+ return;
+
+ ALLOC_GROW(packs->list, packs->nr + 1, packs->alloc_list);
+ ALLOC_GROW(packs->names, packs->nr + 1, packs->alloc_names);
+
+ packs->list[packs->nr] = add_packed_git(full_path,
+ full_path_len,
+ 0);
+
+ if (!packs->list[packs->nr]) {
+ warning(_("failed to add packfile '%s'"),
+ full_path);
+ return;
+ }
+
+ if (open_pack_index(packs->list[packs->nr])) {
+ warning(_("failed to open pack-index '%s'"),
+ full_path);
+ close_pack(packs->list[packs->nr]);
+ FREE_AND_NULL(packs->list[packs->nr]);
+ return;
+ }
+
+ packs->names[packs->nr] = xstrdup(file_name);
+ packs->pack_name_concat_len += strlen(file_name) + 1;
+ packs->nr++;
+ }
+}
+
+struct pack_pair {
+ uint32_t pack_int_id;
+ char *pack_name;
+};
+
+static int pack_pair_compare(const void *_a, const void *_b)
+{
+ struct pack_pair *a = (struct pack_pair *)_a;
+ struct pack_pair *b = (struct pack_pair *)_b;
+ return strcmp(a->pack_name, b->pack_name);
+}
+
+static void sort_packs_by_name(char **pack_names, uint32_t nr_packs, uint32_t *perm)
+{
+ uint32_t i;
+ struct pack_pair *pairs;
+
+ ALLOC_ARRAY(pairs, nr_packs);
+
+ for (i = 0; i < nr_packs; i++) {
+ pairs[i].pack_int_id = i;
+ pairs[i].pack_name = pack_names[i];
+ }
+
+ QSORT(pairs, nr_packs, pack_pair_compare);
+
+ for (i = 0; i < nr_packs; i++) {
+ pack_names[i] = pairs[i].pack_name;
+ perm[pairs[i].pack_int_id] = i;
+ }
+
+ free(pairs);
+}
+
+struct pack_midx_entry {
+ struct object_id oid;
+ uint32_t pack_int_id;
+ time_t pack_mtime;
+ uint64_t offset;
+};
+
+static int midx_oid_compare(const void *_a, const void *_b)
+{
+ const struct pack_midx_entry *a = (const struct pack_midx_entry *)_a;
+ const struct pack_midx_entry *b = (const struct pack_midx_entry *)_b;
+ int cmp = oidcmp(&a->oid, &b->oid);
+
+ if (cmp)
+ return cmp;
+
+ if (a->pack_mtime > b->pack_mtime)
+ return -1;
+ else if (a->pack_mtime < b->pack_mtime)
+ return 1;
+
+ return a->pack_int_id - b->pack_int_id;
+}
+
+static int nth_midxed_pack_midx_entry(struct multi_pack_index *m,
+ uint32_t *pack_perm,
+ struct pack_midx_entry *e,
+ uint32_t pos)
+{
+ if (pos >= m->num_objects)
+ return 1;
+
+ nth_midxed_object_oid(&e->oid, m, pos);
+ e->pack_int_id = pack_perm[nth_midxed_pack_int_id(m, pos)];
+ e->offset = nth_midxed_offset(m, pos);
+
+ /* consider objects in midx to be from "old" packs */
+ e->pack_mtime = 0;
+ return 0;
+}
+
+static void fill_pack_entry(uint32_t pack_int_id,
+ struct packed_git *p,
+ uint32_t cur_object,
+ struct pack_midx_entry *entry)
+{
+ if (!nth_packed_object_oid(&entry->oid, p, cur_object))
+ die(_("failed to locate object %d in packfile"), cur_object);
+
+ entry->pack_int_id = pack_int_id;
+ entry->pack_mtime = p->mtime;
+
+ entry->offset = nth_packed_object_offset(p, cur_object);
+}
+
+/*
+ * It is possible to artificially get into a state where there are many
+ * duplicate copies of objects. That can create high memory pressure if
+ * we are to create a list of all objects before de-duplication. To reduce
+ * this memory pressure without a significant performance drop, automatically
+ * group objects by the first byte of their object id. Use the IDX fanout
+ * tables to group the data, copy to a local array, then sort.
+ *
+ * Copy only the de-duplicated entries (selected by most-recent modified time
+ * of a packfile containing the object).
+ */
+static struct pack_midx_entry *get_sorted_entries(struct multi_pack_index *m,
+ struct packed_git **p,
+ uint32_t *perm,
+ uint32_t nr_packs,
+ uint32_t *nr_objects)
+{
+ uint32_t cur_fanout, cur_pack, cur_object;
+ uint32_t alloc_fanout, alloc_objects, total_objects = 0;
+ struct pack_midx_entry *entries_by_fanout = NULL;
+ struct pack_midx_entry *deduplicated_entries = NULL;
+ uint32_t start_pack = m ? m->num_packs : 0;
+
+ for (cur_pack = start_pack; cur_pack < nr_packs; cur_pack++)
+ total_objects += p[cur_pack]->num_objects;
+
+ /*
+ * As we de-duplicate by fanout value, we expect the fanout
+ * slices to be evenly distributed, with some noise. Hence,
+ * allocate slightly more than one 256th.
+ */
+ alloc_objects = alloc_fanout = total_objects > 3200 ? total_objects / 200 : 16;
+
+ ALLOC_ARRAY(entries_by_fanout, alloc_fanout);
+ ALLOC_ARRAY(deduplicated_entries, alloc_objects);
+ *nr_objects = 0;
+
+ for (cur_fanout = 0; cur_fanout < 256; cur_fanout++) {
+ uint32_t nr_fanout = 0;
+
+ if (m) {
+ uint32_t start = 0, end;
+
+ if (cur_fanout)
+ start = ntohl(m->chunk_oid_fanout[cur_fanout - 1]);
+ end = ntohl(m->chunk_oid_fanout[cur_fanout]);
+
+ for (cur_object = start; cur_object < end; cur_object++) {
+ ALLOC_GROW(entries_by_fanout, nr_fanout + 1, alloc_fanout);
+ nth_midxed_pack_midx_entry(m, perm,
+ &entries_by_fanout[nr_fanout],
+ cur_object);
+ nr_fanout++;
+ }
+ }
+
+ for (cur_pack = start_pack; cur_pack < nr_packs; cur_pack++) {
+ uint32_t start = 0, end;
+
+ if (cur_fanout)
+ start = get_pack_fanout(p[cur_pack], cur_fanout - 1);
+ end = get_pack_fanout(p[cur_pack], cur_fanout);
+
+ for (cur_object = start; cur_object < end; cur_object++) {
+ ALLOC_GROW(entries_by_fanout, nr_fanout + 1, alloc_fanout);
+ fill_pack_entry(perm[cur_pack], p[cur_pack], cur_object, &entries_by_fanout[nr_fanout]);
+ nr_fanout++;
+ }
+ }
+
+ QSORT(entries_by_fanout, nr_fanout, midx_oid_compare);
+
+ /*
+ * The batch is now sorted by OID and then mtime (descending).
+ * Take only the first duplicate.
+ */
+ for (cur_object = 0; cur_object < nr_fanout; cur_object++) {
+ if (cur_object && !oidcmp(&entries_by_fanout[cur_object - 1].oid,
+ &entries_by_fanout[cur_object].oid))
+ continue;
+
+ ALLOC_GROW(deduplicated_entries, *nr_objects + 1, alloc_objects);
+ memcpy(&deduplicated_entries[*nr_objects],
+ &entries_by_fanout[cur_object],
+ sizeof(struct pack_midx_entry));
+ (*nr_objects)++;
+ }
+ }
+
+ free(entries_by_fanout);
+ return deduplicated_entries;
+}
+
+static size_t write_midx_pack_names(struct hashfile *f,
+ char **pack_names,
+ uint32_t num_packs)
+{
+ uint32_t i;
+ unsigned char padding[MIDX_CHUNK_ALIGNMENT];
+ size_t written = 0;
+
+ for (i = 0; i < num_packs; i++) {
+ size_t writelen = strlen(pack_names[i]) + 1;
+
+ if (i && strcmp(pack_names[i], pack_names[i - 1]) <= 0)
+ BUG("incorrect pack-file order: %s before %s",
+ pack_names[i - 1],
+ pack_names[i]);
+
+ hashwrite(f, pack_names[i], writelen);
+ written += writelen;
+ }
+
+ /* add padding to be aligned */
+ i = MIDX_CHUNK_ALIGNMENT - (written % MIDX_CHUNK_ALIGNMENT);
+ if (i < MIDX_CHUNK_ALIGNMENT) {
+ memset(padding, 0, sizeof(padding));
+ hashwrite(f, padding, i);
+ written += i;
+ }
+
+ return written;
+}
+
+static size_t write_midx_oid_fanout(struct hashfile *f,
+ struct pack_midx_entry *objects,
+ uint32_t nr_objects)
+{
+ struct pack_midx_entry *list = objects;
+ struct pack_midx_entry *last = objects + nr_objects;
+ uint32_t count = 0;
+ uint32_t i;
+
+ /*
+ * Write the first-level table (the list is sorted,
+ * but we use a 256-entry lookup to be able to avoid
+ * having to do eight extra binary search iterations).
+ */
+ for (i = 0; i < 256; i++) {
+ struct pack_midx_entry *next = list;
+
+ while (next < last && next->oid.hash[0] == i) {
+ count++;
+ next++;
+ }
+
+ hashwrite_be32(f, count);
+ list = next;
+ }
+
+ return MIDX_CHUNK_FANOUT_SIZE;
+}
+
+static size_t write_midx_oid_lookup(struct hashfile *f, unsigned char hash_len,
+ struct pack_midx_entry *objects,
+ uint32_t nr_objects)
+{
+ struct pack_midx_entry *list = objects;
+ uint32_t i;
+ size_t written = 0;
+
+ for (i = 0; i < nr_objects; i++) {
+ struct pack_midx_entry *obj = list++;
+
+ if (i < nr_objects - 1) {
+ struct pack_midx_entry *next = list;
+ if (oidcmp(&obj->oid, &next->oid) >= 0)
+ BUG("OIDs not in order: %s >= %s",
+ oid_to_hex(&obj->oid),
+ oid_to_hex(&next->oid));
+ }
+
+ hashwrite(f, obj->oid.hash, (int)hash_len);
+ written += hash_len;
+ }
+
+ return written;
+}
+
+static size_t write_midx_object_offsets(struct hashfile *f, int large_offset_needed,
+ struct pack_midx_entry *objects, uint32_t nr_objects)
+{
+ struct pack_midx_entry *list = objects;
+ uint32_t i, nr_large_offset = 0;
+ size_t written = 0;
+
+ for (i = 0; i < nr_objects; i++) {
+ struct pack_midx_entry *obj = list++;
+
+ hashwrite_be32(f, obj->pack_int_id);
+
+ if (large_offset_needed && obj->offset >> 31)
+ hashwrite_be32(f, MIDX_LARGE_OFFSET_NEEDED | nr_large_offset++);
+ else if (!large_offset_needed && obj->offset >> 32)
+ BUG("object %s requires a large offset (%"PRIx64") but the MIDX is not writing large offsets!",
+ oid_to_hex(&obj->oid),
+ obj->offset);
+ else
+ hashwrite_be32(f, (uint32_t)obj->offset);
+
+ written += MIDX_CHUNK_OFFSET_WIDTH;
+ }
+
+ return written;
+}
+
+static size_t write_midx_large_offsets(struct hashfile *f, uint32_t nr_large_offset,
+ struct pack_midx_entry *objects, uint32_t nr_objects)
+{
+ struct pack_midx_entry *list = objects;
+ size_t written = 0;
+
+ while (nr_large_offset) {
+ struct pack_midx_entry *obj = list++;
+ uint64_t offset = obj->offset;
+
+ if (!(offset >> 31))
+ continue;
+
+ hashwrite_be32(f, offset >> 32);
+ hashwrite_be32(f, offset & 0xffffffffUL);
+ written += 2 * sizeof(uint32_t);
+
+ nr_large_offset--;
+ }
+
+ return written;
+}
+
+int write_midx_file(const char *object_dir)
+{
+ unsigned char cur_chunk, num_chunks = 0;
+ char *midx_name;
+ uint32_t i;
+ struct hashfile *f = NULL;
+ struct lock_file lk;
+ struct pack_list packs;
+ uint32_t *pack_perm = NULL;
+ uint64_t written = 0;
+ uint32_t chunk_ids[MIDX_MAX_CHUNKS + 1];
+ uint64_t chunk_offsets[MIDX_MAX_CHUNKS + 1];
+ uint32_t nr_entries, num_large_offsets = 0;
+ struct pack_midx_entry *entries = NULL;
+ int large_offsets_needed = 0;
+
+ midx_name = get_midx_filename(object_dir);
+ if (safe_create_leading_directories(midx_name)) {
+ UNLEAK(midx_name);
+ die_errno(_("unable to create leading directories of %s"),
+ midx_name);
+ }
+
+ packs.m = load_multi_pack_index(object_dir, 1);
+
+ packs.nr = 0;
+ packs.alloc_list = packs.m ? packs.m->num_packs : 16;
+ packs.alloc_names = packs.alloc_list;
+ packs.list = NULL;
+ packs.names = NULL;
+ packs.pack_name_concat_len = 0;
+ ALLOC_ARRAY(packs.list, packs.alloc_list);
+ ALLOC_ARRAY(packs.names, packs.alloc_names);
+
+ if (packs.m) {
+ for (i = 0; i < packs.m->num_packs; i++) {
+ ALLOC_GROW(packs.list, packs.nr + 1, packs.alloc_list);
+ ALLOC_GROW(packs.names, packs.nr + 1, packs.alloc_names);
+
+ packs.list[packs.nr] = NULL;
+ packs.names[packs.nr] = xstrdup(packs.m->pack_names[i]);
+ packs.pack_name_concat_len += strlen(packs.names[packs.nr]) + 1;
+ packs.nr++;
+ }
+ }
+
+ for_each_file_in_pack_dir(object_dir, add_pack_to_midx, &packs);
+
+ if (packs.m && packs.nr == packs.m->num_packs)
+ goto cleanup;
+
+ if (packs.pack_name_concat_len % MIDX_CHUNK_ALIGNMENT)
+ packs.pack_name_concat_len += MIDX_CHUNK_ALIGNMENT -
+ (packs.pack_name_concat_len % MIDX_CHUNK_ALIGNMENT);
+
+ ALLOC_ARRAY(pack_perm, packs.nr);
+ sort_packs_by_name(packs.names, packs.nr, pack_perm);
+
+ entries = get_sorted_entries(packs.m, packs.list, pack_perm, packs.nr, &nr_entries);
+
+ for (i = 0; i < nr_entries; i++) {
+ if (entries[i].offset > 0x7fffffff)
+ num_large_offsets++;
+ if (entries[i].offset > 0xffffffff)
+ large_offsets_needed = 1;
+ }
+
+ hold_lock_file_for_update(&lk, midx_name, LOCK_DIE_ON_ERROR);
+ f = hashfd(lk.tempfile->fd, lk.tempfile->filename.buf);
+ FREE_AND_NULL(midx_name);
+
+ if (packs.m)
+ close_midx(packs.m);
+
+ cur_chunk = 0;
+ num_chunks = large_offsets_needed ? 5 : 4;
+
+ written = write_midx_header(f, num_chunks, packs.nr);
+
+ chunk_ids[cur_chunk] = MIDX_CHUNKID_PACKNAMES;
+ chunk_offsets[cur_chunk] = written + (num_chunks + 1) * MIDX_CHUNKLOOKUP_WIDTH;
+
+ cur_chunk++;
+ chunk_ids[cur_chunk] = MIDX_CHUNKID_OIDFANOUT;
+ chunk_offsets[cur_chunk] = chunk_offsets[cur_chunk - 1] + packs.pack_name_concat_len;
+
+ cur_chunk++;
+ chunk_ids[cur_chunk] = MIDX_CHUNKID_OIDLOOKUP;
+ chunk_offsets[cur_chunk] = chunk_offsets[cur_chunk - 1] + MIDX_CHUNK_FANOUT_SIZE;
+
+ cur_chunk++;
+ chunk_ids[cur_chunk] = MIDX_CHUNKID_OBJECTOFFSETS;
+ chunk_offsets[cur_chunk] = chunk_offsets[cur_chunk - 1] + nr_entries * MIDX_HASH_LEN;
+
+ cur_chunk++;
+ chunk_offsets[cur_chunk] = chunk_offsets[cur_chunk - 1] + nr_entries * MIDX_CHUNK_OFFSET_WIDTH;
+ if (large_offsets_needed) {
+ chunk_ids[cur_chunk] = MIDX_CHUNKID_LARGEOFFSETS;
+
+ cur_chunk++;
+ chunk_offsets[cur_chunk] = chunk_offsets[cur_chunk - 1] +
+ num_large_offsets * MIDX_CHUNK_LARGE_OFFSET_WIDTH;
+ }
+
+ chunk_ids[cur_chunk] = 0;
+
+ for (i = 0; i <= num_chunks; i++) {
+ if (i && chunk_offsets[i] < chunk_offsets[i - 1])
+ BUG("incorrect chunk offsets: %"PRIu64" before %"PRIu64,
+ chunk_offsets[i - 1],
+ chunk_offsets[i]);
+
+ if (chunk_offsets[i] % MIDX_CHUNK_ALIGNMENT)
+ BUG("chunk offset %"PRIu64" is not properly aligned",
+ chunk_offsets[i]);
+
+ hashwrite_be32(f, chunk_ids[i]);
+ hashwrite_be32(f, chunk_offsets[i] >> 32);
+ hashwrite_be32(f, chunk_offsets[i]);
+
+ written += MIDX_CHUNKLOOKUP_WIDTH;
+ }
+
+ for (i = 0; i < num_chunks; i++) {
+ if (written != chunk_offsets[i])
+ BUG("incorrect chunk offset (%"PRIu64" != %"PRIu64") for chunk id %"PRIx32,
+ chunk_offsets[i],
+ written,
+ chunk_ids[i]);
+
+ switch (chunk_ids[i]) {
+ case MIDX_CHUNKID_PACKNAMES:
+ written += write_midx_pack_names(f, packs.names, packs.nr);
+ break;
+
+ case MIDX_CHUNKID_OIDFANOUT:
+ written += write_midx_oid_fanout(f, entries, nr_entries);
+ break;
+
+ case MIDX_CHUNKID_OIDLOOKUP:
+ written += write_midx_oid_lookup(f, MIDX_HASH_LEN, entries, nr_entries);
+ break;
+
+ case MIDX_CHUNKID_OBJECTOFFSETS:
+ written += write_midx_object_offsets(f, large_offsets_needed, entries, nr_entries);
+ break;
+
+ case MIDX_CHUNKID_LARGEOFFSETS:
+ written += write_midx_large_offsets(f, num_large_offsets, entries, nr_entries);
+ break;
+
+ default:
+ BUG("trying to write unknown chunk id %"PRIx32,
+ chunk_ids[i]);
+ }
+ }
+
+ if (written != chunk_offsets[num_chunks])
+ BUG("incorrect final offset %"PRIu64" != %"PRIu64,
+ written,
+ chunk_offsets[num_chunks]);
+
+ finalize_hashfile(f, NULL, CSUM_FSYNC | CSUM_HASH_IN_STREAM);
+ commit_lock_file(&lk);
+
+cleanup:
+ for (i = 0; i < packs.nr; i++) {
+ if (packs.list[i]) {
+ close_pack(packs.list[i]);
+ free(packs.list[i]);
+ }
+ free(packs.names[i]);
+ }
+
+ free(packs.list);
+ free(packs.names);
+ free(entries);
+ free(pack_perm);
+ free(midx_name);
+ return 0;
+}
+
+void clear_midx_file(const char *object_dir)
+{
+ char *midx = get_midx_filename(object_dir);
+
+ if (remove_path(midx)) {
+ UNLEAK(midx);
+ die(_("failed to clear multi-pack-index at %s"), midx);
+ }
+
+ free(midx);
+}
diff --git a/midx.h b/midx.h
new file mode 100644
index 0000000..a210f1a
--- /dev/null
+++ b/midx.h
@@ -0,0 +1,47 @@
+#ifndef __MIDX_H__
+#define __MIDX_H__
+
+#include "repository.h"
+
+struct multi_pack_index {
+ struct multi_pack_index *next;
+
+ int fd;
+
+ const unsigned char *data;
+ size_t data_len;
+
+ uint32_t signature;
+ unsigned char version;
+ unsigned char hash_len;
+ unsigned char num_chunks;
+ uint32_t num_packs;
+ uint32_t num_objects;
+
+ int local;
+
+ const unsigned char *chunk_pack_names;
+ const uint32_t *chunk_oid_fanout;
+ const unsigned char *chunk_oid_lookup;
+ const unsigned char *chunk_object_offsets;
+ const unsigned char *chunk_large_offsets;
+
+ const char **pack_names;
+ struct packed_git **packs;
+ char object_dir[FLEX_ARRAY];
+};
+
+struct multi_pack_index *load_multi_pack_index(const char *object_dir, int local);
+int prepare_midx_pack(struct multi_pack_index *m, uint32_t pack_int_id);
+int bsearch_midx(const struct object_id *oid, struct multi_pack_index *m, uint32_t *result);
+struct object_id *nth_midxed_object_oid(struct object_id *oid,
+ struct multi_pack_index *m,
+ uint32_t n);
+int fill_midx_entry(const struct object_id *oid, struct pack_entry *e, struct multi_pack_index *m);
+int midx_contains_pack(struct multi_pack_index *m, const char *idx_name);
+int prepare_multi_pack_index_one(struct repository *r, const char *object_dir, int local);
+
+int write_midx_file(const char *object_dir);
+void clear_midx_file(const char *object_dir);
+
+#endif
diff --git a/name-hash.c b/name-hash.c
index 1638498..1fcda73 100644
--- a/name-hash.c
+++ b/name-hash.c
@@ -578,10 +578,10 @@ static void threaded_lazy_init_name_hash(
static void lazy_init_name_hash(struct index_state *istate)
{
- uint64_t start = getnanotime();
if (istate->name_hash_initialized)
return;
+ trace_performance_enter();
hashmap_init(&istate->name_hash, cache_entry_cmp, NULL, istate->cache_nr);
hashmap_init(&istate->dir_hash, dir_entry_cmp, NULL, istate->cache_nr);
@@ -602,7 +602,7 @@ static void lazy_init_name_hash(struct index_state *istate)
}
istate->name_hash_initialized = 1;
- trace_performance_since(start, "initialize name hash");
+ trace_performance_leave("initialize name hash");
}
/*
diff --git a/notes-merge.c b/notes-merge.c
index 0a47e54..5764e2b 100644
--- a/notes-merge.c
+++ b/notes-merge.c
@@ -12,6 +12,7 @@
#include "notes-merge.h"
#include "strbuf.h"
#include "notes-utils.h"
+#include "commit-reach.h"
struct notes_merge_pair {
struct object_id obj, base, local, remote;
diff --git a/object-store.h b/object-store.h
index 67e6622..63b7605 100644
--- a/object-store.h
+++ b/object-store.h
@@ -88,6 +88,8 @@ struct packed_git {
char pack_name[FLEX_ARRAY]; /* more */
};
+struct multi_pack_index;
+
struct raw_object_store {
/*
* Path to the repository's object store.
@@ -113,6 +115,13 @@ struct raw_object_store {
/*
* private data
*
+ * should only be accessed directly by packfile.c and midx.c
+ */
+ struct multi_pack_index *multi_pack_index;
+
+ /*
+ * private data
+ *
* should only be accessed directly by packfile.c
*/
@@ -121,6 +130,12 @@ struct raw_object_store {
struct list_head packed_git_mru;
/*
+ * A linked list containing all packfiles, starting with those
+ * contained in the multi_pack_index.
+ */
+ struct packed_git *all_packs;
+
+ /*
* A fast, rough count of the number of objects in the repository.
* These two fields are not meant for direct access. Use
* approximate_object_count() instead.
diff --git a/object.h b/object.h
index 6e28fdd..0feb90a 100644
--- a/object.h
+++ b/object.h
@@ -63,12 +63,12 @@ struct object_array {
* fetch-pack.c: 01
* negotiator/default.c: 2--5
* walker.c: 0-2
- * upload-pack.c: 4 11----------------19
+ * upload-pack.c: 4 11-----14 16-----19
* builtin/blame.c: 12-13
* bisect.c: 16
* bundle.c: 16
* http-push.c: 16-----19
- * commit.c: 16-----19
+ * commit-reach.c: 15-------19
* sha1-name.c: 20
* list-objects-filter.c: 21
* builtin/fsck.c: 0--3
diff --git a/pack-bitmap-write.c b/pack-bitmap-write.c
index d977e9b..fc82f37 100644
--- a/pack-bitmap-write.c
+++ b/pack-bitmap-write.c
@@ -11,6 +11,7 @@
#include "pack-bitmap.h"
#include "sha1-lookup.h"
#include "pack-objects.h"
+#include "commit-reach.h"
struct bitmapped_commit {
struct commit *commit;
diff --git a/pack-bitmap.c b/pack-bitmap.c
index f0a1937..c7d593c 100644
--- a/pack-bitmap.c
+++ b/pack-bitmap.c
@@ -86,6 +86,9 @@ struct bitmap_index {
/* Bitmap result of the last performed walk */
struct bitmap *result;
+ /* "have" bitmap from the last performed walk */
+ struct bitmap *haves;
+
/* Version of the bitmap index */
unsigned int version;
@@ -335,7 +338,7 @@ static int open_pack_bitmap(struct bitmap_index *bitmap_git)
assert(!bitmap_git->map && !bitmap_git->loaded);
- for (p = get_packed_git(the_repository); p; p = p->next) {
+ for (p = get_all_packs(the_repository); p; p = p->next) {
if (open_pack_bitmap_1(bitmap_git, p) == 0)
ret = 0;
}
@@ -759,8 +762,8 @@ struct bitmap_index *prepare_bitmap_walk(struct rev_info *revs)
bitmap_and_not(wants_bitmap, haves_bitmap);
bitmap_git->result = wants_bitmap;
+ bitmap_git->haves = haves_bitmap;
- bitmap_free(haves_bitmap);
return bitmap_git;
cleanup:
@@ -1114,5 +1117,25 @@ void free_bitmap_index(struct bitmap_index *b)
free(b->ext_index.objects);
free(b->ext_index.hashes);
bitmap_free(b->result);
+ bitmap_free(b->haves);
free(b);
}
+
+int bitmap_has_sha1_in_uninteresting(struct bitmap_index *bitmap_git,
+ const unsigned char *sha1)
+{
+ int pos;
+
+ if (!bitmap_git)
+ return 0; /* no bitmap loaded */
+ if (!bitmap_git->result)
+ BUG("failed to perform bitmap walk before querying");
+ if (!bitmap_git->haves)
+ return 0; /* walk had no "haves" */
+
+ pos = bitmap_position_packfile(bitmap_git, sha1);
+ if (pos < 0)
+ return 0;
+
+ return bitmap_get(bitmap_git->haves, pos);
+}
diff --git a/pack-bitmap.h b/pack-bitmap.h
index 8a04741..c633bf5 100644
--- a/pack-bitmap.h
+++ b/pack-bitmap.h
@@ -53,6 +53,13 @@ int rebuild_existing_bitmaps(struct bitmap_index *, struct packing_data *mapping
khash_sha1 *reused_bitmaps, int show_progress);
void free_bitmap_index(struct bitmap_index *);
+/*
+ * After a traversal has been performed on the bitmap_index, this can be
+ * queried to see if a particular object was reachable from any of the
+ * objects flagged as UNINTERESTING.
+ */
+int bitmap_has_sha1_in_uninteresting(struct bitmap_index *, const unsigned char *sha1);
+
void bitmap_writer_show_progress(int show);
void bitmap_writer_set_checksum(unsigned char *sha1);
void bitmap_writer_build_type_index(struct packing_data *to_pack,
diff --git a/pack-objects.c b/pack-objects.c
index 2bc7626..7e624c3 100644
--- a/pack-objects.c
+++ b/pack-objects.c
@@ -99,7 +99,7 @@ static void prepare_in_pack_by_idx(struct packing_data *pdata)
* (i.e. in_pack_idx also zero) should return NULL.
*/
mapping[cnt++] = NULL;
- for (p = get_packed_git(the_repository); p; p = p->next, cnt++) {
+ for (p = get_all_packs(the_repository); p; p = p->next, cnt++) {
if (cnt == nr) {
free(mapping);
return;
@@ -164,6 +164,12 @@ struct object_entry *packlist_alloc(struct packing_data *pdata,
REALLOC_ARRAY(pdata->in_pack, pdata->nr_alloc);
if (pdata->delta_size)
REALLOC_ARRAY(pdata->delta_size, pdata->nr_alloc);
+
+ if (pdata->tree_depth)
+ REALLOC_ARRAY(pdata->tree_depth, pdata->nr_alloc);
+
+ if (pdata->layer)
+ REALLOC_ARRAY(pdata->layer, pdata->nr_alloc);
}
new_entry = pdata->objects + pdata->nr_objects++;
@@ -179,5 +185,30 @@ struct object_entry *packlist_alloc(struct packing_data *pdata,
if (pdata->in_pack)
pdata->in_pack[pdata->nr_objects - 1] = NULL;
+ if (pdata->tree_depth)
+ pdata->tree_depth[pdata->nr_objects - 1] = 0;
+
+ if (pdata->layer)
+ pdata->layer[pdata->nr_objects - 1] = 0;
+
return new_entry;
}
+
+void oe_set_delta_ext(struct packing_data *pdata,
+ struct object_entry *delta,
+ const unsigned char *sha1)
+{
+ struct object_entry *base;
+
+ ALLOC_GROW(pdata->ext_bases, pdata->nr_ext + 1, pdata->alloc_ext);
+ base = &pdata->ext_bases[pdata->nr_ext++];
+ memset(base, 0, sizeof(*base));
+ hashcpy(base->idx.oid.hash, sha1);
+
+ /* These flags mark that we are not part of the actual pack output. */
+ base->preferred_base = 1;
+ base->filled = 1;
+
+ delta->ext_base = 1;
+ delta->delta_idx = base - pdata->ext_bases + 1;
+}
diff --git a/pack-objects.h b/pack-objects.h
index 62806cc..2ca39cf 100644
--- a/pack-objects.h
+++ b/pack-objects.h
@@ -103,6 +103,7 @@ struct object_entry {
unsigned no_try_delta:1;
unsigned type_:TYPE_BITS;
unsigned in_pack_type:TYPE_BITS; /* could be delta */
+
unsigned preferred_base:1; /*
* we do not pack this, but is available
* to be used as the base object to delta
@@ -112,6 +113,7 @@ struct object_entry {
unsigned filled:1; /* assigned write-order */
unsigned dfs_state:OE_DFS_STATE_BITS;
unsigned depth:OE_DEPTH_BITS;
+ unsigned ext_base:1; /* delta_idx points outside packlist */
/*
* pahole results on 64-bit linux (gcc and clang)
@@ -147,8 +149,20 @@ struct packing_data {
pthread_mutex_t lock;
#endif
+ /*
+ * This list contains entries for bases which we know the other side
+ * has (e.g., via reachability bitmaps), but which aren't in our
+ * "objects" list.
+ */
+ struct object_entry *ext_bases;
+ uint32_t nr_ext, alloc_ext;
+
uintmax_t oe_size_limit;
uintmax_t oe_delta_size_limit;
+
+ /* delta islands */
+ unsigned int *tree_depth;
+ unsigned char *layer;
};
void prepare_packing_data(struct packing_data *pdata);
@@ -249,9 +263,12 @@ static inline struct object_entry *oe_delta(
const struct packing_data *pack,
const struct object_entry *e)
{
- if (e->delta_idx)
+ if (!e->delta_idx)
+ return NULL;
+ if (e->ext_base)
+ return &pack->ext_bases[e->delta_idx - 1];
+ else
return &pack->objects[e->delta_idx - 1];
- return NULL;
}
static inline void oe_set_delta(struct packing_data *pack,
@@ -264,6 +281,10 @@ static inline void oe_set_delta(struct packing_data *pack,
e->delta_idx = 0;
}
+void oe_set_delta_ext(struct packing_data *pack,
+ struct object_entry *e,
+ const unsigned char *sha1);
+
static inline struct object_entry *oe_delta_child(
const struct packing_data *pack,
const struct object_entry *e)
@@ -384,4 +405,38 @@ static inline void oe_set_delta_size(struct packing_data *pack,
}
}
+static inline unsigned int oe_tree_depth(struct packing_data *pack,
+ struct object_entry *e)
+{
+ if (!pack->tree_depth)
+ return 0;
+ return pack->tree_depth[e - pack->objects];
+}
+
+static inline void oe_set_tree_depth(struct packing_data *pack,
+ struct object_entry *e,
+ unsigned int tree_depth)
+{
+ if (!pack->tree_depth)
+ ALLOC_ARRAY(pack->tree_depth, pack->nr_objects);
+ pack->tree_depth[e - pack->objects] = tree_depth;
+}
+
+static inline unsigned char oe_layer(struct packing_data *pack,
+ struct object_entry *e)
+{
+ if (!pack->layer)
+ return 0;
+ return pack->layer[e - pack->objects];
+}
+
+static inline void oe_set_layer(struct packing_data *pack,
+ struct object_entry *e,
+ unsigned char layer)
+{
+ if (!pack->layer)
+ ALLOC_ARRAY(pack->layer, pack->nr_objects);
+ pack->layer[e - pack->objects] = layer;
+}
+
#endif
diff --git a/packfile.c b/packfile.c
index 1e9eacd..841b361 100644
--- a/packfile.c
+++ b/packfile.c
@@ -15,6 +15,7 @@
#include "tree-walk.h"
#include "tree.h"
#include "object-store.h"
+#include "midx.h"
char *odb_pack_name(struct strbuf *buf,
const unsigned char *sha1,
@@ -196,6 +197,23 @@ int open_pack_index(struct packed_git *p)
return ret;
}
+uint32_t get_pack_fanout(struct packed_git *p, uint32_t value)
+{
+ const uint32_t *level1_ofs = p->index_data;
+
+ if (!level1_ofs) {
+ if (open_pack_index(p))
+ return 0;
+ level1_ofs = p->index_data;
+ }
+
+ if (p->index_version > 1) {
+ level1_ofs += 2;
+ }
+
+ return ntohl(level1_ofs[value]);
+}
+
static struct packed_git *alloc_packed_git(int extra)
{
struct packed_git *p = xmalloc(st_add(sizeof(*p), extra));
@@ -451,8 +469,19 @@ static int open_packed_git_1(struct packed_git *p)
ssize_t read_result;
const unsigned hashsz = the_hash_algo->rawsz;
- if (!p->index_data && open_pack_index(p))
- return error("packfile %s index unavailable", p->pack_name);
+ if (!p->index_data) {
+ struct multi_pack_index *m;
+ const char *pack_name = strrchr(p->pack_name, '/');
+
+ for (m = the_repository->objects->multi_pack_index;
+ m; m = m->next) {
+ if (midx_contains_pack(m, pack_name))
+ break;
+ }
+
+ if (!m && open_pack_index(p))
+ return error("packfile %s index unavailable", p->pack_name);
+ }
if (!pack_max_fds) {
unsigned int max_fds = get_max_fd_limit();
@@ -503,6 +532,10 @@ static int open_packed_git_1(struct packed_git *p)
" supported (try upgrading GIT to a newer version)",
p->pack_name, ntohl(hdr.hdr_version));
+ /* Skip index checking if in multi-pack-index */
+ if (!p->index_data)
+ return 0;
+
/* Verify the pack matches its index. */
if (p->num_objects != ntohl(hdr.hdr_entries))
return error("packfile %s claims to have %"PRIu32" objects"
@@ -738,13 +771,14 @@ static void report_pack_garbage(struct string_list *list)
report_helper(list, seen_bits, first, list->nr);
}
-static void prepare_packed_git_one(struct repository *r, char *objdir, int local)
+void for_each_file_in_pack_dir(const char *objdir,
+ each_file_in_pack_dir_fn fn,
+ void *data)
{
struct strbuf path = STRBUF_INIT;
size_t dirnamelen;
DIR *dir;
struct dirent *de;
- struct string_list garbage = STRING_LIST_INIT_DUP;
strbuf_addstr(&path, objdir);
strbuf_addstr(&path, "/pack");
@@ -759,53 +793,87 @@ static void prepare_packed_git_one(struct repository *r, char *objdir, int local
strbuf_addch(&path, '/');
dirnamelen = path.len;
while ((de = readdir(dir)) != NULL) {
- struct packed_git *p;
- size_t base_len;
-
if (is_dot_or_dotdot(de->d_name))
continue;
strbuf_setlen(&path, dirnamelen);
strbuf_addstr(&path, de->d_name);
- base_len = path.len;
- if (strip_suffix_mem(path.buf, &base_len, ".idx")) {
- /* Don't reopen a pack we already have. */
- for (p = r->objects->packed_git; p;
- p = p->next) {
- size_t len;
- if (strip_suffix(p->pack_name, ".pack", &len) &&
- len == base_len &&
- !memcmp(p->pack_name, path.buf, len))
- break;
- }
- if (p == NULL &&
- /*
- * See if it really is a valid .idx file with
- * corresponding .pack file that we can map.
- */
- (p = add_packed_git(path.buf, path.len, local)) != NULL)
- install_packed_git(r, p);
- }
-
- if (!report_garbage)
- continue;
-
- if (ends_with(de->d_name, ".idx") ||
- ends_with(de->d_name, ".pack") ||
- ends_with(de->d_name, ".bitmap") ||
- ends_with(de->d_name, ".keep") ||
- ends_with(de->d_name, ".promisor"))
- string_list_append(&garbage, path.buf);
- else
- report_garbage(PACKDIR_FILE_GARBAGE, path.buf);
+ fn(path.buf, path.len, de->d_name, data);
}
+
closedir(dir);
- report_pack_garbage(&garbage);
- string_list_clear(&garbage, 0);
strbuf_release(&path);
}
+struct prepare_pack_data {
+ struct repository *r;
+ struct string_list *garbage;
+ int local;
+ struct multi_pack_index *m;
+};
+
+static void prepare_pack(const char *full_name, size_t full_name_len,
+ const char *file_name, void *_data)
+{
+ struct prepare_pack_data *data = (struct prepare_pack_data *)_data;
+ struct packed_git *p;
+ size_t base_len = full_name_len;
+
+ if (strip_suffix_mem(full_name, &base_len, ".idx") &&
+ !(data->m && midx_contains_pack(data->m, file_name))) {
+ /* Don't reopen a pack we already have. */
+ for (p = data->r->objects->packed_git; p; p = p->next) {
+ size_t len;
+ if (strip_suffix(p->pack_name, ".pack", &len) &&
+ len == base_len &&
+ !memcmp(p->pack_name, full_name, len))
+ break;
+ }
+
+ if (!p) {
+ p = add_packed_git(full_name, full_name_len, data->local);
+ if (p)
+ install_packed_git(data->r, p);
+ }
+ }
+
+ if (!report_garbage)
+ return;
+
+ if (!strcmp(file_name, "multi-pack-index"))
+ return;
+ if (ends_with(file_name, ".idx") ||
+ ends_with(file_name, ".pack") ||
+ ends_with(file_name, ".bitmap") ||
+ ends_with(file_name, ".keep") ||
+ ends_with(file_name, ".promisor"))
+ string_list_append(data->garbage, full_name);
+ else
+ report_garbage(PACKDIR_FILE_GARBAGE, full_name);
+}
+
+static void prepare_packed_git_one(struct repository *r, char *objdir, int local)
+{
+ struct prepare_pack_data data;
+ struct string_list garbage = STRING_LIST_INIT_DUP;
+
+ data.m = r->objects->multi_pack_index;
+
+ /* look for the multi-pack-index for this object directory */
+ while (data.m && strcmp(data.m->object_dir, objdir))
+ data.m = data.m->next;
+
+ data.r = r;
+ data.garbage = &garbage;
+ data.local = local;
+
+ for_each_file_in_pack_dir(objdir, prepare_pack, &data);
+
+ report_pack_garbage(data.garbage);
+ string_list_clear(data.garbage, 0);
+}
+
static void prepare_packed_git(struct repository *r);
/*
* Give a fast, rough count of the number of objects in the repository. This
@@ -818,10 +886,13 @@ unsigned long approximate_object_count(void)
{
if (!the_repository->objects->approximate_object_count_valid) {
unsigned long count;
+ struct multi_pack_index *m;
struct packed_git *p;
prepare_packed_git(the_repository);
count = 0;
+ for (m = get_multi_pack_index(the_repository); m; m = m->next)
+ count += m->num_objects;
for (p = the_repository->objects->packed_git; p; p = p->next) {
if (open_pack_index(p))
continue;
@@ -893,11 +964,17 @@ static void prepare_packed_git(struct repository *r)
if (r->objects->packed_git_initialized)
return;
+ prepare_multi_pack_index_one(r, r->objects->objectdir, 1);
prepare_packed_git_one(r, r->objects->objectdir, 1);
prepare_alt_odb(r);
- for (alt = r->objects->alt_odb_list; alt; alt = alt->next)
+ for (alt = r->objects->alt_odb_list; alt; alt = alt->next) {
+ prepare_multi_pack_index_one(r, alt->path, 0);
prepare_packed_git_one(r, alt->path, 0);
+ }
rearrange_packed_git(r);
+
+ r->objects->all_packs = NULL;
+
prepare_packed_git_mru(r);
r->objects->packed_git_initialized = 1;
}
@@ -915,6 +992,36 @@ struct packed_git *get_packed_git(struct repository *r)
return r->objects->packed_git;
}
+struct multi_pack_index *get_multi_pack_index(struct repository *r)
+{
+ prepare_packed_git(r);
+ return r->objects->multi_pack_index;
+}
+
+struct packed_git *get_all_packs(struct repository *r)
+{
+ prepare_packed_git(r);
+
+ if (!r->objects->all_packs) {
+ struct packed_git *p = r->objects->packed_git;
+ struct multi_pack_index *m;
+
+ for (m = r->objects->multi_pack_index; m; m = m->next) {
+ uint32_t i;
+ for (i = 0; i < m->num_packs; i++) {
+ if (!prepare_midx_pack(m, i)) {
+ m->packs[i]->next = p;
+ p = m->packs[i];
+ }
+ }
+ }
+
+ r->objects->all_packs = p;
+ }
+
+ return r->objects->all_packs;
+}
+
struct list_head *get_packed_git_mru(struct repository *r)
{
prepare_packed_git(r);
@@ -1856,11 +1963,17 @@ static int fill_pack_entry(const struct object_id *oid,
int find_pack_entry(struct repository *r, const struct object_id *oid, struct pack_entry *e)
{
struct list_head *pos;
+ struct multi_pack_index *m;
prepare_packed_git(r);
- if (!r->objects->packed_git)
+ if (!r->objects->packed_git && !r->objects->multi_pack_index)
return 0;
+ for (m = r->objects->multi_pack_index; m; m = m->next) {
+ if (fill_midx_entry(oid, e, m))
+ return 1;
+ }
+
list_for_each(pos, &r->objects->packed_git_mru) {
struct packed_git *p = list_entry(pos, struct packed_git, mru);
if (fill_pack_entry(oid, e, p)) {
@@ -1923,7 +2036,7 @@ int for_each_packed_object(each_packed_object_fn cb, void *data,
int pack_errors = 0;
prepare_packed_git(the_repository);
- for (p = the_repository->objects->packed_git; p; p = p->next) {
+ for (p = get_all_packs(the_repository); p; p = p->next) {
if ((flags & FOR_EACH_OBJECT_LOCAL_ONLY) && !p->pack_local)
continue;
if ((flags & FOR_EACH_OBJECT_PROMISOR_ONLY) &&
diff --git a/packfile.h b/packfile.h
index 630f35c..4426257 100644
--- a/packfile.h
+++ b/packfile.h
@@ -33,6 +33,12 @@ extern char *sha1_pack_index_name(const unsigned char *sha1);
extern struct packed_git *parse_pack_index(unsigned char *sha1, const char *idx_path);
+typedef void each_file_in_pack_dir_fn(const char *full_path, size_t full_path_len,
+ const char *file_pach, void *data);
+void for_each_file_in_pack_dir(const char *objdir,
+ each_file_in_pack_dir_fn fn,
+ void *data);
+
/* A hook to report invalid files in pack directory */
#define PACKDIR_FILE_PACK 1
#define PACKDIR_FILE_IDX 2
@@ -44,6 +50,8 @@ extern void install_packed_git(struct repository *r, struct packed_git *pack);
struct packed_git *get_packed_git(struct repository *r);
struct list_head *get_packed_git_mru(struct repository *r);
+struct multi_pack_index *get_multi_pack_index(struct repository *r);
+struct packed_git *get_all_packs(struct repository *r);
/*
* Give a rough count of objects in the repository. This sacrifices accuracy
@@ -68,6 +76,8 @@ extern int open_pack_index(struct packed_git *);
*/
extern void close_pack_index(struct packed_git *);
+extern uint32_t get_pack_fanout(struct packed_git *p, uint32_t value);
+
extern unsigned char *use_pack(struct packed_git *, struct pack_window **, off_t, unsigned long *);
extern void close_pack_windows(struct packed_git *);
extern void close_pack(struct packed_git *);
diff --git a/po/bg.po b/po/bg.po
index 036918f..cc6bc1a 100644
--- a/po/bg.po
+++ b/po/bg.po
@@ -7,6 +7,8 @@
# DICTIONARY TO MERGE IN GIT GUI
# ------------------------
# range диапазон
+# base база
+# tip връх
# unreachable object недостижим обект
# dangling objects обект извън клон
# fast-forward превъртане
@@ -38,6 +40,7 @@
# replace refs заместващи указатели
# embedded repository вградено/вътрешно хранилище (добавянето му е грешка)
# thin pack съкратен пакет
+# pack file пакетен файл
# stat (a file) получавам информация чрез „stat“ (за файл)
# mixed reset смесено зануляване (индекса и указателя „HEAD“, без работното дърво)
# soft reset меко зануляване (само указателя „HEAD“, без индекса и работното дърво)
@@ -103,6 +106,18 @@
# collection/series of patches поредица от кръпки
# recieve получавам
# BOM маркер за поредността на байтовете
+# acknowledgment line ред за потвърждение
+# wanted-ref искан указател
+# chunk откъс
+# clean filter декодиращ филтър
+# smudge filter кодиращ филтър
+# loose object непакетиран обект
+# flush изчистване на буферите
+# flush packet изчистващ пакет
+# fork създаване на процес
+# capabilities възможности
+# remote-helper насрещна помощна програма
+#
# ------------------------
# „$var“ - може да не сработва за shell има gettext и eval_gettext - проверка - намират се лесно по „$
# ------------------------
@@ -110,12 +125,19 @@
# HEAD as a reference vs head of a branch
# git update-index -h извежда само един ред, а не цялата помощ за опциите
# git fetch --al работи подобно на --all
+# ------------------------
+# export PO_FILE=bg.po
+# msgattrib --only-fuzzy $PO_FILE > todo1.po
+# msgattrib --untranslated $PO_FILE > todo2.po
+# msgcat todo1.po todo2.po > todo.po
+# grep '^#: ' todo.po | sed 's/^#: //' | tr ' ' '\n' | sed 's/:[0-9]*$//' > FILES
+# for i in `sort -u FILES`; do cnt=`grep $i FILES | wc -l`; echo $cnt $i ;done | sort -n
msgid ""
msgstr ""
"Project-Id-Version: git master\n"
"Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2018-06-16 22:06+0800\n"
-"PO-Revision-Date: 2018-06-17 13:16+0200\n"
+"POT-Creation-Date: 2018-09-04 08:50+0800\n"
+"PO-Revision-Date: 2018-09-09 11:28+0200\n"
"Last-Translator: Alexander Shopov <ash@kambanaria.org>\n"
"Language-Team: Bulgarian <dict@fsa-bg.org>\n"
"Language: bg\n"
@@ -124,37 +146,37 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: advice.c:92
+#: advice.c:97
#, c-format
msgid "%shint: %.*s%s\n"
msgstr "%sподсказка: %.*s%s\n"
-#: advice.c:137
+#: advice.c:150
msgid "Cherry-picking is not possible because you have unmerged files."
msgstr "Отбирането на подавания е блокирано от неслети файлове."
-#: advice.c:139
+#: advice.c:152
msgid "Committing is not possible because you have unmerged files."
msgstr "Подаването е блокирано от неслети файлове."
-#: advice.c:141
+#: advice.c:154
msgid "Merging is not possible because you have unmerged files."
msgstr "Сливането е блокирано от неслети файлове."
-#: advice.c:143
+#: advice.c:156
msgid "Pulling is not possible because you have unmerged files."
msgstr "Издърпването е блокирано от неслети файлове."
-#: advice.c:145
+#: advice.c:158
msgid "Reverting is not possible because you have unmerged files."
msgstr "Отмяната е блокирана от неслети файлове."
-#: advice.c:147
+#: advice.c:160
#, c-format
msgid "It is not possible to %s because you have unmerged files."
msgstr "Действието „%s“ е блокирано от неслети файлове."
-#: advice.c:155
+#: advice.c:168
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."
@@ -162,23 +184,23 @@ msgstr ""
"Редактирайте ги в работното дърво, и тогава ползвайте „git add/rm ФАЙЛ“,\n"
"за да отбележите коригирането им. След това извършете подаването."
-#: advice.c:163
+#: advice.c:176
msgid "Exiting because of an unresolved conflict."
msgstr "Изход от програмата заради некоригиран конфликт."
-#: advice.c:168 builtin/merge.c:1250
+#: advice.c:181 builtin/merge.c:1286
msgid "You have not concluded your merge (MERGE_HEAD exists)."
msgstr "Не сте завършили сливане. (Указателят „MERGE_HEAD“ съществува)."
-#: advice.c:170
+#: advice.c:183
msgid "Please, commit your changes before merging."
msgstr "Промените трябва да се подадат преди сливане."
-#: advice.c:171
+#: advice.c:184
msgid "Exiting because of unfinished merge."
msgstr "Изход от програмата заради незавършено сливане."
-#: advice.c:177
+#: advice.c:190
#, c-format
msgid ""
"Note: checking out '%s'.\n"
@@ -207,100 +229,100 @@ msgstr ""
" git checkout -b ИМЕ_НА_НОВ_КЛОН\n"
"\n"
-#: apply.c:58
+#: apply.c:59
#, c-format
msgid "unrecognized whitespace option '%s'"
msgstr "непозната опция за знаците за интервали „%s“"
-#: apply.c:74
+#: apply.c:75
#, c-format
msgid "unrecognized whitespace ignore option '%s'"
msgstr "непозната опция за игнориране на знаците за интервали „%s“"
-#: apply.c:122
+#: apply.c:125
msgid "--reject and --3way cannot be used together."
msgstr "опциите „--reject“ и „--3way“ са несъвместими"
-#: apply.c:124
+#: apply.c:127
msgid "--cached and --3way cannot be used together."
msgstr "опциите „--cached“ и „--3way“ са несъвместими"
-#: apply.c:127
+#: apply.c:130
msgid "--3way outside a repository"
msgstr "като „--3way“, но извън хранилище"
-#: apply.c:138
+#: apply.c:141
msgid "--index outside a repository"
msgstr "като „--index“, но извън хранилище"
-#: apply.c:141
+#: apply.c:144
msgid "--cached outside a repository"
msgstr "като „--cached“, но извън хранилище"
-#: apply.c:821
+#: apply.c:826
#, c-format
msgid "Cannot prepare timestamp regexp %s"
msgstr "Регулярният израз за времето „%s“ не може за бъде компилиран"
-#: apply.c:830
+#: apply.c:835
#, c-format
msgid "regexec returned %d for input: %s"
msgstr "Регулярният израз върна %d при подадена последователност „%s“ на входа"
-#: apply.c:904
+#: apply.c:909
#, c-format
msgid "unable to find filename in patch at line %d"
msgstr "Липсва име на файл на ред %d от кръпката"
-#: apply.c:942
+#: apply.c:947
#, 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:948
+#: apply.c:953
#, c-format
msgid "git apply: bad git-diff - inconsistent new filename on line %d"
msgstr ""
"git apply: лош изход от командата „git-diff“ — на ред %d бе получено "
"неправилно име на нов файл"
-#: apply.c:949
+#: apply.c:954
#, c-format
msgid "git apply: bad git-diff - inconsistent old filename on line %d"
msgstr ""
"git apply: лош изход от командата „git-diff“ — на ред %d бе получено "
"неправилно име на стар файл"
-#: apply.c:954
+#: apply.c:959
#, c-format
msgid "git apply: bad git-diff - expected /dev/null on line %d"
msgstr ""
"git apply: лош изход от командата „git-diff“ — на ред %d се очакваше „/dev/"
"null“"
-#: apply.c:983
+#: apply.c:988
#, c-format
msgid "invalid mode on line %d: %s"
msgstr "грешен режим на ред №%d: %s"
-#: apply.c:1301
+#: apply.c:1306
#, c-format
msgid "inconsistent header lines %d and %d"
msgstr "несъвместими заглавни части на редове №%d и №%d"
-#: apply.c:1473
+#: apply.c:1478
#, c-format
msgid "recount: unexpected line: %.*s"
msgstr "при повторното преброяване бе получен неочакван ред: „%.*s“"
-#: apply.c:1542
+#: apply.c:1547
#, c-format
msgid "patch fragment without header at line %d: %.*s"
msgstr "част от кръпка без заглавна част на ред %d: %.*s"
-#: apply.c:1562
+#: apply.c:1567
#, c-format
msgid ""
"git diff header lacks filename information when removing %d leading pathname "
@@ -315,71 +337,71 @@ msgstr[1] ""
"След съкращаването на първите %d части от компонентите на пътя, в заглавната "
"част на „git diff“ липсва информация за име на файл (ред: %d)"
-#: apply.c:1575
+#: apply.c:1580
#, c-format
msgid "git diff header lacks filename information (line %d)"
msgstr ""
"в заглавната част на „git diff“ липсва информация за име на файл (ред: %d)"
-#: apply.c:1763
+#: apply.c:1768
msgid "new file depends on old contents"
msgstr "новият файл зависи от старото съдържание на файла"
-#: apply.c:1765
+#: apply.c:1770
msgid "deleted file still has contents"
msgstr "изтритият файл не е празен"
-#: apply.c:1799
+#: apply.c:1804
#, c-format
msgid "corrupt patch at line %d"
msgstr "грешка в кръпката на ред %d"
-#: apply.c:1836
+#: apply.c:1841
#, c-format
msgid "new file %s depends on old contents"
msgstr "новият файл „%s“ зависи от старото съдържание на файла"
-#: apply.c:1838
+#: apply.c:1843
#, c-format
msgid "deleted file %s still has contents"
msgstr "изтритият файл „%s“ не е празен"
-#: apply.c:1841
+#: apply.c:1846
#, c-format
msgid "** warning: file %s becomes empty but is not deleted"
msgstr "● предупреждение: файлът „%s“ вече е празен, но не е изтрит"
-#: apply.c:1988
+#: apply.c:1993
#, c-format
msgid "corrupt binary patch at line %d: %.*s"
msgstr "грешка в двоичната кръпка на ред %d: %.*s"
-#: apply.c:2025
+#: apply.c:2030
#, c-format
msgid "unrecognized binary patch at line %d"
msgstr "неразпозната двоичната кръпка на ред %d"
-#: apply.c:2185
+#: apply.c:2190
#, c-format
msgid "patch with only garbage at line %d"
msgstr "кръпката е с изцяло повредени данни на ред %d"
-#: apply.c:2271
+#: apply.c:2276
#, c-format
msgid "unable to read symlink %s"
msgstr "символната връзка „%s“ не може да бъде прочетена"
-#: apply.c:2275
+#: apply.c:2280
#, c-format
msgid "unable to open or read %s"
msgstr "файлът „%s“ не може да бъде отворен или прочетен"
-#: apply.c:2934
+#: apply.c:2939
#, c-format
msgid "invalid start of line: '%c'"
msgstr "неправилно начало на ред: „%c“"
-#: apply.c:3055
+#: apply.c:3060
#, c-format
msgid "Hunk #%d succeeded at %d (offset %d line)."
msgid_plural "Hunk #%d succeeded at %d (offset %d lines)."
@@ -388,13 +410,13 @@ msgstr[0] ""
msgstr[1] ""
"%d-то парче код бе успешно приложено на ред %d (отместване от %d реда)."
-#: apply.c:3067
+#: apply.c:3072
#, c-format
msgid "Context reduced to (%ld/%ld) to apply fragment at %d"
msgstr ""
"Контекстът е намален на (%ld/%ld) за прилагането на парчето код на ред %d"
-#: apply.c:3073
+#: apply.c:3078
#, c-format
msgid ""
"while searching for:\n"
@@ -403,316 +425,316 @@ msgstr ""
"при търсене за:\n"
"%.*s"
-#: apply.c:3095
+#: apply.c:3100
#, c-format
msgid "missing binary patch data for '%s'"
msgstr "липсват данните за двоичната кръпка за „%s“"
-#: apply.c:3103
+#: apply.c:3108
#, c-format
msgid "cannot reverse-apply a binary patch without the reverse hunk to '%s'"
msgstr ""
"двоичната кръпка не може да се приложи в обратна посока, когато обратното "
"парче за „%s“ липсва"
-#: apply.c:3149
+#: apply.c:3154
#, c-format
msgid "cannot apply binary patch to '%s' without full index line"
msgstr "към „%s“ не може да се приложи двоична кръпка без пълен индекс"
-#: apply.c:3159
+#: apply.c:3164
#, c-format
msgid ""
"the patch applies to '%s' (%s), which does not match the current contents."
msgstr "кръпката съответства на „%s“ (%s), който не съвпада по съдържание."
-#: apply.c:3167
+#: apply.c:3172
#, c-format
msgid "the patch applies to an empty '%s' but it is not empty"
msgstr "кръпката съответства на „%s“, който трябва да е празен, но не е"
-#: apply.c:3185
+#: apply.c:3190
#, c-format
msgid "the necessary postimage %s for '%s' cannot be read"
msgstr ""
"необходимият резултат след операцията — „%s“ за „%s“ не може да бъде "
"прочетен"
-#: apply.c:3198
+#: apply.c:3203
#, c-format
msgid "binary patch does not apply to '%s'"
msgstr "двоичната кръпка не може да бъде приложена върху „%s“"
-#: apply.c:3204
+#: apply.c:3209
#, c-format
msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)"
msgstr ""
"двоичната кръпка за „%s“ води до неправилни резултати (очакваше се: „%s“, а "
"бе получено: „%s“)"
-#: apply.c:3225
+#: apply.c:3230
#, c-format
msgid "patch failed: %s:%ld"
msgstr "неуспешно прилагане на кръпка: „%s:%ld“"
-#: apply.c:3347
+#: apply.c:3352
#, c-format
msgid "cannot checkout %s"
msgstr "„%s“ не може да се изтегли"
-#: apply.c:3396 apply.c:3407 apply.c:3453 setup.c:278
+#: apply.c:3404 apply.c:3415 apply.c:3461 setup.c:278
#, c-format
msgid "failed to read %s"
msgstr "файлът „%s“ не може да бъде прочетен"
-#: apply.c:3404
+#: apply.c:3412
#, c-format
msgid "reading from '%s' beyond a symbolic link"
msgstr "изчитане на „%s“ след проследяване на символна връзка"
-#: apply.c:3433 apply.c:3673
+#: apply.c:3441 apply.c:3681
#, c-format
msgid "path %s has been renamed/deleted"
msgstr "обектът с път „%s“ е преименуван или изтрит"
-#: apply.c:3516 apply.c:3687
+#: apply.c:3524 apply.c:3696
#, c-format
msgid "%s: does not exist in index"
msgstr "„%s“ не съществува в индекса"
-#: apply.c:3525 apply.c:3695
+#: apply.c:3533 apply.c:3704
#, c-format
msgid "%s: does not match index"
msgstr "„%s“ не съответства на индекса"
-#: apply.c:3560
+#: apply.c:3568
msgid "repository lacks the necessary blob to fall back on 3-way merge."
msgstr ""
"в хранилището липсват необходимите обекти-BLOB, за да се премине към тройно "
"сливане."
-#: apply.c:3563
+#: apply.c:3571
#, c-format
msgid "Falling back to three-way merge...\n"
msgstr "Преминаване към тройно сливане…\n"
-#: apply.c:3579 apply.c:3583
+#: apply.c:3587 apply.c:3591
#, c-format
msgid "cannot read the current contents of '%s'"
msgstr "текущото съдържание на „%s“ не може да бъде прочетено"
-#: apply.c:3595
+#: apply.c:3603
#, c-format
msgid "Failed to fall back on three-way merge...\n"
msgstr "Неуспешно преминаване към тройно сливане…\n"
-#: apply.c:3609
+#: apply.c:3617
#, c-format
msgid "Applied patch to '%s' with conflicts.\n"
msgstr "Конфликти при прилагането на кръпката към „%s“.\n"
-#: apply.c:3614
+#: apply.c:3622
#, c-format
msgid "Applied patch to '%s' cleanly.\n"
msgstr "Кръпката бе приложена чисто към „%s“.\n"
-#: apply.c:3640
+#: apply.c:3648
msgid "removal patch leaves file contents"
msgstr "изтриващата кръпка оставя файла непразен"
-#: apply.c:3712
+#: apply.c:3721
#, c-format
msgid "%s: wrong type"
msgstr "„%s“: неправилен вид"
-#: apply.c:3714
+#: apply.c:3723
#, c-format
msgid "%s has type %o, expected %o"
msgstr "„%s“ е от вид „%o“, а се очакваше „%o“"
-#: apply.c:3864 apply.c:3866
+#: apply.c:3874 apply.c:3876
#, c-format
msgid "invalid path '%s'"
msgstr "неправилен път: „%s“"
-#: apply.c:3922
+#: apply.c:3932
#, c-format
msgid "%s: already exists in index"
msgstr "„%s“: вече съществува в индекса"
-#: apply.c:3925
+#: apply.c:3935
#, c-format
msgid "%s: already exists in working directory"
msgstr "„%s“: вече съществува в работното дърво"
-#: apply.c:3945
+#: apply.c:3955
#, c-format
msgid "new mode (%o) of %s does not match old mode (%o)"
msgstr "новите права за достъп (%o) на „%s“ не съвпадат със старите (%o)"
-#: apply.c:3950
+#: apply.c:3960
#, c-format
msgid "new mode (%o) of %s does not match old mode (%o) of %s"
msgstr ""
"новите права за достъп (%o) на „%s“ не съвпадат със старите (%o) на „%s“"
-#: apply.c:3970
+#: apply.c:3980
#, c-format
msgid "affected file '%s' is beyond a symbolic link"
msgstr "засегнатият файл „%s“ е след символна връзка"
-#: apply.c:3974
+#: apply.c:3984
#, c-format
msgid "%s: patch does not apply"
msgstr "Кръпката „%s“ не може да бъде приложена"
-#: apply.c:3989
+#: apply.c:3999
#, c-format
msgid "Checking patch %s..."
msgstr "Проверяване на кръпката „%s“…"
-#: apply.c:4080
+#: apply.c:4091
#, c-format
msgid "sha1 information is lacking or useless for submodule %s"
msgstr ""
"информацията за сумата по SHA1 за подмодула липсва или не е достатъчна (%s)."
-#: apply.c:4087
+#: apply.c:4098
#, c-format
msgid "mode change for %s, which is not in current HEAD"
msgstr "смяна на режима на достъпа на „%s“, който не е в текущия връх „HEAD“"
-#: apply.c:4090
+#: apply.c:4101
#, c-format
msgid "sha1 information is lacking or useless (%s)."
msgstr "информацията за сумата по SHA1 липсва или не е достатъчна (%s)."
-#: apply.c:4095 builtin/checkout.c:235 builtin/reset.c:140
+#: apply.c:4106 builtin/checkout.c:237 builtin/reset.c:140
#, c-format
msgid "make_cache_entry failed for path '%s'"
msgstr "неуспешно създаване на запис в кеша чрез „make_cache_entry“ за „%s“"
-#: apply.c:4099
+#: apply.c:4110
#, c-format
msgid "could not add %s to temporary index"
msgstr "„%s“ не може да се добави към временния индекс"
-#: apply.c:4109
+#: apply.c:4120
#, c-format
msgid "could not write temporary index to %s"
msgstr "временният индекс не може да се запази в „%s“"
-#: apply.c:4247
+#: apply.c:4258
#, c-format
msgid "unable to remove %s from index"
msgstr "„%s“ не може да се извади от индекса"
-#: apply.c:4282
+#: apply.c:4292
#, c-format
msgid "corrupt patch for submodule %s"
msgstr "повредена кръпка за модула „%s“"
-#: apply.c:4288
+#: apply.c:4298
#, c-format
msgid "unable to stat newly created file '%s'"
msgstr ""
"не може да се получи информация чрез „stat“ за новосъздадения файл „%s“"
-#: apply.c:4296
+#: apply.c:4306
#, c-format
msgid "unable to create backing store for newly created file %s"
msgstr ""
"не може да се за създаде мястото за съхранение на новосъздадения файл „%s“"
-#: apply.c:4302 apply.c:4446
+#: apply.c:4312 apply.c:4457
#, c-format
msgid "unable to add cache entry for %s"
msgstr "не може да се добави запис в кеша за „%s“"
-#: apply.c:4343
+#: apply.c:4355
#, c-format
msgid "failed to write to '%s'"
msgstr "в „%s“ не може да се пише"
-#: apply.c:4347
+#: apply.c:4359
#, c-format
msgid "closing file '%s'"
msgstr "затваряне на файла „%s“"
-#: apply.c:4417
+#: apply.c:4429
#, c-format
msgid "unable to write file '%s' mode %o"
msgstr "файлът „%s“ не може да се запише с режим на достъп „%o“"
-#: apply.c:4515
+#: apply.c:4527
#, c-format
msgid "Applied patch %s cleanly."
msgstr "Кръпката „%s“ бе приложена чисто."
-#: apply.c:4523
+#: apply.c:4535
msgid "internal error"
msgstr "вътрешна грешка"
-#: apply.c:4526
+#: apply.c:4538
#, 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:4537
+#: apply.c:4549
#, c-format
msgid "truncating .rej filename to %.*s.rej"
msgstr "съкращаване на името на файла с отхвърлените парчета на „ %.*s.rej“"
-#: apply.c:4545 builtin/fetch.c:786 builtin/fetch.c:1036
+#: apply.c:4557 builtin/fetch.c:780 builtin/fetch.c:1048
#, c-format
msgid "cannot open %s"
msgstr "„%s“ не може да бъде отворен"
-#: apply.c:4559
+#: apply.c:4571
#, c-format
msgid "Hunk #%d applied cleanly."
msgstr "%d-то парче бе успешно приложено."
-#: apply.c:4563
+#: apply.c:4575
#, c-format
msgid "Rejected hunk #%d."
msgstr "%d-то парче бе отхвърлено."
-#: apply.c:4673
+#: apply.c:4685
#, c-format
msgid "Skipped patch '%s'."
msgstr "Пропусната кръпка: „%s“"
-#: apply.c:4681
+#: apply.c:4693
msgid "unrecognized input"
msgstr "непознат вход"
-#: apply.c:4700
+#: apply.c:4712
msgid "unable to read index file"
msgstr "индексът не може да бъде записан"
-#: apply.c:4837
+#: apply.c:4849
#, c-format
msgid "can't open patch '%s': %s"
msgstr "кръпката „%s“ не може да бъде отворена: %s"
-#: apply.c:4864
+#: apply.c:4876
#, c-format
msgid "squelched %d whitespace error"
msgid_plural "squelched %d whitespace errors"
msgstr[0] "пренебрегната е %d грешка в знаците за интервали"
msgstr[1] "пренебрегнати са %d грешки в знаците за интервали"
-#: apply.c:4870 apply.c:4885
+#: apply.c:4882 apply.c:4897
#, c-format
msgid "%d line adds whitespace errors."
msgid_plural "%d lines add whitespace errors."
msgstr[0] "%d ред добавя грешки в знаците за интервали."
msgstr[1] "%d реда добавят грешки в знаците за интервали."
-#: apply.c:4878
+#: apply.c:4890
#, c-format
msgid "%d line applied after fixing whitespace errors."
msgid_plural "%d lines applied after fixing whitespace errors."
@@ -721,258 +743,312 @@ msgstr[0] ""
msgstr[1] ""
"Добавени са %d реда след корекцията на грешките в знаците за интервали."
-#: apply.c:4894 builtin/add.c:538 builtin/mv.c:300 builtin/rm.c:389
+#: apply.c:4906 builtin/add.c:539 builtin/mv.c:300 builtin/rm.c:389
msgid "Unable to write new index file"
msgstr "Новият индекс не може да бъде записан"
-#: apply.c:4921 apply.c:4924 builtin/am.c:2254 builtin/am.c:2257
-#: builtin/clone.c:120 builtin/fetch.c:126 builtin/pull.c:198
-#: builtin/submodule--helper.c:405 builtin/submodule--helper.c:1210
-#: builtin/submodule--helper.c:1213 builtin/submodule--helper.c:1584
-#: builtin/submodule--helper.c:1587 builtin/submodule--helper.c:1807
-#: git-add--interactive.perl:197
+#: apply.c:4933 apply.c:4936 builtin/am.c:2254 builtin/am.c:2257
+#: builtin/clone.c:121 builtin/fetch.c:115 builtin/merge.c:260
+#: builtin/pull.c:198 builtin/submodule--helper.c:406
+#: builtin/submodule--helper.c:1355 builtin/submodule--helper.c:1358
+#: builtin/submodule--helper.c:1729 builtin/submodule--helper.c:1732
+#: builtin/submodule--helper.c:1952 git-add--interactive.perl:197
msgid "path"
msgstr "път"
-#: apply.c:4922
+#: apply.c:4934
msgid "don't apply changes matching the given path"
msgstr "без прилагане на промените напасващи на дадения път"
-#: apply.c:4925
+#: apply.c:4937
msgid "apply changes matching the given path"
msgstr "прилагане на промените напасващи на дадения път"
-#: apply.c:4927 builtin/am.c:2263
+#: apply.c:4939 builtin/am.c:2263
msgid "num"
msgstr "БРОЙ"
-#: apply.c:4928
+#: apply.c:4940
msgid "remove <num> leading slashes from traditional diff paths"
msgstr "премахване на този БРОЙ водещи елементи от пътищата в разликата"
-#: apply.c:4931
+#: apply.c:4943
msgid "ignore additions made by the patch"
msgstr "игнориране на редовете добавени от тази кръпка"
-#: apply.c:4933
+#: apply.c:4945
msgid "instead of applying the patch, output diffstat for the input"
msgstr "извеждане на статистика на промените без прилагане на кръпката"
-#: apply.c:4937
+#: apply.c:4949
msgid "show number of added and deleted lines in decimal notation"
msgstr "извеждане на броя на добавените и изтритите редове"
-#: apply.c:4939
+#: apply.c:4951
msgid "instead of applying the patch, output a summary for the input"
msgstr "извеждане на статистика на входните данни без прилагане на кръпката"
-#: apply.c:4941
+#: apply.c:4953
msgid "instead of applying the patch, see if the patch is applicable"
msgstr "проверка дали кръпката може да се приложи, без действително прилагане"
-#: apply.c:4943
+#: apply.c:4955
msgid "make sure the patch is applicable to the current index"
msgstr "проверка дали кръпката може да бъде приложена към текущия индекс"
-#: apply.c:4945
+#: apply.c:4957
+msgid "mark new files with `git add --intent-to-add`"
+msgstr "отбелязване на новите файлове с „git add --intent-to-add“"
+
+#: apply.c:4959
msgid "apply a patch without touching the working tree"
msgstr "прилагане на кръпката без промяна на работното дърво"
-#: apply.c:4947
+#: apply.c:4961
msgid "accept a patch that touches outside the working area"
msgstr "прилагане на кръпка, която променя и файлове извън работното дърво"
-#: apply.c:4950
+#: apply.c:4964
msgid "also apply the patch (use with --stat/--summary/--check)"
msgstr ""
"кръпката да бъде приложена. Опцията се комбинира с „--check“/„--stat“/„--"
"summary“"
-#: apply.c:4952
+#: apply.c:4966
msgid "attempt three-way merge if a patch does not apply"
msgstr "пробване с тройно сливане, ако кръпката не може да се приложи директно"
-#: apply.c:4954
+#: apply.c:4968
msgid "build a temporary index based on embedded index information"
msgstr ""
"създаване на временен индекс на база на включената информация за индекса"
-#: apply.c:4957 builtin/checkout-index.c:168 builtin/ls-files.c:515
+#: apply.c:4971 builtin/checkout-index.c:168 builtin/ls-files.c:516
msgid "paths are separated with NUL character"
msgstr "разделяне на пътищата с нулевия знак „NUL“"
-#: apply.c:4959
+#: apply.c:4973
msgid "ensure at least <n> lines of context match"
msgstr "да се осигури контекст от поне такъв БРОЙ съвпадащи редове"
-#: apply.c:4960 builtin/am.c:2242 builtin/interpret-trailers.c:95
+#: apply.c:4974 builtin/am.c:2242 builtin/interpret-trailers.c:95
#: builtin/interpret-trailers.c:97 builtin/interpret-trailers.c:99
-#: builtin/pack-objects.c:3177
+#: builtin/pack-objects.c:3202
msgid "action"
msgstr "действие"
-#: apply.c:4961
+#: apply.c:4975
msgid "detect new or modified lines that have whitespace errors"
msgstr "засичане на нови или променени редове с грешки в знаците за интервали"
-#: apply.c:4964 apply.c:4967
+#: apply.c:4978 apply.c:4981
msgid "ignore changes in whitespace when finding context"
msgstr ""
"игнориране на промените в знаците за интервали при откриване на контекста"
-#: apply.c:4970
+#: apply.c:4984
msgid "apply the patch in reverse"
msgstr "прилагане на кръпката в обратна посока"
-#: apply.c:4972
+#: apply.c:4986
msgid "don't expect at least one line of context"
msgstr "без изискване на дори и един ред контекст"
-#: apply.c:4974
+#: apply.c:4988
msgid "leave the rejected hunks in corresponding *.rej files"
msgstr "оставяне на отхвърлените парчета във файлове с разширение „.rej“"
-#: apply.c:4976
+#: apply.c:4990
msgid "allow overlapping hunks"
msgstr "позволяване на застъпващи се парчета"
-#: apply.c:4977 builtin/add.c:290 builtin/check-ignore.c:21
-#: builtin/commit.c:1301 builtin/count-objects.c:98 builtin/fsck.c:666
-#: builtin/log.c:1901 builtin/mv.c:122 builtin/read-tree.c:124
+#: apply.c:4991 builtin/add.c:290 builtin/check-ignore.c:21
+#: builtin/commit.c:1301 builtin/count-objects.c:98 builtin/fsck.c:671
+#: builtin/log.c:1914 builtin/mv.c:122 builtin/read-tree.c:124
msgid "be verbose"
msgstr "повече подробности"
-#: apply.c:4979
+#: apply.c:4993
msgid "tolerate incorrectly detected missing new-line at the end of file"
msgstr "пренебрегване на неправилно липсващ знак за нов ред в края на файл"
-#: apply.c:4982
+#: apply.c:4996
msgid "do not trust the line counts in the hunk headers"
msgstr "без доверяване на номерата на редовете в заглавните части на парчетата"
-#: apply.c:4984 builtin/am.c:2251
+#: apply.c:4998 builtin/am.c:2251
msgid "root"
msgstr "НАЧАЛНА_ДИРЕКТОРИЯ"
-#: apply.c:4985
+#: apply.c:4999
msgid "prepend <root> to all filenames"
msgstr "добавяне на тази НАЧАЛНА_ДИРЕКТОРИЯ към имената на всички файлове"
-#: archive.c:13
+#: archive.c:14
msgid "git archive [<options>] <tree-ish> [<path>...]"
msgstr "git archive [ОПЦИЯ…] УКАЗАТЕЛ_КЪМ_ДЪРВО [ПЪТ…]"
-#: archive.c:14
+#: archive.c:15
msgid "git archive --list"
msgstr "git archive --list"
-#: archive.c:15
+#: archive.c:16
msgid ""
"git archive --remote <repo> [--exec <cmd>] [<options>] <tree-ish> [<path>...]"
msgstr ""
"git archive --remote ХРАНИЛИЩЕ [--exec КОМАНДА] [ОПЦИЯ…] УКАЗАТЕЛ_КЪМ_ДЪРВО "
"[ПЪТ…]"
-#: archive.c:16
+#: archive.c:17
msgid "git archive --remote <repo> [--exec <cmd>] --list"
msgstr "git archive --remote ХРАНИЛИЩЕ [--exec КОМАНДА] --list"
-#: archive.c:351 builtin/add.c:176 builtin/add.c:514 builtin/rm.c:298
+#: archive.c:363 builtin/add.c:176 builtin/add.c:515 builtin/rm.c:298
#, c-format
msgid "pathspec '%s' did not match any files"
msgstr "пътят „%s“ не съвпада с никой файл"
-#: archive.c:434
+#: archive.c:446
msgid "fmt"
msgstr "ФОРМАТ"
-#: archive.c:434
+#: archive.c:446
msgid "archive format"
msgstr "ФОРМАТ на архива"
-#: archive.c:435 builtin/log.c:1462
+#: archive.c:447 builtin/log.c:1473
msgid "prefix"
msgstr "ПРЕФИКС"
-#: archive.c:436
+#: archive.c:448
msgid "prepend prefix to each pathname in the archive"
msgstr "добавяне на този ПРЕФИКС към всеки път в архива"
-#: archive.c:437 builtin/blame.c:813 builtin/blame.c:814 builtin/config.c:127
-#: builtin/fast-export.c:1007 builtin/fast-export.c:1009 builtin/grep.c:869
-#: builtin/hash-object.c:103 builtin/ls-files.c:551 builtin/ls-files.c:554
-#: builtin/notes.c:405 builtin/notes.c:568 builtin/read-tree.c:119
+#: archive.c:449 builtin/blame.c:816 builtin/blame.c:817 builtin/config.c:126
+#: builtin/fast-export.c:1013 builtin/fast-export.c:1015 builtin/grep.c:873
+#: builtin/hash-object.c:104 builtin/ls-files.c:552 builtin/ls-files.c:555
+#: builtin/notes.c:407 builtin/notes.c:570 builtin/read-tree.c:119
#: parse-options.h:165
msgid "file"
msgstr "ФАЙЛ"
-#: archive.c:438 builtin/archive.c:89
+#: archive.c:450 builtin/archive.c:89
msgid "write the archive to this file"
msgstr "запазване на архива в този ФАЙЛ"
-#: archive.c:440
+#: archive.c:452
msgid "read .gitattributes in working directory"
msgstr "изчитане на „.gitattributes“ в работната директория"
-#: archive.c:441
+#: archive.c:453
msgid "report archived files on stderr"
msgstr "извеждане на архивираните файлове на стандартната грешка"
-#: archive.c:442
+#: archive.c:454
msgid "store only"
msgstr "само съхранение без компресиране"
-#: archive.c:443
+#: archive.c:455
msgid "compress faster"
msgstr "бързо компресиране"
-#: archive.c:451
+#: archive.c:463
msgid "compress better"
msgstr "добро компресиране"
-#: archive.c:454
+#: archive.c:466
msgid "list supported archive formats"
msgstr "извеждане на списъка с поддържаните формати"
-#: archive.c:456 builtin/archive.c:90 builtin/clone.c:110 builtin/clone.c:113
-#: builtin/submodule--helper.c:1222 builtin/submodule--helper.c:1593
+#: archive.c:468 builtin/archive.c:90 builtin/clone.c:111 builtin/clone.c:114
+#: builtin/submodule--helper.c:1367 builtin/submodule--helper.c:1738
msgid "repo"
msgstr "хранилище"
-#: archive.c:457 builtin/archive.c:91
+#: archive.c:469 builtin/archive.c:91
msgid "retrieve the archive from remote repository <repo>"
msgstr "изтегляне на архива от отдалеченото ХРАНИЛИЩЕ"
-#: archive.c:458 builtin/archive.c:92 builtin/notes.c:489
+#: archive.c:470 builtin/archive.c:92 builtin/difftool.c:714
+#: builtin/notes.c:491
msgid "command"
msgstr "команда"
-#: archive.c:459 builtin/archive.c:93
+#: archive.c:471 builtin/archive.c:93
msgid "path to the remote git-upload-archive command"
msgstr "път към отдалечената команда „git-upload-archive“"
-#: archive.c:466
+#: archive.c:478
msgid "Unexpected option --remote"
msgstr "Неочаквана опция „--remote“"
-#: archive.c:468
+#: archive.c:480
msgid "Option --exec can only be used together with --remote"
msgstr "Опцията „--exec“ изисква „--remote“"
-#: archive.c:470
+#: archive.c:482
msgid "Unexpected option --output"
msgstr "Неочаквана опция „--output“"
-#: archive.c:492
+#: archive.c:504
#, c-format
msgid "Unknown archive format '%s'"
msgstr "Непознат формат на архив: „%s“"
-#: archive.c:499
+#: archive.c:511
#, c-format
msgid "Argument not supported for format '%s': -%d"
msgstr "Аргументът не се поддържа за форма̀та „%s“: -%d"
+#: archive-tar.c:125 archive-zip.c:344
+#, c-format
+msgid "cannot stream blob %s"
+msgstr "обектът-BLOB „%s“ не може да бъде обработен"
+
+#: archive-tar.c:260 archive-zip.c:361
+#, c-format
+msgid "unsupported file mode: 0%o (SHA1: %s)"
+msgstr "неподдържани права за достъп до файл: 0%o (SHA1: %s)"
+
+#: archive-tar.c:287 archive-zip.c:352
+#, c-format
+msgid "cannot read %s"
+msgstr "обектът „%s“ не може да бъде прочетен"
+
+#: archive-tar.c:458
+#, c-format
+msgid "unable to start '%s' filter"
+msgstr "филтърът „%s“ не може да бъде стартиран"
+
+#: archive-tar.c:461
+msgid "unable to redirect descriptor"
+msgstr "дескрипторът не може да бъде пренасочен"
+
+#: archive-tar.c:468
+#, c-format
+msgid "'%s' filter reported error"
+msgstr "филтърът „%s“ върна грешка"
+
+#: archive-zip.c:313
+#, c-format
+msgid "path is not valid UTF-8: %s"
+msgstr "пътят не е правилно кодиран в UTF-8: %s"
+
+#: archive-zip.c:317
+#, c-format
+msgid "path too long (%d chars, SHA1: %s): %s"
+msgstr "твърде дълъг път (%d знака, SHA1: %s): %s"
+
+#: archive-zip.c:470 builtin/pack-objects.c:216 builtin/pack-objects.c:219
+#, c-format
+msgid "deflate error (%d)"
+msgstr "грешка при декомпресиране с „deflate“ (%d)"
+
+#: archive-zip.c:605
+#, c-format
+msgid "timestamp too large for this system: %<PRIuMAX>"
+msgstr "времевата стойност е твърде голяма за тази система: %<PRIuMAX>"
+
#: attr.c:218
#, c-format
msgid "%.*s is not a valid attribute name"
@@ -986,22 +1062,22 @@ msgstr ""
"Отрицателните шаблони се игнорират в атрибутите на git.\n"
"Ако ви трябва начална удивителна, ползвайте „\\!“."
-#: bisect.c:461
+#: bisect.c:467
#, c-format
msgid "Badly quoted content in file '%s': %s"
msgstr "Неправилно цитирано съдържание във файла „%s“: %s"
-#: bisect.c:669
+#: bisect.c:675
#, c-format
msgid "We cannot bisect more!\n"
msgstr "Повече не може да се търси двоично!\n"
-#: bisect.c:723
+#: bisect.c:729
#, c-format
msgid "Not a valid commit name %s"
msgstr "Неправилно име на подаване „%s“"
-#: bisect.c:747
+#: bisect.c:753
#, c-format
msgid ""
"The merge base %s is bad.\n"
@@ -1010,7 +1086,7 @@ msgstr ""
"Неправилна база за сливане: %s.\n"
"Следователно грешката е коригирана между „%s“ и [%s].\n"
-#: bisect.c:752
+#: bisect.c:758
#, c-format
msgid ""
"The merge base %s is new.\n"
@@ -1019,7 +1095,7 @@ msgstr ""
"Нова база за сливане: %s.\n"
"Свойството е променено между „%s“ и [%s].\n"
-#: bisect.c:757
+#: bisect.c:763
#, c-format
msgid ""
"The merge base %s is %s.\n"
@@ -1028,7 +1104,7 @@ msgstr ""
"Базата за сливане „%s“ е %s.\n"
"Следователно първото %s подаване е между „%s“ и [%s].\n"
-#: bisect.c:765
+#: bisect.c:771
#, c-format
msgid ""
"Some %s revs are not ancestors of the %s rev.\n"
@@ -1039,7 +1115,7 @@ msgstr ""
"Двоичното търсене с git bisect няма да работи правилно.\n"
"Дали не сте объркали указателите „%s“ и „%s“?\n"
-#: bisect.c:778
+#: bisect.c:784
#, c-format
msgid ""
"the merge base between %s and [%s] must be skipped.\n"
@@ -1050,36 +1126,36 @@ msgstr ""
"Не може да сме сигурни, че първото %s подаване е между „%s“ и „%s“.\n"
"Двоичното търсене продължава."
-#: bisect.c:811
+#: bisect.c:817
#, c-format
msgid "Bisecting: a merge base must be tested\n"
msgstr "Двоично търсене: трябва да се провери база за сливане\n"
-#: bisect.c:851
+#: bisect.c:857
#, c-format
msgid "a %s revision is needed"
msgstr "необходима е версия „%s“"
-#: bisect.c:870 builtin/notes.c:175 builtin/tag.c:236
+#: bisect.c:876 builtin/notes.c:177 builtin/tag.c:237
#, c-format
msgid "could not create file '%s'"
msgstr "файлът „%s“ не може да бъде създаден"
-#: bisect.c:921
+#: bisect.c:927 builtin/merge.c:137
#, c-format
msgid "could not read file '%s'"
msgstr "файлът „%s“ не може да бъде прочетен"
-#: bisect.c:951
+#: bisect.c:957
msgid "reading bisect refs failed"
msgstr "неуспешно прочитане на указателите за двоично търсене"
-#: bisect.c:970
+#: bisect.c:976
#, c-format
msgid "%s was both %s and %s\n"
msgstr "„%s“ e както „%s“, така и „%s“\n"
-#: bisect.c:978
+#: bisect.c:984
#, c-format
msgid ""
"No testable commit found.\n"
@@ -1088,7 +1164,7 @@ msgstr ""
"Липсва подходящо за тестване подаване.\n"
"Проверете параметрите за пътищата.\n"
-#: bisect.c:997
+#: bisect.c:1003
#, c-format
msgid "(roughly %d step)"
msgid_plural "(roughly %d steps)"
@@ -1098,52 +1174,53 @@ msgstr[1] "(приблизително %d стъпки)"
#. TRANSLATORS: the last %s will be replaced with "(roughly %d
#. steps)" translation.
#.
-#: bisect.c:1003
+#: bisect.c:1009
#, c-format
msgid "Bisecting: %d revision left to test after this %s\n"
msgid_plural "Bisecting: %d revisions left to test after this %s\n"
msgstr[0] "Двоично търсене: остава %d версия след тази %s\n"
msgstr[1] "Двоично търсене: остават %d версии след тази %s\n"
-#: blame.c:1756
+#: blame.c:1784
msgid "--contents and --reverse do not blend well."
msgstr "Опциите „--contents“ и „--reverse“ са несъвместими"
-#: blame.c:1767
+#: blame.c:1798
msgid "cannot use --contents with final commit object name"
msgstr "Опцията „--contents“ е несъвместима с име на обект от крайно подаване"
-#: blame.c:1787
+#: blame.c:1819
msgid "--reverse and --first-parent together require specified latest commit"
msgstr ""
"Едновременното задаване на опциите „--reverse“ и „--first-parent“ изисква "
"указването на крайно подаване"
-#: blame.c:1796 bundle.c:160 ref-filter.c:2075 sequencer.c:1861
-#: sequencer.c:3632 builtin/commit.c:981 builtin/log.c:366 builtin/log.c:920
-#: builtin/log.c:1371 builtin/log.c:1702 builtin/log.c:1950 builtin/merge.c:372
+#: blame.c:1828 bundle.c:162 ref-filter.c:2154 sequencer.c:1874
+#: sequencer.c:3772 builtin/commit.c:994 builtin/log.c:372 builtin/log.c:926
+#: builtin/log.c:1381 builtin/log.c:1713 builtin/log.c:1963 builtin/merge.c:404
+#: builtin/pack-objects.c:3029 builtin/pack-objects.c:3044
#: builtin/shortlog.c:192
msgid "revision walk setup failed"
msgstr "неуспешно настройване на обхождането на версиите"
-#: blame.c:1814
+#: blame.c:1846
msgid ""
"--reverse --first-parent together require range along first-parent chain"
msgstr ""
"Едновременното задаване на опциите „--reverse“ и „--first-parent“ изисква "
"указването на диапазон по веригата на първите наследници"
-#: blame.c:1825
+#: blame.c:1857
#, c-format
msgid "no such path %s in %s"
msgstr "няма път на име „%s“ в „%s“"
-#: blame.c:1836
+#: blame.c:1868
#, c-format
msgid "cannot read blob %s for path %s"
msgstr "обектът-BLOB „%s“ в пътя %s не може да бъде прочетен"
-#: branch.c:54
+#: branch.c:52
#, c-format
msgid ""
"\n"
@@ -1156,88 +1233,88 @@ msgstr ""
"информацията за следения клон чрез:\n"
"git branch --set-upstream-to=%s%s%s"
-#: branch.c:68
+#: branch.c:66
#, c-format
msgid "Not setting branch %s as its own upstream."
msgstr ""
"Клонът „%s“ не може да служи като източник за собствената си синхронизация."
-#: branch.c:94
+#: branch.c:92
#, c-format
msgid "Branch '%s' set up to track remote branch '%s' from '%s' by rebasing."
msgstr ""
"Клонът „%s“ ще следи отдалечения клон „%s“ от хранилището „%s“ чрез "
"пребазиране."
-#: branch.c:95
+#: branch.c:93
#, c-format
msgid "Branch '%s' set up to track remote branch '%s' from '%s'."
msgstr "Клонът „%s“ ще следи отдалечения клон „%s“ от хранилището „%s“."
-#: branch.c:99
+#: branch.c:97
#, c-format
msgid "Branch '%s' set up to track local branch '%s' by rebasing."
msgstr "Клонът „%s“ ще следи локалния клон „%s“ чрез пребазиране."
-#: branch.c:100
+#: branch.c:98
#, c-format
msgid "Branch '%s' set up to track local branch '%s'."
msgstr "Клонът „%s“ ще следи локалния клон „%s“."
-#: branch.c:105
+#: branch.c:103
#, c-format
msgid "Branch '%s' set up to track remote ref '%s' by rebasing."
msgstr "Клонът „%s“ ще следи отдалечения указател „%s“ чрез пребазиране."
-#: branch.c:106
+#: branch.c:104
#, c-format
msgid "Branch '%s' set up to track remote ref '%s'."
msgstr "Клонът „%s“ ще следи отдалечения указател „%s“."
-#: branch.c:110
+#: branch.c:108
#, c-format
msgid "Branch '%s' set up to track local ref '%s' by rebasing."
msgstr "Клонът „%s“ ще следи локалния указател „%s“ чрез пребазиране."
-#: branch.c:111
+#: branch.c:109
#, c-format
msgid "Branch '%s' set up to track local ref '%s'."
msgstr "Клонът „%s“ ще следи локалния указател „%s“."
-#: branch.c:120
+#: branch.c:118
msgid "Unable to write upstream branch configuration"
msgstr "Настройките за следения клон не могат да бъдат записани"
-#: branch.c:157
+#: branch.c:155
#, c-format
msgid "Not tracking: ambiguous information for ref %s"
msgstr "Няма следене: информацията за указателя „%s“ не е еднозначна"
-#: branch.c:190
+#: branch.c:188
#, c-format
msgid "'%s' is not a valid branch name."
msgstr "„%s“ не е позволено име за клон."
-#: branch.c:209
+#: branch.c:207
#, c-format
msgid "A branch named '%s' already exists."
msgstr "Вече съществува клон с име „%s“."
-#: branch.c:214
+#: branch.c:212
msgid "Cannot force update the current branch."
msgstr "Текущият клон не може да бъде принудително обновен."
-#: branch.c:234
+#: branch.c:232
#, c-format
msgid "Cannot setup tracking information; starting point '%s' is not a branch."
msgstr "Зададените настройки за следенето са грешни — началото „%s“ не е клон."
-#: branch.c:236
+#: branch.c:234
#, c-format
msgid "the requested upstream branch '%s' does not exist"
msgstr "заявеният отдалечен клон „%s“ не съществува"
-#: branch.c:238
+#: branch.c:236
msgid ""
"\n"
"If you are planning on basing your work on an upstream\n"
@@ -1256,101 +1333,101 @@ msgstr ""
"може да използвате „git push -u“, за да настроите към кой клон да се "
"изтласква."
-#: branch.c:281
+#: branch.c:279
#, c-format
msgid "Not a valid object name: '%s'."
msgstr "Неправилно име на обект: „%s“"
-#: branch.c:301
+#: branch.c:299
#, c-format
msgid "Ambiguous object name: '%s'."
msgstr "Името на обект не е еднозначно: „%s“"
-#: branch.c:306
+#: branch.c:304
#, c-format
msgid "Not a valid branch point: '%s'."
msgstr "Неправилно място за начало на клон: „%s“"
-#: branch.c:360
+#: branch.c:358
#, c-format
msgid "'%s' is already checked out at '%s'"
msgstr "„%s“ вече е изтеглен в „%s“"
-#: branch.c:383
+#: branch.c:381
#, c-format
msgid "HEAD of working tree %s is not updated"
msgstr "Указателят „HEAD“ на работното дърво „%s“ не е обновен"
-#: bundle.c:34
+#: bundle.c:36
#, c-format
msgid "'%s' does not look like a v2 bundle file"
msgstr "Файлът „%s“ не изглежда да е пратка на git версия 2"
-#: bundle.c:62
+#: bundle.c:64
#, c-format
msgid "unrecognized header: %s%s (%d)"
msgstr "непозната заглавна част: %s%s (%d)"
-#: bundle.c:88 sequencer.c:2081 sequencer.c:2558 builtin/commit.c:755
+#: bundle.c:90 sequencer.c:2092 sequencer.c:2578 builtin/commit.c:768
#, c-format
msgid "could not open '%s'"
msgstr "„%s“ не може да се отвори"
-#: bundle.c:139
+#: bundle.c:141
msgid "Repository lacks these prerequisite commits:"
msgstr "В хранилището липсват следните необходими подавания:"
-#: bundle.c:190
+#: bundle.c:192
#, c-format
msgid "The bundle contains this ref:"
msgid_plural "The bundle contains these %d refs:"
msgstr[0] "Пратката съдържа следния указател:"
msgstr[1] "Пратката съдържа следните %d указатели:"
-#: bundle.c:197
+#: bundle.c:199
msgid "The bundle records a complete history."
msgstr "Пратката съдържа пълна история."
-#: bundle.c:199
+#: bundle.c:201
#, c-format
msgid "The bundle requires this ref:"
msgid_plural "The bundle requires these %d refs:"
msgstr[0] "Пратката изисква следния указател:"
msgstr[1] "Пратката изисква следните %d указатели:"
-#: bundle.c:258
+#: bundle.c:260
msgid "Could not spawn pack-objects"
msgstr "Командата „git pack-objects“ не може да бъде стартирана"
-#: bundle.c:269
+#: bundle.c:271
msgid "pack-objects died"
msgstr "Командата „git pack-objects“ не завърши успешно"
-#: bundle.c:311
+#: bundle.c:313
msgid "rev-list died"
msgstr "Командата „git rev-list“ не завърши успешно"
-#: bundle.c:360
+#: bundle.c:362
#, c-format
msgid "ref '%s' is excluded by the rev-list options"
msgstr ""
"указателят „%s“ не е бил включен поради опциите зададени на „git rev-list“"
-#: bundle.c:450 builtin/log.c:183 builtin/log.c:1607 builtin/shortlog.c:303
+#: bundle.c:453 builtin/log.c:187 builtin/log.c:1618 builtin/shortlog.c:304
#, c-format
msgid "unrecognized argument: %s"
msgstr "непознат аргумент: %s"
-#: bundle.c:458
+#: bundle.c:461
msgid "Refusing to create empty bundle."
msgstr "Създаването на празна пратка е невъзможно."
-#: bundle.c:470
+#: bundle.c:473
#, c-format
msgid "cannot create '%s'"
msgstr "Файлът „%s“ не може да бъде създаден"
-#: bundle.c:498
+#: bundle.c:501
msgid "index-pack died"
msgstr "Командата „git index-pack“ не завърши успешно"
@@ -1359,19 +1436,19 @@ msgstr "Командата „git index-pack“ не завърши успешн
msgid "invalid color value: %.*s"
msgstr "неправилна стойност за цвят: %.*s"
-#: commit.c:43 sequencer.c:2364 builtin/am.c:421 builtin/am.c:465
-#: builtin/am.c:1436 builtin/am.c:2072 builtin/replace.c:376
+#: commit.c:48 sequencer.c:2384 builtin/am.c:422 builtin/am.c:466
+#: builtin/am.c:1438 builtin/am.c:2072 builtin/replace.c:376
#: builtin/replace.c:448
#, c-format
msgid "could not parse %s"
msgstr "„%s“ не може да се анализира"
-#: commit.c:45
+#: commit.c:50
#, c-format
msgid "%s %s is not a commit!"
msgstr "%s %s не е подаване!"
-#: commit.c:182
+#: commit.c:191
msgid ""
"Support for <GIT_DIR>/info/grafts is deprecated\n"
"and will be removed in a future Git version.\n"
@@ -1394,7 +1471,7 @@ msgstr ""
"\n"
" git config advice.graftFileDeprecated false"
-#: commit.c:1540
+#: commit.c:1629
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"
@@ -1404,186 +1481,396 @@ msgstr ""
"Може да поправите подаването заедно със съобщението или може да\n"
"зададете ползваното кодиране в настройката „i18n.commitencoding“.\n"
-#: commit-graph.c:669
+#: commit-graph.c:83
+#, c-format
+msgid "graph file %s is too small"
+msgstr "файлът с гра̀фа на подаванията „%s“ е твърде малък"
+
+#: commit-graph.c:90
+#, c-format
+msgid "graph signature %X does not match signature %X"
+msgstr "отпечатъкът на гра̀фа с подаванията %X не съвпада с %X"
+
+#: commit-graph.c:97
+#, c-format
+msgid "graph version %X does not match version %X"
+msgstr "версията на гра̀фа с подаванията %X не съвпада с %X"
+
+#: commit-graph.c:104
+#, c-format
+msgid "hash version %X does not match version %X"
+msgstr "версията на отпечатъка на гра̀фа с подаванията %X не съвпада с %X"
+
+#: commit-graph.c:128
+#, c-format
+msgid "improper chunk offset %08x%08x"
+msgstr "неправилно отместване на откъс: %08x%08x"
+
+#: commit-graph.c:164
+#, c-format
+msgid "chunk id %08x appears multiple times"
+msgstr "откъсът %08x се явява многократно"
+
+#: commit-graph.c:261
+#, c-format
+msgid "could not find commit %s"
+msgstr "подаването „%s“ не може да бъде открито"
+
+#: commit-graph.c:565 builtin/pack-objects.c:2568
+#, c-format
+msgid "unable to get type of object %s"
+msgstr "видът на обекта „%s“ не може да бъде определен"
+
+#: commit-graph.c:730
+#, c-format
+msgid "error adding pack %s"
+msgstr "грешка при добавяне на пакетен файл „%s“"
+
+#: commit-graph.c:732
+#, c-format
+msgid "error opening index for %s"
+msgstr "грешка при отваряне на индекса на „%s“"
+
+#: commit-graph.c:773
#, c-format
msgid "the commit graph format cannot write %d commits"
msgstr "форматът на гра̀фа с подаванията не може да запише %d подавания"
-#: commit-graph.c:696
+#: commit-graph.c:800
msgid "too many commits to write graph"
msgstr "прекалено много подавания за записване на гра̀фа"
-#: commit-graph.c:707 builtin/init-db.c:516 builtin/init-db.c:521
+#: commit-graph.c:806
#, c-format
-msgid "cannot mkdir %s"
-msgstr "директорията „%s“ не може да бъде създадена"
+msgid "unable to create leading directories of %s"
+msgstr "родителските директории на „%s“ не могат да бъдат създадени"
+
+#: commit-graph.c:904
+msgid "the commit-graph file has incorrect checksum and is likely corrupt"
+msgstr "графът с подаванията е с грешна сума за проверка — вероятно е повреден"
#: compat/obstack.c:405 compat/obstack.c:407
msgid "memory exhausted"
msgstr "паметта свърши"
-#: config.c:187
+#: config.c:123
+#, c-format
+msgid ""
+"exceeded maximum include depth (%d) while including\n"
+"\t%s\n"
+"from\n"
+"\t%s\n"
+"This might be due to circular includes."
+msgstr ""
+"максималната дълбочина на влагане (%d) е надвишена при вмъкването на:\n"
+" %s\n"
+"от\n"
+" %s\n"
+"Това може да се дължи на зацикляне при вмъкването."
+
+#: config.c:139
+#, c-format
+msgid "could not expand include path '%s'"
+msgstr "пътят за вмъкване „%s“не може да бъде разширен"
+
+#: config.c:150
+msgid "relative config includes must come from files"
+msgstr "относителните вмъквания на конфигурации трябва да идват от файлове"
+
+#: config.c:190
msgid "relative config include conditionals must come from files"
msgstr "относителните условни изрази за вмъкване трябва да идват от файлове"
-#: config.c:788
+#: config.c:348
+#, c-format
+msgid "key does not contain a section: %s"
+msgstr "ключът не съдържа раздел: „%s“"
+
+#: config.c:354
+#, c-format
+msgid "key does not contain variable name: %s"
+msgstr "ключът не съдържа име на променлива: „%s“"
+
+#: config.c:378 sequencer.c:2206
+#, c-format
+msgid "invalid key: %s"
+msgstr "неправилен ключ: „%s“"
+
+#: config.c:384
+#, c-format
+msgid "invalid key (newline): %s"
+msgstr "неправилен ключ (нов ред): „%s“"
+
+#: config.c:420 config.c:432
+#, c-format
+msgid "bogus config parameter: %s"
+msgstr "неправилен конфигурационен параметър: „%s“"
+
+#: config.c:467
+#, c-format
+msgid "bogus format in %s"
+msgstr "неправилен формат в „%s“"
+
+#: config.c:793
#, c-format
msgid "bad config line %d in blob %s"
msgstr "неправилен ред за настройки %d в BLOB „%s“"
-#: config.c:792
+#: config.c:797
#, c-format
msgid "bad config line %d in file %s"
msgstr "неправилен ред за настройки %d във файла „%s“"
-#: config.c:796
+#: config.c:801
#, c-format
msgid "bad config line %d in standard input"
msgstr "неправилен ред за настройки %d на стандартния вход"
-#: config.c:800
+#: config.c:805
#, c-format
msgid "bad config line %d in submodule-blob %s"
msgstr "неправилен ред за настройки %d в BLOB за подмодул „%s“"
-#: config.c:804
+#: config.c:809
#, c-format
msgid "bad config line %d in command line %s"
msgstr "неправилен ред за настройки %d на командния ред „%s“"
-#: config.c:808
+#: config.c:813
#, c-format
msgid "bad config line %d in %s"
msgstr "неправилен ред за настройки %d в „%s“"
-#: config.c:936
+#: config.c:952
msgid "out of range"
msgstr "извън диапазона"
-#: config.c:936
+#: config.c:952
msgid "invalid unit"
msgstr "неправилна мерна единица"
-#: config.c:942
+#: config.c:958
#, c-format
msgid "bad numeric config value '%s' for '%s': %s"
msgstr "неправилна числова стойност „%s“ за „%s“: %s"
-#: config.c:947
+#: config.c:963
#, c-format
msgid "bad numeric config value '%s' for '%s' in blob %s: %s"
msgstr "неправилна числова стойност „%s“ за „%s“ в BLOB „%s“: %s"
-#: config.c:950
+#: config.c:966
#, c-format
msgid "bad numeric config value '%s' for '%s' in file %s: %s"
msgstr "неправилна числова стойност „%s“ за „%s“ във файла „%s“: %s"
-#: config.c:953
+#: config.c:969
#, c-format
msgid "bad numeric config value '%s' for '%s' in standard input: %s"
msgstr "неправилна числова стойност „%s“ за „%s“ на стандартния вход: %s"
-#: config.c:956
+#: config.c:972
#, c-format
msgid "bad numeric config value '%s' for '%s' in submodule-blob %s: %s"
msgstr "неправилна числова стойност „%s“ за „%s“ в BLOB от подмодул „%s“: %s"
-#: config.c:959
+#: config.c:975
#, c-format
msgid "bad numeric config value '%s' for '%s' in command line %s: %s"
msgstr "неправилна числова стойност „%s“ за „%s“ на командния ред „%s“: %s"
-#: config.c:962
+#: config.c:978
#, c-format
msgid "bad numeric config value '%s' for '%s' in %s: %s"
msgstr "неправилна числова стойност „%s“ за „%s“ в %s: %s"
-#: config.c:1057
+#: config.c:1073
#, c-format
msgid "failed to expand user dir in: '%s'"
msgstr "домашната папка на потребителя не може да бъде открита: „%s“"
-#: config.c:1066
+#: config.c:1082
#, c-format
msgid "'%s' for '%s' is not a valid timestamp"
msgstr "„%s“ не е правилна стойност за време за „%s“"
-#: config.c:1171 config.c:1182
+#: config.c:1173
+#, c-format
+msgid "abbrev length out of range: %d"
+msgstr "дължината на съкращаване е извън интервала ([4; 40]): %d"
+
+#: config.c:1187 config.c:1198
#, c-format
msgid "bad zlib compression level %d"
msgstr "неправилно ниво на компресиране: %d"
-#: config.c:1307
+#: config.c:1290
+msgid "core.commentChar should only be one character"
+msgstr "настройката „core.commentChar“ трябва да е само един знак"
+
+#: config.c:1323
#, c-format
msgid "invalid mode for object creation: %s"
msgstr "неправилен режим за създаването на обекти: %s"
-#: config.c:1473
+#: config.c:1403
+#, c-format
+msgid "malformed value for %s"
+msgstr "неправилна стойност за „%s“"
+
+#: config.c:1429
+#, c-format
+msgid "malformed value for %s: %s"
+msgstr "неправилна стойност за „%s“: „%s“"
+
+#: config.c:1430
+msgid "must be one of nothing, matching, simple, upstream or current"
+msgstr ""
+"трябва да е една от следните стойности: „nothing“ (без изтласкване при липса "
+"на указател), „matching“ (всички клони със съвпадащи имена), "
+"„simple“ (клонът със същото име, от който се издърпва), „upstream“ (клонът, "
+"от който се издърпва) или „current“ (клонът със същото име)"
+
+#: config.c:1489 builtin/pack-objects.c:3279
#, c-format
msgid "bad pack compression level %d"
msgstr "неправилно ниво на компресиране при пакетиране: %d"
-#: config.c:1681
+#: config.c:1610
+#, c-format
+msgid "unable to load config blob object '%s'"
+msgstr "обектът-BLOB „%s“ с конфигурации не може да се зареди"
+
+#: config.c:1613
+#, c-format
+msgid "reference '%s' does not point to a blob"
+msgstr "указателят „%s“ не сочи към обект-BLOB"
+
+#: config.c:1630
+#, c-format
+msgid "unable to resolve config blob '%s'"
+msgstr "обектът-BLOB „%s“ с конфигурации не може да бъде открит"
+
+#: config.c:1660
+#, c-format
+msgid "failed to parse %s"
+msgstr "„%s“ не може да бъде анализиран"
+
+#: config.c:1700
msgid "unable to parse command-line config"
msgstr "неправилни настройки от командния ред"
-#: config.c:2013
+#: config.c:2032
msgid "unknown error occurred while reading the configuration files"
msgstr "неочаквана грешка при изчитането на конфигурационните файлове"
-#: config.c:2200
+#: config.c:2202
#, c-format
msgid "Invalid %s: '%s'"
msgstr "Неправилен %s: „%s“"
-#: config.c:2243
+#: config.c:2245
#, c-format
msgid "unknown core.untrackedCache value '%s'; using 'keep' default value"
msgstr ""
"непозната стойност „%s“ за настройката „core.untrackedCache“. Ще се ползва "
"стандартната стойност „keep“ (запазване)"
-#: config.c:2269
+#: config.c:2271
#, c-format
msgid "splitIndex.maxPercentChange value '%d' should be between 0 and 100"
msgstr ""
"стойността на „splitIndex.maxPercentChange“ трябва да е между 1 и 100, а не "
"%d"
-#: config.c:2294
+#: config.c:2296
#, c-format
msgid "unable to parse '%s' from command-line config"
msgstr "неразпозната стойност „%s“ от командния ред"
-#: config.c:2296
+#: config.c:2298
#, c-format
msgid "bad config variable '%s' in file '%s' at line %d"
msgstr "неправилна настройка „%s“ във файла „%s“ на ред №%d"
-#: config.c:2402
+#: config.c:2379
+#, c-format
+msgid "invalid section name '%s'"
+msgstr "неправилно име на раздел: „%s“"
+
+#: config.c:2411
#, c-format
msgid "%s has multiple values"
msgstr "зададени са няколко стойности за „%s“"
-#: config.c:2766 config.c:3019
+#: config.c:2440
+#, c-format
+msgid "failed to write new configuration file %s"
+msgstr "новият конфигурационен файл „%s“ не може да бъде запазен"
+
+#: config.c:2691 config.c:3015
+#, c-format
+msgid "could not lock config file %s"
+msgstr "конфигурационният файл „%s“ не може да бъде заключен"
+
+#: config.c:2702
+#, c-format
+msgid "opening %s"
+msgstr "отваряне на „%s“"
+
+#: config.c:2737 builtin/config.c:324
+#, c-format
+msgid "invalid pattern: %s"
+msgstr "неправилен шаблон: %s"
+
+#: config.c:2762
+#, c-format
+msgid "invalid config file %s"
+msgstr "неправилен конфигурационен файл: „%s“"
+
+#: config.c:2775 config.c:3028
#, c-format
msgid "fstat on %s failed"
msgstr "неуспешно изпълнение на „fstat“ върху „%s“"
-#: config.c:2905
+#: config.c:2786
+#, c-format
+msgid "unable to mmap '%s'"
+msgstr "неуспешно изпълнение на „mmap“ върху „%s“"
+
+#: config.c:2795 config.c:3033
+#, c-format
+msgid "chmod on %s failed"
+msgstr "неуспешна смяна на права с „chmod“ върху „%s“"
+
+#: config.c:2880 config.c:3130
+#, c-format
+msgid "could not write config file %s"
+msgstr "конфигурационният файл „%s“ не може да бъде записан"
+
+#: config.c:2914
#, c-format
msgid "could not set '%s' to '%s'"
msgstr "„%s“ не може да се зададе да е „%s“"
-#: config.c:2907 builtin/remote.c:779
+#: config.c:2916 builtin/remote.c:781
#, c-format
msgid "could not unset '%s'"
msgstr "„%s“ не може да се премахне"
+#: config.c:3006
+#, c-format
+msgid "invalid section name: %s"
+msgstr "неправилно име на раздел: %s"
+
+#: config.c:3173
+#, c-format
+msgid "missing value for '%s'"
+msgstr "липсва стойност за „%s“"
+
#: connect.c:61
-msgid "The remote end hung up upon initial contact"
-msgstr "Отдалеченото хранилище прекъсна връзката веднага след отварянето ѝ"
+msgid "the remote end hung up upon initial contact"
+msgstr "отдалеченото хранилище прекъсна връзката веднага след отварянето ѝ"
#: connect.c:63
msgid ""
@@ -1597,62 +1884,220 @@ msgstr ""
"Проверете дали то съществува и дали имате права\n"
"за достъп."
-#: connected.c:66 builtin/fsck.c:201 builtin/prune.c:145
+#: connect.c:81
+#, c-format
+msgid "server doesn't support '%s'"
+msgstr "сървърът не поддържа „%s“"
+
+#: connect.c:103
+#, c-format
+msgid "server doesn't support feature '%s'"
+msgstr "сървърът не поддържа „%s“"
+
+#: connect.c:114
+msgid "expected flush after capabilities"
+msgstr ""
+"след първоначалната обява на възможностите се очаква изчистване на буферите"
+
+#: connect.c:233
+#, c-format
+msgid "ignoring capabilities after first line '%s'"
+msgstr "пропускане на възможностите след първия ред „%s“"
+
+#: connect.c:252
+msgid "protocol error: unexpected capabilities^{}"
+msgstr "протоколна грешка: неочаквани възможности^{}"
+
+#: connect.c:273
+#, c-format
+msgid "protocol error: expected shallow sha-1, got '%s'"
+msgstr "протоколна грешка: очаква се SHA1 на плитък обект, а бе получено: „%s“"
+
+#: connect.c:275
+msgid "repository on the other end cannot be shallow"
+msgstr "отсрещното хранилище не може да е плитко"
+
+#: connect.c:310 fetch-pack.c:183 builtin/archive.c:63
+#, c-format
+msgid "remote error: %s"
+msgstr "отдалечена грешка: %s"
+
+#: connect.c:316
+msgid "invalid packet"
+msgstr "неправилен пакет"
+
+#: connect.c:336
+#, c-format
+msgid "protocol error: unexpected '%s'"
+msgstr "протоколна грешка: неочаквано „%s“"
+
+#: connect.c:444
+#, c-format
+msgid "invalid ls-refs response: %s"
+msgstr "неправилен отговор на „ls-refs“: „%s“"
+
+#: connect.c:448
+msgid "expected flush after ref listing"
+msgstr "очакваше се изчистване на буферите след изброяването на указателите"
+
+#: connect.c:547
+#, c-format
+msgid "protocol '%s' is not supported"
+msgstr "протокол „%s“ не се поддържа"
+
+#: connect.c:598
+msgid "unable to set SO_KEEPALIVE on socket"
+msgstr "неуспешно задаване на „SO_KEEPALIVE“ на гнездо"
+
+#: connect.c:638 connect.c:701
+#, c-format
+msgid "Looking up %s ... "
+msgstr "Търсене на „%s“… "
+
+#: connect.c:642
+#, c-format
+msgid "unable to look up %s (port %s) (%s)"
+msgstr "„%s“ (порт %s) не може да се открие („%s“)"
+
+#. TRANSLATORS: this is the end of "Looking up %s ... "
+#: connect.c:646 connect.c:717
+#, c-format
+msgid ""
+"done.\n"
+"Connecting to %s (port %s) ... "
+msgstr ""
+"готово.\n"
+"Свързване към „%s“ (порт %s)…"
+
+#: connect.c:668 connect.c:745
+#, c-format
+msgid ""
+"unable to connect to %s:\n"
+"%s"
+msgstr ""
+"неуспешно свързване към „%s“:\n"
+"%s"
+
+#. TRANSLATORS: this is the end of "Connecting to %s (port %s) ... "
+#: connect.c:674 connect.c:751
+msgid "done."
+msgstr "действието завърши."
+
+#: connect.c:705
+#, c-format
+msgid "unable to look up %s (%s)"
+msgstr "„%s“ не може да се открие (%s)"
+
+#: connect.c:711
+#, c-format
+msgid "unknown port %s"
+msgstr "непознат порт „%s“"
+
+#: connect.c:848 connect.c:1174
+#, c-format
+msgid "strange hostname '%s' blocked"
+msgstr "необичайното име на хост „%s“ е блокирано"
+
+#: connect.c:850
+#, c-format
+msgid "strange port '%s' blocked"
+msgstr "необичайният порт „%s“ е блокиран"
+
+#: connect.c:860
+#, c-format
+msgid "cannot start proxy %s"
+msgstr "посредникът „%s“ не може да се стартира"
+
+#: connect.c:927
+msgid "no path specified; see 'git help pull' for valid url syntax"
+msgstr ""
+"не е указан път. Проверете синтаксиса с командата:\n"
+"\n"
+" git help pull"
+
+#: connect.c:1122
+msgid "ssh variant 'simple' does not support -4"
+msgstr "вариантът за „ssh“ — „simple“ (опростен), не поддържа опцията „-4“"
+
+#: connect.c:1134
+msgid "ssh variant 'simple' does not support -6"
+msgstr "вариантът за „ssh“ — „simple“ (опростен), не поддържа опцията „-6“"
+
+#: connect.c:1151
+msgid "ssh variant 'simple' does not support setting port"
+msgstr ""
+"вариантът за „ssh“ — „simple“ (опростен), не поддържа задаването на порт"
+
+#: connect.c:1262
+#, c-format
+msgid "strange pathname '%s' blocked"
+msgstr "необичайният път „%s“ е блокиран"
+
+#: connect.c:1307
+msgid "unable to fork"
+msgstr "неуспешно създаване на процес"
+
+#: connected.c:68 builtin/fsck.c:203 builtin/prune.c:146
msgid "Checking connectivity"
msgstr "Проверка на връзката"
-#: connected.c:78
+#: connected.c:80
msgid "Could not run 'git rev-list'"
msgstr "Командата „git rev-list“ не може да бъде изпълнена."
-#: connected.c:98
+#: connected.c:100
msgid "failed write to rev-list"
msgstr "неуспешен запис на списъка с версиите"
-#: connected.c:105
+#: connected.c:107
msgid "failed to close rev-list's stdin"
msgstr "стандартният вход на списъка с версиите не може да бъде затворен"
-#: convert.c:206
+#: convert.c:194
+#, c-format
+msgid "illegal crlf_action %d"
+msgstr "неправилно действие за край на ред: %d"
+
+#: convert.c:207
#, c-format
-msgid "CRLF would be replaced by LF in %s."
+msgid "CRLF would be replaced by LF in %s"
msgstr "Всяка последователност от знаци „CRLF“ ще бъдe заменена с „LF“ в „%s“."
-#: convert.c:208
+#: convert.c:209
#, c-format
msgid ""
"CRLF will be replaced by LF in %s.\n"
-"The file will have its original line endings in your working directory."
+"The file will have its original line endings in your working directory"
msgstr ""
"Всяка последователност от знаци „CRLF“ ще бъдe заменена с „LF“ в „%s“.\n"
"Файлът ще остане с първоначалните знаци за край на ред в работната ви "
"директория."
-#: convert.c:216
+#: convert.c:217
#, c-format
msgid "LF would be replaced by CRLF in %s"
msgstr ""
"Всеки знак „LF“ ще бъдe заменен с последователността от знаци „CRLF“ в „%s“."
-#: convert.c:218
+#: convert.c:219
#, c-format
msgid ""
"LF will be replaced by CRLF in %s.\n"
-"The file will have its original line endings in your working directory."
+"The file will have its original line endings in your working directory"
msgstr ""
"Всеки знак „LF“ ще бъдe заменен с последователността от знаци „CRLF“ в "
"„%s“.\n"
"Файлът ще остане с първоначалните знаци за край на ред в работната ви "
"директория."
-#: convert.c:279
+#: convert.c:280
#, c-format
msgid "BOM is prohibited in '%s' if encoded as %s"
msgstr ""
"„%s“ не трябва да съдържа маркер за поредността на байтовете (BOM) при "
"кодиране „%s“"
-#: convert.c:286
+#: convert.c:287
#, c-format
msgid ""
"The file '%s' contains a byte order mark (BOM). Please use UTF-%s as working-"
@@ -1661,14 +2106,14 @@ msgstr ""
"Файлът „%s“ съдържа маркер за поредността на байтовете (BOM). Използвайте "
"„UTF-%s“ като кодиране за работното дърво."
-#: convert.c:304
+#: convert.c:305
#, c-format
msgid "BOM is required in '%s' if encoded as %s"
msgstr ""
"„%s“ трябва да съдържа маркер за поредността на байтовете (BOM) при кодиране "
"„%s“"
-#: convert.c:306
+#: convert.c:307
#, c-format
msgid ""
"The file '%s' is missing a byte order mark (BOM). Please use UTF-%sBE or UTF-"
@@ -1678,20 +2123,72 @@ msgstr ""
"на работното дърво използвайте UTF-%sBE или UTF-%sLE (в зависимост от "
"поредността на байтовете)."
-#: convert.c:424
+#: convert.c:425 convert.c:496
#, c-format
msgid "failed to encode '%s' from %s to %s"
msgstr "неуспешно прекодиране на „%s“ от „%s“ към „%s“"
-#: convert.c:467
+#: convert.c:468
#, c-format
msgid "encoding '%s' from %s to %s and back is not the same"
msgstr "Прекодирането на „%s“ от „%s“ към „%s“ и обратно променя файла"
-#: convert.c:1225
+#: convert.c:674
+#, c-format
+msgid "cannot fork to run external filter '%s'"
+msgstr "неуспешно създаване на процес за външен филтър „%s“"
+
+#: convert.c:694
+#, c-format
+msgid "cannot feed the input to external filter '%s'"
+msgstr "входът не може да бъде подаден на външния филтър „%s“"
+
+#: convert.c:701
+#, c-format
+msgid "external filter '%s' failed %d"
+msgstr "неуспешно изпълнение на външния филтър „%s“: %d"
+
+#: convert.c:736 convert.c:739
+#, c-format
+msgid "read from external filter '%s' failed"
+msgstr "неуспешно четене от външния филтър „%s“"
+
+#: convert.c:742 convert.c:796
+#, c-format
+msgid "external filter '%s' failed"
+msgstr "неуспешно изпълнение на външния филтър „%s“"
+
+#: convert.c:844
+msgid "unexpected filter type"
+msgstr "неочакван вид филтър"
+
+#: convert.c:855
+msgid "path name too long for external filter"
+msgstr "пътят е прекалено дълъг за външен филтър"
+
+#: convert.c:929
+#, c-format
+msgid ""
+"external filter '%s' is not available anymore although not all paths have "
+"been filtered"
+msgstr ""
+"външният филтър „%s“ вече не е наличен, въпреки че не всички пътища са "
+"филтрирани"
+
+#: convert.c:1228
msgid "true/false are no valid working-tree-encodings"
msgstr "„true“/„false“ не може да са кодирания на работното дърво"
+#: convert.c:1402 convert.c:1436
+#, c-format
+msgid "%s: clean filter '%s' failed"
+msgstr "%s: неуспешно изпълнение на декодиращ филтър „%s“"
+
+#: convert.c:1480
+#, c-format
+msgid "%s: smudge filter %s failed"
+msgstr "%s: неуспешно изпълнение на кодиращ филтър „%s“"
+
#: date.c:116
msgid "in the future"
msgstr "в бъдещето"
@@ -1765,42 +2262,55 @@ msgstr[1] "преди %<PRIuMAX> години"
msgid "failed to read orderfile '%s'"
msgstr "файлът с подредбата на съответствията „%s“ не може да бъде прочетен"
-#: diffcore-rename.c:535
+#: diffcore-rename.c:536
msgid "Performing inexact rename detection"
msgstr "Търсене на преименувания на обекти съчетани с промени"
-#: diff.c:74
+#: diff.c:108
#, c-format
msgid "option '%s' requires a value"
msgstr "опцията „%s“ изисква стойност"
-#: diff.c:152
+#: diff.c:158
#, c-format
msgid " Failed to parse dirstat cut-off percentage '%s'\n"
msgstr ""
" Неуспешно разпознаване на „%s“ като процент-праг за статистиката по "
"директории\n"
-#: diff.c:157
+#: diff.c:163
#, c-format
msgid " Unknown dirstat parameter '%s'\n"
msgstr " Непознат параметър „%s“ за статистиката по директории'\n"
-#: diff.c:281
+#: diff.c:291
msgid ""
-"color moved setting must be one of 'no', 'default', 'zebra', 'dimmed_zebra', "
-"'plain'"
+"color moved setting must be one of 'no', 'default', 'blocks', 'zebra', "
+"'dimmed-zebra', 'plain'"
msgstr ""
"настройката за цвят за преместване трябва да е една от: „no“ (без), "
-"„default“ (стандартно), „zebra“ (райе), „dimmed_zebra“ (тъмно райе), "
-"„plain“ (обикновено)"
+"„default“ (стандартно), „blocks“ (парчета), „zebra“ (райе), "
+"„dimmed_zebra“ (тъмно райе), „plain“ (обикновено)"
-#: diff.c:341
+#: diff.c:316
+#, c-format
+msgid "ignoring unknown color-moved-ws mode '%s'"
+msgstr "непознатата стойност „%s“ на настройката „color-moved-ws“ се прескача"
+
+#: diff.c:323
+msgid ""
+"color-moved-ws: allow-indentation-change cannot be combined with other white "
+"space modes"
+msgstr ""
+"color-moved-ws: „allow-indentation-change“ е несъвместима с другите режими "
+"за знаците за интервали"
+
+#: diff.c:394
#, c-format
msgid "Unknown value for 'diff.submodule' config variable: '%s'"
msgstr "Непозната стойност „%s“ за настройката „diff.submodule“"
-#: diff.c:401
+#: diff.c:454
#, c-format
msgid ""
"Found errors in 'diff.dirstat' config variable:\n"
@@ -1809,27 +2319,27 @@ msgstr ""
"Грешки в настройката „diff.dirstat“:\n"
"%s"
-#: diff.c:3823
+#: diff.c:4096
#, c-format
msgid "external diff died, stopping at %s"
msgstr ""
"външната програма за разлики завърши неуспешно. Спиране на работата при „%s“"
-#: diff.c:4153
+#: diff.c:4427
msgid "--name-only, --name-status, --check and -s are mutually exclusive"
msgstr ""
"Опциите „--name-only“, „--name-status“, „--check“ и „-s“ са несъвместими "
"една с друга"
-#: diff.c:4156
+#: diff.c:4430
msgid "-G, -S and --find-object are mutually exclusive"
msgstr "Опциите „-G“, „-S“ и „--find-object“ са несъвместими една с друга"
-#: diff.c:4244
+#: diff.c:4508
msgid "--follow requires exactly one pathspec"
msgstr "Опцията „--follow“ изисква точно един път"
-#: diff.c:4410
+#: diff.c:4674
#, c-format
msgid ""
"Failed to parse --dirstat/-X option parameter:\n"
@@ -1838,48 +2348,63 @@ msgstr ""
"Неразпознат параметър към опцията „--dirstat/-X“:\n"
"%s"
-#: diff.c:4424
+#: diff.c:4688
#, c-format
msgid "Failed to parse --submodule option parameter: '%s'"
msgstr "Неразпознат параметър към опцията „--submodule“: „%s“"
-#: diff.c:5500
+#: diff.c:5766
msgid "inexact rename detection was skipped due to too many files."
msgstr ""
"търсенето на преименувания на обекти съчетани с промени се прескача поради "
"многото файлове."
-#: diff.c:5503
+#: diff.c:5769
msgid "only found copies from modified paths due to too many files."
msgstr ""
"установени са точните копия на променените пътища поради многото файлове."
-#: diff.c:5506
+#: diff.c:5772
#, c-format
msgid ""
"you may want to set your %s variable to at least %d and retry the command."
msgstr "задайте променливата „%s“ да е поне %d и отново изпълнете командата."
-#: dir.c:1867
+#: dir.c:569
+#, c-format
+msgid "pathspec '%s' did not match any file(s) known to git"
+msgstr "пътят „%s“ не съвпада с никой файл в git"
+
+#: dir.c:958
+#, c-format
+msgid "cannot use %s as an exclude file"
+msgstr "„%s“ не може да се ползва за игнорираните файлове (като gitignore)"
+
+#: dir.c:1873
#, c-format
msgid "could not open directory '%s'"
msgstr "директорията „%s“ не може да бъде отворена"
-#: dir.c:2109
+#: dir.c:2115
msgid "failed to get kernel name and information"
msgstr "името и версията на ядрото не бяха получени"
-#: dir.c:2233
-msgid "Untracked cache is disabled on this system or location."
+#: dir.c:2239
+msgid "untracked cache is disabled on this system or location"
msgstr ""
-"Кеша за неследените файлове е изключен на тази система или местоположение."
+"кешът за неследените файлове е изключен на тази система или местоположение"
-#: dir.c:3075 dir.c:3080
+#: dir.c:3037
+#, c-format
+msgid "index file corrupt in repo %s"
+msgstr "файлът с индекса е повреден в хранилището „%s“"
+
+#: dir.c:3082 dir.c:3087
#, c-format
msgid "could not create directories for %s"
msgstr "директориите за „%s“ не може да бъдат създадени"
-#: dir.c:3109
+#: dir.c:3116
#, c-format
msgid "could not migrate git directory from '%s' to '%s'"
msgstr "директорията на git не може да се мигрира от „%s“ до „%s“"
@@ -1889,219 +2414,273 @@ msgstr "директорията на git не може да се мигрира
msgid "hint: Waiting for your editor to close the file...%c"
msgstr "Подсказка: чака се редакторът ви да затвори файла …%c"
-#: entry.c:177
+#: entry.c:178
msgid "Filtering content"
msgstr "Филтриране на съдържанието"
-#: entry.c:435
+#: entry.c:437
#, c-format
msgid "could not stat file '%s'"
msgstr "неуспешно изпълнение на „stat“ върху файла „%s“"
+#: environment.c:150
+#, c-format
+msgid "bad git namespace path \"%s\""
+msgstr "неправилен път към пространства от имена „%s“"
+
+#: environment.c:332
+#, c-format
+msgid "could not set GIT_DIR to '%s'"
+msgstr "GIT_DIR не може да се зададе да е „%s“"
+
+#: exec-cmd.c:361
+#, c-format
+msgid "too many args to run %s"
+msgstr "прекалено много аргументи за изпълнение „%s“"
+
#: fetch-object.c:17
msgid "Remote with no URL"
msgstr "Липсва адрес за отдалеченото хранилище"
-#: fetch-pack.c:254
+#: fetch-pack.c:152
msgid "git fetch-pack: expected shallow list"
msgstr "git fetch-pack: очаква се плитък списък"
-#: fetch-pack.c:266
+#: fetch-pack.c:164
msgid "git fetch-pack: expected ACK/NAK, got a flush packet"
msgstr ""
-"git fetch-pack: очакваше се „ACK“/„NAK“, а бе получен изчистващ пакет „flush“"
+"git fetch-pack: очаква се „ACK“/„NAK“, а бе получен изчистващ пакет „flush“"
-#: fetch-pack.c:285 builtin/archive.c:63
-#, c-format
-msgid "remote error: %s"
-msgstr "отдалечена грешка: %s"
-
-#: fetch-pack.c:286
+#: fetch-pack.c:184
#, c-format
msgid "git fetch-pack: expected ACK/NAK, got '%s'"
-msgstr "git fetch-pack: очакваше се „ACK“/„NAK“, а бе получен „%s“"
+msgstr "git fetch-pack: очаква се „ACK“/„NAK“, а бе получено „%s“"
-#: fetch-pack.c:338
+#: fetch-pack.c:254
msgid "--stateless-rpc requires multi_ack_detailed"
msgstr "опцията „--stateless-rpc“ изисква „multi_ack_detailed“"
-#: fetch-pack.c:429 fetch-pack.c:1310
+#: fetch-pack.c:342 fetch-pack.c:1257
#, c-format
msgid "invalid shallow line: %s"
msgstr "неправилен плитък ред: „%s“"
-#: fetch-pack.c:435 fetch-pack.c:1316
+#: fetch-pack.c:348 fetch-pack.c:1263
#, c-format
msgid "invalid unshallow line: %s"
msgstr "неправилен неплитък ред: „%s“"
-#: fetch-pack.c:437 fetch-pack.c:1318
+#: fetch-pack.c:350 fetch-pack.c:1265
#, c-format
msgid "object not found: %s"
msgstr "обектът „%s“ липсва"
-#: fetch-pack.c:440 fetch-pack.c:1321
+#: fetch-pack.c:353 fetch-pack.c:1268
#, c-format
msgid "error in object: %s"
msgstr "грешка в обекта: „%s“"
-#: fetch-pack.c:442 fetch-pack.c:1323
+#: fetch-pack.c:355 fetch-pack.c:1270
#, c-format
msgid "no shallow found: %s"
msgstr "не е открит плитък обект: %s"
-#: fetch-pack.c:445 fetch-pack.c:1326
+#: fetch-pack.c:358 fetch-pack.c:1273
#, c-format
msgid "expected shallow/unshallow, got %s"
-msgstr "очаква се плитък или не обект, а бе получено: %s"
+msgstr "очаква се плитък или не обект, а бе получено: „%s“"
-#: fetch-pack.c:486
+#: fetch-pack.c:399
#, c-format
msgid "got %s %d %s"
msgstr "получено бе %s %d %s"
-#: fetch-pack.c:500
+#: fetch-pack.c:416
#, c-format
msgid "invalid commit %s"
msgstr "неправилно подаване: „%s“"
-#: fetch-pack.c:533
+#: fetch-pack.c:447
msgid "giving up"
msgstr "преустановяване"
-#: fetch-pack.c:543 progress.c:229
+#: fetch-pack.c:459 progress.c:229
msgid "done"
msgstr "действието завърши"
-#: fetch-pack.c:555
+#: fetch-pack.c:471
#, c-format
msgid "got %s (%d) %s"
msgstr "получено бе %s (%d) %s"
-#: fetch-pack.c:601
+#: fetch-pack.c:517
#, c-format
msgid "Marking %s as complete"
msgstr "Отбелязване на „%s“ като пълно"
-#: fetch-pack.c:828
+#: fetch-pack.c:764
#, c-format
msgid "already have %s (%s)"
msgstr "вече има „%s“ (%s)"
-#: fetch-pack.c:869
+#: fetch-pack.c:803
msgid "fetch-pack: unable to fork off sideband demultiplexer"
msgstr "fetch-pack: не може да се създаде процес за демултиплексора"
-#: fetch-pack.c:877
+#: fetch-pack.c:811
msgid "protocol error: bad pack header"
msgstr "протоколна грешка: неправилна заглавна част на пакет"
-#: fetch-pack.c:944
+#: fetch-pack.c:879
#, c-format
msgid "fetch-pack: unable to fork off %s"
msgstr "fetch-pack: не може да се създаде процес за „%s“"
-#: fetch-pack.c:960
+#: fetch-pack.c:895
#, c-format
msgid "%s failed"
msgstr "неуспешно изпълнение на „%s“"
-#: fetch-pack.c:962
+#: fetch-pack.c:897
msgid "error in sideband demultiplexer"
msgstr "грешка в демултиплексора"
-#: fetch-pack.c:989
+#: fetch-pack.c:926
msgid "Server does not support shallow clients"
msgstr "Сървърът не поддържа плитки клиенти"
-#: fetch-pack.c:993
+#: fetch-pack.c:930
msgid "Server supports multi_ack_detailed"
msgstr "Сървърът поддържа „multi_ack_detailed“"
-#: fetch-pack.c:996
+#: fetch-pack.c:933
msgid "Server supports no-done"
msgstr "Сървърът поддържа „no-done“"
-#: fetch-pack.c:1002
+#: fetch-pack.c:939
msgid "Server supports multi_ack"
msgstr "Сървърът поддържа „multi_ack“"
-#: fetch-pack.c:1006
+#: fetch-pack.c:943
msgid "Server supports side-band-64k"
msgstr "Сървърът поддържа „side-band-64k“"
-#: fetch-pack.c:1010
+#: fetch-pack.c:947
msgid "Server supports side-band"
msgstr "Сървърът поддържа „side-band“"
-#: fetch-pack.c:1014
+#: fetch-pack.c:951
msgid "Server supports allow-tip-sha1-in-want"
msgstr "Сървърът поддържа „allow-tip-sha1-in-want“"
-#: fetch-pack.c:1018
+#: fetch-pack.c:955
msgid "Server supports allow-reachable-sha1-in-want"
msgstr "Сървърът поддържа „allow-reachable-sha1-in-want“"
-#: fetch-pack.c:1028
+#: fetch-pack.c:965
msgid "Server supports ofs-delta"
msgstr "Сървърът поддържа „ofs-delta“"
-#: fetch-pack.c:1034 fetch-pack.c:1204
+#: fetch-pack.c:971 fetch-pack.c:1150
msgid "Server supports filter"
msgstr "Сървърът поддържа филтри"
-#: fetch-pack.c:1042
+#: fetch-pack.c:979
#, c-format
msgid "Server version is %.*s"
msgstr "Версията на сървъра е: %.*s"
-#: fetch-pack.c:1048
+#: fetch-pack.c:985
msgid "Server does not support --shallow-since"
msgstr "Сървърът не поддържа опцията „--shallow-since“"
-#: fetch-pack.c:1052
+#: fetch-pack.c:989
msgid "Server does not support --shallow-exclude"
msgstr "Сървърът не поддържа опцията „--shallow-exclude“"
-#: fetch-pack.c:1054
+#: fetch-pack.c:991
msgid "Server does not support --deepen"
msgstr "Сървърът не поддържа опцията „--deepen“"
-#: fetch-pack.c:1065
+#: fetch-pack.c:1004
msgid "no common commits"
msgstr "няма общи подавания"
-#: fetch-pack.c:1077 fetch-pack.c:1414
+#: fetch-pack.c:1016 fetch-pack.c:1393
msgid "git fetch-pack: fetch failed."
msgstr "git fetch-pack: неуспешно доставяне."
-#: fetch-pack.c:1199
+#: fetch-pack.c:1145
msgid "Server does not support shallow requests"
msgstr "Сървърът не поддържа плитки заявки"
-#: fetch-pack.c:1584
+#: fetch-pack.c:1191
+#, c-format
+msgid "error reading section header '%s'"
+msgstr "грешка при прочитане на заглавната част на раздел „%s“"
+
+#: fetch-pack.c:1197
+#, c-format
+msgid "expected '%s', received '%s'"
+msgstr "очаква се „%s“, а бе получено „%s“"
+
+#: fetch-pack.c:1236
+#, c-format
+msgid "unexpected acknowledgment line: '%s'"
+msgstr "неочакван ред за потвърждение: „%s“"
+
+#: fetch-pack.c:1241
+#, c-format
+msgid "error processing acks: %d"
+msgstr "грешка при обработка на потвържденията: %d"
+
+#: fetch-pack.c:1278
+#, c-format
+msgid "error processing shallow info: %d"
+msgstr "грешка при обработка на информация за дълбочината/плиткостта: %d"
+
+#: fetch-pack.c:1294
+#, c-format
+msgid "expected wanted-ref, got '%s'"
+msgstr "очаква се искан указател, а бе получено: „%s“"
+
+#: fetch-pack.c:1304
+#, c-format
+msgid "unexpected wanted-ref: '%s'"
+msgstr "неочакван искан указател: „%s“"
+
+#: fetch-pack.c:1308
+#, c-format
+msgid "error processing wanted refs: %d"
+msgstr "грешка при обработката на исканите указатели: %d"
+
+#: fetch-pack.c:1603
msgid "no matching remote head"
msgstr "не може да бъде открит подходящ връх от отдалеченото хранилище"
-#: fetch-pack.c:1610
+#: fetch-pack.c:1621 builtin/clone.c:664
+msgid "remote did not send all necessary objects"
+msgstr "отдалеченото хранилище не изпрати всички необходими обекти."
+
+#: fetch-pack.c:1647
#, c-format
msgid "no such remote ref %s"
msgstr "такъв отдалечен указател няма: %s"
-#: fetch-pack.c:1613
+#: fetch-pack.c:1650
#, c-format
msgid "Server does not allow request for unadvertised object %s"
msgstr "Сървърът не позволява заявка за необявен „%s“"
-#: gpg-interface.c:185
+#: gpg-interface.c:253
msgid "gpg failed to sign the data"
msgstr "Програмата „gpg“ не подписа данните."
-#: gpg-interface.c:210
+#: gpg-interface.c:279
msgid "could not create temporary file"
msgstr "не може да се създаде временен файл"
-#: gpg-interface.c:213
+#: gpg-interface.c:282
#, c-format
msgid "failed writing detached signature to '%s'"
msgstr "Програмата не успя да запише самостоятелния подпис в „%s“"
@@ -2111,18 +2690,18 @@ msgstr "Програмата не успя да запише самостоят
msgid "ignore invalid color '%.*s' in log.graphColors"
msgstr "прескачане на неправилния цвят „%.*s“ в „log.graphColors“"
-#: grep.c:2020
+#: grep.c:2115
#, c-format
msgid "'%s': unable to read %s"
msgstr "„%s“: файлът сочен от „%s“ не може да бъде прочетен"
-#: grep.c:2037 setup.c:164 builtin/clone.c:409 builtin/diff.c:81
+#: grep.c:2132 setup.c:164 builtin/clone.c:410 builtin/diff.c:81
#: builtin/rm.c:134
#, c-format
msgid "failed to stat '%s'"
msgstr "не може да бъде получена информация чрез „stat“ за „%s“"
-#: grep.c:2048
+#: grep.c:2143
#, c-format
msgid "'%s': short read"
msgstr "„%s“: изчитането върна по-малко байтове от очакваното"
@@ -2201,7 +2780,7 @@ msgstr "неподдържан списък от команди „%s“"
msgid "The common Git guides are:"
msgstr "Популярните въведения в Git са:"
-#: help.c:467
+#: help.c:552
#, c-format
msgid ""
"'%s' appears to be a git command, but we were not\n"
@@ -2210,36 +2789,36 @@ msgstr ""
"Изглежда, че „%s“ е команда на git, но тя не може да\n"
"бъде изпълнена. Вероятно пакетът „git-%s“ е повреден."
-#: help.c:526
+#: help.c:611
msgid "Uh oh. Your system reports no Git commands at all."
msgstr "Странно, изглежда, че на системата ви няма нито една команда на git."
-#: help.c:548
+#: help.c:633
#, c-format
msgid "WARNING: You called a Git command named '%s', which does not exist."
msgstr ""
"ПРЕДУПРЕЖДЕНИЕ: Пробвахте да изпълните команда на Git на име „%s“, а такава "
"не съществува."
-#: help.c:553
+#: help.c:638
#, c-format
msgid "Continuing under the assumption that you meant '%s'."
msgstr ""
"Изпълнението автоматично продължава, като се счита, че имате предвид „%s“."
-#: help.c:558
+#: help.c:643
#, c-format
msgid "Continuing in %0.1f seconds, assuming that you meant '%s'."
msgstr ""
"Изпълнението автоматично ще продължи след %0.1f сек., като се счита, че "
"имате предвид „%s“."
-#: help.c:566
+#: help.c:651
#, c-format
msgid "git: '%s' is not a git command. See 'git --help'."
msgstr "git: „%s“ не е команда на git. Погледнете изхода от „git --help“."
-#: help.c:570
+#: help.c:655
msgid ""
"\n"
"The most similar command is"
@@ -2253,16 +2832,16 @@ msgstr[1] ""
"\n"
"Най-близките команди са"
-#: help.c:585
+#: help.c:670
msgid "git version [<options>]"
msgstr "git version [ОПЦИЯ…]"
-#: help.c:652
+#: help.c:738
#, c-format
msgid "%s: %s - %s"
msgstr "%s: %s — %s"
-#: help.c:656
+#: help.c:742
msgid ""
"\n"
"Did you mean this?"
@@ -2333,7 +2912,7 @@ msgstr "не може да се ползва празно име като иде
msgid "name consists only of disallowed characters: %s"
msgstr "името съдържа само непозволени знаци: „%s“"
-#: ident.c:416 builtin/commit.c:587
+#: ident.c:416 builtin/commit.c:600
#, c-format
msgid "invalid date format: %s"
msgstr "неправилен формат на дата: %s"
@@ -2370,129 +2949,129 @@ msgstr ""
msgid "Unable to create '%s.lock': %s"
msgstr "Файлът-ключалка „%s.lock“ не може да бъде създаден: %s"
-#: merge.c:71
+#: merge.c:40
msgid "failed to read the cache"
msgstr "кешът не може да бъде прочетен"
-#: merge.c:136 builtin/am.c:1946 builtin/am.c:1980 builtin/checkout.c:378
-#: builtin/checkout.c:606 builtin/clone.c:761
+#: merge.c:105 builtin/am.c:1946 builtin/am.c:1980 builtin/checkout.c:380
+#: builtin/checkout.c:608 builtin/clone.c:763
msgid "unable to write new index file"
msgstr "неуспешно записване на новия индекс"
-#: merge-recursive.c:298
+#: merge-recursive.c:303
msgid "(bad commit)\n"
msgstr "(лошо подаване)\n"
-#: merge-recursive.c:320
+#: merge-recursive.c:325
#, c-format
msgid "add_cacheinfo failed for path '%s'; merge aborting."
msgstr ""
"неуспешно изпълнение на „add_cacheinfo“ за пътя „%s“. Сливането е "
"преустановено."
-#: merge-recursive.c:328
+#: merge-recursive.c:333
#, c-format
msgid "add_cacheinfo failed to refresh for path '%s'; merge aborting."
msgstr ""
"неуспешно изпълнение на „add_cacheinfo“ за обновяването на пътя „%s“. "
"Сливането е преустановено."
-#: merge-recursive.c:410
+#: merge-recursive.c:415
msgid "error building trees"
msgstr "грешка при изграждане на дърветата"
-#: merge-recursive.c:881
+#: merge-recursive.c:886
#, c-format
msgid "failed to create path '%s'%s"
msgstr "грешка при създаването на пътя „%s“%s"
-#: merge-recursive.c:892
+#: merge-recursive.c:897
#, c-format
msgid "Removing %s to make room for subdirectory\n"
msgstr "Изтриване на „%s“, за да се освободи място за поддиректория\n"
-#: merge-recursive.c:906 merge-recursive.c:925
+#: merge-recursive.c:911 merge-recursive.c:930
msgid ": perhaps a D/F conflict?"
msgstr ": възможно е да има конфликт директория/файл."
-#: merge-recursive.c:915
+#: merge-recursive.c:920
#, c-format
msgid "refusing to lose untracked file at '%s'"
msgstr ""
"преустановяване на действието, за да не се изтрие неследеният файл „%s“"
-#: merge-recursive.c:957 builtin/cat-file.c:37
+#: merge-recursive.c:962 builtin/cat-file.c:39
#, c-format
msgid "cannot read object %s '%s'"
msgstr "обектът „%s“ (%s) не може да бъде прочетен"
-#: merge-recursive.c:959
+#: merge-recursive.c:964
#, c-format
msgid "blob expected for %s '%s'"
msgstr "обектът „%s“ (%s) се очакваше да е BLOB, а не е"
-#: merge-recursive.c:983
+#: merge-recursive.c:988
#, c-format
msgid "failed to open '%s': %s"
msgstr "„%s“ не може да се отвори: %s"
-#: merge-recursive.c:994
+#: merge-recursive.c:999
#, c-format
msgid "failed to symlink '%s': %s"
msgstr "неуспешно създаване на символната връзка „%s“: %s"
-#: merge-recursive.c:999
+#: merge-recursive.c:1004
#, c-format
msgid "do not know what to do with %06o %s '%s'"
msgstr ""
"не е ясно какво да се прави с обекта „%2$s“ (%3$s) с права за достъп „%1$06o“"
-#: merge-recursive.c:1186
+#: merge-recursive.c:1191
#, c-format
msgid "Failed to merge submodule %s (not checked out)"
msgstr "Неуспешно сливане на подмодула „%s“ (не е изтеглен)"
-#: merge-recursive.c:1193
+#: merge-recursive.c:1198
#, c-format
msgid "Failed to merge submodule %s (commits not present)"
msgstr "Неуспешно сливане на подмодула „%s“ (няма подавания)"
-#: merge-recursive.c:1200
+#: merge-recursive.c:1205
#, c-format
msgid "Failed to merge submodule %s (commits don't follow merge-base)"
msgstr ""
"Подмодулът „%s“ не може да бъде слят (базата за сливане не предшества "
"подаванията)"
-#: merge-recursive.c:1208 merge-recursive.c:1220
+#: merge-recursive.c:1213 merge-recursive.c:1225
#, c-format
msgid "Fast-forwarding submodule %s to the following commit:"
msgstr "Превъртане на подмодула „%s“ до следното подаване:"
-#: merge-recursive.c:1211 merge-recursive.c:1223
+#: merge-recursive.c:1216 merge-recursive.c:1228
#, c-format
msgid "Fast-forwarding submodule %s"
msgstr "Превъртане на подмодула „%s“"
-#: merge-recursive.c:1245
+#: merge-recursive.c:1250
#, c-format
msgid "Failed to merge submodule %s (merge following commits not found)"
msgstr ""
"Неуспешно сливане на подмодула „%s“ (липсва сливането, което се предшества "
"от подаванията)"
-#: merge-recursive.c:1249
+#: merge-recursive.c:1254
#, c-format
msgid "Failed to merge submodule %s (not fast-forward)"
msgstr "Неуспешно сливане на подмодула „%s“ (не е превъртане)"
-#: merge-recursive.c:1250
+#: merge-recursive.c:1255
msgid "Found a possible merge resolution for the submodule:\n"
msgstr ""
"Открито е сливане, което може да решава проблема със сливането на "
"подмодула:\n"
-#: merge-recursive.c:1253
+#: merge-recursive.c:1258
#, c-format
msgid ""
"If this is correct simply add it to the index for example\n"
@@ -2508,31 +3087,31 @@ msgstr ""
"\n"
"Това приема предложеното.\n"
-#: merge-recursive.c:1262
+#: merge-recursive.c:1267
#, c-format
msgid "Failed to merge submodule %s (multiple merges found)"
msgstr "Неуспешно сливане на подмодула „%s“ (открити са множество сливания)"
-#: merge-recursive.c:1321
+#: merge-recursive.c:1326
msgid "Failed to execute internal merge"
msgstr "Неуспешно вътрешно сливане"
-#: merge-recursive.c:1326
+#: merge-recursive.c:1331
#, c-format
msgid "Unable to add %s to database"
msgstr "„%s“ не може да се добави в базата с данни"
-#: merge-recursive.c:1358
+#: merge-recursive.c:1363
#, c-format
msgid "Auto-merging %s"
msgstr "Автоматично сливане на „%s“"
-#: merge-recursive.c:1423
+#: merge-recursive.c:1434
#, c-format
msgid "Error: Refusing to lose untracked file at %s; writing to %s instead."
msgstr "Грешка: за да не се изтрие неследеният файл „%s“, се записва в „%s“."
-#: merge-recursive.c:1475
+#: merge-recursive.c:1501
#, c-format
msgid ""
"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
@@ -2541,7 +3120,7 @@ msgstr ""
"КОНФЛИКТ (%s/изтриване): „%s“ е изтрит в %s, а „%s“ в %s. Версия %s на „%s“ "
"е оставена в дървото."
-#: merge-recursive.c:1480
+#: merge-recursive.c:1506
#, c-format
msgid ""
"CONFLICT (%s/delete): %s deleted in %s and %s to %s in %s. Version %s of %s "
@@ -2550,7 +3129,7 @@ msgstr ""
"КОНФЛИКТ (%s/изтриване): „%s“ е изтрит в %s, а „%s“ е преименуван на „%s“ в "
"%s. Версия %s на „%s“ е оставена в дървото."
-#: merge-recursive.c:1487
+#: merge-recursive.c:1513
#, c-format
msgid ""
"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
@@ -2559,7 +3138,7 @@ msgstr ""
"КОНФЛИКТ (%s/изтриване): „%s“ е изтрит в %s, а „%s“ в %s. Версия %s на „%s“ "
"е оставена в дървото: %s."
-#: merge-recursive.c:1492
+#: merge-recursive.c:1518
#, c-format
msgid ""
"CONFLICT (%s/delete): %s deleted in %s and %s to %s in %s. Version %s of %s "
@@ -2568,33 +3147,33 @@ msgstr ""
"КОНФЛИКТ (%s/изтриване): „%s“ е изтрит в %s, а „%s“ е преименуван на „%s“ в "
"%s. Версия %s на „%s“ е оставена в дървото: %s."
-#: merge-recursive.c:1526
+#: merge-recursive.c:1552
msgid "rename"
msgstr "преименуване"
-#: merge-recursive.c:1526
+#: merge-recursive.c:1552
msgid "renamed"
msgstr "преименуван"
-#: merge-recursive.c:1580 merge-recursive.c:1736 merge-recursive.c:2368
-#: merge-recursive.c:3086
+#: merge-recursive.c:1606 merge-recursive.c:1762 merge-recursive.c:2394
+#: merge-recursive.c:3129
#, c-format
msgid "Refusing to lose dirty file at %s"
msgstr "Преустановяване на действието, за да не се изгуби промененият „%s“"
-#: merge-recursive.c:1594
+#: merge-recursive.c:1620
#, c-format
msgid "%s is a directory in %s adding as %s instead"
msgstr "„%s“ е директория в „%s“, затова се добавя като „%s“"
-#: merge-recursive.c:1599
+#: merge-recursive.c:1625
#, c-format
msgid "Refusing to lose untracked file at %s; adding as %s instead"
msgstr ""
"Преустановяване на действието, за да не се изгуби неследеният файл „%s“. "
"Вместо него се добавя „%s“"
-#: merge-recursive.c:1625
+#: merge-recursive.c:1651
#, c-format
msgid ""
"CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
@@ -2603,29 +3182,29 @@ msgstr ""
"КОНФЛИКТ (преименуване/преименуване): „%s“ е преименуван на „%s“ в клон "
"„%s“, а „%s“ е преименуван на „%s“ в „%s“/%s."
-#: merge-recursive.c:1630
+#: merge-recursive.c:1656
msgid " (left unresolved)"
msgstr " (некоригиран конфликт)"
-#: merge-recursive.c:1694
+#: merge-recursive.c:1720
#, 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:1733
+#: merge-recursive.c:1759
#, c-format
msgid "Renaming %s to %s and %s to %s instead"
msgstr "Преименуване на „%s“ на „%s“, а „%s“ на „%s“"
-#: merge-recursive.c:1745
+#: merge-recursive.c:1771
#, c-format
msgid "Refusing to lose untracked file at %s, even though it's in the way."
msgstr ""
"Отказ да се загуби неследеният файл „%s“, защото е на място, където пречи."
-#: merge-recursive.c:1951
+#: merge-recursive.c:1977
#, c-format
msgid ""
"CONFLICT (directory rename split): Unclear where to place %s because "
@@ -2636,7 +3215,7 @@ msgstr ""
"постави „%s“, защото няколко нови директории поделят съдържанието на "
"директория „%s“, като никоя не съдържа мнозинство от файловете ѝ."
-#: merge-recursive.c:1983
+#: merge-recursive.c:2009
#, c-format
msgid ""
"CONFLICT (implicit dir rename): Existing file/dir at %s in the way of "
@@ -2645,7 +3224,7 @@ msgstr ""
"КОНФЛИКТ (косвено преименуване на директория): следният файл или директория "
"„%s“ не позволяват косвеното преименуване на следния път/ища: %s."
-#: merge-recursive.c:1993
+#: merge-recursive.c:2019
#, c-format
msgid ""
"CONFLICT (implicit dir rename): Cannot map more than one path to %s; "
@@ -2655,7 +3234,7 @@ msgstr ""
"съответства на „%s“. Косвено преименуване на директория води до поставянето "
"на тези пътища там: %s."
-#: merge-recursive.c:2085
+#: merge-recursive.c:2111
#, c-format
msgid ""
"CONFLICT (rename/rename): Rename directory %s->%s in %s. Rename directory %s-"
@@ -2664,7 +3243,7 @@ msgstr ""
"КОНФЛИКТ (преименуване/преименуване): „%s“ е преименуван на „%s“ в клон "
"„%s“, а „%s“ е преименуван на „%s“ в „%s“"
-#: merge-recursive.c:2330
+#: merge-recursive.c:2356
#, c-format
msgid ""
"WARNING: Avoiding applying %s -> %s rename to %s, because %s itself was "
@@ -2673,128 +3252,131 @@ msgstr ""
"ПРЕДУПРЕЖДЕНИЕ: прескачане на преименуването на „%s“ на „%s“ в „%s“, защото "
"„%s“ също е с променено име."
-#: merge-recursive.c:2736
+#: merge-recursive.c:2762
#, c-format
msgid "CONFLICT (rename/add): Rename %s->%s in %s. %s added in %s"
msgstr ""
"КОНФЛИКТ (преименуване/добавяне): „%s“ е преименуван на „%s“ в клон „%s“, а "
"„%s“ е добавен в „%s“"
-#: merge-recursive.c:2751
+#: merge-recursive.c:2777
#, c-format
msgid "Adding merged %s"
msgstr "Добавяне на слетия „%s“"
-#: merge-recursive.c:2758 merge-recursive.c:3089
+#: merge-recursive.c:2784 merge-recursive.c:3132
#, c-format
msgid "Adding as %s instead"
msgstr "Добавяне като „%s“"
-#: merge-recursive.c:2914
+#: merge-recursive.c:2941
#, c-format
msgid "cannot read object %s"
msgstr "обектът „%s“ не може да се прочете"
-#: merge-recursive.c:2917
+#: merge-recursive.c:2944
#, c-format
msgid "object %s is not a blob"
msgstr "обектът „%s“ не е BLOB"
-#: merge-recursive.c:2986
+#: merge-recursive.c:3013
msgid "modify"
msgstr "промяна"
-#: merge-recursive.c:2986
+#: merge-recursive.c:3013
msgid "modified"
msgstr "променен"
-#: merge-recursive.c:2997
+#: merge-recursive.c:3024
msgid "content"
msgstr "съдържание"
-#: merge-recursive.c:3004
+#: merge-recursive.c:3031
msgid "add/add"
msgstr "добавяне/добавяне"
-#: merge-recursive.c:3046
+#: merge-recursive.c:3076
#, c-format
msgid "Skipped %s (merged same as existing)"
msgstr "Прескачане на „%s“ (слетият резултат е идентичен със сегашния)"
-#: merge-recursive.c:3055 git-submodule.sh:895
+#: merge-recursive.c:3098 git-submodule.sh:865
msgid "submodule"
msgstr "ПОДМОДУЛ"
-#: merge-recursive.c:3056
+#: merge-recursive.c:3099
#, c-format
msgid "CONFLICT (%s): Merge conflict in %s"
msgstr "КОНФЛИКТ (%s): Конфликт при сливане на „%s“"
-#: merge-recursive.c:3178
+#: merge-recursive.c:3221
#, c-format
msgid "Removing %s"
msgstr "Изтриване на „%s“"
-#: merge-recursive.c:3204
+#: merge-recursive.c:3247
msgid "file/directory"
msgstr "файл/директория"
-#: merge-recursive.c:3210
+#: merge-recursive.c:3253
msgid "directory/file"
msgstr "директория/файл"
-#: merge-recursive.c:3217
+#: merge-recursive.c:3260
#, 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:3226
+#: merge-recursive.c:3269
#, c-format
msgid "Adding %s"
msgstr "Добавяне на „%s“"
-#: merge-recursive.c:3267
+#: merge-recursive.c:3303
#, c-format
-msgid "Dirty index: cannot merge (dirty: %s)"
+msgid ""
+"Your local changes to the following files would be overwritten by merge:\n"
+" %s"
msgstr ""
-"Индексът не е чист: кръпките не могат да бъдат приложени (замърсени са: %s)"
+"Сливането ще презапише локалните промени на тези файлове:\n"
+" %s"
-#: merge-recursive.c:3271
+#: merge-recursive.c:3314
msgid "Already up to date!"
msgstr "Вече е обновено!"
-#: merge-recursive.c:3280
+#: merge-recursive.c:3323
#, c-format
msgid "merging of trees %s and %s failed"
msgstr "неуспешно сливане на дърветата „%s“ и „%s“"
-#: merge-recursive.c:3379
+#: merge-recursive.c:3422
msgid "Merging:"
msgstr "Сливане:"
-#: merge-recursive.c:3392
+#: merge-recursive.c:3435
#, c-format
msgid "found %u common ancestor:"
msgid_plural "found %u common ancestors:"
msgstr[0] "открит е %u общ предшественик:"
msgstr[1] "открити са %u общи предшественици:"
-#: merge-recursive.c:3431
+#: merge-recursive.c:3474
msgid "merge returned no commit"
msgstr "сливането не върна подаване"
-#: merge-recursive.c:3495
+#: merge-recursive.c:3540
#, c-format
msgid "Could not parse object '%s'"
msgstr "Неуспешен анализ на обекта „%s“"
-#: merge-recursive.c:3511 builtin/merge.c:659 builtin/merge.c:816
+#: merge-recursive.c:3556 builtin/merge.c:689 builtin/merge.c:846
msgid "Unable to write index."
msgstr "Индексът не може да бъде прочетен"
-#: notes-merge.c:272
+#: notes-merge.c:274
#, c-format
msgid ""
"You have not concluded your previous notes merge (%s exists).\n"
@@ -2811,23 +3393,23 @@ msgstr ""
"\n"
" git notes merge --abort"
-#: notes-merge.c:279
+#: notes-merge.c:281
#, c-format
msgid "You have not concluded your notes merge (%s exists)."
msgstr ""
"Не сте завършили сливането на бележките. (Указателят „%s“ съществува)."
-#: notes-utils.c:43
+#: notes-utils.c:45
msgid "Cannot commit uninitialized/unreferenced notes tree"
msgstr ""
"Неинициализирано или нереферирано дърво за бележки не може да бъде подадено"
-#: notes-utils.c:102
+#: notes-utils.c:104
#, c-format
msgid "Bad notes.rewriteMode value: '%s'"
msgstr "Неправилна стойност за „notes.rewriteMode“: „%s“"
-#: notes-utils.c:112
+#: notes-utils.c:114
#, c-format
msgid "Refusing to rewrite notes in %s (outside of refs/notes/)"
msgstr ""
@@ -2837,40 +3419,60 @@ msgstr ""
#. the environment variable, the second %s is
#. its value.
#.
-#: notes-utils.c:142
+#: notes-utils.c:144
#, c-format
msgid "Bad %s value: '%s'"
msgstr "Зададена е лоша стойност на променливата „%s“: „%s“"
-#: object.c:242
+#: object.c:54
+#, c-format
+msgid "invalid object type \"%s\""
+msgstr "неправилен вид обект: „%s“"
+
+#: object.c:173
+#, c-format
+msgid "object %s is a %s, not a %s"
+msgstr "обектът „%s“ е %s, а не %s"
+
+#: object.c:233
+#, c-format
+msgid "object %s has unknown type id %d"
+msgstr "обектът „%s“ е непознат вид: %d"
+
+#: object.c:246
#, c-format
msgid "unable to parse object: %s"
msgstr "обектът „%s“ не може да бъде анализиран"
+#: object.c:266 object.c:277
+#, c-format
+msgid "sha1 mismatch %s"
+msgstr "разлика в SHA1: „%s“"
+
#: packfile.c:563
msgid "offset before end of packfile (broken .idx?)"
msgstr ""
"отместване преди края на пакетния файл (възможно е индексът да е повреден)"
-#: packfile.c:1742
+#: packfile.c:1745
#, c-format
msgid "offset before start of pack index for %s (corrupt index?)"
msgstr ""
"отместване преди началото на индекса на пакетния файл „%s“ (възможно е "
"индексът да е повреден)"
-#: packfile.c:1746
+#: packfile.c:1749
#, c-format
msgid "offset beyond end of pack index for %s (truncated index?)"
msgstr ""
"отместване преди края на индекса на пакетния файл „%s“ (възможно е индексът "
"да е отрязан)"
-#: parse-options.c:621
+#: parse-options.c:672
msgid "..."
msgstr "…"
-#: parse-options.c:640
+#: parse-options.c:691
#, c-format
msgid "usage: %s"
msgstr "употреба: %s"
@@ -2878,17 +3480,17 @@ msgstr "употреба: %s"
#. TRANSLATORS: the colon here should align with the
#. one in "usage: %s" translation.
#.
-#: parse-options.c:646
+#: parse-options.c:697
#, c-format
msgid " or: %s"
msgstr " или: %s"
-#: parse-options.c:649
+#: parse-options.c:700
#, c-format
msgid " %s"
msgstr " %s"
-#: parse-options.c:688
+#: parse-options.c:739
msgid "-NUM"
msgstr "-ЧИСЛО"
@@ -2981,11 +3583,74 @@ msgstr "%s: магическите пътища не се поддържат о
msgid "pathspec '%s' is beyond a symbolic link"
msgstr "пътят „%s“ е след символна връзка"
+#: pkt-line.c:104
+msgid "flush packet write failed"
+msgstr "неуспешно изчистване на буферите при запис на пакет"
+
+#: pkt-line.c:142 pkt-line.c:228
+msgid "protocol error: impossibly long line"
+msgstr "протоколна грешка: прекалено дълъг ред"
+
+#: pkt-line.c:158 pkt-line.c:160
+msgid "packet write with format failed"
+msgstr "неуспешен запис на пакет с формат"
+
+#: pkt-line.c:192
+msgid "packet write failed - data exceeds max packet size"
+msgstr ""
+"неуспешен запис на пакетен файл — данните надвишават максималният размер на "
+"пакет"
+
+#: pkt-line.c:199 pkt-line.c:206
+msgid "packet write failed"
+msgstr "неуспешен запис на пакет"
+
+#: pkt-line.c:291
+msgid "read error"
+msgstr "грешка при четене"
+
+#: pkt-line.c:299
+msgid "the remote end hung up unexpectedly"
+msgstr "отдалеченото хранилище неочаквано прекъсна връзката"
+
+#: pkt-line.c:327
+#, c-format
+msgid "protocol error: bad line length character: %.4s"
+msgstr "протоколна грешка: неправилeн знак за дължина на ред: %.4s"
+
+#: pkt-line.c:337 pkt-line.c:342
+#, c-format
+msgid "protocol error: bad line length %d"
+msgstr "протоколна грешка: неправилна дължина на ред: %d"
+
#: pretty.c:962
msgid "unable to parse --pretty format"
msgstr "аргументът към опцията „--pretty“ не може да се анализира"
-#: read-cache.c:1500
+#: range-diff.c:48
+msgid "could not start `log`"
+msgstr "командата за журнала с подавания „log“ не може да се стартира"
+
+#: range-diff.c:51
+msgid "could not read `log` output"
+msgstr ""
+"изходът от командата за журнала с подавания „log“ не може да се прочете"
+
+#: range-diff.c:66 sequencer.c:4540
+#, c-format
+msgid "could not parse commit '%s'"
+msgstr "подаването „%s“ не може да бъде анализирано"
+
+#: range-diff.c:196
+msgid "failed to generate diff"
+msgstr "неуспешно търсене на разлика"
+
+#: range-diff.c:421 range-diff.c:423
+#, c-format
+msgid "could not parse log for '%s'"
+msgstr "журналът с подаванията на „%s“ не може да бъде анализиран"
+
+#: read-cache.c:1579
#, c-format
msgid ""
"index.version set, but the value is invalid.\n"
@@ -2994,7 +3659,7 @@ msgstr ""
"Зададена е неправилна стойност на настройката „index.version“.\n"
"Ще се ползва версия %i"
-#: read-cache.c:1510
+#: read-cache.c:1589
#, c-format
msgid ""
"GIT_INDEX_VERSION set, but the value is invalid.\n"
@@ -3004,227 +3669,329 @@ msgstr ""
"„GIT_INDEX_VERSION“.\n"
"Ще се ползва версия %i"
-#: read-cache.c:2404 sequencer.c:4338 wrapper.c:658 builtin/merge.c:1048
+#: read-cache.c:2580 sequencer.c:4503 wrapper.c:658 builtin/merge.c:1083
#, c-format
msgid "could not close '%s'"
msgstr "„%s“ не може да се затвори"
-#: read-cache.c:2477 sequencer.c:2102 sequencer.c:3234
+#: read-cache.c:2653 sequencer.c:2113 sequencer.c:3374
#, c-format
msgid "could not stat '%s'"
msgstr "неуспешно изпълнение на „stat“ върху „%s“"
-#: read-cache.c:2490
+#: read-cache.c:2666
#, c-format
msgid "unable to open git dir: %s"
msgstr "не може да се отвори директорията на git: %s"
-#: read-cache.c:2502
+#: read-cache.c:2678
#, c-format
msgid "unable to unlink: %s"
msgstr "неуспешно изтриване на „%s“"
-#: refs.c:732 sequencer.c:4334 sequencer.c:4393 wrapper.c:225 wrapper.c:395
-#: builtin/am.c:779
+#: refs.c:192
+#, c-format
+msgid "%s does not point to a valid object!"
+msgstr "„%s“ не сочи към позволен обект!"
+
+#: refs.c:579
+#, c-format
+msgid "ignoring dangling symref %s"
+msgstr "игнориране на указател на обект извън клон „%s“"
+
+#: refs.c:581 ref-filter.c:2067
+#, c-format
+msgid "ignoring broken ref %s"
+msgstr "игнориране на повредения указател „%s“"
+
+#: refs.c:685
+#, c-format
+msgid "could not open '%s' for writing: %s"
+msgstr "„%s“ не може да бъде отворен за запис: %s"
+
+#: refs.c:695 refs.c:746
+#, c-format
+msgid "could not read ref '%s'"
+msgstr "указателят „%s“ не може да се прочете"
+
+#: refs.c:701
+#, c-format
+msgid "ref '%s' already exists"
+msgstr "указателят „%s“ вече съществува"
+
+#: refs.c:706
+#, c-format
+msgid "unexpected object ID when writing '%s'"
+msgstr "неочакван идентификатор на обект при записването на „%s“"
+
+#: refs.c:714 sequencer.c:385 sequencer.c:2366 sequencer.c:2492
+#: sequencer.c:2506 sequencer.c:2733 sequencer.c:4501 sequencer.c:4564
+#: wrapper.c:656
+#, c-format
+msgid "could not write to '%s'"
+msgstr "в „%s“ не може да се пише"
+
+#: refs.c:741 sequencer.c:4499 sequencer.c:4558 wrapper.c:225 wrapper.c:395
+#: builtin/am.c:780
#, c-format
msgid "could not open '%s' for writing"
msgstr "„%s“ не може да бъде отворен за запис"
-#: refs.c:1880
+#: refs.c:748
+#, c-format
+msgid "unexpected object ID when deleting '%s'"
+msgstr "неочакван идентификатор на обект при изтриването на „%s“"
+
+#: refs.c:879
+#, c-format
+msgid "log for ref %s has gap after %s"
+msgstr "има пропуски в журнала с подаванията за указателя „%s“ след „%s“"
+
+#: refs.c:885
+#, c-format
+msgid "log for ref %s unexpectedly ended on %s"
+msgstr "журналът с подаванията за указателя „%s“ свършва неочаквано след „%s“"
+
+#: refs.c:943
+#, c-format
+msgid "log for %s is empty"
+msgstr "журналът с подаванията за указателя „%s“ е празен"
+
+#: refs.c:1035
+#, c-format
+msgid "refusing to update ref with bad name '%s'"
+msgstr "указател не може да се обнови с грешно име „%s“"
+
+#: refs.c:1111
+#, c-format
+msgid "update_ref failed for ref '%s': %s"
+msgstr "неуспешно обновяване на указателя „%s“: %s"
+
+#: refs.c:1853
+#, c-format
+msgid "multiple updates for ref '%s' not allowed"
+msgstr "не са позволени повече от една промени на указателя „%s“"
+
+#: refs.c:1885
msgid "ref updates forbidden inside quarantine environment"
msgstr "обновяванията на указатели са забранени в среди под карантина"
+#: refs.c:1981 refs.c:2011
+#, c-format
+msgid "'%s' exists; cannot create '%s'"
+msgstr "„%s“ съществува, не може да се създаде „%s“"
+
+#: refs.c:1987 refs.c:2022
+#, c-format
+msgid "cannot process '%s' and '%s' at the same time"
+msgstr "невъзможно е едновременно да се обработват „%s“ и „%s“"
+
#: refs/files-backend.c:1191
#, c-format
msgid "could not remove reference %s"
msgstr "Указателят „%s“ не може да бъде изтрит"
-#: refs/files-backend.c:1205 refs/packed-backend.c:1531
-#: refs/packed-backend.c:1541
+#: refs/files-backend.c:1205 refs/packed-backend.c:1532
+#: refs/packed-backend.c:1542
#, c-format
msgid "could not delete reference %s: %s"
msgstr "Указателят „%s“ не може да бъде изтрит: %s"
-#: refs/files-backend.c:1208 refs/packed-backend.c:1544
+#: refs/files-backend.c:1208 refs/packed-backend.c:1545
#, c-format
msgid "could not delete references: %s"
msgstr "Указателите не може да бъдат изтрити: %s"
-#: ref-filter.c:35 wt-status.c:1850
+#: refspec.c:137
+#, c-format
+msgid "invalid refspec '%s'"
+msgstr "неправилен указател: „%s“"
+
+#: ref-filter.c:38 wt-status.c:1850
msgid "gone"
msgstr "изтрит"
-#: ref-filter.c:36
+#: ref-filter.c:39
#, c-format
msgid "ahead %d"
msgstr "напред с %d"
-#: ref-filter.c:37
+#: ref-filter.c:40
#, c-format
msgid "behind %d"
msgstr "назад с %d"
-#: ref-filter.c:38
+#: ref-filter.c:41
#, c-format
msgid "ahead %d, behind %d"
msgstr "напред с %d, назад с %d"
-#: ref-filter.c:121
+#: ref-filter.c:137
#, c-format
msgid "expected format: %%(color:<color>)"
msgstr "очакван формат: %%(color:ЦВЯТ)"
-#: ref-filter.c:123
+#: ref-filter.c:139
#, c-format
msgid "unrecognized color: %%(color:%s)"
msgstr "непознат цвят: %%(color:%s)"
-#: ref-filter.c:145
+#: ref-filter.c:161
#, c-format
msgid "Integer value expected refname:lstrip=%s"
msgstr "очаква се цяло число за „refname:lstrip=%s“"
-#: ref-filter.c:149
+#: ref-filter.c:165
#, c-format
msgid "Integer value expected refname:rstrip=%s"
msgstr "очаква се цяло число за „refname:rstrip=%s“"
-#: ref-filter.c:151
+#: ref-filter.c:167
#, c-format
msgid "unrecognized %%(%s) argument: %s"
msgstr "непознат аргумент за „%%(%s)“: %s"
-#: ref-filter.c:206
+#: ref-filter.c:222
+#, c-format
+msgid "%%(objecttype) does not take arguments"
+msgstr "%%(objecttype) не приема аргументи"
+
+#: ref-filter.c:234
+#, c-format
+msgid "%%(objectsize) does not take arguments"
+msgstr "%%(objectsize) не приема аргументи"
+
+#: ref-filter.c:246
#, c-format
msgid "%%(body) does not take arguments"
msgstr "%%(body) не приема аргументи"
-#: ref-filter.c:215
+#: ref-filter.c:255
#, c-format
msgid "%%(subject) does not take arguments"
msgstr "%%(subject) не приема аргументи"
-#: ref-filter.c:235
+#: ref-filter.c:275
#, c-format
msgid "unknown %%(trailers) argument: %s"
msgstr "непознат аргумент „%%(trailers)“: %s"
-#: ref-filter.c:264
+#: ref-filter.c:304
#, c-format
msgid "positive value expected contents:lines=%s"
msgstr "очаква се положителна стойност за „contents:lines=%s“"
-#: ref-filter.c:266
+#: ref-filter.c:306
#, c-format
msgid "unrecognized %%(contents) argument: %s"
msgstr "непознат аргумент за %%(contents): %s"
-#: ref-filter.c:281
+#: ref-filter.c:321
#, c-format
msgid "positive value expected objectname:short=%s"
msgstr "очаква се положителна стойност за „objectname:short=%s“"
-#: ref-filter.c:285
+#: ref-filter.c:325
#, c-format
msgid "unrecognized %%(objectname) argument: %s"
msgstr "непознат аргумент за %%(objectname): %s"
-#: ref-filter.c:315
+#: ref-filter.c:355
#, c-format
msgid "expected format: %%(align:<width>,<position>)"
msgstr "очакван формат: %%(align:ШИРОЧИНА,ПОЗИЦИЯ)"
-#: ref-filter.c:327
+#: ref-filter.c:367
#, c-format
msgid "unrecognized position:%s"
msgstr "непозната позиция: %s"
-#: ref-filter.c:334
+#: ref-filter.c:374
#, c-format
msgid "unrecognized width:%s"
msgstr "непозната широчина: %s"
-#: ref-filter.c:343
+#: ref-filter.c:383
#, c-format
msgid "unrecognized %%(align) argument: %s"
msgstr "непознат аргумент за %%(align): %s"
-#: ref-filter.c:351
+#: ref-filter.c:391
#, c-format
msgid "positive width expected with the %%(align) atom"
msgstr "очаква се положителна широчина с лексемата „%%(align)“"
-#: ref-filter.c:369
+#: ref-filter.c:409
#, c-format
msgid "unrecognized %%(if) argument: %s"
msgstr "непознат аргумент за „%%(if)“: %s"
-#: ref-filter.c:464
+#: ref-filter.c:505
#, c-format
msgid "malformed field name: %.*s"
msgstr "неправилно име на обект: „%.*s“"
-#: ref-filter.c:491
+#: ref-filter.c:532
#, c-format
msgid "unknown field name: %.*s"
msgstr "непознато име на обект: „%.*s“"
-#: ref-filter.c:608
+#: ref-filter.c:656
#, c-format
msgid "format: %%(if) atom used without a %%(then) atom"
msgstr "формат: лексемата %%(if) е използвана без съответната ѝ %%(then)"
-#: ref-filter.c:671
+#: ref-filter.c:719
#, c-format
msgid "format: %%(then) atom used without an %%(if) atom"
msgstr "формат: лексемата %%(then) е използвана без съответната ѝ %%(if)"
-#: ref-filter.c:673
+#: ref-filter.c:721
#, c-format
msgid "format: %%(then) atom used more than once"
msgstr "формат: лексемата %%(then) е използвана повече от един път"
-#: ref-filter.c:675
+#: ref-filter.c:723
#, c-format
msgid "format: %%(then) atom used after %%(else)"
msgstr "формат: лексемата %%(then) е използвана след %%(else)"
-#: ref-filter.c:703
+#: ref-filter.c:751
#, c-format
msgid "format: %%(else) atom used without an %%(if) atom"
msgstr "формат: лексемата %%(else) е използвана без съответната ѝ %%(if)"
-#: ref-filter.c:705
+#: ref-filter.c:753
#, c-format
msgid "format: %%(else) atom used without a %%(then) atom"
msgstr "формат: лексемата %%(else) е използвана без съответната ѝ %%(then)"
-#: ref-filter.c:707
+#: ref-filter.c:755
#, c-format
msgid "format: %%(else) atom used more than once"
msgstr "формат: лексемата %%(else) е използвана повече от един път"
-#: ref-filter.c:722
+#: ref-filter.c:770
#, c-format
msgid "format: %%(end) atom used without corresponding atom"
msgstr "формат: лексемата %%(end) е използвана без съответната ѝ"
-#: ref-filter.c:779
+#: ref-filter.c:827
#, c-format
msgid "malformed format string %s"
msgstr "неправилен форматиращ низ „%s“"
-#: ref-filter.c:1387
+#: ref-filter.c:1416
#, c-format
msgid "(no branch, rebasing %s)"
msgstr "(извън клон, пребазиране на „%s“)"
-#: ref-filter.c:1390
+#: ref-filter.c:1419
#, c-format
msgid "(no branch, rebasing detached HEAD %s)"
msgstr "(извън клон, пребазиране на несвързан указател „HEAD“ при „%s“)"
-#: ref-filter.c:1393
+#: ref-filter.c:1422
#, c-format
msgid "(no branch, bisect started on %s)"
msgstr "(извън клон, двоично търсене от „%s“)"
@@ -3232,7 +3999,7 @@ msgstr "(извън клон, двоично търсене от „%s“)"
#. TRANSLATORS: make sure this matches "HEAD
#. detached at " in wt-status.c
#.
-#: ref-filter.c:1401
+#: ref-filter.c:1430
#, c-format
msgid "(HEAD detached at %s)"
msgstr "(Указателят „HEAD“ не е свързан и е при „%s“)"
@@ -3240,149 +4007,144 @@ msgstr "(Указателят „HEAD“ не е свързан и е при „
#. TRANSLATORS: make sure this matches "HEAD
#. detached from " in wt-status.c
#.
-#: ref-filter.c:1408
+#: ref-filter.c:1437
#, c-format
msgid "(HEAD detached from %s)"
msgstr "Указателят „HEAD“ не е свързан и е отделѐн от „%s“"
-#: ref-filter.c:1412
+#: ref-filter.c:1441
msgid "(no branch)"
msgstr "(извън клон)"
-#: ref-filter.c:1442
+#: ref-filter.c:1475 ref-filter.c:1623
#, c-format
msgid "missing object %s for %s"
msgstr "обектът „%s“ липсва за „%s“"
-#: ref-filter.c:1445
+#: ref-filter.c:1483
#, c-format
msgid "parse_object_buffer failed on %s for %s"
msgstr "неуспешно анализиране чрез „parse_object_buffer“ на „%s“ за „%s“"
-#: ref-filter.c:1902
+#: ref-filter.c:1980
#, c-format
msgid "malformed object at '%s'"
msgstr "обект със сгрешен формат при „%s“"
-#: ref-filter.c:1984
+#: ref-filter.c:2062
#, c-format
msgid "ignoring ref with broken name %s"
msgstr "игнориране на указателя с грешно име „%s“"
-#: ref-filter.c:1989
-#, c-format
-msgid "ignoring broken ref %s"
-msgstr "игнориране на повредения указател „%s“"
-
-#: ref-filter.c:2261
+#: ref-filter.c:2340
#, c-format
msgid "format: %%(end) atom missing"
msgstr "грешка във форма̀та: липсва лексемата %%(end)"
-#: ref-filter.c:2365
+#: ref-filter.c:2444
#, c-format
msgid "malformed object name %s"
msgstr "неправилно име на обект „%s“"
-#: remote.c:605
+#: remote.c:606
#, c-format
msgid "Cannot fetch both %s and %s to %s"
msgstr "Невъзможно е да се доставят едновременно и „%s“, и „%s“ към „%s“"
-#: remote.c:609
+#: remote.c:610
#, c-format
msgid "%s usually tracks %s, not %s"
msgstr "„%s“ обикновено следи „%s“, а не „%s“"
-#: remote.c:613
+#: remote.c:614
#, c-format
msgid "%s tracks both %s and %s"
msgstr "„%s“ следи както „%s“, така и „%s“"
-#: remote.c:621
+#: remote.c:622
msgid "Internal error"
msgstr "Вътрешна грешка"
-#: remote.c:1534 remote.c:1635
+#: remote.c:1536 remote.c:1637
msgid "HEAD does not point to a branch"
msgstr "Указателят „HEAD“ не сочи към клон"
-#: remote.c:1543
+#: remote.c:1545
#, c-format
msgid "no such branch: '%s'"
msgstr "няма клон на име „%s“"
-#: remote.c:1546
+#: remote.c:1548
#, c-format
msgid "no upstream configured for branch '%s'"
msgstr "не е зададен клон-източник за клона „%s“"
-#: remote.c:1552
+#: remote.c:1554
#, c-format
msgid "upstream branch '%s' not stored as a remote-tracking branch"
msgstr "клонът-източник „%s“ не е съхранен като следящ клон"
-#: remote.c:1567
+#: remote.c:1569
#, c-format
msgid "push destination '%s' on remote '%s' has no local tracking branch"
msgstr ""
"липсва локален следящ клон за местоположението за изтласкване „%s“ в "
"хранилището „%s“"
-#: remote.c:1579
+#: remote.c:1581
#, c-format
msgid "branch '%s' has no remote for pushing"
msgstr "няма информация клонът „%s“ да следи някой друг"
-#: remote.c:1589
+#: remote.c:1591
#, c-format
msgid "push refspecs for '%s' do not include '%s'"
msgstr "указателят за изтласкване на „%s“ не включва „%s“"
-#: remote.c:1602
+#: remote.c:1604
msgid "push has no destination (push.default is 'nothing')"
msgstr "указателят за изтласкване не включва цел („push.default“ е „nothing“)"
-#: remote.c:1624
+#: remote.c:1626
msgid "cannot resolve 'simple' push to a single destination"
msgstr "простото (simple) изтласкване не съответства на една цел"
-#: remote.c:1939
+#: remote.c:1951
#, c-format
msgid "Your branch is based on '%s', but the upstream is gone.\n"
msgstr "Този клон следи „%s“, но следеният клон е изтрит.\n"
-#: remote.c:1943
+#: remote.c:1955
msgid " (use \"git branch --unset-upstream\" to fixup)\n"
msgstr " (за да коригирате това, използвайте „git branch --unset-upstream“)\n"
-#: remote.c:1946
+#: remote.c:1958
#, c-format
msgid "Your branch is up to date with '%s'.\n"
msgstr "Клонът е актуализиран към „%s“.\n"
-#: remote.c:1950
+#: remote.c:1962
#, c-format
msgid "Your branch and '%s' refer to different commits.\n"
msgstr "Клонът ви и „%s“ сочат към различни подавания.\n"
-#: remote.c:1953
+#: remote.c:1965
#, c-format
msgid " (use \"%s\" for details)\n"
msgstr " (за повече информация ползвайте „%s“)\n"
-#: remote.c:1957
+#: remote.c:1969
#, c-format
msgid "Your branch is ahead of '%s' by %d commit.\n"
msgid_plural "Your branch is ahead of '%s' by %d commits.\n"
msgstr[0] "Клонът ви е с %2$d подаване пред „%1$s“.\n"
msgstr[1] "Клонът ви е с %2$d подавания пред „%1$s“.\n"
-#: remote.c:1963
+#: remote.c:1975
msgid " (use \"git push\" to publish your local commits)\n"
msgstr " (публикувайте локалните си промени чрез „git push“)\n"
-#: remote.c:1966
+#: remote.c:1978
#, c-format
msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n"
msgid_plural ""
@@ -3390,11 +4152,11 @@ msgid_plural ""
msgstr[0] "Клонът ви е с %2$d подаване зад „%1$s“ и може да бъде превъртян.\n"
msgstr[1] "Клонът ви е с %2$d подавания зад „%1$s“ и може да бъде превъртян.\n"
-#: remote.c:1974
+#: remote.c:1986
msgid " (use \"git pull\" to update your local branch)\n"
msgstr " (обновете локалния си клон чрез „git pull“)\n"
-#: remote.c:1977
+#: remote.c:1989
#, c-format
msgid ""
"Your branch and '%s' have diverged,\n"
@@ -3409,20 +4171,35 @@ msgstr[1] ""
"Текущият клон се е отделил от „%s“,\n"
"двата имат съответно по %d и %d несъвпадащи подавания.\n"
-#: remote.c:1987
+#: remote.c:1999
msgid " (use \"git pull\" to merge the remote branch into yours)\n"
msgstr " (слейте отдалечения клон в локалния чрез „git pull“)\n"
-#: revision.c:2289
+#: replace-object.c:20
+#, c-format
+msgid "bad replace ref name: %s"
+msgstr "неправилно име на указател за замяна: „%s“"
+
+#: replace-object.c:29
+#, c-format
+msgid "duplicate replace ref: %s"
+msgstr "повтарящ се указател за замяна: „%s“"
+
+#: replace-object.c:72
+#, c-format
+msgid "replace depth too high for object %s"
+msgstr "дълбочината на замяна е прекалено голяма за обекта: „%s“"
+
+#: revision.c:2305
msgid "your current branch appears to be broken"
msgstr "Текущият клон е повреден"
-#: revision.c:2292
+#: revision.c:2308
#, c-format
msgid "your current branch '%s' does not have any commits yet"
msgstr "Текущият клон „%s“ е без подавания "
-#: revision.c:2489
+#: revision.c:2505
msgid "--first-parent is incompatible with --bisect"
msgstr "опциите „--first-parent“ и „--bisect“ са несъвместими"
@@ -3440,32 +4217,32 @@ msgstr ""
"За да изключите това предупреждение, изпълнете:\n"
" git config advice.ignoredHook false"
-#: send-pack.c:141
+#: send-pack.c:142
msgid "unexpected flush packet while reading remote unpack status"
msgstr ""
"неочакван изчистващ пакет „flush“ при изчитане на състоянието от "
"отдалеченото разпакетиране"
-#: send-pack.c:143
+#: send-pack.c:144
#, c-format
msgid "unable to parse remote unpack status: %s"
msgstr ""
"състоянието от отдалеченото разпакетиране не може да бъде анализирано: %s"
-#: send-pack.c:145
+#: send-pack.c:146
#, c-format
msgid "remote unpack failed: %s"
msgstr "неуспешно отдалечено разпакетиране: %s"
-#: send-pack.c:308
+#: send-pack.c:309
msgid "failed to sign the push certificate"
msgstr "сертификатът за изтласкване не може да бъде подписан"
-#: send-pack.c:421
+#: send-pack.c:422
msgid "the receiving end does not support --signed push"
msgstr "отсрещната страна не поддържа изтласкване с опцията „--signed“"
-#: send-pack.c:423
+#: send-pack.c:424
msgid ""
"not sending a push certificate since the receiving end does not support --"
"signed push"
@@ -3473,42 +4250,42 @@ msgstr ""
"отсрещната страна не поддържа изтласкване с опцията „--signed“, затова не се "
"използва сертификат"
-#: send-pack.c:435
+#: send-pack.c:436
msgid "the receiving end does not support --atomic push"
msgstr "получаващата страна не поддържа изтласкване с опцията „--atomic“"
-#: send-pack.c:440
+#: send-pack.c:441
msgid "the receiving end does not support push options"
msgstr "отсрещната страна не поддържа опции при изтласкване"
-#: sequencer.c:175
+#: sequencer.c:177
#, c-format
msgid "invalid commit message cleanup mode '%s'"
msgstr "несъществуващ режим на изчистване „%s“ на съобщение при подаване"
-#: sequencer.c:275
+#: sequencer.c:278
#, c-format
msgid "could not delete '%s'"
msgstr "„%s“ не може да бъде изтрит"
-#: sequencer.c:301
+#: sequencer.c:304
msgid "revert"
msgstr "отмяна"
-#: sequencer.c:303
+#: sequencer.c:306
msgid "cherry-pick"
msgstr "отбиране"
-#: sequencer.c:305
+#: sequencer.c:308
msgid "rebase -i"
msgstr "rebase -i"
-#: sequencer.c:307
+#: sequencer.c:310
#, c-format
-msgid "Unknown action: %d"
-msgstr "Неизвестно действие: %d"
+msgid "unknown action: %d"
+msgstr "неизвестно действие: %d"
-#: sequencer.c:364
+#: sequencer.c:367
msgid ""
"after resolving the conflicts, mark the corrected paths\n"
"with 'git add <paths>' or 'git rm <paths>'"
@@ -3516,7 +4293,7 @@ msgstr ""
"след коригирането на конфликтите, отбележете съответните\n"
"пътища с „git add ПЪТ…“ или „git rm ПЪТ…“."
-#: sequencer.c:367
+#: sequencer.c:370
msgid ""
"after resolving the conflicts, mark the corrected paths\n"
"with 'git add <paths>' or 'git rm <paths>'\n"
@@ -3526,45 +4303,39 @@ msgstr ""
"пътища с „git add ПЪТ…“ или „git rm ПЪТ…“, след което\n"
"подайте резултата с командата „git commit'“."
-#: sequencer.c:380 sequencer.c:2468
+#: sequencer.c:383 sequencer.c:2488
#, c-format
msgid "could not lock '%s'"
msgstr "„%s“ не може да се заключи"
-#: sequencer.c:382 sequencer.c:2346 sequencer.c:2472 sequencer.c:2486
-#: sequencer.c:2694 sequencer.c:4336 sequencer.c:4399 wrapper.c:656
-#, c-format
-msgid "could not write to '%s'"
-msgstr "в „%s“ не може да се пише"
-
-#: sequencer.c:387
+#: sequencer.c:390
#, c-format
msgid "could not write eol to '%s'"
msgstr "краят на ред не може да се запише в „%s“"
-#: sequencer.c:392 sequencer.c:2351 sequencer.c:2474 sequencer.c:2488
-#: sequencer.c:2702
+#: sequencer.c:395 sequencer.c:2371 sequencer.c:2494 sequencer.c:2508
+#: sequencer.c:2741
#, c-format
msgid "failed to finalize '%s'"
msgstr "„%s“ не може да се завърши"
-#: sequencer.c:415 sequencer.c:804 sequencer.c:1493 sequencer.c:2371
-#: sequencer.c:2684 sequencer.c:2788 builtin/am.c:259 builtin/commit.c:727
-#: builtin/merge.c:1046
+#: sequencer.c:418 sequencer.c:816 sequencer.c:1505 sequencer.c:2391
+#: sequencer.c:2723 sequencer.c:2827 builtin/am.c:260 builtin/commit.c:740
+#: builtin/merge.c:1081
#, c-format
msgid "could not read '%s'"
msgstr "файлът „%s“ не може да бъде прочетен"
-#: sequencer.c:441
+#: sequencer.c:444
#, c-format
msgid "your local changes would be overwritten by %s."
msgstr "локалните ви промени ще бъдат презаписани при %s."
-#: sequencer.c:445
+#: sequencer.c:448
msgid "commit your changes or stash them to proceed."
msgstr "подайте или скатайте промените, за да продължите"
-#: sequencer.c:474
+#: sequencer.c:477
#, c-format
msgid "%s: fast-forward"
msgstr "%s: превъртане"
@@ -3572,20 +4343,35 @@ msgstr "%s: превъртане"
#. TRANSLATORS: %s will be "revert", "cherry-pick" or
#. "rebase -i".
#.
-#: sequencer.c:563
+#: sequencer.c:566
#, c-format
msgid "%s: Unable to write new index file"
msgstr "%s: новият индекс не може да бъде запазен"
-#: sequencer.c:579
+#: sequencer.c:582
msgid "unable to update cache tree"
msgstr "дървото на кеша не може да бъде обновено"
-#: sequencer.c:592
+#: sequencer.c:595
msgid "could not resolve HEAD commit"
msgstr "подаването, сочено от указателя „HEAD“, не може да бъде открито"
-#: sequencer.c:749
+#: sequencer.c:723 sequencer.c:740
+#, c-format
+msgid "could not parse '%s' (looking for '%s')"
+msgstr "„%s“ не може да се анализира (търси се „%s“)"
+
+#: sequencer.c:731
+#, c-format
+msgid "bad quoting on %s value in '%s'"
+msgstr "лошо цитиране на стойността на „%s“ в „%s“"
+
+#: sequencer.c:747
+#, c-format
+msgid "invalid date format '%s' in '%s'"
+msgstr "неправилен формат на дата „%s“ в „%s“"
+
+#: sequencer.c:761
#, c-format
msgid ""
"you have staged changes in your working tree\n"
@@ -3614,17 +4400,17 @@ msgstr ""
"\n"
" git rebase --continue\n"
-#: sequencer.c:818
+#: sequencer.c:830
msgid "writing root commit"
msgstr "запазване на начално подаване"
-#: sequencer.c:1043
+#: sequencer.c:1055
msgid "'prepare-commit-msg' hook failed"
msgstr ""
"неуспешно изпълнение на куката при промяна на съобщението при подаване "
"(prepare-commit-msg)"
-#: sequencer.c:1050
+#: sequencer.c:1062
msgid ""
"Your name and email address were configured automatically based\n"
"on your username and hostname. Please check that they are accurate.\n"
@@ -3653,7 +4439,7 @@ msgstr ""
"\n"
" git commit --amend --reset-author\n"
-#: sequencer.c:1063
+#: sequencer.c:1075
msgid ""
"Your name and email address were configured automatically based\n"
"on your username and hostname. Please check that they are accurate.\n"
@@ -3679,325 +4465,354 @@ msgstr ""
"\n"
" git commit --amend --reset-author\n"
-#: sequencer.c:1103
+#: sequencer.c:1115
msgid "couldn't look up newly created commit"
msgstr "току що създаденото подаване не може да бъде открито"
-#: sequencer.c:1105
+#: sequencer.c:1117
msgid "could not parse newly created commit"
msgstr "току що създаденото подаване не може да бъде анализирано"
-#: sequencer.c:1151
+#: sequencer.c:1163
msgid "unable to resolve HEAD after creating commit"
msgstr ""
"състоянието сочено от указателя „HEAD“ не може да бъде открито след "
"подаването"
-#: sequencer.c:1153
+#: sequencer.c:1165
msgid "detached HEAD"
msgstr "несвързан връх „HEAD“"
-#: sequencer.c:1157
+#: sequencer.c:1169
msgid " (root-commit)"
msgstr " (начално подаване)"
-#: sequencer.c:1178
+#: sequencer.c:1190
msgid "could not parse HEAD"
msgstr "указателят „HEAD“ не може да бъде анализиран"
-#: sequencer.c:1180
+#: sequencer.c:1192
#, c-format
msgid "HEAD %s is not a commit!"
msgstr "указателят „HEAD“ „%s“ сочи към нещо, което не е подаване!"
-#: sequencer.c:1184 builtin/commit.c:1528
+#: sequencer.c:1196 builtin/commit.c:1528
msgid "could not parse HEAD commit"
msgstr "върховото подаване „HEAD“ не може да бъде прочетено"
-#: sequencer.c:1235 sequencer.c:1832
+#: sequencer.c:1247 sequencer.c:1845
msgid "unable to parse commit author"
msgstr "авторът на подаването не може да бъде анализиран"
-#: sequencer.c:1245 builtin/am.c:1630 builtin/merge.c:645
+#: sequencer.c:1257 builtin/am.c:1632 builtin/merge.c:675
msgid "git write-tree failed to write a tree"
msgstr "Командата „git write-tree“ не успя да запише обект-дърво"
-#: sequencer.c:1262 sequencer.c:1317
+#: sequencer.c:1274 sequencer.c:1329
#, c-format
msgid "unable to read commit message from '%s'"
msgstr "съобщението за подаване не може да бъде прочетено от „%s“"
-#: sequencer.c:1284 builtin/am.c:1650 builtin/commit.c:1631 builtin/merge.c:825
-#: builtin/merge.c:850
+#: sequencer.c:1296 builtin/am.c:1653 builtin/commit.c:1631 builtin/merge.c:855
+#: builtin/merge.c:880
msgid "failed to write commit object"
msgstr "обектът за подаването не може да бъде записан"
-#: sequencer.c:1344
+#: sequencer.c:1356
#, c-format
msgid "could not parse commit %s"
msgstr "подаването „%s“ не може да бъде анализирано"
-#: sequencer.c:1349
+#: sequencer.c:1361
#, c-format
msgid "could not parse parent commit %s"
msgstr "родителското подаване „%s“ не може да бъде анализирано"
-#: sequencer.c:1500 sequencer.c:1525
+#: sequencer.c:1457 sequencer.c:1565
+#, c-format
+msgid "unknown command: %d"
+msgstr "непозната команда: %d"
+
+#: sequencer.c:1512 sequencer.c:1537
#, c-format
msgid "This is a combination of %d commits."
msgstr "Това е обединение от %d подавания"
-#: sequencer.c:1510 sequencer.c:4355
+#: sequencer.c:1522 sequencer.c:4520
msgid "need a HEAD to fixup"
msgstr "За вкарване в предходното подаване ви трябва указател „HEAD“"
-#: sequencer.c:1512 sequencer.c:2729
+#: sequencer.c:1524 sequencer.c:2768
msgid "could not read HEAD"
msgstr "указателят „HEAD“ не може да се прочете"
-#: sequencer.c:1514
+#: sequencer.c:1526
msgid "could not read HEAD's commit message"
msgstr ""
"съобщението за подаване към указателя „HEAD“ не може да бъде прочетено: %s"
-#: sequencer.c:1520
+#: sequencer.c:1532
#, c-format
msgid "cannot write '%s'"
msgstr "„%s“ не може да се запази"
-#: sequencer.c:1527 git-rebase--interactive.sh:457
+#: sequencer.c:1539 git-rebase--preserve-merges.sh:441
msgid "This is the 1st commit message:"
msgstr "Това е 1-то съобщение при подаване:"
-#: sequencer.c:1535
+#: sequencer.c:1547
#, c-format
msgid "could not read commit message of %s"
msgstr "съобщението за подаване към „%s“ не може да бъде прочетено"
-#: sequencer.c:1542
+#: sequencer.c:1554
#, c-format
msgid "This is the commit message #%d:"
msgstr "Това е съобщение при подаване №%d:"
-#: sequencer.c:1548
+#: sequencer.c:1560
#, c-format
msgid "The commit message #%d will be skipped:"
msgstr "Съобщение при подаване №%d ще бъде прескочено:"
-#: sequencer.c:1553
-#, c-format
-msgid "unknown command: %d"
-msgstr "непозната команда: %d"
-
-#: sequencer.c:1631
+#: sequencer.c:1643
msgid "your index file is unmerged."
msgstr "индексът не е слят."
-#: sequencer.c:1638
+#: sequencer.c:1650
msgid "cannot fixup root commit"
msgstr "началното подаване не може да се вкара в предходното му"
-#: sequencer.c:1657
+#: sequencer.c:1669
#, c-format
msgid "commit %s is a merge but no -m option was given."
msgstr "подаването „%s“ е сливане, но не е дадена опцията „-m“"
-#: sequencer.c:1665
+#: sequencer.c:1677
#, c-format
msgid "commit %s does not have parent %d"
msgstr "подаването „%s“ няма родител %d"
-#: sequencer.c:1669
+#: sequencer.c:1681
#, c-format
msgid "mainline was specified but commit %s is not a merge."
msgstr "указано е базово подаване, но подаването „%s“ не е сливане."
-#: sequencer.c:1675
+#: sequencer.c:1687
#, 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:1694
+#: sequencer.c:1706
#, c-format
msgid "%s: cannot parse parent commit %s"
msgstr "%s: неразпозната стойност за родителското подаване „%s“"
-#: sequencer.c:1759
+#: sequencer.c:1771
#, c-format
msgid "could not rename '%s' to '%s'"
msgstr "„%s“ не може да се преименува на „%s“"
-#: sequencer.c:1813
+#: sequencer.c:1826
#, c-format
msgid "could not revert %s... %s"
msgstr "подаването „%s“… не може да бъде отменено: „%s“"
-#: sequencer.c:1814
+#: sequencer.c:1827
#, c-format
msgid "could not apply %s... %s"
msgstr "подаването „%s“… не може да бъде приложено: „%s“"
-#: sequencer.c:1864
-msgid "empty commit set passed"
-msgstr "зададено е празно множество от подавания"
-
-#: sequencer.c:1874
+#: sequencer.c:1885
#, c-format
msgid "git %s: failed to read the index"
msgstr "git %s: неуспешно изчитане на индекса"
-#: sequencer.c:1881
+#: sequencer.c:1892
#, c-format
msgid "git %s: failed to refresh the index"
msgstr "git %s: неуспешно обновяване на индекса"
-#: sequencer.c:1961
+#: sequencer.c:1972
#, c-format
msgid "%s does not accept arguments: '%s'"
msgstr "„%s“ не приема аргументи: „%s“"
-#: sequencer.c:1970
+#: sequencer.c:1981
#, c-format
msgid "missing arguments for %s"
msgstr "„%s“ изисква аргументи"
-#: sequencer.c:2029
+#: sequencer.c:2040
#, c-format
msgid "invalid line %d: %.*s"
msgstr "неправилен ред %d: %.*s"
-#: sequencer.c:2037
+#: sequencer.c:2048
#, c-format
msgid "cannot '%s' without a previous commit"
msgstr "Без предишно подаване не може да се изпълни „%s“"
-#: sequencer.c:2085 sequencer.c:4138 sequencer.c:4173
+#: sequencer.c:2096 sequencer.c:4277 sequencer.c:4333
#, c-format
msgid "could not read '%s'."
msgstr "от „%s“ не може да се чете."
-#: sequencer.c:2108
+#: sequencer.c:2119
msgid "please fix this using 'git rebase --edit-todo'."
msgstr "коригирайте това чрез „git rebase --edit-todo“."
-#: sequencer.c:2110
+#: sequencer.c:2121
#, c-format
msgid "unusable instruction sheet: '%s'"
msgstr "неизползваем файл с описание на предстоящите действия: „%s“"
-#: sequencer.c:2115
+#: sequencer.c:2126
msgid "no commits parsed."
msgstr "никое от подаванията не може да се разпознае."
-#: sequencer.c:2126
+#: sequencer.c:2137
msgid "cannot cherry-pick during a revert."
msgstr ""
"по време на отмяна на подаване не може да се извърши отбиране на подаване."
-#: sequencer.c:2128
+#: sequencer.c:2139
msgid "cannot revert during a cherry-pick."
msgstr "по време на отбиране не може да се извърши отмяна на подаване."
-#: sequencer.c:2195
-#, c-format
-msgid "invalid key: %s"
-msgstr "неправилен ключ: „%s“"
-
-#: sequencer.c:2198
+#: sequencer.c:2209
#, c-format
msgid "invalid value for %s: %s"
msgstr "неправилна стойност за „%s“: „%s“"
-#: sequencer.c:2269
+#: sequencer.c:2285
msgid "unusable squash-onto"
msgstr "подаването, в което другите да се вкарат, не може да се използва"
-#: sequencer.c:2285
+#: sequencer.c:2301
#, c-format
msgid "malformed options sheet: '%s'"
msgstr "неправилен файл с опции: „%s“"
-#: sequencer.c:2323
+#: sequencer.c:2335 sequencer.c:3775
+msgid "empty commit set passed"
+msgstr "зададено е празно множество от подавания"
+
+#: sequencer.c:2343
msgid "a cherry-pick or revert is already in progress"
msgstr ""
"в момента вече се извършва отбиране на подавания или пребазиране на клона"
-#: sequencer.c:2324
+#: sequencer.c:2344
msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
msgstr "използвайте „git cherry-pick (--continue | --quit | --abort)“"
-#: sequencer.c:2327
+#: sequencer.c:2347
#, c-format
msgid "could not create sequencer directory '%s'"
msgstr "директорията за секвенсора „%s“ не може да бъде създадена"
-#: sequencer.c:2341
+#: sequencer.c:2361
msgid "could not lock HEAD"
msgstr "указателят „HEAD“ не може да се заключи"
-#: sequencer.c:2396 sequencer.c:3403
+#: sequencer.c:2416 sequencer.c:3543
msgid "no cherry-pick or revert in progress"
msgstr ""
"в момента не се извършва отбиране на подавания или пребазиране на клона"
-#: sequencer.c:2398
+#: sequencer.c:2418
msgid "cannot resolve HEAD"
msgstr "Подаването сочено от указателя „HEAD“ не може да бъде открито"
-#: sequencer.c:2400 sequencer.c:2435
+#: sequencer.c:2420 sequencer.c:2455
msgid "cannot abort from a branch yet to be born"
msgstr ""
"действието не може да бъде преустановено, когато сте на клон, който тепърва "
"предстои да бъде създаден"
-#: sequencer.c:2421 builtin/grep.c:720
+#: sequencer.c:2441 builtin/grep.c:721
#, c-format
msgid "cannot open '%s'"
msgstr "„%s“ не може да бъде отворен"
-#: sequencer.c:2423
+#: sequencer.c:2443
#, c-format
msgid "cannot read '%s': %s"
msgstr "„%s“ не може да бъде прочетен: %s"
-#: sequencer.c:2424
+#: sequencer.c:2444
msgid "unexpected end of file"
msgstr "неочакван край на файл"
-#: sequencer.c:2430
+#: sequencer.c:2450
#, c-format
msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
msgstr ""
"запазеният преди започването на отбирането файл за указателя „HEAD“ — „%s“ е "
"повреден"
-#: sequencer.c:2441
+#: sequencer.c:2461
msgid "You seem to have moved HEAD. Not rewinding, check your HEAD!"
msgstr ""
"Изглежда указателят „HEAD“ е променен. Проверете към какво сочи.\n"
"Не се правят промени."
-#: sequencer.c:2545 sequencer.c:3321
+#: sequencer.c:2565 sequencer.c:3461
#, c-format
msgid "could not update %s"
msgstr "„%s“ не може да се обнови"
-#: sequencer.c:2583 sequencer.c:3301
+#: sequencer.c:2603 sequencer.c:3441
msgid "cannot read HEAD"
msgstr "указателят „HEAD“ не може да бъде прочетен"
-#: sequencer.c:2618 sequencer.c:2622 builtin/difftool.c:639
+#: sequencer.c:2618
+#, c-format
+msgid "unable to copy '%s' to '%s'"
+msgstr "„%s“ не може да се копира като „%s“"
+
+#: sequencer.c:2626
+#, c-format
+msgid ""
+"You can amend the commit now, with\n"
+"\n"
+" git commit --amend %s\n"
+"\n"
+"Once you are satisfied with your changes, run\n"
+"\n"
+" git rebase --continue\n"
+msgstr ""
+"Може да промените подаването с командата:\n"
+"\n"
+" git commit --amend %s\n"
+"\n"
+"След като привършите, продължете с командата:\n"
+"\n"
+" git rebase --continue\n"
+
+#: sequencer.c:2636
+#, c-format
+msgid "Could not apply %s... %.*s"
+msgstr "Подаването „%s“… не може да бъде приложено: „%.*s“"
+
+#: sequencer.c:2643
+#, c-format
+msgid "Could not merge %.*s"
+msgstr "Невъзможно сливане на „%.*s“"
+
+#: sequencer.c:2654 sequencer.c:2658 builtin/difftool.c:640
#, c-format
msgid "could not copy '%s' to '%s'"
msgstr "„%s“ не може да се копира като „%s“"
-#: sequencer.c:2641
+#: sequencer.c:2680 sequencer.c:3095
msgid "could not read index"
msgstr "индексът не може да бъде прочетен"
-#: sequencer.c:2646
+#: sequencer.c:2685
#, c-format
msgid ""
"execution failed: %s\n"
@@ -4012,11 +4827,11 @@ msgstr ""
" git rebase --continue\n"
"\n"
-#: sequencer.c:2652
+#: sequencer.c:2691
msgid "and made changes to the index and/or the working tree\n"
msgstr "и промени индекса и/или работното дърво\n"
-#: sequencer.c:2658
+#: sequencer.c:2697
#, c-format
msgid ""
"execution succeeded: %s\n"
@@ -4033,62 +4848,81 @@ msgstr ""
" git rebase --continue\n"
"\n"
-#: sequencer.c:2771
+#: sequencer.c:2758
+#, c-format
+msgid "illegal label name: '%.*s'"
+msgstr "неправилно име на етикет: „%.*s“"
+
+#: sequencer.c:2810
msgid "writing fake root commit"
msgstr "запазване на фалшиво начално подаване"
-#: sequencer.c:2776
+#: sequencer.c:2815
msgid "writing squash-onto"
msgstr "запазване на подаването, в което другите да се вкарат"
-#: sequencer.c:2811
+#: sequencer.c:2850
#, c-format
msgid "failed to find tree of %s"
msgstr "дървото, сочено от „%s“, не може да бъде открито"
-#: sequencer.c:2829
+#: sequencer.c:2868
msgid "could not write index"
msgstr "индексът не може да бъде записан"
-#: sequencer.c:2861
+#: sequencer.c:2895
+#, c-format
+msgid "could not resolve '%s'"
+msgstr "„%s“ не може да бъде открит"
+
+#: sequencer.c:2921
msgid "cannot merge without a current revision"
msgstr "без текущо подаване не може да се слива"
-#: sequencer.c:2884
+#: sequencer.c:2943
#, c-format
-msgid "could not resolve '%s'"
-msgstr "„%s“ не може да бъде открит"
+msgid "unable to parse '%.*s'"
+msgstr "„%.*s“ не може да се анализира"
+
+#: sequencer.c:2952
+#, c-format
+msgid "nothing to merge: '%.*s'"
+msgstr "няма нищо за сливане: „%.*s“"
-#: sequencer.c:2906
+#: sequencer.c:2964
+msgid "octopus merge cannot be executed on top of a [new root]"
+msgstr "върху начално подаване не може да се извърши множествено сливане"
+
+#: sequencer.c:2979
#, c-format
msgid "could not get commit message of '%s'"
msgstr "съобщението за подаване към „%s“ не може да бъде получено"
-#: sequencer.c:2916 sequencer.c:2941
+#: sequencer.c:2989 sequencer.c:3015
#, c-format
msgid "could not write '%s'"
msgstr "„%s“ не може да се запише"
-#: sequencer.c:3005
+#: sequencer.c:3127
#, c-format
msgid "could not even attempt to merge '%.*s'"
msgstr "сливането на „%.*s“ не може даже да започне"
-#: sequencer.c:3021
+#: sequencer.c:3143
msgid "merge: Unable to write new index file"
msgstr "сливане: новият индекс не може да бъде запазен"
-#: sequencer.c:3088
+#: sequencer.c:3211
#, c-format
msgid "Applied autostash.\n"
msgstr "Автоматично скатаното е приложено.\n"
-#: sequencer.c:3100
+#: sequencer.c:3223
#, c-format
msgid "cannot store %s"
msgstr "„%s“ не може да бъде запазен"
-#: sequencer.c:3103 git-rebase.sh:188
+#: sequencer.c:3226 git-rebase.sh:188
#, c-format
msgid ""
"Applying autostash resulted in conflicts.\n"
@@ -4099,7 +4933,7 @@ msgstr ""
"надеждно скатани. Можете да пробвате да ги приложите чрез „git stash pop“\n"
"или да ги изхвърлите чрез „git stash drop“, когато поискате.\n"
-#: sequencer.c:3134
+#: sequencer.c:3257
#, c-format
msgid ""
"Could not execute the todo command\n"
@@ -4122,48 +4956,48 @@ msgstr ""
" git rebase --edit-todo\n"
" git rebase --continue\n"
-#: sequencer.c:3202
+#: sequencer.c:3325
#, c-format
msgid "Stopped at %s... %.*s\n"
msgstr "Спиране при „%s“… %.*s\n"
-#: sequencer.c:3264
+#: sequencer.c:3404
#, c-format
msgid "unknown command %d"
msgstr "непозната команда %d"
-#: sequencer.c:3309
+#: sequencer.c:3449
msgid "could not read orig-head"
msgstr "указателят за „orig-head“ не може да се прочете"
-#: sequencer.c:3314 sequencer.c:4352
+#: sequencer.c:3454 sequencer.c:4517
msgid "could not read 'onto'"
msgstr "указателят за „onto“ не може да се прочете"
-#: sequencer.c:3328
+#: sequencer.c:3468
#, c-format
msgid "could not update HEAD to %s"
msgstr "„HEAD“ не може да бъде обновен до „%s“"
-#: sequencer.c:3414
+#: sequencer.c:3554
msgid "cannot rebase: You have unstaged changes."
msgstr "не може да пребазирате, защото има промени, които не са в индекса."
-#: sequencer.c:3423
+#: sequencer.c:3563
msgid "cannot amend non-existing commit"
msgstr "несъществуващо подаване не може да се поправи"
-#: sequencer.c:3425
+#: sequencer.c:3565
#, c-format
msgid "invalid file: '%s'"
msgstr "неправилен файл: „%s“"
-#: sequencer.c:3427
+#: sequencer.c:3567
#, c-format
msgid "invalid contents: '%s'"
msgstr "неправилно съдържание: „%s“"
-#: sequencer.c:3430
+#: sequencer.c:3570
msgid ""
"\n"
"You have uncommitted changes in your working tree. Please, commit them\n"
@@ -4173,47 +5007,47 @@ msgstr ""
"В работното дърво има неподадени промени. Първо ги подайте, а след това\n"
"отново изпълнете „git rebase --continue“."
-#: sequencer.c:3455 sequencer.c:3493
+#: sequencer.c:3595 sequencer.c:3633
#, c-format
msgid "could not write file: '%s'"
msgstr "файлът „%s“ не може да бъде записан"
-#: sequencer.c:3508
+#: sequencer.c:3648
msgid "could not remove CHERRY_PICK_HEAD"
msgstr "указателят „CHERRY_PICK_HEAD“ не може да бъде изтрит"
-#: sequencer.c:3515
+#: sequencer.c:3655
msgid "could not commit staged changes."
msgstr "промените в индекса не могат да бъдат подадени."
-#: sequencer.c:3612
+#: sequencer.c:3752
#, c-format
msgid "%s: can't cherry-pick a %s"
msgstr "%s: не може да се отбере „%s“"
-#: sequencer.c:3616
+#: sequencer.c:3756
#, c-format
msgid "%s: bad revision"
msgstr "%s: неправилна версия"
-#: sequencer.c:3649
+#: sequencer.c:3791
msgid "can't revert as initial commit"
msgstr "първоначалното подаване не може да бъде отменено"
-#: sequencer.c:4098
+#: sequencer.c:4238
msgid "make_script: unhandled options"
msgstr "make_script: неподдържани опции"
-#: sequencer.c:4101
+#: sequencer.c:4241
msgid "make_script: error preparing revisions"
msgstr "make_script: грешка при подготовката на версии"
-#: sequencer.c:4142 sequencer.c:4177
+#: sequencer.c:4281 sequencer.c:4337
#, c-format
msgid "unusable todo list: '%s'"
msgstr "неуспешно изтриване на списъка за изпълнение: „%s“"
-#: sequencer.c:4236
+#: sequencer.c:4396
#, c-format
msgid ""
"unrecognized setting %s for option rebase.missingCommitsCheck. Ignoring."
@@ -4221,7 +5055,7 @@ msgstr ""
"Непозната стойност „%s“ за настройката „rebase.missingCommitsCheck“. "
"Настройката се прескача."
-#: sequencer.c:4302
+#: sequencer.c:4466
#, c-format
msgid ""
"Warning: some commits may have been dropped accidentally.\n"
@@ -4230,7 +5064,7 @@ msgstr ""
"Предупреждение: някои подавания може да са пропуснати.\n"
"Пропуснати подавания (новите са най-отгоре):\n"
-#: sequencer.c:4309
+#: sequencer.c:4473
#, c-format
msgid ""
"To avoid this message, use \"drop\" to explicitly remove a commit.\n"
@@ -4247,7 +5081,7 @@ msgstr ""
"предупреждение)\n"
"или „error“ (считане за грешка).\n"
-#: sequencer.c:4321
+#: sequencer.c:4486
#, c-format
msgid ""
"You can fix this with 'git rebase --edit-todo' and then run 'git rebase --"
@@ -4258,12 +5092,7 @@ msgstr ""
"continue“ след това.\n"
"Може и да преустановите пребазирането с командата „git rebase --abort“.\n"
-#: sequencer.c:4375
-#, c-format
-msgid "could not parse commit '%s'"
-msgstr "подаването „%s“ не може да бъде анализирано"
-
-#: sequencer.c:4490
+#: sequencer.c:4660
msgid "the script was already rearranged."
msgstr "скриптът вече е преподреден."
@@ -4428,12 +5257,48 @@ msgstr "неуспешно изпълнение на „open“ или „dup“
#: setup.c:1226
msgid "fork failed"
-msgstr "неуспешно изпълнение на „fork“"
+msgstr "неуспешно създаване на процес чрез „fork“"
#: setup.c:1231
msgid "setsid failed"
msgstr "неуспешно изпълнение на „setsid“"
+#: sha1-file.c:381
+#, c-format
+msgid "object directory %s does not exist; check .git/objects/info/alternates"
+msgstr ""
+"директорията за обекти „%s“ не съществува, проверете „.git/objects/info/"
+"alternates“"
+
+#: sha1-file.c:432
+#, c-format
+msgid "unable to normalize alternate object path: %s"
+msgstr "алтернативният път към обекти не може да бъде нормализиран: „%s“"
+
+#: sha1-file.c:503
+#, c-format
+msgid "%s: ignoring alternate object stores, nesting too deep"
+msgstr ""
+"%s: алтернативните хранилища за обекти се пренебрегват поради прекалено "
+"дълбоко влагане"
+
+#: sha1-file.c:510
+#, c-format
+msgid "unable to normalize object directory: %s"
+msgstr "директорията за обекти „%s“ не може да бъде нормализирана"
+
+#: sha1-file.c:565
+msgid "unable to fdopen alternates lockfile"
+msgstr "заключващият файл за алтернативите не може да се отвори с „fdopen“"
+
+#: sha1-file.c:583
+msgid "unable to read alternates file"
+msgstr "файлът с алтернативите не може да бъде прочетен"
+
+#: sha1-file.c:590
+msgid "unable to move new alternates file into place"
+msgstr "новият файл с алтернативите не може да бъде преместен на мястото му"
+
#: sha1-file.c:625
#, c-format
msgid "path '%s' does not exist"
@@ -4459,16 +5324,213 @@ msgstr "еталонното хранилище „%s“ е плитко"
msgid "reference repository '%s' is grafted"
msgstr "еталонното хранилище „%s“ е с присаждане"
-#: sha1-name.c:442
+#: sha1-file.c:781
+#, c-format
+msgid "attempting to mmap %<PRIuMAX> over limit %<PRIuMAX>"
+msgstr ""
+"неуспешен опит за „mmap“ %<PRIuMAX>, което е над позволеното %<PRIuMAX>"
+
+#: sha1-file.c:806
+msgid "mmap failed"
+msgstr "неуспешно изпълнение на „mmap“"
+
+#: sha1-file.c:973
+#, c-format
+msgid "object file %s is empty"
+msgstr "файлът с обектите „%s“ е празен"
+
+#: sha1-file.c:1093 sha1-file.c:2206
+#, c-format
+msgid "corrupt loose object '%s'"
+msgstr "непакетираният обект „%s“ е повреден"
+
+#: sha1-file.c:1095 sha1-file.c:2210
+#, c-format
+msgid "garbage at end of loose object '%s'"
+msgstr "грешни данни в края на непакетирания обект „%s“"
+
+#: sha1-file.c:1137
+msgid "invalid object type"
+msgstr "неправилен вид обект"
+
+#: sha1-file.c:1219
+#, c-format
+msgid "unable to unpack %s header with --allow-unknown-type"
+msgstr ""
+"заглавната част „%s“ не може да се разпакетира с опцията „--allow-unknown-"
+"type“"
+
+#: sha1-file.c:1222
+#, c-format
+msgid "unable to unpack %s header"
+msgstr "заглавната част на „%s“ не може да бъде разпакетирана"
+
+#: sha1-file.c:1228
+#, c-format
+msgid "unable to parse %s header with --allow-unknown-type"
+msgstr ""
+"заглавната част „%s“ не може да се анализира с опцията „--allow-unknown-type“"
+
+#: sha1-file.c:1231
+#, c-format
+msgid "unable to parse %s header"
+msgstr "заглавната част на „%s“ не може да бъде анализирана"
+
+#: sha1-file.c:1422
+#, c-format
+msgid "failed to read object %s"
+msgstr "обектът „%s“ не може да бъде прочетен"
+
+#: sha1-file.c:1426
+#, c-format
+msgid "replacement %s not found for %s"
+msgstr "заместителят „%s“ на „%s“ не може да бъде открит"
+
+#: sha1-file.c:1430
+#, c-format
+msgid "loose object %s (stored in %s) is corrupt"
+msgstr "непакетираният обект „%s“ (в „%s“) е повреден"
+
+#: sha1-file.c:1434
+#, c-format
+msgid "packed object %s (stored in %s) is corrupt"
+msgstr "пакетираният обект „%s“ (в „%s“) е повреден"
+
+#: sha1-file.c:1536
+#, c-format
+msgid "unable to write sha1 filename %s"
+msgstr "грешка при записа на файла със сумите по SHA1 „%s“"
+
+#: sha1-file.c:1543
+#, c-format
+msgid "unable to set permission to '%s'"
+msgstr "правата за достъп до „%s“ не могат да бъдат зададени"
+
+#: sha1-file.c:1550
+msgid "file write error"
+msgstr "грешка при запис на файл"
+
+#: sha1-file.c:1569
+msgid "error when closing sha1 file"
+msgstr "грешка при затварянето на файла със сумите по SHA1"
+
+#: sha1-file.c:1635
+#, c-format
+msgid "insufficient permission for adding an object to repository database %s"
+msgstr ""
+"няма права за добавяне на обект към базата от данни на хранилището „%s“"
+
+#: sha1-file.c:1637
+msgid "unable to create temporary file"
+msgstr "не може да бъде създаден временен файл"
+
+#: sha1-file.c:1661
+msgid "unable to write sha1 file"
+msgstr "не може да се пише във файла със сумите по SHA1"
+
+#: sha1-file.c:1667
+#, c-format
+msgid "unable to deflate new object %s (%d)"
+msgstr "новият обект „%s“ не може да се компресира с „deflate“: %d"
+
+#: sha1-file.c:1671
+#, c-format
+msgid "deflateEnd on object %s failed (%d)"
+msgstr "неуспешно приключване на „deflate“ върху „%s“: %d"
+
+#: sha1-file.c:1675
+#, c-format
+msgid "confused by unstable object source data for %s"
+msgstr "грешка поради нестабилния източник данни за обектите „%s“"
+
+#: sha1-file.c:1685 builtin/pack-objects.c:899
+#, c-format
+msgid "failed utime() on %s"
+msgstr "неуспешно задаване на време на достъп/създаване чрез „utime“ на „%s“"
+
+#: sha1-file.c:1760
+#, c-format
+msgid "cannot read sha1_file for %s"
+msgstr "файлът със сумите по SHA1 на „%s“ не може да бъде прочетен"
+
+#: sha1-file.c:1805
+msgid "corrupt commit"
+msgstr "повредено подаване"
+
+#: sha1-file.c:1813
+msgid "corrupt tag"
+msgstr "повреден етикет"
+
+#: sha1-file.c:1906
+#, c-format
+msgid "read error while indexing %s"
+msgstr "грешка при четене по време на индексиране на „%s“"
+
+#: sha1-file.c:1909
+#, c-format
+msgid "short read while indexing %s"
+msgstr "непълно прочитане по време на индексиране на „%s“"
+
+#: sha1-file.c:1980 sha1-file.c:1989
+#, c-format
+msgid "%s: failed to insert into database"
+msgstr "„%s“ не може да се вмъкне в базата от данни"
+
+#: sha1-file.c:1995
+#, c-format
+msgid "%s: unsupported file type"
+msgstr "неподдържан вид файл: „%s“"
+
+#: sha1-file.c:2019
+#, c-format
+msgid "%s is not a valid object"
+msgstr "„%s“ е неправилен обект"
+
+#: sha1-file.c:2021
+#, c-format
+msgid "%s is not a valid '%s' object"
+msgstr "„%s“ е неправилен обект от вид „%s“"
+
+#: sha1-file.c:2048 builtin/index-pack.c:158
+#, c-format
+msgid "unable to open %s"
+msgstr "обектът „%s“ не може да бъде отворен"
+
+#: sha1-file.c:2217 sha1-file.c:2269
+#, c-format
+msgid "sha1 mismatch for %s (expected %s)"
+msgstr "неправилна сума по SHA1 за „%s“ (трябва да е %s)"
+
+#: sha1-file.c:2241
+#, c-format
+msgid "unable to mmap %s"
+msgstr "неуспешно изпълнение на „mmap“ върху „%s“"
+
+#: sha1-file.c:2246
+#, c-format
+msgid "unable to unpack header of %s"
+msgstr "заглавната част на „%s“ не може да бъде разпакетирана"
+
+#: sha1-file.c:2252
+#, c-format
+msgid "unable to parse header of %s"
+msgstr "заглавната част на „%s“ не може да бъде анализирана"
+
+#: sha1-file.c:2263
+#, c-format
+msgid "unable to unpack contents of %s"
+msgstr "съдържанието на „%s“ не може да бъде разпакетирано"
+
+#: sha1-name.c:444
#, c-format
msgid "short SHA1 %s is ambiguous"
msgstr "късият SHA1 „%s“ не е еднозначен"
-#: sha1-name.c:453
+#: sha1-name.c:455
msgid "The candidates are:"
msgstr "Възможностите са:"
-#: sha1-name.c:695
+#: sha1-name.c:699
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"
@@ -4527,36 +5589,46 @@ msgstr "в неподготвения подмодул „%s“"
msgid "Pathspec '%s' is in submodule '%.*s'"
msgstr "Пътят „%s“ е в подмодула „%.*s“"
-#: submodule.c:837
+#: submodule.c:839
#, c-format
msgid "submodule entry '%s' (%s) is a %s, not a commit"
msgstr "записът за подмодула „%s“ (%s) е %s, а не подаване!"
-#: submodule.c:1069 builtin/branch.c:651 builtin/submodule--helper.c:1743
+#: submodule.c:1071 builtin/branch.c:670 builtin/submodule--helper.c:1888
msgid "Failed to resolve HEAD as a valid ref."
msgstr "Не може да се открие към какво сочи указателят „HEAD“"
-#: submodule.c:1375
+#: submodule.c:1377
#, c-format
msgid "'%s' not recognized as a git repository"
msgstr "„%s“ не е хранилище на git"
-#: submodule.c:1513
+#: submodule.c:1515
#, c-format
msgid "could not start 'git status' in submodule '%s'"
msgstr "командата „git status“ не може да се изпълни в подмодула „%s“"
-#: submodule.c:1526
+#: submodule.c:1528
#, c-format
msgid "could not run 'git status' in submodule '%s'"
msgstr "командата „git status“ не може да се изпълни в подмодула „%s“"
-#: submodule.c:1619
+#: submodule.c:1543
+#, c-format
+msgid "Could not unset core.worktree setting in submodule '%s'"
+msgstr "Настройката „core.worktree“ не може да се махне в подмодула „%s“"
+
+#: submodule.c:1633
#, c-format
msgid "submodule '%s' has dirty index"
msgstr "индексът на подмодула „%s“ не е чист"
-#: submodule.c:1718
+#: submodule.c:1685
+#, c-format
+msgid "Submodule '%s' could not be updated."
+msgstr "Подмодулът „%s“ не може да се обнови."
+
+#: submodule.c:1734
#, c-format
msgid ""
"relocate_gitdir for submodule '%s' with more than one worktree not supported"
@@ -4564,18 +5636,18 @@ msgstr ""
"не се поддържа „relocate_gitdir“ за подмодула „%s“, който има повече от едно "
"работно дърво"
-#: submodule.c:1730 submodule.c:1786
+#: submodule.c:1746 submodule.c:1802
#, c-format
msgid "could not lookup name for submodule '%s'"
msgstr "името на подмодула „%s“ не може да бъде намерено"
-#: submodule.c:1734 builtin/submodule--helper.c:1261
-#: builtin/submodule--helper.c:1271
+#: submodule.c:1750 builtin/submodule--helper.c:1406
+#: builtin/submodule--helper.c:1416
#, c-format
msgid "could not create directory '%s'"
msgstr "Директорията „%s“ не може да бъде създадена"
-#: submodule.c:1737
+#: submodule.c:1753
#, c-format
msgid ""
"Migrating git directory of '%s%s' from\n"
@@ -4586,30 +5658,30 @@ msgstr ""
"„%s“ към\n"
"„%s“\n"
-#: submodule.c:1821
+#: submodule.c:1837
#, c-format
msgid "could not recurse into submodule '%s'"
msgstr "неуспешна обработка на поддиректориите в подмодула „%s“"
-#: submodule.c:1865
+#: submodule.c:1881
msgid "could not start ls-files in .."
msgstr "„ls-stat“ не може да се стартира в „..“"
-#: submodule.c:1904
+#: submodule.c:1920
#, c-format
msgid "ls-tree returned unexpected return code %d"
msgstr "„ls-tree“ завърши с неочакван изходен код: %d"
-#: submodule-config.c:230
+#: submodule-config.c:231
#, c-format
msgid "ignoring suspicious submodule name: %s"
msgstr "игнориране на подозрително име на подмодул: „%s“"
-#: submodule-config.c:294
+#: submodule-config.c:295
msgid "negative values not allowed for submodule.fetchjobs"
msgstr "настройката „submodule.fetchjobs“ не приема отрицателни стойности"
-#: submodule-config.c:467
+#: submodule-config.c:468
#, c-format
msgid "invalid value for %s"
msgstr "Неправилна стойност за „%s“"
@@ -4625,7 +5697,7 @@ msgstr "неуспешно изпълнение на завършващата к
msgid "unknown value '%s' for key '%s'"
msgstr "непозната стойност „%s“ за настройката „%s“"
-#: trailer.c:539 trailer.c:544 builtin/remote.c:293
+#: trailer.c:539 trailer.c:544 builtin/remote.c:294
#, c-format
msgid "more than one %s"
msgstr "стойността „%s“ се повтаря в настройките"
@@ -4644,7 +5716,7 @@ msgstr "входният файл „%s“ не може да бъде проч
msgid "could not read from stdin"
msgstr "от стандартния вход не може да се чете"
-#: trailer.c:1008 builtin/am.c:46
+#: trailer.c:1008 builtin/am.c:47
#, c-format
msgid "could not stat %s"
msgstr "Не може да се получи информация чрез „stat“ за „%s“"
@@ -4673,16 +5745,39 @@ msgstr "временният файл не може да се преименув
msgid "Would set upstream of '%s' to '%s' of '%s'\n"
msgstr "Клонът „%s“ ще следи „%s“ от „%s“\n"
+#: transport.c:142
+#, c-format
+msgid "could not read bundle '%s'"
+msgstr "пратката на git „%s“ не може да бъде прочетена"
+
#: transport.c:208
#, c-format
msgid "transport: invalid depth option '%s'"
msgstr "transport: неправилна опция за дълбочина: %s"
-#: transport.c:584
+#: transport.c:586
msgid "could not parse transport.color.* config"
msgstr "стойността на настройката „transport.color.*“ не може да се разпознае"
-#: transport.c:996
+#: transport.c:659
+msgid "support for protocol v2 not implemented yet"
+msgstr "протокол версия 2 все още не се поддържа"
+
+#: transport.c:785
+#, c-format
+msgid "unknown value for config '%s': %s"
+msgstr "непозната стойност за настройката „%s“: „%s“"
+
+#: transport.c:851
+#, c-format
+msgid "transport '%s' not allowed"
+msgstr "преносът по „%s“ не е позволен"
+
+#: transport.c:903
+msgid "git-over-rsync is no longer supported"
+msgstr "командата „git-over-rsync“ вече не се поддържа"
+
+#: transport.c:998
#, c-format
msgid ""
"The following submodule paths contain changes that can\n"
@@ -4691,7 +5786,7 @@ msgstr ""
"Следните пътища за подмодули съдържат промени,\n"
"които липсват от всички отдалечени хранилища:\n"
-#: transport.c:1000
+#: transport.c:1002
#, c-format
msgid ""
"\n"
@@ -4716,32 +5811,216 @@ msgstr ""
" git push\n"
"\n"
-#: transport.c:1008
+#: transport.c:1010
msgid "Aborting."
msgstr "Преустановяване на действието."
-#: transport-helper.c:1087
+#: transport.c:1148
+msgid "failed to push all needed submodules"
+msgstr "неуспешно изтласкване на всички необходими подмодули"
+
+#: transport.c:1270 transport-helper.c:643
+msgid "operation not supported by protocol"
+msgstr "опцията не се поддържа от протокола"
+
+#: transport.c:1352
+#, c-format
+msgid "invalid line while parsing alternate refs: %s"
+msgstr "неправилен ред при анализа на алтернативните указатели: „%s“"
+
+#: transport-helper.c:51 transport-helper.c:80
+msgid "full write to remote helper failed"
+msgstr "неуспешен пълен запис към насрещната помощна програма"
+
+#: transport-helper.c:132
+#, c-format
+msgid "unable to find remote helper for '%s'"
+msgstr "насрещната помощна програма за „%s“ не може да бъде открита"
+
+#: transport-helper.c:148 transport-helper.c:557
+msgid "can't dup helper output fd"
+msgstr ""
+"файловият дескриптор от насрещната помощна програма не може да се дублира с "
+"„dup“"
+
+#: transport-helper.c:199
+#, c-format
+msgid ""
+"unknown mandatory capability %s; this remote helper probably needs newer "
+"version of Git"
+msgstr ""
+"непозната задължителна способност „%s“. Насрещната помощна програма "
+"вероятно изисква нова версия на Git"
+
+#: transport-helper.c:205
+msgid "this remote helper should implement refspec capability"
+msgstr ""
+"насрещната помощна програма трябва да поддържа способност за изброяване на "
+"указатели"
+
+#: transport-helper.c:272 transport-helper.c:412
+#, c-format
+msgid "%s unexpectedly said: '%s'"
+msgstr "„%s“ неочаквано върна: „%s“"
+
+#: transport-helper.c:401
+#, c-format
+msgid "%s also locked %s"
+msgstr "„%s“ заключи и „%s“"
+
+#: transport-helper.c:479
+msgid "couldn't run fast-import"
+msgstr "неуспешно изпълнение на бързо внасяне"
+
+#: transport-helper.c:502
+msgid "error while running fast-import"
+msgstr "грешка при изпълнението на бързо внасяне"
+
+#: transport-helper.c:531 transport-helper.c:1091
+#, c-format
+msgid "could not read ref %s"
+msgstr "указателят „%s“ не може да се прочете"
+
+#: transport-helper.c:576
#, c-format
-msgid "Could not read ref %s"
-msgstr "Указателят „%s“ не може да се прочете."
+msgid "unknown response to connect: %s"
+msgstr "неочакван отговор при свързване: „%s“"
-#: tree-walk.c:31
+#: transport-helper.c:598
+msgid "setting remote service path not supported by protocol"
+msgstr "протоколът не поддържа задаването на път на отдалечената услуга"
+
+#: transport-helper.c:600
+msgid "invalid remote service path"
+msgstr "неправилен път на отдалечената услуга"
+
+#: transport-helper.c:646
+#, c-format
+msgid "can't connect to subservice %s"
+msgstr "неуспешно свързване към подуслугата „%s“"
+
+#: transport-helper.c:713
+#, c-format
+msgid "expected ok/error, helper said '%s'"
+msgstr ""
+"очаква се или успех, или грешка, но насрещната помощна програма върна „%s“"
+
+#: transport-helper.c:766
+#, c-format
+msgid "helper reported unexpected status of %s"
+msgstr "насрещната помощна програма завърши с неочакван изходен код: „%s“"
+
+#: transport-helper.c:827
+#, c-format
+msgid "helper %s does not support dry-run"
+msgstr "насрещната помощна програма „%s“ не поддържа проби „dry-run“"
+
+#: transport-helper.c:830
+#, c-format
+msgid "helper %s does not support --signed"
+msgstr "насрещната помощна програма „%s“ не поддържа опцията „--signed“"
+
+#: transport-helper.c:833
+#, c-format
+msgid "helper %s does not support --signed=if-asked"
+msgstr ""
+"насрещната помощна програма „%s“ не поддържа опцията „--signed=if-asked“"
+
+#: transport-helper.c:840
+#, c-format
+msgid "helper %s does not support 'push-option'"
+msgstr "насрещната помощна програма „%s“ не поддържа опции за изтласкване"
+
+#: transport-helper.c:932
+msgid "remote-helper doesn't support push; refspec needed"
+msgstr ""
+"насрещната помощна програма не поддържа изтласкване. Необходимо е "
+"изброяване на указателите"
+
+#: transport-helper.c:937
+#, c-format
+msgid "helper %s does not support 'force'"
+msgstr ""
+"насрещната помощна програма не поддържа „%s“ поддържа опцията „--force“"
+
+#: transport-helper.c:984
+msgid "couldn't run fast-export"
+msgstr "не може да се извърши бързо изнасяне"
+
+#: transport-helper.c:989
+msgid "error while running fast-export"
+msgstr "грешка при изпълнението на командата за бързо изнасяне"
+
+#: transport-helper.c:1014
+#, c-format
+msgid ""
+"No refs in common and none specified; doing nothing.\n"
+"Perhaps you should specify a branch such as 'master'.\n"
+msgstr ""
+"Няма общи указатели, не са указани никакви указатели — нищо няма да бъде\n"
+"направено. Пробвайте да укажете клон, напр. “master“.\n"
+
+#: transport-helper.c:1077
+#, c-format
+msgid "malformed response in ref list: %s"
+msgstr "неправилен отговор в списъка с указатели: „%s“"
+
+#: transport-helper.c:1230
+#, c-format
+msgid "read(%s) failed"
+msgstr "неуспешно четене на „%s“"
+
+#: transport-helper.c:1257
+#, c-format
+msgid "write(%s) failed"
+msgstr "неуспешен запис в „%s“"
+
+#: transport-helper.c:1306
+#, c-format
+msgid "%s thread failed"
+msgstr "неуспешно изпълнение на нишката „%s“"
+
+#: transport-helper.c:1310
+#, c-format
+msgid "%s thread failed to join: %s"
+msgstr "завършването на нишката „%s“ не може да се изчака: „%s“"
+
+#: transport-helper.c:1329 transport-helper.c:1333
+#, c-format
+msgid "can't start thread for copying data: %s"
+msgstr "неуспешно стартиране на нишка за копиране на данните: „%s“"
+
+#: transport-helper.c:1370
+#, c-format
+msgid "%s process failed to wait"
+msgstr "процесът на „%s“ не успя да изчака чрез „waitpid“"
+
+#: transport-helper.c:1374
+#, c-format
+msgid "%s process failed"
+msgstr "неуспешно изпълнение на „%s“"
+
+#: transport-helper.c:1392 transport-helper.c:1401
+msgid "can't start thread for copying data"
+msgstr "неуспешно стартиране на нишка за копиране на данните"
+
+#: tree-walk.c:33
msgid "too-short tree object"
msgstr "прекалено кратък обект-дърво"
-#: tree-walk.c:37
+#: tree-walk.c:39
msgid "malformed mode in tree entry"
msgstr "неправилни права за достъп в запис в дърво"
-#: tree-walk.c:41
+#: tree-walk.c:43
msgid "empty filename in tree entry"
msgstr "празно име на файл в запис в дърво"
-#: tree-walk.c:113
+#: tree-walk.c:115
msgid "too-short tree file"
msgstr "прекалено кратък файл-дърво"
-#: unpack-trees.c:111
+#: unpack-trees.c:112
#, c-format
msgid ""
"Your local changes to the following files would be overwritten by checkout:\n"
@@ -4750,7 +6029,7 @@ msgstr ""
"Изтеглянето ще презапише локалните промени на тези файлове:\n"
"%%sПодайте или скатайте промените, за да преминете към нов клон."
-#: unpack-trees.c:113
+#: unpack-trees.c:114
#, c-format
msgid ""
"Your local changes to the following files would be overwritten by checkout:\n"
@@ -4759,7 +6038,7 @@ msgstr ""
"Изтеглянето ще презапише локалните промени на тези файлове:\n"
"%%s"
-#: unpack-trees.c:116
+#: unpack-trees.c:117
#, c-format
msgid ""
"Your local changes to the following files would be overwritten by merge:\n"
@@ -4768,7 +6047,7 @@ msgstr ""
"Сливането ще презапише локалните промени на тези файлове:\n"
"%%sПодайте или скатайте промените, за да слеете."
-#: unpack-trees.c:118
+#: unpack-trees.c:119
#, c-format
msgid ""
"Your local changes to the following files would be overwritten by merge:\n"
@@ -4777,7 +6056,7 @@ msgstr ""
"Сливането ще презапише локалните промени на тези файлове:\n"
"%%s"
-#: unpack-trees.c:121
+#: unpack-trees.c:122
#, c-format
msgid ""
"Your local changes to the following files would be overwritten by %s:\n"
@@ -4786,7 +6065,7 @@ msgstr ""
"„%s“ ще презапише локалните промени на тези файлове:\n"
"%%sПодайте или скатайте промените, за да извършите „%s“."
-#: unpack-trees.c:123
+#: unpack-trees.c:124
#, c-format
msgid ""
"Your local changes to the following files would be overwritten by %s:\n"
@@ -4795,7 +6074,7 @@ msgstr ""
"„%s“ ще презапише локалните промени на тези файлове:\n"
"%%s"
-#: unpack-trees.c:128
+#: unpack-trees.c:129
#, c-format
msgid ""
"Updating the following directories would lose untracked files in them:\n"
@@ -4804,7 +6083,7 @@ msgstr ""
"Обновяването на следните директории ще изтрие неследените файлове в тях:\n"
"%s"
-#: unpack-trees.c:132
+#: unpack-trees.c:133
#, c-format
msgid ""
"The following untracked working tree files would be removed by checkout:\n"
@@ -4813,7 +6092,7 @@ msgstr ""
"Изтеглянето ще изтрие тези неследени файлове в работното дърво:\n"
"%%sПреместете ги или ги изтрийте, за да преминете на друг клон."
-#: unpack-trees.c:134
+#: unpack-trees.c:135
#, c-format
msgid ""
"The following untracked working tree files would be removed by checkout:\n"
@@ -4822,7 +6101,7 @@ msgstr ""
"Изтеглянето ще изтрие тези неследени файлове в работното дърво:\n"
"%%s"
-#: unpack-trees.c:137
+#: unpack-trees.c:138
#, c-format
msgid ""
"The following untracked working tree files would be removed by merge:\n"
@@ -4831,7 +6110,7 @@ msgstr ""
"Сливането ще изтрие тези неследени файлове в работното дърво:\n"
"%%sПреместете ги или ги изтрийте, за да слеете."
-#: unpack-trees.c:139
+#: unpack-trees.c:140
#, c-format
msgid ""
"The following untracked working tree files would be removed by merge:\n"
@@ -4840,7 +6119,7 @@ msgstr ""
"Сливането ще изтрие тези неследени файлове в работното дърво:\n"
"%%s"
-#: unpack-trees.c:142
+#: unpack-trees.c:143
#, c-format
msgid ""
"The following untracked working tree files would be removed by %s:\n"
@@ -4849,7 +6128,7 @@ msgstr ""
"„%s“ ще изтрие тези неследени файлове в работното дърво:\n"
"%%sПреместете ги или ги изтрийте, за да извършите „%s“."
-#: unpack-trees.c:144
+#: unpack-trees.c:145
#, c-format
msgid ""
"The following untracked working tree files would be removed by %s:\n"
@@ -4858,7 +6137,7 @@ msgstr ""
"„%s“ ще изтрие тези неследени файлове в работното дърво:\n"
"%%s"
-#: unpack-trees.c:150
+#: unpack-trees.c:151
#, c-format
msgid ""
"The following untracked working tree files would be overwritten by "
@@ -4868,7 +6147,7 @@ msgstr ""
"Изтеглянето ще презапише тези неследени файлове в работното дърво:\n"
"%%sПреместете ги или ги изтрийте, за да смените клон."
-#: unpack-trees.c:152
+#: unpack-trees.c:153
#, c-format
msgid ""
"The following untracked working tree files would be overwritten by "
@@ -4878,7 +6157,7 @@ msgstr ""
"Изтеглянето ще презапише тези неследени файлове в работното дърво:\n"
"%%s"
-#: unpack-trees.c:155
+#: unpack-trees.c:156
#, c-format
msgid ""
"The following untracked working tree files would be overwritten by merge:\n"
@@ -4887,7 +6166,7 @@ msgstr ""
"Сливането ще презапише тези неследени файлове в работното дърво:\n"
"%%sПреместете ги или ги изтрийте, за да слеете."
-#: unpack-trees.c:157
+#: unpack-trees.c:158
#, c-format
msgid ""
"The following untracked working tree files would be overwritten by merge:\n"
@@ -4896,7 +6175,7 @@ msgstr ""
"Сливането ще презапише тези неследени файлове в работното дърво:\n"
"%%s"
-#: unpack-trees.c:160
+#: unpack-trees.c:161
#, c-format
msgid ""
"The following untracked working tree files would be overwritten by %s:\n"
@@ -4905,7 +6184,7 @@ msgstr ""
"„%s“ ще презапише тези неследени файлове в работното дърво:\n"
"%%sПреместете ги или ги изтрийте, за да извършите „%s“."
-#: unpack-trees.c:162
+#: unpack-trees.c:163
#, c-format
msgid ""
"The following untracked working tree files would be overwritten by %s:\n"
@@ -4914,12 +6193,12 @@ msgstr ""
"„%s“ ще презапише тези неследени файлове в работното дърво:\n"
"%%s"
-#: unpack-trees.c:170
+#: unpack-trees.c:171
#, c-format
msgid "Entry '%s' overlaps with '%s'. Cannot bind."
msgstr "Записът за „%s“ съвпада с този за „%s“. Не може да се присвои."
-#: unpack-trees.c:173
+#: unpack-trees.c:174
#, c-format
msgid ""
"Cannot update sparse checkout: the following entries are not up to date:\n"
@@ -4929,7 +6208,7 @@ msgstr ""
"актуални:\n"
"%s"
-#: unpack-trees.c:175
+#: unpack-trees.c:176
#, c-format
msgid ""
"The following working tree files would be overwritten by sparse checkout "
@@ -4940,7 +6219,7 @@ msgstr ""
"дърво:\n"
"%s"
-#: unpack-trees.c:177
+#: unpack-trees.c:178
#, c-format
msgid ""
"The following working tree files would be removed by sparse checkout "
@@ -4951,7 +6230,7 @@ msgstr ""
"дърво:\n"
"%s"
-#: unpack-trees.c:179
+#: unpack-trees.c:180
#, c-format
msgid ""
"Cannot update submodule:\n"
@@ -4960,12 +6239,12 @@ msgstr ""
"Подмодулът не може да бъде обновен:\n"
"„%s“"
-#: unpack-trees.c:262
+#: unpack-trees.c:254
#, c-format
msgid "Aborting\n"
msgstr "Преустановяване на действието\n"
-#: unpack-trees.c:344
+#: unpack-trees.c:336
msgid "Checking out files"
msgstr "Изтегляне на файлове"
@@ -5034,8 +6313,8 @@ msgstr "„%s“ не сочи към обратно към „%s“"
msgid "could not open '%s' for reading and writing"
msgstr "„%s“ не може да бъде отворен и за четене, и за запис"
-#: wrapper.c:227 wrapper.c:397 builtin/am.c:320 builtin/am.c:770
-#: builtin/am.c:862 builtin/merge.c:1043
+#: wrapper.c:227 wrapper.c:397 builtin/am.c:321 builtin/am.c:771
+#: builtin/am.c:863 builtin/merge.c:1078
#, c-format
msgid "could not open '%s' for reading"
msgstr "файлът не може да бъде прочетен: „%s“"
@@ -5541,21 +6820,21 @@ msgid "ahead "
msgstr "напред с "
#. TRANSLATORS: the action is e.g. "pull with rebase"
-#: wt-status.c:2366
+#: wt-status.c:2376
#, c-format
msgid "cannot %s: You have unstaged changes."
msgstr "не може да извършите „%s“, защото има промени, които не са в индекса."
-#: wt-status.c:2372
+#: wt-status.c:2382
msgid "additionally, your index contains uncommitted changes."
msgstr "освен това в индекса има неподадени промени."
-#: wt-status.c:2374
+#: wt-status.c:2384
#, c-format
msgid "cannot %s: Your index contains uncommitted changes."
msgstr "не може да извършите „%s“, защото в индекса има неподадени промени."
-#: compat/precompose_utf8.c:58 builtin/clone.c:442
+#: compat/precompose_utf8.c:58 builtin/clone.c:443
#, c-format
msgid "failed to unlink '%s'"
msgstr "неуспешно изтриване на „%s“"
@@ -5569,7 +6848,7 @@ msgstr "git add [ОПЦИЯ…] [--] ПЪТ…"
msgid "unexpected diff status %c"
msgstr "неочакван изходен код при генериране на разлика: %c"
-#: builtin/add.c:88 builtin/commit.c:266
+#: builtin/add.c:88 builtin/commit.c:279
msgid "updating files failed"
msgstr "неуспешно обновяване на файловете"
@@ -5582,7 +6861,7 @@ msgstr "изтриване на „%s“\n"
msgid "Unstaged changes after refreshing the index:"
msgstr "Промени, които и след обновяването на индекса не са добавени към него:"
-#: builtin/add.c:233 builtin/rev-parse.c:892
+#: builtin/add.c:233 builtin/rev-parse.c:893
msgid "Could not read the index"
msgstr "Индексът не може да бъде прочетен"
@@ -5618,9 +6897,9 @@ msgid "The following paths are ignored by one of your .gitignore files:\n"
msgstr ""
"Следните пътища ще бъдат игнорирани според някой от файловете „.gitignore“:\n"
-#: builtin/add.c:289 builtin/clean.c:911 builtin/fetch.c:145 builtin/mv.c:123
-#: builtin/prune-packed.c:55 builtin/pull.c:212 builtin/push.c:557
-#: builtin/remote.c:1342 builtin/rm.c:240 builtin/send-pack.c:165
+#: builtin/add.c:289 builtin/clean.c:906 builtin/fetch.c:134 builtin/mv.c:123
+#: builtin/prune-packed.c:56 builtin/pull.c:212 builtin/push.c:557
+#: builtin/remote.c:1344 builtin/rm.c:240 builtin/send-pack.c:165
msgid "dry run"
msgstr "пробно изпълнение"
@@ -5628,7 +6907,7 @@ msgstr "пробно изпълнение"
msgid "interactive picking"
msgstr "интерактивно отбиране на промени"
-#: builtin/add.c:293 builtin/checkout.c:1135 builtin/reset.c:302
+#: builtin/add.c:293 builtin/checkout.c:1144 builtin/reset.c:302
msgid "select hunks interactively"
msgstr "интерактивен избор на парчета код"
@@ -5677,19 +6956,15 @@ msgstr ""
"проверка, че при пробно изпълнение всички файлове, дори и изтритите, се "
"игнорират"
-#: builtin/add.c:307 builtin/update-index.c:974
-msgid "(+/-)x"
-msgstr "(+/-)x"
-
-#: builtin/add.c:307 builtin/update-index.c:975
+#: builtin/add.c:308 builtin/update-index.c:973
msgid "override the executable bit of the listed files"
msgstr "изрично задаване на стойността на флага дали файлът е изпълним"
-#: builtin/add.c:309
+#: builtin/add.c:310
msgid "warn when adding an embedded repository"
msgstr "предупреждаване при добавяне на вградено хранилище"
-#: builtin/add.c:324
+#: builtin/add.c:325
#, c-format
msgid ""
"You've added another git repository inside your current repository.\n"
@@ -5720,152 +6995,152 @@ msgstr ""
"\n"
"За повече информация погледнете „git help submodule“."
-#: builtin/add.c:352
+#: builtin/add.c:353
#, c-format
msgid "adding embedded git repository: %s"
msgstr "добавяне на вградено хранилище: %s"
-#: builtin/add.c:370
+#: builtin/add.c:371
#, c-format
msgid "Use -f if you really want to add them.\n"
msgstr "Използвайте опцията „-f“, за да ги добавите наистина.\n"
-#: builtin/add.c:378
+#: builtin/add.c:379
msgid "adding files failed"
msgstr "неуспешно добавяне на файлове"
-#: builtin/add.c:416
+#: builtin/add.c:417
msgid "-A and -u are mutually incompatible"
msgstr "опциите „-A“ и „-u“ са несъвместими"
-#: builtin/add.c:423
+#: builtin/add.c:424
msgid "Option --ignore-missing can only be used together with --dry-run"
msgstr "Опцията „--ignore-missing“ е съвместима само с „--dry-run“"
-#: builtin/add.c:427
+#: builtin/add.c:428
#, c-format
msgid "--chmod param '%s' must be either -x or +x"
msgstr "параметърът към „--chmod“ — „%s“ може да е или „-x“, или „+x“"
-#: builtin/add.c:442
+#: builtin/add.c:443
#, c-format
msgid "Nothing specified, nothing added.\n"
msgstr "Нищо не е зададено и нищо не е добавено.\n"
-#: builtin/add.c:443
+#: builtin/add.c:444
#, c-format
msgid "Maybe you wanted to say 'git add .'?\n"
msgstr "Вероятно искахте да използвате „git add .“?\n"
-#: builtin/add.c:448 builtin/check-ignore.c:177 builtin/checkout.c:280
-#: builtin/checkout.c:483 builtin/clean.c:958 builtin/commit.c:325
-#: builtin/diff-tree.c:114 builtin/mv.c:144 builtin/reset.c:241
-#: builtin/rm.c:270 builtin/submodule--helper.c:328
+#: builtin/add.c:449 builtin/check-ignore.c:177 builtin/checkout.c:282
+#: builtin/checkout.c:485 builtin/clean.c:953 builtin/commit.c:338
+#: builtin/diff-tree.c:115 builtin/grep.c:492 builtin/mv.c:144
+#: builtin/reset.c:241 builtin/rm.c:270 builtin/submodule--helper.c:329
msgid "index file corrupt"
msgstr "файлът с индекса е повреден"
-#: builtin/am.c:414
+#: builtin/am.c:415
msgid "could not parse author script"
msgstr "скриптът за автор не може да се анализира"
-#: builtin/am.c:498
+#: builtin/am.c:499
#, c-format
msgid "'%s' was deleted by the applypatch-msg hook"
msgstr "„%s“ бе изтрит от куката „applypatch-msg“"
-#: builtin/am.c:539
+#: builtin/am.c:540
#, c-format
msgid "Malformed input line: '%s'."
msgstr "Даденият входен ред е с неправилен формат: „%s“."
-#: builtin/am.c:576
+#: builtin/am.c:577
#, c-format
msgid "Failed to copy notes from '%s' to '%s'"
msgstr "Бележката не може да се копира от „%s“ към „%s“"
-#: builtin/am.c:602
+#: builtin/am.c:603
msgid "fseek failed"
msgstr "неуспешно изпълнение на „fseek“"
-#: builtin/am.c:790
+#: builtin/am.c:791
#, c-format
msgid "could not parse patch '%s'"
msgstr "кръпката „%s“ не може да се анализира"
-#: builtin/am.c:855
+#: builtin/am.c:856
msgid "Only one StGIT patch series can be applied at once"
msgstr ""
"Само една поредица от кръпки от „StGIT“ може да бъде прилагана в даден момент"
-#: builtin/am.c:903
+#: builtin/am.c:904
msgid "invalid timestamp"
msgstr "неправилна стойност за време"
-#: builtin/am.c:908 builtin/am.c:920
+#: builtin/am.c:909 builtin/am.c:921
msgid "invalid Date line"
msgstr "неправилен ред за дата „Date“"
-#: builtin/am.c:915
+#: builtin/am.c:916
msgid "invalid timezone offset"
msgstr "неправилно отместване на часовия пояс"
-#: builtin/am.c:1008
+#: builtin/am.c:1009
msgid "Patch format detection failed."
msgstr "Форматът на кръпката не може да бъде определен."
-#: builtin/am.c:1013 builtin/clone.c:407
+#: builtin/am.c:1014 builtin/clone.c:408
#, c-format
msgid "failed to create directory '%s'"
msgstr "директорията „%s“ не може да бъде създадена"
-#: builtin/am.c:1018
+#: builtin/am.c:1019
msgid "Failed to split patches."
msgstr "Кръпките не могат да бъдат разделени."
-#: builtin/am.c:1148 builtin/commit.c:351
+#: builtin/am.c:1149 builtin/commit.c:364
msgid "unable to write index file"
msgstr "индексът не може да бъде записан"
-#: builtin/am.c:1162
+#: builtin/am.c:1163
#, c-format
msgid "When you have resolved this problem, run \"%s --continue\"."
msgstr "След коригирането на този проблем изпълнете „%s --continue“."
-#: builtin/am.c:1163
+#: builtin/am.c:1164
#, c-format
msgid "If you prefer to skip this patch, run \"%s --skip\" instead."
msgstr "Ако предпочитате да прескочите тази кръпка, изпълнете „%s --skip“."
-#: builtin/am.c:1164
+#: builtin/am.c:1165
#, c-format
msgid "To restore the original branch and stop patching, run \"%s --abort\"."
msgstr "За да се върнете към първоначалното състояние, изпълнете „%s --abort“."
-#: builtin/am.c:1271
+#: builtin/am.c:1272
msgid "Patch is empty."
msgstr "Кръпката е празна."
-#: builtin/am.c:1337
+#: builtin/am.c:1338
#, c-format
msgid "invalid ident line: %.*s"
msgstr "грешен ред с идентичност: %.*s"
-#: builtin/am.c:1359
+#: builtin/am.c:1360
#, c-format
msgid "unable to parse commit %s"
msgstr "подаването не може да бъде анализирано: %s"
-#: builtin/am.c:1554
+#: builtin/am.c:1556
msgid "Repository lacks necessary blobs to fall back on 3-way merge."
msgstr ""
"В хранилището липсват необходимите обекти-BLOB, за да се премине към тройно "
"сливане."
-#: builtin/am.c:1556
+#: builtin/am.c:1558
msgid "Using index info to reconstruct a base tree..."
msgstr "Базовото дърво се реконструира от информацията в индекса…"
-#: builtin/am.c:1575
+#: builtin/am.c:1577
msgid ""
"Did you hand edit your patch?\n"
"It does not apply to blobs recorded in its index."
@@ -5873,30 +7148,30 @@ msgstr ""
"Кръпката не може да се приложи към обектите-BLOB в индекса.\n"
"Да не би да сте я редактирали на ръка?"
-#: builtin/am.c:1581
+#: builtin/am.c:1583
msgid "Falling back to patching base and 3-way merge..."
msgstr "Преминаване към прилагане на кръпка към базата и тройно сливане…"
-#: builtin/am.c:1606
+#: builtin/am.c:1608
msgid "Failed to merge in the changes."
msgstr "Неуспешно сливане на промените."
-#: builtin/am.c:1637
+#: builtin/am.c:1640
msgid "applying to an empty history"
msgstr "прилагане върху празна история"
-#: builtin/am.c:1683 builtin/am.c:1687
+#: builtin/am.c:1686 builtin/am.c:1690
#, c-format
msgid "cannot resume: %s does not exist."
msgstr "не може да се продължи — „%s“ не съществува."
-#: builtin/am.c:1703
+#: builtin/am.c:1706
msgid "cannot be interactive without stdin connected to a terminal."
msgstr ""
"За интерактивно изпълнение е необходимо стандартният\n"
"вход да е свързан с терминал, а в момента не е."
-#: builtin/am.c:1708
+#: builtin/am.c:1711
msgid "Commit Body is:"
msgstr "Тялото на кръпката за прилагане е:"
@@ -5904,28 +7179,28 @@ msgstr "Тялото на кръпката за прилагане е:"
#. in your translation. The program will only accept English
#. input at this point.
#.
-#: builtin/am.c:1718
+#: builtin/am.c:1721
msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all: "
msgstr ""
"Прилагане? „y“ — да/„n“ — не/„e“ — редактиране/„v“ — преглед/„a“ — приемане "
"на всичко:"
-#: builtin/am.c:1768
+#: builtin/am.c:1771
#, c-format
msgid "Dirty index: cannot apply patches (dirty: %s)"
msgstr ""
"Индексът не е чист: кръпките не могат да бъдат приложени (замърсени са: %s)"
-#: builtin/am.c:1808 builtin/am.c:1879
+#: builtin/am.c:1811 builtin/am.c:1879
#, c-format
msgid "Applying: %.*s"
msgstr "Прилагане: %.*s"
-#: builtin/am.c:1824
+#: builtin/am.c:1828
msgid "No changes -- Patch already applied."
msgstr "Без промени — кръпката вече е приложена."
-#: builtin/am.c:1832
+#: builtin/am.c:1834
#, c-format
msgid "Patch failed at %s %.*s"
msgstr "Неуспешно прилагане на кръпка при %s %.*s“"
@@ -6003,8 +7278,8 @@ msgstr "изоставена опция, съществува по истори
msgid "allow fall back on 3way merging if needed"
msgstr "да се преминава към тройно сливане при нужда."
-#: builtin/am.c:2222 builtin/init-db.c:484 builtin/prune-packed.c:57
-#: builtin/repack.c:192
+#: builtin/am.c:2222 builtin/init-db.c:485 builtin/prune-packed.c:58
+#: builtin/repack.c:299
msgid "be quiet"
msgstr "без извеждане на информация"
@@ -6049,17 +7324,17 @@ msgstr "пропускане на всичко преди реда за отря
msgid "pass it through git-apply"
msgstr "прекарване през „git-apply“"
-#: builtin/am.c:2260 builtin/commit.c:1332 builtin/fmt-merge-msg.c:665
-#: builtin/fmt-merge-msg.c:668 builtin/grep.c:853 builtin/merge.c:208
-#: builtin/pull.c:150 builtin/pull.c:208 builtin/repack.c:201
-#: builtin/repack.c:205 builtin/repack.c:207 builtin/show-branch.c:631
-#: builtin/show-ref.c:169 builtin/tag.c:383 parse-options.h:144
+#: builtin/am.c:2260 builtin/commit.c:1332 builtin/fmt-merge-msg.c:670
+#: builtin/fmt-merge-msg.c:673 builtin/grep.c:857 builtin/merge.c:237
+#: builtin/pull.c:150 builtin/pull.c:208 builtin/repack.c:308
+#: builtin/repack.c:312 builtin/repack.c:314 builtin/show-branch.c:650
+#: builtin/show-ref.c:170 builtin/tag.c:384 parse-options.h:144
#: parse-options.h:146 parse-options.h:258
msgid "n"
msgstr "БРОЙ"
-#: builtin/am.c:2266 builtin/branch.c:632 builtin/for-each-ref.c:38
-#: builtin/replace.c:543 builtin/tag.c:419 builtin/verify-tag.c:39
+#: builtin/am.c:2266 builtin/branch.c:651 builtin/for-each-ref.c:38
+#: builtin/replace.c:543 builtin/tag.c:420 builtin/verify-tag.c:39
msgid "format"
msgstr "ФОРМАТ"
@@ -6106,8 +7381,8 @@ msgstr "дата за подаване различна от първонача
msgid "use current timestamp for author date"
msgstr "използване на текущото време като това за автор"
-#: builtin/am.c:2298 builtin/commit.c:1468 builtin/merge.c:239
-#: builtin/pull.c:183 builtin/revert.c:112 builtin/tag.c:399
+#: builtin/am.c:2298 builtin/commit.c:1468 builtin/merge.c:271
+#: builtin/pull.c:183 builtin/revert.c:113 builtin/tag.c:400
msgid "key-id"
msgstr "ИДЕНТИФИКАТОР_НА_КЛЮЧ"
@@ -6250,160 +7525,160 @@ msgstr "опцията „--write-terms“ изисква точно два ар
msgid "--bisect-clean-state requires no arguments"
msgstr "опцията „--bisect-clean-state“ не приема аргументи"
-#: builtin/blame.c:29
+#: builtin/blame.c:31
msgid "git blame [<options>] [<rev-opts>] [<rev>] [--] <file>"
msgstr "git blame [ОПЦИЯ…] [ОПЦИЯ_ЗА_ВЕРСИЯТА…] [ВЕРСИЯ] [--] ФАЙЛ"
-#: builtin/blame.c:34
+#: builtin/blame.c:36
msgid "<rev-opts> are documented in git-rev-list(1)"
msgstr "ОПЦИИте_ЗА_ВЕРСИЯТА са документирани в ръководството git-rev-list(1)"
-#: builtin/blame.c:404
+#: builtin/blame.c:406
#, c-format
msgid "expecting a color: %s"
msgstr "трябва да е цвят: %s"
-#: builtin/blame.c:411
+#: builtin/blame.c:413
msgid "must end with a color"
msgstr "трябва да завършва с цвят"
-#: builtin/blame.c:697
+#: builtin/blame.c:700
#, c-format
msgid "invalid color '%s' in color.blame.repeatedLines"
msgstr "неправилен цвят „%s“ в „color.blame.repeatedLines“"
-#: builtin/blame.c:715
+#: builtin/blame.c:718
msgid "invalid value for blame.coloring"
msgstr "неправилна стойност за „blame.coloring“"
-#: builtin/blame.c:786
+#: builtin/blame.c:789
msgid "Show blame entries as we find them, incrementally"
msgstr "Извеждане на анотациите с намирането им, последователно"
-#: builtin/blame.c:787
+#: builtin/blame.c:790
msgid "Show blank SHA-1 for boundary commits (Default: off)"
msgstr ""
"Извеждане на празни суми по SHA1 за граничните подавания (стандартно опцията "
"е изключена)"
-#: builtin/blame.c:788
+#: builtin/blame.c:791
msgid "Do not treat root commits as boundaries (Default: off)"
msgstr ""
"Началните подавания да не се считат за гранични (стандартно опцията е "
"изключена)"
-#: builtin/blame.c:789
+#: builtin/blame.c:792
msgid "Show work cost statistics"
msgstr "Извеждане на статистика за извършените действия"
-#: builtin/blame.c:790
+#: builtin/blame.c:793
msgid "Force progress reporting"
msgstr "Принудително извеждане на напредъка"
-#: builtin/blame.c:791
+#: builtin/blame.c:794
msgid "Show output score for blame entries"
msgstr "Извеждане на допълнителна информация за определянето на анотациите"
-#: builtin/blame.c:792
+#: builtin/blame.c:795
msgid "Show original filename (Default: auto)"
msgstr ""
"Извеждане на първоначалното име на файл (стандартно това е автоматично)"
-#: builtin/blame.c:793
+#: builtin/blame.c:796
msgid "Show original linenumber (Default: off)"
msgstr ""
"Извеждане на първоначалният номер на ред (стандартно опцията е изключена)"
-#: builtin/blame.c:794
+#: builtin/blame.c:797
msgid "Show in a format designed for machine consumption"
msgstr "Извеждане във формат за по-нататъшна обработка"
-#: builtin/blame.c:795
+#: builtin/blame.c:798
msgid "Show porcelain format with per-line commit information"
msgstr ""
"Извеждане във формат за команди от потребителско ниво с информация на всеки "
"ред"
-#: builtin/blame.c:796
+#: builtin/blame.c:799
msgid "Use the same output mode as git-annotate (Default: off)"
msgstr ""
"Използване на същия формат като „git-annotate“ (стандартно опцията е "
"изключена)"
-#: builtin/blame.c:797
+#: builtin/blame.c:800
msgid "Show raw timestamp (Default: off)"
msgstr "Извеждане на неформатирани времена (стандартно опцията е изключена)"
-#: builtin/blame.c:798
+#: builtin/blame.c:801
msgid "Show long commit SHA1 (Default: off)"
msgstr "Извеждане на пълните суми по SHA1 (стандартно опцията е изключена)"
-#: builtin/blame.c:799
+#: builtin/blame.c:802
msgid "Suppress author name and timestamp (Default: off)"
msgstr "Без име на автор и време на промяна (стандартно опцията е изключена)"
-#: builtin/blame.c:800
+#: builtin/blame.c:803
msgid "Show author email instead of name (Default: off)"
msgstr ""
"Извеждане на е-пощата на автора, а не името му (стандартно опцията е "
"изключена)"
-#: builtin/blame.c:801
+#: builtin/blame.c:804
msgid "Ignore whitespace differences"
msgstr "Без разлики в знаците за интервали"
-#: builtin/blame.c:802
+#: builtin/blame.c:805
msgid "color redundant metadata from previous line differently"
msgstr ""
"оцветяване на повтарящите се метаданни от предишния ред в различен цвят"
-#: builtin/blame.c:803
+#: builtin/blame.c:806
msgid "color lines by age"
msgstr "оцветяване на редовете по възраст"
-#: builtin/blame.c:810
+#: builtin/blame.c:813
msgid "Use an experimental heuristic to improve diffs"
msgstr "Подобряване на разликите чрез експериментална евристика"
-#: builtin/blame.c:812
+#: builtin/blame.c:815
msgid "Spend extra cycles to find better match"
msgstr "Допълнителни изчисления за по-добри резултати"
-#: builtin/blame.c:813
+#: builtin/blame.c:816
msgid "Use revisions from <file> instead of calling git-rev-list"
msgstr "Изчитане на версиите от ФАЙЛ, а не чрез изпълнение на „git-rev-list“"
-#: builtin/blame.c:814
+#: builtin/blame.c:817
msgid "Use <file>'s contents as the final image"
msgstr "Използване на съдържанието на ФАЙЛа като крайно положение"
-#: builtin/blame.c:815 builtin/blame.c:816
+#: builtin/blame.c:818 builtin/blame.c:819
msgid "score"
msgstr "напасване на редовете"
-#: builtin/blame.c:815
+#: builtin/blame.c:818
msgid "Find line copies within and across files"
msgstr ""
"Търсене на копирани редове както в рамките на един файл, така и от един файл "
"към друг"
-#: builtin/blame.c:816
+#: builtin/blame.c:819
msgid "Find line movements within and across files"
msgstr ""
"Търсене на преместени редове както в рамките на един файл, така и от един "
"файл към друг"
-#: builtin/blame.c:817
+#: builtin/blame.c:820
msgid "n,m"
msgstr "n,m"
-#: builtin/blame.c:817
+#: builtin/blame.c:820
msgid "Process only line range n,m, counting from 1"
msgstr ""
"Информация само за редовете в диапазона от n до m включително. Броенето "
"започва от 1"
-#: builtin/blame.c:866
+#: builtin/blame.c:869
msgid "--progress can't be used with --incremental or porcelain formats"
msgstr ""
"опцията „--progress“ е несъвместима с „--incremental“ и форма̀та на командите "
@@ -6417,50 +7692,50 @@ msgstr ""
#. your language may need more or fewer display
#. columns.
#.
-#: builtin/blame.c:917
+#: builtin/blame.c:920
msgid "4 years, 11 months ago"
msgstr "преди 4 години и 11 месеца"
-#: builtin/blame.c:1003
+#: builtin/blame.c:1007
#, c-format
msgid "file %s has only %lu line"
msgid_plural "file %s has only %lu lines"
msgstr[0] "има само %2$lu ред във файла „%1$s“"
msgstr[1] "има само %2$lu реда във файла „%1$s“"
-#: builtin/blame.c:1049
+#: builtin/blame.c:1053
msgid "Blaming lines"
msgstr "Анотирани редове"
-#: builtin/branch.c:27
+#: builtin/branch.c:28
msgid "git branch [<options>] [-r | -a] [--merged | --no-merged]"
msgstr "git branch [ОПЦИЯ…] [-r | -a] [--merged | --no-merged]"
-#: builtin/branch.c:28
+#: builtin/branch.c:29
msgid "git branch [<options>] [-l] [-f] <branch-name> [<start-point>]"
msgstr "git branch [ОПЦИЯ…] [-l] [-f] ИМЕ_НА_КЛОН [НАЧАЛО]"
-#: builtin/branch.c:29
+#: builtin/branch.c:30
msgid "git branch [<options>] [-r] (-d | -D) <branch-name>..."
msgstr "git branch [ОПЦИЯ…] [-r] (-d | -D) ИМЕ_НА_КЛОН…"
-#: builtin/branch.c:30
+#: builtin/branch.c:31
msgid "git branch [<options>] (-m | -M) [<old-branch>] <new-branch>"
msgstr "git branch [ОПЦИЯ…] (-m | -M) [СТАР_КЛОН] НОВ_КЛОН"
-#: builtin/branch.c:31
+#: builtin/branch.c:32
msgid "git branch [<options>] (-c | -C) [<old-branch>] <new-branch>"
msgstr "git branch [ОПЦИЯ…] (-c | -C) [СТАР_КЛОН] НОВ_КЛОН"
-#: builtin/branch.c:32
+#: builtin/branch.c:33
msgid "git branch [<options>] [-r | -a] [--points-at]"
msgstr "git branch [ОПЦИЯ…] [-r | -a] [--points-at]"
-#: builtin/branch.c:33
+#: builtin/branch.c:34
msgid "git branch [<options>] [-r | -a] [--format]"
msgstr "git branch [ОПЦИЯ…] [-r | -a] [--format]"
-#: builtin/branch.c:146
+#: builtin/branch.c:151
#, c-format
msgid ""
"deleting branch '%s' that has been merged to\n"
@@ -6469,7 +7744,7 @@ msgstr ""
"изтриване на клона „%s“, който е слят към „%s“,\n"
" но още не е слят към върха „HEAD“."
-#: builtin/branch.c:150
+#: builtin/branch.c:155
#, c-format
msgid ""
"not deleting branch '%s' that is not yet merged to\n"
@@ -6478,12 +7753,12 @@ msgstr ""
"отказване на изтриване на клона „%s“, който не е слят към\n"
" „%s“, но е слят към върха „HEAD“."
-#: builtin/branch.c:164
+#: builtin/branch.c:169
#, c-format
msgid "Couldn't look up commit object for '%s'"
msgstr "Обектът-подаване за „%s“ не може да бъде открит"
-#: builtin/branch.c:168
+#: builtin/branch.c:173
#, c-format
msgid ""
"The branch '%s' is not fully merged.\n"
@@ -6492,113 +7767,113 @@ msgstr ""
"Клонът „%s“ не е слят напълно. Ако сте сигурни, че искате\n"
"да го изтриете, изпълнете „git branch -D %s“."
-#: builtin/branch.c:181
+#: builtin/branch.c:186
msgid "Update of config-file failed"
msgstr "Неуспешно обновяване на конфигурационния файл"
-#: builtin/branch.c:212
+#: builtin/branch.c:217
msgid "cannot use -a with -d"
msgstr "Опцията „-a“ е несъвместима с опцията „-d“"
-#: builtin/branch.c:218
+#: builtin/branch.c:223
msgid "Couldn't look up commit object for HEAD"
msgstr "Обектът-подаване, сочен от указателя „HEAD“, не може да бъде открит"
-#: builtin/branch.c:232
+#: builtin/branch.c:237
#, c-format
msgid "Cannot delete branch '%s' checked out at '%s'"
msgstr "Не можете да изтриете клона „%s“, който е изтеглен в пътя „%s“"
-#: builtin/branch.c:247
+#: builtin/branch.c:252
#, c-format
msgid "remote-tracking branch '%s' not found."
msgstr "следящият клон „%s“ не може да бъде открит."
-#: builtin/branch.c:248
+#: builtin/branch.c:253
#, c-format
msgid "branch '%s' not found."
msgstr "клонът „%s“ не може да бъде открит."
-#: builtin/branch.c:263
+#: builtin/branch.c:268
#, c-format
msgid "Error deleting remote-tracking branch '%s'"
msgstr "Грешка при изтриването на следящия клон „%s“"
-#: builtin/branch.c:264
+#: builtin/branch.c:269
#, c-format
msgid "Error deleting branch '%s'"
msgstr "Грешка при изтриването на клона „%s“"
-#: builtin/branch.c:271
+#: builtin/branch.c:276
#, c-format
msgid "Deleted remote-tracking branch %s (was %s).\n"
msgstr "Изтрит следящ клон „%s“ (той сочеше към „%s“).\n"
-#: builtin/branch.c:272
+#: builtin/branch.c:277
#, c-format
msgid "Deleted branch %s (was %s).\n"
msgstr "Изтрит клон „%s“ (той сочеше към „%s“).\n"
-#: builtin/branch.c:416 builtin/tag.c:58
+#: builtin/branch.c:421 builtin/tag.c:59
msgid "unable to parse format string"
msgstr "форматиращият низ не може да бъде анализиран: %s"
-#: builtin/branch.c:453
+#: builtin/branch.c:458
#, c-format
msgid "Branch %s is being rebased at %s"
msgstr "Клонът „%s“ се пребазира върху „%s“"
-#: builtin/branch.c:457
+#: builtin/branch.c:462
#, c-format
msgid "Branch %s is being bisected at %s"
msgstr "Търси се двоично в клона „%s“ при „%s“"
-#: builtin/branch.c:474
+#: builtin/branch.c:479
msgid "cannot copy the current branch while not on any."
msgstr "не можете да копирате текущия клон, защото сте извън който и да е клон"
-#: builtin/branch.c:476
+#: builtin/branch.c:481
msgid "cannot rename the current branch while not on any."
msgstr ""
"не можете да преименувате текущия клон, защото сте извън който и да е клон"
-#: builtin/branch.c:487
+#: builtin/branch.c:492
#, c-format
msgid "Invalid branch name: '%s'"
msgstr "Неправилно име на клон: „%s“"
-#: builtin/branch.c:514
+#: builtin/branch.c:519
msgid "Branch rename failed"
msgstr "Неуспешно преименуване на клон"
-#: builtin/branch.c:516
+#: builtin/branch.c:521
msgid "Branch copy failed"
msgstr "Неуспешно копиране на клон"
-#: builtin/branch.c:520
+#: builtin/branch.c:525
#, c-format
msgid "Created a copy of a misnamed branch '%s'"
msgstr "Клонът с неправилно име „%s“ е копиран"
-#: builtin/branch.c:523
+#: builtin/branch.c:528
#, c-format
msgid "Renamed a misnamed branch '%s' away"
msgstr "Клонът с неправилно име „%s“ е преименуван"
-#: builtin/branch.c:529
+#: builtin/branch.c:534
#, c-format
msgid "Branch renamed to %s, but HEAD is not updated!"
msgstr "Клонът е преименуван на „%s“, но указателят „HEAD“ не е обновен"
-#: builtin/branch.c:538
+#: builtin/branch.c:543
msgid "Branch is renamed, but update of config-file failed"
msgstr "Клонът е преименуван, но конфигурационният файл не е обновен"
-#: builtin/branch.c:540
+#: builtin/branch.c:545
msgid "Branch is copied, but update of config-file failed"
msgstr "Клонът е копиран, но конфигурационният файл не е обновен"
-#: builtin/branch.c:556
+#: builtin/branch.c:561
#, c-format
msgid ""
"Please edit the description for the branch\n"
@@ -6609,189 +7884,193 @@ msgstr ""
" %s\n"
"Редовете, които започват с „%c“, ще бъдат пропуснати.\n"
-#: builtin/branch.c:589
+#: builtin/branch.c:602
msgid "Generic options"
msgstr "Общи настройки"
-#: builtin/branch.c:591
+#: builtin/branch.c:604
msgid "show hash and subject, give twice for upstream branch"
msgstr ""
"извеждане на хеша и темата. Повтарянето на опцията прибавя отдалечените "
"клони"
-#: builtin/branch.c:592
+#: builtin/branch.c:605
msgid "suppress informational messages"
msgstr "без информационни съобщения"
-#: builtin/branch.c:593
+#: builtin/branch.c:606
msgid "set up tracking mode (see git-pull(1))"
msgstr "задаване на режима на следене (виж git-pull(1))"
-#: builtin/branch.c:595
+#: builtin/branch.c:608
msgid "do not use"
msgstr "да не се ползва"
-#: builtin/branch.c:597
+#: builtin/branch.c:610
msgid "upstream"
msgstr "клон-източник"
-#: builtin/branch.c:597
+#: builtin/branch.c:610
msgid "change the upstream info"
msgstr "смяна на клона-източник"
-#: builtin/branch.c:598
+#: builtin/branch.c:611
msgid "Unset the upstream info"
msgstr "без клон-източник"
-#: builtin/branch.c:599
+#: builtin/branch.c:612
msgid "use colored output"
msgstr "цветен изход"
-#: builtin/branch.c:600
+#: builtin/branch.c:613
msgid "act on remote-tracking branches"
msgstr "действие върху следящите клони"
-#: builtin/branch.c:602 builtin/branch.c:604
+#: builtin/branch.c:615 builtin/branch.c:617
msgid "print only branches that contain the commit"
msgstr "извеждане само на клоните, които съдържат това ПОДАВАНЕ"
-#: builtin/branch.c:603 builtin/branch.c:605
+#: builtin/branch.c:616 builtin/branch.c:618
msgid "print only branches that don't contain the commit"
msgstr "извеждане само на клоните, които не съдържат това ПОДАВАНЕ"
-#: builtin/branch.c:608
+#: builtin/branch.c:621
msgid "Specific git-branch actions:"
msgstr "Специални действия на „git-branch“:"
-#: builtin/branch.c:609
+#: builtin/branch.c:622
msgid "list both remote-tracking and local branches"
msgstr "извеждане както на следящите, така и на локалните клони"
-#: builtin/branch.c:611
+#: builtin/branch.c:624
msgid "delete fully merged branch"
msgstr "изтриване на клони, които са напълно слети"
-#: builtin/branch.c:612
+#: builtin/branch.c:625
msgid "delete branch (even if not merged)"
msgstr "изтриване и на клони, които не са напълно слети"
-#: builtin/branch.c:613
+#: builtin/branch.c:626
msgid "move/rename a branch and its reflog"
msgstr ""
"преместване/преименуване на клон и принадлежащият му журнал на указателите"
-#: builtin/branch.c:614
+#: builtin/branch.c:627
msgid "move/rename a branch, even if target exists"
msgstr "преместване/преименуване на клон, дори ако има вече клон с такова име"
-#: builtin/branch.c:615
+#: builtin/branch.c:628
msgid "copy a branch and its reflog"
msgstr "копиране на клон и принадлежащия му журнал на указателите"
-#: builtin/branch.c:616
+#: builtin/branch.c:629
msgid "copy a branch, even if target exists"
msgstr "копиране на клон, дори ако има вече клон с такова име"
-#: builtin/branch.c:617
+#: builtin/branch.c:630
msgid "list branch names"
msgstr "извеждане на имената на клоните"
-#: builtin/branch.c:618
+#: builtin/branch.c:631
msgid "create the branch's reflog"
msgstr "създаване на журнала на указателите на клона"
-#: builtin/branch.c:620
+#: builtin/branch.c:634
+msgid "deprecated synonym for --create-reflog"
+msgstr "синоним на „--create-reflog“ (остаряло)"
+
+#: builtin/branch.c:639
msgid "edit the description for the branch"
msgstr "редактиране на описанието на клона"
-#: builtin/branch.c:621
+#: builtin/branch.c:640
msgid "force creation, move/rename, deletion"
msgstr "принудително създаване, преместване, преименуване, изтриване"
-#: builtin/branch.c:622
+#: builtin/branch.c:641
msgid "print only branches that are merged"
msgstr "извеждане само на слетите клони"
-#: builtin/branch.c:623
+#: builtin/branch.c:642
msgid "print only branches that are not merged"
msgstr "извеждане само на неслетите клони"
-#: builtin/branch.c:624
+#: builtin/branch.c:643
msgid "list branches in columns"
msgstr "извеждане по колони"
-#: builtin/branch.c:625 builtin/for-each-ref.c:40 builtin/ls-remote.c:70
-#: builtin/tag.c:412
+#: builtin/branch.c:644 builtin/for-each-ref.c:40 builtin/ls-remote.c:70
+#: builtin/tag.c:413
msgid "key"
msgstr "КЛЮЧ"
-#: builtin/branch.c:626 builtin/for-each-ref.c:41 builtin/ls-remote.c:71
-#: builtin/tag.c:413
+#: builtin/branch.c:645 builtin/for-each-ref.c:41 builtin/ls-remote.c:71
+#: builtin/tag.c:414
msgid "field name to sort on"
msgstr "име на полето, по което да е подредбата"
-#: builtin/branch.c:628 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:415
+#: builtin/branch.c:647 builtin/for-each-ref.c:43 builtin/notes.c:410
+#: builtin/notes.c:413 builtin/notes.c:573 builtin/notes.c:576
+#: builtin/tag.c:416
msgid "object"
msgstr "ОБЕКТ"
-#: builtin/branch.c:629
+#: builtin/branch.c:648
msgid "print only branches of the object"
msgstr "извеждане само на клоните на ОБЕКТА"
-#: builtin/branch.c:631 builtin/for-each-ref.c:49 builtin/tag.c:422
+#: builtin/branch.c:650 builtin/for-each-ref.c:49 builtin/tag.c:423
msgid "sorting and filtering are case insensitive"
msgstr "подредбата и филтрирането третират еднакво малките и главните букви"
-#: builtin/branch.c:632 builtin/for-each-ref.c:38 builtin/tag.c:420
+#: builtin/branch.c:651 builtin/for-each-ref.c:38 builtin/tag.c:421
#: builtin/verify-tag.c:39
msgid "format to use for the output"
msgstr "ФОРМАТ за изхода"
-#: builtin/branch.c:655 builtin/clone.c:737
+#: builtin/branch.c:674 builtin/clone.c:739
msgid "HEAD not found below refs/heads!"
msgstr "В директорията „refs/heads“ липсва файл „HEAD“"
-#: builtin/branch.c:678
+#: builtin/branch.c:697
msgid "--column and --verbose are incompatible"
msgstr "Опциите „--column“ и „--verbose“ са несъвместими"
-#: builtin/branch.c:693 builtin/branch.c:745 builtin/branch.c:754
+#: builtin/branch.c:717 builtin/branch.c:769 builtin/branch.c:778
msgid "branch name required"
msgstr "Необходимо е име на клон"
-#: builtin/branch.c:721
+#: builtin/branch.c:745
msgid "Cannot give description to detached HEAD"
msgstr "Не може да зададете описание на несвързан „HEAD“"
-#: builtin/branch.c:726
+#: builtin/branch.c:750
msgid "cannot edit description of more than one branch"
msgstr "Не може да редактирате описанието на повече от един клон едновременно"
-#: builtin/branch.c:733
+#: builtin/branch.c:757
#, c-format
msgid "No commit on branch '%s' yet."
msgstr "В клона „%s“ все още няма подавания."
-#: builtin/branch.c:736
+#: builtin/branch.c:760
#, c-format
msgid "No branch named '%s'."
msgstr "Липсва клон на име „%s“."
-#: builtin/branch.c:751
+#: builtin/branch.c:775
msgid "too many branches for a copy operation"
msgstr "прекалено много клони за копиране"
-#: builtin/branch.c:760
+#: builtin/branch.c:784
msgid "too many arguments for a rename operation"
msgstr "прекалено много аргументи към командата за преименуване"
-#: builtin/branch.c:765
+#: builtin/branch.c:789
msgid "too many arguments to set new upstream"
msgstr "прекалено много аргументи към командата за следене"
-#: builtin/branch.c:769
+#: builtin/branch.c:793
#, c-format
msgid ""
"could not set upstream of HEAD to %s when it does not point to any branch."
@@ -6799,35 +8078,35 @@ msgstr ""
"Следеното от „HEAD“ не може да се зададе да е „%s“, защото то не сочи към "
"никой клон."
-#: builtin/branch.c:772 builtin/branch.c:794 builtin/branch.c:810
+#: builtin/branch.c:796 builtin/branch.c:818 builtin/branch.c:834
#, c-format
msgid "no such branch '%s'"
msgstr "Няма клон на име „%s“."
-#: builtin/branch.c:776
+#: builtin/branch.c:800
#, c-format
msgid "branch '%s' does not exist"
msgstr "Не съществува клон на име „%s“."
-#: builtin/branch.c:788
+#: builtin/branch.c:812
msgid "too many arguments to unset upstream"
msgstr "прекалено много аргументи към командата за спиране на следене"
-#: builtin/branch.c:792
+#: builtin/branch.c:816
msgid "could not unset upstream of HEAD when it does not point to any branch."
msgstr ""
"Следеното от „HEAD“ не може да махне, защото то не сочи към никой клон."
-#: builtin/branch.c:798
+#: builtin/branch.c:822
#, c-format
msgid "Branch '%s' has no upstream information"
msgstr "Няма информация клонът „%s“ да следи някой друг"
-#: builtin/branch.c:813
+#: builtin/branch.c:837
msgid "-a and -r options to 'git branch' do not make sense with a branch name"
msgstr "Опциите „-a“ и „-r“ на „git branch“ са несъвместими с име на клон"
-#: builtin/branch.c:816
+#: builtin/branch.c:840
msgid ""
"the '--set-upstream' option is no longer supported. Please use '--track' or "
"'--set-upstream-to' instead."
@@ -6848,7 +8127,7 @@ msgstr "За създаването на пратка е необходимо х
msgid "Need a repository to unbundle."
msgstr "За приемането на пратка е необходимо хранилище."
-#: builtin/cat-file.c:525
+#: builtin/cat-file.c:577
msgid ""
"git cat-file (-t [--allow-unknown-type] | -s [--allow-unknown-type] | -e | -"
"p | <type> | --textconv | --filters) [--path=<path>] <object>"
@@ -6856,7 +8135,7 @@ msgstr ""
"git cat-file (-t [--allow-unknown-type] | -s [--allow-unknown-type] | -e | -"
"p | ВИД | --textconv --filters) [--path=ПЪТ] ОБЕКТ"
-#: builtin/cat-file.c:526
+#: builtin/cat-file.c:578
msgid ""
"git cat-file (--batch | --batch-check) [--follow-symlinks] [--textconv | --"
"filters]"
@@ -6864,74 +8143,78 @@ msgstr ""
"git cat-file (--batch | --batch-check) [--follow-symlinks] [--textconv | --"
"filters]"
-#: builtin/cat-file.c:563
+#: builtin/cat-file.c:615
msgid "<type> can be one of: blob, tree, commit, tag"
msgstr ""
"ВИДът може да е: „blob“ (BLOB), „tree“ (дърво), „commit“ (подаване), "
"„tag“ (етикет)"
-#: builtin/cat-file.c:564
+#: builtin/cat-file.c:616
msgid "show object type"
msgstr "извеждане на вида на обект"
-#: builtin/cat-file.c:565
+#: builtin/cat-file.c:617
msgid "show object size"
msgstr "извеждане на размера на обект"
-#: builtin/cat-file.c:567
+#: builtin/cat-file.c:619
msgid "exit with zero when there's no error"
msgstr "изход с 0, когато няма грешка"
-#: builtin/cat-file.c:568
+#: builtin/cat-file.c:620
msgid "pretty-print object's content"
msgstr "форматирано извеждане на съдържанието на обекта"
-#: builtin/cat-file.c:570
+#: builtin/cat-file.c:622
msgid "for blob objects, run textconv on object's content"
msgstr ""
"да се стартира програмата зададена в настройката „textconv“ за преобразуване "
"на съдържанието на обекта-BLOB"
-#: builtin/cat-file.c:572
+#: builtin/cat-file.c:624
msgid "for blob objects, run filters on object's content"
msgstr ""
"да се стартират програмите за преобразуване на съдържанието на обектите-BLOB"
-#: builtin/cat-file.c:573 git-submodule.sh:894
+#: builtin/cat-file.c:625 git-submodule.sh:864
msgid "blob"
msgstr "обект-BLOB"
-#: builtin/cat-file.c:574
+#: builtin/cat-file.c:626
msgid "use a specific path for --textconv/--filters"
msgstr "опциите „--textconv“/„--filters“ изискват път"
-#: builtin/cat-file.c:576
+#: builtin/cat-file.c:628
msgid "allow -s and -t to work with broken/corrupt objects"
msgstr "позволяване на опциите „-s“ и „-t“ да работят с повредени обекти"
-#: builtin/cat-file.c:577
+#: builtin/cat-file.c:629
msgid "buffer --batch output"
msgstr "буфериране на изхода от „--batch“"
-#: builtin/cat-file.c:579
+#: builtin/cat-file.c:631
msgid "show info and content of objects fed from the standard input"
msgstr ""
"извеждане на информация и съдържание на обектите подадени на стандартния вход"
-#: builtin/cat-file.c:582
+#: builtin/cat-file.c:634
msgid "show info about objects fed from the standard input"
msgstr "извеждане на информация за обектите подадени на стандартния вход"
-#: builtin/cat-file.c:585
+#: builtin/cat-file.c:637
msgid "follow in-tree symlinks (used with --batch or --batch-check)"
msgstr ""
"следване на символните връзки сочещи в дървото (ползва се с „--batch“ или „--"
"batch-check“)"
-#: builtin/cat-file.c:587
+#: builtin/cat-file.c:639
msgid "show all objects with --batch or --batch-check"
msgstr "извеждане на всички обекти с „--batch“ или „--batch-check“"
+#: builtin/cat-file.c:641
+msgid "do not order --batch-all-objects output"
+msgstr "без подреждане на изхода от „--batch-all-objects“"
+
#: builtin/check-attr.c:12
msgid "git check-attr [-a | --all | <attr>...] [--] <pathname>..."
msgstr "git check-attr [-a | --all | АТРИБУТ…] [--] ПЪТ…"
@@ -6948,7 +8231,7 @@ msgstr "извеждане на всички атрибути, зададени
msgid "use .gitattributes only from the index"
msgstr "използване на файла „.gitattributes“ само от индекса"
-#: builtin/check-attr.c:22 builtin/check-ignore.c:24 builtin/hash-object.c:100
+#: builtin/check-attr.c:22 builtin/check-ignore.c:24 builtin/hash-object.c:101
msgid "read file names from stdin"
msgstr "изчитане на имената на файловете от стандартния вход"
@@ -6956,7 +8239,8 @@ msgstr "изчитане на имената на файловете от ста
msgid "terminate input and output records by a NUL character"
msgstr "разделяне на входните и изходните записи с нулевия знак „NUL“"
-#: builtin/check-ignore.c:20 builtin/checkout.c:1113 builtin/gc.c:500
+#: builtin/check-ignore.c:20 builtin/checkout.c:1120 builtin/gc.c:503
+#: builtin/worktree.c:447
msgid "suppress progress reporting"
msgstr "без показване на напредъка"
@@ -7046,9 +8330,9 @@ msgid "write the content to temporary files"
msgstr "записване на съдържанието във временни файлове"
#: builtin/checkout-index.c:173 builtin/column.c:31
-#: builtin/submodule--helper.c:1216 builtin/submodule--helper.c:1219
-#: builtin/submodule--helper.c:1227 builtin/submodule--helper.c:1591
-#: builtin/worktree.c:610
+#: builtin/submodule--helper.c:1361 builtin/submodule--helper.c:1364
+#: builtin/submodule--helper.c:1372 builtin/submodule--helper.c:1736
+#: builtin/worktree.c:620
msgid "string"
msgstr "НИЗ"
@@ -7060,114 +8344,114 @@ msgstr "при създаването на нови файлове да се д
msgid "copy out the files from named stage"
msgstr "копиране на файловете от това състояние на сливане"
-#: builtin/checkout.c:27
+#: builtin/checkout.c:29
msgid "git checkout [<options>] <branch>"
msgstr "git checkout [ОПЦИЯ…] КЛОН"
-#: builtin/checkout.c:28
+#: builtin/checkout.c:30
msgid "git checkout [<options>] [<branch>] -- <file>..."
msgstr "git checkout [ОПЦИЯ…] [КЛОН] -- ФАЙЛ…"
-#: builtin/checkout.c:136 builtin/checkout.c:169
+#: builtin/checkout.c:138 builtin/checkout.c:171
#, c-format
msgid "path '%s' does not have our version"
msgstr "вашата версия липсва в пътя „%s“"
-#: builtin/checkout.c:138 builtin/checkout.c:171
+#: builtin/checkout.c:140 builtin/checkout.c:173
#, c-format
msgid "path '%s' does not have their version"
msgstr "чуждата версия липсва в пътя „%s“"
-#: builtin/checkout.c:154
+#: builtin/checkout.c:156
#, c-format
msgid "path '%s' does not have all necessary versions"
msgstr "някоя от необходимите версии липсва в пътя „%s“"
-#: builtin/checkout.c:198
+#: builtin/checkout.c:200
#, c-format
msgid "path '%s' does not have necessary versions"
msgstr "някоя от необходимите версии липсва в пътя „%s“"
-#: builtin/checkout.c:215
+#: builtin/checkout.c:217
#, c-format
msgid "path '%s': cannot merge"
msgstr "пътят „%s“ не може да бъде слян"
-#: builtin/checkout.c:231
+#: builtin/checkout.c:233
#, c-format
msgid "Unable to add merge result for '%s'"
msgstr "Резултатът за „%s“ не може да бъде слян"
-#: builtin/checkout.c:253 builtin/checkout.c:256 builtin/checkout.c:259
-#: builtin/checkout.c:262
+#: builtin/checkout.c:255 builtin/checkout.c:258 builtin/checkout.c:261
+#: builtin/checkout.c:264
#, c-format
msgid "'%s' cannot be used with updating paths"
msgstr "Опцията „%s“ е несъвместима с обновяването на пътища"
-#: builtin/checkout.c:265 builtin/checkout.c:268
+#: builtin/checkout.c:267 builtin/checkout.c:270
#, c-format
msgid "'%s' cannot be used with %s"
msgstr "Опцията „%s“ е несъвместима с „%s“"
-#: builtin/checkout.c:271
+#: builtin/checkout.c:273
#, c-format
msgid "Cannot update paths and switch to branch '%s' at the same time."
msgstr ""
"Невъзможно е едновременно да обновявате пътища и да преминете към клона „%s“."
-#: builtin/checkout.c:340 builtin/checkout.c:347
+#: builtin/checkout.c:342 builtin/checkout.c:349
#, c-format
msgid "path '%s' is unmerged"
msgstr "пътят „%s“ не е слят"
-#: builtin/checkout.c:506
+#: builtin/checkout.c:508
msgid "you need to resolve your current index first"
msgstr "първо трябва да коригирате индекса си"
-#: builtin/checkout.c:643
+#: builtin/checkout.c:645
#, c-format
msgid "Can not do reflog for '%s': %s\n"
msgstr "Журналът на указателите за „%s“ не може да се проследи: %s\n"
-#: builtin/checkout.c:684
+#: builtin/checkout.c:686
msgid "HEAD is now at"
msgstr "Указателят „HEAD“ в момента сочи към"
-#: builtin/checkout.c:688 builtin/clone.c:691
+#: builtin/checkout.c:690 builtin/clone.c:692
msgid "unable to update HEAD"
msgstr "Указателят „HEAD“ не може да бъде обновен"
-#: builtin/checkout.c:692
+#: builtin/checkout.c:694
#, c-format
msgid "Reset branch '%s'\n"
msgstr "Зануляване на клона „%s“\n"
-#: builtin/checkout.c:695
+#: builtin/checkout.c:697
#, c-format
msgid "Already on '%s'\n"
msgstr "Вече сте на „%s“\n"
-#: builtin/checkout.c:699
+#: builtin/checkout.c:701
#, c-format
msgid "Switched to and reset branch '%s'\n"
msgstr "Преминаване към клона „%s“ и зануляване на промените\n"
-#: builtin/checkout.c:701 builtin/checkout.c:1046
+#: builtin/checkout.c:703 builtin/checkout.c:1052
#, c-format
msgid "Switched to a new branch '%s'\n"
msgstr "Преминахте към новия клон „%s“\n"
-#: builtin/checkout.c:703
+#: builtin/checkout.c:705
#, c-format
msgid "Switched to branch '%s'\n"
msgstr "Преминахте към клона „%s“\n"
-#: builtin/checkout.c:754
+#: builtin/checkout.c:756
#, c-format
msgid " ... and %d more.\n"
msgstr "… и още %d.\n"
-#: builtin/checkout.c:760
+#: builtin/checkout.c:762
#, c-format
msgid ""
"Warning: you are leaving %d commit behind, not connected to\n"
@@ -7189,7 +8473,7 @@ msgstr[1] ""
"\n"
"%s\n"
-#: builtin/checkout.c:779
+#: builtin/checkout.c:781
#, c-format
msgid ""
"If you want to keep it by creating a new branch, this may be a good time\n"
@@ -7216,164 +8500,164 @@ msgstr[1] ""
" git branch ИМЕ_НА_НОВИЯ_КЛОН %s\n"
"\n"
-#: builtin/checkout.c:811
+#: builtin/checkout.c:813
msgid "internal error in revision walk"
msgstr "вътрешна грешка при обхождането на версиите"
-#: builtin/checkout.c:815
+#: builtin/checkout.c:817
msgid "Previous HEAD position was"
msgstr "Преди това „HEAD“ сочеше към"
-#: builtin/checkout.c:843 builtin/checkout.c:1041
+#: builtin/checkout.c:845 builtin/checkout.c:1047
msgid "You are on a branch yet to be born"
msgstr "В момента сте на клон, който предстои да бъде създаден"
-#: builtin/checkout.c:947
+#: builtin/checkout.c:952
#, c-format
msgid "only one reference expected, %d given."
msgstr "очакваше се един указател, а сте подали %d."
-#: builtin/checkout.c:987 builtin/worktree.c:240 builtin/worktree.c:389
+#: builtin/checkout.c:993 builtin/worktree.c:241 builtin/worktree.c:396
#, c-format
msgid "invalid reference: %s"
msgstr "неправилен указател: %s"
-#: builtin/checkout.c:1016
+#: builtin/checkout.c:1022
#, c-format
msgid "reference is not a tree: %s"
msgstr "указателят не сочи към обект-дърво: %s"
-#: builtin/checkout.c:1055
+#: builtin/checkout.c:1061
msgid "paths cannot be used with switching branches"
msgstr "задаването на път е несъвместимо с преминаването от един клон към друг"
-#: builtin/checkout.c:1058 builtin/checkout.c:1062
+#: builtin/checkout.c:1064 builtin/checkout.c:1068
#, c-format
msgid "'%s' cannot be used with switching branches"
msgstr "опцията „%s“ е несъвместима с преминаването от един клон към друг"
-#: builtin/checkout.c:1066 builtin/checkout.c:1069 builtin/checkout.c:1074
-#: builtin/checkout.c:1077
+#: builtin/checkout.c:1072 builtin/checkout.c:1075 builtin/checkout.c:1080
+#: builtin/checkout.c:1083
#, c-format
msgid "'%s' cannot be used with '%s'"
msgstr "опцията „%s“ е несъвместима с „%s“"
-#: builtin/checkout.c:1082
+#: builtin/checkout.c:1088
#, c-format
msgid "Cannot switch branch to a non-commit '%s'"
msgstr ""
"За да преминете към клон, подайте указател, който сочи към подаване. „%s“ "
"не е такъв"
-#: builtin/checkout.c:1114 builtin/checkout.c:1116 builtin/clone.c:118
-#: builtin/remote.c:167 builtin/remote.c:169 builtin/worktree.c:433
-#: builtin/worktree.c:435
+#: builtin/checkout.c:1121 builtin/checkout.c:1123 builtin/clone.c:119
+#: builtin/remote.c:168 builtin/remote.c:170 builtin/worktree.c:440
+#: builtin/worktree.c:442
msgid "branch"
msgstr "клон"
-#: builtin/checkout.c:1115
+#: builtin/checkout.c:1122
msgid "create and checkout a new branch"
msgstr "създаване и преминаване към нов клон"
-#: builtin/checkout.c:1117
+#: builtin/checkout.c:1124
msgid "create/reset and checkout a branch"
msgstr "създаване/зануляване на клон и преминаване към него"
-#: builtin/checkout.c:1118
+#: builtin/checkout.c:1125
msgid "create reflog for new branch"
msgstr "създаване на журнал на указателите за нов клон"
-#: builtin/checkout.c:1119 builtin/worktree.c:437
+#: builtin/checkout.c:1126 builtin/worktree.c:444
msgid "detach HEAD at named commit"
msgstr "отделяне на указателя „HEAD“ към указаното подаване"
-#: builtin/checkout.c:1120
+#: builtin/checkout.c:1127
msgid "set upstream info for new branch"
msgstr "задаване на кой клон бива следен при създаването на новия клон"
-#: builtin/checkout.c:1122
+#: builtin/checkout.c:1129
msgid "new-branch"
msgstr "НОВ_КЛОН"
-#: builtin/checkout.c:1122
+#: builtin/checkout.c:1129
msgid "new unparented branch"
msgstr "нов клон без родител"
-#: builtin/checkout.c:1123
+#: builtin/checkout.c:1131
msgid "checkout our version for unmerged files"
msgstr "изтегляне на вашата версия на неслетите файлове"
-#: builtin/checkout.c:1125
+#: builtin/checkout.c:1134
msgid "checkout their version for unmerged files"
msgstr "изтегляне на чуждата версия на неслетите файлове"
-#: builtin/checkout.c:1127
+#: builtin/checkout.c:1136
msgid "force checkout (throw away local modifications)"
msgstr "принудително изтегляне (вашите промени ще бъдат занулени)"
-#: builtin/checkout.c:1129
+#: builtin/checkout.c:1138
msgid "perform a 3-way merge with the new branch"
msgstr "извършване на тройно сливане с новия клон"
-#: builtin/checkout.c:1131 builtin/merge.c:241
+#: builtin/checkout.c:1140 builtin/merge.c:273
msgid "update ignored files (default)"
msgstr "обновяване на игнорираните файлове (стандартно)"
-#: builtin/checkout.c:1133 builtin/log.c:1499 parse-options.h:264
+#: builtin/checkout.c:1142 builtin/log.c:1510 parse-options.h:264
msgid "style"
msgstr "СТИЛ"
-#: builtin/checkout.c:1134
+#: builtin/checkout.c:1143
msgid "conflict style (merge or diff3)"
msgstr "действие при конфликт (сливане или тройна разлика)"
-#: builtin/checkout.c:1137
+#: builtin/checkout.c:1146
msgid "do not limit pathspecs to sparse entries only"
msgstr "без ограничаване на изброените пътища само до частично изтеглените"
-#: builtin/checkout.c:1139
+#: builtin/checkout.c:1148
msgid "second guess 'git checkout <no-such-branch>'"
msgstr ""
"опит за отгатване на име на клон след неуспешен опит с „git checkout "
"НЕСЪЩЕСТВУВАЩ_КЛОН“"
-#: builtin/checkout.c:1141
+#: builtin/checkout.c:1150
msgid "do not check if another worktree is holding the given ref"
msgstr "без проверка дали друго работно дърво държи указателя"
-#: builtin/checkout.c:1145 builtin/clone.c:85 builtin/fetch.c:149
-#: builtin/merge.c:238 builtin/pull.c:128 builtin/push.c:572
+#: builtin/checkout.c:1154 builtin/clone.c:86 builtin/fetch.c:138
+#: builtin/merge.c:270 builtin/pull.c:128 builtin/push.c:572
#: builtin/send-pack.c:174
msgid "force progress reporting"
msgstr "извеждане на напредъка"
-#: builtin/checkout.c:1175
+#: builtin/checkout.c:1184
msgid "-b, -B and --orphan are mutually exclusive"
msgstr "Опциите „-b“, „-B“ и „--orphan“ са несъвместими една с друга"
-#: builtin/checkout.c:1192
+#: builtin/checkout.c:1201
msgid "--track needs a branch name"
msgstr "опцията „--track“ изисква име на клон"
-#: builtin/checkout.c:1197
-msgid "Missing branch name; try -b"
-msgstr "Липсва име на клон, използвайте опцията „-b“"
+#: builtin/checkout.c:1206
+msgid "missing branch name; try -b"
+msgstr "липсва име на клон, използвайте опцията „-b“"
-#: builtin/checkout.c:1233
+#: builtin/checkout.c:1243
msgid "invalid path specification"
msgstr "указан е неправилен път"
-#: builtin/checkout.c:1240
+#: builtin/checkout.c:1250
#, c-format
msgid "'%s' is not a commit and a branch '%s' cannot be created from it"
msgstr "„%s“ не е подаване, затова от него не може да се създаде клон „%s“"
-#: builtin/checkout.c:1244
+#: builtin/checkout.c:1254
#, c-format
msgid "git checkout: --detach does not take a path argument '%s'"
msgstr "git checkout: опцията „--detach“ не приема аргумент-път „%s“"
-#: builtin/checkout.c:1248
+#: builtin/checkout.c:1258
msgid ""
"git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
"checking out of the index."
@@ -7381,37 +8665,67 @@ msgstr ""
"git checkout: опциите „--ours“/„--theirs“, „--force“ и „--merge“\n"
"са несъвместими с изтегляне от индекса."
-#: builtin/clean.c:26
+#: builtin/checkout.c:1278
+#, c-format
+msgid ""
+"'%s' matched more than one remote tracking branch.\n"
+"We found %d remotes with a reference that matched. So we fell back\n"
+"on trying to resolve the argument as a path, but failed there too!\n"
+"\n"
+"If you meant to check out a remote tracking branch on, e.g. 'origin',\n"
+"you can do so by fully qualifying the name with the --track option:\n"
+"\n"
+" git checkout --track origin/<name>\n"
+"\n"
+"If you'd like to always have checkouts of an ambiguous <name> prefer\n"
+"one remote, e.g. the 'origin' remote, consider setting\n"
+"checkout.defaultRemote=origin in your config."
+msgstr ""
+"„%s“ съвпада с повече от един отдалечен клон — открити са %d възможности.\n"
+"Пробата аргументът да се тълкува като път също бе неуспешна.\n"
+"\n"
+"Ако искате да изтеглите клона от конкретно хранилище, напр. „origin“,\n"
+"изрично го укажете към опцията „--track“:\n"
+"\n"
+" git checkout --track origin/ИМЕ_НА_КЛОН\n"
+"\n"
+"Ако искате винаги да се предпочита конкретно хранилище при нееднозначно\n"
+"ИМЕ_НА_КЛОН, напр. „origin“, задайте следната настройка в конфигурационния\n"
+"файл:\n"
+"\n"
+" checkout.defaultRemote=origin"
+
+#: builtin/clean.c:27
msgid ""
"git clean [-d] [-f] [-i] [-n] [-q] [-e <pattern>] [-x | -X] [--] <paths>..."
msgstr "git clean [-d] [-f] [-i] [-n] [-q] [-e ШАБЛОН] [-x | -X] [--] ПЪТ…"
-#: builtin/clean.c:30
+#: builtin/clean.c:31
#, c-format
msgid "Removing %s\n"
msgstr "Изтриване на „%s“\n"
-#: builtin/clean.c:31
+#: builtin/clean.c:32
#, c-format
msgid "Would remove %s\n"
msgstr "Файлът „%s“ ще бъде изтрит\n"
-#: builtin/clean.c:32
+#: builtin/clean.c:33
#, c-format
msgid "Skipping repository %s\n"
msgstr "Прескачане на хранилището „%s“\n"
-#: builtin/clean.c:33
+#: builtin/clean.c:34
#, c-format
msgid "Would skip repository %s\n"
msgstr "Хранилището „%s“ ще бъде прескочено\n"
-#: builtin/clean.c:34
+#: builtin/clean.c:35
#, c-format
msgid "failed to remove %s"
msgstr "файлът „%s“ не може да бъде изтрит"
-#: builtin/clean.c:302 git-add--interactive.perl:579
+#: builtin/clean.c:297 git-add--interactive.perl:579
#, c-format
msgid ""
"Prompt help:\n"
@@ -7424,7 +8738,7 @@ msgstr ""
"ПРЕФИКС — избор на единствен обект по този уникален префикс\n"
" — (празно) нищо да не се избира\n"
-#: builtin/clean.c:306 git-add--interactive.perl:588
+#: builtin/clean.c:301 git-add--interactive.perl:588
#, c-format
msgid ""
"Prompt help:\n"
@@ -7445,39 +8759,39 @@ msgstr ""
"* — избиране на всички обекти\n"
" — (празно) завършване на избирането\n"
-#: builtin/clean.c:522 git-add--interactive.perl:554
+#: builtin/clean.c:517 git-add--interactive.perl:554
#: git-add--interactive.perl:559
#, c-format, perl-format
msgid "Huh (%s)?\n"
msgstr "Неправилен избор (%s).\n"
-#: builtin/clean.c:664
+#: builtin/clean.c:659
#, c-format
msgid "Input ignore patterns>> "
msgstr "Шаблони за игнорирани елементи≫ "
-#: builtin/clean.c:701
+#: builtin/clean.c:696
#, c-format
msgid "WARNING: Cannot find items matched by: %s"
msgstr "ПРЕДУПРЕЖДЕНИЕ: Никой обект не напасва на „%s“"
-#: builtin/clean.c:722
+#: builtin/clean.c:717
msgid "Select items to delete"
msgstr "Избиране на обекти за изтриване"
#. TRANSLATORS: Make sure to keep [y/N] as is
-#: builtin/clean.c:763
+#: builtin/clean.c:758
#, c-format
msgid "Remove %s [y/N]? "
msgstr "Да се изтрие ли „%s“? „y“ — да, „N“ — НЕ"
#
-#: builtin/clean.c:788 git-add--interactive.perl:1717
+#: builtin/clean.c:783 git-add--interactive.perl:1717
#, c-format
msgid "Bye.\n"
msgstr "Изход.\n"
-#: builtin/clean.c:796
+#: builtin/clean.c:791
msgid ""
"clean - start cleaning\n"
"filter by pattern - exclude items from deletion\n"
@@ -7495,64 +8809,64 @@ msgstr ""
"help — този край\n"
"? — подсказка за шаблоните"
-#: builtin/clean.c:823 git-add--interactive.perl:1793
+#: builtin/clean.c:818 git-add--interactive.perl:1793
msgid "*** Commands ***"
msgstr "●●● Команди ●●●"
-#: builtin/clean.c:824 git-add--interactive.perl:1790
+#: builtin/clean.c:819 git-add--interactive.perl:1790
msgid "What now"
msgstr "Избор на следващо действие"
-#: builtin/clean.c:832
+#: builtin/clean.c:827
msgid "Would remove the following item:"
msgid_plural "Would remove the following items:"
msgstr[0] "Следният обект ще бъде изтрит:"
msgstr[1] "Следните обекти ще бъдат изтрити:"
-#: builtin/clean.c:848
+#: builtin/clean.c:843
msgid "No more files to clean, exiting."
msgstr "Файловете за изчистване свършиха. Изход от програмата."
-#: builtin/clean.c:910
+#: builtin/clean.c:905
msgid "do not print names of files removed"
msgstr "без извеждане на имената на файловете, които ще бъдат изтрити"
-#: builtin/clean.c:912
+#: builtin/clean.c:907
msgid "force"
msgstr "принудително изтриване"
-#: builtin/clean.c:913
+#: builtin/clean.c:908
msgid "interactive cleaning"
msgstr "интерактивно изтриване"
-#: builtin/clean.c:915
+#: builtin/clean.c:910
msgid "remove whole directories"
msgstr "изтриване на цели директории"
-#: builtin/clean.c:916 builtin/describe.c:533 builtin/describe.c:535
-#: builtin/grep.c:871 builtin/log.c:157 builtin/log.c:159
-#: builtin/ls-files.c:548 builtin/name-rev.c:397 builtin/name-rev.c:399
-#: builtin/show-ref.c:176
+#: builtin/clean.c:911 builtin/describe.c:545 builtin/describe.c:547
+#: builtin/grep.c:875 builtin/log.c:161 builtin/log.c:163
+#: builtin/ls-files.c:549 builtin/name-rev.c:415 builtin/name-rev.c:417
+#: builtin/show-ref.c:177
msgid "pattern"
msgstr "ШАБЛОН"
-#: builtin/clean.c:917
+#: builtin/clean.c:912
msgid "add <pattern> to ignore rules"
msgstr "добавяне на ШАБЛОН от файлове, които да не се трият"
-#: builtin/clean.c:918
+#: builtin/clean.c:913
msgid "remove ignored files, too"
msgstr "изтриване и на игнорираните файлове"
-#: builtin/clean.c:920
+#: builtin/clean.c:915
msgid "remove only ignored files"
msgstr "изтриване само на игнорирани файлове"
-#: builtin/clean.c:938
+#: builtin/clean.c:933
msgid "-x and -X cannot be used together"
msgstr "опциите „-x“ и „-X“ са несъвместими"
-#: builtin/clean.c:942
+#: builtin/clean.c:937
msgid ""
"clean.requireForce set to true and neither -i, -n, nor -f given; refusing to "
"clean"
@@ -7560,7 +8874,7 @@ msgstr ""
"Настройката „clean.requireForce“ е зададена като истина, което изисква някоя "
"от опциите „-i“, „-n“ или „-f“. Няма да се извърши изчистване"
-#: builtin/clean.c:945
+#: builtin/clean.c:940
msgid ""
"clean.requireForce defaults to true and neither -i, -n, nor -f given; "
"refusing to clean"
@@ -7569,150 +8883,150 @@ msgstr ""
"което изисква някоя от опциите „-i“, „-n“ или „-f“. Няма да се извърши "
"изчистване"
-#: builtin/clone.c:42
+#: builtin/clone.c:43
msgid "git clone [<options>] [--] <repo> [<dir>]"
msgstr "git clone [ОПЦИЯ…] [--] ХРАНИЛИЩЕ [ДИРЕКТОРИЯ]"
-#: builtin/clone.c:87
+#: builtin/clone.c:88
msgid "don't create a checkout"
msgstr "без създаване на работно дърво"
-#: builtin/clone.c:88 builtin/clone.c:90 builtin/init-db.c:479
+#: builtin/clone.c:89 builtin/clone.c:91 builtin/init-db.c:480
msgid "create a bare repository"
msgstr "създаване на голо хранилище"
-#: builtin/clone.c:92
+#: builtin/clone.c:93
msgid "create a mirror repository (implies bare)"
msgstr ""
"създаване на хранилище-огледало (включва опцията „--bare“ за голо хранилище)"
-#: builtin/clone.c:94
+#: builtin/clone.c:95
msgid "to clone from a local repository"
msgstr "клониране от локално хранилище"
-#: builtin/clone.c:96
+#: builtin/clone.c:97
msgid "don't use local hardlinks, always copy"
msgstr "без твърди връзки, файловете винаги да се копират"
-#: builtin/clone.c:98
+#: builtin/clone.c:99
msgid "setup as shared repository"
msgstr "настройване за споделено хранилище"
-#: builtin/clone.c:100 builtin/clone.c:104
+#: builtin/clone.c:101 builtin/clone.c:105
msgid "pathspec"
msgstr "път"
-#: builtin/clone.c:100 builtin/clone.c:104
+#: builtin/clone.c:101 builtin/clone.c:105
msgid "initialize submodules in the clone"
msgstr "инициализиране на подмодулите при това клониране"
-#: builtin/clone.c:107
+#: builtin/clone.c:108
msgid "number of submodules cloned in parallel"
msgstr "брой подмодули, клонирани паралелно"
-#: builtin/clone.c:108 builtin/init-db.c:476
+#: builtin/clone.c:109 builtin/init-db.c:477
msgid "template-directory"
msgstr "директория с шаблони"
-#: builtin/clone.c:109 builtin/init-db.c:477
+#: builtin/clone.c:110 builtin/init-db.c:478
msgid "directory from which templates will be used"
msgstr "директория, която съдържа шаблоните, които да се ползват"
-#: builtin/clone.c:111 builtin/clone.c:113 builtin/submodule--helper.c:1223
-#: builtin/submodule--helper.c:1594
+#: builtin/clone.c:112 builtin/clone.c:114 builtin/submodule--helper.c:1368
+#: builtin/submodule--helper.c:1739
msgid "reference repository"
msgstr "еталонно хранилище"
-#: builtin/clone.c:115 builtin/submodule--helper.c:1225
-#: builtin/submodule--helper.c:1596
+#: builtin/clone.c:116 builtin/submodule--helper.c:1370
+#: builtin/submodule--helper.c:1741
msgid "use --reference only while cloning"
msgstr "опцията „--reference“ може да се използва само при клониране"
-#: builtin/clone.c:116 builtin/column.c:27 builtin/merge-file.c:44
-#: builtin/pack-objects.c:3166 builtin/repack.c:213
+#: builtin/clone.c:117 builtin/column.c:27 builtin/merge-file.c:44
+#: builtin/pack-objects.c:3191 builtin/repack.c:320
msgid "name"
msgstr "ИМЕ"
-#: builtin/clone.c:117
+#: builtin/clone.c:118
msgid "use <name> instead of 'origin' to track upstream"
msgstr "използване на това ИМЕ вместо „origin“ при проследяване на клони"
-#: builtin/clone.c:119
+#: builtin/clone.c:120
msgid "checkout <branch> instead of the remote's HEAD"
msgstr "изтегляне на този КЛОН, а не соченият от отдалечения указател „HEAD“"
-#: builtin/clone.c:121
+#: builtin/clone.c:122
msgid "path to git-upload-pack on the remote"
msgstr "път към командата „git-upload-pack“ на отдалеченото хранилище"
-#: builtin/clone.c:122 builtin/fetch.c:150 builtin/grep.c:813
+#: builtin/clone.c:123 builtin/fetch.c:139 builtin/grep.c:814
#: builtin/pull.c:216
msgid "depth"
msgstr "ДЪЛБОЧИНА"
-#: builtin/clone.c:123
+#: builtin/clone.c:124
msgid "create a shallow clone of that depth"
msgstr "плитко клониране до тази ДЪЛБОЧИНА"
-#: builtin/clone.c:124 builtin/fetch.c:152 builtin/pack-objects.c:3157
+#: builtin/clone.c:125 builtin/fetch.c:141 builtin/pack-objects.c:3182
#: parse-options.h:154
msgid "time"
msgstr "ВРЕМЕ"
-#: builtin/clone.c:125
+#: builtin/clone.c:126
msgid "create a shallow clone since a specific time"
msgstr "плитко клониране до момент във времето"
-#: builtin/clone.c:126 builtin/fetch.c:154
+#: builtin/clone.c:127 builtin/fetch.c:143 builtin/fetch.c:166
msgid "revision"
msgstr "версия"
-#: builtin/clone.c:127 builtin/fetch.c:155
+#: builtin/clone.c:128 builtin/fetch.c:144
msgid "deepen history of shallow clone, excluding rev"
msgstr "задълбочаване на историята на плитко хранилище до изключващ указател"
-#: builtin/clone.c:129
+#: builtin/clone.c:130
msgid "clone only one branch, HEAD or --branch"
msgstr ""
"клониране само на един клон — или сочения от отдалечения „HEAD“, или изрично "
"зададения с „--branch“"
-#: builtin/clone.c:131
+#: builtin/clone.c:132
msgid "don't clone any tags, and make later fetches not to follow them"
msgstr ""
"без клониране на етикети, като последващите доставяния няма да ги следят"
-#: builtin/clone.c:133
+#: builtin/clone.c:134
msgid "any cloned submodules will be shallow"
msgstr "всички клонирани подмодули ще са плитки"
-#: builtin/clone.c:134 builtin/init-db.c:485
+#: builtin/clone.c:135 builtin/init-db.c:486
msgid "gitdir"
msgstr "СЛУЖЕБНА_ДИРЕКТОРИЯ"
-#: builtin/clone.c:135 builtin/init-db.c:486
+#: builtin/clone.c:136 builtin/init-db.c:487
msgid "separate git dir from working tree"
msgstr "отделна СЛУЖЕБНА_ДИРЕКТОРИЯ за git извън работното дърво"
-#: builtin/clone.c:136
+#: builtin/clone.c:137
msgid "key=value"
msgstr "КЛЮЧ=СТОЙНОСТ"
-#: builtin/clone.c:137
+#: builtin/clone.c:138
msgid "set config inside the new repository"
msgstr "задаване на настройките на новото хранилище"
-#: builtin/clone.c:138 builtin/fetch.c:173 builtin/pull.c:229
+#: builtin/clone.c:139 builtin/fetch.c:162 builtin/pull.c:229
#: builtin/push.c:583
msgid "use IPv4 addresses only"
msgstr "само адреси IPv4"
-#: builtin/clone.c:140 builtin/fetch.c:175 builtin/pull.c:232
+#: builtin/clone.c:141 builtin/fetch.c:164 builtin/pull.c:232
#: builtin/push.c:585
msgid "use IPv6 addresses only"
msgstr "само адреси IPv6"
-#: builtin/clone.c:278
+#: builtin/clone.c:279
msgid ""
"No directory name could be guessed.\n"
"Please specify a directory on the command line"
@@ -7720,43 +9034,43 @@ msgstr ""
"Името на директорията не може да бъде отгатнато.\n"
"Задайте директорията изрично на командния ред"
-#: builtin/clone.c:331
+#: builtin/clone.c:332
#, c-format
msgid "info: Could not add alternate for '%s': %s\n"
msgstr ""
"ПРЕДУПРЕЖДЕНИЕ: не може да се добави алтернативен източник на „%s“: %s\n"
-#: builtin/clone.c:403
+#: builtin/clone.c:404
#, c-format
msgid "failed to open '%s'"
msgstr "директорията „%s“ не може да бъде отворена"
-#: builtin/clone.c:411
+#: builtin/clone.c:412
#, c-format
msgid "%s exists and is not a directory"
msgstr "„%s“ съществува и не е директория"
-#: builtin/clone.c:425
+#: builtin/clone.c:426
#, c-format
msgid "failed to stat %s\n"
msgstr "не може да бъде получена информация чрез „stat“ за „%s“\n"
-#: builtin/clone.c:447
+#: builtin/clone.c:448
#, c-format
msgid "failed to create link '%s'"
msgstr "връзката „%s“ не може да бъде създадена"
-#: builtin/clone.c:451
+#: builtin/clone.c:452
#, c-format
msgid "failed to copy file to '%s'"
msgstr "файлът не може да бъде копиран като „%s“"
-#: builtin/clone.c:477
+#: builtin/clone.c:478
#, c-format
msgid "done.\n"
msgstr "действието завърши.\n"
-#: builtin/clone.c:491
+#: builtin/clone.c:492
msgid ""
"Clone succeeded, but checkout failed.\n"
"You can inspect what was checked out with 'git status'\n"
@@ -7767,103 +9081,99 @@ msgstr ""
"клон в момента са изтеглени с командата „git status“. Можете да\n"
"завършите изтеглянето на клона с командата „git checkout -f HEAD“.\n"
-#: builtin/clone.c:568
+#: builtin/clone.c:569
#, c-format
msgid "Could not find remote branch %s to clone."
msgstr ""
"Клонът „%s“ от отдалеченото хранилище, което клонирате,\n"
"и който следва да бъде изтеглен, не съществува."
-#: builtin/clone.c:663
-msgid "remote did not send all necessary objects"
-msgstr "отдалеченото хранилище не изпрати всички необходими обекти."
-
-#: builtin/clone.c:679
+#: builtin/clone.c:680
#, c-format
msgid "unable to update %s"
msgstr "обектът „%s“ не може да бъде обновен"
-#: builtin/clone.c:728
+#: builtin/clone.c:730
msgid "remote HEAD refers to nonexistent ref, unable to checkout.\n"
msgstr ""
"указателят „HEAD“ от отдалеченото хранилище сочи към нещо,\n"
"което не съществува. Не може да се изтегли определен клон.\n"
-#: builtin/clone.c:758
+#: builtin/clone.c:760
msgid "unable to checkout working tree"
msgstr "работното дърво не може да бъде подготвено"
-#: builtin/clone.c:803
+#: builtin/clone.c:805
msgid "unable to write parameters to config file"
msgstr "настройките не могат да бъдат записани в конфигурационния файл"
-#: builtin/clone.c:866
+#: builtin/clone.c:868
msgid "cannot repack to clean up"
msgstr "не може да се извърши пакетиране за изчистване на файловете"
-#: builtin/clone.c:868
+#: builtin/clone.c:870
msgid "cannot unlink temporary alternates file"
msgstr "временният файл за алтернативни обекти не може да бъде изтрит"
-#: builtin/clone.c:907 builtin/receive-pack.c:1947
+#: builtin/clone.c:910 builtin/receive-pack.c:1935
msgid "Too many arguments."
msgstr "Прекалено много аргументи."
-#: builtin/clone.c:911
+#: builtin/clone.c:914
msgid "You must specify a repository to clone."
msgstr "Трябва да укажете кое хранилище искате да клонирате."
-#: builtin/clone.c:924
+#: builtin/clone.c:927
#, c-format
msgid "--bare and --origin %s options are incompatible."
msgstr "опциите „--bare“ и „--origin %s“ са несъвместими."
-#: builtin/clone.c:927
+#: builtin/clone.c:930
msgid "--bare and --separate-git-dir are incompatible."
msgstr "опциите „--bare“ и „--separate-git-dir“ са несъвместими."
-#: builtin/clone.c:940
+#: builtin/clone.c:943
#, c-format
msgid "repository '%s' does not exist"
msgstr "не съществува хранилище „%s“"
-#: builtin/clone.c:946 builtin/fetch.c:1460
+#: builtin/clone.c:949 builtin/fetch.c:1512
#, c-format
msgid "depth %s is not a positive number"
msgstr "дълбочината трябва да е положително цяло число, а не „%s“"
-#: builtin/clone.c:956
+#: builtin/clone.c:959
#, c-format
msgid "destination path '%s' already exists and is not an empty directory."
msgstr "целевият път „%s“ съществува и не е празна директория."
-#: builtin/clone.c:966
+#: builtin/clone.c:969
#, c-format
msgid "working tree '%s' already exists."
msgstr "в „%s“ вече съществува работно дърво."
-#: builtin/clone.c:981 builtin/clone.c:1002 builtin/difftool.c:270
-#: builtin/worktree.c:246 builtin/worktree.c:276
+#: builtin/clone.c:984 builtin/clone.c:1005 builtin/difftool.c:271
+#: builtin/worktree.c:247 builtin/worktree.c:277
#, c-format
msgid "could not create leading directories of '%s'"
msgstr "родителските директории на „%s“ не могат да бъдат създадени"
-#: builtin/clone.c:986
+#: builtin/clone.c:989
#, c-format
msgid "could not create work tree dir '%s'"
msgstr "работното дърво в „%s“ не може да бъде създадено."
-#: builtin/clone.c:1006
+#: builtin/clone.c:1009
#, c-format
msgid "Cloning into bare repository '%s'...\n"
msgstr "Клониране и създаване на голо хранилище в „%s“…\n"
-#: builtin/clone.c:1008
+#: builtin/clone.c:1011
#, c-format
msgid "Cloning into '%s'...\n"
msgstr "Клониране и създаване на хранилище в „%s“…\n"
-#: builtin/clone.c:1032
+#: builtin/clone.c:1035
msgid ""
"clone --recursive is not compatible with both --reference and --reference-if-"
"able"
@@ -7871,44 +9181,44 @@ msgstr ""
"Опцията „--recursive“ е несъвместима с опциите „--reference“ и „--reference-"
"if-able“"
-#: builtin/clone.c:1093
+#: builtin/clone.c:1096
msgid "--depth is ignored in local clones; use file:// instead."
msgstr ""
"При локално клониране опцията „--depth“ се прескача. Ползвайте схемата "
"„file://“."
-#: builtin/clone.c:1095
+#: builtin/clone.c:1098
msgid "--shallow-since is ignored in local clones; use file:// instead."
msgstr ""
"При локално клониране опцията „--shallow-since“ се прескача. Ползвайте "
"схемата „file://“."
-#: builtin/clone.c:1097
+#: builtin/clone.c:1100
msgid "--shallow-exclude is ignored in local clones; use file:// instead."
msgstr ""
"При локално клониране опцията „--shallow-exclude“ се прескача. Ползвайте "
"схемата „file://“."
-#: builtin/clone.c:1099
+#: builtin/clone.c:1102
msgid "--filter is ignored in local clones; use file:// instead."
msgstr ""
"При локално клониране опцията „--filter“ се прескача. Ползвайте схемата "
"„file://“."
-#: builtin/clone.c:1102
+#: builtin/clone.c:1105
msgid "source repository is shallow, ignoring --local"
msgstr "клонираното хранилище е плитко, затова опцията „--local“ се прескача"
-#: builtin/clone.c:1107
+#: builtin/clone.c:1110
msgid "--local is ignored"
msgstr "опцията „--local“ се прескача"
-#: builtin/clone.c:1169 builtin/clone.c:1177
+#: builtin/clone.c:1180 builtin/clone.c:1188
#, c-format
msgid "Remote branch %s not found in upstream %s"
msgstr "Отдалеченият клон „%s“ липсва в клонираното хранилище „%s“"
-#: builtin/clone.c:1180
+#: builtin/clone.c:1191
msgid "You appear to have cloned an empty repository."
msgstr "Изглежда клонирахте празно хранилище."
@@ -7944,15 +9254,15 @@ msgstr "Поле в знаци между колоните"
msgid "--command must be the first argument"
msgstr "опцията „--command“ трябва да е първият аргумент"
-#: builtin/commit.c:37
+#: builtin/commit.c:38
msgid "git commit [<options>] [--] <pathspec>..."
msgstr "git commit [ОПЦИЯ…] [--] ПЪТ…"
-#: builtin/commit.c:42
+#: builtin/commit.c:43
msgid "git status [<options>] [--] <pathspec>..."
msgstr "git status [ОПЦИЯ…] [--] ПЪТ…"
-#: builtin/commit.c:47
+#: builtin/commit.c:48
msgid ""
"You asked to amend the most recent commit, but doing so would make\n"
"it empty. You can repeat your command with --allow-empty, or you can\n"
@@ -7964,7 +9274,7 @@ msgstr ""
"с опцията „--allow-empty“, или да го изтриете от историята с командата:\n"
"„git reset HEAD^“.\n"
-#: builtin/commit.c:52
+#: builtin/commit.c:53
msgid ""
"The previous cherry-pick is now empty, possibly due to conflict resolution.\n"
"If you wish to commit it anyway, use:\n"
@@ -7979,11 +9289,11 @@ msgstr ""
" git commit --allow-empty\n"
"\n"
-#: builtin/commit.c:59
+#: builtin/commit.c:60
msgid "Otherwise, please use 'git reset'\n"
msgstr "В противен случай използвайте командата „git reset“\n"
-#: builtin/commit.c:62
+#: builtin/commit.c:63
msgid ""
"If you wish to skip this commit, use:\n"
"\n"
@@ -7999,61 +9309,61 @@ msgstr ""
"Чрез командата „git cherry-pick --continue“ ще продължите отбирането на\n"
"останалите подавания.\n"
-#: builtin/commit.c:293
+#: builtin/commit.c:306
msgid "failed to unpack HEAD tree object"
msgstr "върховото дърво (HEAD tree object) не може да бъде извадено от пакет"
-#: builtin/commit.c:334
+#: builtin/commit.c:347
msgid "unable to create temporary index"
msgstr "временният индекс не може да бъде създаден"
-#: builtin/commit.c:340
+#: builtin/commit.c:353
msgid "interactive add failed"
msgstr "неуспешно интерактивно добавяне"
-#: builtin/commit.c:353
+#: builtin/commit.c:366
msgid "unable to update temporary index"
msgstr "временният индекс не може да бъде обновен"
-#: builtin/commit.c:355
+#: builtin/commit.c:368
msgid "Failed to update main cache tree"
msgstr "Дървото на основния кеш не може да бъде обновено"
-#: builtin/commit.c:380 builtin/commit.c:403 builtin/commit.c:449
+#: builtin/commit.c:393 builtin/commit.c:416 builtin/commit.c:462
msgid "unable to write new_index file"
msgstr "новият индекс не може да бъде записан"
-#: builtin/commit.c:432
+#: builtin/commit.c:445
msgid "cannot do a partial commit during a merge."
msgstr "по време на сливане не може да се извърши частично подаване."
-#: builtin/commit.c:434
+#: builtin/commit.c:447
msgid "cannot do a partial commit during a cherry-pick."
msgstr "по време на отбиране не може да се извърши частично подаване."
-#: builtin/commit.c:442
+#: builtin/commit.c:455
msgid "cannot read the index"
msgstr "индексът не може да бъде прочетен"
-#: builtin/commit.c:461
+#: builtin/commit.c:474
msgid "unable to write temporary index file"
msgstr "временният индекс не може да бъде записан"
-#: builtin/commit.c:558
+#: builtin/commit.c:571
#, c-format
msgid "commit '%s' lacks author header"
msgstr "заглавната част за автор в подаването „%s“ липсва"
-#: builtin/commit.c:560
+#: builtin/commit.c:573
#, c-format
msgid "commit '%s' has malformed author line"
msgstr "заглавната част за автор в подаването „%s“ е неправилна"
-#: builtin/commit.c:579
+#: builtin/commit.c:592
msgid "malformed --author parameter"
msgstr "неправилен параметър към опцията „--author“"
-#: builtin/commit.c:631
+#: builtin/commit.c:644
msgid ""
"unable to select a comment character that is not used\n"
"in the current commit message"
@@ -8061,38 +9371,38 @@ msgstr ""
"не може да се избере знак за коментар — в текущото съобщение за подаване са "
"използвани всички подобни знаци"
-#: builtin/commit.c:668 builtin/commit.c:701 builtin/commit.c:1029
+#: builtin/commit.c:681 builtin/commit.c:714 builtin/commit.c:1042
#, c-format
msgid "could not lookup commit %s"
msgstr "следното подаване не може да бъде открито: %s"
-#: builtin/commit.c:680 builtin/shortlog.c:316
+#: builtin/commit.c:693 builtin/shortlog.c:317
#, c-format
msgid "(reading log message from standard input)\n"
msgstr "(изчитане на съобщението за подаване от стандартния вход)\n"
-#: builtin/commit.c:682
+#: builtin/commit.c:695
msgid "could not read log from standard input"
msgstr "съобщението за подаване не бе прочетено стандартния вход"
-#: builtin/commit.c:686
+#: builtin/commit.c:699
#, c-format
msgid "could not read log file '%s'"
msgstr "файлът със съобщението за подаване „%s“ не може да бъде прочетен"
-#: builtin/commit.c:715 builtin/commit.c:723
+#: builtin/commit.c:728 builtin/commit.c:736
msgid "could not read SQUASH_MSG"
msgstr "съобщението за вкарване SQUASH_MSG не може да бъде прочетено"
-#: builtin/commit.c:720
+#: builtin/commit.c:733
msgid "could not read MERGE_MSG"
msgstr "съобщението за сливане MERGE_MSG не може да бъде прочетено"
-#: builtin/commit.c:774
+#: builtin/commit.c:787
msgid "could not write commit template"
msgstr "шаблонът за подаване не може да бъде запазен"
-#: builtin/commit.c:792
+#: builtin/commit.c:805
#, c-format
msgid ""
"\n"
@@ -8107,7 +9417,7 @@ msgstr ""
" %s\n"
"и опитайте отново.\n"
-#: builtin/commit.c:797
+#: builtin/commit.c:810
#, c-format
msgid ""
"\n"
@@ -8123,7 +9433,7 @@ msgstr ""
" %s\n"
"и опитайте отново.\n"
-#: builtin/commit.c:810
+#: builtin/commit.c:823
#, c-format
msgid ""
"Please enter the commit message for your changes. Lines starting\n"
@@ -8132,7 +9442,7 @@ msgstr ""
"Въведете съобщението за подаване на промените. Редовете, които започват\n"
"с „%c“, ще бъдат пропуснати, а празно съобщение преустановява подаването.\n"
-#: builtin/commit.c:818
+#: builtin/commit.c:831
#, c-format
msgid ""
"Please enter the commit message for your changes. Lines starting\n"
@@ -8143,105 +9453,105 @@ msgstr ""
"с „%c“, също ще бъдат включени — може да ги изтриете вие. Празно \n"
"съобщение преустановява подаването.\n"
-#: builtin/commit.c:835
+#: builtin/commit.c:848
#, c-format
msgid "%sAuthor: %.*s <%.*s>"
msgstr "%sАвтор: %.*s <%.*s>"
-#: builtin/commit.c:843
+#: builtin/commit.c:856
#, c-format
msgid "%sDate: %s"
msgstr "%sДата: %s"
-#: builtin/commit.c:850
+#: builtin/commit.c:863
#, c-format
msgid "%sCommitter: %.*s <%.*s>"
msgstr "%sПодаващ: %.*s <%.*s>"
-#: builtin/commit.c:867
+#: builtin/commit.c:880
msgid "Cannot read index"
msgstr "Индексът не може да бъде прочетен"
-#: builtin/commit.c:933
+#: builtin/commit.c:946
msgid "Error building trees"
msgstr "Грешка при изграждане на дърветата"
-#: builtin/commit.c:947 builtin/tag.c:257
+#: builtin/commit.c:960 builtin/tag.c:258
#, c-format
msgid "Please supply the message using either -m or -F option.\n"
msgstr "Подайте съобщението с някоя от опциите „-m“ или „-F“.\n"
-#: builtin/commit.c:991
+#: builtin/commit.c:1004
#, c-format
msgid "--author '%s' is not 'Name <email>' and matches no existing author"
msgstr ""
"Опцията „--author '%s'“ не отговаря на форма̀та „Име <е-поща>“ и не съвпада с "
"никой автор"
-#: builtin/commit.c:1005
+#: builtin/commit.c:1018
#, c-format
msgid "Invalid ignored mode '%s'"
msgstr "Неправилен режим за игнорираните файлове: „%s“"
-#: builtin/commit.c:1019 builtin/commit.c:1269
+#: builtin/commit.c:1032 builtin/commit.c:1269
#, c-format
msgid "Invalid untracked files mode '%s'"
msgstr "Неправилен режим за неследените файлове: „%s“"
-#: builtin/commit.c:1057
+#: builtin/commit.c:1070
msgid "--long and -z are incompatible"
msgstr "Опциите „--long“ и „-z“ са несъвместими."
-#: builtin/commit.c:1090
+#: builtin/commit.c:1103
msgid "Using both --reset-author and --author does not make sense"
msgstr "Опциите „--reset-author“ и „--author“ са несъвместими."
-#: builtin/commit.c:1099
+#: builtin/commit.c:1112
msgid "You have nothing to amend."
msgstr "Няма какво да бъде поправено."
-#: builtin/commit.c:1102
+#: builtin/commit.c:1115
msgid "You are in the middle of a merge -- cannot amend."
msgstr "В момента се извършва сливане, не можете да поправяте."
-#: builtin/commit.c:1104
+#: builtin/commit.c:1117
msgid "You are in the middle of a cherry-pick -- cannot amend."
msgstr "В момента се извършва отбиране на подаване, не можете да поправяте."
-#: builtin/commit.c:1107
+#: builtin/commit.c:1120
msgid "Options --squash and --fixup cannot be used together"
msgstr "Опциите „--squash“ и „--fixup“ са несъвместими."
-#: builtin/commit.c:1117
+#: builtin/commit.c:1130
msgid "Only one of -c/-C/-F/--fixup can be used."
msgstr "Опциите „-c“, „-C“, „-F“ и „--fixup““ са несъвместими."
-#: builtin/commit.c:1119
+#: builtin/commit.c:1132
msgid "Option -m cannot be combined with -c/-C/-F."
msgstr "Опцията „-m“ е несъвместима с „-c“, „-C“ и „-F“."
-#: builtin/commit.c:1127
+#: builtin/commit.c:1140
msgid "--reset-author can be used only with -C, -c or --amend."
msgstr ""
"Опцията „--reset-author“ може да се използва само заедно с „-C“, „-c“ или\n"
"„--amend“."
-#: builtin/commit.c:1144
+#: builtin/commit.c:1157
msgid "Only one of --include/--only/--all/--interactive/--patch can be used."
msgstr ""
"Опциите „--include“, „--only“, „--all“, „--interactive“ и „--patch“ са\n"
"несъвместими."
-#: builtin/commit.c:1146
+#: builtin/commit.c:1159
msgid "No paths with --include/--only does not make sense."
msgstr "Опциите „--include“ и „--only“ изискват аргументи."
-#: builtin/commit.c:1160 builtin/tag.c:543
+#: builtin/commit.c:1173 builtin/tag.c:544
#, c-format
msgid "Invalid cleanup mode %s"
msgstr "Несъществуващ режим на изчистване „%s“"
-#: builtin/commit.c:1165
+#: builtin/commit.c:1178
msgid "Paths with -a does not make sense."
msgstr "Опцията „-a“ е несъвместима със задаването на пътища."
@@ -8266,7 +9576,7 @@ msgid "version"
msgstr "версия"
#: builtin/commit.c:1311 builtin/commit.c:1486 builtin/push.c:558
-#: builtin/worktree.c:581
+#: builtin/worktree.c:591
msgid "machine-readable output"
msgstr "формат на изхода за четене от програма"
@@ -8279,7 +9589,7 @@ msgid "terminate entries with NUL"
msgstr "разделяне на елементите с нулевия знак „NUL“"
#: builtin/commit.c:1319 builtin/commit.c:1323 builtin/commit.c:1494
-#: builtin/fast-export.c:1001 builtin/fast-export.c:1004 builtin/tag.c:397
+#: builtin/fast-export.c:1007 builtin/fast-export.c:1010 builtin/tag.c:398
msgid "mode"
msgstr "РЕЖИМ"
@@ -8340,7 +9650,7 @@ msgstr "добавяне на разликата към шаблона за съ
msgid "Commit message options"
msgstr "Опции за съобщението при подаване"
-#: builtin/commit.c:1454 builtin/tag.c:394
+#: builtin/commit.c:1454 builtin/merge.c:261 builtin/tag.c:395
msgid "read message from file"
msgstr "взимане на съобщението от ФАЙЛ"
@@ -8352,7 +9662,7 @@ msgstr "АВТОР"
msgid "override author for commit"
msgstr "задаване на АВТОР за подаването"
-#: builtin/commit.c:1456 builtin/gc.c:501
+#: builtin/commit.c:1456 builtin/gc.c:504
msgid "date"
msgstr "ДАТА"
@@ -8360,8 +9670,8 @@ msgstr "ДАТА"
msgid "override date for commit"
msgstr "задаване на ДАТА за подаването"
-#: builtin/commit.c:1457 builtin/merge.c:228 builtin/notes.c:402
-#: builtin/notes.c:565 builtin/tag.c:392
+#: builtin/commit.c:1457 builtin/merge.c:257 builtin/notes.c:404
+#: builtin/notes.c:567 builtin/tag.c:393
msgid "message"
msgstr "СЪОБЩЕНИЕ"
@@ -8399,8 +9709,8 @@ msgid "the commit is authored by me now (used with -C/-c/--amend)"
msgstr ""
"смяна на автора да съвпада с подаващия (използва се с „-C“/„-c“/„--amend“)"
-#: builtin/commit.c:1463 builtin/log.c:1446 builtin/merge.c:242
-#: builtin/pull.c:154 builtin/revert.c:105
+#: builtin/commit.c:1463 builtin/log.c:1457 builtin/merge.c:274
+#: builtin/pull.c:154 builtin/revert.c:106
msgid "add Signed-off-by:"
msgstr "добавяне на поле за подпис — „Signed-off-by:“"
@@ -8416,7 +9726,7 @@ msgstr "редактиране на подаване"
msgid "default"
msgstr "стандартно"
-#: builtin/commit.c:1466 builtin/tag.c:398
+#: builtin/commit.c:1466 builtin/tag.c:399
msgid "how to strip spaces and #comments from message"
msgstr "кои празни знаци и #коментари да се махат от съобщенията"
@@ -8424,8 +9734,8 @@ msgstr "кои празни знаци и #коментари да се маха
msgid "include status in commit message template"
msgstr "вмъкване на състоянието в шаблона за съобщението при подаване"
-#: builtin/commit.c:1469 builtin/merge.c:240 builtin/pull.c:184
-#: builtin/revert.c:113
+#: builtin/commit.c:1469 builtin/merge.c:272 builtin/pull.c:184
+#: builtin/revert.c:114
msgid "GPG sign commit"
msgstr "подписване на подаването с GPG"
@@ -8505,57 +9815,67 @@ msgstr "Неизвършване на подаване поради нереда
#: builtin/commit.c:1650
msgid ""
-"Repository has been updated, but unable to write\n"
+"repository has been updated, but unable to write\n"
"new_index file. Check that disk is not full and quota is\n"
"not exceeded, and then \"git reset HEAD\" to recover."
msgstr ""
-"Хранилището е обновено, но новият файл за индекс „new_index“\n"
+"хранилището е обновено, но новият файл за индекс „new_index“\n"
"не е записан. Проверете дали дискът не е препълнен или не сте\n"
"превишили дисковата си квота. След това изпълнете „git reset HEAD“."
-#: builtin/commit-graph.c:9
+#: builtin/commit-graph.c:10
msgid "git commit-graph [--object-dir <objdir>]"
msgstr "git commit-graph [--object-dir ДИР_ОБЕКТИ]"
-#: builtin/commit-graph.c:10 builtin/commit-graph.c:16
+#: builtin/commit-graph.c:11 builtin/commit-graph.c:23
msgid "git commit-graph read [--object-dir <objdir>]"
msgstr "git commit-graph read [--object-dir ДИР_ОБЕКТИ]"
-#: builtin/commit-graph.c:11 builtin/commit-graph.c:21
+#: builtin/commit-graph.c:12 builtin/commit-graph.c:18
+msgid "git commit-graph verify [--object-dir <objdir>]"
+msgstr "git commit-graph verify [--object-dir ДИР_ОБЕКТИ]"
+
+#: builtin/commit-graph.c:13 builtin/commit-graph.c:28
msgid ""
-"git commit-graph write [--object-dir <objdir>] [--append] [--stdin-packs|--"
-"stdin-commits]"
+"git commit-graph write [--object-dir <objdir>] [--append] [--reachable|--"
+"stdin-packs|--stdin-commits]"
msgstr ""
-"git commit-graph write [--object-dir ДИР_ОБЕКТИ] [--append] [--stdin-packs|--"
-"stdin-commits]"
+"git commit-graph write [--object-dir ДИР_ОБЕКТИ] [--append] [--reachable|--"
+"stdin-packs|--stdin-commits]"
-#: builtin/commit-graph.c:39 builtin/commit-graph.c:92
-#: builtin/commit-graph.c:147 builtin/fetch.c:161 builtin/log.c:1466
+#: builtin/commit-graph.c:48 builtin/commit-graph.c:77
+#: builtin/commit-graph.c:131 builtin/commit-graph.c:184 builtin/fetch.c:150
+#: builtin/log.c:1477
msgid "dir"
msgstr "директория"
-#: builtin/commit-graph.c:40 builtin/commit-graph.c:93
-#: builtin/commit-graph.c:148
+#: builtin/commit-graph.c:49 builtin/commit-graph.c:78
+#: builtin/commit-graph.c:132 builtin/commit-graph.c:185
msgid "The object directory to store the graph"
msgstr "ДИРекторията_с_ОБЕКТИ за запазване на гра̀фа"
-#: builtin/commit-graph.c:95
+#: builtin/commit-graph.c:134
+msgid "start walk at all refs"
+msgstr "обхождането да започне от всички указатели"
+
+#: builtin/commit-graph.c:136
msgid "scan pack-indexes listed by stdin for commits"
msgstr ""
"проверка на подаванията за индексите на пакетите изброени на командния ред"
-#: builtin/commit-graph.c:97
+#: builtin/commit-graph.c:138
msgid "start walk at commits listed by stdin"
msgstr "започване на обхождането при подаванията подадени на стандартния вход"
-#: builtin/commit-graph.c:99
+#: builtin/commit-graph.c:140
msgid "include all commits already in the commit-graph file"
msgstr ""
"включване на всички подавания, които вече са във файла с гра̀фа на подаванията"
-#: builtin/commit-graph.c:108
-msgid "cannot use both --stdin-commits and --stdin-packs"
-msgstr "опциите „--stdin-commits“ и „--stdin-packs“ са несъвместими"
+#: builtin/commit-graph.c:149
+msgid "use at most one of --reachable, --stdin-commits, or --stdin-packs"
+msgstr ""
+"опциите „--reachable“, „--stdin-commits“ и „--stdin-packs“ са несъвместими"
#: builtin/config.c:10
msgid "git config [<options>]"
@@ -8566,167 +9886,203 @@ msgstr "git config [ОПЦИЯ…]"
msgid "unrecognized --type argument, %s"
msgstr "непознат аргумент „--type“: %s"
-#: builtin/config.c:123
+#: builtin/config.c:113
+msgid "only one type at a time"
+msgstr "само по един вид"
+
+#: builtin/config.c:122
msgid "Config file location"
msgstr "Местоположение на конфигурационния файл"
-#: builtin/config.c:124
+#: builtin/config.c:123
msgid "use global config file"
msgstr "използване на глобалния конфигурационен файл"
-#: builtin/config.c:125
+#: builtin/config.c:124
msgid "use system config file"
msgstr "използване на системния конфигурационен файл"
-#: builtin/config.c:126
+#: builtin/config.c:125
msgid "use repository config file"
msgstr "използване на конфигурационния файл на хранилището"
-#: builtin/config.c:127
+#: builtin/config.c:126
msgid "use given config file"
msgstr "използване на зададения конфигурационен ФАЙЛ"
-#: builtin/config.c:128
+#: builtin/config.c:127
msgid "blob-id"
msgstr "ИДЕНТИФИКАТОР"
-#: builtin/config.c:128
+#: builtin/config.c:127
msgid "read config from given blob object"
msgstr ""
"изчитане на конфигурацията от BLOB с този ИДЕНТИФИКАТОР на съдържанието"
-#: builtin/config.c:129
+#: builtin/config.c:128
msgid "Action"
msgstr "Действие"
-#: builtin/config.c:130
+#: builtin/config.c:129
msgid "get value: name [value-regex]"
msgstr "извеждане на стойност: ИМЕ [РЕГУЛЯРЕН_ИЗРАЗ_ЗА_СТОЙНОСТТА]"
-#: builtin/config.c:131
+#: builtin/config.c:130
msgid "get all values: key [value-regex]"
msgstr "извеждане на всички стойности: ключ [РЕГУЛЯРЕН_ИЗРАЗ_ЗА_СТОЙНОСТТА]"
-#: builtin/config.c:132
+#: builtin/config.c:131
msgid "get values for regexp: name-regex [value-regex]"
msgstr ""
"извеждане на стойностите за РЕГУЛЯРНия_ИЗРАЗ: РЕГУЛЯРЕН_ИЗРАЗ_ЗА_ИМЕТО "
"[РЕГУЛЯРЕН_ИЗРАЗ_ЗА_СТОЙНОСТТА]"
-#: builtin/config.c:133
+#: builtin/config.c:132
msgid "get value specific for the URL: section[.var] URL"
msgstr "извеждане на стойността за указания адрес: РАЗДЕЛ[.ПРОМЕНЛИВА] АДРЕС"
-#: builtin/config.c:134
+#: builtin/config.c:133
msgid "replace all matching variables: name value [value_regex]"
msgstr ""
"замяна на всички съвпадащи променливи: ИМЕ СТОЙНОСТ "
"[РЕГУЛЯРЕН_ИЗРАЗ_ЗА_СТОЙНОСТТА]"
-#: builtin/config.c:135
+#: builtin/config.c:134
msgid "add a new variable: name value"
msgstr "добавяне на нова променлива: ИМЕ СТОЙНОСТ"
-#: builtin/config.c:136
+#: builtin/config.c:135
msgid "remove a variable: name [value-regex]"
msgstr "изтриване на променлива: ИМЕ [РЕГУЛЯРЕН_ИЗРАЗ_ЗА_СТОЙНОСТТА]"
-#: builtin/config.c:137
+#: builtin/config.c:136
msgid "remove all matches: name [value-regex]"
msgstr "изтриване на всички съвпадащи: ИМЕ [РЕГУЛЯРЕН_ИЗРАЗ_ЗА_СТОЙНОСТТА]"
-#: builtin/config.c:138
+#: builtin/config.c:137
msgid "rename section: old-name new-name"
msgstr "преименуване на раздел: СТАРО_ИМЕ НОВО_ИМЕ"
-#: builtin/config.c:139
+#: builtin/config.c:138
msgid "remove a section: name"
msgstr "изтриване на раздел: ИМЕ"
-#: builtin/config.c:140
+#: builtin/config.c:139
msgid "list all"
msgstr "изброяване на всички"
-#: builtin/config.c:141
+#: builtin/config.c:140
msgid "open an editor"
msgstr "отваряне на редактор"
-#: builtin/config.c:142
+#: builtin/config.c:141
msgid "find the color configured: slot [default]"
msgstr "извеждане на зададения цвят: номер [стандартно]"
-#: builtin/config.c:143
+#: builtin/config.c:142
msgid "find the color setting: slot [stdout-is-tty]"
msgstr "извеждане на зададения цвят: номер (стандартният изход е терминал)"
-#: builtin/config.c:144
+#: builtin/config.c:143
msgid "Type"
msgstr "Вид"
-#: builtin/config.c:145
+#: builtin/config.c:144
msgid "value is given this type"
msgstr "стойността е от този вид"
-#: builtin/config.c:146
+#: builtin/config.c:145
msgid "value is \"true\" or \"false\""
msgstr "СТОЙНОСТТА е „true“ (истина) или „false“ (лъжа)"
-#: builtin/config.c:147
+#: builtin/config.c:146
msgid "value is decimal number"
msgstr "СТОЙНОСТТА е цяло, десетично число"
-#: builtin/config.c:148
+#: builtin/config.c:147
msgid "value is --bool or --int"
msgstr "СТОЙНОСТТА е „--bool“ (булева) или „--int“ (десетично цяло число)"
-#: builtin/config.c:149
+#: builtin/config.c:148
msgid "value is a path (file or directory name)"
msgstr "СТОЙНОСТТА е път (до файл или директория)"
-#: builtin/config.c:150
+#: builtin/config.c:149
msgid "value is an expiry date"
msgstr "стойността е период на валидност/запазване"
-#: builtin/config.c:151
+#: builtin/config.c:150
msgid "Other"
msgstr "Други"
-#: builtin/config.c:152
+#: builtin/config.c:151
msgid "terminate values with NUL byte"
msgstr "разделяне на стойностите с нулевия знак „NUL“"
-#: builtin/config.c:153
+#: builtin/config.c:152
msgid "show variable names only"
msgstr "извеждане на имената на променливите"
-#: builtin/config.c:154
+#: builtin/config.c:153
msgid "respect include directives on lookup"
msgstr "при търсене да се уважат и директивите за включване"
-#: builtin/config.c:155
+#: builtin/config.c:154
msgid "show origin of config (file, standard input, blob, command line)"
msgstr ""
"извеждане на мястото на задаване на настройката (файл, стандартен вход, "
"обект-BLOB, команден ред)"
-#: builtin/config.c:156
+#: builtin/config.c:155
msgid "value"
msgstr "СТОЙНОСТ"
-#: builtin/config.c:156
+#: builtin/config.c:155
msgid "with --get, use default value when missing entry"
msgstr "с „--get“ се използва стандартна СТОЙНОСТ при липсваща"
-#: builtin/config.c:332
+#: builtin/config.c:168
+#, c-format
+msgid "wrong number of arguments, should be %d"
+msgstr "неправилен брой аргументи, трябва да е точно %d"
+
+#: builtin/config.c:170
+#, c-format
+msgid "wrong number of arguments, should be from %d to %d"
+msgstr "неправилен брой аргументи, трябва да е от %d до %d включително"
+
+#: builtin/config.c:304
+#, c-format
+msgid "invalid key pattern: %s"
+msgstr "неправилен шаблон за ключ: „%s“"
+
+#: builtin/config.c:340
#, c-format
msgid "failed to format default config value: %s"
msgstr "неуспешно форматиране на стандартната стойност на настройка: %s"
-#: builtin/config.c:431
+#: builtin/config.c:397
+#, c-format
+msgid "cannot parse color '%s'"
+msgstr "„%s“ не може да се анализира като цвят"
+
+#: builtin/config.c:439
msgid "unable to parse default color value"
msgstr "неразпозната стойност на стандартния цвят"
-#: builtin/config.c:575
+#: builtin/config.c:492 builtin/config.c:724
+msgid "not in a git directory"
+msgstr "не е в директория под Git"
+
+#: builtin/config.c:495
+msgid "writing to stdin is not supported"
+msgstr "не се поддържа записване в стандартния вход"
+
+#: builtin/config.c:498
+msgid "writing config blobs is not supported"
+msgstr "обекти-BLOB в настройките не се поддържат"
+
+#: builtin/config.c:583
#, c-format
msgid ""
"# This is Git's per-user configuration file.\n"
@@ -8741,20 +10097,70 @@ msgstr ""
"#\tname = %s\n"
"#\temail = %s\n"
-#: builtin/config.c:603
+#: builtin/config.c:606
+msgid "only one config file at a time"
+msgstr "само по един конфигурационен файл"
+
+#: builtin/config.c:611
msgid "--local can only be used inside a git repository"
msgstr "„--local“ може да се използва само в хранилище"
-#: builtin/config.c:606
+#: builtin/config.c:614
msgid "--blob can only be used inside a git repository"
msgstr "„--blob“ може да се използва само в хранилище"
-#: builtin/config.c:735
+#: builtin/config.c:633
+msgid "$HOME not set"
+msgstr "променливата „HOME“ не е зададена"
+
+#: builtin/config.c:670
+msgid "--get-color and variable type are incoherent"
+msgstr "опцията „--get-color“ не съответства на вида на променливата"
+
+#: builtin/config.c:675
+msgid "only one action at a time"
+msgstr "само по едно действие"
+
+#: builtin/config.c:688
+msgid "--name-only is only applicable to --list or --get-regexp"
+msgstr ""
+"опцията „--name-only“ е приложима само към опциите „--list“ и „--get-regexp“"
+
+#: builtin/config.c:694
+msgid ""
+"--show-origin is only applicable to --get, --get-all, --get-regexp, and --"
+"list"
+msgstr ""
+"опцията „--show-origin“ е приложима само към опциите „--get“, „--get-all“, "
+"„--get-regexp“ и „--list“"
+
+#: builtin/config.c:700
+msgid "--default is only applicable to --get"
+msgstr "опцията „--default“ е приложима само към опцията „--get“"
+
+#: builtin/config.c:713
+#, c-format
+msgid "unable to read config file '%s'"
+msgstr "конфигурационният файл „%s“ не може да бъде прочетен"
+
+#: builtin/config.c:716
+msgid "error processing config file(s)"
+msgstr "грешка при обработката на конфигурационен файл"
+
+#: builtin/config.c:726
+msgid "editing stdin is not supported"
+msgstr "не се поддържа редактиране на стандартния вход"
+
+#: builtin/config.c:728
+msgid "editing blobs is not supported"
+msgstr "не се поддържа редактиране на обекти-BLOB"
+
+#: builtin/config.c:742
#, c-format
msgid "cannot create configuration file %s"
msgstr "конфигурационният файл „%s“ не може да бъде създаден"
-#: builtin/config.c:748
+#: builtin/config.c:755
#, c-format
msgid ""
"cannot overwrite multiple values with a single value\n"
@@ -8764,6 +10170,11 @@ msgstr ""
"За да промените „%s“, ползвайте регулярен израз или опциите „--add“ и „--"
"replace-all“."
+#: builtin/config.c:829 builtin/config.c:840
+#, c-format
+msgid "no such section: %s"
+msgstr "такъв раззел няма: %s"
+
#: builtin/count-objects.c:90
msgid "git count-objects [-v] [-H | --human-readable]"
msgstr "git count-objects [-v] [-H | --human-readable]"
@@ -8772,57 +10183,57 @@ msgstr "git count-objects [-v] [-H | --human-readable]"
msgid "print sizes in human readable format"
msgstr "извеждане на размерите на обектите във формат лесно четим от хора"
-#: builtin/describe.c:22
+#: builtin/describe.c:26
msgid "git describe [<options>] [<commit-ish>...]"
msgstr "git describe [ОПЦИЯ…] [УКАЗАТЕЛ_КЪМ_ПОДАВАНЕ…]"
-#: builtin/describe.c:23
+#: builtin/describe.c:27
msgid "git describe [<options>] --dirty"
msgstr "git describe [ОПЦИЯ…] --dirty"
-#: builtin/describe.c:57
+#: builtin/describe.c:62
msgid "head"
msgstr "основно"
-#: builtin/describe.c:57
+#: builtin/describe.c:62
msgid "lightweight"
msgstr "кратко"
-#: builtin/describe.c:57
+#: builtin/describe.c:62
msgid "annotated"
msgstr "анотирано"
-#: builtin/describe.c:267
+#: builtin/describe.c:272
#, c-format
msgid "annotated tag %s not available"
msgstr "не съществува анотиран етикет „%s“"
-#: builtin/describe.c:271
+#: builtin/describe.c:276
#, c-format
msgid "annotated tag %s has no embedded name"
msgstr "в анотирания етикет „%s“ липсва вградено име"
-#: builtin/describe.c:273
+#: builtin/describe.c:278
#, c-format
msgid "tag '%s' is really '%s' here"
msgstr "етикетът „%s“ тук е всъщност „%s“"
-#: builtin/describe.c:317
+#: builtin/describe.c:322
#, c-format
msgid "no tag exactly matches '%s'"
msgstr "никой етикет не напасва точно „%s“"
-#: builtin/describe.c:319
+#: builtin/describe.c:324
#, c-format
msgid "No exact match on refs or tags, searching to describe\n"
msgstr "Никоя версия и етикет не напасват точно. Търси се по описание\n"
-#: builtin/describe.c:366
+#: builtin/describe.c:378
#, c-format
msgid "finished search at %s\n"
msgstr "търсенето приключи при „%s“\n"
-#: builtin/describe.c:392
+#: builtin/describe.c:404
#, c-format
msgid ""
"No annotated tags can describe '%s'.\n"
@@ -8831,7 +10242,7 @@ msgstr ""
"Никой анотиран етикет не описва „%s“.\n"
"Съществуват и неанотирани етикети. Пробвайте с опцията „--tags“."
-#: builtin/describe.c:396
+#: builtin/describe.c:408
#, c-format
msgid ""
"No tags can describe '%s'.\n"
@@ -8840,12 +10251,12 @@ msgstr ""
"Никой етикет не описва „%s“.\n"
"Пробвайте с опцията „--always“ или създайте етикети."
-#: builtin/describe.c:426
+#: builtin/describe.c:438
#, c-format
msgid "traversed %lu commits\n"
msgstr "претърсени са %lu подавания\n"
-#: builtin/describe.c:429
+#: builtin/describe.c:441
#, c-format
msgid ""
"more than %i tags found; listed %i most recent\n"
@@ -8854,93 +10265,93 @@ msgstr ""
"открити са над %i етикета, изведени са последните %i,\n"
"търсенето бе прекратено при „%s“.\n"
-#: builtin/describe.c:497
+#: builtin/describe.c:509
#, c-format
msgid "describe %s\n"
msgstr "описание на „%s“\n"
-#: builtin/describe.c:500 builtin/log.c:502
+#: builtin/describe.c:512 builtin/log.c:508
#, c-format
msgid "Not a valid object name %s"
msgstr "Неправилно име на обект „%s“"
-#: builtin/describe.c:508
+#: builtin/describe.c:520
#, c-format
msgid "%s is neither a commit nor blob"
msgstr "„%s“ не е нито подаване, нито обект-BLOB"
-#: builtin/describe.c:522
+#: builtin/describe.c:534
msgid "find the tag that comes after the commit"
msgstr "откриване на етикета, който следва подаване"
-#: builtin/describe.c:523
+#: builtin/describe.c:535
msgid "debug search strategy on stderr"
msgstr ""
"извеждане на информация за трасиране на стратегията за търсене на "
"стандартната грешка"
-#: builtin/describe.c:524
+#: builtin/describe.c:536
msgid "use any ref"
msgstr "използване на произволен указател"
-#: builtin/describe.c:525
+#: builtin/describe.c:537
msgid "use any tag, even unannotated"
msgstr "използване на всеки етикет — включително и неанотираните"
-#: builtin/describe.c:526
+#: builtin/describe.c:538
msgid "always use long format"
msgstr "винаги да се ползва дългият формат"
-#: builtin/describe.c:527
+#: builtin/describe.c:539
msgid "only follow first parent"
msgstr "проследяване само на първия родител"
-#: builtin/describe.c:530
+#: builtin/describe.c:542
msgid "only output exact matches"
msgstr "извеждане само на точните съвпадения"
-#: builtin/describe.c:532
+#: builtin/describe.c:544
msgid "consider <n> most recent tags (default: 10)"
msgstr "да се търси само в този БРОЙ последни етикети (стандартно: 10)"
-#: builtin/describe.c:534
+#: builtin/describe.c:546
msgid "only consider tags matching <pattern>"
msgstr "да се търси само измежду етикетите напасващи този ШАБЛОН"
-#: builtin/describe.c:536
+#: builtin/describe.c:548
msgid "do not consider tags matching <pattern>"
msgstr "да не се търси измежду етикетите напасващи този ШАБЛОН"
-#: builtin/describe.c:538 builtin/name-rev.c:406
+#: builtin/describe.c:550 builtin/name-rev.c:424
msgid "show abbreviated commit object as fallback"
msgstr "извеждане на съкратено име на обект като резервен вариант"
-#: builtin/describe.c:539 builtin/describe.c:542
+#: builtin/describe.c:551 builtin/describe.c:554
msgid "mark"
msgstr "МАРКЕР"
-#: builtin/describe.c:540
+#: builtin/describe.c:552
msgid "append <mark> on dirty working tree (default: \"-dirty\")"
msgstr "добавяне на такъв МАРКЕР на работното дърво (стандартно е „-dirty“)"
-#: builtin/describe.c:543
+#: builtin/describe.c:555
msgid "append <mark> on broken working tree (default: \"-broken\")"
msgstr ""
"добавяне на такъв МАРКЕР на счупеното работно дърво (стандартно е „-broken“)"
-#: builtin/describe.c:561
+#: builtin/describe.c:573
msgid "--long is incompatible with --abbrev=0"
msgstr "Опциите „--long“ и „--abbrev=0“ са несъвместими"
-#: builtin/describe.c:590
+#: builtin/describe.c:602
msgid "No names found, cannot describe anything."
msgstr "Не са открити имена — нищо не може да бъде описано."
-#: builtin/describe.c:640
+#: builtin/describe.c:652
msgid "--dirty is incompatible with commit-ishes"
msgstr "опцията „--dirty“ е несъвместима с указател към подаване"
-#: builtin/describe.c:642
+#: builtin/describe.c:654
msgid "--broken is incompatible with commit-ishes"
msgstr "опцията „--broken“ е несъвместима с указател към подаване"
@@ -8954,50 +10365,50 @@ msgstr "„%s“: не е нито обикновен файл, нито сим
msgid "invalid option: %s"
msgstr "неправилна опция: %s"
-#: builtin/diff.c:356
+#: builtin/diff.c:363
msgid "Not a git repository"
msgstr "Не е хранилище на Git"
-#: builtin/diff.c:399
+#: builtin/diff.c:407
#, c-format
msgid "invalid object '%s' given."
msgstr "зададен е неправилен обект „%s“."
-#: builtin/diff.c:408
+#: builtin/diff.c:416
#, c-format
msgid "more than two blobs given: '%s'"
msgstr "зададени са повече от 2 обекта-BLOB: „%s“"
-#: builtin/diff.c:413
+#: builtin/diff.c:421
#, c-format
msgid "unhandled object '%s' given."
msgstr "зададен е неподдържан обект „%s“."
-#: builtin/difftool.c:29
+#: builtin/difftool.c:30
msgid "git difftool [<options>] [<commit> [<commit>]] [--] [<path>...]"
msgstr "git difftool [ОПЦИЯ…] [ПОДАВАНЕ [ПОДАВАНЕ]] [[--] ПЪТ…]"
-#: builtin/difftool.c:259
+#: builtin/difftool.c:260
#, c-format
msgid "failed: %d"
msgstr "неуспешно действие с изходен код: %d"
-#: builtin/difftool.c:301
+#: builtin/difftool.c:302
#, c-format
msgid "could not read symlink %s"
msgstr "символната връзка „%s“ не може да бъде прочетена"
-#: builtin/difftool.c:303
+#: builtin/difftool.c:304
#, c-format
msgid "could not read symlink file %s"
msgstr "файлът, сочен от символната връзка „%s“, не може да бъде прочетен"
-#: builtin/difftool.c:311
+#: builtin/difftool.c:312
#, c-format
msgid "could not read object %s for symlink %s"
msgstr "обектът „%s“ за символната връзка „%s“ не може да бъде прочетен"
-#: builtin/difftool.c:412
+#: builtin/difftool.c:413
msgid ""
"combined diff formats('-c' and '--cc') are not supported in\n"
"directory diff mode('-d' and '--dir-diff')."
@@ -9005,55 +10416,55 @@ msgstr ""
"комбинираните формати на разликите („-c“ и „--cc“) не се поддържат\n"
"в режима за разлики върху директории („-d“ и „--dir-diff“)."
-#: builtin/difftool.c:632
+#: builtin/difftool.c:633
#, c-format
msgid "both files modified: '%s' and '%s'."
msgstr "и двата файла са променени: „%s“ и „%s“."
-#: builtin/difftool.c:634
+#: builtin/difftool.c:635
msgid "working tree file has been left."
msgstr "работното дърво е изоставено."
-#: builtin/difftool.c:645
+#: builtin/difftool.c:646
#, c-format
msgid "temporary files exist in '%s'."
msgstr "в „%s“ има временни файлове."
-#: builtin/difftool.c:646
+#: builtin/difftool.c:647
msgid "you may want to cleanup or recover these."
msgstr "възможно е да ги изчистите или възстановите"
-#: builtin/difftool.c:695
+#: builtin/difftool.c:696
msgid "use `diff.guitool` instead of `diff.tool`"
msgstr "използвайте „diff.guitool“ вместо „diff.tool“"
-#: builtin/difftool.c:697
+#: builtin/difftool.c:698
msgid "perform a full-directory diff"
msgstr "разлика по директории"
-#: builtin/difftool.c:699
+#: builtin/difftool.c:700
msgid "do not prompt before launching a diff tool"
msgstr "стартиране на ПРОГРАМАта за разлики без предупреждение"
-#: builtin/difftool.c:704
+#: builtin/difftool.c:705
msgid "use symlinks in dir-diff mode"
msgstr "следване на символните връзки при разлика по директории"
-#: builtin/difftool.c:705
-msgid "<tool>"
+#: builtin/difftool.c:706
+msgid "tool"
msgstr "ПРОГРАМА"
-#: builtin/difftool.c:706
+#: builtin/difftool.c:707
msgid "use the specified diff tool"
msgstr "използване на указаната ПРОГРАМА"
-#: builtin/difftool.c:708
+#: builtin/difftool.c:709
msgid "print a list of diff tools that may be used with `--tool`"
msgstr ""
"извеждане на списък с всички ПРОГРАМи, които може да се ползват с опцията „--"
"tool“"
-#: builtin/difftool.c:711
+#: builtin/difftool.c:712
msgid ""
"make 'git-difftool' exit when an invoked diff tool returns a non - zero exit "
"code"
@@ -9061,165 +10472,161 @@ msgstr ""
"„git-difftool“ да спре работа, когато стартираната ПРОГРАМА завърши с "
"ненулев код"
-#: builtin/difftool.c:713
-msgid "<command>"
-msgstr "КОМАНДА"
-
-#: builtin/difftool.c:714
+#: builtin/difftool.c:715
msgid "specify a custom command for viewing diffs"
msgstr "команда за разглеждане на разлики"
-#: builtin/difftool.c:738
+#: builtin/difftool.c:739
msgid "no <tool> given for --tool=<tool>"
msgstr "не е зададена програма за „--tool=ПРОГРАМА“"
-#: builtin/difftool.c:745
+#: builtin/difftool.c:746
msgid "no <cmd> given for --extcmd=<cmd>"
msgstr "не е зададена команда за „--extcmd=КОМАНДА“"
-#: builtin/fast-export.c:27
+#: builtin/fast-export.c:29
msgid "git fast-export [rev-list-opts]"
msgstr "git fast-export [ОПЦИИ_ЗА_СПИСЪКА_С_ВЕРСИИ]"
-#: builtin/fast-export.c:1000
+#: builtin/fast-export.c:1006
msgid "show progress after <n> objects"
msgstr "Съобщение за напредъка на всеки такъв БРОЙ обекта"
-#: builtin/fast-export.c:1002
+#: builtin/fast-export.c:1008
msgid "select handling of signed tags"
msgstr "Как да се обработват подписаните етикети"
-#: builtin/fast-export.c:1005
+#: builtin/fast-export.c:1011
msgid "select handling of tags that tag filtered objects"
msgstr "Как да се обработват етикетите на филтрираните обекти"
-#: builtin/fast-export.c:1008
+#: builtin/fast-export.c:1014
msgid "Dump marks to this file"
msgstr "Запазване на маркерите в този ФАЙЛ"
-#: builtin/fast-export.c:1010
+#: builtin/fast-export.c:1016
msgid "Import marks from this file"
msgstr "Внасяне на маркерите от този ФАЙЛ"
-#: builtin/fast-export.c:1012
+#: builtin/fast-export.c:1018
msgid "Fake a tagger when tags lack one"
msgstr "Да се използва изкуствено име на човек при липса на задаващ етикета"
-#: builtin/fast-export.c:1014
+#: builtin/fast-export.c:1020
msgid "Output full tree for each commit"
msgstr "Извеждане на цялото дърво за всяко подаване"
-#: builtin/fast-export.c:1016
+#: builtin/fast-export.c:1022
msgid "Use the done feature to terminate the stream"
msgstr "Използване на маркер за завършване на потока"
-#: builtin/fast-export.c:1017
+#: builtin/fast-export.c:1023
msgid "Skip output of blob data"
msgstr "Без извеждане на съдържанието на обектите-BLOB"
-#: builtin/fast-export.c:1018
+#: builtin/fast-export.c:1024
msgid "refspec"
msgstr "УКАЗАТЕЛ_НА_ВЕРСИЯ"
-#: builtin/fast-export.c:1019
+#: builtin/fast-export.c:1025
msgid "Apply refspec to exported refs"
msgstr "Прилагане на УКАЗАТЕЛя_НА_ВЕРСИЯ към изнесените указатели"
-#: builtin/fast-export.c:1020
+#: builtin/fast-export.c:1026
msgid "anonymize output"
msgstr "анонимизиране на извежданата информация"
-#: builtin/fetch.c:26
+#: builtin/fetch.c:27
msgid "git fetch [<options>] [<repository> [<refspec>...]]"
msgstr "git fetch [ОПЦИЯ…] [ХРАНИЛИЩЕ [УКАЗАТЕЛ…]]"
-#: builtin/fetch.c:27
+#: builtin/fetch.c:28
msgid "git fetch [<options>] <group>"
msgstr "git fetch [ОПЦИЯ…] ГРУПА"
-#: builtin/fetch.c:28
+#: builtin/fetch.c:29
msgid "git fetch --multiple [<options>] [(<repository> | <group>)...]"
msgstr "git fetch --multiple [ОПЦИЯ…] [(ХРАНИЛИЩЕ | ГРУПА)…]"
-#: builtin/fetch.c:29
+#: builtin/fetch.c:30
msgid "git fetch --all [<options>]"
msgstr "git fetch --all [ОПЦИЯ…]"
-#: builtin/fetch.c:123 builtin/pull.c:193
+#: builtin/fetch.c:112 builtin/pull.c:193
msgid "fetch from all remotes"
msgstr "доставяне от всички отдалечени хранилища"
-#: builtin/fetch.c:125 builtin/pull.c:196
+#: builtin/fetch.c:114 builtin/pull.c:196
msgid "append to .git/FETCH_HEAD instead of overwriting"
msgstr "добавяне към „.git/FETCH_HEAD“ вместо замяна"
-#: builtin/fetch.c:127 builtin/pull.c:199
+#: builtin/fetch.c:116 builtin/pull.c:199
msgid "path to upload pack on remote end"
msgstr "отдалечен път, където да се качи пакетът"
-#: builtin/fetch.c:128 builtin/pull.c:201
+#: builtin/fetch.c:117 builtin/pull.c:201
msgid "force overwrite of local branch"
msgstr "принудително презаписване на локалния клон"
-#: builtin/fetch.c:130
+#: builtin/fetch.c:119
msgid "fetch from multiple remotes"
msgstr "доставяне от множество отдалечени хранилища"
-#: builtin/fetch.c:132 builtin/pull.c:203
+#: builtin/fetch.c:121 builtin/pull.c:203
msgid "fetch all tags and associated objects"
msgstr "доставяне на всички етикети и принадлежащи обекти"
-#: builtin/fetch.c:134
+#: builtin/fetch.c:123
msgid "do not fetch all tags (--no-tags)"
msgstr "без доставянето на всички етикети „--no-tags“"
-#: builtin/fetch.c:136
+#: builtin/fetch.c:125
msgid "number of submodules fetched in parallel"
msgstr "брой подмодули доставени паралелно"
-#: builtin/fetch.c:138 builtin/pull.c:206
+#: builtin/fetch.c:127 builtin/pull.c:206
msgid "prune remote-tracking branches no longer on remote"
msgstr "окастряне на клоните следящи вече несъществуващи отдалечени клони"
-#: builtin/fetch.c:140
+#: builtin/fetch.c:129
msgid "prune local tags no longer on remote and clobber changed tags"
msgstr ""
"окастряне на локалните етикети, които вече не съществуват в отдалеченото "
"хранилище и махане на променените"
-#: builtin/fetch.c:141 builtin/fetch.c:164 builtin/pull.c:131
+#: builtin/fetch.c:130 builtin/fetch.c:153 builtin/pull.c:131
msgid "on-demand"
msgstr "ПРИ НУЖДА"
-#: builtin/fetch.c:142
+#: builtin/fetch.c:131
msgid "control recursive fetching of submodules"
msgstr "управление на рекурсивното доставяне на подмодулите"
-#: builtin/fetch.c:146 builtin/pull.c:214
+#: builtin/fetch.c:135 builtin/pull.c:214
msgid "keep downloaded pack"
msgstr "запазване на изтеглените пакети с обекти"
-#: builtin/fetch.c:148
+#: builtin/fetch.c:137
msgid "allow updating of HEAD ref"
msgstr "позволяване на обновяването на указателя „HEAD“"
-#: builtin/fetch.c:151 builtin/fetch.c:157 builtin/pull.c:217
+#: builtin/fetch.c:140 builtin/fetch.c:146 builtin/pull.c:217
msgid "deepen history of shallow clone"
msgstr "задълбочаване на историята на плитко хранилище"
-#: builtin/fetch.c:153
+#: builtin/fetch.c:142
msgid "deepen history of shallow repository based on time"
msgstr "задълбочаване на историята на плитко хранилище до определено време"
-#: builtin/fetch.c:159 builtin/pull.c:220
+#: builtin/fetch.c:148 builtin/pull.c:220
msgid "convert to a complete repository"
msgstr "превръщане в пълно хранилище"
-#: builtin/fetch.c:162
+#: builtin/fetch.c:151
msgid "prepend this to submodule path output"
msgstr "добавяне на това пред пътя на подмодула"
-#: builtin/fetch.c:165
+#: builtin/fetch.c:154
msgid ""
"default for recursive fetching of submodules (lower priority than config "
"files)"
@@ -9227,101 +10634,105 @@ msgstr ""
"стандартно рекурсивно изтегляне на подмодулите (файловете с настройки са с "
"приоритет)"
-#: builtin/fetch.c:169 builtin/pull.c:223
+#: builtin/fetch.c:158 builtin/pull.c:223
msgid "accept refs that update .git/shallow"
msgstr "приемане на указатели, които обновяват „.git/shallow“"
-#: builtin/fetch.c:170 builtin/pull.c:225
+#: builtin/fetch.c:159 builtin/pull.c:225
msgid "refmap"
msgstr "КАРТА_С_УКАЗАТЕЛИ"
-#: builtin/fetch.c:171 builtin/pull.c:226
+#: builtin/fetch.c:160 builtin/pull.c:226
msgid "specify fetch refmap"
msgstr "указване на КАРТАта_С_УКАЗАТЕЛИ за доставяне"
-#: builtin/fetch.c:172 builtin/ls-remote.c:77 builtin/push.c:582
+#: builtin/fetch.c:161 builtin/ls-remote.c:77 builtin/push.c:582
#: builtin/send-pack.c:172
msgid "server-specific"
msgstr "специфични за сървъра"
-#: builtin/fetch.c:172 builtin/ls-remote.c:77 builtin/push.c:582
+#: builtin/fetch.c:161 builtin/ls-remote.c:77 builtin/push.c:582
#: builtin/send-pack.c:173
msgid "option to transmit"
msgstr "опция за пренос"
-#: builtin/fetch.c:442
+#: builtin/fetch.c:167
+msgid "report that we have only objects reachable from this object"
+msgstr "докладване, че всички обекти могат са достижими при започване от този"
+
+#: builtin/fetch.c:418
msgid "Couldn't find remote ref HEAD"
msgstr "Указателят „HEAD“ в отдалеченото хранилище не може да бъде открит"
-#: builtin/fetch.c:560
+#: builtin/fetch.c:552
#, c-format
msgid "configuration fetch.output contains invalid value %s"
msgstr "настройката „fetch.output“ е с неправилна стойност „%s“"
-#: builtin/fetch.c:653
+#: builtin/fetch.c:645
#, c-format
msgid "object %s not found"
msgstr "обектът „%s“ липсва"
-#: builtin/fetch.c:657
+#: builtin/fetch.c:649
msgid "[up to date]"
msgstr "[актуализиран]"
-#: builtin/fetch.c:670 builtin/fetch.c:750
+#: builtin/fetch.c:662 builtin/fetch.c:744
msgid "[rejected]"
msgstr "[отхвърлен]"
-#: builtin/fetch.c:671
+#: builtin/fetch.c:663
msgid "can't fetch in current branch"
msgstr "в текущия клон не може да се доставя"
-#: builtin/fetch.c:680
+#: builtin/fetch.c:672
msgid "[tag update]"
msgstr "[обновяване на етикетите]"
-#: builtin/fetch.c:681 builtin/fetch.c:714 builtin/fetch.c:730
-#: builtin/fetch.c:745
+#: builtin/fetch.c:673 builtin/fetch.c:708 builtin/fetch.c:724
+#: builtin/fetch.c:739
msgid "unable to update local ref"
msgstr "локален указател не може да бъде обновен"
-#: builtin/fetch.c:700
+#: builtin/fetch.c:694
msgid "[new tag]"
msgstr "[нов етикет]"
-#: builtin/fetch.c:703
+#: builtin/fetch.c:697
msgid "[new branch]"
msgstr "[нов клон]"
-#: builtin/fetch.c:706
+#: builtin/fetch.c:700
msgid "[new ref]"
msgstr "[нов указател]"
-#: builtin/fetch.c:745
+#: builtin/fetch.c:739
msgid "forced update"
msgstr "принудително обновяване"
-#: builtin/fetch.c:750
+#: builtin/fetch.c:744
msgid "non-fast-forward"
msgstr "същинско сливане"
-#: builtin/fetch.c:795
+#: builtin/fetch.c:790
#, c-format
msgid "%s did not send all necessary objects\n"
msgstr "хранилището „%s“ не изпрати всички необходими обекти\n"
-#: builtin/fetch.c:815
+#: builtin/fetch.c:811
#, c-format
msgid "reject %s because shallow roots are not allowed to be updated"
msgstr ""
"отхвърляне на върха „%s“, защото плитките хранилища не могат да бъдат "
"обновявани"
-#: builtin/fetch.c:903 builtin/fetch.c:999
+#: builtin/fetch.c:900 builtin/fetch.c:1011
#, c-format
msgid "From %.*s\n"
msgstr "От %.*s\n"
-#: builtin/fetch.c:914
+#: builtin/fetch.c:911
#, c-format
msgid ""
"some local refs could not be updated; try running\n"
@@ -9331,57 +10742,57 @@ msgstr ""
"„git remote prune %s“, за да премахнете остарелите клони, които\n"
"предизвикват конфликта"
-#: builtin/fetch.c:969
+#: builtin/fetch.c:981
#, c-format
msgid " (%s will become dangling)"
msgstr " (обектът „%s“ ще се окаже извън клон)"
-#: builtin/fetch.c:970
+#: builtin/fetch.c:982
#, c-format
msgid " (%s has become dangling)"
msgstr " (обектът „%s“ вече е извън клон)"
-#: builtin/fetch.c:1002
+#: builtin/fetch.c:1014
msgid "[deleted]"
msgstr "[изтрит]"
-#: builtin/fetch.c:1003 builtin/remote.c:1033
+#: builtin/fetch.c:1015 builtin/remote.c:1035
msgid "(none)"
msgstr "(нищо)"
-#: builtin/fetch.c:1026
+#: builtin/fetch.c:1038
#, c-format
msgid "Refusing to fetch into current branch %s of non-bare repository"
msgstr "Не може да доставите в текущия клон „%s“ на хранилище, което не е голо"
-#: builtin/fetch.c:1045
+#: builtin/fetch.c:1057
#, c-format
msgid "Option \"%s\" value \"%s\" is not valid for %s"
msgstr "Стойността „%2$s“ за опцията „%1$s“ не е съвместима с „%3$s“"
-#: builtin/fetch.c:1048
+#: builtin/fetch.c:1060
#, c-format
msgid "Option \"%s\" is ignored for %s\n"
msgstr "Опцията „%s“ се прескача при „%s“\n"
-#: builtin/fetch.c:1287
+#: builtin/fetch.c:1339
#, c-format
msgid "Fetching %s\n"
msgstr "Доставяне на „%s“\n"
-#: builtin/fetch.c:1289 builtin/remote.c:98
+#: builtin/fetch.c:1341 builtin/remote.c:99
#, c-format
msgid "Could not fetch %s"
msgstr "„%s“ не може да се достави"
-#: builtin/fetch.c:1335 builtin/fetch.c:1503
+#: builtin/fetch.c:1387 builtin/fetch.c:1555
msgid ""
"--filter can only be used with the remote configured in core.partialClone"
msgstr ""
"опцията „--filter“ може да се ползва само с отдалеченото хранилище указано в "
"настройката „core.partialClone“"
-#: builtin/fetch.c:1358
+#: builtin/fetch.c:1410
msgid ""
"No remote repository specified. Please, specify either a URL or a\n"
"remote name from which new revisions should be fetched."
@@ -9389,69 +10800,69 @@ msgstr ""
"Не сте указали отдалечено хранилище. Задайте или адрес, или име\n"
"на отдалечено хранилище, откъдето да се доставят новите версии."
-#: builtin/fetch.c:1395
+#: builtin/fetch.c:1447
msgid "You need to specify a tag name."
msgstr "Трябва да укажете име на етикет."
-#: builtin/fetch.c:1444
+#: builtin/fetch.c:1496
msgid "Negative depth in --deepen is not supported"
msgstr "Отрицателна дълбочина като аргумент на „--deepen“ не се поддържа"
-#: builtin/fetch.c:1446
+#: builtin/fetch.c:1498
msgid "--deepen and --depth are mutually exclusive"
msgstr "Опциите „--deepen“ и „--depth“ са несъвместими една с друга"
-#: builtin/fetch.c:1451
+#: builtin/fetch.c:1503
msgid "--depth and --unshallow cannot be used together"
msgstr "опциите „--depth“ и „--unshallow“ са несъвместими"
-#: builtin/fetch.c:1453
+#: builtin/fetch.c:1505
msgid "--unshallow on a complete repository does not make sense"
msgstr "не можете да използвате опцията „--unshallow“ върху пълно хранилище"
-#: builtin/fetch.c:1469
+#: builtin/fetch.c:1521
msgid "fetch --all does not take a repository argument"
msgstr "към „git fetch --all“ не можете да добавите аргумент — хранилище"
-#: builtin/fetch.c:1471
+#: builtin/fetch.c:1523
msgid "fetch --all does not make sense with refspecs"
msgstr ""
"към „git fetch --all“ не можете да добавите аргумент — указател на версия"
-#: builtin/fetch.c:1480
+#: builtin/fetch.c:1532
#, c-format
msgid "No such remote or remote group: %s"
msgstr "Няма нито отдалечено хранилище, нито група от хранилища на име „%s“"
-#: builtin/fetch.c:1487
+#: builtin/fetch.c:1539
msgid "Fetching a group and specifying refspecs does not make sense"
msgstr "Указването на група и указването на версия са несъвместими"
-#: builtin/fmt-merge-msg.c:15
+#: builtin/fmt-merge-msg.c:17
msgid ""
"git fmt-merge-msg [-m <message>] [--log[=<n>] | --no-log] [--file <file>]"
msgstr ""
"git fmt-merge-msg [-m СЪОБЩЕНИЕ] [--log[=БРОЙ] | --no-log] [--file ФАЙЛ]"
-#: builtin/fmt-merge-msg.c:666
+#: builtin/fmt-merge-msg.c:671
msgid "populate log with at most <n> entries from shortlog"
msgstr ""
"вмъкване на журнал състоящ се от не повече от БРОЙ записа от съкратения "
"журнал"
-#: builtin/fmt-merge-msg.c:669
+#: builtin/fmt-merge-msg.c:674
msgid "alias for --log (deprecated)"
msgstr "синоним на „--log“ (остаряло)"
-#: builtin/fmt-merge-msg.c:672
+#: builtin/fmt-merge-msg.c:677
msgid "text"
msgstr "ТЕКСТ"
-#: builtin/fmt-merge-msg.c:673
+#: builtin/fmt-merge-msg.c:678
msgid "use <text> as start of message"
msgstr "за начало на съобщението да се ползва ТЕКСТ"
-#: builtin/fmt-merge-msg.c:674
+#: builtin/fmt-merge-msg.c:679
msgid "file to read from"
msgstr "файл, от който да се чете"
@@ -9491,7 +10902,7 @@ msgstr "цитиране подходящо за tcl"
msgid "show only <n> matched refs"
msgstr "извеждане само на този БРОЙ напаснати указатели"
-#: builtin/for-each-ref.c:39 builtin/tag.c:421
+#: builtin/for-each-ref.c:39 builtin/tag.c:422
msgid "respect format colors"
msgstr "спазване на цветовете на форма̀та"
@@ -9515,82 +10926,82 @@ msgstr "извеждане само на указателите, които съ
msgid "print only refs which don't contain the commit"
msgstr "извеждане само на указателите, които не съдържат това ПОДАВАНЕ"
-#: builtin/fsck.c:569
+#: builtin/fsck.c:574
msgid "Checking object directories"
msgstr "Проверка на директориите с обекти"
-#: builtin/fsck.c:661
+#: builtin/fsck.c:666
msgid "git fsck [<options>] [<object>...]"
msgstr "git fsck [ОПЦИЯ…] [ОБЕКТ…]"
-#: builtin/fsck.c:667
+#: builtin/fsck.c:672
msgid "show unreachable objects"
msgstr "показване на недостижимите обекти"
-#: builtin/fsck.c:668
+#: builtin/fsck.c:673
msgid "show dangling objects"
msgstr "показване на обектите извън клоните"
-#: builtin/fsck.c:669
+#: builtin/fsck.c:674
msgid "report tags"
msgstr "показване на етикетите"
-#: builtin/fsck.c:670
+#: builtin/fsck.c:675
msgid "report root nodes"
msgstr "показване на кореновите възли"
-#: builtin/fsck.c:671
+#: builtin/fsck.c:676
msgid "make index objects head nodes"
msgstr "задаване на обекти от индекса да са коренови"
# FIXME bad message
-#: builtin/fsck.c:672
+#: builtin/fsck.c:677
msgid "make reflogs head nodes (default)"
msgstr "проследяване на указателите от журнала като глави (стандартно)"
-#: builtin/fsck.c:673
+#: builtin/fsck.c:678
msgid "also consider packs and alternate objects"
msgstr "допълнително да се проверяват пакетите и алтернативните обекти"
-#: builtin/fsck.c:674
+#: builtin/fsck.c:679
msgid "check only connectivity"
msgstr "проверка само на връзката"
-#: builtin/fsck.c:675
+#: builtin/fsck.c:680
msgid "enable more strict checking"
msgstr "по-строги проверки"
-#: builtin/fsck.c:677
+#: builtin/fsck.c:682
msgid "write dangling objects in .git/lost-found"
msgstr "запазване на обектите извън клоните в директорията „.git/lost-found“"
-#: builtin/fsck.c:678 builtin/prune.c:109
+#: builtin/fsck.c:683 builtin/prune.c:110
msgid "show progress"
msgstr "показване на напредъка"
-#: builtin/fsck.c:679
+#: builtin/fsck.c:684
msgid "show verbose names for reachable objects"
msgstr "показване на подробни имена на достижимите обекти"
-#: builtin/fsck.c:745
+#: builtin/fsck.c:750
msgid "Checking objects"
msgstr "Проверка на обектите"
-#: builtin/gc.c:33
+#: builtin/gc.c:34
msgid "git gc [<options>]"
msgstr "git gc [ОПЦИЯ…]"
-#: builtin/gc.c:88
+#: builtin/gc.c:90
#, c-format
msgid "Failed to fstat %s: %s"
msgstr "Неуспешно изпълнение на „fstat“ върху „%s“: %s"
-#: builtin/gc.c:452
+#: builtin/gc.c:455
#, c-format
msgid "Can't stat %s"
msgstr "Неуспешно изпълнение на „stat“ върху „%s“"
-#: builtin/gc.c:461
+#: builtin/gc.c:464
#, c-format
msgid ""
"The last gc run reported the following. Please correct the root cause\n"
@@ -9607,58 +11018,58 @@ msgstr ""
"\n"
"%s"
-#: builtin/gc.c:502
+#: builtin/gc.c:505
msgid "prune unreferenced objects"
msgstr "окастряне на обектите, към които нищо не сочи"
-#: builtin/gc.c:504
+#: builtin/gc.c:507
msgid "be more thorough (increased runtime)"
msgstr "изчерпателно търсене на боклука (за сметка на повече време работа)"
-#: builtin/gc.c:505
+#: builtin/gc.c:508
msgid "enable auto-gc mode"
msgstr "включване на автоматичното събиране на боклука (auto-gc)"
-#: builtin/gc.c:508
+#: builtin/gc.c:511
msgid "force running gc even if there may be another gc running"
msgstr ""
"изрично стартиране на събирането на боклука, дори и ако вече работи друго "
"събиране"
-#: builtin/gc.c:511
+#: builtin/gc.c:514
msgid "repack all other packs except the largest pack"
msgstr "препакетиране на всичко без най-големия пакет"
-#: builtin/gc.c:528
+#: builtin/gc.c:531
#, c-format
msgid "failed to parse gc.logexpiry value %s"
msgstr "неразпозната стойност на „gc.logexpiry“ %s"
-#: builtin/gc.c:539
+#: builtin/gc.c:542
#, c-format
msgid "failed to parse prune expiry value %s"
msgstr "неразпозната стойност на периода за окастряне: %s"
-#: builtin/gc.c:559
+#: builtin/gc.c:562
#, c-format
msgid "Auto packing the repository in background for optimum performance.\n"
msgstr ""
"Автоматично пакетиране н