summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--.mailmap1
-rw-r--r--Documentation/RelNotes/2.12.0.txt54
-rw-r--r--Documentation/blame-options.txt4
-rw-r--r--Documentation/config.txt24
-rw-r--r--Documentation/git-branch.txt7
-rw-r--r--Documentation/git-check-ref-format.txt6
-rw-r--r--Documentation/git-describe.txt15
-rw-r--r--Documentation/git-difftool.txt5
-rw-r--r--Documentation/git-for-each-ref.txt92
-rw-r--r--Documentation/git-gc.txt2
-rw-r--r--Documentation/git-init.txt4
-rw-r--r--Documentation/git-name-rev.txt13
-rw-r--r--Documentation/git-push.txt13
-rw-r--r--Documentation/git-reset.txt48
-rw-r--r--Documentation/git-rev-parse.txt4
-rw-r--r--Documentation/git-stash.txt5
-rw-r--r--Documentation/git-submodule.txt66
-rw-r--r--Documentation/git-worktree.txt2
-rw-r--r--Documentation/git.txt11
-rw-r--r--Documentation/gitattributes.txt10
-rw-r--r--Documentation/gitcore-tutorial.txt2
-rw-r--r--Documentation/gitcvs-migration.txt2
-rw-r--r--Documentation/gitdiffcore.txt2
-rw-r--r--Documentation/gitglossary.txt2
-rw-r--r--Documentation/gitremote-helpers.txt10
-rw-r--r--Documentation/gitrepository-layout.txt2
-rw-r--r--Documentation/gittutorial-2.txt2
-rw-r--r--Documentation/gittutorial.txt2
-rw-r--r--Documentation/gitworkflows.txt2
-rw-r--r--Documentation/glossary-content.txt6
-rw-r--r--Documentation/rev-list-options.txt4
-rw-r--r--Documentation/technical/api-gitattributes.txt86
-rw-r--r--Documentation/technical/api-parse-options.txt5
-rwxr-xr-xGIT-VERSION-GEN2
-rw-r--r--Makefile2
-rw-r--r--apply.c23
-rw-r--r--archive.c24
-rw-r--r--attr.c878
-rw-r--r--attr.h49
-rw-r--r--bisect.c9
-rw-r--r--builtin.h1
-rw-r--r--builtin/branch.c288
-rw-r--r--builtin/check-attr.c66
-rw-r--r--builtin/clean.c16
-rw-r--r--builtin/describe.c51
-rw-r--r--builtin/diff-tree.c4
-rw-r--r--builtin/diff.c9
-rw-r--r--builtin/difftool.c8
-rw-r--r--builtin/gc.c57
-rw-r--r--builtin/grep.c82
-rw-r--r--builtin/ls-files.c21
-rw-r--r--builtin/name-rev.c58
-rw-r--r--builtin/pack-objects.c152
-rw-r--r--builtin/rebase--helper.c40
-rw-r--r--builtin/receive-pack.c41
-rw-r--r--builtin/rev-parse.c26
-rw-r--r--builtin/rm.c6
-rw-r--r--builtin/show-branch.c42
-rw-r--r--builtin/tag.c60
-rw-r--r--builtin/worktree.c4
-rw-r--r--cache.h48
-rw-r--r--commit.c3
-rw-r--r--common-main.c3
-rw-r--r--compat/winansi.c4
-rw-r--r--connect.c94
-rw-r--r--contrib/coccinelle/free.cocci6
-rw-r--r--contrib/coccinelle/swap.cocci28
-rw-r--r--contrib/completion/git-completion.bash396
-rw-r--r--convert.c25
-rw-r--r--diff-no-index.c6
-rw-r--r--diff.c13
-rw-r--r--dir.c7
-rw-r--r--fetch-pack.c48
-rwxr-xr-xgit-add--interactive.perl2
-rw-r--r--git-compat-util.h10
-rwxr-xr-xgit-p4.py24
-rw-r--r--git-rebase--interactive.sh13
-rw-r--r--git.c1
-rw-r--r--graph.c11
-rw-r--r--line-range.c3
-rw-r--r--ll-merge.c33
-rw-r--r--merge-recursive.c122
-rw-r--r--object.c4
-rw-r--r--object.h2
-rw-r--r--oidset.c49
-rw-r--r--oidset.h45
-rw-r--r--pack-objects.h4
-rw-r--r--pack-revindex.c5
-rw-r--r--pathspec.c21
-rw-r--r--perl/Git/SVN.pm2
-rw-r--r--po/TEAMS5
-rw-r--r--po/bg.po7444
-rw-r--r--po/ca.po4894
-rw-r--r--po/de.po4331
-rw-r--r--po/fr.po4293
-rw-r--r--po/git.pot3997
-rw-r--r--po/ko.po4221
-rw-r--r--po/pt_PT.po4562
-rw-r--r--po/sv.po4275
-rw-r--r--po/vi.po4275
-rw-r--r--po/zh_CN.po4258
-rw-r--r--preload-index.c2
-rw-r--r--prio-queue.c4
-rw-r--r--progress.c11
-rw-r--r--ref-filter.c493
-rw-r--r--ref-filter.h7
-rw-r--r--refs.c121
-rw-r--r--refs/files-backend.c448
-rw-r--r--refs/refs-internal.h70
-rw-r--r--remote.c2
-rw-r--r--sha1_file.c76
-rw-r--r--strbuf.h4
-rwxr-xr-xt/perf/p5302-pack-index.sh7
-rwxr-xr-xt/t0003-attributes.sh26
-rwxr-xr-xt/t1300-repo-config.sh105
-rwxr-xr-xt/t1400-update-ref.sh27
-rwxr-xr-xt/t1500-rev-parse.sh17
-rwxr-xr-xt/t3203-branch-output.sh16
-rwxr-xr-xt/t3404-rebase-interactive.sh2
-rwxr-xr-xt/t4202-log.sh48
-rwxr-xr-xt/t5316-pack-delta-depth.sh93
-rwxr-xr-xt/t5400-send-pack.sh38
-rwxr-xr-xt/t5505-remote.sh2
-rwxr-xr-xt/t5512-ls-remote.sh9
-rwxr-xr-xt/t5545-push-options.sh15
-rwxr-xr-xt/t5550-http-fetch-dumb.sh9
-rwxr-xr-xt/t5601-clone.sh41
-rwxr-xr-xt/t6007-rev-list-cherry-pick-file.sh38
-rwxr-xr-xt/t6040-tracking-info.sh2
-rwxr-xr-xt/t6045-merge-rename-delete.sh23
-rwxr-xr-xt/t6120-describe.sh27
-rwxr-xr-xt/t6132-pathspec-exclude.sh6
-rwxr-xr-xt/t6300-for-each-ref.sh96
-rwxr-xr-xt/t6302-for-each-ref-filter.sh94
-rwxr-xr-xt/t6500-gc.sh15
-rwxr-xr-xt/t7004-tag.sh18
-rwxr-xr-xt/t7800-difftool.sh43
-rwxr-xr-xt/t7810-grep.sh66
-rwxr-xr-xt/t9822-git-p4-path-encoding.sh16
-rwxr-xr-xt/t9902-completion.sh561
-rw-r--r--tempfile.c8
-rw-r--r--transport-helper.c12
-rw-r--r--transport.c72
-rw-r--r--transport.h2
-rw-r--r--urlmatch.c137
-rw-r--r--urlmatch.h12
-rw-r--r--userdiff.c19
-rw-r--r--ws.c19
149 files changed, 34986 insertions, 18113 deletions
diff --git a/.gitignore b/.gitignore
index b1020b8..833ef3b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -114,6 +114,7 @@
/git-read-tree
/git-rebase
/git-rebase--am
+/git-rebase--helper
/git-rebase--interactive
/git-rebase--merge
/git-receive-pack
diff --git a/.mailmap b/.mailmap
index ab59b2f..e06526a 100644
--- a/.mailmap
+++ b/.mailmap
@@ -177,6 +177,7 @@ Paolo Bonzini <bonzini@gnu.org> <paolo.bonzini@lu.unisi.ch>
Pascal Obry <pascal@obry.net> <pascal.obry@gmail.com>
Pascal Obry <pascal@obry.net> <pascal.obry@wanadoo.fr>
Pat Notz <patnotz@gmail.com> <pknotz@sandia.gov>
+Patrick Steinhardt <ps@pks.im> <patrick.steinhardt@elego.de>
Paul Mackerras <paulus@samba.org> <paulus@dorrigo.(none)>
Paul Mackerras <paulus@samba.org> <paulus@pogo.(none)>
Peter Baumann <waste.manager@gmx.de> <Peter.B.Baumann@stud.informatik.uni-erlangen.de>
diff --git a/Documentation/RelNotes/2.12.0.txt b/Documentation/RelNotes/2.12.0.txt
index 0c6eed2..2915480 100644
--- a/Documentation/RelNotes/2.12.0.txt
+++ b/Documentation/RelNotes/2.12.0.txt
@@ -131,6 +131,9 @@ UI, Workflows & Features
other than the ones that are expected to be updated (i.e. branches,
remote-tracking branches and notes).
+ * Comes with more command line completion (in contrib/) for recently
+ introduced options.
+
Performance, Internal Implementation, Development Support etc.
@@ -436,6 +439,45 @@ notes for details).
with AsciiDoc. "make USE_ASCIIDOCTOR=YesPlease" to use it out of
the box to document our pages is getting closer to reality.
+ * Correct command line completion (in contrib/) on "git svn"
+ (merge 2cbad17642 ew/complete-svn-authorship-options later to maint).
+
+ * Incorrect usage help message for "git worktree prune" has been fixed.
+ (merge 2488dcab22 ps/worktree-prune-help-fix later to maint).
+
+ * Adjust a perf test to new world order where commands that do
+ require a repository are really strict about having a repository.
+ (merge c86000c1a7 rs/p5302-create-repositories-before-tests later to maint).
+
+ * "git log --graph" did not work well with "--name-only", even though
+ other forms of "diff" output were handled correctly.
+ (merge f5022b5fed jk/log-graph-name-only later to maint).
+
+ * The push-options given via the "--push-options" option were not
+ passed through to external remote helpers such as "smart HTTP" that
+ are invoked via the transport helper.
+
+ * The documentation explained what "git stash" does to the working
+ tree (after stashing away the local changes) in terms of "reset
+ --hard", which was exposing an unnecessary implementation detail.
+ (merge 20a7e06172 tg/stash-doc-cleanup later to maint).
+
+ * When "git p4" imports changelist that removes paths, it failed to
+ convert pathnames when the p4 used encoding different from the one
+ used on the Git side. This has been corrected.
+ (merge a8b05162e8 ls/p4-path-encoding later to maint).
+
+ * A new coccinelle rule that catches a check of !pointer before the
+ pointer is free(3)d, which most likely is a bug.
+ (merge ec6cd14c7a rs/cocci-check-free-only-null later to maint).
+
+ * "ls-files" run with pathspec has been micro-optimized to avoid
+ having to memmove(3) unnecessary bytes.
+ (merge 96f6d3f61a rs/ls-files-partial-optim later to maint).
+
+ * A hotfix for a topic already in 'master'.
+ (merge a4d92d579f js/mingw-isatty later to maint).
+
* Other minor doc, test and build updates and code cleanups.
(merge f2627d9b19 sb/submodule-config-cleanup later to maint).
(merge 384f1a167b sb/unpack-trees-cleanup later to maint).
@@ -444,3 +486,15 @@ notes for details).
(merge 0aaad415bc rs/absolute-pathdup later to maint).
(merge 4432dd6b5b rs/receive-pack-cleanup later to maint).
(merge 540a398e9c sg/mailmap-self later to maint).
+ (merge 209df269a6 nd/rev-list-all-includes-HEAD-doc later to maint).
+ (merge 941b9c5270 sb/doc-unify-bottom later to maint).
+ (merge 2aaf37b62c jk/doc-remote-helpers-markup-fix later to maint).
+ (merge e91461b332 jk/doc-submodule-markup-fix later to maint).
+ (merge 8ab9740d9f dp/submodule-doc-markup-fix later to maint).
+ (merge 0838cbc22f jk/tempfile-ferror-fclose-confusion later to maint).
+ (merge 115a40add6 dr/doc-check-ref-format-normalize later to maint).
+ (merge 133f0a299d gp/document-dotfiles-in-templates-are-not-copied later to maint).
+ (merge 2b35a9f4c7 bc/blame-doc-fix later to maint).
+ (merge 7e82388024 ps/doc-gc-aggressive-depth-update later to maint).
+ (merge 9993a7c5f1 bc/worktree-doc-fix-detached later to maint).
+ (merge e519eccdf4 rt/align-add-i-help-text later to maint).
diff --git a/Documentation/blame-options.txt b/Documentation/blame-options.txt
index 2669b87..dc41957 100644
--- a/Documentation/blame-options.txt
+++ b/Documentation/blame-options.txt
@@ -77,7 +77,7 @@ include::line-range-format.txt[]
terminal. Can't use `--progress` together with `--porcelain`
or `--incremental`.
--M|<num>|::
+-M[<num>]::
Detect moved or copied lines within a file. When a commit
moves or copies a block of lines (e.g. the original file
has A and then B, and the commit changes it to B and then
@@ -93,7 +93,7 @@ alphanumeric characters that Git must detect as moving/copying
within a file for it to associate those lines with the parent
commit. The default value is 20.
--C|<num>|::
+-C[<num>]::
In addition to `-M`, detect lines moved or copied from other
files that were modified in the same commit. This is
useful when you reorganize your program and move code
diff --git a/Documentation/config.txt b/Documentation/config.txt
index fc5a28a..47603f5 100644
--- a/Documentation/config.txt
+++ b/Documentation/config.txt
@@ -1402,6 +1402,12 @@ gc.autoDetach::
Make `git gc --auto` return immediately and run in background
if the system supports it. Default is true.
+gc.logExpiry::
+ If the file gc.log exists, then `git gc --auto` won't run
+ unless that file is more than 'gc.logExpiry' old. Default is
+ "1.day". See `gc.pruneExpire` for more ways to specify its
+ value.
+
gc.packRefs::
Running `git pack-refs` in a repository renders it
unclonable by Git versions prior to 1.5.1.2 over dumb
@@ -1919,7 +1925,10 @@ http.<url>.*::
must match exactly between the config key and the URL.
. Host/domain name (e.g., `example.com` in `https://example.com/`).
- This field must match exactly between the config key and the URL.
+ This field must match between the config key and the URL. It is
+ possible to specify a `*` as part of the host name to match all subdomains
+ at this level. `https://*.example.com/` for example would match
+ `https://foo.example.com/`, but not `https://foo.bar.example.com/`.
. Port number (e.g., `8080` in `http://example.com:8080/`).
This field must match exactly between the config key and the URL.
@@ -1954,6 +1963,17 @@ Environment variable settings always override any matches. The URLs that are
matched against are those given directly to Git commands. This means any URLs
visited as a result of a redirection do not participate in matching.
+ssh.variant::
+ Depending on the value of the environment variables `GIT_SSH` or
+ `GIT_SSH_COMMAND`, or the config setting `core.sshCommand`, Git
+ auto-detects whether to adjust its command-line parameters for use
+ with plink or tortoiseplink, as opposed to the default (OpenSSH).
++
+The config variable `ssh.variant` can be set to override this auto-detection;
+valid values are `ssh`, `plink`, `putty` or `tortoiseplink`. Any other value
+will be treated as normal ssh. This setting can be overridden via the
+environment variable `GIT_SSH_VARIANT`.
+
i18n.commitEncoding::
Character encoding the commit messages are stored in; Git itself
does not care per se, but this information is necessary e.g. when
@@ -2949,7 +2969,7 @@ submodule.alternateLocation::
value is set to `superproject` the submodule to be cloned computes
its alternates location relative to the superprojects alternate.
-submodule.alternateErrorStrategy
+submodule.alternateErrorStrategy::
Specifies how to treat errors with the alternates for a submodule
as computed via `submodule.alternateLocation`. Possible values are
`ignore`, `info`, `die`. Default is `die`.
diff --git a/Documentation/git-branch.txt b/Documentation/git-branch.txt
index 28d46cc..092f1bc 100644
--- a/Documentation/git-branch.txt
+++ b/Documentation/git-branch.txt
@@ -12,7 +12,7 @@ SYNOPSIS
[--list] [-v [--abbrev=<length> | --no-abbrev]]
[--column[=<options>] | --no-column]
[(--merged | --no-merged | --contains) [<commit>]] [--sort=<key>]
- [--points-at <object>] [<pattern>...]
+ [--points-at <object>] [--format=<format>] [<pattern>...]
'git branch' [--set-upstream | --track | --no-track] [-l] [-f] <branchname> [<start-point>]
'git branch' (--set-upstream-to=<upstream> | -u <upstream>) [<branchname>]
'git branch' --unset-upstream [<branchname>]
@@ -253,6 +253,11 @@ start-point is either a local or remote-tracking branch.
--points-at <object>::
Only list branches of the given object.
+--format <format>::
+ A string that interpolates `%(fieldname)` from the object
+ pointed at by a ref being shown. The format is the same as
+ that of linkgit:git-for-each-ref[1].
+
Examples
--------
diff --git a/Documentation/git-check-ref-format.txt b/Documentation/git-check-ref-format.txt
index 8611a99..92777ce 100644
--- a/Documentation/git-check-ref-format.txt
+++ b/Documentation/git-check-ref-format.txt
@@ -100,10 +100,10 @@ OPTIONS
--normalize::
Normalize 'refname' by removing any leading slash (`/`)
characters and collapsing runs of adjacent slashes between
- name components into a single slash. Iff the normalized
+ name components into a single slash. If the normalized
refname is valid then print it to standard output and exit
- with a status of 0. (`--print` is a deprecated way to spell
- `--normalize`.)
+ with a status of 0, otherwise exit with a non-zero status.
+ (`--print` is a deprecated way to spell `--normalize`.)
EXAMPLES
diff --git a/Documentation/git-describe.txt b/Documentation/git-describe.txt
index e4ac448..8755f3a 100644
--- a/Documentation/git-describe.txt
+++ b/Documentation/git-describe.txt
@@ -83,7 +83,20 @@ OPTIONS
--match <pattern>::
Only consider tags matching the given `glob(7)` pattern,
excluding the "refs/tags/" prefix. This can be used to avoid
- leaking private tags from the repository.
+ leaking private tags from the repository. If given multiple times, a
+ list of patterns will be accumulated, and tags matching any of the
+ patterns will be considered. Use `--no-match` to clear and reset the
+ list of patterns.
+
+--exclude <pattern>::
+ Do not consider tags matching the given `glob(7)` pattern, excluding
+ the "refs/tags/" prefix. This can be used to narrow the tag space and
+ find only tags matching some meaningful criteria. If given multiple
+ times, a list of patterns will be accumulated and tags matching any
+ of the patterns will be excluded. When combined with --match a tag will
+ be considered when it matches at least one --match pattern and does not
+ match any of the --exclude patterns. Use `--no-exclude` to clear and
+ reset the list of patterns.
--always::
Show uniquely abbreviated commit object as fallback.
diff --git a/Documentation/git-difftool.txt b/Documentation/git-difftool.txt
index 224fb30..96c26e6 100644
--- a/Documentation/git-difftool.txt
+++ b/Documentation/git-difftool.txt
@@ -86,10 +86,11 @@ instead. `--no-symlinks` is the default on Windows.
Additionally, `$BASE` is set in the environment.
-g::
---gui::
+--[no-]gui::
When 'git-difftool' is invoked with the `-g` or `--gui` option
the default diff tool will be read from the configured
- `diff.guitool` variable instead of `diff.tool`.
+ `diff.guitool` variable instead of `diff.tool`. The `--no-gui`
+ option can be used to override this setting.
--[no-]trust-exit-code::
'git-difftool' invokes a diff tool individually on each file.
diff --git a/Documentation/git-for-each-ref.txt b/Documentation/git-for-each-ref.txt
index abe13f3..111e1be 100644
--- a/Documentation/git-for-each-ref.txt
+++ b/Documentation/git-for-each-ref.txt
@@ -95,11 +95,20 @@ refname::
The name of the ref (the part after $GIT_DIR/).
For a non-ambiguous short name of the ref append `:short`.
The option core.warnAmbiguousRefs is used to select the strict
- abbreviation mode. If `strip=<N>` is appended, strips `<N>`
- slash-separated path components from the front of the refname
- (e.g., `%(refname:strip=2)` turns `refs/tags/foo` into `foo`.
- `<N>` must be a positive integer. If a displayed ref has fewer
- components than `<N>`, the command aborts with an error.
+ abbreviation mode. If `lstrip=<N>` (`rstrip=<N>`) is appended, strips `<N>`
+ slash-separated path components from the front (back) of the refname
+ (e.g. `%(refname:lstrip=2)` turns `refs/tags/foo` into `foo` and
+ `%(refname:rstrip=2)` turns `refs/tags/foo` into `refs`).
+ If `<N>` is a negative number, strip as many path components as
+ necessary from the specified end to leave `-<N>` path components
+ (e.g. `%(refname:lstrip=-2)` turns
+ `refs/tags/foo` into `tags/foo` and `%(refname:rstrip=-1)`
+ turns `refs/tags/foo` into `refs`). When the ref does not have
+ enough components, the result becomes an empty string if
+ stripping with positive <N>, or it becomes the full refname if
+ stripping with negative <N>. Neither is an error.
++
+`strip` can be used as a synomym to `lstrip`.
objecttype::
The type of the object (`blob`, `tree`, `commit`, `tag`).
@@ -110,21 +119,31 @@ objectsize::
objectname::
The object name (aka SHA-1).
For a non-ambiguous abbreviation of the object name append `:short`.
+ For an abbreviation of the object name with desired length append
+ `:short=<length>`, where the minimum length is MINIMUM_ABBREV. The
+ length may be exceeded to ensure unique object names.
upstream::
The name of a local ref which can be considered ``upstream''
- from the displayed ref. Respects `:short` in the same way as
- `refname` above. Additionally respects `:track` to show
- "[ahead N, behind M]" and `:trackshort` to show the terse
- version: ">" (ahead), "<" (behind), "<>" (ahead and behind),
- or "=" (in sync). Has no effect if the ref does not have
- tracking information associated with it.
+ from the displayed ref. Respects `:short`, `:lstrip` and
+ `:rstrip` in the same way as `refname` above. Additionally
+ respects `:track` to show "[ahead N, behind M]" and
+ `:trackshort` to show the terse version: ">" (ahead), "<"
+ (behind), "<>" (ahead and behind), or "=" (in sync). `:track`
+ also prints "[gone]" whenever unknown upstream ref is
+ encountered. Append `:track,nobracket` to show tracking
+ information without brackets (i.e "ahead N, behind M"). Has
+ no effect if the ref does not have tracking information
+ associated with it. All the options apart from `nobracket`
+ are mutually exclusive, but if used together the last option
+ is selected.
push::
- The name of a local ref which represents the `@{push}` location
- for the displayed ref. Respects `:short`, `:track`, and
- `:trackshort` options as `upstream` does. Produces an empty
- string if no `@{push}` ref is configured.
+ The name of a local ref which represents the `@{push}`
+ location for the displayed ref. Respects `:short`, `:lstrip`,
+ `:rstrip`, `:track`, and `:trackshort` options as `upstream`
+ does. Produces an empty string if no `@{push}` ref is
+ configured.
HEAD::
'*' if HEAD matches current ref (the checked out branch), ' '
@@ -149,6 +168,25 @@ align::
quoted, but if nested then only the topmost level performs
quoting.
+if::
+ Used as %(if)...%(then)...%(end) or
+ %(if)...%(then)...%(else)...%(end). If there is an atom with
+ value or string literal after the %(if) then everything after
+ the %(then) is printed, else if the %(else) atom is used, then
+ everything after %(else) is printed. We ignore space when
+ evaluating the string before %(then), this is useful when we
+ use the %(HEAD) atom which prints either "*" or " " and we
+ want to apply the 'if' condition only on the 'HEAD' ref.
+ Append ":equals=<string>" or ":notequals=<string>" to compare
+ the value between the %(if:...) and %(then) atoms with the
+ given string.
+
+symref::
+ The ref which the given symbolic ref refers to. If not a
+ symbolic ref, nothing is printed. Respects the `:short`,
+ `:lstrip` and `:rstrip` options in the same way as `refname`
+ above.
+
In addition to the above, for commit and tag objects, the header
field names (`tree`, `parent`, `object`, `type`, and `tag`) can
be used to specify the value in the header field.
@@ -186,6 +224,14 @@ As a special case for the date-type fields, you may specify a format for
the date by adding `:` followed by date format name (see the
values the `--date` option to linkgit:git-rev-list[1] takes).
+Some atoms like %(align) and %(if) always require a matching %(end).
+We call them "opening atoms" and sometimes denote them as %($open).
+
+When a scripting language specific quoting is in effect, everything
+between a top-level opening atom and its matching %(end) is evaluated
+according to the semantics of the opening atom and only its result
+from the top-level is quoted.
+
EXAMPLES
--------
@@ -273,6 +319,22 @@ eval=`git for-each-ref --shell --format="$fmt" \
eval "$eval"
------------
+
+An example to show the usage of %(if)...%(then)...%(else)...%(end).
+This prefixes the current branch with a star.
+
+------------
+git for-each-ref --format="%(if)%(HEAD)%(then)* %(else) %(end)%(refname:short)" refs/heads/
+------------
+
+
+An example to show the usage of %(if)...%(then)...%(end).
+This prints the authorname, if present.
+
+------------
+git for-each-ref --format="%(refname)%(if)%(authorname)%(then) Authored by: %(authorname)%(end)"
+------------
+
SEE ALSO
--------
linkgit:git-show-ref[1]
diff --git a/Documentation/git-gc.txt b/Documentation/git-gc.txt
index 852b72c..571b5a7 100644
--- a/Documentation/git-gc.txt
+++ b/Documentation/git-gc.txt
@@ -127,7 +127,7 @@ the documentation for the --window' option in linkgit:git-repack[1] for
more details. This defaults to 250.
Similarly, the optional configuration variable `gc.aggressiveDepth`
-controls --depth option in linkgit:git-repack[1]. This defaults to 250.
+controls --depth option in linkgit:git-repack[1]. This defaults to 50.
The optional configuration variable `gc.pruneExpire` controls how old
the unreferenced loose objects have to be before they are pruned. The
diff --git a/Documentation/git-init.txt b/Documentation/git-init.txt
index 9d27197..3c5a67f 100644
--- a/Documentation/git-init.txt
+++ b/Documentation/git-init.txt
@@ -116,8 +116,8 @@ does not exist, it will be created.
TEMPLATE DIRECTORY
------------------
-The template directory contains files and directories that will be copied to
-the `$GIT_DIR` after it is created.
+Files and directories in the template directory whose name do not start with a
+dot will be copied to the `$GIT_DIR` after it is created.
The template directory will be one of the following (in order):
diff --git a/Documentation/git-name-rev.txt b/Documentation/git-name-rev.txt
index ca28fb8..e8e68f5 100644
--- a/Documentation/git-name-rev.txt
+++ b/Documentation/git-name-rev.txt
@@ -26,7 +26,18 @@ OPTIONS
--refs=<pattern>::
Only use refs whose names match a given shell pattern. The pattern
- can be one of branch name, tag name or fully qualified ref name.
+ can be one of branch name, tag name or fully qualified ref name. If
+ given multiple times, use refs whose names match any of the given shell
+ patterns. Use `--no-refs` to clear any previous ref patterns given.
+
+--exclude=<pattern>::
+ Do not use any ref whose name matches a given shell pattern. The
+ pattern can be one of branch name, tag name or fully qualified ref
+ name. If given multiple times, a ref will be excluded when it matches
+ any of the given patterns. When used together with --refs, a ref will
+ be used as a match only when it matches at least one --refs pattern and
+ does not match any --exclude patterns. Use `--no-exclude` to clear the
+ list of exclude patterns.
--all::
List all commits reachable from all refs
diff --git a/Documentation/git-push.txt b/Documentation/git-push.txt
index 8eefabd..1624a35 100644
--- a/Documentation/git-push.txt
+++ b/Documentation/git-push.txt
@@ -272,7 +272,7 @@ origin +master` to force a push to the `master` branch). See the
standard error stream is not directed to a terminal.
--no-recurse-submodules::
---recurse-submodules=check|on-demand|no::
+--recurse-submodules=check|on-demand|only|no::
May be used to make sure all submodule commits used by the
revisions to be pushed are available on a remote-tracking branch.
If 'check' is used Git will verify that all submodule commits that
@@ -280,11 +280,12 @@ origin +master` to force a push to the `master` branch). See the
remote of the submodule. If any commits are missing the push will
be aborted and exit with non-zero status. If 'on-demand' is used
all submodules that changed in the revisions to be pushed will be
- pushed. If on-demand was not able to push all necessary revisions
- it will also be aborted and exit with non-zero status. A value of
- 'no' or using `--no-recurse-submodules` can be used to override the
- push.recurseSubmodules configuration variable when no submodule
- recursion is required.
+ pushed. If on-demand was not able to push all necessary revisions it will
+ also be aborted and exit with non-zero status. If 'only' is used all
+ submodules will be recursively pushed while the superproject is left
+ unpushed. A value of 'no' or using `--no-recurse-submodules` can be used
+ to override the push.recurseSubmodules configuration variable when no
+ submodule recursion is required.
--[no-]verify::
Toggle the pre-push hook (see linkgit:githooks[5]). The
diff --git a/Documentation/git-reset.txt b/Documentation/git-reset.txt
index 25432d9..8a21198 100644
--- a/Documentation/git-reset.txt
+++ b/Documentation/git-reset.txt
@@ -292,6 +292,54 @@ $ git reset --keep start <3>
<3> But you can use "reset --keep" to remove the unwanted commit after
you switched to "branch2".
+Split a commit apart into a sequence of commits::
++
+Suppose that you have created lots of logically separate changes and commited
+them together. Then, later you decide that it might be better to have each
+logical chunk associated with its own commit. You can use git reset to rewind
+history without changing the contents of your local files, and then successively
+use `git add -p` to interactively select which hunks to include into each commit,
+using `git commit -c` to pre-populate the commit message.
++
+------------
+$ git reset -N HEAD^ <1>
+$ git add -p <2>
+$ git diff --cached <3>
+$ git commit -c HEAD@{1} <4>
+... <5>
+$ git add ... <6>
+$ git diff --cached <7>
+$ git commit ... <8>
+------------
++
+<1> First, reset the history back one commit so that we remove the original
+ commit, but leave the working tree with all the changes. The -N ensures
+ that any new files added with HEAD are still marked so that git add -p
+ will find them.
+<2> Next, we interactively select diff hunks to add using the git add -p
+ facility. This will ask you about each diff hunk in sequence and you can
+ use simple commands such as "yes, include this", "No don't include this"
+ or even the very powerful "edit" facility.
+<3> Once satisfied with the hunks you want to include, you should verify what
+ has been prepared for the first commit by using git diff --cached. This
+ shows all the changes that have been moved into the index and are about
+ to be committed.
+<4> Next, commit the changes stored in the index. The -c option specifies to
+ pre-populate the commit message from the original message that you started
+ with in the first commit. This is helpful to avoid retyping it. The HEAD@{1}
+ is a special notation for the commit that HEAD used to be at prior to the
+ original reset commit (1 change ago). See linkgit:git-reflog[1] for more
+ details. You may also use any other valid commit reference.
+<5> You can repeat steps 2-4 multiple times to break the original code into
+ any number of commits.
+<6> Now you've split out many of the changes into their own commits, and might
+ no longer use the patch mode of git add, in order to select all remaining
+ uncommitted changes.
+<7> Once again, check to verify that you've included what you want to. You may
+ also wish to verify that git diff doesn't show any remaining changes to be
+ committed later.
+<8> And finally create the final commit.
+
DISCUSSION
----------
diff --git a/Documentation/git-rev-parse.txt b/Documentation/git-rev-parse.txt
index 7241e96..91c02b8 100644
--- a/Documentation/git-rev-parse.txt
+++ b/Documentation/git-rev-parse.txt
@@ -217,6 +217,10 @@ If `$GIT_DIR` is not defined and the current directory
is not detected to lie in a Git repository or work tree
print a message to stderr and exit with nonzero status.
+--absolute-git-dir::
+ Like `--git-dir`, but its output is always the canonicalized
+ absolute path.
+
--git-common-dir::
Show `$GIT_COMMON_DIR` if defined, else `$GIT_DIR`.
diff --git a/Documentation/git-stash.txt b/Documentation/git-stash.txt
index 2e9cef0..2e9e344 100644
--- a/Documentation/git-stash.txt
+++ b/Documentation/git-stash.txt
@@ -47,8 +47,9 @@ OPTIONS
save [-p|--patch] [-k|--[no-]keep-index] [-u|--include-untracked] [-a|--all] [-q|--quiet] [<message>]::
- Save your local modifications to a new 'stash', and run `git reset
- --hard` to revert them. The <message> part is optional and gives
+ Save your local modifications to a new 'stash' and roll them
+ back to HEAD (in the working tree and in the index).
+ The <message> part is optional and gives
the description along with the stashed state. For quickly making
a snapshot, you can omit _both_ "save" and <message>, but giving
only <message> does not trigger this action to prevent a misspelled
diff --git a/Documentation/git-submodule.txt b/Documentation/git-submodule.txt
index 918bd1d..8acc72e 100644
--- a/Documentation/git-submodule.txt
+++ b/Documentation/git-submodule.txt
@@ -9,17 +9,12 @@ git-submodule - Initialize, update or inspect submodules
SYNOPSIS
--------
[verse]
-'git submodule' [--quiet] add [-b <branch>] [-f|--force] [--name <name>]
- [--reference <repository>] [--depth <depth>] [--] <repository> [<path>]
+'git submodule' [--quiet] add [<options>] [--] <repository> [<path>]
'git submodule' [--quiet] status [--cached] [--recursive] [--] [<path>...]
'git submodule' [--quiet] init [--] [<path>...]
'git submodule' [--quiet] deinit [-f|--force] (--all|[--] <path>...)
-'git submodule' [--quiet] update [--init] [--remote] [-N|--no-fetch]
- [--[no-]recommend-shallow] [-f|--force] [--rebase|--merge]
- [--reference <repository>] [--depth <depth>] [--recursive]
- [--jobs <n>] [--] [<path>...]
-'git submodule' [--quiet] summary [--cached|--files] [(-n|--summary-limit) <n>]
- [commit] [--] [<path>...]
+'git submodule' [--quiet] update [<options>] [--] [<path>...]
+'git submodule' [--quiet] summary [<options>] [--] [<path>...]
'git submodule' [--quiet] foreach [--recursive] <command>
'git submodule' [--quiet] sync [--recursive] [--] [<path>...]
'git submodule' [--quiet] absorbgitdirs [--] [<path>...]
@@ -63,7 +58,7 @@ if you choose to go that route.
COMMANDS
--------
-add::
+add [-b <branch>] [-f|--force] [--name <name>] [--reference <repository>] [--depth <depth>] [--] <repository> [<path>]::
Add the given repository as a submodule at the given path
to the changeset to be committed next to the current
project: the current project is termed the "superproject".
@@ -104,7 +99,7 @@ together in the same relative location, and only the
superproject's URL needs to be provided: git-submodule will correctly
locate the submodule using the relative URL in .gitmodules.
-status::
+status [--cached] [--recursive] [--] [<path>...]::
Show the status of the submodules. This will print the SHA-1 of the
currently checked out commit for each submodule, along with the
submodule path and the output of 'git describe' for the
@@ -121,7 +116,7 @@ submodules with respect to the commit recorded in the index or the HEAD,
linkgit:git-status[1] and linkgit:git-diff[1] will provide that information
too (and can also report changes to a submodule's work tree).
-init::
+init [--] [<path>...]::
Initialize the submodules recorded in the index (which were
added and committed elsewhere) by copying submodule
names and urls from .gitmodules to .git/config.
@@ -136,7 +131,7 @@ init::
the explicit 'init' step if you do not intend to customize
any submodule locations.
-deinit::
+deinit [-f|--force] (--all|[--] <path>...)::
Unregister the given submodules, i.e. remove the whole
`submodule.$name` section from .git/config together with their work
tree. Further calls to `git submodule update`, `git submodule foreach`
@@ -152,20 +147,20 @@ instead of deinit-ing everything, to prevent mistakes.
If `--force` is specified, the submodule's working tree will
be removed even if it contains local modifications.
-update::
+update [--init] [--remote] [-N|--no-fetch] [--[no-]recommend-shallow] [-f|--force] [--checkout|--rebase|--merge] [--reference <repository>] [--depth <depth>] [--recursive] [--jobs <n>] [--] [<path>...]::
+
--
Update the registered submodules to match what the superproject
expects by cloning missing submodules and updating the working tree of
the submodules. The "updating" can be done in several ways depending
on command line options and the value of `submodule.<name>.update`
-configuration variable. Supported update procedures are:
+configuration variable. The command line option takes precedence over
+the configuration variable. if neither is given, a checkout is performed.
+update procedures supported both from the command line as well as setting
+`submodule.<name>.update`:
checkout;; the commit recorded in the superproject will be
- checked out in the submodule on a detached HEAD. This is
- done when `--checkout` option is given, or no option is
- given, and `submodule.<name>.update` is unset, or if it is
- set to 'checkout'.
+ checked out in the submodule on a detached HEAD.
+
If `--force` is specified, the submodule will be checked out (using
`git checkout --force` if appropriate), even if the commit specified
@@ -173,23 +168,21 @@ in the index of the containing repository already matches the commit
checked out in the submodule.
rebase;; the current branch of the submodule will be rebased
- onto the commit recorded in the superproject. This is done
- when `--rebase` option is given, or no option is given, and
- `submodule.<name>.update` is set to 'rebase'.
+ onto the commit recorded in the superproject.
merge;; the commit recorded in the superproject will be merged
- into the current branch in the submodule. This is done
- when `--merge` option is given, or no option is given, and
- `submodule.<name>.update` is set to 'merge'.
+ into the current branch in the submodule.
+
+The following procedures are only available via the `submodule.<name>.update`
+configuration variable:
custom command;; arbitrary shell command that takes a single
argument (the sha1 of the commit recorded in the
- superproject) is executed. This is done when no option is
- given, and `submodule.<name>.update` has the form of
- '!command'.
+ superproject) is executed. When `submodule.<name>.update`
+ is set to '!command', the remainder after the exclamation mark
+ is the custom command.
-When no option is given and `submodule.<name>.update` is set to 'none',
-the submodule is not updated.
+ none;; the submodule is not updated.
If the submodule is not yet initialized, and you just want to use the
setting as stored in .gitmodules, you can automatically initialize the
@@ -198,7 +191,7 @@ submodule with the `--init` option.
If `--recursive` is specified, this command will recurse into the
registered submodules, and update any nested submodules within.
--
-summary::
+summary [--cached|--files] [(-n|--summary-limit) <n>] [commit] [--] [<path>...]::
Show commit summary between the given commit (defaults to HEAD) and
working tree/index. For a submodule in question, a series of commits
in the submodule between the given super project commit and the
@@ -211,7 +204,7 @@ summary::
Using the `--submodule=log` option with linkgit:git-diff[1] will provide that
information too.
-foreach::
+foreach [--recursive] <command>::
Evaluates an arbitrary shell command in each checked out submodule.
The command has access to the variables $name, $path, $sha1 and
$toplevel:
@@ -228,11 +221,14 @@ foreach::
the processing to terminate. This can be overridden by adding '|| :'
to the end of the command.
+
-As an example, +git submodule foreach \'echo $path {backtick}git
-rev-parse HEAD{backtick}'+ will show the path and currently checked out
-commit for each submodule.
+As an example, the command below will show the path and currently
+checked out commit for each submodule:
++
+--------------
+git submodule foreach 'echo $path `git rev-parse HEAD`'
+--------------
-sync::
+sync [--recursive] [--] [<path>...]::
Synchronizes submodules' remote URL configuration setting
to the value specified in .gitmodules. It will only affect those
submodules which already have a URL entry in .git/config (that is the
diff --git a/Documentation/git-worktree.txt b/Documentation/git-worktree.txt
index e257c19..553cf84 100644
--- a/Documentation/git-worktree.txt
+++ b/Documentation/git-worktree.txt
@@ -52,7 +52,7 @@ is linked to the current repository, sharing everything except working
directory specific files such as HEAD, index, etc. `-` may also be
specified as `<branch>`; it is synonymous with `@{-1}`.
+
-If `<branch>` is omitted and neither `-b` nor `-B` nor `--detached` used,
+If `<branch>` is omitted and neither `-b` nor `-B` nor `--detach` used,
then, as a convenience, a new branch based at HEAD is created automatically,
as if `-b $(basename <path>)` was specified.
diff --git a/Documentation/git.txt b/Documentation/git.txt
index 4f208fa..df0941d 100644
--- a/Documentation/git.txt
+++ b/Documentation/git.txt
@@ -44,6 +44,11 @@ unreleased) version of Git, that is available from the 'master'
branch of the `git.git` repository.
Documentation for older releases are available here:
+* link:v2.12.0/git.html[documentation for release 2.12.0]
+
+* release notes for
+ link:RelNotes/2.12.0.txt[2.12].
+
* link:v2.11.1/git.html[documentation for release 2.11.1]
* release notes for
@@ -1020,6 +1025,12 @@ Usually it is easier to configure any desired options through your
personal `.ssh/config` file. Please consult your ssh documentation
for further details.
+`GIT_SSH_VARIANT`::
+ If this environment variable is set, it overrides Git's autodetection
+ whether `GIT_SSH`/`GIT_SSH_COMMAND`/`core.sshCommand` refer to OpenSSH,
+ plink or tortoiseplink. This variable overrides the config setting
+ `ssh.variant` that serves the same purpose.
+
`GIT_ASKPASS`::
If this environment variable is set, then Git commands which need to
acquire passwords or passphrases (e.g. for HTTP or IMAP authentication)
diff --git a/Documentation/gitattributes.txt b/Documentation/gitattributes.txt
index e0b66c1..a53d093 100644
--- a/Documentation/gitattributes.txt
+++ b/Documentation/gitattributes.txt
@@ -21,9 +21,11 @@ Each line in `gitattributes` file is of form:
pattern attr1 attr2 ...
That is, a pattern followed by an attributes list,
-separated by whitespaces. When the pattern matches the
-path in question, the attributes listed on the line are given to
-the path.
+separated by whitespaces. Leading and trailing whitespaces are
+ignored. Lines that begin with '#' are ignored. Patterns
+that begin with a double quote are quoted in C style.
+When the pattern matches the path in question, the attributes
+listed on the line are given to the path.
Each attribute can be in one of these states for a given path:
@@ -86,7 +88,7 @@ is either not set or empty, $HOME/.config/git/attributes is used instead.
Attributes for all users on a system should be placed in the
`$(prefix)/etc/gitattributes` file.
-Sometimes you would need to override an setting of an attribute
+Sometimes you would need to override a setting of an attribute
for a path to `Unspecified` state. This can be done by listing
the name of the attribute prefixed with an exclamation point `!`.
diff --git a/Documentation/gitcore-tutorial.txt b/Documentation/gitcore-tutorial.txt
index 22309cf..3a0ec8c 100644
--- a/Documentation/gitcore-tutorial.txt
+++ b/Documentation/gitcore-tutorial.txt
@@ -1658,4 +1658,4 @@ link:user-manual.html[The Git User's Manual]
GIT
---
-Part of the linkgit:git[1] suite.
+Part of the linkgit:git[1] suite
diff --git a/Documentation/gitcvs-migration.txt b/Documentation/gitcvs-migration.txt
index 4c6143c..1cd1283 100644
--- a/Documentation/gitcvs-migration.txt
+++ b/Documentation/gitcvs-migration.txt
@@ -203,4 +203,4 @@ link:user-manual.html[The Git User's Manual]
GIT
---
-Part of the linkgit:git[1] suite.
+Part of the linkgit:git[1] suite
diff --git a/Documentation/gitdiffcore.txt b/Documentation/gitdiffcore.txt
index 08cf622..46bc6d0 100644
--- a/Documentation/gitdiffcore.txt
+++ b/Documentation/gitdiffcore.txt
@@ -288,4 +288,4 @@ link:user-manual.html[The Git User's Manual]
GIT
---
-Part of the linkgit:git[1] suite.
+Part of the linkgit:git[1] suite
diff --git a/Documentation/gitglossary.txt b/Documentation/gitglossary.txt
index 212e254..571f640 100644
--- a/Documentation/gitglossary.txt
+++ b/Documentation/gitglossary.txt
@@ -24,4 +24,4 @@ link:user-manual.html[The Git User's Manual]
GIT
---
-Part of the linkgit:git[1] suite.
+Part of the linkgit:git[1] suite
diff --git a/Documentation/gitremote-helpers.txt b/Documentation/gitremote-helpers.txt
index 9e8681f..e4b785e 100644
--- a/Documentation/gitremote-helpers.txt
+++ b/Documentation/gitremote-helpers.txt
@@ -452,16 +452,20 @@ set by Git if the remote helper has the 'option' capability.
Request the helper to perform a force update. Defaults to
'false'.
-'option cloning {'true'|'false'}::
+'option cloning' {'true'|'false'}::
Notify the helper this is a clone request (i.e. the current
repository is guaranteed empty).
-'option update-shallow {'true'|'false'}::
+'option update-shallow' {'true'|'false'}::
Allow to extend .git/shallow if the new refs require it.
-'option pushcert {'true'|'false'}::
+'option pushcert' {'true'|'false'}::
GPG sign pushes.
+'option push-option <string>::
+ Transmit <string> as a push option. As the a push option
+ must not contain LF or NUL characters, the string is not encoded.
+
SEE ALSO
--------
linkgit:git-remote[1]
diff --git a/Documentation/gitrepository-layout.txt b/Documentation/gitrepository-layout.txt
index a5f99cb..f51ed4e 100644
--- a/Documentation/gitrepository-layout.txt
+++ b/Documentation/gitrepository-layout.txt
@@ -289,4 +289,4 @@ link:user-manual.html[The Git User's Manual]
GIT
---
-Part of the linkgit:git[1] suite.
+Part of the linkgit:git[1] suite
diff --git a/Documentation/gittutorial-2.txt b/Documentation/gittutorial-2.txt
index 30d2119..e0976f6 100644
--- a/Documentation/gittutorial-2.txt
+++ b/Documentation/gittutorial-2.txt
@@ -433,4 +433,4 @@ link:user-manual.html[The Git User's Manual]
GIT
---
-Part of the linkgit:git[1] suite.
+Part of the linkgit:git[1] suite
diff --git a/Documentation/gittutorial.txt b/Documentation/gittutorial.txt
index b3b58d3..794b833 100644
--- a/Documentation/gittutorial.txt
+++ b/Documentation/gittutorial.txt
@@ -674,4 +674,4 @@ link:user-manual.html[The Git User's Manual]
GIT
---
-Part of the linkgit:git[1] suite.
+Part of the linkgit:git[1] suite
diff --git a/Documentation/gitworkflows.txt b/Documentation/gitworkflows.txt
index f16c414..177610e 100644
--- a/Documentation/gitworkflows.txt
+++ b/Documentation/gitworkflows.txt
@@ -477,4 +477,4 @@ linkgit:git-am[1]
GIT
---
-Part of the linkgit:git[1] suite.
+Part of the linkgit:git[1] suite
diff --git a/Documentation/glossary-content.txt b/Documentation/glossary-content.txt
index 8ad29e6..fc9320e 100644
--- a/Documentation/glossary-content.txt
+++ b/Documentation/glossary-content.txt
@@ -386,8 +386,10 @@ Glob magic is incompatible with literal magic.
exclude;;
After a path matches any non-exclude pathspec, it will be run
- through all exclude pathspec (magic signature: `!`). If it
- matches, the path is ignored.
+ through all exclude pathspec (magic signature: `!` or its
+ synonym `^`). If it matches, the path is ignored. When there
+ is no non-exclude pathspec, the exclusion is applied to the
+ result set as if invoked without any pathspec.
--
[[def_parent]]parent::
diff --git a/Documentation/rev-list-options.txt b/Documentation/rev-list-options.txt
index 5da7cf5..a02f732 100644
--- a/Documentation/rev-list-options.txt
+++ b/Documentation/rev-list-options.txt
@@ -133,8 +133,8 @@ parents) and `--max-parents=-1` (negative numbers denote no upper limit).
for all following revision specifiers, up to the next `--not`.
--all::
- Pretend as if all the refs in `refs/` are listed on the
- command line as '<commit>'.
+ Pretend as if all the refs in `refs/`, along with `HEAD`, are
+ listed on the command line as '<commit>'.
--branches[=<pattern>]::
Pretend as if all the refs in `refs/heads` are listed
diff --git a/Documentation/technical/api-gitattributes.txt b/Documentation/technical/api-gitattributes.txt
index 2602668..e7cbb7c 100644
--- a/Documentation/technical/api-gitattributes.txt
+++ b/Documentation/technical/api-gitattributes.txt
@@ -16,10 +16,15 @@ Data Structure
of no interest to the calling programs. The name of the
attribute can be retrieved by calling `git_attr_name()`.
-`struct git_attr_check`::
+`struct attr_check_item`::
- This structure represents a set of attributes to check in a call
- to `git_check_attr()` function, and receives the results.
+ This structure represents one attribute and its value.
+
+`struct attr_check`::
+
+ This structure represents a collection of `attr_check_item`.
+ It is passed to `git_check_attr()` function, specifying the
+ attributes to check, and receives their values.
Attribute Values
@@ -27,7 +32,7 @@ Attribute Values
An attribute for a path can be in one of four states: Set, Unset,
Unspecified or set to a string, and `.value` member of `struct
-git_attr_check` records it. There are three macros to check these:
+attr_check_item` records it. There are three macros to check these:
`ATTR_TRUE()`::
@@ -48,49 +53,51 @@ value of the attribute for the path.
Querying Specific Attributes
----------------------------
-* Prepare an array of `struct git_attr_check` to define the list of
- attributes you would want to check. To populate this array, you would
- need to define necessary attributes by calling `git_attr()` function.
+* Prepare `struct attr_check` using attr_check_initl()
+ function, enumerating the names of attributes whose values you are
+ interested in, terminated with a NULL pointer. Alternatively, an
+ empty `struct attr_check` can be prepared by calling
+ `attr_check_alloc()` function and then attributes you want to
+ ask about can be added to it with `attr_check_append()`
+ function.
* Call `git_check_attr()` to check the attributes for the path.
-* Inspect `git_attr_check` structure to see how each of the attribute in
- the array is defined for the path.
+* Inspect `attr_check` structure to see how each of the
+ attribute in the array is defined for the path.
Example
-------
-To see how attributes "crlf" and "indent" are set for different paths.
+To see how attributes "crlf" and "ident" are set for different paths.
-. Prepare an array of `struct git_attr_check` with two elements (because
- we are checking two attributes). Initialize their `attr` member with
- pointers to `struct git_attr` obtained by calling `git_attr()`:
+. Prepare a `struct attr_check` with two elements (because
+ we are checking two attributes):
------------
-static struct git_attr_check check[2];
+static struct attr_check *check;
static void setup_check(void)
{
- if (check[0].attr)
+ if (check)
return; /* already done */
- check[0].attr = git_attr("crlf");
- check[1].attr = git_attr("ident");
+ check = attr_check_initl("crlf", "ident", NULL);
}
------------
-. Call `git_check_attr()` with the prepared array of `struct git_attr_check`:
+. Call `git_check_attr()` with the prepared `struct attr_check`:
------------
const char *path;
setup_check();
- git_check_attr(path, ARRAY_SIZE(check), check);
+ git_check_attr(path, check);
------------
-. Act on `.value` member of the result, left in `check[]`:
+. Act on `.value` member of the result, left in `check->items[]`:
------------
- const char *value = check[0].value;
+ const char *value = check->items[0].value;
if (ATTR_TRUE(value)) {
The attribute is Set, by listing only the name of the
@@ -109,20 +116,39 @@ static void setup_check(void)
}
------------
+To see how attributes in argv[] are set for different paths, only
+the first step in the above would be different.
+
+------------
+static struct attr_check *check;
+static void setup_check(const char **argv)
+{
+ check = attr_check_alloc();
+ while (*argv) {
+ struct git_attr *attr = git_attr(*argv);
+ attr_check_append(check, attr);
+ argv++;
+ }
+}
+------------
+
Querying All Attributes
-----------------------
To get the values of all attributes associated with a file:
-* Call `git_all_attrs()`, which returns an array of `git_attr_check`
- structures.
+* Prepare an empty `attr_check` structure by calling
+ `attr_check_alloc()`.
+
+* Call `git_all_attrs()`, which populates the `attr_check`
+ with the attributes attached to the path.
-* Iterate over the `git_attr_check` array to examine the attribute
- names and values. The name of the attribute described by a
- `git_attr_check` object can be retrieved via
- `git_attr_name(check[i].attr)`. (Please note that no items will be
- returned for unset attributes, so `ATTR_UNSET()` will return false
- for all returned `git_array_check` objects.)
+* Iterate over the `attr_check.items[]` array to examine
+ the attribute names and values. The name of the attribute
+ described by a `attr_check.items[]` object can be retrieved via
+ `git_attr_name(check->items[i].attr)`. (Please note that no items
+ will be returned for unset attributes, so `ATTR_UNSET()` will return
+ false for all returned `attr_check.items[]` objects.)
-* Free the `git_array_check` array.
+* Free the `attr_check` struct by calling `attr_check_free()`.
diff --git a/Documentation/technical/api-parse-options.txt b/Documentation/technical/api-parse-options.txt
index 27bd701..36768b4 100644
--- a/Documentation/technical/api-parse-options.txt
+++ b/Documentation/technical/api-parse-options.txt
@@ -168,6 +168,11 @@ There are some macros to easily define options:
Introduce an option with string argument.
The string argument is put into `str_var`.
+`OPT_STRING_LIST(short, long, &struct string_list, arg_str, description)`::
+ Introduce an option with string argument.
+ The string argument is stored as an element in `string_list`.
+ Use of `--no-option` will clear the list of preceding values.
+
`OPT_INTEGER(short, long, &int_var, description)`::
Introduce an option with integer argument.
The integer is put into `int_var`.
diff --git a/GIT-VERSION-GEN b/GIT-VERSION-GEN
index 4bed33d..6a208e9 100755
--- a/GIT-VERSION-GEN
+++ b/GIT-VERSION-GEN
@@ -1,7 +1,7 @@
#!/bin/sh
GVF=GIT-VERSION-FILE
-DEF_VER=v2.12.0-rc0
+DEF_VER=v2.12.0
LF='
'
diff --git a/Makefile b/Makefile
index 8e4081e..9ec6065 100644
--- a/Makefile
+++ b/Makefile
@@ -781,6 +781,7 @@ LIB_OBJS += notes-cache.o
LIB_OBJS += notes-merge.o
LIB_OBJS += notes-utils.o
LIB_OBJS += object.o
+LIB_OBJS += oidset.o
LIB_OBJS += pack-bitmap.o
LIB_OBJS += pack-bitmap-write.o
LIB_OBJS += pack-check.o
@@ -932,6 +933,7 @@ BUILTIN_OBJS += builtin/prune.o
BUILTIN_OBJS += builtin/pull.o
BUILTIN_OBJS += builtin/push.o
BUILTIN_OBJS += builtin/read-tree.o
+BUILTIN_OBJS += builtin/rebase--helper.o
BUILTIN_OBJS += builtin/receive-pack.o
BUILTIN_OBJS += builtin/reflog.o
BUILTIN_OBJS += builtin/remote.o
diff --git a/apply.c b/apply.c
index 2ed808d..0e2caea 100644
--- a/apply.c
+++ b/apply.c
@@ -2187,29 +2187,20 @@ static int parse_chunk(struct apply_state *state, char *buffer, unsigned long si
return offset + hdrsize + patchsize;
}
-#define swap(a,b) myswap((a),(b),sizeof(a))
-
-#define myswap(a, b, size) do { \
- unsigned char mytmp[size]; \
- memcpy(mytmp, &a, size); \
- memcpy(&a, &b, size); \
- memcpy(&b, mytmp, size); \
-} while (0)
-
static void reverse_patches(struct patch *p)
{
for (; p; p = p->next) {
struct fragment *frag = p->fragments;
- swap(p->new_name, p->old_name);
- swap(p->new_mode, p->old_mode);
- swap(p->is_new, p->is_delete);
- swap(p->lines_added, p->lines_deleted);
- swap(p->old_sha1_prefix, p->new_sha1_prefix);
+ SWAP(p->new_name, p->old_name);
+ SWAP(p->new_mode, p->old_mode);
+ SWAP(p->is_new, p->is_delete);
+ SWAP(p->lines_added, p->lines_deleted);
+ SWAP(p->old_sha1_prefix, p->new_sha1_prefix);
for (; frag; frag = frag->next) {
- swap(frag->newpos, frag->oldpos);
- swap(frag->newlines, frag->oldlines);
+ SWAP(frag->newpos, frag->oldpos);
+ SWAP(frag->newlines, frag->oldlines);
}
}
}
diff --git a/archive.c b/archive.c
index 01751e5..60b8891 100644
--- a/archive.c
+++ b/archive.c
@@ -87,19 +87,6 @@ void *sha1_file_to_archive(const struct archiver_args *args,
return buffer;
}
-static void setup_archive_check(struct git_attr_check *check)
-{
- static struct git_attr *attr_export_ignore;
- static struct git_attr *attr_export_subst;
-
- if (!attr_export_ignore) {
- attr_export_ignore = git_attr("export-ignore");
- attr_export_subst = git_attr("export-subst");
- }
- check[0].attr = attr_export_ignore;
- check[1].attr = attr_export_subst;
-}
-
struct directory {
struct directory *up;
struct object_id oid;
@@ -120,10 +107,10 @@ static int write_archive_entry(const unsigned char *sha1, const char *base,
void *context)
{
static struct strbuf path = STRBUF_INIT;
+ static struct attr_check *check;
struct archiver_context *c = context;
struct archiver_args *args = c->args;
write_archive_entry_fn_t write_entry = c->write_entry;
- struct git_attr_check check[2];
const char *path_without_prefix;
int err;
@@ -137,11 +124,12 @@ static int write_archive_entry(const unsigned char *sha1, const char *base,
strbuf_addch(&path, '/');
path_without_prefix = path.buf + args->baselen;
- setup_archive_check(check);
- if (!git_check_attr(path_without_prefix, ARRAY_SIZE(check), check)) {
- if (ATTR_TRUE(check[0].value))
+ if (!check)
+ check = attr_check_initl("export-ignore", "export-subst", NULL);
+ if (!git_check_attr(path_without_prefix, check)) {
+ if (ATTR_TRUE(check->items[0].value))
return 0;
- args->convert = ATTR_TRUE(check[1].value);
+ args->convert = ATTR_TRUE(check->items[1].value);
}
if (S_ISDIR(mode) || S_ISGITLINK(mode)) {
diff --git a/attr.c b/attr.c
index 1fcf042..5493bff 100644
--- a/attr.c
+++ b/attr.c
@@ -13,6 +13,8 @@
#include "attr.h"
#include "dir.h"
#include "utf8.h"
+#include "quote.h"
+#include "thread-utils.h"
const char git_attr__true[] = "(builtin)true";
const char git_attr__false[] = "\0(builtin)false";
@@ -22,99 +24,234 @@ static const char git_attr__unknown[] = "(builtin)unknown";
#define ATTR__UNSET NULL
#define ATTR__UNKNOWN git_attr__unknown
-/* This is a randomly chosen prime. */
-#define HASHSIZE 257
-
#ifndef DEBUG_ATTR
#define DEBUG_ATTR 0
#endif
struct git_attr {
- struct git_attr *next;
- unsigned h;
- int attr_nr;
- int maybe_macro;
- int maybe_real;
- char name[FLEX_ARRAY];
+ int attr_nr; /* unique attribute number */
+ char name[FLEX_ARRAY]; /* attribute name */
};
-static int attr_nr;
-static int cannot_trust_maybe_real;
-
-static struct git_attr_check *check_all_attr;
-static struct git_attr *(git_attr_hash[HASHSIZE]);
-char *git_attr_name(struct git_attr *attr)
+const char *git_attr_name(const struct git_attr *attr)
{
return attr->name;
}
-static unsigned hash_name(const char *name, int namelen)
+struct attr_hashmap {
+ struct hashmap map;
+#ifndef NO_PTHREADS
+ pthread_mutex_t mutex;
+#endif
+};
+
+static inline void hashmap_lock(struct attr_hashmap *map)
+{
+#ifndef NO_PTHREADS
+ pthread_mutex_lock(&map->mutex);
+#endif
+}
+
+static inline void hashmap_unlock(struct attr_hashmap *map)
{
- unsigned val = 0, c;
+#ifndef NO_PTHREADS
+ pthread_mutex_unlock(&map->mutex);
+#endif
+}
- while (namelen--) {
- c = *name++;
- val = ((val << 7) | (val >> 22)) ^ c;
+/*
+ * The global dictionary of all interned attributes. This
+ * is a singleton object which is shared between threads.
+ * Access to this dictionary must be surrounded with a mutex.
+ */
+static struct attr_hashmap g_attr_hashmap;
+
+/* The container for objects stored in "struct attr_hashmap" */
+struct attr_hash_entry {
+ struct hashmap_entry ent; /* must be the first member! */
+ const char *key; /* the key; memory should be owned by value */
+ size_t keylen; /* length of the key */
+ void *value; /* the stored value */
+};
+
+/* attr_hashmap comparison function */
+static int attr_hash_entry_cmp(const struct attr_hash_entry *a,
+ const struct attr_hash_entry *b,
+ void *unused)
+{
+ return (a->keylen != b->keylen) || strncmp(a->key, b->key, a->keylen);
+}
+
+/* Initialize an 'attr_hashmap' object */
+static void attr_hashmap_init(struct attr_hashmap *map)
+{
+ hashmap_init(&map->map, (hashmap_cmp_fn) attr_hash_entry_cmp, 0);
+}
+
+/*
+ * Retrieve the 'value' stored in a hashmap given the provided 'key'.
+ * If there is no matching entry, return NULL.
+ */
+static void *attr_hashmap_get(struct attr_hashmap *map,
+ const char *key, size_t keylen)
+{
+ struct attr_hash_entry k;
+ struct attr_hash_entry *e;
+
+ if (!map->map.tablesize)
+ attr_hashmap_init(map);
+
+ hashmap_entry_init(&k, memhash(key, keylen));
+ k.key = key;
+ k.keylen = keylen;
+ e = hashmap_get(&map->map, &k, NULL);
+
+ return e ? e->value : NULL;
+}
+
+/* Add 'value' to a hashmap based on the provided 'key'. */
+static void attr_hashmap_add(struct attr_hashmap *map,
+ const char *key, size_t keylen,
+ void *value)
+{
+ struct attr_hash_entry *e;
+
+ if (!map->map.tablesize)
+ attr_hashmap_init(map);
+
+ e = xmalloc(sizeof(struct attr_hash_entry));
+ hashmap_entry_init(e, memhash(key, keylen));
+ e->key = key;
+ e->keylen = keylen;
+ e->value = value;
+
+ hashmap_add(&map->map, e);
+}
+
+struct all_attrs_item {
+ const struct git_attr *attr;
+ const char *value;
+ /*
+ * If 'macro' is non-NULL, indicates that 'attr' is a macro based on
+ * the current attribute stack and contains a pointer to the match_attr
+ * definition of the macro
+ */
+ const struct match_attr *macro;
+};
+
+/*
+ * Reallocate and reinitialize the array of all attributes (which is used in
+ * the attribute collection process) in 'check' based on the global dictionary
+ * of attributes.
+ */
+static void all_attrs_init(struct attr_hashmap *map, struct attr_check *check)
+{
+ int i;
+
+ hashmap_lock(map);
+
+ if (map->map.size < check->all_attrs_nr)
+ die("BUG: interned attributes shouldn't be deleted");
+
+ /*
+ * If the number of attributes in the global dictionary has increased
+ * (or this attr_check instance doesn't have an initialized all_attrs
+ * field), reallocate the provided attr_check instance's all_attrs
+ * field and fill each entry with its corresponding git_attr.
+ */
+ if (map->map.size != check->all_attrs_nr) {
+ struct attr_hash_entry *e;
+ struct hashmap_iter iter;
+ hashmap_iter_init(&map->map, &iter);
+
+ REALLOC_ARRAY(check->all_attrs, map->map.size);
+ check->all_attrs_nr = map->map.size;
+
+ while ((e = hashmap_iter_next(&iter))) {
+ const struct git_attr *a = e->value;
+ check->all_attrs[a->attr_nr].attr = a;
+ }
+ }
+
+ hashmap_unlock(map);
+
+ /*
+ * Re-initialize every entry in check->all_attrs.
+ * This re-initialization can live outside of the locked region since
+ * the attribute dictionary is no longer being accessed.
+ */
+ for (i = 0; i < check->all_attrs_nr; i++) {
+ check->all_attrs[i].value = ATTR__UNKNOWN;
+ check->all_attrs[i].macro = NULL;
}
- return val;
}
-static int invalid_attr_name(const char *name, int namelen)
+static int attr_name_valid(const char *name, size_t namelen)
{
/*
* Attribute name cannot begin with '-' and must consist of
* characters from [-A-Za-z0-9_.].
*/
if (namelen <= 0 || *name == '-')
- return -1;
+ return 0;
while (namelen--) {
char ch = *name++;
if (! (ch == '-' || ch == '.' || ch == '_' ||
('0' <= ch && ch <= '9') ||
('a' <= ch && ch <= 'z') ||
('A' <= ch && ch <= 'Z')) )
- return -1;
+ return 0;
}
- return 0;
+ return 1;
}
-static struct git_attr *git_attr_internal(const char *name, int len)
+static void report_invalid_attr(const char *name, size_t len,
+ const char *src, int lineno)
+{
+ struct strbuf err = STRBUF_INIT;
+ strbuf_addf(&err, _("%.*s is not a valid attribute name"),
+ (int) len, name);
+ fprintf(stderr, "%s: %s:%d\n", err.buf, src, lineno);
+ strbuf_release(&err);
+}
+
+/*
+ * Given a 'name', lookup and return the corresponding attribute in the global
+ * dictionary. If no entry is found, create a new attribute and store it in
+ * the dictionary.
+ */
+static const struct git_attr *git_attr_internal(const char *name, int namelen)
{
- unsigned hval = hash_name(name, len);
- unsigned pos = hval % HASHSIZE;
struct git_attr *a;
- for (a = git_attr_hash[pos]; a; a = a->next) {
- if (a->h == hval &&
- !memcmp(a->name, name, len) && !a->name[len])
- return a;
+ if (!attr_name_valid(name, namelen))
+ return NULL;
+
+ hashmap_lock(&g_attr_hashmap);
+
+ a = attr_hashmap_get(&g_attr_hashmap, name, namelen);
+
+ if (!a) {
+ FLEX_ALLOC_MEM(a, name, name, namelen);
+ a->attr_nr = g_attr_hashmap.map.size;
+
+ attr_hashmap_add(&g_attr_hashmap, a->name, namelen, a);
+ assert(a->attr_nr == (g_attr_hashmap.map.size - 1));
}
- if (invalid_attr_name(name, len))
- return NULL;
+ hashmap_unlock(&g_attr_hashmap);
- FLEX_ALLOC_MEM(a, name, name, len);
- a->h = hval;
- a->next = git_attr_hash[pos];
- a->attr_nr = attr_nr++;
- a->maybe_macro = 0;
- a->maybe_real = 0;
- git_attr_hash[pos] = a;
-
- REALLOC_ARRAY(check_all_attr, attr_nr);
- check_all_attr[a->attr_nr].attr = a;
- check_all_attr[a->attr_nr].value = ATTR__UNKNOWN;
return a;
}
-struct git_attr *git_attr(const char *name)
+const struct git_attr *git_attr(const char *name)
{
return git_attr_internal(name, strlen(name));
}
/* What does a matched pattern decide? */
struct attr_state {
- struct git_attr *attr;
+ const struct git_attr *attr;
const char *setto;
};
@@ -131,9 +268,8 @@ struct pattern {
* If is_macro is true, then u.attr is a pointer to the git_attr being
* defined.
*
- * If is_macro is false, then u.pattern points at the filename pattern
- * to which the rule applies. (The memory pointed to is part of the
- * memory block allocated for the match_attr instance.)
+ * If is_macro is false, then u.pat is the filename pattern to which the
+ * rule applies.
*
* In either case, num_attr is the number of attributes affected by
* this rule, and state is an array listing them. The attributes are
@@ -142,7 +278,7 @@ struct pattern {
struct match_attr {
union {
struct pattern pat;
- struct git_attr *attr;
+ const struct git_attr *attr;
} u;
char is_macro;
unsigned num_attr;
@@ -177,13 +313,17 @@ static const char *parse_attr(const char *src, int lineno, const char *cp,
cp++;
len--;
}
- if (invalid_attr_name(cp, len)) {
- fprintf(stderr,
- "%.*s is not a valid attribute name: %s:%d\n",
- len, cp, src, lineno);
+ if (!attr_name_valid(cp, len)) {
+ report_invalid_attr(cp, len, src, lineno);
return NULL;
}
} else {
+ /*
+ * As this function is always called twice, once with
+ * e == NULL in the first pass and then e != NULL in
+ * the second pass, no need for attr_name_valid()
+ * check here.
+ */
if (*cp == '-' || *cp == '!') {
e->setto = (*cp == '-') ? ATTR__FALSE : ATTR__UNSET;
cp++;
@@ -207,41 +347,47 @@ static struct match_attr *parse_attr_line(const char *line, const char *src,
const char *cp, *name, *states;
struct match_attr *res = NULL;
int is_macro;
+ struct strbuf pattern = STRBUF_INIT;
cp = line + strspn(line, blank);
if (!*cp || *cp == '#')
return NULL;
name = cp;
- namelen = strcspn(name, blank);
+
+ if (*cp == '"' && !unquote_c_style(&pattern, name, &states)) {
+ name = pattern.buf;
+ namelen = pattern.len;
+ } else {
+ namelen = strcspn(name, blank);
+ states = name + namelen;
+ }
+
if (strlen(ATTRIBUTE_MACRO_PREFIX) < namelen &&
starts_with(name, ATTRIBUTE_MACRO_PREFIX)) {
if (!macro_ok) {
fprintf(stderr, "%s not allowed: %s:%d\n",
name, src, lineno);
- return NULL;
+ goto fail_return;
}
is_macro = 1;
name += strlen(ATTRIBUTE_MACRO_PREFIX);
name += strspn(name, blank);
namelen = strcspn(name, blank);
- if (invalid_attr_name(name, namelen)) {
- fprintf(stderr,
- "%.*s is not a valid attribute name: %s:%d\n",
- namelen, name, src, lineno);
- return NULL;
+ if (!attr_name_valid(name, namelen)) {
+ report_invalid_attr(name, namelen, src, lineno);
+ goto fail_return;
}
}
else
is_macro = 0;
- states = name + namelen;
states += strspn(states, blank);
/* First pass to count the attr_states */
for (cp = states, num_attr = 0; *cp; num_attr++) {
cp = parse_attr(src, lineno, cp, NULL);
if (!cp)
- return NULL;
+ goto fail_return;
}
res = xcalloc(1,
@@ -250,7 +396,6 @@ static struct match_attr *parse_attr_line(const char *line, const char *src,
(is_macro ? 0 : namelen + 1));
if (is_macro) {
res->u.attr = git_attr_internal(name, namelen);
- res->u.attr->maybe_macro = 1;
} else {
char *p = (char *)&(res->state[num_attr]);
memcpy(p, name, namelen);
@@ -262,7 +407,7 @@ static struct match_attr *parse_attr_line(const char *line, const char *src,
if (res->u.pat.flags & EXC_FLAG_NEGATIVE) {
warning(_("Negative patterns are ignored in git attributes\n"
"Use '\\!' for literal leading exclamation."));
- return NULL;
+ goto fail_return;
}
}
res->is_macro = is_macro;
@@ -271,13 +416,15 @@ static struct match_attr *parse_attr_line(const char *line, const char *src,
/* Second pass to fill the attr_states */
for (cp = states, i = 0; *cp; i++) {
cp = parse_attr(src, lineno, cp, &(res->state[i]));
- if (!is_macro)
- res->state[i].attr->maybe_real = 1;
- if (res->state[i].attr->maybe_macro)
- cannot_trust_maybe_real = 1;
}
+ strbuf_release(&pattern);
return res;
+
+fail_return:
+ strbuf_release(&pattern);
+ free(res);
+ return NULL;
}
/*
@@ -295,19 +442,19 @@ static struct match_attr *parse_attr_line(const char *line, const char *src,
* directory (again, reading the file from top to bottom) down to the
* current directory, and then scan the list backwards to find the first match.
* This is exactly the same as what is_excluded() does in dir.c to deal with
- * .gitignore
+ * .gitignore file and info/excludes file as a fallback.
*/
-static struct attr_stack {
+struct attr_stack {
struct attr_stack *prev;
char *origin;
size_t originlen;
unsigned num_matches;
unsigned alloc;
struct match_attr **attrs;
-} *attr_stack;
+};
-static void free_attr_elem(struct attr_stack *e)
+static void attr_stack_free(struct attr_stack *e)
{
int i;
free(e->origin);
@@ -330,6 +477,173 @@ static void free_attr_elem(struct attr_stack *e)
free(e);
}
+static void drop_attr_stack(struct attr_stack **stack)
+{
+ while (*stack) {
+ struct attr_stack *elem = *stack;
+ *stack = elem->prev;
+ attr_stack_free(elem);
+ }
+}
+
+/* List of all attr_check structs; access should be surrounded by mutex */
+static struct check_vector {
+ size_t nr;
+ size_t alloc;
+ struct attr_check **checks;
+#ifndef NO_PTHREADS
+ pthread_mutex_t mutex;
+#endif
+} check_vector;
+
+static inline void vector_lock(void)
+{
+#ifndef NO_PTHREADS
+ pthread_mutex_lock(&check_vector.mutex);
+#endif
+}
+
+static inline void vector_unlock(void)
+{
+#ifndef NO_PTHREADS
+ pthread_mutex_unlock(&check_vector.mutex);
+#endif
+}
+
+static void check_vector_add(struct attr_check *c)
+{
+ vector_lock();
+
+ ALLOC_GROW(check_vector.checks,
+ check_vector.nr + 1,
+ check_vector.alloc);
+ check_vector.checks[check_vector.nr++] = c;
+
+ vector_unlock();
+}
+
+static void check_vector_remove(struct attr_check *check)
+{
+ int i;
+
+ vector_lock();
+
+ /* Find entry */
+ for (i = 0; i < check_vector.nr; i++)
+ if (check_vector.checks[i] == check)
+ break;
+
+ if (i >= check_vector.nr)
+ die("BUG: no entry found");
+
+ /* shift entries over */
+ for (; i < check_vector.nr - 1; i++)
+ check_vector.checks[i] = check_vector.checks[i + 1];
+
+ check_vector.nr--;
+
+ vector_unlock();
+}
+
+/* Iterate through all attr_check instances and drop their stacks */
+static void drop_all_attr_stacks(void)
+{
+ int i;
+
+ vector_lock();
+
+ for (i = 0; i < check_vector.nr; i++) {
+ drop_attr_stack(&check_vector.checks[i]->stack);
+ }
+
+ vector_unlock();
+}
+
+struct attr_check *attr_check_alloc(void)
+{
+ struct attr_check *c = xcalloc(1, sizeof(struct attr_check));
+
+ /* save pointer to the check struct */
+ check_vector_add(c);
+
+ return c;
+}
+
+struct attr_check *attr_check_initl(const char *one, ...)
+{
+ struct attr_check *check;
+ int cnt;
+ va_list params;
+ const char *param;
+
+ va_start(params, one);
+ for (cnt = 1; (param = va_arg(params, const char *)) != NULL; cnt++)
+ ;
+ va_end(params);
+
+ check = attr_check_alloc();
+ check->nr = cnt;
+ check->alloc = cnt;
+ check->items = xcalloc(cnt, sizeof(struct attr_check_item));
+
+ check->items[0].attr = git_attr(one);
+ va_start(params, one);
+ for (cnt = 1; cnt < check->nr; cnt++) {
+ const struct git_attr *attr;
+ param = va_arg(params, const char *);
+ if (!param)
+ die("BUG: counted %d != ended at %d",
+ check->nr, cnt);
+ attr = git_attr(param);
+ if (!attr)
+ die("BUG: %s: not a valid attribute name", param);
+ check->items[cnt].attr = attr;
+ }
+ va_end(params);
+ return check;
+}
+
+struct attr_check_item *attr_check_append(struct attr_check *check,
+ const struct git_attr *attr)
+{
+ struct attr_check_item *item;
+
+ ALLOC_GROW(check->items, check->nr + 1, check->alloc);
+ item = &check->items[check->nr++];
+ item->attr = attr;
+ return item;
+}
+
+void attr_check_reset(struct attr_check *check)
+{
+ check->nr = 0;
+}
+
+void attr_check_clear(struct attr_check *check)
+{
+ free(check->items);
+ check->items = NULL;
+ check->alloc = 0;
+ check->nr = 0;
+
+ free(check->all_attrs);
+ check->all_attrs = NULL;
+ check->all_attrs_nr = 0;
+
+ drop_attr_stack(&check->stack);
+}
+
+void attr_check_free(struct attr_check *check)
+{
+ if (check) {
+ /* Remove check from the check vector */
+ check_vector_remove(check);
+
+ attr_check_clear(check);
+ free(check);
+ }
+}
+
static const char *builtin_attr[] = {
"[attr]binary -diff -merge -text",
NULL,
@@ -362,9 +676,31 @@ static struct attr_stack *read_attr_from_array(const char **list)
return res;
}
+/*
+ * Callers into the attribute system assume there is a single, system-wide
+ * global state where attributes are read from and when the state is flipped by
+ * calling git_attr_set_direction(), the stack frames that have been
+ * constructed need to be discarded so so that subsequent calls into the
+ * attribute system will lazily read from the right place. Since changing
+ * direction causes a global paradigm shift, it should not ever be called while
+ * another thread could potentially be calling into the attribute system.
+ */
static enum git_attr_direction direction;
static struct index_state *use_index;
+void git_attr_set_direction(enum git_attr_direction new_direction,
+ struct index_state *istate)
+{
+ if (is_bare_repository() && new_direction != GIT_ATTR_INDEX)
+ die("BUG: non-INDEX attr direction in a bare repo");
+
+ if (new_direction != direction)
+ drop_all_attr_stacks();
+
+ direction = new_direction;
+ use_index = istate;
+}
+
static struct attr_stack *read_attr_from_file(const char *path, int macro_ok)
{
FILE *fp = fopen(path, "r");
@@ -402,8 +738,8 @@ static struct attr_stack *read_attr_from_index(const char *path, int macro_ok)
for (sp = buf; *sp; ) {
char *ep;
int more;
- for (ep = sp; *ep && *ep != '\n'; ep++)
- ;
+
+ ep = strchrnul(sp, '\n');
more = (*ep == '\n');
*ep = '\0';
handle_attr_line(res, sp, path, ++lineno, macro_ok);
@@ -415,25 +751,28 @@ static struct attr_stack *read_attr_from_index(const char *path, int macro_ok)
static struct attr_stack *read_attr(const char *path, int macro_ok)
{
- struct attr_stack *res;
+ struct attr_stack *res = NULL;
- if (direction == GIT_ATTR_CHECKOUT) {
+ if (direction == GIT_ATTR_INDEX) {
res = read_attr_from_index(path, macro_ok);
- if (!res)
- res = read_attr_from_file(path, macro_ok);
- }
- else if (direction == GIT_ATTR_CHECKIN) {
- res = read_attr_from_file(path, macro_ok);
- if (!res)
- /*
- * There is no checked out .gitattributes file there, but
- * we might have it in the index. We allow operation in a
- * sparsely checked out work tree, so read from it.
- */
+ } else if (!is_bare_repository()) {
+ if (direction == GIT_ATTR_CHECKOUT) {
res = read_attr_from_index(path, macro_ok);
+ if (!res)
+ res = read_attr_from_file(path, macro_ok);
+ } else if (direction == GIT_ATTR_CHECKIN) {
+ res = read_attr_from_file(path, macro_ok);
+ if (!res)
+ /*
+ * There is no checked out .gitattributes file
+ * there, but we might have it in the index.
+ * We allow operation in a sparsely checked out
+ * work tree, so read from it.
+ */
+ res = read_attr_from_index(path, macro_ok);
+ }
}
- else
- res = read_attr_from_index(path, macro_ok);
+
if (!res)
res = xcalloc(1, sizeof(*res));
return res;
@@ -464,16 +803,7 @@ static void debug_set(const char *what, const char *match, struct git_attr *attr
#define debug_push(a) do { ; } while (0)
#define debug_pop(a) do { ; } while (0)
#define debug_set(a,b,c,d) do { ; } while (0)
-#endif
-
-static void drop_attr_stack(void)
-{
- while (attr_stack) {
- struct attr_stack *elem = attr_stack;
- attr_stack = elem->prev;
- free_attr_elem(elem);
- }
-}
+#endif /* DEBUG_ATTR */
static const char *git_etc_gitattributes(void)
{
@@ -483,6 +813,14 @@ static const char *git_etc_gitattributes(void)
return system_wide;
}
+static const char *get_home_gitattributes(void)
+{
+ if (!git_attributes_file)
+ git_attributes_file = xdg_config_home("attributes");
+
+ return git_attributes_file;
+}
+
static int git_attr_system(void)
{
return !git_env_bool("GIT_ATTR_NOSYSTEM", 0);
@@ -490,64 +828,60 @@ static int git_attr_system(void)
static GIT_PATH_FUNC(git_path_info_attributes, INFOATTRIBUTES_FILE)
-static void bootstrap_attr_stack(void)
+static void push_stack(struct attr_stack **attr_stack_p,
+ struct attr_stack *elem, char *origin, size_t originlen)
{
- struct attr_stack *elem;
+ if (elem) {
+ elem->origin = origin;
+ if (origin)
+ elem->originlen = originlen;
+ elem->prev = *attr_stack_p;
+ *attr_stack_p = elem;
+ }
+}
- if (attr_stack)
+static void bootstrap_attr_stack(struct attr_stack **stack)
+{
+ struct attr_stack *e;
+
+ if (*stack)
return;
- elem = read_attr_from_array(builtin_attr);
- elem->origin = NULL;
- elem->prev = attr_stack;
- attr_stack = elem;
+ /* builtin frame */
+ e = read_attr_from_array(builtin_attr);
+ push_stack(stack, e, NULL, 0);
+ /* system-wide frame */
if (git_attr_system()) {
- elem = read_attr_from_file(git_etc_gitattributes(), 1);
- if (elem) {
- elem->origin = NULL;
- elem->prev = attr_stack;
- attr_stack = elem;
- }
+ e = read_attr_from_file(git_etc_gitattributes(), 1);
+ push_stack(stack, e, NULL, 0);
}
- if (!git_attributes_file)
- git_attributes_file = xdg_config_home("attributes");
- if (git_attributes_file) {
- elem = read_attr_from_file(git_attributes_file, 1);
- if (elem) {
- elem->origin = NULL;
- elem->prev = attr_stack;
- attr_stack = elem;
- }
+ /* home directory */
+ if (get_home_gitattributes()) {
+ e = read_attr_from_file(get_home_gitattributes(), 1);
+ push_stack(stack, e, NULL, 0);
}
- if (!is_bare_repository() || direction == GIT_ATTR_INDEX) {
- elem = read_attr(GITATTRIBUTES_FILE, 1);
- elem->origin = xstrdup("");
- elem->originlen = 0;
- elem->prev = attr_stack;
- attr_stack = elem;
- debug_push(elem);
- }
+ /* root directory */
+ e = read_attr(GITATTRIBUTES_FILE, 1);
+ push_stack(stack, e, xstrdup(""), 0);
+ /* info frame */
if (startup_info->have_repository)
- elem = read_attr_from_file(git_path_info_attributes(), 1);
+ e = read_attr_from_file(git_path_info_attributes(), 1);
else
- elem = NULL;
-
- if (!elem)
- elem = xcalloc(1, sizeof(*elem));
- elem->origin = NULL;
- elem->prev = attr_stack;
- attr_stack = elem;
+ e = NULL;
+ if (!e)
+ e = xcalloc(1, sizeof(struct attr_stack));
+ push_stack(stack, e, NULL, 0);
}
-static void prepare_attr_stack(const char *path, int dirlen)
+static void prepare_attr_stack(const char *path, int dirlen,
+ struct attr_stack **stack)
{
- struct attr_stack *elem, *info;
- int len;
- const char *cp;
+ struct attr_stack *info;
+ struct strbuf pathbuf = STRBUF_INIT;
/*
* At the bottom of the attribute stack is the built-in
@@ -564,13 +898,13 @@ static void prepare_attr_stack(const char *path, int dirlen)
* .gitattributes in deeper directories to shallower ones,
* and finally use the built-in set as the default.
*/
- bootstrap_attr_stack();
+ bootstrap_attr_stack(stack);
/*
* Pop the "info" one that is always at the top of the stack.
*/
- info = attr_stack;
- attr_stack = info->prev;
+ info = *stack;
+ *stack = info->prev;
/*
* Pop the ones from directories that are not the prefix of
@@ -578,59 +912,63 @@ static void prepare_attr_stack(const char *path, int dirlen)
* the root one (whose origin is an empty string "") or the builtin
* one (whose origin is NULL) without popping it.
*/
- while (attr_stack->origin) {
- int namelen = strlen(attr_stack->origin);
+ while ((*stack)->origin) {
+ int namelen = (*stack)->originlen;
+ struct attr_stack *elem;
- elem = attr_stack;
+ elem = *stack;
if (namelen <= dirlen &&
!strncmp(elem->origin, path, namelen) &&
(!namelen || path[namelen] == '/'))
break;
debug_pop(elem);
- attr_stack = elem->prev;
- free_attr_elem(elem);
+ *stack = elem->prev;
+ attr_stack_free(elem);
}
/*
- * Read from parent directories and push them down
+ * bootstrap_attr_stack() should have added, and the
+ * above loop should have stopped before popping, the
+ * root element whose attr_stack->origin is set to an
+ * empty string.
*/
- if (!is_bare_repository() || direction == GIT_ATTR_INDEX) {
- /*
- * bootstrap_attr_stack() should have added, and the
- * above loop should have stopped before popping, the
- * root element whose attr_stack->origin is set to an
- * empty string.
- */
- struct strbuf pathbuf = STRBUF_INIT;
-
- assert(attr_stack->origin);
- while (1) {
- len = strlen(attr_stack->origin);
- if (dirlen <= len)
- break;
- cp = memchr(path + len + 1, '/', dirlen - len - 1);
- if (!cp)
- cp = path + dirlen;
- strbuf_add(&pathbuf, path, cp - path);
+ assert((*stack)->origin);
+
+ strbuf_addstr(&pathbuf, (*stack)->origin);
+ /* Build up to the directory 'path' is in */
+ while (pathbuf.len < dirlen) {
+ size_t len = pathbuf.len;
+ struct attr_stack *next;
+ char *origin;
+
+ /* Skip path-separator */
+ if (len < dirlen && is_dir_sep(path[len]))
+ len++;
+ /* Find the end of the next component */
+ while (len < dirlen && !is_dir_sep(path[len]))
+ len++;
+
+ if (pathbuf.len > 0)
strbuf_addch(&pathbuf, '/');
- strbuf_addstr(&pathbuf, GITATTRIBUTES_FILE);
- elem = read_attr(pathbuf.buf, 0);
- strbuf_setlen(&pathbuf, cp - path);
- elem->origin = strbuf_detach(&pathbuf, &elem->originlen);
- elem->prev = attr_stack;
- attr_stack = elem;
- debug_push(elem);
- }
+ strbuf_add(&pathbuf, path + pathbuf.len, (len - pathbuf.len));
+ strbuf_addf(&pathbuf, "/%s", GITATTRIBUTES_FILE);
+
+ next = read_attr(pathbuf.buf, 0);
- strbuf_release(&pathbuf);
+ /* reset the pathbuf to not include "/.gitattributes" */
+ strbuf_setlen(&pathbuf, len);
+
+ origin = xstrdup(pathbuf.buf);
+ push_stack(stack, next, origin, len);
}
/*
* Finally push the "info" one at the top of the stack.
*/
- info->prev = attr_stack;
- attr_stack = info;
+ push_stack(stack, info, NULL, 0);
+
+ strbuf_release(&pathbuf);
}
static int path_matches(const char *pathname, int pathlen,
@@ -656,16 +994,16 @@ static int path_matches(const char *pathname, int pathlen,
pattern, prefix, pat->patternlen, pat->flags);
}
-static int macroexpand_one(int attr_nr, int rem);
+static int macroexpand_one(struct all_attrs_item *all_attrs, int nr, int rem);
-static int fill_one(const char *what, struct match_attr *a, int rem)
+static int fill_one(const char *what, struct all_attrs_item *all_attrs,
+ const struct match_attr *a, int rem)
{
- struct git_attr_check *check = check_all_attr;
int i;
- for (i = a->num_attr - 1; 0 < rem && 0 <= i; i--) {
- struct git_attr *attr = a->state[i].attr;
- const char **n = &(check[attr->attr_nr].value);
+ for (i = a->num_attr - 1; rem > 0 && i >= 0; i--) {
+ const struct git_attr *attr = a->state[i].attr;
+ const char **n = &(all_attrs[attr->attr_nr].value);
const char *v = a->state[i].setto;
if (*n == ATTR__UNKNOWN) {
@@ -674,64 +1012,72 @@ static int fill_one(const char *what, struct match_attr *a, int rem)
attr, v);
*n = v;
rem--;
- rem = macroexpand_one(attr->attr_nr, rem);
+ rem = macroexpand_one(all_attrs, attr->attr_nr, rem);
}
}
return rem;
}
static int fill(const char *path, int pathlen, int basename_offset,
- struct attr_stack *stk, int rem)
+ const struct attr_stack *stack,
+ struct all_attrs_item *all_attrs, int rem)
{
- int i;
- const char *base = stk->origin ? stk->origin : "";
+ for (; rem > 0 && stack; stack = stack->prev) {
+ int i;
+ const char *base = stack->origin ? stack->origin : "";
- for (i = stk->num_matches - 1; 0 < rem && 0 <= i; i--) {
- struct match_attr *a = stk->attrs[i];
- if (a->is_macro)
- continue;
- if (path_matches(path, pathlen, basename_offset,
- &a->u.pat, base, stk->originlen))
- rem = fill_one("fill", a, rem);
+ for (i = stack->num_matches - 1; 0 < rem && 0 <= i; i--) {
+ const struct match_attr *a = stack->attrs[i];
+ if (a->is_macro)
+ continue;
+ if (path_matches(path, pathlen, basename_offset,
+ &a->u.pat, base, stack->originlen))
+ rem = fill_one("fill", all_attrs, a, rem);
+ }
}
+
return rem;
}
-static int macroexpand_one(int nr, int rem)
+static int macroexpand_one(struct all_attrs_item *all_attrs, int nr, int rem)
{
- struct attr_stack *stk;
- struct match_attr *a = NULL;
- int i;
+ const struct all_attrs_item *item = &all_attrs[nr];
- if (check_all_attr[nr].value != ATTR__TRUE ||
- !check_all_attr[nr].attr->maybe_macro)
+ if (item->macro && item->value == ATTR__TRUE)
+ return fill_one("expand", all_attrs, item->macro, rem);
+ else
return rem;
+}
- for (stk = attr_stack; !a && stk; stk = stk->prev)
- for (i = stk->num_matches - 1; !a && 0 <= i; i--) {
- struct match_attr *ma = stk->attrs[i];
- if (!ma->is_macro)
- continue;
- if (ma->u.attr->attr_nr == nr)
- a = ma;
+/*
+ * Marks the attributes which are macros based on the attribute stack.
+ * This prevents having to search through the attribute stack each time
+ * a macro needs to be expanded during the fill stage.
+ */
+static void determine_macros(struct all_attrs_item *all_attrs,
+ const struct attr_stack *stack)
+{
+ for (; stack; stack = stack->prev) {
+ int i;
+ for (i = stack->num_matches - 1; i >= 0; i--) {
+ const struct match_attr *ma = stack->attrs[i];
+ if (ma->is_macro) {
+ int n = ma->u.attr->attr_nr;
+ if (!all_attrs[n].macro) {
+ all_attrs[n].macro = ma;
+ }
+ }
}
-
- if (a)
- rem = fill_one("expand", a, rem);
-
- return rem;
+ }
}
/*
- * Collect attributes for path into the array pointed to by
- * check_all_attr. If num is non-zero, only attributes in check[] are
- * collected. Otherwise all attributes are collected.
+ * Collect attributes for path into the array pointed to by check->all_attrs.
+ * If check->check_nr is non-zero, only attributes in check[] are collected.
+ * Otherwise all attributes are collected.
*/
-static void collect_some_attrs(const char *path, int num,
- struct git_attr_check *check)
-
+static void collect_some_attrs(const char *path, struct attr_check *check)
{
- struct attr_stack *stk;
int i, pathlen, rem, dirlen;
const char *cp, *last_slash = NULL;
int basename_offset;
@@ -749,81 +1095,67 @@ static void collect_some_attrs(const char *path, int num,
dirlen = 0;
}
- prepare_attr_stack(path, dirlen);
- for (i = 0; i < attr_nr; i++)
- check_all_attr[i].value = ATTR__UNKNOWN;
- if (num && !cannot_trust_maybe_real) {
+ prepare_attr_stack(path, dirlen, &check->stack);
+ all_attrs_init(&g_attr_hashmap, check);
+ determine_macros(check->all_attrs, check->stack);
+
+ if (check->nr) {
rem = 0;
- for (i = 0; i < num; i++) {
- if (!check[i].attr->maybe_real) {
- struct git_attr_check *c;
- c = check_all_attr + check[i].attr->attr_nr;
- c->value = ATTR__UNSET;
+ for (i = 0; i < check->nr; i++) {
+ int n = check->items[i].attr->attr_nr;
+ struct all_attrs_item *item = &check->all_attrs[n];
+ if (item->macro) {
+ item->value = ATTR__UNSET;
rem++;
}
}
- if (rem == num)
+ if (rem == check->nr)
return;
}
- rem = attr_nr;
- for (stk = attr_stack; 0 < rem && stk; stk = stk->prev)
- rem = fill(path, pathlen, basename_offset, stk, rem);
+ rem = check->all_attrs_nr;
+ fill(path, pathlen, basename_offset, check->stack, check->all_attrs, rem);
}
-int git_check_attr(const char *path, int num, struct git_attr_check *check)
+int git_check_attr(const char *path, struct attr_check *check)
{
int i;
- collect_some_attrs(path, num, check);
+ collect_some_attrs(path, check);
- for (i = 0; i < num; i++) {
- const char *value = check_all_attr[check[i].attr->attr_nr].value;
+ for (i = 0; i < check->nr; i++) {
+ size_t n = check->items[i].attr->attr_nr;
+ const char *value = check->all_attrs[n].value;
if (value == ATTR__UNKNOWN)
value = ATTR__UNSET;
- check[i].value = value;
+ check->items[i].value = value;
}
return 0;
}
-int git_all_attrs(const char *path, int *num, struct git_attr_check **check)
+void git_all_attrs(const char *path, struct attr_check *check)
{
- int i, count, j;
+ int i;
- collect_some_attrs(path, 0, NULL);
+ attr_check_reset(check);
+ collect_some_attrs(path, check);
- /* Count the number of attributes that are set. */
- count = 0;
- for (i = 0; i < attr_nr; i++) {
- const char *value = check_all_attr[i].value;
- if (value != ATTR__UNSET && value != ATTR__UNKNOWN)
- ++count;
- }
- *num = count;
- ALLOC_ARRAY(*check, count);
- j = 0;
- for (i = 0; i < attr_nr; i++) {
- const char *value = check_all_attr[i].value;
- if (value != ATTR__UNSET && value != ATTR__UNKNOWN) {
- (*check)[j].attr = check_all_attr[i].attr;
- (*check)[j].value = value;
- ++j;
- }
+ for (i = 0; i < check->all_attrs_nr; i++) {
+ const char *name = check->all_attrs[i].attr->name;
+ const char *value = check->all_attrs[i].value;
+ struct attr_check_item *item;
+ if (value == ATTR__UNSET || value == ATTR__UNKNOWN)
+ continue;
+ item = attr_check_append(check, git_attr(name));
+ item->value = value;
}
-
- return 0;
}
-void git_attr_set_direction(enum git_attr_direction new, struct index_state *istate)
+void attr_start(void)
{
- enum git_attr_direction old = direction;
-
- if (is_bare_repository() && new != GIT_ATTR_INDEX)
- die("BUG: non-INDEX attr direction in a bare repo");
-
- direction = new;
- if (new != old)
- drop_attr_stack();
- use_index = istate;
+#ifndef NO_PTHREADS
+ pthread_mutex_init(&g_attr_hashmap.mutex, NULL);
+ pthread_mutex_init(&check_vector.mutex, NULL);
+#endif
}
diff --git a/attr.h b/attr.h
index 8b08d33..48ab3e1 100644
--- a/attr.h
+++ b/attr.h
@@ -4,11 +4,15 @@
/* An attribute is a pointer to this opaque structure */
struct git_attr;
+/* opaque structures used internally for attribute collection */
+struct all_attrs_item;
+struct attr_stack;
+
/*
* Given a string, return the gitattribute object that
* corresponds to it.
*/
-struct git_attr *git_attr(const char *);
+const struct git_attr *git_attr(const char *);
/* Internal use */
extern const char git_attr__true[];
@@ -20,38 +24,57 @@ extern const char git_attr__false[];
#define ATTR_UNSET(v) ((v) == NULL)
/*
- * Send one or more git_attr_check to git_check_attr(), and
+ * Send one or more git_attr_check to git_check_attrs(), and
* each 'value' member tells what its value is.
* Unset one is returned as NULL.
*/
-struct git_attr_check {
- struct git_attr *attr;
+struct attr_check_item {
+ const struct git_attr *attr;
const char *value;
};
+struct attr_check {
+ int nr;
+ int alloc;
+ struct attr_check_item *items;
+ int all_attrs_nr;
+ struct all_attrs_item *all_attrs;
+ struct attr_stack *stack;
+};
+
+extern struct attr_check *attr_check_alloc(void);
+extern struct attr_check *attr_check_initl(const char *, ...);
+
+extern struct attr_check_item *attr_check_append(struct attr_check *check,
+ const struct git_attr *attr);
+
+extern void attr_check_reset(struct attr_check *check);
+extern void attr_check_clear(struct attr_check *check);
+extern void attr_check_free(struct attr_check *check);
+
/*
* Return the name of the attribute represented by the argument. The
* return value is a pointer to a null-delimited string that is part
* of the internal data structure; it should not be modified or freed.
*/
-char *git_attr_name(struct git_attr *);
+extern const char *git_attr_name(const struct git_attr *);
-int git_check_attr(const char *path, int, struct git_attr_check *);
+extern int git_check_attr(const char *path, struct attr_check *check);
/*
- * Retrieve all attributes that apply to the specified path. *num
- * will be set to the number of attributes on the path; **check will
- * be set to point at a newly-allocated array of git_attr_check
- * objects describing the attributes and their values. *check must be
- * free()ed by the caller.
+ * Retrieve all attributes that apply to the specified path.
+ * check holds the attributes and their values.
*/
-int git_all_attrs(const char *path, int *num, struct git_attr_check **check);
+extern void git_all_attrs(const char *path, struct attr_check *check);
enum git_attr_direction {
GIT_ATTR_CHECKIN,
GIT_ATTR_CHECKOUT,
GIT_ATTR_INDEX
};
-void git_attr_set_direction(enum git_attr_direction, struct index_state *);
+void git_attr_set_direction(enum git_attr_direction new_direction,
+ struct index_state *istate);
+
+extern void attr_start(void);
#endif /* ATTR_H */
diff --git a/bisect.c b/bisect.c
index 8e63c40..30808ca 100644
--- a/bisect.c
+++ b/bisect.c
@@ -940,7 +940,7 @@ int bisect_next_all(const char *prefix, int no_checkout)
struct commit_list *tried;
int reaches = 0, all = 0, nr, steps;
const unsigned char *bisect_rev;
- char steps_msg[32];
+ char *steps_msg;
read_bisect_terms(&term_bad, &term_good);
if (read_bisect_refs())
@@ -990,14 +990,15 @@ int bisect_next_all(const char *prefix, int no_checkout)
nr = all - reaches - 1;
steps = estimate_bisect_steps(all);
- xsnprintf(steps_msg, sizeof(steps_msg),
- Q_("(roughly %d step)", "(roughly %d steps)", steps),
- steps);
+
+ steps_msg = xstrfmt(Q_("(roughly %d step)", "(roughly %d steps)",
+ steps), steps);
/* TRANSLATORS: the last %s will be replaced with
"(roughly %d steps)" translation */
printf(Q_("Bisecting: %d revision left to test after this %s\n",
"Bisecting: %d revisions left to test after this %s\n",
nr), nr, steps_msg);
+ free(steps_msg);
return bisect_checkout(bisect_rev, no_checkout);
}
diff --git a/builtin.h b/builtin.h
index 67f8051..9e4a898 100644
--- a/builtin.h
+++ b/builtin.h
@@ -103,6 +103,7 @@ extern int cmd_prune_packed(int argc, const char **argv, const char *prefix);
extern int cmd_pull(int argc, const char **argv, const char *prefix);
extern int cmd_push(int argc, const char **argv, const char *prefix);
extern int cmd_read_tree(int argc, const char **argv, const char *prefix);
+extern int cmd_rebase__helper(int argc, const char **argv, const char *prefix);
extern int cmd_receive_pack(int argc, const char **argv, const char *prefix);
extern int cmd_reflog(int argc, const char **argv, const char *prefix);
extern int cmd_remote(int argc, const char **argv, const char *prefix);
diff --git a/builtin/branch.c b/builtin/branch.c
index 9d30f55..cbaa6d0 100644
--- a/builtin/branch.c
+++ b/builtin/branch.c
@@ -28,6 +28,7 @@ static const char * const builtin_branch_usage[] = {
N_("git branch [<options>] [-r] (-d | -D) <branch-name>..."),
N_("git branch [<options>] (-m | -M) [<old-branch>] <new-branch>"),
N_("git branch [<options>] [-r | -a] [--points-at]"),
+ N_("git branch [<options>] [-r | -a] [--format]"),
NULL
};
@@ -37,11 +38,11 @@ static unsigned char head_sha1[20];
static int branch_use_color = -1;
static char branch_colors[][COLOR_MAXLEN] = {
GIT_COLOR_RESET,
- GIT_COLOR_NORMAL, /* PLAIN */
- GIT_COLOR_RED, /* REMOTE */
- GIT_COLOR_NORMAL, /* LOCAL */
- GIT_COLOR_GREEN, /* CURRENT */
- GIT_COLOR_BLUE, /* UPSTREAM */
+ GIT_COLOR_NORMAL, /* PLAIN */
+ GIT_COLOR_RED, /* REMOTE */
+ GIT_COLOR_NORMAL, /* LOCAL */
+ GIT_COLOR_GREEN, /* CURRENT */
+ GIT_COLOR_BLUE, /* UPSTREAM */
};
enum color_branch {
BRANCH_COLOR_RESET = 0,
@@ -280,221 +281,98 @@ static int delete_branches(int argc, const char **argv, int force, int kinds,
return(ret);
}
-static void fill_tracking_info(struct strbuf *stat, const char *branch_name,
- int show_upstream_ref)
+static int calc_maxwidth(struct ref_array *refs, int remote_bonus)
{
- int ours, theirs;
- char *ref = NULL;
- struct branch *branch = branch_get(branch_name);
- const char *upstream;
- struct strbuf fancy = STRBUF_INIT;
- int upstream_is_gone = 0;
- int added_decoration = 1;
-
- if (stat_tracking_info(branch, &ours, &theirs, &upstream) < 0) {
- if (!upstream)
- return;
- upstream_is_gone = 1;
- }
-
- if (show_upstream_ref) {
- ref = shorten_unambiguous_ref(upstream, 0);
- if (want_color(branch_use_color))
- strbuf_addf(&fancy, "%s%s%s",
- branch_get_color(BRANCH_COLOR_UPSTREAM),
- ref, branch_get_color(BRANCH_COLOR_RESET));
- else
- strbuf_addstr(&fancy, ref);
- }
+ int i, max = 0;
+ for (i = 0; i < refs->nr; i++) {
+ struct ref_array_item *it = refs->items[i];
+ const char *desc = it->refname;
+ int w;
- if (upstream_is_gone) {
- if (show_upstream_ref)
- strbuf_addf(stat, _("[%s: gone]"), fancy.buf);
- else
- added_decoration = 0;
- } else if (!ours && !theirs) {
- if (show_upstream_ref)
- strbuf_addf(stat, _("[%s]"), fancy.buf);
- else
- added_decoration = 0;
- } else if (!ours) {
- if (show_upstream_ref)
- strbuf_addf(stat, _("[%s: behind %d]"), fancy.buf, theirs);
- else
- strbuf_addf(stat, _("[behind %d]"), theirs);
+ skip_prefix(it->refname, "refs/heads/", &desc);
+ skip_prefix(it->refname, "refs/remotes/", &desc);
+ if (it->kind == FILTER_REFS_DETACHED_HEAD) {
+ char *head_desc = get_head_description();
+ w = utf8_strwidth(head_desc);
+ free(head_desc);
+ } else
+ w = utf8_strwidth(desc);
- } else if (!theirs) {
- if (show_upstream_ref)
- strbuf_addf(stat, _("[%s: ahead %d]"), fancy.buf, ours);
- else
- strbuf_addf(stat, _("[ahead %d]"), ours);
- } else {
- if (show_upstream_ref)
- strbuf_addf(stat, _("[%s: ahead %d, behind %d]"),
- fancy.buf, ours, theirs);
- else
- strbuf_addf(stat, _("[ahead %d, behind %d]"),
- ours, theirs);
+ if (it->kind == FILTER_REFS_REMOTES)
+ w += remote_bonus;
+ if (w > max)
+ max = w;
}
- strbuf_release(&fancy);
- if (added_decoration)
- strbuf_addch(stat, ' ');
- free(ref);
+ return max;
}
-static void add_verbose_info(struct strbuf *out, struct ref_array_item *item,
- struct ref_filter *filter, const char *refname)
+static const char *quote_literal_for_format(const char *s)
{
- struct strbuf subject = STRBUF_INIT, stat = STRBUF_INIT;
- const char *sub = _(" **** invalid ref ****");
- struct commit *commit = item->commit;
+ static struct strbuf buf = STRBUF_INIT;
- if (!parse_commit(commit)) {
- pp_commit_easy(CMIT_FMT_ONELINE, commit, &subject);
- sub = subject.buf;
+ strbuf_reset(&buf);
+ while (*s) {
+ const char *ep = strchrnul(s, '%');
+ if (s < ep)
+ strbuf_add(&buf, s, ep - s);
+ if (*ep == '%') {
+ strbuf_addstr(&buf, "%%");
+ s = ep + 1;
+ } else {
+ s = ep;
+ }
}
-
- if (item->kind == FILTER_REFS_BRANCHES)
- fill_tracking_info(&stat, refname, filter->verbose > 1);
-
- strbuf_addf(out, " %s %s%s",
- find_unique_abbrev(item->commit->object.oid.hash, filter->abbrev),
- stat.buf, sub);
- strbuf_release(&stat);
- strbuf_release(&subject);
+ return buf.buf;
}
-static char *get_head_description(void)
+static char *build_format(struct ref_filter *filter, int maxwidth, const char *remote_prefix)
{
- struct strbuf desc = STRBUF_INIT;
- struct wt_status_state state;
- memset(&state, 0, sizeof(state));
- wt_status_get_state(&state, 1);
- if (state.rebase_in_progress ||
- state.rebase_interactive_in_progress)
- strbuf_addf(&desc, _("(no branch, rebasing %s)"),
- state.branch);
- else if (state.bisect_in_progress)
- strbuf_addf(&desc, _("(no branch, bisect started on %s)"),
- state.branch);
- else if (state.detached_from) {
- if (state.detached_at)
- /* TRANSLATORS: make sure this matches
- "HEAD detached at " in wt-status.c */
- strbuf_addf(&desc, _("(HEAD detached at %s)"),
- state.detached_from);
- else
- /* TRANSLATORS: make sure this matches
- "HEAD detached from " in wt-status.c */
- strbuf_addf(&desc, _("(HEAD detached from %s)"),
- state.detached_from);
- }
- else
- strbuf_addstr(&desc, _("(no branch)"));
- free(state.branch);
- free(state.onto);
- free(state.detached_from);
- return strbuf_detach(&desc, NULL);
-}
+ struct strbuf fmt = STRBUF_INIT;
+ struct strbuf local = STRBUF_INIT;
+ struct strbuf remote = STRBUF_INIT;
-static void format_and_print_ref_item(struct ref_array_item *item, int maxwidth,
- struct ref_filter *filter, const char *remote_prefix)
-{
- char c;
- int current = 0;
- int color;
- struct strbuf out = STRBUF_INIT, name = STRBUF_INIT;
- const char *prefix_to_show = "";
- const char *prefix_to_skip = NULL;
- const char *desc = item->refname;
- char *to_free = NULL;
+ strbuf_addf(&fmt, "%%(if)%%(HEAD)%%(then)* %s%%(else) %%(end)",
+ branch_get_color(BRANCH_COLOR_CURRENT));
- switch (item->kind) {
- case FILTER_REFS_BRANCHES:
- prefix_to_skip = "refs/heads/";
- skip_prefix(desc, prefix_to_skip, &desc);
- if (!filter->detached && !strcmp(desc, head))
- current = 1;
+ if (filter->verbose) {
+ strbuf_addf(&local, "%%(align:%d,left)%%(refname:lstrip=2)%%(end)", maxwidth);
+ strbuf_addf(&local, "%s", branch_get_color(BRANCH_COLOR_RESET));
+ strbuf_addf(&local, " %%(objectname:short=7) ");
+
+ if (filter->verbose > 1)
+ strbuf_addf(&local, "%%(if)%%(upstream)%%(then)[%s%%(upstream:short)%s%%(if)%%(upstream:track)"
+ "%%(then): %%(upstream:track,nobracket)%%(end)] %%(end)%%(contents:subject)",
+ branch_get_color(BRANCH_COLOR_UPSTREAM), branch_get_color(BRANCH_COLOR_RESET));
else
- color = BRANCH_COLOR_LOCAL;
- break;
- case FILTER_REFS_REMOTES:
- prefix_to_skip = "refs/remotes/";
- skip_prefix(desc, prefix_to_skip, &desc);
- color = BRANCH_COLOR_REMOTE;
- prefix_to_show = remote_prefix;
- break;
- case FILTER_REFS_DETACHED_HEAD:
- desc = to_free = get_head_description();
- current = 1;
- break;
- default:
- color = BRANCH_COLOR_PLAIN;
- break;
- }
+ strbuf_addf(&local, "%%(if)%%(upstream:track)%%(then)%%(upstream:track) %%(end)%%(contents:subject)");
- c = ' ';
- if (current) {
- c = '*';
- color = BRANCH_COLOR_CURRENT;
- }
-
- strbuf_addf(&name, "%s%s", prefix_to_show, desc);
- if (filter->verbose) {
- int utf8_compensation = strlen(name.buf) - utf8_strwidth(name.buf);
- strbuf_addf(&out, "%c %s%-*s%s", c, branch_get_color(color),
- maxwidth + utf8_compensation, name.buf,
+ strbuf_addf(&remote, "%s%%(align:%d,left)%s%%(refname:lstrip=2)%%(end)%s%%(if)%%(symref)%%(then) -> %%(symref:short)"
+ "%%(else) %%(objectname:short=7) %%(contents:subject)%%(end)",
+ branch_get_color(BRANCH_COLOR_REMOTE), maxwidth, quote_literal_for_format(remote_prefix),
branch_get_color(BRANCH_COLOR_RESET));
- } else
- strbuf_addf(&out, "%c %s%s%s", c, branch_get_color(color),
- name.buf, branch_get_color(BRANCH_COLOR_RESET));
-
- if (item->symref) {
- const char *symref = item->symref;
- if (prefix_to_skip)
- skip_prefix(symref, prefix_to_skip, &symref);
- strbuf_addf(&out, " -> %s", symref);
- }
- else if (filter->verbose)
- /* " f7c0c00 [ahead 58, behind 197] vcs-svn: drop obj_pool.h" */
- add_verbose_info(&out, item, filter, desc);
- if (column_active(colopts)) {
- assert(!filter->verbose && "--column and --verbose are incompatible");
- string_list_append(&output, out.buf);
} else {
- printf("%s\n", out.buf);
+ strbuf_addf(&local, "%%(refname:lstrip=2)%s%%(if)%%(symref)%%(then) -> %%(symref:short)%%(end)",
+ branch_get_color(BRANCH_COLOR_RESET));
+ strbuf_addf(&remote, "%s%s%%(refname:lstrip=2)%s%%(if)%%(symref)%%(then) -> %%(symref:short)%%(end)",
+ branch_get_color(BRANCH_COLOR_REMOTE), quote_literal_for_format(remote_prefix),
+ branch_get_color(BRANCH_COLOR_RESET));
}
- strbuf_release(&name);
- strbuf_release(&out);
- free(to_free);
-}
-
-static int calc_maxwidth(struct ref_array *refs, int remote_bonus)
-{
- int i, max = 0;
- for (i = 0; i < refs->nr; i++) {
- struct ref_array_item *it = refs->items[i];
- const char *desc = it->refname;
- int w;
- skip_prefix(it->refname, "refs/heads/", &desc);
- skip_prefix(it->refname, "refs/remotes/", &desc);
- w = utf8_strwidth(desc);
+ strbuf_addf(&fmt, "%%(if:notequals=refs/remotes)%%(refname:rstrip=-2)%%(then)%s%%(else)%s%%(end)", local.buf, remote.buf);
- if (it->kind == FILTER_REFS_REMOTES)
- w += remote_bonus;
- if (w > max)
- max = w;
- }
- return max;
+ strbuf_release(&local);
+ strbuf_release(&remote);
+ return strbuf_detach(&fmt, NULL);
}
-static void print_ref_list(struct ref_filter *filter, struct ref_sorting *sorting)
+static void print_ref_list(struct ref_filter *filter, struct ref_sorting *sorting, const char *format)
{
int i;
struct ref_array array;
int maxwidth = 0;
const char *remote_prefix = "";
+ struct strbuf out = STRBUF_INIT;
+ char *to_free = NULL;
/*
* If we are listing more than just remote branches,
@@ -506,18 +384,32 @@ static void print_ref_list(struct ref_filter *filter, struct ref_sorting *sortin
memset(&array, 0, sizeof(array));
- verify_ref_format("%(refname)%(symref)");
filter_refs(&array, filter, filter->kind | FILTER_REFS_INCLUDE_BROKEN);
if (filter->verbose)
maxwidth = calc_maxwidth(&array, strlen(remote_prefix));
+ if (!format)
+ format = to_free = build_format(filter, maxwidth, remote_prefix);
+ verify_ref_format(format);
+
ref_array_sort(sorting, &array);
- for (i = 0; i < array.nr; i++)
- format_and_print_ref_item(array.items[i], maxwidth, filter, remote_prefix);
+ for (i = 0; i < array.nr; i++) {
+ format_ref_array_item(array.items[i], format, 0, &out);
+ if (column_active(colopts)) {
+ assert(!filter->verbose && "--column and --verbose are incompatible");
+ /* format to a string_list to let print_columns() do its job */
+ string_list_append(&output, out.buf);
+ } else {
+ fwrite(out.buf, 1, out.len, stdout);
+ putchar('\n');
+ }
+ strbuf_release(&out);
+ }
ref_array_clear(&array);
+ free(to_free);
}
static void reject_rebase_or_bisect_branch(const char *target)
@@ -638,6 +530,7 @@ int cmd_branch(int argc, const char **argv, const char *prefix)
struct ref_filter filter;
int icase = 0;
static struct ref_sorting *sorting = NULL, **sorting_tail = &sorting;
+ const char *format = NULL;
struct option options[] = {
OPT_GROUP(N_("Generic options")),
@@ -679,9 +572,12 @@ int cmd_branch(int argc, const char **argv, const char *prefix)
N_("print only branches of the object"), 0, parse_opt_object_name
},
OPT_BOOL('i', "ignore-case", &icase, N_("sorting and filtering are case insensitive")),
+ OPT_STRING( 0 , "format", &format, N_("format"), N_("format to use for the output")),
OPT_END(),
};
+ setup_ref_filter_porcelain_msg();
+
memset(&filter, 0, sizeof(filter));
filter.kind = FILTER_REFS_BRANCHES;
filter.abbrev = -1;
@@ -749,7 +645,7 @@ int cmd_branch(int argc, const char **argv, const char *prefix)
if (!sorting)
sorting = ref_default_sorting();
sorting->ignore_case = icase;
- print_ref_list(&filter, sorting);
+ print_ref_list(&filter, sorting, format);
print_columns(&output, colopts, NULL);
string_list_clear(&output, 0);
return 0;
diff --git a/builtin/check-attr.c b/builtin/check-attr.c
index 53a5a18..4d01ca0 100644
--- a/builtin/check-attr.c
+++ b/builtin/check-attr.c
@@ -24,12 +24,13 @@ static const struct option check_attr_options[] = {
OPT_END()
};
-static void output_attr(int cnt, struct git_attr_check *check,
- const char *file)
+static void output_attr(struct attr_check *check, const char *file)
{
int j;
+ int cnt = check->nr;
+
for (j = 0; j < cnt; j++) {
- const char *value = check[j].value;
+ const char *value = check->items[j].value;
if (ATTR_TRUE(value))
value = "set";
@@ -42,35 +43,38 @@ static void output_attr(int cnt, struct git_attr_check *check,
printf("%s%c" /* path */
"%s%c" /* attrname */
"%s%c" /* attrvalue */,
- file, 0, git_attr_name(check[j].attr), 0, value, 0);
+ file, 0,
+ git_attr_name(check->items[j].attr), 0, value, 0);
} else {
quote_c_style(file, NULL, stdout, 0);
- printf(": %s: %s\n", git_attr_name(check[j].attr), value);
+ printf(": %s: %s\n",
+ git_attr_name(check->items[j].attr), value);
}
-
}
}
-static void check_attr(const char *prefix, int cnt,
- struct git_attr_check *check, const char *file)
+static void check_attr(const char *prefix,
+ struct attr_check *check,
+ int collect_all,
+ const char *file)
{
char *full_path =
prefix_path(prefix, prefix ? strlen(prefix) : 0, file);
- if (check != NULL) {
- if (git_check_attr(full_path, cnt, check))
- die("git_check_attr died");
- output_attr(cnt, check, file);
+
+ if (collect_all) {
+ git_all_attrs(full_path, check);
} else {
- if (git_all_attrs(full_path, &cnt, &check))
- die("git_all_attrs died");
- output_attr(cnt, check, file);
- free(check);
+ if (git_check_attr(full_path, check))
+ die("git_check_attr died");
}
+ output_attr(check, file);
+
free(full_path);
}
-static void check_attr_stdin_paths(const char *prefix, int cnt,
- struct git_attr_check *check)
+static void check_attr_stdin_paths(const char *prefix,
+ struct attr_check *check,
+ int collect_all)
{
struct strbuf buf = STRBUF_INIT;
struct strbuf unquoted = STRBUF_INIT;
@@ -84,7 +88,7 @@ static void check_attr_stdin_paths(const char *prefix, int cnt,
die("line is badly quoted");
strbuf_swap(&buf, &unquoted);
}
- check_attr(prefix, cnt, check, buf.buf);
+ check_attr(prefix, check, collect_all, buf.buf);
maybe_flush_or_die(stdout, "attribute to stdout");
}
strbuf_release(&buf);
@@ -99,7 +103,7 @@ static NORETURN void error_with_usage(const char *msg)
int cmd_check_attr(int argc, const char **argv, const char *prefix)
{
- struct git_attr_check *check;
+ struct attr_check *check;
int cnt, i, doubledash, filei;
if (!is_bare_repository())
@@ -159,28 +163,26 @@ int cmd_check_attr(int argc, const char **argv, const char *prefix)
error_with_usage("No file specified");
}
- if (all_attrs) {
- check = NULL;
- } else {
- check = xcalloc(cnt, sizeof(*check));
+ check = attr_check_alloc();
+ if (!all_attrs) {
for (i = 0; i < cnt; i++) {
- const char *name;
- struct git_attr *a;
- name = argv[i];
- a = git_attr(name);
+ const struct git_attr *a = git_attr(argv[i]);
+
if (!a)
return error("%s: not a valid attribute name",
- name);
- check[i].attr = a;
+ argv[i]);
+ attr_check_append(check, a);
}
}
if (stdin_paths)
- check_attr_stdin_paths(prefix, cnt, check);
+ check_attr_stdin_paths(prefix, check, all_attrs);
else {
for (i = filei; i < argc; i++)
- check_attr(prefix, cnt, check, argv[i]);
+ check_attr(prefix, check, all_attrs, argv[i]);
maybe_flush_or_die(stdout, "attribute to stdout");
}
+
+ attr_check_free(check);
return 0;
}
diff --git a/builtin/clean.c b/builtin/clean.c
index d6bc3aa..d861f83 100644
--- a/builtin/clean.c
+++ b/builtin/clean.c
@@ -174,8 +174,10 @@ static int remove_dirs(struct strbuf *path, const char *prefix, int force_flag,
/* an empty dir could be removed even if it is unreadble */
res = dry_run ? 0 : rmdir(path->buf);
if (res) {
+ int saved_errno = errno;
quote_path_relative(path->buf, prefix, &quoted);
- warning(_(msg_warn_remove_failed), quoted.buf);
+ errno = saved_errno;
+ warning_errno(_(msg_warn_remove_failed), quoted.buf);
*dir_gone = 0;
}
return res;
@@ -208,8 +210,10 @@ static int remove_dirs(struct strbuf *path, const char *prefix, int force_flag,
quote_path_relative(path->buf, prefix, &quoted);
string_list_append(&dels, quoted.buf);
} else {
+ int saved_errno = errno;
quote_path_relative(path->buf, prefix, &quoted);
- warning(_(msg_warn_remove_failed), quoted.buf);
+ errno = saved_errno;
+ warning_errno(_(msg_warn_remove_failed), quoted.buf);
*dir_gone = 0;
ret = 1;
}
@@ -230,8 +234,10 @@ static int remove_dirs(struct strbuf *path, const char *prefix, int force_flag,
if (!res)
*dir_gone = 1;
else {
+ int saved_errno = errno;
quote_path_relative(path->buf, prefix, &quoted);
- warning(_(msg_warn_remove_failed), quoted.buf);
+ errno = saved_errno;
+ warning_errno(_(msg_warn_remove_failed), quoted.buf);
*dir_gone = 0;
ret = 1;
}
@@ -981,8 +987,10 @@ int cmd_clean(int argc, const char **argv, const char *prefix)
} else {
res = dry_run ? 0 : unlink(abs_path.buf);
if (res) {
+ int saved_errno = errno;
qname = quote_path_relative(item->string, NULL, &buf);
- warning(_(msg_warn_remove_failed), qname);
+ errno = saved_errno;
+ warning_errno(_(msg_warn_remove_failed), qname);
errors++;
} else if (!quiet) {
qname = quote_path_relative(item->string, NULL, &buf);
diff --git a/builtin/describe.c b/builtin/describe.c
index 01490a1..6769446 100644
--- a/builtin/describe.c
+++ b/builtin/describe.c
@@ -28,7 +28,8 @@ static int abbrev = -1; /* unspecified */
static int max_candidates = 10;
static struct hashmap names;
static int have_util;
-static const char *pattern;
+static struct string_list patterns = STRING_LIST_INIT_NODUP;
+static struct string_list exclude_patterns = STRING_LIST_INIT_NODUP;
static int always;
static const char *dirty;
@@ -129,9 +130,40 @@ static int get_name(const char *path, const struct object_id *oid, int flag, voi
if (!all && !is_tag)
return 0;
- /* Accept only tags that match the pattern, if given */
- if (pattern && (!is_tag || wildmatch(pattern, path + 10, 0, NULL)))
- return 0;
+ /*
+ * If we're given exclude patterns, first exclude any tag which match
+ * any of the exclude pattern.
+ */
+ if (exclude_patterns.nr) {
+ struct string_list_item *item;
+
+ if (!is_tag)
+ return 0;
+
+ for_each_string_list_item(item, &exclude_patterns) {
+ if (!wildmatch(item->string, path + 10, 0, NULL))
+ return 0;
+ }
+ }
+
+ /*
+ * If we're given patterns, accept only tags which match at least one
+ * pattern.
+ */
+ if (patterns.nr) {
+ struct string_list_item *item;
+
+ if (!is_tag)
+ return 0;
+
+ for_each_string_list_item(item, &patterns) {
+ if (!wildmatch(item->string, path + 10, 0, NULL))
+ break;
+
+ /* If we get here, no pattern matched. */
+ return 0;
+ }
+ }
/* Is it annotated? */
if (!peel_ref(path, peeled.hash)) {
@@ -404,8 +436,10 @@ int cmd_describe(int argc, const char **argv, const char *prefix)
N_("only output exact matches"), 0),
OPT_INTEGER(0, "candidates", &max_candidates,
N_("consider <n> most recent tags (default: 10)")),
- OPT_STRING(0, "match", &pattern, N_("pattern"),
+ OPT_STRING_LIST(0, "match", &patterns, N_("pattern"),
N_("only consider tags matching <pattern>")),
+ OPT_STRING_LIST(0, "exclude", &exclude_patterns, N_("pattern"),
+ N_("do not consider tags matching <pattern>")),
OPT_BOOL(0, "always", &always,
N_("show abbreviated commit object as fallback")),
{OPTION_STRING, 0, "dirty", &dirty, N_("mark"),
@@ -430,6 +464,7 @@ int cmd_describe(int argc, const char **argv, const char *prefix)
die(_("--long is incompatible with --abbrev=0"));
if (contains) {
+ struct string_list_item *item;
struct argv_array args;
argv_array_init(&args);
@@ -440,8 +475,10 @@ int cmd_describe(int argc, const char **argv, const char *prefix)
argv_array_push(&args, "--always");
if (!all) {
argv_array_push(&args, "--tags");
- if (pattern)
- argv_array_pushf(&args, "--refs=refs/tags/%s", pattern);
+ for_each_string_list_item(item, &patterns)
+ argv_array_pushf(&args, "--refs=refs/tags/%s", item->string);
+ for_each_string_list_item(item, &exclude_patterns)
+ argv_array_pushf(&args, "--exclude=refs/tags/%s", item->string);
}
if (argc)
argv_array_pushv(&args, argv);
diff --git a/builtin/diff-tree.c b/builtin/diff-tree.c
index 806dd7a..8ce0048 100644
--- a/builtin/diff-tree.c
+++ b/builtin/diff-tree.c
@@ -147,9 +147,7 @@ int cmd_diff_tree(int argc, const char **argv, const char *prefix)
tree1 = opt->pending.objects[0].item;
tree2 = opt->pending.objects[1].item;
if (tree2->flags & UNINTERESTING) {
- struct object *tmp = tree2;
- tree2 = tree1;
- tree1 = tmp;
+ SWAP(tree2, tree1);
}
diff_tree_sha1(tree1->oid.hash,
tree2->oid.hash,
diff --git a/builtin/diff.c b/builtin/diff.c
index 7f91f6d..3d64b85 100644
--- a/builtin/diff.c
+++ b/builtin/diff.c
@@ -45,12 +45,9 @@ static void stuff_change(struct diff_options *opt,
return;
if (DIFF_OPT_TST(opt, REVERSE_DIFF)) {
- unsigned tmp;
- const unsigned char *tmp_u;
- const char *tmp_c;
- tmp = old_mode; old_mode = new_mode; new_mode = tmp;
- tmp_u = old_sha1; old_sha1 = new_sha1; new_sha1 = tmp_u;
- tmp_c = old_name; old_name = new_name; new_name = tmp_c;
+ SWAP(old_mode, new_mode);
+ SWAP(old_sha1, new_sha1);
+ SWAP(old_name, new_name);
}
if (opt->prefix &&
diff --git a/builtin/difftool.c b/builtin/difftool.c
index b5e85ab..d13350c 100644
--- a/builtin/difftool.c
+++ b/builtin/difftool.c
@@ -647,10 +647,6 @@ int cmd_difftool(int argc, const char **argv, const char *prefix)
OPT_END()
};
- /* NEEDSWORK: once we no longer spawn anything, remove this */
- setenv(GIT_DIR_ENVIRONMENT, absolute_path(get_git_dir()), 1);
- setenv(GIT_WORK_TREE_ENVIRONMENT, absolute_path(get_git_work_tree()), 1);
-
git_config(difftool_config, NULL);
symlinks = has_symlinks;
@@ -661,6 +657,10 @@ int cmd_difftool(int argc, const char **argv, const char *prefix)
if (tool_help)
return print_tool_help();
+ /* NEEDSWORK: once we no longer spawn anything, remove this */
+ setenv(GIT_DIR_ENVIRONMENT, absolute_path(get_git_dir()), 1);
+ setenv(GIT_WORK_TREE_ENVIRONMENT, absolute_path(get_git_work_tree()), 1);
+
if (use_gui_tool && diff_gui_tool && *diff_gui_tool)
setenv("GIT_DIFF_TOOL", diff_gui_tool, 1);
else if (difftool_cmd) {
diff --git a/builtin/gc.c b/builtin/gc.c
index 331f219..a2b9e89 100644
--- a/builtin/gc.c
+++ b/builtin/gc.c
@@ -33,6 +33,8 @@ static int aggressive_window = 250;
static int gc_auto_threshold = 6700;
static int gc_auto_pack_limit = 50;
static int detach_auto = 1;
+static unsigned long gc_log_expire_time;
+static const char *gc_log_expire = "1.day.ago";
static const char *prune_expire = "2.weeks.ago";
static const char *prune_worktrees_expire = "3.months.ago";
@@ -76,10 +78,28 @@ static void git_config_date_string(const char *key, const char **output)
static void process_log_file(void)
{
struct stat st;
- if (!fstat(get_lock_file_fd(&log_lock), &st) && st.st_size)
+ if (fstat(get_lock_file_fd(&log_lock), &st)) {
+ /*
+ * Perhaps there was an i/o error or another
+ * unlikely situation. Try to make a note of
+ * this in gc.log along with any existing
+ * messages.
+ */
+ int saved_errno = errno;
+ fprintf(stderr, _("Failed to fstat %s: %s"),
+ get_tempfile_path(&log_lock.tempfile),
+ strerror(saved_errno));
+ fflush(stderr);
commit_lock_file(&log_lock);
- else
+ errno = saved_errno;
+ } else if (st.st_size) {
+ /* There was some error recorded in the lock file */
+ commit_lock_file(&log_lock);
+ } else {
+ /* No error, clean up any old gc.log */
+ unlink(git_path("gc.log"));
rollback_lock_file(&log_lock);
+ }
}
static void process_log_file_at_exit(void)
@@ -113,6 +133,8 @@ static void gc_config(void)
git_config_get_bool("gc.autodetach", &detach_auto);
git_config_date_string("gc.pruneexpire", &prune_expire);
git_config_date_string("gc.worktreepruneexpire", &prune_worktrees_expire);
+ git_config_date_string("gc.logexpiry", &gc_log_expire);
+
git_config(git_default_config, NULL);
}
@@ -290,19 +312,34 @@ static const char *lock_repo_for_gc(int force, pid_t* ret_pid)
static int report_last_gc_error(void)
{
struct strbuf sb = STRBUF_INIT;
- int ret;
+ int ret = 0;
+ struct stat st;
+ char *gc_log_path = git_pathdup("gc.log");
- ret = strbuf_read_file(&sb, git_path("gc.log"), 0);
+ if (stat(gc_log_path, &st)) {
+ if (errno == ENOENT)
+ goto done;
+
+ ret = error_errno(_("Can't stat %s"), gc_log_path);
+ goto done;
+ }
+
+ if (st.st_mtime < gc_log_expire_time)
+ goto done;
+
+ ret = strbuf_read_file(&sb, gc_log_path, 0);
if (ret > 0)
- return error(_("The last gc run reported the following. "
+ ret = error(_("The last gc run reported the following. "
"Please correct the root cause\n"
"and remove %s.\n"
"Automatic cleanup will not be performed "
"until the file is removed.\n\n"
"%s"),
- git_path("gc.log"), sb.buf);
+ gc_log_path, sb.buf);
strbuf_release(&sb);
- return 0;
+done:
+ free(gc_log_path);
+ return ret;
}
static int gc_before_repack(void)
@@ -349,7 +386,10 @@ int cmd_gc(int argc, const char **argv, const char *prefix)
argv_array_pushl(&prune_worktrees, "worktree", "prune", "--expire", NULL);
argv_array_pushl(&rerere, "rerere", "gc", NULL);
+ /* default expiry time, overwritten in gc_config */
gc_config();
+ if (parse_expiry_date(gc_log_expire, &gc_log_expire_time))
+ die(_("Failed to parse gc.logexpiry value %s"), gc_log_expire);
if (pack_refs < 0)
pack_refs = !is_bare_repository();
@@ -448,5 +488,8 @@ int cmd_gc(int argc, const char **argv, const char *prefix)
warning(_("There are too many unreachable loose objects; "
"run 'git prune' to remove them."));
+ if (!daemonized)
+ unlink(git_path("gc.log"));
+
return 0;
}
diff --git a/builtin/grep.c b/builtin/grep.c
index 2c727ef..9304c33 100644
--- a/builtin/grep.c
+++ b/builtin/grep.c
@@ -967,6 +967,7 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
int dummy;
int use_index = 1;
int pattern_type_arg = GREP_PATTERN_TYPE_UNSPECIFIED;
+ int allow_revs;
struct option options[] = {
OPT_BOOL(0, "cached", &cached,
@@ -1149,26 +1150,69 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
compile_grep_patterns(&opt);
- /* Check revs and then paths */
+ /*
+ * We have to find "--" in a separate pass, because its presence
+ * influences how we will parse arguments that come before it.
+ */
+ for (i = 0; i < argc; i++) {
+ if (!strcmp(argv[i], "--")) {
+ seen_dashdash = 1;
+ break;
+ }
+ }
+
+ /*
+ * Resolve any rev arguments. If we have a dashdash, then everything up
+ * to it must resolve as a rev. If not, then we stop at the first
+ * non-rev and assume everything else is a path.
+ */
+ allow_revs = use_index && !untracked;
for (i = 0; i < argc; i++) {
const char *arg = argv[i];
unsigned char sha1[20];
struct object_context oc;
- /* Is it a rev? */
- if (!get_sha1_with_context(arg, 0, sha1, &oc)) {
- struct object *object = parse_object_or_die(sha1, arg);
- if (!seen_dashdash)
- verify_non_filename(prefix, arg);
- add_object_array_with_path(object, arg, &list, oc.mode, oc.path);
- continue;
- }
+ struct object *object;
+
if (!strcmp(arg, "--")) {
i++;
- seen_dashdash = 1;
+ break;
}
- break;
+
+ if (!allow_revs) {
+ if (seen_dashdash)
+ die(_("--no-index or --untracked cannot be used with revs"));
+ break;
+ }
+
+ if (get_sha1_with_context(arg, 0, sha1, &oc)) {
+ if (seen_dashdash)
+ die(_("unable to resolve revision: %s"), arg);
+ break;
+ }
+
+ object = parse_object_or_die(sha1, arg);
+ if (!seen_dashdash)
+ verify_non_filename(prefix, arg);
+ add_object_array_with_path(object, arg, &list, oc.mode, oc.path);
}
+ /*
+ * Anything left over is presumed to be a path. But in the non-dashdash
+ * "do what I mean" case, we verify and complain when that isn't true.
+ */
+ if (!seen_dashdash) {
+ int j;
+ for (j = i; j < argc; j++)
+ verify_filename(prefix, argv[j], j == i && allow_revs);
+ }
+
+ parse_pathspec(&pathspec, 0,
+ PATHSPEC_PREFER_CWD |
+ (opt.max_depth != -1 ? PATHSPEC_MAXDEPTH_VALID : 0),
+ prefix, argv + i);
+ pathspec.max_depth = opt.max_depth;
+ pathspec.recursive = 1;
+
#ifndef NO_PTHREADS
if (list.nr || cached || show_in_pager)
num_threads = 0;
@@ -1190,20 +1234,6 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
}
#endif
- /* The rest are paths */
- if (!seen_dashdash) {
- int j;
- for (j = i; j < argc; j++)
- verify_filename(prefix, argv[j], j == i);
- }
-
- parse_pathspec(&pathspec, 0,
- PATHSPEC_PREFER_CWD |
- (opt.max_depth != -1 ? PATHSPEC_MAXDEPTH_VALID : 0),
- prefix, argv + i);
- pathspec.max_depth = opt.max_depth;
- pathspec.recursive = 1;
-
if (recurse_submodules) {
gitmodules_config();
compile_submodule_options(&opt, &pathspec, cached, untracked,
@@ -1245,8 +1275,6 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
if (!use_index || untracked) {
int use_exclude = (opt_exclude < 0) ? use_index : !!opt_exclude;
- if (list.nr)
- die(_("--no-index or --untracked cannot be used with revs."));
hit = grep_directory(&opt, &pathspec, use_exclude, use_index);
} else if (0 <= opt_exclude) {
die(_("--[no-]exclude-standard cannot be used for tracked contents."));
diff --git a/builtin/ls-files.c b/builtin/ls-files.c
index 1592290..1c0f057 100644
--- a/builtin/ls-files.c
+++ b/builtin/ls-files.c
@@ -369,28 +369,30 @@ static void show_files(struct dir_struct *dir)
/*
* Prune the index to only contain stuff starting with "prefix"
*/
-static void prune_cache(const char *prefix)
+static void prune_cache(const char *prefix, size_t prefixlen)
{
- int pos = cache_name_pos(prefix, max_prefix_len);
+ int pos;
unsigned int first, last;
+ if (!prefix)
+ return;
+ pos = cache_name_pos(prefix, prefixlen);
if (pos < 0)
pos = -pos-1;
- memmove(active_cache, active_cache + pos,
- (active_nr - pos) * sizeof(struct cache_entry *));
- active_nr -= pos;
- first = 0;
+ first = pos;
last = active_nr;
while (last > first) {
int next = (last + first) >> 1;
const struct cache_entry *ce = active_cache[next];
- if (!strncmp(ce->name, prefix, max_prefix_len)) {
+ if (!strncmp(ce->name, prefix, prefixlen)) {
first = next+1;
continue;
}
last = next;
}
- active_nr = last;
+ memmove(active_cache, active_cache + pos,
+ (last - pos) * sizeof(struct cache_entry *));
+ active_nr = last - pos;
}
/*
@@ -641,8 +643,7 @@ int cmd_ls_files(int argc, const char **argv, const char *cmd_prefix)
show_killed || show_modified || show_resolve_undo))
show_cached = 1;
- if (max_prefix)
- prune_cache(max_prefix);
+ prune_cache(max_prefix, max_prefix_len);
if (with_tree) {
/*
* Basic sanity check; show-stages and show-unmerged
diff --git a/builtin/name-rev.c b/builtin/name-rev.c
index cd89d48..8bdc3ea 100644
--- a/builtin/name-rev.c
+++ b/builtin/name-rev.c
@@ -108,7 +108,8 @@ static const char *name_ref_abbrev(const char *refname, int shorten_unambiguous)
struct name_ref_data {
int tags_only;
int name_only;
- const char *ref_filter;
+ struct string_list ref_filters;
+ struct string_list exclude_filters;
};
static struct tip_table {
@@ -150,18 +151,49 @@ static int name_ref(const char *path, const struct object_id *oid, int flags, vo
if (data->tags_only && !starts_with(path, "refs/tags/"))
return 0;
- if (data->ref_filter) {
- switch (subpath_matches(path, data->ref_filter)) {
- case -1: /* did not match */
- return 0;
- case 0: /* matched fully */
- break;
- default: /* matched subpath */
- can_abbreviate_output = 1;
- break;
+ if (data->exclude_filters.nr) {
+ struct string_list_item *item;
+
+ for_each_string_list_item(item, &data->exclude_filters) {
+ if (subpath_matches(path, item->string) >= 0)
+ return 0;
}
}
+ if (data->ref_filters.nr) {
+ struct string_list_item *item;
+ int matched = 0;
+
+ /* See if any of the patterns match. */
+ for_each_string_list_item(item, &data->ref_filters) {
+ /*
+ * Check all patterns even after finding a match, so
+ * that we can see if a match with a subpath exists.
+ * When a user asked for 'refs/tags/v*' and 'v1.*',
+ * both of which match, the user is showing her
+ * willingness to accept a shortened output by having
+ * the 'v1.*' in the acceptable refnames, so we
+ * shouldn't stop when seeing 'refs/tags/v1.4' matches
+ * 'refs/tags/v*'. We should show it as 'v1.4'.
+ */
+ switch (subpath_matches(path, item->string)) {
+ case -1: /* did not match */
+ break;
+ case 0: /* matched fully */
+ matched = 1;
+ break;
+ default: /* matched subpath */
+ matched = 1;
+ can_abbreviate_output = 1;
+ break;
+ }
+ }
+
+ /* If none of the patterns matched, stop now */
+ if (!matched)
+ return 0;
+ }
+
add_to_tip_table(oid->hash, path, can_abbreviate_output);
while (o && o->type == OBJ_TAG) {
@@ -306,12 +338,14 @@ int cmd_name_rev(int argc, const char **argv, const char *prefix)
{
struct object_array revs = OBJECT_ARRAY_INIT;
int all = 0, transform_stdin = 0, allow_undefined = 1, always = 0, peel_tag = 0;
- struct name_ref_data data = { 0, 0, NULL };
+ struct name_ref_data data = { 0, 0, STRING_LIST_INIT_NODUP, STRING_LIST_INIT_NODUP };
struct option opts[] = {
OPT_BOOL(0, "name-only", &data.name_only, N_("print only names (no SHA-1)")),
OPT_BOOL(0, "tags", &data.tags_only, N_("only use tags to name the commits")),
- OPT_STRING(0, "refs", &data.ref_filter, N_("pattern"),
+ OPT_STRING_LIST(0, "refs", &data.ref_filters, N_("pattern"),
N_("only use refs matching <pattern>")),
+ OPT_STRING_LIST(0, "exclude", &data.exclude_filters, N_("pattern"),
+ N_("ignore refs matching <pattern>")),
OPT_GROUP(""),
OPT_BOOL(0, "all", &all, N_("list all commits reachable from all refs")),
OPT_BOOL(0, "stdin", &transform_stdin, N_("read from stdin")),
diff --git a/builtin/pack-objects.c b/builtin/pack-objects.c
index 8841f8b..f294dcf 100644
--- a/builtin/pack-objects.c
+++ b/builtin/pack-objects.c
@@ -894,24 +894,15 @@ static void write_pack_file(void)
written, nr_result);
}
-static void setup_delta_attr_check(struct git_attr_check *check)
-{
- static struct git_attr *attr_delta;
-
- if (!attr_delta)
- attr_delta = git_attr("delta");
-
- check[0].attr = attr_delta;
-}
-
static int no_try_delta(const char *path)
{
- struct git_attr_check check[1];
+ static struct attr_check *check;
- setup_delta_attr_check(check);
- if (git_check_attr(path, ARRAY_SIZE(check), check))
+ if (!check)
+ check = attr_check_initl("delta", NULL);
+ if (git_check_attr(path, check))
return 0;
- if (ATTR_FALSE(check->value))
+ if (ATTR_FALSE(check->items[0].value))
return 1;
return 0;
}
@@ -1539,6 +1530,8 @@ static int pack_offset_sort(const void *_a, const void *_b)
* 2. Updating our size/type to the non-delta representation. These were
* either not recorded initially (size) or overwritten with the delta type
* (type) when check_object() decided to reuse the delta.
+ *
+ * 3. Resetting our delta depth, as we are now a base object.
*/
static void drop_reused_delta(struct object_entry *entry)
{
@@ -1552,6 +1545,7 @@ static void drop_reused_delta(struct object_entry *entry)
p = &(*p)->delta_sibling;
}
entry->delta = NULL;
+ entry->depth = 0;
oi.sizep = &entry->size;
oi.typep = &entry->type;
@@ -1570,39 +1564,123 @@ static void drop_reused_delta(struct object_entry *entry)
* Follow the chain of deltas from this entry onward, throwing away any links
* that cause us to hit a cycle (as determined by the DFS state flags in
* the entries).
+ *
+ * We also detect too-long reused chains that would violate our --depth
+ * limit.
*/
static void break_delta_chains(struct object_entry *entry)
{
- /* If it's not a delta, it can't be part of a cycle. */
- if (!entry->delta) {
- entry->dfs_state = DFS_DONE;
- return;
- }
+ /*
+ * The actual depth of each object we will write is stored as an int,
+ * as it cannot exceed our int "depth" limit. But before we break
+ * changes based no that limit, we may potentially go as deep as the
+ * number of objects, which is elsewhere bounded to a uint32_t.
+ */
+ uint32_t total_depth;
+ struct object_entry *cur, *next;
+
+ for (cur = entry, total_depth = 0;
+ cur;
+ cur = cur->delta, total_depth++) {
+ if (cur->dfs_state == DFS_DONE) {
+ /*
+ * We've already seen this object and know it isn't
+ * part of a cycle. We do need to append its depth
+ * to our count.
+ */
+ total_depth += cur->depth;
+ break;
+ }
+
+ /*
+ * We break cycles before looping, so an ACTIVE state (or any
+ * other cruft which made its way into the state variable)
+ * is a bug.
+ */
+ if (cur->dfs_state != DFS_NONE)
+ die("BUG: confusing delta dfs state in first pass: %d",
+ cur->dfs_state);
- switch (entry->dfs_state) {
- case DFS_NONE:
/*
- * This is the first time we've seen the object. We mark it as
- * part of the active potential cycle and recurse.
+ * Now we know this is the first time we've seen the object. If
+ * it's not a delta, we're done traversing, but we'll mark it
+ * done to save time on future traversals.
*/
- entry->dfs_state = DFS_ACTIVE;
- break_delta_chains(entry->delta);
- entry->dfs_state = DFS_DONE;
- break;
+ if (!cur->delta) {
+ cur->dfs_state = DFS_DONE;
+ break;
+ }
- case DFS_DONE:
- /* object already examined, and not part of a cycle */
- break;
+ /*
+ * Mark ourselves as active and see if the next step causes
+ * us to cycle to another active object. It's important to do
+ * this _before_ we loop, because it impacts where we make the
+ * cut, and thus how our total_depth counter works.
+ * E.g., We may see a partial loop like:
+ *
+ * A -> B -> C -> D -> B
+ *
+ * Cutting B->C breaks the cycle. But now the depth of A is
+ * only 1, and our total_depth counter is at 3. The size of the
+ * error is always one less than the size of the cycle we
+ * broke. Commits C and D were "lost" from A's chain.
+ *
+ * If we instead cut D->B, then the depth of A is correct at 3.
+ * We keep all commits in the chain that we examined.
+ */
+ cur->dfs_state = DFS_ACTIVE;
+ if (cur->delta->dfs_state == DFS_ACTIVE) {
+ drop_reused_delta(cur);
+ cur->dfs_state = DFS_DONE;
+ break;
+ }
+ }
+
+ /*
+ * And now that we've gone all the way to the bottom of the chain, we
+ * need to clear the active flags and set the depth fields as
+ * appropriate. Unlike the loop above, which can quit when it drops a
+ * delta, we need to keep going to look for more depth cuts. So we need
+ * an extra "next" pointer to keep going after we reset cur->delta.
+ */
+ for (cur = entry; cur; cur = next) {
+ next = cur->delta;
+
+ /*
+ * We should have a chain of zero or more ACTIVE states down to
+ * a final DONE. We can quit after the DONE, because either it
+ * has no bases, or we've already handled them in a previous
+ * call.
+ */
+ if (cur->dfs_state == DFS_DONE)
+ break;
+ else if (cur->dfs_state != DFS_ACTIVE)
+ die("BUG: confusing delta dfs state in second pass: %d",
+ cur->dfs_state);
- case DFS_ACTIVE:
/*
- * We found a cycle that needs broken. It would be correct to
- * break any link in the chain, but it's convenient to
- * break this one.
+ * If the total_depth is more than depth, then we need to snip
+ * the chain into two or more smaller chains that don't exceed
+ * the maximum depth. Most of the resulting chains will contain
+ * (depth + 1) entries (i.e., depth deltas plus one base), and
+ * the last chain (i.e., the one containing entry) will contain
+ * whatever entries are left over, namely
+ * (total_depth % (depth + 1)) of them.
+ *
+ * Since we are iterating towards decreasing depth, we need to
+ * decrement total_depth as we go, and we need to write to the
+ * entry what its final depth will be after all of the
+ * snipping. Since we're snipping into chains of length (depth
+ * + 1) entries, the final depth of an entry will be its
+ * original depth modulo (depth + 1). Any time we encounter an
+ * entry whose final depth is supposed to be zero, we snip it
+ * from its delta base, thereby making it so.
*/
- drop_reused_delta(entry);
- entry->dfs_state = DFS_DONE;
- break;
+ cur->depth = (total_depth--) % (depth + 1);
+ if (!cur->depth)
+ drop_reused_delta(cur);
+
+ cur->dfs_state = DFS_DONE;
}
}
diff --git a/builtin/rebase--helper.c b/builtin/rebase--helper.c
new file mode 100644
index 0000000..ca1ebb2
--- /dev/null
+++ b/builtin/rebase--helper.c
@@ -0,0 +1,40 @@
+#include "builtin.h"
+#include "cache.h"
+#include "parse-options.h"
+#include "sequencer.h"
+
+static const char * const builtin_rebase_helper_usage[] = {
+ N_("git rebase--helper [<options>]"),
+ NULL
+};
+
+int cmd_rebase__helper(int argc, const char **argv, const char *prefix)
+{
+ struct replay_opts opts = REPLAY_OPTS_INIT;
+ enum {
+ CONTINUE = 1, ABORT
+ } command = 0;
+ struct option options[] = {
+ OPT_BOOL(0, "ff", &opts.allow_ff, N_("allow fast-forward")),
+ OPT_CMDMODE(0, "continue", &command, N_("continue rebase"),
+ CONTINUE),
+ OPT_CMDMODE(0, "abort", &command, N_("abort rebase"),
+ ABORT),
+ OPT_END()
+ };
+
+ git_config(git_default_config, NULL);
+
+ opts.action = REPLAY_INTERACTIVE_REBASE;
+ opts.allow_ff = 1;
+ opts.allow_empty = 1;
+
+ argc = parse_options(argc, argv, NULL, options,
+ builtin_rebase_helper_usage, PARSE_OPT_KEEP_ARGV0);
+
+ if (command == CONTINUE && argc == 1)
+ return !!sequencer_continue(&opts);
+ if (command == ABORT && argc == 1)
+ return !!sequencer_remove_state(&opts);
+ usage_with_options(builtin_rebase_helper_usage, options);
+}
diff --git a/builtin/receive-pack.c b/builtin/receive-pack.c
index 1dbb8a0..9ed8fbb 100644
--- a/builtin/receive-pack.c
+++ b/builtin/receive-pack.c
@@ -21,6 +21,7 @@
#include "sigchain.h"
#include "fsck.h"
#include "tmp-objdir.h"
+#include "oidset.h"
static const char * const receive_pack_usage[] = {
N_("git receive-pack <git-dir>"),
@@ -250,8 +251,9 @@ static void show_ref(const char *path, const unsigned char *sha1)
}
static int show_ref_cb(const char *path_full, const struct object_id *oid,
- int flag, void *unused)
+ int flag, void *data)
{
+ struct oidset *seen = data;
const char *path = strip_namespace(path_full);
if (ref_is_hidden(path, path_full))
@@ -260,37 +262,38 @@ static int show_ref_cb(const char *path_full, const struct object_id *oid,
/*
* Advertise refs outside our current namespace as ".have"
* refs, so that the client can use them to minimize data
- * transfer but will otherwise ignore them. This happens to
- * cover ".have" that are thrown in by add_one_alternate_ref()
- * to mark histories that are complete in our alternates as
- * well.
+ * transfer but will otherwise ignore them.
*/
- if (!path)
+ if (!path) {
+ if (oidset_insert(seen, oid))
+ return 0;
path = ".have";
+ } else {
+ oidset_insert(seen, oid);
+ }
show_ref(path, oid->hash);
return 0;
}
-static int show_one_alternate_sha1(const unsigned char sha1[20], void *unused)
+static void show_one_alternate_ref(const char *refname,
+ const struct object_id *oid,
+ void *data)
{
- show_ref(".have", sha1);
- return 0;
-}
+ struct oidset *seen = data;
-static void collect_one_alternate_ref(const struct ref *ref, void *data)
-{
- struct sha1_array *sa = data;
- sha1_array_append(sa, ref->old_oid.hash);
+ if (oidset_insert(seen, oid))
+ return;
+
+ show_ref(".have", oid->hash);
}
static void write_head_info(void)
{
- struct sha1_array sa = SHA1_ARRAY_INIT;
+ static struct oidset seen = OIDSET_INIT;
- for_each_alternate_ref(collect_one_alternate_ref, &sa);
- sha1_array_for_each_unique(&sa, show_one_alternate_sha1, NULL);
- sha1_array_clear(&sa);
- for_each_ref(show_ref_cb, NULL);
+ for_each_ref(show_ref_cb, &seen);
+ for_each_alternate_ref(show_one_alternate_ref, &seen);
+ oidset_clear(&seen);
if (!sent_capabilities)
show_ref("capabilities^{}", null_sha1);
diff --git a/builtin/rev-parse.c b/builtin/rev-parse.c
index 2cfd8d2..e08677e 100644
--- a/builtin/rev-parse.c
+++ b/builtin/rev-parse.c
@@ -805,17 +805,27 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
putchar('\n');
continue;
}
- if (!strcmp(arg, "--git-dir")) {
+ if (!strcmp(arg, "--git-dir") ||
+ !strcmp(arg, "--absolute-git-dir")) {
const char *gitdir = getenv(GIT_DIR_ENVIRONMENT);
char *cwd;
int len;
- if (gitdir) {
- puts(gitdir);
- continue;
- }
- if (!prefix) {
- puts(".git");
- continue;
+ if (arg[2] == 'g') { /* --git-dir */
+ if (gitdir) {
+ puts(gitdir);
+ continue;
+ }
+ if (!prefix) {
+ puts(".git");
+ continue;
+ }
+ } else { /* --absolute-git-dir */
+ if (!gitdir && !prefix)
+ gitdir = ".git";
+ if (gitdir) {
+ puts(real_path(gitdir));
+ continue;
+ }
}
cwd = xgetcwd();
len = strlen(cwd);
diff --git a/builtin/rm.c b/builtin/rm.c
index 452170a..fb79dca 100644
--- a/builtin/rm.c
+++ b/builtin/rm.c
@@ -360,15 +360,14 @@ int cmd_rm(int argc, const char **argv, const char *prefix)
*/
if (!index_only) {
int removed = 0, gitmodules_modified = 0;
+ struct strbuf buf = STRBUF_INIT;
for (i = 0; i < list.nr; i++) {
const char *path = list.entry[i].name;
if (list.entry[i].is_submodule) {
- struct strbuf buf = STRBUF_INIT;
-
+ strbuf_reset(&buf);
strbuf_addstr(&buf, path);
if (remove_dir_recursively(&buf, 0))
die(_("could not remove '%s'"), path);
- strbuf_release(&buf);
removed = 1;
if (!remove_path_from_gitmodules(path))
@@ -382,6 +381,7 @@ int cmd_rm(int argc, const char **argv, const char *prefix)
if (!removed)
die_errno("git rm: '%s'", path);
}
+ strbuf_release(&buf);
if (gitmodules_modified)
stage_updated_gitmodules();
}
diff --git a/builtin/show-branch.c b/builtin/show-branch.c
index 974f340..1975659 100644
--- a/builtin/show-branch.c
+++ b/builtin/show-branch.c
@@ -275,8 +275,7 @@ static void show_one_commit(struct commit *commit, int no_name)
pp_commit_easy(CMIT_FMT_ONELINE, commit, &pretty);
pretty_str = pretty.buf;
}
- if (starts_with(pretty_str, "[PATCH] "))
- pretty_str += 8;
+ skip_prefix(pretty_str, "[PATCH] ", &pretty_str);
if (!no_name) {
if (name && name->head_name) {
@@ -470,18 +469,14 @@ static void snarf_refs(int head, int remotes)
}
}
-static int rev_is_head(char *head, int headlen, char *name,
+static int rev_is_head(const char *head, const char *name,
unsigned char *head_sha1, unsigned char *sha1)
{
- if ((!head[0]) ||
- (head_sha1 && sha1 && hashcmp(head_sha1, sha1)))
+ if (!head || (head_sha1 && sha1 && hashcmp(head_sha1, sha1)))
return 0;
- if (starts_with(head, "refs/heads/"))
- head += 11;
- if (starts_with(name, "refs/heads/"))
- name += 11;
- else if (starts_with(name, "heads/"))
- name += 6;
+ skip_prefix(head, "refs/heads/", &head);
+ if (!skip_prefix(name, "refs/heads/", &name))
+ skip_prefix(name, "heads/", &name);
return !strcmp(head, name);
}
@@ -620,9 +615,7 @@ int cmd_show_branch(int ac, const char **av, const char *prefix)
int all_heads = 0, all_remotes = 0;
int all_mask, all_revs;
enum rev_sort_order sort_order = REV_SORT_IN_GRAPH_ORDER;
- char head[128];
- const char *head_p;
- int head_len;
+ char *head;
struct object_id head_oid;
int merge_base = 0;
int independent = 0;
@@ -787,32 +780,24 @@ int cmd_show_branch(int ac, const char **av, const char *prefix)
snarf_refs(all_heads, all_remotes);
}
- head_p = resolve_ref_unsafe("HEAD", RESOLVE_REF_READING,
- head_oid.hash, NULL);
- if (head_p) {
- head_len = strlen(head_p);
- memcpy(head, head_p, head_len + 1);
- }
- else {
- head_len = 0;
- head[0] = 0;
- }
+ head = resolve_refdup("HEAD", RESOLVE_REF_READING,
+ head_oid.hash, NULL);
- if (with_current_branch && head_p) {
+ if (with_current_branch && head) {
int has_head = 0;
for (i = 0; !has_head && i < ref_name_cnt; i++) {
/* We are only interested in adding the branch
* HEAD points at.
*/
if (rev_is_head(head,
- head_len,
ref_name[i],
head_oid.hash, NULL))
has_head++;
}
if (!has_head) {
- int offset = starts_with(head, "refs/heads/") ? 11 : 0;
- append_one_rev(head + offset);
+ const char *name = head;
+ skip_prefix(name, "refs/heads/", &name);
+ append_one_rev(name);
}
}
@@ -866,7 +851,6 @@ int cmd_show_branch(int ac, const char **av, const char *prefix)
for (i = 0; i < num_rev; i++) {
int j;
int is_head = rev_is_head(head,
- head_len,
ref_name[i],
head_oid.hash,
rev[i]->object.oid.hash);
diff --git a/builtin/tag.c b/builtin/tag.c
index e40c4a9..e5e2c6a 100644
--- a/builtin/tag.c
+++ b/builtin/tag.c
@@ -45,11 +45,11 @@ static int list_tags(struct ref_filter *filter, struct ref_sorting *sorting, con
if (!format) {
if (filter->lines) {
to_free = xstrfmt("%s %%(contents:lines=%d)",
- "%(align:15)%(refname:strip=2)%(end)",
+ "%(align:15)%(refname:lstrip=2)%(end)",
filter->lines);
format = to_free;
} else
- format = "%(refname:strip=2)";
+ format = "%(refname:lstrip=2)";
}
verify_ref_format(format);
@@ -302,6 +302,54 @@ static void create_tag(const unsigned char *object, const char *tag,
}
}
+static void create_reflog_msg(const unsigned char *sha1, struct strbuf *sb)
+{
+ enum object_type type;
+ struct commit *c;
+ char *buf;
+ unsigned long size;
+ int subject_len = 0;
+ const char *subject_start;
+
+ char *rla = getenv("GIT_REFLOG_ACTION");
+ if (rla) {
+ strbuf_addstr(sb, rla);
+ } else {
+ strbuf_addstr(sb, _("tag: tagging "));
+ strbuf_add_unique_abbrev(sb, sha1, DEFAULT_ABBREV);
+ }
+
+ strbuf_addstr(sb, " (");
+ type = sha1_object_info(sha1, NULL);
+ switch (type) {
+ default:
+ strbuf_addstr(sb, _("object of unknown type"));
+ break;
+ case OBJ_COMMIT:
+ if ((buf = read_sha1_file(sha1, &type, &size)) != NULL) {
+ subject_len = find_commit_subject(buf, &subject_start);
+ strbuf_insert(sb, sb->len, subject_start, subject_len);
+ } else {
+ strbuf_addstr(sb, _("commit object"));
+ }
+ free(buf);
+
+ if ((c = lookup_commit_reference(sha1)) != NULL)
+ strbuf_addf(sb, ", %s", show_date(c->date, 0, DATE_MODE(SHORT)));
+ break;
+ case OBJ_TREE:
+ strbuf_addstr(sb, _("tree object"));
+ break;
+ case OBJ_BLOB:
+ strbuf_addstr(sb, _("blob object"));
+ break;
+ case OBJ_TAG:
+ strbuf_addstr(sb, _("other tag object"));
+ break;
+ }
+ strbuf_addch(sb, ')');
+}
+
struct msg_arg {
int given;
struct strbuf buf;
@@ -335,6 +383,7 @@ int cmd_tag(int argc, const char **argv, const char *prefix)
{
struct strbuf buf = STRBUF_INIT;
struct strbuf ref = STRBUF_INIT;
+ struct strbuf reflog_msg = STRBUF_INIT;
unsigned char object[20], prev[20];
const char *object_ref, *tag;
struct create_tag_options opt;
@@ -389,6 +438,8 @@ int cmd_tag(int argc, const char **argv, const char *prefix)
OPT_END()
};
+ setup_ref_filter_porcelain_msg();
+
git_config(git_tag_config, sorting_tail);
memset(&opt, 0, sizeof(opt));
@@ -494,6 +545,8 @@ int cmd_tag(int argc, const char **argv, const char *prefix)
else
die(_("Invalid cleanup mode %s"), cleanup_arg);
+ create_reflog_msg(object, &reflog_msg);
+
if (create_tag_object) {
if (force_sign_annotate && !annotate)
opt.sign = 1;
@@ -504,7 +557,7 @@ int cmd_tag(int argc, const char **argv, const char *prefix)
if (!transaction ||
ref_transaction_update(transaction, ref.buf, object, prev,
create_reflog ? REF_FORCE_CREATE_REFLOG : 0,
- NULL, &err) ||
+ reflog_msg.buf, &err) ||
ref_transaction_commit(transaction, &err))
die("%s", err.buf);
ref_transaction_free(transaction);
@@ -514,5 +567,6 @@ int cmd_tag(int argc, const char **argv, const char *prefix)
strbuf_release(&err);
strbuf_release(&buf);
strbuf_release(&ref);
+ strbuf_release(&reflog_msg);
return 0;
}
diff --git a/builtin/worktree.c b/builtin/worktree.c
index 9a97e37..831fe05 100644
--- a/builtin/worktree.c
+++ b/builtin/worktree.c
@@ -125,9 +125,9 @@ static int prune(int ac, const char **av, const char *prefix)
{
struct option options[] = {
OPT__DRY_RUN(&show_only, N_("do not remove, show only")),
- OPT__VERBOSE(&verbose, N_("report pruned objects")),
+ OPT__VERBOSE(&verbose, N_("report pruned working trees")),
OPT_EXPIRY_DATE(0, "expire", &expire,
- N_("expire objects older than <time>")),
+ N_("expire working trees older than <time>")),
OPT_END()
};
diff --git a/cache.h b/cache.h
index 61fc86e..80b6372 100644
--- a/cache.h
+++ b/cache.h
@@ -1072,8 +1072,9 @@ int adjust_shared_perm(const char *path);
/*
* Create the directory containing the named path, using care to be
- * somewhat safe against races. Return one of the scld_error values
- * to indicate success/failure.
+ * somewhat safe against races. Return one of the scld_error values to
+ * indicate success/failure. On error, set errno to describe the
+ * problem.
*
* SCLD_VANISHED indicates that one of the ancestor directories of the
* path existed at one point during the function call and then
@@ -1097,6 +1098,49 @@ enum scld_error {
enum scld_error safe_create_leading_directories(char *path);
enum scld_error safe_create_leading_directories_const(const char *path);
+/*
+ * Callback function for raceproof_create_file(). This function is
+ * expected to do something that makes dirname(path) permanent despite
+ * the fact that other processes might be cleaning up empty
+ * directories at the same time. Usually it will create a file named
+ * path, but alternatively it could create another file in that
+ * directory, or even chdir() into that directory. The function should
+ * return 0 if the action was completed successfully. On error, it
+ * should return a nonzero result and set errno.
+ * raceproof_create_file() treats two errno values specially:
+ *
+ * - ENOENT -- dirname(path) does not exist. In this case,
+ * raceproof_create_file() tries creating dirname(path)
+ * (and any parent directories, if necessary) and calls
+ * the function again.
+ *
+ * - EISDIR -- the file already exists and is a directory. In this
+ * case, raceproof_create_file() removes the directory if
+ * it is empty (and recursively any empty directories that
+ * it contains) and calls the function again.
+ *
+ * Any other errno causes raceproof_create_file() to fail with the
+ * callback's return value and errno.
+ *
+ * Obviously, this function should be OK with being called again if it
+ * fails with ENOENT or EISDIR. In other scenarios it will not be
+ * called again.
+ */
+typedef int create_file_fn(const char *path, void *cb);
+
+/*
+ * Create a file in dirname(path) by calling fn, creating leading
+ * directories if necessary. Retry a few times in case we are racing
+ * with another process that is trying to clean up the directory that
+ * contains path. See the documentation for create_file_fn for more
+ * details.
+ *
+ * Return the value and set the errno that resulted from the most
+ * recent call of fn. fn is always called at least once, and will be
+ * called more than once if it returns ENOENT or EISDIR.
+ */
+int raceproof_create_file(const char *path, create_file_fn fn, void *cb);
+
int mkdir_in_gitdir(const char *path);
extern char *expand_user_path(const char *path);
const char *enter_repo(const char *path, int strict);
diff --git a/commit.c b/commit.c
index 2cf8515..0c4ee3d 100644
--- a/commit.c
+++ b/commit.c
@@ -415,8 +415,7 @@ int find_commit_subject(const char *commit_buffer, const char **subject)
p++;
if (*p) {
p = skip_blank_lines(p + 2);
- for (eol = p; *eol && *eol != '\n'; eol++)
- ; /* do nothing */
+ eol = strchrnul(p, '\n');
} else
eol = p;
diff --git a/common-main.c b/common-main.c
index c654f95..6a68900 100644
--- a/common-main.c
+++ b/common-main.c
@@ -1,5 +1,6 @@
#include "cache.h"
#include "exec_cmd.h"
+#include "attr.h"
/*
* Many parts of Git have subprograms communicate via pipe, expect the
@@ -33,6 +34,8 @@ int main(int argc, const char **argv)
git_setup_gettext();
+ attr_start();
+
git_extract_argv0_path(argv[0]);
restore_sigpipe_to_default();
diff --git a/compat/winansi.c b/compat/winansi.c
index 82b89ab..793420f 100644
--- a/compat/winansi.c
+++ b/compat/winansi.c
@@ -510,6 +510,8 @@ static HANDLE swap_osfhnd(int fd, HANDLE new_handle)
*/
close(new_fd);
+ if (fd == 2)
+ setvbuf(stderr, NULL, _IONBF, BUFSIZ);
fd_is_interactive[fd] |= FD_SWAPPED;
return duplicate;
@@ -547,6 +549,8 @@ static void detect_msys_tty(int fd)
!wcsstr(name, L"-pty"))
return;
+ if (fd == 2)
+ setvbuf(stderr, NULL, _IONBF, BUFSIZ);
fd_is_interactive[fd] |= FD_MSYS;
}
diff --git a/connect.c b/connect.c
index 8cb93b0..7d65c1c 100644
--- a/connect.c
+++ b/connect.c
@@ -691,6 +691,68 @@ static const char *get_ssh_command(void)
return NULL;
}
+static int override_ssh_variant(int *port_option, int *needs_batch)
+{
+ char *variant;
+
+ variant = xstrdup_or_null(getenv("GIT_SSH_VARIANT"));
+ if (!variant &&
+ git_config_get_string("ssh.variant", &variant))
+ return 0;
+
+ if (!strcmp(variant, "plink") || !strcmp(variant, "putty")) {
+ *port_option = 'P';
+ *needs_batch = 0;
+ } else if (!strcmp(variant, "tortoiseplink")) {
+ *port_option = 'P';
+ *needs_batch = 1;
+ } else {
+ *port_option = 'p';
+ *needs_batch = 0;
+ }
+ free(variant);
+ return 1;
+}
+
+static void handle_ssh_variant(const char *ssh_command, int is_cmdline,
+ int *port_option, int *needs_batch)
+{
+ const char *variant;
+ char *p = NULL;
+
+ if (override_ssh_variant(port_option, needs_batch))
+ return;
+
+ if (!is_cmdline) {
+ p = xstrdup(ssh_command);
+ variant = basename(p);
+ } else {
+ const char **ssh_argv;
+
+ p = xstrdup(ssh_command);
+ if (split_cmdline(p, &ssh_argv)) {
+ variant = basename((char *)ssh_argv[0]);
+ /*
+ * At this point, variant points into the buffer
+ * referenced by p, hence we do not need ssh_argv
+ * any longer.
+ */
+ free(ssh_argv);
+ } else
+ return;
+ }
+
+ if (!strcasecmp(variant, "plink") ||
+ !strcasecmp(variant, "plink.exe"))
+ *port_option = 'P';
+ else if (!strcasecmp(variant, "tortoiseplink") ||
+ !strcasecmp(variant, "tortoiseplink.exe")) {
+ *port_option = 'P';
+ *needs_batch = 1;
+ }
+ free(p);
+}
+
/*
* This returns a dummy child_process if the transport protocol does not
* need fork(2), or a struct child_process object if it does. Once done,
@@ -769,7 +831,8 @@ struct child_process *git_connect(int fd[2], const char *url,
conn->in = conn->out = -1;
if (protocol == PROTO_SSH) {
const char *ssh;
- int putty = 0, tortoiseplink = 0;
+ int needs_batch = 0;
+ int port_option = 'p';
char *ssh_host = hostandport;
const char *port = NULL;
transport_check_allowed("ssh");
@@ -792,10 +855,10 @@ struct child_process *git_connect(int fd[2], const char *url,
}
ssh = get_ssh_command();
- if (!ssh) {
- const char *base;
- char *ssh_dup;
-
+ if (ssh)
+ handle_ssh_variant(ssh, 1, &port_option,
+ &needs_batch);
+ else {
/*
* GIT_SSH is the no-shell version of
* GIT_SSH_COMMAND (and must remain so for
@@ -806,17 +869,10 @@ struct child_process *git_connect(int fd[2], const char *url,
ssh = getenv("GIT_SSH");
if (!ssh)
ssh = "ssh";
-
- ssh_dup = xstrdup(ssh);
- base = basename(ssh_dup);
-
- tortoiseplink = !strcasecmp(base, "tortoiseplink") ||
- !strcasecmp(base, "tortoiseplink.exe");
- putty = tortoiseplink ||
- !strcasecmp(base, "plink") ||
- !strcasecmp(base, "plink.exe");
-
- free(ssh_dup);
+ else
+ handle_ssh_variant(ssh, 0,
+ &port_option,
+ &needs_batch);
}
argv_array_push(&conn->args, ssh);
@@ -824,11 +880,11 @@ struct child_process *git_connect(int fd[2], const char *url,
argv_array_push(&conn->args, "-4");
else if (flags & CONNECT_IPV6)
argv_array_push(&conn->args, "-6");
- if (tortoiseplink)
+ if (needs_batch)
argv_array_push(&conn->args, "-batch");
if (port) {
- /* P is for PuTTY, p is for OpenSSH */
- argv_array_push(&conn->args, putty ? "-P" : "-p");
+ argv_array_pushf(&conn->args,
+ "-%c", port_option);
argv_array_push(&conn->args, port);
}
argv_array_push(&conn->args, ssh_host);
diff --git a/contrib/coccinelle/free.cocci b/contrib/coccinelle/free.cocci
index e282131..c03ba73 100644
--- a/contrib/coccinelle/free.cocci
+++ b/contrib/coccinelle/free.cocci
@@ -3,3 +3,9 @@ expression E;
@@
- if (E)
free(E);
+
+@@
+expression E;
+@@
+- if (!E)
+ free(E);
diff --git a/contrib/coccinelle/swap.cocci b/contrib/coccinelle/swap.cocci
new file mode 100644
index 0000000..a0934d1
--- /dev/null
+++ b/contrib/coccinelle/swap.cocci
@@ -0,0 +1,28 @@
+@ swap_with_declaration @
+type T;
+identifier tmp;
+T a, b;
+@@
+- T tmp = a;
++ T tmp;
++ tmp = a;
+ a = b;
+ b = tmp;
+
+@ swap @
+type T;
+T tmp, a, b;
+@@
+- tmp = a;
+- a = b;
+- b = tmp;
++ SWAP(a, b);
+
+@ extends swap @
+identifier unused;
+@@
+ {
+ ...
+- T unused;
+ ... when != unused
+ }
diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
index 97d73ad..fc32286 100644
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -34,21 +34,41 @@ case "$COMP_WORDBREAKS" in
*) COMP_WORDBREAKS="$COMP_WORDBREAKS:"
esac
+# Discovers the path to the git repository taking any '--git-dir=<path>' and
+# '-C <path>' options into account and stores it in the $__git_repo_path
+# variable.
+__git_find_repo_path ()
+{
+ if [ -n "$__git_repo_path" ]; then
+ # we already know where it is
+ return
+ fi
+
+ if [ -n "${__git_C_args-}" ]; then
+ __git_repo_path="$(git "${__git_C_args[@]}" \
+ ${__git_dir:+--git-dir="$__git_dir"} \
+ rev-parse --absolute-git-dir 2>/dev/null)"
+ elif [ -n "${__git_dir-}" ]; then
+ test -d "$__git_dir" &&
+ __git_repo_path="$__git_dir"
+ elif [ -n "${GIT_DIR-}" ]; then
+ test -d "${GIT_DIR-}" &&
+ __git_repo_path="$GIT_DIR"
+ elif [ -d .git ]; then
+ __git_repo_path=.git
+ else
+ __git_repo_path="$(git rev-parse --git-dir 2>/dev/null)"
+ fi
+}
+
+# Deprecated: use __git_find_repo_path() and $__git_repo_path instead
# __gitdir accepts 0 or 1 arguments (i.e., location)
# returns location of .git repo
__gitdir ()
{
if [ -z "${1-}" ]; then
- if [ -n "${__git_dir-}" ]; then
- echo "$__git_dir"
- elif [ -n "${GIT_DIR-}" ]; then
- test -d "${GIT_DIR-}" || return 1
- echo "$GIT_DIR"
- elif [ -d .git ]; then
- echo .git
- else
- git rev-parse --git-dir 2>/dev/null
- fi
+ __git_find_repo_path || return 1
+ echo "$__git_repo_path"
elif [ -d "$1/.git" ]; then
echo "$1/.git"
else
@@ -56,6 +76,14 @@ __gitdir ()
fi
}
+# Runs git with all the options given as argument, respecting any
+# '--git-dir=<path>' and '-C <path>' options present on the command line
+__git ()
+{
+ git ${__git_C_args:+"${__git_C_args[@]}"} \
+ ${__git_dir:+--git-dir="$__git_dir"} "$@" 2>/dev/null
+}
+
# The following function is based on code from:
#
# bash_completion - programmable completion functions for bash 3.2+
@@ -283,11 +311,11 @@ __gitcomp_file ()
__git_ls_files_helper ()
{
if [ "$2" == "--committable" ]; then
- git -C "$1" diff-index --name-only --relative HEAD
+ __git -C "$1" diff-index --name-only --relative HEAD
else
# NOTE: $2 is not quoted in order to support multiple options
- git -C "$1" ls-files --exclude-standard $2
- fi 2>/dev/null
+ __git -C "$1" ls-files --exclude-standard $2
+ fi
}
@@ -299,47 +327,61 @@ __git_ls_files_helper ()
# slash.
__git_index_files ()
{
- local dir="$(__gitdir)" root="${2-.}" file
+ local root="${2-.}" file
- if [ -d "$dir" ]; then
- __git_ls_files_helper "$root" "$1" |
- while read -r file; do
- case "$file" in
- ?*/*) echo "${file%%/*}" ;;
- *) echo "$file" ;;
- esac
- done | sort | uniq
- fi
+ __git_ls_files_helper "$root" "$1" |
+ while read -r file; do
+ case "$file" in
+ ?*/*) echo "${file%%/*}" ;;
+ *) echo "$file" ;;
+ esac
+ done | sort | uniq
}
__git_heads ()
{
- local dir="$(__gitdir)"
- if [ -d "$dir" ]; then
- git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
- refs/heads
- return
- fi
+ __git for-each-ref --format='%(refname:short)' refs/heads
}
__git_tags ()
{
- local dir="$(__gitdir)"
- if [ -d "$dir" ]; then
- git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
- refs/tags
- return
- fi
+ __git for-each-ref --format='%(refname:short)' refs/tags
}
-# __git_refs accepts 0, 1 (to pass to __gitdir), or 2 arguments
-# presence of 2nd argument means use the guess heuristic employed
-# by checkout for tracking branches
+# Lists refs from the local (by default) or from a remote repository.
+# It accepts 0, 1 or 2 arguments:
+# 1: The remote to list refs from (optional; ignored, if set but empty).
+# Can be the name of a configured remote, a path, or a URL.
+# 2: In addition to local refs, list unique branches from refs/remotes/ for
+# 'git checkout's tracking DWIMery (optional; ignored, if set but empty).
__git_refs ()
{
- local i hash dir="$(__gitdir "${1-}")" track="${2-}"
+ local i hash dir track="${2-}"
+ local list_refs_from=path remote="${1-}"
local format refs pfx
- if [ -d "$dir" ]; then
+
+ __git_find_repo_path
+ dir="$__git_repo_path"
+
+ if [ -z "$remote" ]; then
+ if [ -z "$dir" ]; then
+ return
+ fi
+ else
+ if __git_is_configured_remote "$remote"; then
+ # configured remote takes precedence over a
+ # local directory with the same name
+ list_refs_from=remote
+ elif [ -d "$remote/.git" ]; then
+ dir="$remote/.git"
+ elif [ -d "$remote" ]; then
+ dir="$remote"
+ else
+ list_refs_from=url
+ fi
+ fi
+
+ if [ "$list_refs_from" = path ]; then
case "$cur" in
refs|refs/*)
format="refname"
@@ -355,14 +397,14 @@ __git_refs ()
refs="refs/tags refs/heads refs/remotes"
;;
esac
- git --git-dir="$dir" for-each-ref --format="$pfx%($format)" \
+ __git_dir="$dir" __git for-each-ref --format="$pfx%($format)" \
$refs
if [ -n "$track" ]; then
# employ the heuristic used by git checkout
# Try to find a remote branch that matches the completion word
# but only output if the branch name is unique
local ref entry
- git --git-dir="$dir" for-each-ref --shell --format="ref=%(refname:short)" \
+ __git for-each-ref --shell --format="ref=%(refname:short)" \
"refs/remotes/" | \
while read -r entry; do
eval "$entry"
@@ -376,7 +418,7 @@ __git_refs ()
fi
case "$cur" in
refs|refs/*)
- git ls-remote "$dir" "$cur*" 2>/dev/null | \
+ __git ls-remote "$remote" "$cur*" | \
while read -r hash i; do
case "$i" in
*^{}) ;;
@@ -385,9 +427,21 @@ __git_refs ()
done
;;
*)
- echo "HEAD"
- git for-each-ref --format="%(refname:short)" -- \
- "refs/remotes/$dir/" 2>/dev/null | sed -e "s#^$dir/##"
+ if [ "$list_refs_from" = remote ]; then
+ echo "HEAD"
+ __git for-each-ref --format="%(refname:short)" \
+ "refs/remotes/$remote/" | sed -e "s#^$remote/##"
+ else
+ __git ls-remote "$remote" HEAD \
+ "refs/tags/*" "refs/heads/*" "refs/remotes/*" |
+ while read -r hash i; do
+ case "$i" in
+ *^{}) ;;
+ refs/*) echo "${i#refs/*/}" ;;
+ *) echo "$i" ;; # symbolic refs
+ esac
+ done
+ fi
;;
esac
}
@@ -405,7 +459,7 @@ __git_refs2 ()
__git_refs_remotes ()
{
local i hash
- git ls-remote "$1" 'refs/heads/*' 2>/dev/null | \
+ __git ls-remote "$1" 'refs/heads/*' | \
while read -r hash i; do
echo "$i:refs/remotes/$1/${i#refs/heads/}"
done
@@ -413,9 +467,21 @@ __git_refs_remotes ()
__git_remotes ()
{
- local d="$(__gitdir)"
- test -d "$d/remotes" && ls -1 "$d/remotes"
- git --git-dir="$d" remote
+ __git_find_repo_path
+ test -d "$__git_repo_path/remotes" && ls -1 "$__git_repo_path/remotes"
+ __git remote
+}
+
+# Returns true if $1 matches the name of a configured remote, false otherwise.
+__git_is_configured_remote ()
+{
+ local remote
+ for remote in $(__git_remotes); do
+ if [ "$remote" = "$1" ]; then
+ return 0
+ fi
+ done
+ return 1
}
__git_list_merge_strategies ()
@@ -469,7 +535,7 @@ __git_complete_revlist_file ()
*) pfx="$ref:$pfx" ;;
esac
- __gitcomp_nl "$(git --git-dir="$(__gitdir)" ls-tree "$ls" 2>/dev/null \
+ __gitcomp_nl "$(__git ls-tree "$ls" \
| sed '/^100... blob /{
s,^.* ,,
s,$, ,
@@ -747,7 +813,7 @@ __git_compute_porcelain_commands ()
__git_get_config_variables ()
{
local section="$1" i IFS=$'\n'
- for i in $(git --git-dir="$(__gitdir)" config --name-only --get-regexp "^$section\..*" 2>/dev/null); do
+ for i in $(__git config --name-only --get-regexp "^$section\..*"); do
echo "${i#$section.}"
done
}
@@ -765,8 +831,7 @@ __git_aliases ()
# __git_aliased_command requires 1 argument
__git_aliased_command ()
{
- local word cmdline=$(git --git-dir="$(__gitdir)" \
- config --get "alias.$1")
+ local word cmdline=$(__git config --get "alias.$1")
for word in $cmdline; do
case "$word" in
\!gitk|gitk)
@@ -842,7 +907,7 @@ __git_get_option_value ()
done
if [ -n "$config_key" ] && [ -z "$result" ]; then
- result="$(git --git-dir="$(__gitdir)" config "$config_key")"
+ result="$(__git config "$config_key")"
fi
echo "$result"
@@ -901,8 +966,8 @@ __git_whitespacelist="nowarn warn error error-all fix"
_git_am ()
{
- local dir="$(__gitdir)"
- if [ -d "$dir"/rebase-apply ]; then
+ __git_find_repo_path
+ if [ -d "$__git_repo_path"/rebase-apply ]; then
__gitcomp "--skip --continue --resolved --abort"
return
fi
@@ -936,6 +1001,7 @@ _git_apply ()
--apply --no-add --exclude=
--ignore-whitespace --ignore-space-change
--whitespace= --inaccurate-eof --verbose
+ --recount --directory=
"
return
esac
@@ -947,13 +1013,17 @@ _git_add ()
--*)
__gitcomp "
--interactive --refresh --patch --update --dry-run
- --ignore-errors --intent-to-add
+ --ignore-errors --intent-to-add --force --edit --chmod=
"
return
esac
- # XXX should we check for --update and --all options ?
- __git_complete_index_file "--others --modified --directory --no-empty-directory"
+ local complete_opt="--others --modified --directory --no-empty-directory"
+ if test -n "$(__git_find_on_cmdline "-u --update")"
+ then
+ complete_opt="--modified"
+ fi
+ __git_complete_index_file "$complete_opt"
}
_git_archive ()
@@ -970,7 +1040,7 @@ _git_archive ()
--*)
__gitcomp "
--format= --list --verbose
- --prefix= --remote= --exec=
+ --prefix= --remote= --exec= --output
"
return
;;
@@ -985,7 +1055,8 @@ _git_bisect ()
local subcommands="start bad good skip reset visualize replay log run"
local subcommand="$(__git_find_on_cmdline "$subcommands")"
if [ -z "$subcommand" ]; then
- if [ -f "$(__gitdir)"/BISECT_START ]; then
+ __git_find_repo_path
+ if [ -f "$__git_repo_path"/BISECT_START ]; then
__gitcomp "$subcommands"
else
__gitcomp "replay start"
@@ -1025,6 +1096,7 @@ _git_branch ()
--track --no-track --contains --merged --no-merged
--set-upstream-to= --edit-description --list
--unset-upstream --delete --move --remotes
+ --column --no-column --sort= --points-at
"
;;
*)
@@ -1090,8 +1162,8 @@ _git_cherry ()
_git_cherry_pick ()
{
- local dir="$(__gitdir)"
- if [ -f "$dir"/CHERRY_PICK_HEAD ]; then
+ __git_find_repo_path
+ if [ -f "$__git_repo_path"/CHERRY_PICK_HEAD ]; then
__gitcomp "--continue --quit --abort"
return
fi
@@ -1138,6 +1210,8 @@ _git_clone ()
--single-branch
--branch
--recurse-submodules
+ --no-single-branch
+ --shallow-submodules
"
return
;;
@@ -1179,11 +1253,12 @@ _git_commit ()
--reset-author --file= --message= --template=
--cleanup= --untracked-files --untracked-files=
--verbose --quiet --fixup= --squash=
+ --patch --short --date --allow-empty
"
return
esac
- if git rev-parse --verify --quiet HEAD >/dev/null; then
+ if __git rev-parse --verify --quiet HEAD >/dev/null; then
__git_complete_index_file "--committable"
else
# This is the first commit
@@ -1197,7 +1272,8 @@ _git_describe ()
--*)
__gitcomp "
--all --tags --contains --abbrev= --candidates=
- --exact-match --debug --long --match --always
+ --exact-match --debug --long --match --always --first-parent
+ --exclude
"
return
esac
@@ -1280,6 +1356,7 @@ __git_fetch_recurse_submodules="yes on-demand no"
__git_fetch_options="
--quiet --verbose --append --upload-pack --force --keep --depth=
--tags --no-tags --all --prune --dry-run --recurse-submodules=
+ --unshallow --update-shallow
"
_git_fetch ()
@@ -1329,7 +1406,7 @@ _git_fsck ()
--*)
__gitcomp "
--tags --root --unreachable --cache --no-reflogs --full
- --strict --verbose --lost-found
+ --strict --verbose --lost-found --name-objects
"
return
;;
@@ -1373,6 +1450,8 @@ _git_grep ()
--max-depth
--count
--and --or --not --all-match
+ --break --heading --show-function --function-context
+ --untracked --no-index
"
return
;;
@@ -1445,6 +1524,12 @@ _git_ls_files ()
_git_ls_remote ()
{
+ case "$cur" in
+ --*)
+ __gitcomp "--heads --tags --refs --get-url --symref"
+ return
+ ;;
+ esac
__gitcomp_nl "$(__git_remotes)"
}
@@ -1482,10 +1567,10 @@ __git_log_date_formats="relative iso8601 rfc2822 short local default raw"
_git_log ()
{
__git_has_doubledash && return
+ __git_find_repo_path
- local g="$(git rev-parse --git-dir 2>/dev/null)"
local merge=""
- if [ -f "$g/MERGE_HEAD" ]; then
+ if [ -f "$__git_repo_path/MERGE_HEAD" ]; then
merge="--merge"
fi
case "$cur" in
@@ -1566,7 +1651,7 @@ _git_mergetool ()
return
;;
--*)
- __gitcomp "--tool="
+ __gitcomp "--tool= --prompt --no-prompt"
return
;;
esac
@@ -1674,7 +1759,7 @@ _git_pull ()
__git_complete_remote_or_refspec
}
-__git_push_recurse_submodules="check on-demand"
+__git_push_recurse_submodules="check on-demand only"
__git_complete_force_with_lease ()
{
@@ -1732,11 +1817,12 @@ _git_push ()
_git_rebase ()
{
- local dir="$(__gitdir)"
- if [ -f "$dir"/rebase-merge/interactive ]; then
+ __git_find_repo_path
+ if [ -f "$__git_repo_path"/rebase-merge/interactive ]; then
__gitcomp "--continue --skip --abort --quit --edit-todo"
return
- elif [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
+ elif [ -d "$__git_repo_path"/rebase-apply ] || \
+ [ -d "$__git_repo_path"/rebase-merge ]; then
__gitcomp "--continue --skip --abort --quit"
return
fi
@@ -1784,9 +1870,7 @@ _git_send_email ()
{
case "$prev" in
--to|--cc|--bcc|--from)
- __gitcomp "
- $(git --git-dir="$(__gitdir)" send-email --dump-aliases 2>/dev/null)
- "
+ __gitcomp "$(__git send-email --dump-aliases)"
return
;;
esac
@@ -1816,9 +1900,7 @@ _git_send_email ()
return
;;
--to=*|--cc=*|--bcc=*|--from=*)
- __gitcomp "
- $(git --git-dir="$(__gitdir)" send-email --dump-aliases 2>/dev/null)
- " "" "${cur#--*=}"
+ __gitcomp "$(__git send-email --dump-aliases)" "" "${cur#--*=}"
return
;;
--*)
@@ -1912,7 +1994,7 @@ __git_config_get_set_variables ()
c=$((--c))
done
- git --git-dir="$(__gitdir)" config $config_file --name-only --list 2>/dev/null
+ __git config $config_file --name-only --list
}
_git_config ()
@@ -1947,9 +2029,8 @@ _git_config ()
remote.*.push)
local remote="${prev#remote.}"
remote="${remote%.push}"
- __gitcomp_nl "$(git --git-dir="$(__gitdir)" \
- for-each-ref --format='%(refname):%(refname)' \
- refs/heads)"
+ __gitcomp_nl "$(__git for-each-ref \
+ --format='%(refname):%(refname)' refs/heads)"
return
;;
pull.twohead|pull.octopus)
@@ -2374,40 +2455,88 @@ _git_config ()
_git_remote ()
{
- local subcommands="add rename remove set-head set-branches set-url show prune update"
+ local subcommands="
+ add rename remove set-head set-branches
+ get-url set-url show prune update
+ "
local subcommand="$(__git_find_on_cmdline "$subcommands")"
if [ -z "$subcommand" ]; then
- __gitcomp "$subcommands"
+ case "$cur" in
+ --*)
+ __gitcomp "--verbose"
+ ;;
+ *)
+ __gitcomp "$subcommands"
+ ;;
+ esac
return
fi
- case "$subcommand" in
- rename|remove|set-url|show|prune)
- __gitcomp_nl "$(__git_remotes)"
+ case "$subcommand,$cur" in
+ add,--*)
+ __gitcomp "--track --master --fetch --tags --no-tags --mirror="
;;
- set-head|set-branches)
+ add,*)
+ ;;
+ set-head,--*)
+ __gitcomp "--auto --delete"
+ ;;
+ set-branches,--*)
+ __gitcomp "--add"
+ ;;
+ set-head,*|set-branches,*)
__git_complete_remote_or_refspec
;;
- update)
+ update,--*)
+ __gitcomp "--prune"
+ ;;
+ update,*)
__gitcomp "$(__git_get_config_variables "remotes")"
;;
+ set-url,--*)
+ __gitcomp "--push --add --delete"
+ ;;
+ get-url,--*)
+ __gitcomp "--push --all"
+ ;;
+ prune,--*)
+ __gitcomp "--dry-run"
+ ;;
*)
+ __gitcomp_nl "$(__git_remotes)"
;;
esac
}
_git_replace ()
{
+ case "$cur" in
+ --*)
+ __gitcomp "--edit --graft --format= --list --delete"
+ return
+ ;;
+ esac
__gitcomp_nl "$(__git_refs)"
}
+_git_rerere ()
+{
+ local subcommands="clear forget diff remaining status gc"
+ local subcommand="$(__git_find_on_cmdline "$subcommands")"
+ if test -z "$subcommand"
+ then
+ __gitcomp "$subcommands"
+ return
+ fi
+}
+
_git_reset ()
{
__git_has_doubledash && return
case "$cur" in
--*)
- __gitcomp "--merge --mixed --hard --soft --patch"
+ __gitcomp "--merge --mixed --hard --soft --patch --keep"
return
;;
esac
@@ -2416,14 +2545,17 @@ _git_reset ()
_git_revert ()
{
- local dir="$(__gitdir)"
- if [ -f "$dir"/REVERT_HEAD ]; then
+ __git_find_repo_path
+ if [ -f "$__git_repo_path"/REVERT_HEAD ]; then
__gitcomp "--continue --quit --abort"
return
fi
case "$cur" in
--*)
- __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
+ __gitcomp "
+ --edit --mainline --no-edit --no-commit --signoff
+ --strategy= --strategy-option=
+ "
return
;;
esac
@@ -2451,7 +2583,7 @@ _git_shortlog ()
__gitcomp "
$__git_log_common_options
$__git_log_shortlog_options
- --numbered --summary
+ --numbered --summary --email
"
return
;;
@@ -2537,12 +2669,12 @@ _git_stash ()
if [ $cword -eq 3 ]; then
__gitcomp_nl "$(__git_refs)";
else
- __gitcomp_nl "$(git --git-dir="$(__gitdir)" stash list \
+ __gitcomp_nl "$(__git stash list \
| sed -n -e 's/:.*//p')"
fi
;;
show,*|apply,*|drop,*|pop,*)
- __gitcomp_nl "$(git --git-dir="$(__gitdir)" stash list \
+ __gitcomp_nl "$(__git stash list \
| sed -n -e 's/:.*//p')"
;;
*)
@@ -2556,10 +2688,11 @@ _git_submodule ()
__git_has_doubledash && return
local subcommands="add status init deinit update summary foreach sync"
- if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then
+ local subcommand="$(__git_find_on_cmdline "$subcommands")"
+ if [ -z "$subcommand" ]; then
case "$cur" in
--*)
- __gitcomp "--quiet --cached"
+ __gitcomp "--quiet"
;;
*)
__gitcomp "$subcommands"
@@ -2567,6 +2700,33 @@ _git_submodule ()
esac
return
fi
+
+ case "$subcommand,$cur" in
+ add,--*)
+ __gitcomp "--branch --force --name --reference --depth"
+ ;;
+ status,--*)
+ __gitcomp "--cached --recursive"
+ ;;
+ deinit,--*)
+ __gitcomp "--force --all"
+ ;;
+ update,--*)
+ __gitcomp "
+ --init --remote --no-fetch
+ --recommend-shallow --no-recommend-shallow
+ --force --rebase --merge --reference --depth --recursive --jobs
+ "
+ ;;
+ summary,--*)
+ __gitcomp "--cached --files --summary-limit"
+ ;;
+ foreach,--*|sync,--*)
+ __gitcomp "--recursive"
+ ;;
+ *)
+ ;;
+ esac
}
_git_svn ()
@@ -2587,14 +2747,14 @@ _git_svn ()
--no-metadata --use-svm-props --use-svnsync-props
--log-window-size= --no-checkout --quiet
--repack-flags --use-log-author --localtime
+ --add-author-from
--ignore-paths= --include-paths= $remote_opts
"
local init_opts="
--template= --shared= --trunk= --tags=
--branches= --stdlayout --minimize-url
--no-metadata --use-svm-props --use-svnsync-props
- --rewrite-root= --prefix= --use-log-author
- --add-author-from $remote_opts
+ --rewrite-root= --prefix= $remote_opts
"
local cmt_opts="
--edit --rmdir --find-copies-harder --copy-similarity=
@@ -2701,8 +2861,8 @@ _git_tag ()
--*)
__gitcomp "
--list --delete --verify --annotate --message --file
- --sign --cleanup --local-user --force --column --sort
- --contains --points-at
+ --sign --cleanup --local-user --force --column --sort=
+ --contains --points-at --merged --no-merged --create-reflog
"
;;
esac
@@ -2741,7 +2901,8 @@ _git_worktree ()
__git_main ()
{
- local i c=1 command __git_dir
+ local i c=1 command __git_dir __git_repo_path
+ local __git_C_args C_args_count=0
while [ $c -lt $cword ]; do
i="${words[c]}"
@@ -2751,6 +2912,10 @@ __git_main ()
--bare) __git_dir="." ;;
--help) command="help"; break ;;
-c|--work-tree|--namespace) ((c++)) ;;
+ -C) __git_C_args[C_args_count++]=-C
+ ((c++))
+ __git_C_args[C_args_count++]="${words[c]}"
+ ;;
-*) ;;
*) command="$i"; break ;;
esac
@@ -2758,6 +2923,17 @@ __git_main ()
done
if [ -z "$command" ]; then
+ case "$prev" in
+ --git-dir|-C|--work-tree)
+ # these need a path argument, let's fall back to
+ # Bash filename completion
+ return
+ ;;
+ -c|--namespace)
+ # we don't support completing these options' arguments
+ return
+ ;;
+ esac
case "$cur" in
--*) __gitcomp "
--paginate
@@ -2783,13 +2959,13 @@ __git_main ()
fi
local completion_func="_git_${command//-/_}"
- declare -f $completion_func >/dev/null && $completion_func && return
+ declare -f $completion_func >/dev/null 2>/dev/null && $completion_func && return
local expansion=$(__git_aliased_command "$command")
if [ -n "$expansion" ]; then
words[1]=$expansion
completion_func="_git_${expansion//-/_}"
- declare -f $completion_func >/dev/null && $completion_func
+ declare -f $completion_func >/dev/null 2>/dev/null && $completion_func
fi
}
@@ -2797,9 +2973,11 @@ __gitk_main ()
{
__git_has_doubledash && return
- local g="$(__gitdir)"
+ local __git_repo_path
+ __git_find_repo_path
+
local merge=""
- if [ -f "$g/MERGE_HEAD" ]; then
+ if [ -f "$__git_repo_path/MERGE_HEAD" ]; then
merge="--merge"
fi
case "$cur" in
diff --git a/convert.c b/convert.c
index 4e17e45..8d652bf 100644
--- a/convert.c
+++ b/convert.c
@@ -1028,7 +1028,7 @@ static int ident_to_worktree(const char *path, const char *src, size_t len,
return 1;
}
-static enum crlf_action git_path_check_crlf(struct git_attr_check *check)
+static enum crlf_action git_path_check_crlf(struct attr_check_item *check)
{
const char *value = check->value;
@@ -1045,7 +1045,7 @@ static enum crlf_action git_path_check_crlf(struct git_attr_check *check)
return CRLF_UNDEFINED;
}
-static enum eol git_path_check_eol(struct git_attr_check *check)
+static enum eol git_path_check_eol(struct attr_check_item *check)
{
const char *value = check->value;
@@ -1058,7 +1058,7 @@ static enum eol git_path_check_eol(struct git_attr_check *check)
return EOL_UNSET;
}
-static struct convert_driver *git_path_check_convert(struct git_attr_check *check)
+static struct convert_driver *git_path_check_convert(struct attr_check_item *check)
{
const char *value = check->value;
struct convert_driver *drv;
@@ -1071,7 +1071,7 @@ static struct convert_driver *git_path_check_convert(struct git_attr_check *chec
return NULL;
}
-static int git_path_check_ident(struct git_attr_check *check)
+static int git_path_check_ident(struct attr_check_item *check)
{
const char *value = check->value;
@@ -1085,24 +1085,19 @@ struct conv_attrs {
int ident;
};
-static const char *conv_attr_name[] = {
- "crlf", "ident", "filter", "eol", "text",
-};
-#define NUM_CONV_ATTRS ARRAY_SIZE(conv_attr_name)
-
static void convert_attrs(struct conv_attrs *ca, const char *path)
{
- int i;
- static struct git_attr_check ccheck[NUM_CONV_ATTRS];
+ static struct attr_check *check;
- if (!ccheck[0].attr) {
- for (i = 0; i < NUM_CONV_ATTRS; i++)
- ccheck[i].attr = git_attr(conv_attr_name[i]);
+ if (!check) {
+ check = attr_check_initl("crlf", "ident", "filter",
+ "eol", "text", NULL);
user_convert_tail = &user_convert;
git_config(read_convert_config, NULL);
}
- if (!git_check_attr(path, NUM_CONV_ATTRS, ccheck)) {
+ if (!git_check_attr(path, check)) {
+ struct attr_check_item *ccheck = check->items;
ca->crlf_action = git_path_check_crlf(ccheck + 4);
if (ca->crlf_action == CRLF_UNDEFINED)
ca->crlf_action = git_path_check_crlf(ccheck + 0);
diff --git a/diff-no-index.c b/diff-no-index.c
index f420786..df762fd 100644
--- a/diff-no-index.c
+++ b/diff-no-index.c
@@ -185,10 +185,8 @@ static int queue_diff(struct diff_options *o,
struct diff_filespec *d1, *d2;
if (DIFF_OPT_TST(o, REVERSE_DIFF)) {
- unsigned tmp;
- const char *tmp_c;
- tmp = mode1; mode1 = mode2; mode2 = tmp;
- tmp_c = name1; name1 = name2; name2 = tmp_c;
+ SWAP(mode1, mode2);
+ SWAP(name1, name2);
}
d1 = noindex_filespec(name1, mode1);
diff --git a/diff.c b/diff.c
index d91a344..051761b 100644
--- a/diff.c
+++ b/diff.c
@@ -4450,6 +4450,7 @@ static void flush_one_pair(struct diff_filepair *p, struct diff_options *opt)
name_a = p->two->path;
name_b = NULL;
strip_prefix(opt->prefix_length, &name_a, &name_b);
+ fprintf(opt->file, "%s", diff_line_prefix(opt));
write_name_quoted(name_a, opt->file, opt->line_termination);
}
}
@@ -5117,14 +5118,10 @@ void diff_change(struct diff_options *options,
return;
if (DIFF_OPT_TST(options, REVERSE_DIFF)) {
- unsigned tmp;
- const unsigned char *tmp_c;
- tmp = old_mode; old_mode = new_mode; new_mode = tmp;
- tmp_c = old_sha1; old_sha1 = new_sha1; new_sha1 = tmp_c;
- tmp = old_sha1_valid; old_sha1_valid = new_sha1_valid;
- new_sha1_valid = tmp;
- tmp = old_dirty_submodule; old_dirty_submodule = new_dirty_submodule;
- new_dirty_submodule = tmp;
+ SWAP(old_mode, new_mode);
+ SWAP(old_sha1, new_sha1);
+ SWAP(old_sha1_valid, new_sha1_valid);
+ SWAP(old_dirty_submodule, new_dirty_submodule);
}
if (options->prefix &&
diff --git a/dir.c b/dir.c
index 65c3e68..4541f9e 100644
--- a/dir.c
+++ b/dir.c
@@ -174,20 +174,19 @@ char *common_prefix(const struct pathspec *pathspec)
int fill_directory(struct dir_struct *dir, const struct pathspec *pathspec)
{
- char *prefix;
+ const char *prefix;
size_t prefix_len;
/*
* Calculate common prefix for the pathspec, and
* use that to optimize the directory walk
*/
- prefix = common_prefix(pathspec);
- prefix_len = prefix ? strlen(prefix) : 0;
+ prefix_len = common_prefix_len(pathspec);
+ prefix = prefix_len ? pathspec->items[0].match : "";
/* Read the directory and prune it */
read_directory(dir, prefix, prefix_len, pathspec);
- free(prefix);
return prefix_len;
}
diff --git a/fetch-pack.c b/fetch-pack.c
index 601f077..e0f5d5c 100644
--- a/fetch-pack.c
+++ b/fetch-pack.c
@@ -35,6 +35,7 @@ static const char *alternate_shallow_file;
#define COMMON_REF (1U << 2)
#define SEEN (1U << 3)
#define POPPED (1U << 4)
+#define ALTERNATE (1U << 5)
static int marked;
@@ -67,6 +68,41 @@ static inline void print_verbose(const struct fetch_pack_args *args,
fputc('\n', stderr);
}
+struct alternate_object_cache {
+ struct object **items;
+ size_t nr, alloc;
+};
+
+static void cache_one_alternate(const char *refname,
+ const struct object_id *oid,
+ void *vcache)
+{
+ struct alternate_object_cache *cache = vcache;
+ struct object *obj = parse_object(oid->hash);
+
+ if (!obj || (obj->flags & ALTERNATE))
+ return;
+
+ obj->flags |= ALTERNATE;
+ ALLOC_GROW(cache->items, cache->nr + 1, cache->alloc);
+ cache->items[cache->nr++] = obj;
+}
+
+static void for_each_cached_alternate(void (*cb)(struct object *))
+{
+ static int initialized;
+ static struct alternate_object_cache cache;
+ size_t i;
+
+ if (!initialized) {
+ for_each_alternate_ref(cache_one_alternate, &cache);
+ initialized = 1;
+ }
+
+ for (i = 0; i < cache.nr; i++)
+ cb(cache.items[i]);
+}
+
static void rev_list_push(struct commit *commit, int mark)
{
if (!(commit->object.flags & mark)) {
@@ -253,9 +289,9 @@ static void send_request(struct fetch_pack_args *args,
write_or_die(fd, buf->buf, buf->len);
}
-static void insert_one_alternate_ref(const struct ref *ref, void *unused)
+static void insert_one_alternate_object(struct object *obj)
{
- rev_list_insert_ref(NULL, ref->old_oid.hash);
+ rev_list_insert_ref(NULL, obj->oid.hash);
}
#define INITIAL_FLUSH 16
@@ -298,7 +334,7 @@ static int find_common(struct fetch_pack_args *args,
marked = 1;
for_each_ref(rev_list_insert_ref_oid, NULL);
- for_each_alternate_ref(insert_one_alternate_ref, NULL);
+ for_each_cached_alternate(insert_one_alternate_object);
fetching = 0;
for ( ; refs ; refs = refs->next) {
@@ -619,9 +655,9 @@ static void filter_refs(struct fetch_pack_args *args,
*refs = newlist;
}
-static void mark_alternate_complete(const struct ref *ref, void *unused)
+static void mark_alternate_complete(struct object *obj)
{
- mark_complete(ref->old_oid.hash);
+ mark_complete(obj->oid.hash);
}
static int everything_local(struct fetch_pack_args *args,
@@ -657,7 +693,7 @@ static int everything_local(struct fetch_pack_args *args,
if (!args->deepen) {
for_each_ref(mark_complete_oid, NULL);
- for_each_alternate_ref(mark_alternate_complete, NULL);
+ for_each_cached_alternate(mark_alternate_complete);
commit_list_sort_by_date(&complete);
if (cutoff)
mark_recent_complete_commits(args, cutoff);
diff --git a/git-add--interactive.perl b/git-add--interactive.perl
index cf6fc92..982593c 100755
--- a/git-add--interactive.perl
+++ b/git-add--interactive.perl
@@ -1678,7 +1678,7 @@ status - show paths with changes
update - add working tree state to the staged set of changes
revert - revert staged set of changes back to the HEAD version
patch - pick hunks and update selectively
-diff - view diff between HEAD and index
+diff - view diff between HEAD and index
add untracked - add contents of untracked files to the staged set of changes
EOF
}
diff --git a/git-compat-util.h b/git-compat-util.h
index f46d40e..ef6d560 100644
--- a/git-compat-util.h
+++ b/git-compat-util.h
@@ -527,6 +527,16 @@ static inline int ends_with(const char *str, const char *suffix)
return strip_suffix(str, suffix, &len);
}
+#define SWAP(a, b) do { \
+ void *_swap_a_ptr = &(a); \
+ void *_swap_b_ptr = &(b); \
+ unsigned char _swap_buffer[sizeof(a)]; \
+ memcpy(_swap_buffer, _swap_a_ptr, sizeof(a)); \
+ memcpy(_swap_a_ptr, _swap_b_ptr, sizeof(a) + \
+ BUILD_ASSERT_OR_ZERO(sizeof(a) == sizeof(b))); \
+ memcpy(_swap_b_ptr, _swap_buffer, sizeof(a)); \
+} while (0)
+
#if defined(NO_MMAP) || defined(USE_WIN32_MMAP)
#ifndef PROT_READ
diff --git a/git-p4.py b/git-p4.py
index 9695d2e..eab319d 100755
--- a/git-p4.py
+++ b/git-p4.py
@@ -2484,11 +2484,24 @@ class P4Sync(Command, P4UserMap):
self.gitStream.write(d)
self.gitStream.write('\n')
+ def encodeWithUTF8(self, path):
+ try:
+ path.decode('ascii')
+ except:
+ encoding = 'utf8'
+ if gitConfig('git-p4.pathEncoding'):
+ encoding = gitConfig('git-p4.pathEncoding')
+ path = path.decode(encoding, 'replace').encode('utf8', 'replace')
+ if self.verbose:
+ print 'Path with non-ASCII characters detected. Used %s to encode: %s ' % (encoding, path)
+ return path
+
# output one file from the P4 stream
# - helper for streamP4Files
def streamOneP4File(self, file, contents):
relPath = self.stripRepoPath(file['depotFile'], self.branchPrefixes)
+ relPath = self.encodeWithUTF8(relPath)
if verbose:
size = int(self.stream_file['fileSize'])
sys.stdout.write('\r%s --> %s (%i MB)\n' % (file['depotFile'], relPath, size/1024/1024))
@@ -2561,16 +2574,6 @@ class P4Sync(Command, P4UserMap):
text = regexp.sub(r'$\1$', text)
contents = [ text ]
- try:
- relPath.decode('ascii')
- except:
- encoding = 'utf8'
- if gitConfig('git-p4.pathEncoding'):
- encoding = gitConfig('git-p4.pathEncoding')
- relPath = relPath.decode(encoding, 'replace').encode('utf8', 'replace')
- if self.verbose:
- print 'Path with non-ASCII characters detected. Used %s to encode: %s ' % (encoding, relPath)
-
if self.largeFileSystem:
(git_mode, contents) = self.largeFileSystem.processContent(git_mode, relPath, contents)
@@ -2578,6 +2581,7 @@ class P4Sync(Command, P4UserMap):
def streamOneP4Deletion(self, file):
relPath = self.stripRepoPath(file['path'], self.branchPrefixes)
+ relPath = self.encodeWithUTF8(relPath)
if verbose:
sys.stdout.write("delete %s\n" % relPath)
sys.stdout.flush()
diff --git a/git-rebase--interactive.sh b/git-rebase--interactive.sh
index 4734094..2c9c016 100644
--- a/git-rebase--interactive.sh
+++ b/git-rebase--interactive.sh
@@ -1069,6 +1069,10 @@ git_rebase__interactive () {
case "$action" in
continue)
+ if test ! -d "$rewritten"
+ then
+ exec git rebase--helper ${force_rebase:+--no-ff} --continue
+ fi
# do we have anything to commit?
if git diff-index --cached --quiet HEAD --
then
@@ -1128,6 +1132,10 @@ first and then run 'git rebase --continue' again.")"
skip)
git rerere clear
+ if test ! -d "$rewritten"
+ then
+ exec git rebase--helper ${force_rebase:+--no-ff} --continue
+ fi
do_rest
return 0
;;
@@ -1314,6 +1322,11 @@ expand_todo_ids
test -d "$rewritten" || test -n "$force_rebase" || skip_unnecessary_picks
checkout_onto
+if test -z "$rebase_root" && test ! -d "$rewritten"
+then
+ require_clean_work_tree "rebase"
+ exec git rebase--helper ${force_rebase:+--no-ff} --continue
+fi
do_rest
}
diff --git a/git.c b/git.c
index c887272..33f52ac 100644
--- a/git.c
+++ b/git.c
@@ -473,6 +473,7 @@ static struct cmd_struct commands[] = {
{ "pull", cmd_pull, RUN_SETUP | NEED_WORK_TREE },
{ "push", cmd_push, RUN_SETUP },
{ "read-tree", cmd_read_tree, RUN_SETUP | SUPPORT_SUPER_PREFIX},
+ { "rebase--helper", cmd_rebase__helper, RUN_SETUP | NEED_WORK_TREE },
{ "receive-pack", cmd_receive_pack },
{ "reflog", cmd_reflog, RUN_SETUP },
{ "remote", cmd_remote, RUN_SETUP },
diff --git a/graph.c b/graph.c
index 0649007..8b9049d 100644
--- a/graph.c
+++ b/graph.c
@@ -497,7 +497,6 @@ static void graph_update_width(struct git_graph *graph,
static void graph_update_columns(struct git_graph *graph)
{
struct commit_list *parent;
- struct column *tmp_columns;
int max_new_columns;
int mapping_idx;
int i, seen_this, is_commit_in_columns;
@@ -510,11 +509,8 @@ static void graph_update_columns(struct git_graph *graph)
* We'll re-use the old columns array as storage to compute the new
* columns list for the commit after this one.
*/
- tmp_columns = graph->columns;
- graph->columns = graph->new_columns;
+ SWAP(graph->columns, graph->new_columns);
graph->num_columns = graph->num_new_columns;
-
- graph->new_columns = tmp_columns;
graph->num_new_columns = 0;
/*
@@ -1031,7 +1027,6 @@ static void graph_output_post_merge_line(struct git_graph *graph, struct strbuf
static void graph_output_collapsing_line(struct git_graph *graph, struct strbuf *sb)
{
int i;
- int *tmp_mapping;
short used_horizontal = 0;
int horizontal_edge = -1;
int horizontal_edge_target = -1;
@@ -1166,9 +1161,7 @@ static void graph_output_collapsing_line(struct git_graph *graph, struct strbuf
/*
* Swap mapping and new_mapping
*/
- tmp_mapping = graph->mapping;
- graph->mapping = graph->new_mapping;
- graph->new_mapping = tmp_mapping;
+ SWAP(graph->mapping, graph->new_mapping);
/*
* If graph->mapping indicates that all of the branch lines
diff --git a/line-range.c b/line-range.c
index de4e32f..323399d 100644
--- a/line-range.c
+++ b/line-range.c
@@ -269,8 +269,7 @@ int parse_range_arg(const char *arg, nth_line_fn_t nth_line_cb,
return -1;
if (*begin && *end && *end < *begin) {
- long tmp;
- tmp = *end; *end = *begin; *begin = tmp;
+ SWAP(*end, *begin);
}
return 0;
diff --git a/ll-merge.c b/ll-merge.c
index ad8be42..ac0d4a5 100644
--- a/ll-merge.c
+++ b/ll-merge.c
@@ -336,15 +336,6 @@ static const struct ll_merge_driver *find_ll_merge_driver(const char *merge_attr
return &ll_merge_drv[LL_TEXT_MERGE];
}
-static int git_path_check_merge(const char *path, struct git_attr_check check[2])
-{
- if (!check[0].attr) {
- check[0].attr = git_attr("merge");
- check[1].attr = git_attr("conflict-marker-size");
- }
- return git_check_attr(path, 2, check);
-}
-
static void normalize_file(mmfile_t *mm, const char *path)
{
struct strbuf strbuf = STRBUF_INIT;
@@ -362,7 +353,7 @@ int ll_merge(mmbuffer_t *result_buf,
mmfile_t *theirs, const char *their_label,
const struct ll_merge_options *opts)
{
- static struct git_attr_check check[2];
+ static struct attr_check *check;
static const struct ll_merge_options default_opts;
const char *ll_driver_name = NULL;
int marker_size = DEFAULT_CONFLICT_MARKER_SIZE;
@@ -376,10 +367,14 @@ int ll_merge(mmbuffer_t *result_buf,
normalize_file(ours, path);
normalize_file(theirs, path);
}
- if (!git_path_check_merge(path, check)) {
- ll_driver_name = check[0].value;
- if (check[1].value) {
- marker_size = atoi(check[1].value);
+
+ if (!check)
+ check = attr_check_initl("merge", "conflict-marker-size", NULL);
+
+ if (!git_check_attr(path, check)) {
+ ll_driver_name = check->items[0].value;
+ if (check->items[1].value) {
+ marker_size = atoi(check->items[1].value);
if (marker_size <= 0)
marker_size = DEFAULT_CONFLICT_MARKER_SIZE;
}
@@ -398,13 +393,13 @@ int ll_merge(mmbuffer_t *result_buf,
int ll_merge_marker_size(const char *path)
{
- static struct git_attr_check check;
+ static struct attr_check *check;
int marker_size = DEFAULT_CONFLICT_MARKER_SIZE;
- if (!check.attr)
- check.attr = git_attr("conflict-marker-size");
- if (!git_check_attr(path, 1, &check) && check.value) {
- marker_size = atoi(check.value);
+ if (!check)
+ check = attr_check_initl("conflict-marker-size", NULL);
+ if (!git_check_attr(path, check) && check->items[0].value) {
+ marker_size = atoi(check->items[0].value);
if (marker_size <= 0)
marker_size = DEFAULT_CONFLICT_MARKER_SIZE;
}
diff --git a/merge-recursive.c b/merge-recursive.c
index d327209..62decd5 100644
--- a/merge-recursive.c
+++ b/merge-recursive.c
@@ -1061,16 +1061,20 @@ static int merge_file_one(struct merge_options *o,
}
static int handle_change_delete(struct merge_options *o,
- const char *path,
+ const char *path, const char *old_path,
const struct object_id *o_oid, int o_mode,
- const struct object_id *a_oid, int a_mode,
- const struct object_id *b_oid, int b_mode,
+ const struct object_id *changed_oid,
+ int changed_mode,
+ const char *change_branch,
+ const char *delete_branch,
const char *change, const char *change_past)
{
- char *renamed = NULL;
+ char *alt_path = NULL;
+ const char *update_path = path;
int ret = 0;
+
if (dir_in_way(path, !o->call_depth, 0)) {
- renamed = unique_path(o, path, a_oid ? o->branch1 : o->branch2);
+ update_path = alt_path = unique_path(o, path, change_branch);
}
if (o->call_depth) {
@@ -1081,43 +1085,43 @@ static int handle_change_delete(struct merge_options *o,
*/
ret = remove_file_from_cache(path);
if (!ret)
- ret = update_file(o, 0, o_oid, o_mode,
- renamed ? renamed : path);
- } else if (!a_oid) {
- if (!renamed) {
- output(o, 1, _("CONFLICT (%s/delete): %s deleted in %s "
- "and %s in %s. Version %s of %s left in tree."),
- change, path, o->branch1, change_past,
- o->branch2, o->branch2, path);
- ret = update_file(o, 0, b_oid, b_mode, path);
- } else {
- output(o, 1, _("CONFLICT (%s/delete): %s deleted in %s "
- "and %s in %s. Version %s of %s left in tree at %s."),
- change, path, o->branch1, change_past,
- o->branch2, o->branch2, path, renamed);
- ret = update_file(o, 0, b_oid, b_mode, renamed);
- }
+ ret = update_file(o, 0, o_oid, o_mode, update_path);
} else {
- if (!renamed) {
- output(o, 1, _("CONFLICT (%s/delete): %s deleted in %s "
- "and %s in %s. Version %s of %s left in tree."),
- change, path, o->branch2, change_past,
- o->branch1, o->branch1, path);
+ if (!alt_path) {
+ if (!old_path) {
+ output(o, 1, _("CONFLICT (%s/delete): %s deleted in %s "
+ "and %s in %s. Version %s of %s left in tree."),
+ change, path, delete_branch, change_past,
+ change_branch, change_branch, path);
+ } else {
+ output(o, 1, _("CONFLICT (%s/delete): %s deleted in %s "
+ "and %s to %s in %s. Version %s of %s left in tree."),
+ change, old_path, delete_branch, change_past, path,
+ change_branch, change_branch, path);
+ }
} else {
- output(o, 1, _("CONFLICT (%s/delete): %s deleted in %s "
- "and %s in %s. Version %s of %s left in tree at %s."),
- change, path, o->branch2, change_past,
- o->branch1, o->branch1, path, renamed);
- ret = update_file(o, 0, a_oid, a_mode, renamed);
+ if (!old_path) {
+ output(o, 1, _("CONFLICT (%s/delete): %s deleted in %s "
+ "and %s in %s. Version %s of %s left in tree at %s."),
+ change, path, delete_branch, change_past,
+ change_branch, change_branch, path, alt_path);
+ } else {
+ output(o, 1, _("CONFLICT (%s/delete): %s deleted in %s "
+ "and %s to %s in %s. Version %s of %s left in tree at %s."),
+ change, old_path, delete_branch, change_past, path,
+ change_branch, change_branch, path, alt_path);
+ }
}
/*
- * No need to call update_file() on path when !renamed, since
- * that would needlessly touch path. We could call
- * update_file_flags() with update_cache=0 and update_wd=0,
- * but that's a no-op.
+ * No need to call update_file() on path when change_branch ==
+ * o->branch1 && !alt_path, since that would needlessly touch
+ * path. We could call update_file_flags() with update_cache=0
+ * and update_wd=0, but that's a no-op.
*/
+ if (change_branch != o->branch1 || alt_path)
+ ret = update_file(o, 0, changed_oid, changed_mode, update_path);
}
- free(renamed);
+ free(alt_path);
return ret;
}
@@ -1125,28 +1129,17 @@ static int handle_change_delete(struct merge_options *o,
static int conflict_rename_delete(struct merge_options *o,
struct diff_filepair *pair,
const char *rename_branch,
- const char *other_branch)
+ const char *delete_branch)
{
const struct diff_filespec *orig = pair->one;
const struct diff_filespec *dest = pair->two;
- const struct object_id *a_oid = NULL;
- const struct object_id *b_oid = NULL;
- int a_mode = 0;
- int b_mode = 0;
-
- if (rename_branch == o->branch1) {
- a_oid = &dest->oid;
- a_mode = dest->mode;
- } else {
- b_oid = &dest->oid;
- b_mode = dest->mode;
- }
if (handle_change_delete(o,
o->call_depth ? orig->path : dest->path,
+ o->call_depth ? NULL : orig->path,
&orig->oid, orig->mode,
- a_oid, a_mode,
- b_oid, b_mode,
+ &dest->oid, dest->mode,
+ rename_branch, delete_branch,
_("rename"), _("renamed")))
return -1;
@@ -1390,14 +1383,11 @@ static int process_renames(struct merge_options *o,
branch1 = o->branch1;
branch2 = o->branch2;
} else {
- struct rename *tmp;
renames1 = b_renames;
renames2Dst = &a_by_dst;
branch1 = o->branch2;
branch2 = o->branch1;
- tmp = ren2;
- ren2 = ren1;
- ren1 = tmp;
+ SWAP(ren2, ren1);
}
if (ren1->processed)
@@ -1665,11 +1655,27 @@ static int handle_modify_delete(struct merge_options *o,
struct object_id *a_oid, int a_mode,
struct object_id *b_oid, int b_mode)
{
+ const char *modify_branch, *delete_branch;
+ struct object_id *changed_oid;
+ int changed_mode;
+
+ if (a_oid) {
+ modify_branch = o->branch1;
+ delete_branch = o->branch2;
+ changed_oid = a_oid;
+ changed_mode = a_mode;
+ } else {
+ modify_branch = o->branch2;
+ delete_branch = o->branch1;
+ changed_oid = b_oid;
+ changed_mode = b_mode;
+ }
+
return handle_change_delete(o,
- path,
+ path, NULL,
o_oid, o_mode,
- a_oid, a_mode,
- b_oid, b_mode,
+ changed_oid, changed_mode,
+ modify_branch, delete_branch,
_("modify"), _("modified"));
}
diff --git a/object.c b/object.c
index 67d9a9e..e680d88 100644
--- a/object.c
+++ b/object.c
@@ -104,9 +104,7 @@ struct object *lookup_object(const unsigned char *sha1)
* that we do not need to walk the hash table the next
* time we look for it.
*/
- struct object *tmp = obj_hash[i];
- obj_hash[i] = obj_hash[first];
- obj_hash[first] = tmp;
+ SWAP(obj_hash[i], obj_hash[first]);
}
return obj;
}
diff --git a/object.h b/object.h
index 614a006..f52957d 100644
--- a/object.h
+++ b/object.h
@@ -29,7 +29,7 @@ struct object_array {
/*
* object flag allocation:
* revision.h: 0---------10 26
- * fetch-pack.c: 0---4
+ * fetch-pack.c: 0---5
* walker.c: 0-2
* upload-pack.c: 4 11----------------19
* builtin/blame.c: 12-13
diff --git a/oidset.c b/oidset.c
new file mode 100644
index 0000000..ac169f0
--- /dev/null
+++ b/oidset.c
@@ -0,0 +1,49 @@
+#include "cache.h"
+#include "oidset.h"
+
+struct oidset_entry {
+ struct hashmap_entry hash;
+ struct object_id oid;
+};
+
+static int oidset_hashcmp(const void *va, const void *vb,
+ const void *vkey)
+{
+ const struct oidset_entry *a = va, *b = vb;
+ const struct object_id *key = vkey;
+ return oidcmp(&a->oid, key ? key : &b->oid);
+}
+
+int oidset_contains(const struct oidset *set, const struct object_id *oid)
+{
+ struct hashmap_entry key;
+
+ if (!set->map.cmpfn)
+ return 0;
+
+ hashmap_entry_init(&key, sha1hash(oid->hash));
+ return !!hashmap_get(&set->map, &key, oid);
+}
+
+int oidset_insert(struct oidset *set, const struct object_id *oid)
+{
+ struct oidset_entry *entry;
+
+ if (!set->map.cmpfn)
+ hashmap_init(&set->map, oidset_hashcmp, 0);
+
+ if (oidset_contains(set, oid))
+ return 1;
+
+ entry = xmalloc(sizeof(*entry));
+ hashmap_entry_init(&entry->hash, sha1hash(oid->hash));
+ oidcpy(&entry->oid, oid);
+
+ hashmap_add(&set->map, entry);
+ return 0;
+}
+
+void oidset_clear(struct oidset *set)
+{
+ hashmap_free(&set->map, 1);
+}
diff --git a/oidset.h b/oidset.h
new file mode 100644
index 0000000..b7eaab5
--- /dev/null
+++ b/oidset.h
@@ -0,0 +1,45 @@
+#ifndef OIDSET_H
+#define OIDSET_H
+
+/**
+ * This API is similar to sha1-array, in that it maintains a set of object ids
+ * in a memory-efficient way. The major differences are:
+ *
+ * 1. It uses a hash, so we can do online duplicate removal, rather than
+ * sort-and-uniq at the end. This can reduce memory footprint if you have
+ * a large list of oids with many duplicates.
+ *
+ * 2. The per-unique-oid memory footprint is slightly higher due to hash
+ * table overhead.
+ */
+
+/**
+ * A single oidset; should be zero-initialized (or use OIDSET_INIT).
+ */
+struct oidset {
+ struct hashmap map;
+};
+
+#define OIDSET_INIT { { NULL } }
+
+/**
+ * Returns true iff `set` contains `oid`.
+ */
+int oidset_contains(const struct oidset *set, const struct object_id *oid);
+
+/**
+ * Insert the oid into the set; a copy is made, so "oid" does not need
+ * to persist after this function is called.
+ *
+ * Returns 1 if the oid was already in the set, 0 otherwise. This can be used
+ * to perform an efficient check-and-add.
+ */
+int oidset_insert(struct oidset *set, const struct object_id *oid);
+
+/**
+ * Remove all entries from the oidset, freeing any resources associated with
+ * it.
+ */
+void oidset_clear(struct oidset *set);
+
+#endif /* OIDSET_H */
diff --git a/pack-objects.h b/pack-objects.h
index cc9b9a9..03f1191 100644
--- a/pack-objects.h
+++ b/pack-objects.h
@@ -30,12 +30,16 @@ struct object_entry {
/*
* State flags for depth-first search used for analyzing delta cycles.
+ *
+ * The depth is measured in delta-links to the base (so if A is a delta
+ * against B, then A has a depth of 1, and B a depth of 0).
*/
enum {
DFS_NONE = 0,
DFS_ACTIVE,
DFS_DONE
} dfs_state;
+ int depth;
};
struct packing_data {
diff --git a/pack-revindex.c b/pack-revindex.c
index 6bc7c94..1b7ebd8 100644
--- a/pack-revindex.c
+++ b/pack-revindex.c
@@ -59,7 +59,6 @@ static void sort_revindex(struct revindex_entry *entries, unsigned n, off_t max)
* be a no-op, as everybody lands in the same zero-th bucket.
*/
for (bits = 0; max >> bits; bits += DIGIT_SIZE) {
- struct revindex_entry *swap;
unsigned i;
memset(pos, 0, BUCKETS * sizeof(*pos));
@@ -97,9 +96,7 @@ static void sort_revindex(struct revindex_entry *entries, unsigned n, off_t max)
* Now "to" contains the most sorted list, so we swap "from" and
* "to" for the next iteration.
*/
- swap = from;
- from = to;
- to = swap;
+ SWAP(from, to);
}
/*
diff --git a/pathspec.c b/pathspec.c
index 7ababb3..b961f00 100644
--- a/pathspec.c
+++ b/pathspec.c
@@ -224,6 +224,12 @@ static const char *parse_short_magic(unsigned *magic, const char *elem)
char ch = *pos;
int i;
+ /* Special case alias for '!' */
+ if (ch == '^') {
+ *magic |= PATHSPEC_EXCLUDE;
+ continue;
+ }
+
if (!is_pathspec_magic(ch))
break;
@@ -516,7 +522,7 @@ void parse_pathspec(struct pathspec *pathspec,
}
pathspec->nr = n;
- ALLOC_ARRAY(pathspec->items, n);
+ ALLOC_ARRAY(pathspec->items, n + 1);
item = pathspec->items;
prefixlen = prefix ? strlen(prefix) : 0;
@@ -540,10 +546,15 @@ void parse_pathspec(struct pathspec *pathspec,
pathspec->magic |= item[i].magic;
}
- if (nr_exclude == n)
- die(_("There is nothing to exclude from by :(exclude) patterns.\n"
- "Perhaps you forgot to add either ':/' or '.' ?"));
-
+ /*
+ * If everything is an exclude pattern, add one positive pattern
+ * that matches everyting. We allocated an extra one for this.
+ */
+ if (nr_exclude == n) {
+ int plen = (!(flags & PATHSPEC_PREFER_CWD)) ? 0 : prefixlen;
+ init_pathspec_item(item + n, 0, prefix, plen, "");
+ pathspec->nr++;
+ }
if (pathspec->magic & PATHSPEC_MAXDEPTH) {
if (flags & PATHSPEC_KEEP_ORDER)
diff --git a/perl/Git/SVN.pm b/perl/Git/SVN.pm
index 711d268..98518f4 100644
--- a/perl/Git/SVN.pm
+++ b/perl/Git/SVN.pm
@@ -490,7 +490,7 @@ sub refname {
#
# Additionally, % must be escaped because it is used for escaping
# and we want our escaped refname to be reversible
- $refname =~ s{([ \%~\^:\?\*\[\t])}{sprintf('%%%02X',ord($1))}eg;
+ $refname =~ s{([ \%~\^:\?\*\[\t\\])}{sprintf('%%%02X',ord($1))}eg;
# no slash-separated component can begin with a dot .
# /.* becomes /%2E*
diff --git a/po/TEAMS b/po/TEAMS
index d3e63bc..b221402 100644
--- a/po/TEAMS
+++ b/po/TEAMS
@@ -6,8 +6,9 @@ Repository: https://github.com/git-l10n/git-po
Leader: Alexander Shopov <ash@kambanaria.org>
Language: ca (Catalan)
-Repository: https://github.com/alexhenrie/git-po
-Leader: Alex Henrie <alexhenrie24@gmail.com>
+Repository: https://github.com/Softcatala/git-po
+Leader: Jordi Mas <jmas@softcatala.org>
+Members: Alex Henrie <alexhenrie24@gmail.com>
Language: de (German)
Repository: https://github.com/ralfth/git-po-de
diff --git a/po/bg.po b/po/bg.po
index ce75f39..148862d 100644
--- a/po/bg.po
+++ b/po/bg.po
@@ -1,12 +1,12 @@
# Bulgarian translation of git po-file.
-# Copyright (C) 2014, 2015 Alexander Shopov <ash@kambanaria.org>.
+# Copyright (C) 2014, 2015, 2016, 2017 Alexander Shopov <ash@kambanaria.org>.
# This file is distributed under the same license as the git package.
-# Alexander Shopov <ash@kambanaria.org>, 2014, 2015.
+# Alexander Shopov <ash@kambanaria.org>, 2014, 2015, 2016, 2017.
#
# ========================
# DICTIONARY TO MERGE IN GIT GUI
# ------------------------
-# range интервал
+# range диапазон
# unreachable object недостижим обект
# dangling objects обект извън клон
# fast-forward тривиално сливане
@@ -46,7 +46,7 @@
# tree-ish указател към дърво
# three-way merge тройно сливане
# dirty нечист, мръсен (файл, индекс)
-# fallback резервен вариант
+# fallback резервен вариант
# pathspec magic опция за магически пътища
# bitmap index индекс на база битови маски
# mark маркер
@@ -68,8 +68,16 @@
# peeled tag - проследен етикет - когато етикет сочи към друг етикет, а не подаване и проследяваме подобно на символна връзка
# strip - премахвам (за компонент при филтриране)
# unrelated histories - независими истории
+# inexact rename detection търсене на преименувания на обекти съчетани с промени
+# hunk парче
+# binary patch двоична кръпка
+# reverse-apply прилагам в обратна посока
+# todo file команден файл
+# octopus merge множествено сливане
+# alternate алтернативен източник
+# superproject обхващащ проект
# ----
-# „$var“ - може да не сработва за shell има gettext и eval_gettext - проверка - намират се лесно по „$
+# „$var“ - може да не сработва за shell има gettext и eval_gettext - проверка - намират се лесно по „$
# ========================
# „“…— ●≫ѝ→
#
@@ -86,34 +94,24 @@
# ========================
# GENERATE STATS
# ------------------------
-# grep ^#: bg.po | cut -c4- |tr ' ' '\n'| sed -e 's/:[0-9][0-9]*//' -e 's%.*/%%' -e 's/[.][^.]*$//' > OUT
+# grep ^#: bg.po | cut -c4- |tr ' ' '\n'| sed -e 's/:[0-9][0-9]*//' -e 's%.*/%%' -e 's/[.][^.]*$//' > OUT
# sort -u OUT > UNIQUE
-# for i in `cat UNIQUE`; do echo `grep "^$i$" OUT | wc -l` $i ; done | sort -nr > STATS
+# for i in `cat UNIQUE`; do echo `grep "^$i$" OUT | wc -l` $i ; done | sort -nr > STATS
#
# ========================
# FIND NON FULLY TRANSLATED
# ------------------------
-# msgattrib --untranslated bg.po > untranslated.po
-# msgattrib --only-fuzzy bg.po > fuzzy.po
+# msgattrib --untranslated bg.po > untranslated.po
+# msgattrib --only-fuzzy bg.po > fuzzy.po
# msgcat.exe untranslated.po fuzzy.po > new.po
-# grep ^#: new.po | cut -c4- |tr ' ' '\n'| sed -e 's/:[0-9][0-9]*//' -e 's%.*/%%' -e 's/[.][^.]*$//' | sort -u
-#
-# ========================
-# MOST IMPORTANT name asc ordering
-# ------------------------
-# add, blame, branch, checkout, clone, commit, common-cmds, config, diff, fetch, fsck, gc, git-rebase, git-stash, grep, log, mv, parse-options, push, reflog, remote, reset, revert, rm, wt-status
-#
-# ========================
-# IMPORTANT strings, name asc ordering
-# ------------------------
-# apply, archive, check-ignore, clean, date, describe, git-am, git-bisect, git-submodule, hash-object, init-db, ls-tree, merge, merge-base, merge-file, merge-recursive, name-rev, pathspec, show-ref, tag
+# grep ^#: new.po | cut -c4- |tr ' ' '\n'| sed -e 's/:[0-9][0-9]*//' -e 's%.*/%%' -e 's/[.][^.]*$//' | sort -u
#
msgid ""
msgstr ""
"Project-Id-Version: git master\n"
"Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2016-05-24 23:42+0800\n"
-"PO-Revision-Date: 2016-05-29 15:23+0300\n"
+"POT-Creation-Date: 2016-11-25 22:50+0800\n"
+"PO-Revision-Date: 2017-01-28 19:34+0200\n"
"Last-Translator: Alexander Shopov <ash@kambanaria.org>\n"
"Language-Team: Bulgarian <dict@fsa-bg.org>\n"
"Language: bg\n"
@@ -127,27 +125,723 @@ msgstr ""
msgid "hint: %.*s\n"
msgstr "Подсказка: %.*s\n"
+#: advice.c:83
+msgid "Cherry-picking is not possible because you have unmerged files."
+msgstr "Отбирането на подавания е блокирано от неслети файлове."
+
+#: advice.c:85
+msgid "Committing is not possible because you have unmerged files."
+msgstr "Подаването е блокирано от неслети файлове."
+
+#: advice.c:87
+msgid "Merging is not possible because you have unmerged files."
+msgstr "Сливането е блокирано от неслети файлове."
+
+#: advice.c:89
+msgid "Pulling is not possible because you have unmerged files."
+msgstr "Издърпването е блокирано от неслети файлове."
+
+#: advice.c:91
+msgid "Reverting is not possible because you have unmerged files."
+msgstr "Отмяната е блокирана от неслети файлове."
+
+#: advice.c:93
+#, c-format
+msgid "It is not possible to %s because you have unmerged files."
+msgstr "Действието „%s“ е блокирано от неслети файлове."
+
# TRANSFER
-#: advice.c:88
+#: advice.c:101
msgid ""
"Fix them up in the work tree, and then use 'git add/rm <file>'\n"
"as appropriate to mark resolution and make a commit."
msgstr ""
"Редактирайте ги в работното дърво, и тогава ползвайте „git add/rm ФАЙЛ“\n"
-"за да отбележите коригирането им. След това извършете подаването."
+"за да отбележите коригирането им. След това извършете подаването."
+
+#: advice.c:109
+msgid "Exiting because of an unresolved conflict."
+msgstr "Изход от програмата заради некоригиран конфликт."
-#: advice.c:101 builtin/merge.c:1238
+#: advice.c:114 builtin/merge.c:1181
msgid "You have not concluded your merge (MERGE_HEAD exists)."
-msgstr "Не сте завършили сливане. (Указателят „MERGE_HEAD“ съществува)."
+msgstr "Не сте завършили сливане. (Указателят „MERGE_HEAD“ съществува)."
-#: advice.c:103
+#: advice.c:116
msgid "Please, commit your changes before merging."
msgstr "Промените трябва да се подадат преди сливане."
-#: advice.c:104
+#: advice.c:117
msgid "Exiting because of unfinished merge."
msgstr "Изход от програмата заради незавършено сливане."
+#: advice.c:123
+#, c-format
+msgid ""
+"Note: checking out '%s'.\n"
+"\n"
+"You are in 'detached HEAD' state. You can look around, make experimental\n"
+"changes and commit them, and you can discard any commits you make in this\n"
+"state without impacting any branches by performing another checkout.\n"
+"\n"
+"If you want to create a new branch to retain commits you create, you may\n"
+"do so (now or later) by using -b with the checkout command again. Example:\n"
+"\n"
+" git checkout -b <new-branch-name>\n"
+"\n"
+msgstr ""
+"Бележка: изтегляне на „%s“.\n"
+"\n"
+"Указателят „HEAD“ не е свързан. Може да разглеждате, да правите произволни\n"
+"промени и да ги подавате. Ако изтеглите нещо друго, всички промени ще "
+"бъдат\n"
+"забравени и никой клон няма да се промени.\n"
+"\n"
+"Ако искате да създадете нов клон, за да запазите подаванията си, можете да\n"
+"направите това като зададете име на клон към опцията „-b“ на командата\n"
+"„commit“. Например:\n"
+"\n"
+" git checkout -b ИМЕ_НА_НОВ_КЛОН\n"
+"\n"
+
+#: apply.c:57
+#, c-format
+msgid "unrecognized whitespace option '%s'"
+msgstr "непозната опция за знаците за интервали „%s“"
+
+#: apply.c:73
+#, c-format
+msgid "unrecognized whitespace ignore option '%s'"
+msgstr "непозната опция за игнориране на знаците за интервали „%s“"
+
+#: apply.c:125
+msgid "--reject and --3way cannot be used together."
+msgstr "опциите „--reject“ и „--3way“ са несъвместими"
+
+#: apply.c:127
+msgid "--cached and --3way cannot be used together."
+msgstr "опциите „--cached“ и „--3way“ са несъвместими"
+
+#: apply.c:130
+msgid "--3way outside a repository"
+msgstr "като „--3way“, но извън хранилище"
+
+#: apply.c:141
+msgid "--index outside a repository"
+msgstr "като „--index“, но извън хранилище"
+
+#: apply.c:144
+msgid "--cached outside a repository"
+msgstr "като „--cached“, но извън хранилище"
+
+#: apply.c:845
+#, c-format
+msgid "Cannot prepare timestamp regexp %s"
+msgstr "Регулярният израз за времето „%s“ не може за бъде компилиран"
+
+#: apply.c:854
+#, c-format
+msgid "regexec returned %d for input: %s"
+msgstr "Регулярният израз върна %d при подадена последователност „%s“ на входа"
+
+#: apply.c:938
+#, c-format
+msgid "unable to find filename in patch at line %d"
+msgstr "Липсва име на файл на ред %d от кръпката"
+
+#: apply.c:977
+#, 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:983
+#, c-format
+msgid "git apply: bad git-diff - inconsistent new filename on line %d"
+msgstr ""
+"git apply: лош изход от командата „git-diff“ — на ред %d бе получено "
+"неправилно име на нов файл"
+
+#: apply.c:984
+#, c-format
+msgid "git apply: bad git-diff - inconsistent old filename on line %d"
+msgstr ""
+"git apply: лош изход от командата „git-diff“ — на ред %d бе получено "
+"неправилно име на стар файл"
+
+#: apply.c:990
+#, c-format
+msgid "git apply: bad git-diff - expected /dev/null on line %d"
+msgstr ""
+"git apply: лош изход от командата „git-diff“ — на ред %d се очакваше „/dev/"
+"null“"
+
+#: apply.c:1488
+#, c-format
+msgid "recount: unexpected line: %.*s"
+msgstr "при повторното преброяване бе получен неочакван ред: „%.*s“"
+
+#: apply.c:1557
+#, c-format
+msgid "patch fragment without header at line %d: %.*s"
+msgstr "част от кръпка без заглавна част на ред %d: %.*s"
+
+#: apply.c:1577
+#, c-format
+msgid ""
+"git diff header lacks filename information when removing %d leading pathname "
+"component (line %d)"
+msgid_plural ""
+"git diff header lacks filename information when removing %d leading pathname "
+"components (line %d)"
+msgstr[0] ""
+"След съкращаването на %d-та част от компонентите на пътя, в заглавната част "
+"на „git diff“ липсва информация за име на файл (ред: %d)"
+msgstr[1] ""
+"След съкращаването на първите %d части от компонентите на пътя, в заглавната "
+"част на „git diff“ липсва информация за име на файл (ред: %d)"
+
+#: apply.c:1589
+#, c-format
+msgid "git diff header lacks filename information (line %d)"
+msgstr ""
+"в заглавната част на „git diff“ липсва информация за име на файл (ред: %d)"
+
+#: apply.c:1759
+msgid "new file depends on old contents"
+msgstr "новият файл зависи от старото съдържание на файла"
+
+#: apply.c:1761
+msgid "deleted file still has contents"
+msgstr "изтритият файл не е празен"
+
+#: apply.c:1795
+#, c-format
+msgid "corrupt patch at line %d"
+msgstr "грешка в кръпката на ред %d"
+
+#: apply.c:1832
+#, c-format
+msgid "new file %s depends on old contents"
+msgstr "новият файл „%s“ зависи от старото съдържание на файла"
+
+#: apply.c:1834
+#, c-format
+msgid "deleted file %s still has contents"
+msgstr "изтритият файл „%s“ не е празен"
+
+#: apply.c:1837
+#, c-format
+msgid "** warning: file %s becomes empty but is not deleted"
+msgstr "● предупреждение: файлът „%s“ вече е празен, но не е изтрит"
+
+#: apply.c:1984
+#, c-format
+msgid "corrupt binary patch at line %d: %.*s"
+msgstr "грешка в двоичната кръпка на ред %d: %.*s"
+
+#: apply.c:2021
+#, c-format
+msgid "unrecognized binary patch at line %d"
+msgstr "неразпозната двоичната кръпка на ред %d"
+
+#: apply.c:2182
+#, c-format
+msgid "patch with only garbage at line %d"
+msgstr "кръпката е с изцяло повредени данни на ред %d"
+
+#: apply.c:2274
+#, c-format
+msgid "unable to read symlink %s"
+msgstr "символната връзка „%s“ не може да бъде прочетена"
+
+#: apply.c:2278
+#, c-format
+msgid "unable to open or read %s"
+msgstr "файлът „%s“ не може да бъде отворен или прочетен"
+
+#: apply.c:2931
+#, c-format
+msgid "invalid start of line: '%c'"
+msgstr "неправилно начало на ред: „%c“"
+
+#: apply.c:3050
+#, c-format
+msgid "Hunk #%d succeeded at %d (offset %d line)."
+msgid_plural "Hunk #%d succeeded at %d (offset %d lines)."
+msgstr[0] ""
+"%d-то парче код бе успешно приложено на ред %d (отместване от %d ред)."
+msgstr[1] ""
+"%d-то парче код бе успешно приложено на ред %d (отместване от %d реда)."
+
+#: apply.c:3062
+#, c-format
+msgid "Context reduced to (%ld/%ld) to apply fragment at %d"
+msgstr ""
+"Контекстът е намален на (%ld/%ld) за прилагането на парчето код на ред %d"
+
+#: apply.c:3068
+#, c-format
+msgid ""
+"while searching for:\n"
+"%.*s"
+msgstr ""
+"при търсене за:\n"
+"%.*s"
+
+#: apply.c:3090
+#, c-format
+msgid "missing binary patch data for '%s'"
+msgstr "липсват данните за двоичната кръпка за „%s“"
+
+#: apply.c:3098
+#, c-format
+msgid "cannot reverse-apply a binary patch without the reverse hunk to '%s'"
+msgstr ""
+"двоичната кръпка не може да се приложи в обратна посока, когато обратното "
+"парче за „%s“ липсва"
+
+#: apply.c:3144
+#, c-format
+msgid "cannot apply binary patch to '%s' without full index line"
+msgstr "към „%s“ не може да се приложи двоична кръпка без пълен индекс"
+
+#: apply.c:3154
+#, c-format
+msgid ""
+"the patch applies to '%s' (%s), which does not match the current contents."
+msgstr "кръпката съответства на „%s“ (%s), който не съвпада по съдържание."
+
+#: apply.c:3162
+#, c-format
+msgid "the patch applies to an empty '%s' but it is not empty"
+msgstr "кръпката съответства на „%s“, който трябва да е празен, но не е"
+
+#: apply.c:3180
+#, c-format
+msgid "the necessary postimage %s for '%s' cannot be read"
+msgstr ""
+"необходимият резултат след операцията — „%s“ за „%s“ не може да бъде "
+"прочетен"
+
+#: apply.c:3193
+#, c-format
+msgid "binary patch does not apply to '%s'"
+msgstr "двоичната кръпка не може да бъде приложена върху „%s“"
+
+#: apply.c:3199
+#, c-format
+msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)"
+msgstr ""
+"двоичната кръпка за „%s“ води до неправилни резултати (очакваше се: „%s“, а "
+"бе получено: „%s“)"
+
+#: apply.c:3220
+#, c-format
+msgid "patch failed: %s:%ld"
+msgstr "неуспешно прилагане на кръпка: „%s:%ld“"
+
+#: apply.c:3342
+#, c-format
+msgid "cannot checkout %s"
+msgstr "„%s“ не може да се изтегли"
+
+#: apply.c:3390 apply.c:3401 apply.c:3447 setup.c:248
+#, c-format
+msgid "failed to read %s"
+msgstr "файлът „%s“ не може да бъде прочетен"
+
+#: apply.c:3398
+#, c-format
+msgid "reading from '%s' beyond a symbolic link"
+msgstr "изчитане на „%s“ след проследяване на символна връзка"
+
+#: apply.c:3427 apply.c:3667
+#, c-format
+msgid "path %s has been renamed/deleted"
+msgstr "обектът с път „%s“ е преименуван или изтрит"
+
+#: apply.c:3510 apply.c:3681
+#, c-format
+msgid "%s: does not exist in index"
+msgstr "„%s“ не съществува в индекса"
+
+#: apply.c:3519 apply.c:3689
+#, c-format
+msgid "%s: does not match index"
+msgstr "„%s“ не съответства на индекса"
+
+#: apply.c:3554
+msgid "repository lacks the necessary blob to fall back on 3-way merge."
+msgstr ""
+"в хранилището липсват необходимите обекти BLOB, за да се премине към тройно "
+"сливане."
+
+#: apply.c:3557
+#, c-format
+msgid "Falling back to three-way merge...\n"
+msgstr "Преминаване към тройно сливане…\n"
+
+#: apply.c:3573 apply.c:3577
+#, c-format
+msgid "cannot read the current contents of '%s'"
+msgstr "текущото съдържание на „%s“ не може да бъде прочетено"
+
+#: apply.c:3589
+#, c-format
+msgid "Failed to fall back on three-way merge...\n"
+msgstr "Неуспешно преминаване към тройно сливане…\n"
+
+#: apply.c:3603
+#, c-format
+msgid "Applied patch to '%s' with conflicts.\n"
+msgstr "Конфликти при прилагането на кръпката към „%s“.\n"
+
+#: apply.c:3608
+#, c-format
+msgid "Applied patch to '%s' cleanly.\n"
+msgstr "Кръпката бе приложена чисто към „%s“.\n"
+
+#: apply.c:3634
+msgid "removal patch leaves file contents"
+msgstr "изтриващата кръпка оставя файла непразен"
+
+#: apply.c:3706
+#, c-format
+msgid "%s: wrong type"
+msgstr "„%s“: неправилен вид"
+
+#: apply.c:3708
+#, c-format
+msgid "%s has type %o, expected %o"
+msgstr "„%s“ е от вид „%o“, а се очакваше „%o“"
+
+#: apply.c:3859 apply.c:3861
+#, c-format
+msgid "invalid path '%s'"
+msgstr "неправилен път: „%s“"
+
+#: apply.c:3917
+#, c-format
+msgid "%s: already exists in index"
+msgstr "„%s“: вече съществува в индекса"
+
+#: apply.c:3920
+#, c-format
+msgid "%s: already exists in working directory"
+msgstr "„%s“: вече съществува в работното дърво"
+
+#: apply.c:3940
+#, c-format
+msgid "new mode (%o) of %s does not match old mode (%o)"
+msgstr "новите права за достъп (%o) на „%s“ не съвпадат със старите (%o)"
+
+#: apply.c:3945
+#, c-format
+msgid "new mode (%o) of %s does not match old mode (%o) of %s"
+msgstr ""
+"новите права за достъп (%o) на „%s“ не съвпадат със старите (%o) на „%s“"
+
+#: apply.c:3965
+#, c-format
+msgid "affected file '%s' is beyond a symbolic link"
+msgstr "засегнатият файл „%s“ е след символна връзка"
+
+#: apply.c:3969
+#, c-format
+msgid "%s: patch does not apply"
+msgstr "Кръпката „%s“ не може да бъде приложена"
+
+#: apply.c:3984
+#, c-format
+msgid "Checking patch %s..."
+msgstr "Проверяване на кръпката „%s“…"
+
+#: apply.c:4075
+#, c-format
+msgid "sha1 information is lacking or useless for submodule %s"
+msgstr ""
+"информацията за сумата по SHA1 за подмодула липсва или не е достатъчна (%s)."
+
+#: apply.c:4082
+#, c-format
+msgid "mode change for %s, which is not in current HEAD"
+msgstr "смяна на режима на достъпа на „%s“, който не е в текущия връх „HEAD“"
+
+#: apply.c:4085
+#, c-format
+msgid "sha1 information is lacking or useless (%s)."
+msgstr "информацията за сумата по SHA1 липсва или не е достатъчна (%s)."
+
+#: apply.c:4090 builtin/checkout.c:233 builtin/reset.c:135
+#, c-format
+msgid "make_cache_entry failed for path '%s'"
+msgstr "неуспешно създаване на запис в кеша чрез „make_cache_entry“ за „%s“"
+
+#: apply.c:4094
+#, c-format
+msgid "could not add %s to temporary index"
+msgstr "„%s“ не може да се добави към временния индекс"
+
+#: apply.c:4104
+#, c-format
+msgid "could not write temporary index to %s"
+msgstr "временният индекс не може да се запази в „%s“"
+
+#: apply.c:4242
+#, c-format
+msgid "unable to remove %s from index"
+msgstr "„%s“ не може да се извади от индекса"
+
+#: apply.c:4277
+#, c-format
+msgid "corrupt patch for submodule %s"
+msgstr "повредена кръпка за модула „%s“"
+
+#: apply.c:4283
+#, c-format
+msgid "unable to stat newly created file '%s'"
+msgstr ""
+"не може да се получи информация чрез „stat“ за новосъздадения файл „%s“"
+
+#: apply.c:4291
+#, c-format
+msgid "unable to create backing store for newly created file %s"
+msgstr ""
+"не може да се за създаде мястото за съхранение на новосъздадения файл „%s“"
+
+#: apply.c:4297 apply.c:4441
+#, c-format
+msgid "unable to add cache entry for %s"
+msgstr "не може да се добави запис в кеша за „%s“"
+
+#: apply.c:4338
+#, c-format
+msgid "failed to write to '%s'"
+msgstr "в „%s“ не може да се пише"
+
+#: apply.c:4342
+#, c-format
+msgid "closing file '%s'"
+msgstr "затваряне на файла „%s“"
+
+#: apply.c:4412
+#, c-format
+msgid "unable to write file '%s' mode %o"
+msgstr "файлът „%s“ не може да се запише с режим на достъп „%o“"
+
+#: apply.c:4510
+#, c-format
+msgid "Applied patch %s cleanly."
+msgstr "Кръпката „%s“ бе приложена чисто."
+
+#: apply.c:4518
+msgid "internal error"
+msgstr "вътрешна грешка"
+
+#: apply.c:4521
+#, 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:4532
+#, c-format
+msgid "truncating .rej filename to %.*s.rej"
+msgstr "съкращаване на името на файла с отхвърлените парчета на „ %.*s.rej“"
+
+#: apply.c:4540 builtin/fetch.c:740 builtin/fetch.c:989
+#, c-format
+msgid "cannot open %s"
+msgstr "„%s“ не може да бъде отворен"
+
+#: apply.c:4554
+#, c-format
+msgid "Hunk #%d applied cleanly."
+msgstr "%d-то парче бе успешно приложено."
+
+#: apply.c:4558
+#, c-format
+msgid "Rejected hunk #%d."
+msgstr "%d-то парче бе отхвърлено."
+
+#: apply.c:4668
+#, c-format
+msgid "Skipped patch '%s'."
+msgstr "Пропусната кръпка: „%s“"
+
+#: apply.c:4676
+msgid "unrecognized input"
+msgstr "непознат вход"
+
+#: apply.c:4695
+msgid "unable to read index file"
+msgstr "индексът не може да бъде записан"
+
+#: apply.c:4833
+#, c-format
+msgid "can't open patch '%s': %s"
+msgstr "кръпката „%s“ не може да бъде отворена: %s"
+
+#: apply.c:4858
+#, c-format
+msgid "squelched %d whitespace error"
+msgid_plural "squelched %d whitespace errors"
+msgstr[0] "пренебрегната е %d грешка в знаците за интервали"
+msgstr[1] "пренебрегнати са %d грешки в знаците за интервали"
+
+#: apply.c:4864 apply.c:4879
+#, c-format
+msgid "%d line adds whitespace errors."
+msgid_plural "%d lines add whitespace errors."
+msgstr[0] "%d ред добавя грешки в знаците за интервали."
+msgstr[1] "%d реда добавят грешки в знаците за интервали."
+
+#: apply.c:4872
+#, c-format
+msgid "%d line applied after fixing whitespace errors."
+msgid_plural "%d lines applied after fixing whitespace errors."
+msgstr[0] ""
+"Добавен е %d ред след корекцията на грешките в знаците за интервали."
+msgstr[1] ""
+"Добавени са %d реда след корекцията на грешките в знаците за интервали."
+
+#: apply.c:4888 builtin/add.c:463 builtin/mv.c:286 builtin/rm.c:431
+msgid "Unable to write new index file"
+msgstr "Новият индекс не може да бъде записан"
+
+#: apply.c:4919 apply.c:4922 builtin/am.c:2277 builtin/am.c:2280
+#: builtin/clone.c:95 builtin/fetch.c:98 builtin/pull.c:180
+#: builtin/submodule--helper.c:281 builtin/submodule--helper.c:407
+#: builtin/submodule--helper.c:589 builtin/submodule--helper.c:592
+#: builtin/submodule--helper.c:944 builtin/submodule--helper.c:947
+msgid "path"
+msgstr "път"
+
+#: apply.c:4920
+msgid "don't apply changes matching the given path"
+msgstr "без прилагане на промените напасващи на дадения път"
+
+#: apply.c:4923
+msgid "apply changes matching the given path"
+msgstr "прилагане на промените напасващи на дадения път"
+
+#: apply.c:4925 builtin/am.c:2286
+msgid "num"
+msgstr "БРОЙ"
+
+#: apply.c:4926
+msgid "remove <num> leading slashes from traditional diff paths"
+msgstr "премахване на този БРОЙ водещи елементи от пътищата в разликата"
+
+#: apply.c:4929
+msgid "ignore additions made by the patch"
+msgstr "игнориране на редовете добавени от тази кръпка"
+
+#: apply.c:4931
+msgid "instead of applying the patch, output diffstat for the input"
+msgstr "извеждане на статистика на промените без прилагане на кръпката"
+
+#: apply.c:4935
+msgid "show number of added and deleted lines in decimal notation"
+msgstr "извеждане на броя на добавените и изтритите редове"
+
+#: apply.c:4937
+msgid "instead of applying the patch, output a summary for the input"
+msgstr "извеждане на статистика на входните данни без прилагане на кръпката"
+
+#: apply.c:4939
+msgid "instead of applying the patch, see if the patch is applicable"
+msgstr "проверка дали кръпката може да се приложи, без действително прилагане"
+
+#: apply.c:4941
+msgid "make sure the patch is applicable to the current index"
+msgstr "проверка дали кръпката може да бъде приложена към текущия индекс"
+
+#: apply.c:4943
+msgid "apply a patch without touching the working tree"
+msgstr "прилагане на кръпката без промяна на работното дърво"
+
+#: apply.c:4945
+msgid "accept a patch that touches outside the working area"
+msgstr "прилагане на кръпка, която променя и файлове извън работното дърво"
+
+#: apply.c:4947
+msgid "also apply the patch (use with --stat/--summary/--check)"
+msgstr ""
+"кръпката да бъде приложена. Опцията се комбинира с „--check“/„--stat“/„--"
+"summary“"
+
+#: apply.c:4949
+msgid "attempt three-way merge if a patch does not apply"
+msgstr "пробване с тройно сливане, ако кръпката не може да се приложи директно"
+
+#: apply.c:4951
+msgid "build a temporary index based on embedded index information"
+msgstr ""
+"създаване на временен индекс на база на включената информация за индекса"
+
+#: apply.c:4954 builtin/checkout-index.c:169 builtin/ls-files.c:505
+msgid "paths are separated with NUL character"
+msgstr "разделяне на пътищата с нулевия знак „NUL“"
+
+#: apply.c:4956
+msgid "ensure at least <n> lines of context match"
+msgstr "да се осигури контекст от поне такъв БРОЙ съвпадащи редове"
+
+#: apply.c:4957 builtin/am.c:2265
+msgid "action"
+msgstr "действие"
+
+#: apply.c:4958
+msgid "detect new or modified lines that have whitespace errors"
+msgstr "засичане на нови или променени редове с грешки в знаците за интервали"
+
+#: apply.c:4961 apply.c:4964
+msgid "ignore changes in whitespace when finding context"
+msgstr ""
+"игнориране на промените в знаците за интервали при откриване на контекста"
+
+#: apply.c:4967
+msgid "apply the patch in reverse"
+msgstr "прилагане на кръпката в обратна посока"
+
+#: apply.c:4969
+msgid "don't expect at least one line of context"
+msgstr "без изискване на дори и един ред контекст"
+
+#: apply.c:4971
+msgid "leave the rejected hunks in corresponding *.rej files"
+msgstr "оставяне на отхвърлените парчета във файлове с разширение „.rej“"
+
+#: apply.c:4973
+msgid "allow overlapping hunks"
+msgstr "позволяване на застъпващи се парчета"
+
+#: apply.c:4974 builtin/add.c:267 builtin/check-ignore.c:19
+#: builtin/commit.c:1339 builtin/count-objects.c:94 builtin/fsck.c:593
+#: builtin/log.c:1860 builtin/mv.c:110 builtin/read-tree.c:114
+msgid "be verbose"
+msgstr "повече подробности"
+
+#: apply.c:4976
+msgid "tolerate incorrectly detected missing new-line at the end of file"
+msgstr "пренебрегване на неправилно липсващ знак за нов ред в края на файл"
+
+#: apply.c:4979
+msgid "do not trust the line counts in the hunk headers"
+msgstr "без доверяване на номерата на редовете в заглавните части на парчетата"
+
+#: apply.c:4981 builtin/am.c:2274
+msgid "root"
+msgstr "НАЧАЛНА_ДИРЕКТОРИЯ"
+
+#: apply.c:4982
+msgid "prepend <root> to all filenames"
+msgstr "добавяне на тази НАЧАЛНА_ДИРЕКТОРИЯ към имената на всички файлове"
+
#: archive.c:12
msgid "git archive [<options>] <tree-ish> [<path>...]"
msgstr "git archive [ОПЦИЯ…] УКАЗАТЕЛ_КЪМ_ДЪРВО [ПЪТ…]"
@@ -167,7 +861,7 @@ msgstr ""
msgid "git archive --remote <repo> [--exec <cmd>] --list"
msgstr "git archive --remote ХРАНИЛИЩЕ [--exec КОМАНДА] --list"
-#: archive.c:344 builtin/add.c:137 builtin/add.c:420 builtin/rm.c:327
+#: archive.c:344 builtin/add.c:152 builtin/add.c:442 builtin/rm.c:327
#, c-format
msgid "pathspec '%s' did not match any files"
msgstr "пътят „%s“ не съвпада с никой файл"
@@ -180,7 +874,7 @@ msgstr "ФОРМАТ"
msgid "archive format"
msgstr "ФОРМАТ на архива"
-#: archive.c:430 builtin/log.c:1395
+#: archive.c:430 builtin/log.c:1429
msgid "prefix"
msgstr "ПРЕФИКС"
@@ -188,11 +882,11 @@ msgstr "ПРЕФИКС"
msgid "prepend prefix to each pathname in the archive"
msgstr "добавяне на този ПРЕФИКС към всеки път в архива"
-#: archive.c:432 builtin/archive.c:88 builtin/blame.c:2548 builtin/blame.c:2549
-#: builtin/config.c:60 builtin/fast-export.c:987 builtin/fast-export.c:989
-#: builtin/grep.c:722 builtin/hash-object.c:100 builtin/ls-files.c:459
-#: builtin/ls-files.c:462 builtin/notes.c:398 builtin/notes.c:561
-#: builtin/read-tree.c:109 parse-options.h:153
+#: archive.c:432 builtin/blame.c:2603 builtin/blame.c:2604 builtin/config.c:59
+#: builtin/fast-export.c:987 builtin/fast-export.c:989 builtin/grep.c:723
+#: builtin/hash-object.c:101 builtin/ls-files.c:539 builtin/ls-files.c:542
+#: builtin/notes.c:401 builtin/notes.c:564 builtin/read-tree.c:109
+#: parse-options.h:153
msgid "file"
msgstr "ФАЙЛ"
@@ -224,8 +918,8 @@ msgstr "добро компресиране"
msgid "list supported archive formats"
msgstr "извеждане на списъка с поддържаните формати"
-#: archive.c:451 builtin/archive.c:90 builtin/clone.c:82
-#: builtin/submodule--helper.c:776
+#: archive.c:451 builtin/archive.c:90 builtin/clone.c:85 builtin/clone.c:88
+#: builtin/submodule--helper.c:601 builtin/submodule--helper.c:953
msgid "repo"
msgstr "хранилище"
@@ -233,7 +927,7 @@ msgstr "хранилище"
msgid "retrieve the archive from remote repository <repo>"
msgstr "изтегляне на архива от отдалеченото ХРАНИЛИЩЕ"
-#: archive.c:453 builtin/archive.c:92 builtin/notes.c:482
+#: archive.c:453 builtin/archive.c:92 builtin/notes.c:485
msgid "command"
msgstr "команда"
@@ -241,6 +935,28 @@ msgstr "команда"
msgid "path to the remote git-upload-archive command"
msgstr "път към отдалечената команда „git-upload-archive“"
+#: archive.c:461
+msgid "Unexpected option --remote"
+msgstr "Неочаквана опция „--remote“"
+
+#: archive.c:463
+msgid "Option --exec can only be used together with --remote"
+msgstr "Опцията „--exec“ изисква „--remote“"
+
+#: archive.c:465
+msgid "Unexpected option --output"
+msgstr "Неочаквана опция „--output“"
+
+#: archive.c:487
+#, c-format
+msgid "Unknown archive format '%s'"
+msgstr "Непознат формат на архив: „%s“"
+
+#: archive.c:494
+#, c-format
+msgid "Argument not supported for format '%s': -%d"
+msgstr "Аргументът не се поддържа за форма̀та „%s“: -%d"
+
#: attr.c:263
msgid ""
"Negative patterns are ignored in git attributes\n"
@@ -249,6 +965,129 @@ msgstr ""
"Отрицателните шаблони се игнорират в атрибутите на git.\n"
"Ако ви трябва начална удивителна, ползвайте „\\!“."
+#: bisect.c:441
+#, c-format
+msgid "Could not open file '%s'"
+msgstr "Файлът „%s“ не може да се отвори"
+
+#: bisect.c:446
+#, c-format
+msgid "Badly quoted content in file '%s': %s"
+msgstr "Неправилно цитирано съдържание във файла „%s“: %s"
+
+#: bisect.c:655
+#, c-format
+msgid "We cannot bisect more!\n"
+msgstr "Повече не може да се търси двоично!\n"
+
+#: bisect.c:708
+#, c-format
+msgid "Not a valid commit name %s"
+msgstr "Неправилно име на подаване „%s“"
+
+#: bisect.c:732
+#, c-format
+msgid ""
+"The merge base %s is bad.\n"
+"This means the bug has been fixed between %s and [%s].\n"
+msgstr ""
+"Неправилна база за сливане: %s.\n"
+"Следователно грешката е коригирана между „%s“ и [%s].\n"
+
+#: bisect.c:737
+#, c-format
+msgid ""
+"The merge base %s is new.\n"
+"The property has changed between %s and [%s].\n"
+msgstr ""
+"Нова база за сливане: %s.\n"
+"Свойството е променено между „%s“ и [%s].\n"
+
+#: bisect.c:742
+#, c-format
+msgid ""
+"The merge base %s is %s.\n"
+"This means the first '%s' commit is between %s and [%s].\n"
+msgstr ""
+"Базата за сливане „%s“ е %s.\n"
+"Следователно първото %s подаване е между „%s“ и [%s].\n"
+
+#: bisect.c:750
+#, c-format
+msgid ""
+"Some %s revs are not ancestor of the %s rev.\n"
+"git bisect cannot work properly in this case.\n"
+"Maybe you mistook %s and %s revs?\n"
+msgstr ""
+"Някои от указателите от „%s“ не са предшественици на указателя „%s“.\n"
+"Двоичното търсене с git bisect няма да работи правилно.\n"
+"Дали не сте объркали указателите „%s“ и „%s“?\n"
+
+#: bisect.c:763
+#, c-format
+msgid ""
+"the merge base between %s and [%s] must be skipped.\n"
+"So we cannot be sure the first %s commit is between %s and %s.\n"
+"We continue anyway."
+msgstr ""
+"базата за сливане между „%s“ и [%s] трябва да бъде прескочена.\n"
+"Не може да сме сигурни, че първото %s подаване е между „%s“ и „%s“.\n"
+"Двоичното търсене продължава."
+
+#: bisect.c:798
+#, c-format
+msgid "Bisecting: a merge base must be tested\n"
+msgstr "Двоично търсене: трябва да се провери база за сливане\n"
+
+#: bisect.c:849
+#, c-format
+msgid "a %s revision is needed"
+msgstr "необходима е версия „%s“"
+
+#: bisect.c:866 builtin/notes.c:174 builtin/tag.c:248
+#, c-format
+msgid "could not create file '%s'"
+msgstr "файлът „%s“ не може да бъде създаден"
+
+#: bisect.c:917
+#, c-format
+msgid "could not read file '%s'"
+msgstr "файлът „%s“ не може да бъде прочетен"
+
+#: bisect.c:947
+msgid "reading bisect refs failed"
+msgstr "неуспешно прочитане на указателите за двоично търсене"
+
+#: bisect.c:967
+#, c-format
+msgid "%s was both %s and %s\n"
+msgstr "„%s“ e както „%s“, така и „%s“\n"
+
+#: bisect.c:975
+#, c-format
+msgid ""
+"No testable commit found.\n"
+"Maybe you started with bad path parameters?\n"
+msgstr ""
+"Липсва подходящо за тестване подаване.\n"
+"Проверете параметрите за пътищата.\n"
+
+#: bisect.c:994
+#, c-format
+msgid "(roughly %d step)"
+msgid_plural "(roughly %d steps)"
+msgstr[0] "(приблизително %d стъпка)"
+msgstr[1] "(приблизително %d стъпки)"
+
+#. TRANSLATORS: the last %s will be replaced with
+#. "(roughly %d steps)" translation
+#: bisect.c:998
+#, 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"
+
#: branch.c:53
#, c-format
msgid ""
@@ -318,7 +1157,7 @@ msgstr "Настройките за следения клон не могат д
#: branch.c:156
#, c-format
msgid "Not tracking: ambiguous information for ref %s"
-msgstr "Няма следене: двусмислена информация за указателя „%s“"
+msgstr "Няма следене: информацията за указателя „%s“ не е еднозначна"
#: branch.c:185
#, c-format
@@ -363,27 +1202,27 @@ msgstr ""
"може да използвате „git push -u“, за да настроите към кой клон да се "
"изтласква."
-#: branch.c:266
+#: branch.c:265
#, c-format
msgid "Not a valid object name: '%s'."
msgstr "Неправилно име на обект: „%s“"
-#: branch.c:286
+#: branch.c:285
#, c-format
msgid "Ambiguous object name: '%s'."
-msgstr "Двусмислено име на обект: „%s“"
+msgstr "Името на обект не е еднозначно: „%s“"
-#: branch.c:291
+#: branch.c:290
#, c-format
msgid "Not a valid branch point: '%s'."
msgstr "Неправилно място за начало на клон: „%s“"
-#: branch.c:345
+#: branch.c:344
#, c-format
msgid "'%s' is already checked out at '%s'"
msgstr "„%s“ вече е изтеглен в „%s“"
-#: branch.c:364
+#: branch.c:363
#, c-format
msgid "HEAD of working tree %s is not updated"
msgstr "Указателят „HEAD“ на работното дърво „%s“ не е обновен"
@@ -398,7 +1237,7 @@ msgstr "Файлът „%s“ не изглежда да е пратка на gi
msgid "unrecognized header: %s%s (%d)"
msgstr "непозната заглавна част: %s%s (%d)"
-#: bundle.c:87 builtin/commit.c:777
+#: bundle.c:87 sequencer.c:963 builtin/commit.c:777
#, c-format
msgid "could not open '%s'"
msgstr "„%s“ не може да се отвори"
@@ -407,10 +1246,10 @@ msgstr "„%s“ не може да се отвори"
msgid "Repository lacks these prerequisite commits:"
msgstr "В хранилището липсват следните необходими подавания:"
-#: bundle.c:163 ref-filter.c:1462 sequencer.c:627 sequencer.c:1073
-#: builtin/blame.c:2755 builtin/commit.c:1056 builtin/log.c:340
-#: builtin/log.c:863 builtin/log.c:1308 builtin/log.c:1633 builtin/log.c:1875
-#: builtin/merge.c:361 builtin/shortlog.c:170
+#: bundle.c:163 ref-filter.c:1462 sequencer.c:830 sequencer.c:1374
+#: builtin/blame.c:2814 builtin/commit.c:1061 builtin/log.c:348
+#: builtin/log.c:890 builtin/log.c:1340 builtin/log.c:1666 builtin/log.c:1909
+#: builtin/merge.c:356 builtin/shortlog.c:170
msgid "revision walk setup failed"
msgstr "неуспешно настройване на обхождането на версиите"
@@ -450,7 +1289,7 @@ msgid "ref '%s' is excluded by the rev-list options"
msgstr ""
"указателят „%s“ не е бил включен поради опциите зададени на „git rev-list“"
-#: bundle.c:443 builtin/log.c:163 builtin/log.c:1538 builtin/shortlog.c:273
+#: bundle.c:443 builtin/log.c:165 builtin/log.c:1572 builtin/shortlog.c:273
#, c-format
msgid "unrecognized argument: %s"
msgstr "непознат аргумент: %s"
@@ -468,13 +1307,13 @@ msgstr "Файлът „%s“ не може да бъде създаден"
msgid "index-pack died"
msgstr "Командата „git index-pack“ не завърши успешно"
-#: color.c:275
+#: color.c:290
#, c-format
msgid "invalid color value: %.*s"
msgstr "неправилна стойност за цвят: %.*s"
-#: commit.c:40 builtin/am.c:437 builtin/am.c:473 builtin/am.c:1504
-#: builtin/am.c:2134
+#: commit.c:40 builtin/am.c:421 builtin/am.c:457 builtin/am.c:1493
+#: builtin/am.c:2127
#, c-format
msgid "could not parse %s"
msgstr "„%s“ не може да се анализира"
@@ -484,132 +1323,252 @@ msgstr "„%s“ не може да се анализира"
msgid "%s %s is not a commit!"
msgstr "%s %s не е подаване!"
+#: commit.c:1514
+msgid ""
+"Warning: commit message did not conform to UTF-8.\n"
+"You may want to amend it after fixing the message, or set the config\n"
+"variable i18n.commitencoding to the encoding your project uses.\n"
+msgstr ""
+"ПРЕДУПРЕЖДЕНИЕ: съобщението при подаване не е кодирано с UTF-8.\n"
+"Може да поправите подаването заедно със съобщението или може да\n"
+"зададете ползваното кодиране в настройката „i18n.commitencoding“.\n"
+
#: compat/obstack.c:406 compat/obstack.c:408
msgid "memory exhausted"
msgstr "паметта свърши"
-#: config.c:475 config.c:477
+#: config.c:516
+#, c-format
+msgid "bad config line %d in blob %s"
+msgstr "неправилен ред за настройки %d в BLOB „%s“"
+
+#: config.c:520
#, c-format
-msgid "bad config line %d in %s %s"
-msgstr "неправилен ред %d в настройката %s „%s“"
+msgid "bad config line %d in file %s"
+msgstr "неправилен ред за настройки %d във файла „%s“"
-#: config.c:593
+#: config.c:524
#, c-format
-msgid "bad numeric config value '%s' for '%s' in %s %s: %s"
-msgstr "неправилна числова стойност „%s“ за настройката „%s“ в %s „%s“: %s"
+msgid "bad config line %d in standard input"
+msgstr "неправилен ред за настройки %d на стандартния вход"
-#: config.c:595
+#: config.c:528
+#, c-format
+msgid "bad config line %d in submodule-blob %s"
+msgstr "неправилен ред за настройки %d в BLOB за подмодул „%s“"
+
+#: config.c:532
+#, c-format
+msgid "bad config line %d in command line %s"
+msgstr "неправилен ред за настройки %d на командния ред „%s“"
+
+#: config.c:536
+#, c-format
+msgid "bad config line %d in %s"
+msgstr "неправилен ред за настройки %d в „%s“"
+
+#: config.c:655
+msgid "out of range"
+msgstr "извън диапазона"
+
+#: config.c:655
+msgid "invalid unit"
+msgstr "неправилна мерна единица"
+
+#: config.c:661
#, c-format
msgid "bad numeric config value '%s' for '%s': %s"
-msgstr "неправилна числова стойност „%s“ за настройката „%s“: %s"
+msgstr "неправилна числова стойност „%s“ за „%s“: %s"
+
+#: config.c:666
+#, c-format
+msgid "bad numeric config value '%s' for '%s' in blob %s: %s"
+msgstr "неправилна числова стойност „%s“ за „%s“ в BLOB „%s“: %s"
+
+#: config.c:669
+#, c-format
+msgid "bad numeric config value '%s' for '%s' in file %s: %s"
+msgstr "неправилна числова стойност „%s“ за „%s“ във файла „%s“: %s"
+
+#: config.c:672
+#, c-format
+msgid "bad numeric config value '%s' for '%s' in standard input: %s"
+msgstr "неправилна числова стойност „%s“ за „%s“ на стандартния вход: %s"
+
+#: config.c:675
+#, c-format
+msgid "bad numeric config value '%s' for '%s' in submodule-blob %s: %s"
+msgstr "неправилна числова стойност „%s“ за „%s“ в BLOB от подмодул „%s“: %s"
+
+#: config.c:678
+#, c-format
+msgid "bad numeric config value '%s' for '%s' in command line %s: %s"
+msgstr "неправилна числова стойност „%s“ за „%s“ на командния ред „%s“: %s"
+
+#: config.c:681
+#, c-format
+msgid "bad numeric config value '%s' for '%s' in %s: %s"
+msgstr "неправилна числова стойност „%s“ за „%s“ в %s: %s"
-#: config.c:680
+#: config.c:768
#, c-format
msgid "failed to expand user dir in: '%s'"
msgstr "домашната папка на потребителя не може да бъде открита: „%s“"
-#: config.c:761 config.c:772
+#: config.c:852 config.c:863
#, c-format
msgid "bad zlib compression level %d"
msgstr "неправилно ниво на компресиране: %d"
-#: config.c:890
+#: config.c:978
#, c-format
msgid "invalid mode for object creation: %s"
msgstr "неправилен режим за създаването на обекти: %s"
-#: config.c:1228
+#: config.c:1312
msgid "unable to parse command-line config"
msgstr "неправилни настройки от командния ред"
-#: config.c:1284
-msgid "unknown error occured while reading the configuration files"
+#: config.c:1362
+msgid "unknown error occurred while reading the configuration files"
msgstr "неочаквана грешка при изчитането на конфигурационните файлове"
-#: config.c:1629
+#: config.c:1716
#, c-format
msgid "unable to parse '%s' from command-line config"
msgstr "неразпозната стойност „%s“ от командния ред"
-#: config.c:1631
+#: config.c:1718
#, c-format
msgid "bad config variable '%s' in file '%s' at line %d"
msgstr "неправилна настройка „%s“ във файла „%s“ на ред №%d"
-#: config.c:1690
+#: config.c:1777
#, c-format
msgid "%s has multiple values"
msgstr "зададени са няколко стойности за „%s“"
-#: config.c:2224
+#: config.c:2311
#, c-format
msgid "could not set '%s' to '%s'"
msgstr "„%s“ не може да се зададе да е „%s“"
-#: config.c:2226
+#: config.c:2313
#, c-format
msgid "could not unset '%s'"
msgstr "„%s“ не може да се премахне"
-#: connected.c:69
+#: connect.c:49
+msgid "The remote end hung up upon initial contact"
+msgstr "Отдалеченото хранилище прекъсна връзката веднага след отварянето ѝ"
+
+#: connect.c:51
+msgid ""
+"Could not read from remote repository.\n"
+"\n"
+"Please make sure you have the correct access rights\n"
+"and the repository exists."
+msgstr ""
+"Не може да се чете от отдалеченото хранилище.\n"
+"\n"
+"Проверете дали то съществува и дали имате права\n"
+"за достъп."
+
+#: connected.c:63 builtin/fsck.c:173 builtin/prune.c:140
+msgid "Checking connectivity"
+msgstr "Проверка на връзката"
+
+#: connected.c:75
msgid "Could not run 'git rev-list'"
msgstr "Командата „git rev-list“ не може да бъде изпълнена."
-#: connected.c:89
+#: connected.c:95
msgid "failed write to rev-list"
msgstr "неуспешен запис на списъка с версиите"
-#: connected.c:96
+#: connected.c:102
msgid "failed to close rev-list's stdin"
msgstr "стандартният вход на списъка с версиите не може да бъде затворен"
-#: date.c:95
+#: convert.c:201
+#, c-format
+msgid ""
+"CRLF will be replaced by LF in %s.\n"
+"The file will have its original line endings in your working directory."
+msgstr ""
+"Всяка последователност от знаци „CRLF“ ще бъдe заменена с „LF“ в „%s“.\n"
+"Файлът ще остане с първоначалните знаци за край на ред в работната ви "
+"директория."
+
+#: convert.c:205
+#, c-format
+msgid "CRLF would be replaced by LF in %s."
+msgstr "Всяка последователност от знаци „CRLF“ ще бъдe заменена с „LF“ в „%s“."
+
+#: convert.c:211
+#, c-format
+msgid ""
+"LF will be replaced by CRLF in %s.\n"
+"The file will have its original line endings in your working directory."
+msgstr ""
+"Всеки знак „LF“ ще бъдe заменен с последователността от знаци „CRLF“ в "
+"„%s“.\n"
+"Файлът ще остане с първоначалните знаци за край на ред в работната ви "
+"директория."
+
+#: convert.c:215
+#, c-format
+msgid "LF would be replaced by CRLF in %s"
+msgstr ""
+"Всеки знак „LF“ ще бъдe заменен с последователността от знаци „CRLF“ в „%s“."
+
+#: date.c:97
msgid "in the future"
msgstr "в бъдещето"
-#: date.c:101
+#: date.c:103
#, c-format
msgid "%lu second ago"
msgid_plural "%lu seconds ago"
msgstr[0] "преди %lu секунда"
msgstr[1] "преди %lu секунди"
-#: date.c:108
+#: date.c:110
#, c-format
msgid "%lu minute ago"
msgid_plural "%lu minutes ago"
msgstr[0] "преди %lu минута"
msgstr[1] "преди %lu минути"
-#: date.c:115
+#: date.c:117
#, c-format
msgid "%lu hour ago"
msgid_plural "%lu hours ago"
msgstr[0] "преди %lu час"
msgstr[1] "преди %lu часа"
-#: date.c:122
+#: date.c:124
#, c-format
msgid "%lu day ago"
msgid_plural "%lu days ago"
msgstr[0] "преди %lu ден"
msgstr[1] "преди %lu дена"
-#: date.c:128
+#: date.c:130
#, c-format
msgid "%lu week ago"
msgid_plural "%lu weeks ago"
msgstr[0] "преди %lu седмица"
msgstr[1] "преди %lu седмици"
-#: date.c:135
+#: date.c:137
#, c-format
msgid "%lu month ago"
msgid_plural "%lu months ago"
msgstr[0] "преди %lu месец"
msgstr[1] "преди %lu месеца"
-#: date.c:146
+#: date.c:148
#, c-format
msgid "%lu year"
msgid_plural "%lu years"
@@ -617,14 +1576,14 @@ msgstr[0] "%lu година"
msgstr[1] "%lu години"
#. TRANSLATORS: "%s" is "<n> years"
-#: date.c:149
+#: date.c:151
#, c-format
msgid "%s, %lu month ago"
msgid_plural "%s, %lu months ago"
msgstr[0] "преди %s и %lu месец"
msgstr[1] "преди %s и %lu месеца"
-#: date.c:154 date.c:159
+#: date.c:156 date.c:161
#, c-format
msgid "%lu year ago"
msgid_plural "%lu years ago"
@@ -636,28 +1595,33 @@ msgstr[1] "преди %lu години"
msgid "failed to read orderfile '%s'"
msgstr "файлът с подредбата на съответствията „%s“ не може да бъде прочетен"
-#: diffcore-rename.c:538
+#: diffcore-rename.c:536
msgid "Performing inexact rename detection"
msgstr "Търсене на преименувания на обекти съчетани с промени"
-#: diff.c:116
+#: diff.c:62
+#, c-format
+msgid "option '%s' requires a value"
+msgstr "опцията „%s“ изисква стойност"
+
+#: diff.c:124
#, c-format
msgid " Failed to parse dirstat cut-off percentage '%s'\n"
msgstr ""
" Неуспешно разпознаване на „%s“ като процент-праг за статистиката по "
"директории\n"
-#: diff.c:121
+#: diff.c:129
#, c-format
msgid " Unknown dirstat parameter '%s'\n"
msgstr " Непознат параметър „%s“ за статистиката по директории'\n"
-#: diff.c:225
+#: diff.c:283
#, c-format
msgid "Unknown value for 'diff.submodule' config variable: '%s'"
msgstr "Непозната стойност „%s“ за настройката „diff.submodule“"
-#: diff.c:277
+#: diff.c:346
#, c-format
msgid ""
"Found errors in 'diff.dirstat' config variable:\n"
@@ -666,17 +1630,23 @@ msgstr ""
"Грешки в настройката „diff.dirstat“:\n"
"%s"
-#: diff.c:3007
+#: diff.c:3087
#, c-format
msgid "external diff died, stopping at %s"
msgstr ""
-"външната програма за разлики завърши неуспешно. Спиране на работата при „%s“"
+"външната програма за разлики завърши неуспешно. Спиране на работата при „%s“"
+
+#: diff.c:3412
+msgid "--name-only, --name-status, --check and -s are mutually exclusive"
+msgstr ""
+"Опциите „--name-only“, „--name-status“, „--check“ и „-s“ са несъвместими "
+"една с друга"
-#: diff.c:3405
+#: diff.c:3502
msgid "--follow requires exactly one pathspec"
msgstr "Опцията „--follow“ изисква точно един път"
-#: diff.c:3568
+#: diff.c:3665
#, c-format
msgid ""
"Failed to parse --dirstat/-X option parameter:\n"
@@ -685,84 +1655,259 @@ msgstr ""
"Неразпознат параметър към опцията „--dirstat/-X“:\n"
"%s"
-#: diff.c:3582
+#: diff.c:3679
#, c-format
msgid "Failed to parse --submodule option parameter: '%s'"
msgstr "Неразпознат параметър към опцията „--submodule“: „%s“"
-#: dir.c:1823
+#: diff.c:4700
+msgid "inexact rename detection was skipped due to too many files."
+msgstr ""
+"търсенето на преименувания на обекти съчетани с промени се прескача поради "
+"многото файлове."
+
+#: diff.c:4703
+msgid "only found copies from modified paths due to too many files."
+msgstr ""
+"установени са точните копия на променените пътища поради многото файлове."
+
+#: diff.c:4706
+#, c-format
+msgid ""
+"you may want to set your %s variable to at least %d and retry the command."
+msgstr "задайте променливата „%s“ да е поне %d и отново изпълнете командата."
+
+#: dir.c:1866
msgid "failed to get kernel name and information"
msgstr "името и версията на ядрото не бяха получени"
-#: dir.c:1942
+#: dir.c:1985
msgid "Untracked cache is disabled on this system or location."
msgstr ""
"Кеша за неследените файлове е изключен на тази система или местоположение."
-#: gpg-interface.c:166 gpg-interface.c:235
-msgid "could not run gpg."
-msgstr "Програмата „gpg“ не може да бъде стартирана."
+#: fetch-pack.c:213
+msgid "git fetch-pack: expected shallow list"
+msgstr "git fetch-pack: очаква се плитък списък"
+
+#: fetch-pack.c:225
+msgid "git fetch-pack: expected ACK/NAK, got EOF"
+msgstr "git fetch-pack: очакваше се „ACK“/„NAK“, а бе получен „EOF“"
+
+#: fetch-pack.c:243
+#, c-format
+msgid "git fetch-pack: expected ACK/NAK, got '%s'"
+msgstr "git fetch-pack: очакваше се „ACK“/„NAK“, а бе получен „%s“"
+
+#: fetch-pack.c:295
+msgid "--stateless-rpc requires multi_ack_detailed"
+msgstr "опцията „--stateless-rpc“ изисква „multi_ack_detailed“"
+
+#: fetch-pack.c:381
+#, c-format
+msgid "invalid shallow line: %s"
+msgstr "неправилен плитък ред: „%s“"
+
+#: fetch-pack.c:387
+#, c-format
+msgid "invalid unshallow line: %s"
+msgstr "неправилен неплитък ред: „%s“"
+
+#: fetch-pack.c:389
+#, c-format
+msgid "object not found: %s"
+msgstr "обектът „%s“ липсва"
+
+#: fetch-pack.c:392
+#, c-format
+msgid "error in object: %s"
+msgstr "грешка в обекта: „%s“"
+
+#: fetch-pack.c:394
+#, c-format
+msgid "no shallow found: %s"
+msgstr "не е открит плитък обект: %s"
+
+#: fetch-pack.c:397
+#, c-format
+msgid "expected shallow/unshallow, got %s"
+msgstr "очаква се плитък или не обект, а бе получено: %s"
+
+#: fetch-pack.c:436
+#, c-format
+msgid "got %s %d %s"
+msgstr "получено бе %s %d %s"
+
+#: fetch-pack.c:450
+#, c-format
+msgid "invalid commit %s"
+msgstr "неправилно подаване: „%s“"
+
+#: fetch-pack.c:483
+msgid "giving up"
+msgstr "преустановяване"
+
+#: fetch-pack.c:493 progress.c:235
+msgid "done"
+msgstr "действието завърши"
+
+#: fetch-pack.c:505
+#, c-format
+msgid "got %s (%d) %s"
+msgstr "получено бе %s (%d) %s"
+
+#: fetch-pack.c:551
+#, c-format
+msgid "Marking %s as complete"
+msgstr "Отбелязване на „%s“ като пълно"
+
+#: fetch-pack.c:697
+#, c-format
+msgid "already have %s (%s)"
+msgstr "вече има „%s“ (%s)"
+
+#: fetch-pack.c:735
+msgid "fetch-pack: unable to fork off sideband demultiplexer"
+msgstr "fetch-pack: не може да се създаде процес за демултиплексора"
+
+#: fetch-pack.c:743
+msgid "protocol error: bad pack header"
+msgstr "протоколна грешка: неправилна заглавна част на пакет"
+
+#: fetch-pack.c:799
+#, c-format
+msgid "fetch-pack: unable to fork off %s"
+msgstr "fetch-pack: не може да се създаде процес за „%s“"
+
+#: fetch-pack.c:815
+#, c-format
+msgid "%s failed"
+msgstr "неуспешно изпълнение на „%s“"
+
+#: fetch-pack.c:817
+msgid "error in sideband demultiplexer"
+msgstr "грешка в демултиплексора"
+
+#: fetch-pack.c:844
+msgid "Server does not support shallow clients"
+msgstr "Сървърът не поддържа плитки клиенти"
+
+#: fetch-pack.c:848
+msgid "Server supports multi_ack_detailed"
+msgstr "Сървърът поддържа „multi_ack_detailed“"
+
+#: fetch-pack.c:851
+msgid "Server supports no-done"
+msgstr "Сървърът поддържа „no-done“"
+
+#: fetch-pack.c:857
+msgid "Server supports multi_ack"
+msgstr "Сървърът поддържа „multi_ack“"
+
+#: fetch-pack.c:861
+msgid "Server supports side-band-64k"
+msgstr "Сървърът поддържа „side-band-64k“"
+
+#: fetch-pack.c:865
+msgid "Server supports side-band"
+msgstr "Сървърът поддържа „side-band“"
+
+#: fetch-pack.c:869
+msgid "Server supports allow-tip-sha1-in-want"
+msgstr "Сървърът поддържа „allow-tip-sha1-in-want“"
+
+#: fetch-pack.c:873
+msgid "Server supports allow-reachable-sha1-in-want"
+msgstr "Сървърът поддържа „allow-reachable-sha1-in-want“"
+
+#: fetch-pack.c:883
+msgid "Server supports ofs-delta"
+msgstr "Сървърът поддържа „ofs-delta“"
-#: gpg-interface.c:178
-msgid "gpg did not accept the data"
-msgstr "Програмата „gpg“ не прие подадените данни."
+#: fetch-pack.c:890
+#, c-format
+msgid "Server version is %.*s"
+msgstr "Версията на сървъра е: %.*s"
+
+#: fetch-pack.c:896
+msgid "Server does not support --shallow-since"
+msgstr "Сървърът не поддържа опцията „--shallow-since“"
+
+#: fetch-pack.c:900
+msgid "Server does not support --shallow-exclude"
+msgstr "Сървърът не поддържа опцията „--shallow-exclude“"
+
+#: fetch-pack.c:902
+msgid "Server does not support --deepen"
+msgstr "Сървърът не поддържа опцията „--deepen“"
+
+#: fetch-pack.c:913
+msgid "no common commits"
+msgstr "няма общи подавания"
-#: gpg-interface.c:189
+#: fetch-pack.c:925
+msgid "git fetch-pack: fetch failed."
+msgstr "git fetch-pack: неуспешно доставяне."
+
+#: fetch-pack.c:1087
+msgid "no matching remote head"
+msgstr "не може да бъде открит подходящ връх от отдалеченото хранилище"
+
+#: gpg-interface.c:185
msgid "gpg failed to sign the data"
msgstr "Програмата „gpg“ не подписа данните."
-#: gpg-interface.c:222
-#, c-format
-msgid "could not create temporary file '%s'"
-msgstr "Програмата не успя да създаде временния файл „%s“"
+#: gpg-interface.c:215
+msgid "could not create temporary file"
+msgstr "не може да се създаде временен файл"
-#: gpg-interface.c:224
+#: gpg-interface.c:217
#, c-format
msgid "failed writing detached signature to '%s'"
msgstr "Програмата не успя да запише самостоятелния подпис в „%s“"
-#: grep.c:1718
+#: grep.c:1782
#, c-format
msgid "'%s': unable to read %s"
msgstr "„%s“: файлът сочен от „%s“ не може да бъде прочетен"
-#: grep.c:1735 builtin/clone.c:382 builtin/diff.c:84 builtin/rm.c:155
+#: grep.c:1799 builtin/clone.c:381 builtin/diff.c:84 builtin/rm.c:155
#, c-format
msgid "failed to stat '%s'"
msgstr "не може да бъде получена информация чрез „stat“ за „%s“"
-#: grep.c:1746
+#: grep.c:1810
#, c-format
msgid "'%s': short read"
msgstr "„%s“: изчитането върна по-малко байтове от заявените"
-#: help.c:205
+#: help.c:203
#, c-format
msgid "available git commands in '%s'"
msgstr "налични команди на git от „%s“"
-#: help.c:212
+#: help.c:210
msgid "git commands available from elsewhere on your $PATH"
msgstr "команди на git от други директории от „$PATH“"
-#: help.c:244
+#: help.c:241
msgid "These are common Git commands used in various situations:"
msgstr "Това са най-често използваните команди на Git:"
-#: help.c:309
+#: help.c:306
#, c-format
msgid ""
"'%s' appears to be a git command, but we were not\n"
"able to execute it. Maybe git-%s is broken?"
msgstr ""
"Изглежда, че „%s“ е команда на git, но тя не може да\n"
-"бъде изпълнена. Вероятно пакетът „git-%s“ е повреден."
+"бъде изпълнена. Вероятно пакетът „git-%s“ е повреден."
-#: help.c:366
+#: help.c:361
msgid "Uh oh. Your system reports no Git commands at all."
msgstr "Странно, изглежда, че на системата ви няма нито една команда на git."
-#: help.c:388
+#: help.c:383
#, c-format
msgid ""
"WARNING: You called a Git command named '%s', which does not exist.\n"
@@ -770,20 +1915,20 @@ msgid ""
msgstr ""
"ПРЕДУПРЕЖДЕНИЕ: Пробвахте да изпълните команда на Git на име „%s“, а такава "
"не\n"
-"съществува. Изпълнението автоматично продължава, като се счита, че имате "
+"съществува. Изпълнението автоматично продължава, като се счита, че имате "
"предвид „%s“"
-#: help.c:393
+#: help.c:388
#, c-format
msgid "in %0.1f seconds automatically..."
msgstr "след %0.1f секунди…"
-#: help.c:400
+#: help.c:395
#, c-format
msgid "git: '%s' is not a git command. See 'git --help'."
-msgstr "git: „%s“ не е команда на git. Погледнете изхода от „git --help“."
+msgstr "git: „%s“ не е команда на git. Погледнете изхода от „git --help“."
-#: help.c:404 help.c:464
+#: help.c:399 help.c:465
msgid ""
"\n"
"Did you mean this?"
@@ -797,11 +1942,38 @@ msgstr[1] ""
"\n"
"Команди с подобно име са:"
-#: help.c:460
+#: help.c:461
#, c-format
msgid "%s: %s - %s"
msgstr "%s: %s — %s"
+#: ident.c:334
+msgid ""
+"\n"
+"*** Please tell me who you are.\n"
+"\n"
+"Run\n"
+"\n"
+" git config --global user.email \"you@example.com\"\n"
+" git config --global user.name \"Your Name\"\n"
+"\n"
+"to set your account's default identity.\n"
+"Omit --global to set the identity only in this repository.\n"
+"\n"
+msgstr ""
+"\n"
+"●●● Въведете самоличност.\n"
+"\n"
+"Изпълнете:\n"
+"\n"
+" git config --global user.email \"ИМЕ@example.com\"\n"
+" git config --global user.name \"ВАШЕТО ИМЕ\"\n"
+"\n"
+"и въведете данни за себе си.\n"
+"Ако пропуснете опцията „--global“, самоличността е само за текущото "
+"хранилище.\n"
+"\n"
+
#: lockfile.c:152
#, c-format
msgid ""
@@ -816,9 +1988,9 @@ msgstr ""
"Файлът-ключалка „%s.lock“ не може да бъде създаден: %s\n"
"\n"
"Изглежда, че и друг процес на git е пуснат в това хранилище, напр.\n"
-"редактор, стартиран с „git commit“. Уверете се, че всички подобни\n"
-"процеси са спрени и опитайте отново. Ако това не помогне, вероятната\n"
-"причина е, че някой процес на git в това хранилище е забил. За да\n"
+"редактор, стартиран с „git commit“. Уверете се, че всички подобни\n"
+"процеси са спрени и опитайте отново. Ако това не помогне, вероятната\n"
+"причина е, че някой процес на git в това хранилище е забил. За да\n"
"продължите работа, ще трябва ръчно да изтриете файла:"
#: lockfile.c:160
@@ -830,116 +2002,111 @@ msgstr "Файлът-ключалка „%s.lock“ не може да бъде
msgid "failed to read the cache"
msgstr "кешът не може да бъде прочетен"
-#: merge.c:94 builtin/am.c:2007 builtin/am.c:2042 builtin/checkout.c:375
-#: builtin/checkout.c:586 builtin/clone.c:732
+#: merge.c:96 builtin/am.c:2000 builtin/am.c:2035 builtin/checkout.c:374
+#: builtin/checkout.c:588 builtin/clone.c:731
msgid "unable to write new index file"
msgstr "неуспешно записване на новия индекс"
-#: merge-recursive.c:189
-#, c-format
+#: merge-recursive.c:209
msgid "(bad commit)\n"
msgstr "(лошо подаване)\n"
-#: merge-recursive.c:209
+#: merge-recursive.c:231
#, c-format
msgid "addinfo_cache failed for path '%s'"
msgstr "неуспешно изпълнение на „addinfo_cache“ за пътя „%s“"
-#: merge-recursive.c:270
+#: merge-recursive.c:301
msgid "error building trees"
msgstr "грешка при изграждане на дърветата"
-#: merge-recursive.c:689
+#: merge-recursive.c:720
#, c-format
msgid "failed to create path '%s'%s"
msgstr "грешка при създаването на пътя „%s“%s"
-#: merge-recursive.c:700
+#: merge-recursive.c:731
#, c-format
msgid "Removing %s to make room for subdirectory\n"
msgstr "Изтриване на „%s“, за да се освободи място за поддиректория\n"
-#: merge-recursive.c:714 merge-recursive.c:735
+#: merge-recursive.c:745 merge-recursive.c:764
msgid ": perhaps a D/F conflict?"
msgstr ": възможно е да има конфликт директория/файл."
-#: merge-recursive.c:725
+#: merge-recursive.c:754
#, c-format
msgid "refusing to lose untracked file at '%s'"
msgstr ""
"преустановяване на действието, за да не се изтрие неследеният файл „%s“"
-#: merge-recursive.c:765
+#: merge-recursive.c:796 builtin/cat-file.c:34
#, c-format
msgid "cannot read object %s '%s'"
msgstr "обектът „%s“ (%s) не може да бъде прочетен"
-#: merge-recursive.c:767
+#: merge-recursive.c:798
#, c-format
msgid "blob expected for %s '%s'"
msgstr "обектът „%s“ (%s) се очакваше да е BLOB, а не е"
-#: merge-recursive.c:790 builtin/clone.c:376
+#: merge-recursive.c:822
#, c-format
-msgid "failed to open '%s'"
-msgstr "директорията „%s“ не може да бъде отворена"
+msgid "failed to open '%s': %s"
+msgstr "„%s“ не може да се отвори: %s"
-#: merge-recursive.c:798
+#: merge-recursive.c:833
#, c-format
-msgid "failed to symlink '%s'"
-msgstr "неуспешно създаване на символната връзка „%s“"
+msgid "failed to symlink '%s': %s"
+msgstr "неуспешно създаване на символната връзка „%s“: %s"
-#: merge-recursive.c:801
+#: merge-recursive.c:838
#, c-format
msgid "do not know what to do with %06o %s '%s'"
msgstr ""
"не е ясно какво да се прави с обекта „%2$s“ (%3$s) с права за достъп „%1$06o“"
-#: merge-recursive.c:939
+#: merge-recursive.c:978
msgid "Failed to execute internal merge"
msgstr "Неуспешно вътрешно сливане"
-#: merge-recursive.c:943
+#: merge-recursive.c:982
#, c-format
msgid "Unable to add %s to database"
msgstr "„%s“ не може да се добави в базата с данни"
-#: merge-recursive.c:959
-msgid "unsupported object type in the tree"
-msgstr "в дървото има неподдържан вид обект"
-
-#: merge-recursive.c:1034 merge-recursive.c:1048
+#: merge-recursive.c:1081 merge-recursive.c:1095
#, c-format
msgid ""
"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
"in tree."
msgstr ""
-"КОНФЛИКТ (%s/изтриване): „%s“ е изтрит в %s, а „%s“ в %s. Версия %s на „%s“ "
+"КОНФЛИКТ (%s/изтриване): „%s“ е изтрит в %s, а „%s“ в %s. Версия %s на „%s“ "
"е оставена в дървото."
-#: merge-recursive.c:1040 merge-recursive.c:1053
+#: merge-recursive.c:1087 merge-recursive.c:1100
#, c-format
msgid ""
"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
"in tree at %s."
msgstr ""
-"КОНФЛИКТ (%s/изтриване): „%s“ е изтрит в %s, а „%s“ в %s. Версия %s на „%s“ "
+"КОНФЛИКТ (%s/изтриване): „%s“ е изтрит в %s, а „%s“ в %s. Версия %s на „%s“ "
"е оставена в дървото: %s."
-#: merge-recursive.c:1094
+#: merge-recursive.c:1143
msgid "rename"
msgstr "преименуване"
-#: merge-recursive.c:1094
+#: merge-recursive.c:1143
msgid "renamed"
msgstr "преименуван"
-#: merge-recursive.c:1150
+#: merge-recursive.c:1200
#, c-format
msgid "%s is a directory in %s adding as %s instead"
msgstr "„%s“ е директория в „%s“, затова се добавя като „%s“"
-#: merge-recursive.c:1172
+#: merge-recursive.c:1225
#, c-format
msgid ""
"CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
@@ -948,153 +2115,165 @@ msgstr ""
"КОНФЛИКТ (преименуване/преименуване): „%s“ е преименуван на „%s“ в клон "
"„%s“, а „%s“ е преименуван на „%s“ в „%s“/%s."
-#: merge-recursive.c:1177
+#: merge-recursive.c:1230
msgid " (left unresolved)"
msgstr " (некоригиран конфликт)"
-#: merge-recursive.c:1231
+#: merge-recursive.c:1292
#, c-format
msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s"
msgstr ""
"КОНФЛИКТ (преименуване/преименуване): „%s“ е преименуван на „%s“ в клон "
"„%s“, а „%s“ е преименуван на „%s“ в „%s“"
-#: merge-recursive.c:1261
+#: merge-recursive.c:1325
#, c-format
msgid "Renaming %s to %s and %s to %s instead"
msgstr "Преименуване на „%s“ на „%s“, а „%s“ на „%s“"
-#: merge-recursive.c:1460
+#: merge-recursive.c:1531
#, c-format
msgid "CONFLICT (rename/add): Rename %s->%s in %s. %s added in %s"
msgstr ""
"КОНФЛИКТ (преименуване/добавяне): „%s“ е преименуван на „%s“ в клон „%s“, а "
"„%s“ е добавен в „%s“"
-#: merge-recursive.c:1470
+#: merge-recursive.c:1546
#, c-format
msgid "Adding merged %s"
msgstr "Добавяне на слетия „%s“"
-#: merge-recursive.c:1475 merge-recursive.c:1677
+#: merge-recursive.c:1553 merge-recursive.c:1766
#, c-format
msgid "Adding as %s instead"
msgstr "Добавяне като „%s“"
-#: merge-recursive.c:1526
+#: merge-recursive.c:1610
#, c-format
msgid "cannot read object %s"
msgstr "обектът „%s“ не може да се прочете"
-#: merge-recursive.c:1529
+#: merge-recursive.c:1613
#, c-format
msgid "object %s is not a blob"
msgstr "обектът „%s“ не е BLOB"
-#: merge-recursive.c:1581
+#: merge-recursive.c:1666
msgid "modify"
msgstr "промяна"
-#: merge-recursive.c:1581
+#: merge-recursive.c:1666
msgid "modified"
msgstr "променен"
-#: merge-recursive.c:1591
+#: merge-recursive.c:1676
msgid "content"
msgstr "съдържание"
-#: merge-recursive.c:1598
+#: merge-recursive.c:1683
msgid "add/add"
msgstr "добавяне/добавяне"
-#: merge-recursive.c:1632
+#: merge-recursive.c:1718
#, c-format
msgid "Skipped %s (merged same as existing)"
msgstr "Прескачане на „%s“ (слетият резултат е идентичен със сегашния)"
-#: merge-recursive.c:1646
+#: merge-recursive.c:1732
#, c-format
msgid "Auto-merging %s"
msgstr "Автоматично сливане на „%s“"
-#: merge-recursive.c:1650 git-submodule.sh:941
+#: merge-recursive.c:1736 git-submodule.sh:924
msgid "submodule"
msgstr "ПОДМОДУЛ"
-#: merge-recursive.c:1651
+#: merge-recursive.c:1737
#, c-format
msgid "CONFLICT (%s): Merge conflict in %s"
msgstr "КОНФЛИКТ (%s): Конфликт при сливане на „%s“"
-#: merge-recursive.c:1737
+#: merge-recursive.c:1831
#, c-format
msgid "Removing %s"
msgstr "Изтриване на „%s“"
-#: merge-recursive.c:1762
+#: merge-recursive.c:1857
msgid "file/directory"
msgstr "файл/директория"
-#: merge-recursive.c:1768
+#: merge-recursive.c:1863
msgid "directory/file"
msgstr "директория/файл"
-#: merge-recursive.c:1773
+#: merge-recursive.c:1868
#, c-format
msgid "CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s"
msgstr ""
-"КОНФЛИКТ (%s): Съществува директория на име „%s“ в „%s“. Добавяне на „%s“ "
+"КОНФЛИКТ (%s): Съществува директория на име „%s“ в „%s“. Добавяне на „%s“ "
"като „%s“"
-#: merge-recursive.c:1781
+#: merge-recursive.c:1877
#, c-format
msgid "Adding %s"
msgstr "Добавяне на „%s“"
-#: merge-recursive.c:1798
-msgid "Fatal merge failure, shouldn't happen."
-msgstr "Фатална грешка при сливане, а такава не трябва да възниква!"
-
-#: merge-recursive.c:1817
+#: merge-recursive.c:1914
msgid "Already up-to-date!"
msgstr "Вече е обновено!"
-#: merge-recursive.c:1826
+#: merge-recursive.c:1923
#, c-format
msgid "merging of trees %s and %s failed"
msgstr "неуспешно сливане на дърветата „%s“ и „%s“"
-#: merge-recursive.c:1856
-#, c-format
-msgid "Unprocessed path??? %s"
-msgstr ""
-"Пътят „%s“ не е обработен, това е грешка в Git, докладвайте я на "
-"разработчиците, като пратите е-писмо на адрес: „git@vger.kernel.org“."
-
-#: merge-recursive.c:1904
+#: merge-recursive.c:2006
msgid "Merging:"
msgstr "Сливане:"
-#: merge-recursive.c:1917
+#: merge-recursive.c:2019
#, c-format
msgid "found %u common ancestor:"
msgid_plural "found %u common ancestors:"
msgstr[0] "открит е %u общ предшественик:"
msgstr[1] "открити са %u общи предшественици:"
-#: merge-recursive.c:1954
+#: merge-recursive.c:2058
msgid "merge returned no commit"
msgstr "сливането не върна подаване"
-#: merge-recursive.c:2011
+#: merge-recursive.c:2121
#, c-format
msgid "Could not parse object '%s'"
msgstr "Неуспешен анализ на обекта „%s“"
-#: merge-recursive.c:2022 builtin/merge.c:649 builtin/merge.c:831
+#: merge-recursive.c:2135 builtin/merge.c:641 builtin/merge.c:788
msgid "Unable to write index."
msgstr "Индексът не може да бъде прочетен"
+#: notes-merge.c:273
+#, c-format
+msgid ""
+"You have not concluded your previous notes merge (%s exists).\n"
+"Please, use 'git notes merge --commit' or 'git notes merge --abort' to "
+"commit/abort the previous merge before you start a new notes merge."
+msgstr ""
+"Не сте завършили предишното сливане на бележки. (Указателят „%s“ "
+"съществува).\n"
+"За да завършите предишното сливане, изпълнете:\n"
+"\n"
+" git notes merge --commit\n"
+"\n"
+"За да отмените предишното сливане, изпълнете:\n"
+"\n"
+" git notes merge --abort"
+
+#: notes-merge.c:280
+#, c-format
+msgid "You have not concluded your notes merge (%s exists)."
+msgstr ""
+"Не сте завършили сливането на бележките. (Указателят „%s“ съществува)."
+
#: notes-utils.c:41
msgid "Cannot commit uninitialized/unreferenced notes tree"
msgstr ""
@@ -1153,7 +2332,7 @@ msgstr "-ЧИСЛО"
msgid "malformed object name '%s'"
msgstr "неправилно име на обект „%s“"
-#: path.c:796
+#: path.c:826
#, c-format
msgid "Could not make %s writable by group"
msgstr "Не могат да се дадат права за запис в директорията „%s“ на групата"
@@ -1209,12 +2388,21 @@ msgstr "Пътят „%s“ е в подмодула „%.*s“"
msgid "%s: pathspec magic not supported by this command: %s"
msgstr "%s: магическите пътища не се поддържат от командата „%s“"
-#: pathspec.c:433
+#: pathspec.c:408
+msgid ""
+"empty strings as pathspecs will be made invalid in upcoming releases. please "
+"use . instead if you meant to match all paths"
+msgstr ""
+"възможно е празните низове да се окажат неправилни шаблони за пътища в "
+"следващи версии на Git. Ако искате съвпадение с всички пътища, използвайте: "
+"„.“"
+
+#: pathspec.c:440
#, c-format
msgid "pathspec '%s' is beyond a symbolic link"
msgstr "пътят „%s“ е след символна връзка"
-#: pathspec.c:442
+#: pathspec.c:449
msgid ""
"There is nothing to exclude from by :(exclude) patterns.\n"
"Perhaps you forgot to add either ':/' or '.' ?"
@@ -1226,11 +2414,7 @@ msgstr ""
msgid "unable to parse --pretty format"
msgstr "аргументът към опцията „--pretty“ не може да се анализира"
-#: progress.c:235
-msgid "done"
-msgstr "действието завърши"
-
-#: read-cache.c:1281
+#: read-cache.c:1315
#, c-format
msgid ""
"index.version set, but the value is invalid.\n"
@@ -1239,7 +2423,7 @@ msgstr ""
"Зададена е неправилна стойност на настройката „index.version“.\n"
"Ще се ползва версия %i"
-#: read-cache.c:1291
+#: read-cache.c:1325
#, c-format
msgid ""
"GIT_INDEX_VERSION set, but the value is invalid.\n"
@@ -1249,23 +2433,22 @@ msgstr ""
"„GIT_INDEX_VERSION“.\n"
"Ще се ползва версия %i"
-#: refs.c:543 builtin/merge.c:764 builtin/merge.c:883 builtin/merge.c:985
-#: builtin/merge.c:995
+#: refs.c:576 builtin/merge.c:840
#, c-format
msgid "Could not open '%s' for writing"
msgstr "„%s“ не може да бъде отворен за запис"
-#: refs/files-backend.c:2243
+#: refs/files-backend.c:2481
#, c-format
msgid "could not delete reference %s: %s"
msgstr "Указателят „%s“ не може да бъде изтрит: %s"
-#: refs/files-backend.c:2246
+#: refs/files-backend.c:2484
#, c-format
msgid "could not delete references: %s"
msgstr "Указателите не може да бъдат изтрити: %s"
-#: refs/files-backend.c:2255
+#: refs/files-backend.c:2493
#, c-format
msgid "could not remove reference %s"
msgstr "Указателят „%s“ не може да бъде изтрит"
@@ -1394,12 +2577,12 @@ msgstr "игнориране на указателя с грешно име „%
msgid "ignoring broken ref %s"
msgstr "игнориране на повредения указател „%s“"
-#: ref-filter.c:1651
+#: ref-filter.c:1633
#, c-format
msgid "format: %%(end) atom missing"
msgstr "грешка във форма̀та: липсва лексемата %%(end)"
-#: ref-filter.c:1705
+#: ref-filter.c:1687
#, c-format
msgid "malformed object name %s"
msgstr "неправилно име на обект „%s“"
@@ -1423,76 +2606,76 @@ msgstr "„%s“ следи както „%s“, така и „%s“"
msgid "Internal error"
msgstr "Вътрешна грешка"
-#: remote.c:1678 remote.c:1721
+#: remote.c:1677 remote.c:1720
msgid "HEAD does not point to a branch"
msgstr "Указателят „HEAD“ не сочи към клон"
-#: remote.c:1687
+#: remote.c:1686
#, c-format
msgid "no such branch: '%s'"
msgstr "няма клон на име „%s“"
-#: remote.c:1690
+#: remote.c:1689
#, c-format
msgid "no upstream configured for branch '%s'"
msgstr "не е зададен клон-източник за клона „%s“"
-#: remote.c:1696
+#: remote.c:1695
#, c-format
msgid "upstream branch '%s' not stored as a remote-tracking branch"
msgstr "клонът-източник „%s“ не е съхранен като следящ клон"
-#: remote.c:1711
+#: remote.c:1710
#, c-format
msgid "push destination '%s' on remote '%s' has no local tracking branch"
msgstr ""
"липсва локален следящ клон за местоположението за изтласкване „%s“ в "
"хранилището „%s“"
-#: remote.c:1726
+#: remote.c:1725
#, c-format
msgid "branch '%s' has no remote for pushing"
msgstr "няма информация клонът „%s“ да следи някой друг"
-#: remote.c:1737
+#: remote.c:1736
#, c-format
msgid "push refspecs for '%s' do not include '%s'"
msgstr "указателят за изтласкване на „%s“ не включва „%s“"
-#: remote.c:1750
+#: remote.c:1749
msgid "push has no destination (push.default is 'nothing')"
msgstr "указателят за изтласкване не включва цел („push.default“ е „nothing“)"
-#: remote.c:1772
+#: remote.c:1771
msgid "cannot resolve 'simple' push to a single destination"
msgstr "простото (simple) изтласкване не съответства на една цел"
-#: remote.c:2074
+#: remote.c:2073
#, c-format
msgid "Your branch is based on '%s', but the upstream is gone.\n"
msgstr "Този клон следи „%s“, но следеният клон е изтрит.\n"
-#: remote.c:2078
+#: remote.c:2077
msgid " (use \"git branch --unset-upstream\" to fixup)\n"
msgstr " (за да коригирате това, използвайте „git branch --unset-upstream“)\n"
-#: remote.c:2081
+#: remote.c:2080
#, c-format
msgid "Your branch is up-to-date with '%s'.\n"
msgstr "Клонът е актуализиран към „%s“.\n"
-#: remote.c:2085
+#: remote.c:2084
#, c-format
msgid "Your branch is ahead of '%s' by %d commit.\n"
msgid_plural "Your branch is ahead of '%s' by %d commits.\n"
msgstr[0] "Клонът ви е с %2$d подаване пред „%1$s“.\n"
msgstr[1] "Клонът ви е с %2$d подавания пред „%1$s“.\n"
-#: remote.c:2091
+#: remote.c:2090
msgid " (use \"git push\" to publish your local commits)\n"
msgstr " (публикувайте локалните си промени чрез „git push“)\n"
-#: remote.c:2094
+#: remote.c:2093
#, c-format
msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n"
msgid_plural ""
@@ -1502,11 +2685,11 @@ msgstr[0] ""
msgstr[1] ""
"Клонът ви е с %2$d подавания зад „%1$s“ и може да бъде тривиално слят.\n"
-#: remote.c:2102
+#: remote.c:2101
msgid " (use \"git pull\" to update your local branch)\n"
msgstr " (обновете локалния си клон чрез „git pull“)\n"
-#: remote.c:2105
+#: remote.c:2104
#, c-format
msgid ""
"Your branch and '%s' have diverged,\n"
@@ -1521,41 +2704,41 @@ msgstr[1] ""
"Текущият клон се е отделил от „%s“,\n"
"двата имат съответно по %d и %d несъвпадащи подавания.\n"
-#: remote.c:2115
+#: remote.c:2114
msgid " (use \"git pull\" to merge the remote branch into yours)\n"
msgstr " (слейте отдалечения клон в локалния чрез „git pull“)\n"
-#: revision.c:2142
+#: revision.c:2158
msgid "your current branch appears to be broken"
msgstr "Текущият клон е повреден"
-#: revision.c:2145
+#: revision.c:2161
#, c-format
msgid "your current branch '%s' does not have any commits yet"
msgstr "Текущият клон „%s“ е без подавания "
-#: revision.c:2339
+#: revision.c:2355
msgid "--first-parent is incompatible with --bisect"
msgstr "опциите „--first-parent“ и „--bisect“ са несъвместими"
-#: run-command.c:92
+#: run-command.c:106
msgid "open /dev/null failed"
msgstr "неуспешно отваряне на „/dev/null“"
-#: run-command.c:94
+#: run-command.c:108
#, c-format
msgid "dup2(%d,%d) failed"
msgstr "неуспешно изпълнение на dup2(%d,%d)"
-#: send-pack.c:295
+#: send-pack.c:297
msgid "failed to sign the push certificate"
msgstr "сертификатът за изтласкване не може да бъде подписан"
-#: send-pack.c:404
+#: send-pack.c:410
msgid "the receiving end does not support --signed push"
msgstr "отсрещната страна не поддържа изтласкване с опцията „--signed“"
-#: send-pack.c:406
+#: send-pack.c:412
msgid ""
"not sending a push certificate since the receiving end does not support --"
"signed push"
@@ -1563,12 +2746,23 @@ msgstr ""
"отсрещната страна не поддържа изтласкване с опцията „--signed“, затова не се "
"използва сертификат"
-#: send-pack.c:418
+#: send-pack.c:424
msgid "the receiving end does not support --atomic push"
msgstr "получаващата страна не поддържа изтласкване с опцията „--atomic“"
-# FIXME git add <path…> for consistence
-#: sequencer.c:174
+#: send-pack.c:429
+msgid "the receiving end does not support push options"
+msgstr "отсрещната страна не поддържа опции при изтласкване"
+
+#: sequencer.c:171
+msgid "revert"
+msgstr "отмяна"
+
+#: sequencer.c:171
+msgid "cherry-pick"
+msgstr "отбиране"
+
+#: sequencer.c:228
msgid ""
"after resolving the conflicts, mark the corrected paths\n"
"with 'git add <paths>' or 'git rm <paths>'"
@@ -1576,7 +2770,7 @@ msgstr ""
"след коригирането на конфликтите, отбележете съответните\n"
"пътища с „git add ПЪТ…“ или „git rm ПЪТ…“."
-#: sequencer.c:177
+#: sequencer.c:231
msgid ""
"after resolving the conflicts, mark the corrected paths\n"
"with 'git add <paths>' or 'git rm <paths>'\n"
@@ -1586,235 +2780,300 @@ msgstr ""
"пътища с „git add ПЪТ…“ или „git rm ПЪТ…“, след което\n"
"подайте резултата с командата „git commit'“."
+#: sequencer.c:244 sequencer.c:1209
+#, c-format
+msgid "could not lock '%s'"
+msgstr "„%s“ не може да се заключи"
+
+#: sequencer.c:247 sequencer.c:1125 sequencer.c:1214
+#, c-format
+msgid "could not write to '%s'"
+msgstr "в „%s“ не може да се пише"
+
# FIXME - must be the same as Could not write to '%s' above
-#: sequencer.c:190 sequencer.c:833 sequencer.c:912
+#: sequencer.c:251
#, c-format
-msgid "Could not write to %s"
-msgstr "„%s“ не може да бъде записан"
+msgid "could not write eol to '%s'"
+msgstr "краят на ред не може да се запише в „%s“"
+
+#: sequencer.c:255 sequencer.c:1130 sequencer.c:1216
+#, c-format
+msgid "failed to finalize '%s'."
+msgstr "„%s“ не може да се завърши."
-#: sequencer.c:193
+#: sequencer.c:279 builtin/am.c:259 builtin/commit.c:749 builtin/merge.c:1032
#, c-format
-msgid "Error wrapping up %s"
-msgstr "Обработката на „%s“ не завърши успешно."
+msgid "could not read '%s'"
+msgstr "файлът „%s“ не може да бъде прочетен"
-#: sequencer.c:208
-msgid "Your local changes would be overwritten by cherry-pick."
-msgstr "Локалните ви промени ще бъдат презаписани при отбирането на подавания."
+#: sequencer.c:305
+#, c-format
+msgid "your local changes would be overwritten by %s."
+msgstr "локалните ви промени ще бъдат презаписани при %s."
-#: sequencer.c:210
-msgid "Your local changes would be overwritten by revert."
-msgstr "Локалните ви промени ще бъдат презаписани при отмяната на подавания."
+#: sequencer.c:309
+msgid "commit your changes or stash them to proceed."
+msgstr "подайте или скатайте промените, за да продължите"
-#: sequencer.c:213
-msgid "Commit your changes or stash them to proceed."
-msgstr "Подайте или скатайте промените, за да продължите"
+#: sequencer.c:324
+#, c-format
+msgid "%s: fast-forward"
+msgstr "%s: тривиално сливане"
#. TRANSLATORS: %s will be "revert" or "cherry-pick"
-#: sequencer.c:300
+#: sequencer.c:399
#, c-format
msgid "%s: Unable to write new index file"
msgstr "%s: новият индекс не може да бъде запазен"
-#: sequencer.c:318
-msgid "Could not resolve HEAD commit\n"
-msgstr "Подаването сочено от указателя „HEAD“ не може да бъде открито\n"
+#: sequencer.c:418
+msgid "could not resolve HEAD commit\n"
+msgstr "подаването сочено от указателя „HEAD“ не може да бъде открито\n"
+
+#: sequencer.c:438
+msgid "unable to update cache tree\n"
+msgstr "дървото на кеша не може да бъде обновено\n"
-#: sequencer.c:338
-msgid "Unable to update cache tree\n"
-msgstr "Дървото на кеша не може да бъде обновено\n"
+#: sequencer.c:483
+#, c-format
+msgid ""
+"you have staged changes in your working tree\n"
+"If these changes are meant to be squashed into the previous commit, run:\n"
+"\n"
+" git commit --amend %s\n"
+"\n"
+"If they are meant to go into a new commit, run:\n"
+"\n"
+" git commit %s\n"
+"\n"
+"In both cases, once you're done, continue with:\n"
+"\n"
+" git rebase --continue\n"
+msgstr ""
+"в това работно дърво има скатани промени.\n"
+"Ако искате да ги слеете с предишното подаване, изпълнете:\n"
+"\n"
+" git commit --amend %s\n"
+"\n"
+"Ако искате да създадете ново подаване, изпълнете:\n"
+"\n"
+" git commit %s\n"
+"\n"
+"И в двата случая продължавате след това с командата:\n"
+"\n"
+" git rebase --continue\n"
-#: sequencer.c:390
+#: sequencer.c:567
#, c-format
-msgid "Could not parse commit %s\n"
-msgstr "Подаването „%s“ не може да бъде анализирано\n"
+msgid "could not parse commit %s\n"
+msgstr "подаването „%s“ не може да бъде анализирано\n"
-#: sequencer.c:395
+#: sequencer.c:572
#, c-format
-msgid "Could not parse parent commit %s\n"
-msgstr "Родителското подаване „%s“ не може да бъде анализирано\n"
+msgid "could not parse parent commit %s\n"
+msgstr "родителското подаване „%s“ не може да бъде анализирано\n"
-#: sequencer.c:460
-msgid "Your index file is unmerged."
-msgstr "Индексът не е слят."
+#: sequencer.c:656
+msgid "your index file is unmerged."
+msgstr "индексът не е слят."
-#: sequencer.c:479
+#: sequencer.c:675
#, c-format
-msgid "Commit %s is a merge but no -m option was given."
-msgstr "Подаването „%s“ е сливане, но не е дадена опцията „-m“"
+msgid "commit %s is a merge but no -m option was given."
+msgstr "подаването „%s“ е сливане, но не е дадена опцията „-m“"
-#: sequencer.c:487
+#: sequencer.c:683
#, c-format
-msgid "Commit %s does not have parent %d"
-msgstr "Подаването „%s“ няма родител %d"
+msgid "commit %s does not have parent %d"
+msgstr "подаването „%s“ няма родител %d"
-#: sequencer.c:491
+#: sequencer.c:687
#, c-format
-msgid "Mainline was specified but commit %s is not a merge."
-msgstr "Указано е базово подаване, но подаването „%s“ не е сливане."
+msgid "mainline was specified but commit %s is not a merge."
+msgstr "указано е базово подаване, но подаването „%s“ не е сливане."
-#. TRANSLATORS: The first %s will be "revert" or
-#. "cherry-pick", the second %s a SHA1
-#: sequencer.c:504
+#. TRANSLATORS: The first %s will be a "todo" command like
+#. "revert" or "pick", the second %s a SHA1.
+#: sequencer.c:700
#, c-format
msgid "%s: cannot parse parent commit %s"
msgstr "%s: неразпозната стойност за родителското подаване „%s“"
-#: sequencer.c:508
+#: sequencer.c:705
#, c-format
-msgid "Cannot get commit message for %s"
-msgstr "Неуспешно извличане на съобщението за подаване на „%s“"
+msgid "cannot get commit message for %s"
+msgstr "неуспешно извличане на съобщението за подаване на „%s“"
-#: sequencer.c:594
+#: sequencer.c:797
#, c-format
msgid "could not revert %s... %s"
msgstr "подаването „%s“… не може да бъде отменено: „%s“"
-#: sequencer.c:595
+#: sequencer.c:798
#, c-format
msgid "could not apply %s... %s"
msgstr "подаването „%s“… не може да бъде приложено: „%s“"
-#: sequencer.c:630
+#: sequencer.c:833
msgid "empty commit set passed"
msgstr "зададено е празно множество от подавания"
-#: sequencer.c:638
+#: sequencer.c:843
#, c-format
msgid "git %s: failed to read the index"
msgstr "git %s: неуспешно изчитане на индекса"
-#: sequencer.c:642
+#: sequencer.c:850
#, c-format
msgid "git %s: failed to refresh the index"
msgstr "git %s: неуспешно обновяване на индекса"
-#: sequencer.c:702
+#: sequencer.c:944
#, c-format
-msgid "Cannot %s during a %s"
-msgstr "По време на „%1$s“ не може да се извърши „%2$s“"
+msgid "invalid line %d: %.*s"
+msgstr "неправилен ред %d: %.*s"
-#: sequencer.c:724
-#, c-format
-msgid "Could not parse line %d."
-msgstr "%d-ят ред не може да се анализира."
-
-#: sequencer.c:729
-msgid "No commits parsed."
-msgstr "Никое от подаванията не може да се разпознае."
+#: sequencer.c:950
+msgid "no commits parsed."
+msgstr "никое от подаванията не може да се разпознае."
-# FIXME Could not open %s. - full stop for consistence with next message
-#: sequencer.c:741
+#: sequencer.c:966
#, c-format
-msgid "Could not open %s"
-msgstr "„%s“ не може да се прочете."
+msgid "could not read '%s'."
+msgstr "от „%s“ не може да се чете."
-#: sequencer.c:745
+#: sequencer.c:972
#, c-format
-msgid "Could not read %s."
-msgstr "„%s“ не може да се отвори."
+msgid "unusable instruction sheet: '%s'"
+msgstr "неизползваем файл с описание на предстоящите действия: „%s“"
-#: sequencer.c:752
-#, c-format
-msgid "Unusable instruction sheet: %s"
-msgstr "Файлът с описание на предстоящите действия — „%s“ не може да се ползва"
+#: sequencer.c:983
+msgid "cannot cherry-pick during a revert."
+msgstr ""
+"по време на отмяна на подаване не може да се извърши отбиране на подаване."
+
+#: sequencer.c:985
+msgid "cannot revert during a cherry-pick."
+msgstr "по време на отбиране не може да се извърши отмяна на подаване."
-#: sequencer.c:782
+#: sequencer.c:1028
#, c-format
-msgid "Invalid key: %s"
-msgstr "Неправилен ключ: „%s“"
+msgid "invalid key: %s"
+msgstr "неправилен ключ: „%s“"
-#: sequencer.c:785 builtin/pull.c:50 builtin/pull.c:52
+#: sequencer.c:1031
#, c-format
-msgid "Invalid value for %s: %s"
-msgstr "Неправилна стойност за „%s“: „%s“"
+msgid "invalid value for %s: %s"
+msgstr "неправилна стойност за „%s“: „%s“"
-#: sequencer.c:795
+#: sequencer.c:1063
#, c-format
-msgid "Malformed options sheet: %s"
-msgstr "Неправилно съдържание на файла с опции: „%s“"
+msgid "malformed options sheet: '%s'"
+msgstr "неправилен файл с опции: „%s“"
-#: sequencer.c:814
+#: sequencer.c:1101
msgid "a cherry-pick or revert is already in progress"
msgstr ""
"в момента вече се извършва отбиране на подавания или пребазиране на клона"
-#: sequencer.c:815
+#: sequencer.c:1102
msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
msgstr "използвайте „git cherry-pick (--continue | --quit | --abort)“"
-#: sequencer.c:819
+#: sequencer.c:1106
#, c-format
-msgid "Could not create sequencer directory %s"
-msgstr "Директорията за секвенсора „%s“ не може да бъде създадена"
+msgid "could not create sequencer directory '%s'"
+msgstr "директорията за секвенсора „%s“ не може да бъде създадена"
-#: sequencer.c:835 sequencer.c:916
-#, c-format
-msgid "Error wrapping up %s."
-msgstr "Обработката на „%s“ не завърши успешно."
+#: sequencer.c:1120
+msgid "could not lock HEAD"
+msgstr "указателят „HEAD“ не може да се заключи"
-#: sequencer.c:854 sequencer.c:986
+#: sequencer.c:1151 sequencer.c:1289
msgid "no cherry-pick or revert in progress"
msgstr ""
"в момента не се извършва отбиране на подавания или пребазиране на клона"
-#: sequencer.c:856
+#: sequencer.c:1153
msgid "cannot resolve HEAD"
msgstr "Подаването сочено от указателя „HEAD“ не може да бъде открито"
-#: sequencer.c:858
+#: sequencer.c:1155 sequencer.c:1189
msgid "cannot abort from a branch yet to be born"
msgstr ""
"действието не може да бъде преустановено, когато сте на клон, който тепърва "
"предстои да бъде създаден"
-#: sequencer.c:878 builtin/fetch.c:610 builtin/fetch.c:851
+#: sequencer.c:1175 builtin/grep.c:578
#, c-format
-msgid "cannot open %s"
+msgid "cannot open '%s'"
msgstr "„%s“ не може да бъде отворен"
-#: sequencer.c:880
+#: sequencer.c:1177
#, c-format
-msgid "cannot read %s: %s"
-msgstr "файлът „%s“ не може да бъде прочетен: %s"
+msgid "cannot read '%s': %s"
+msgstr "„%s“ не може да бъде прочетен: %s"
-#: sequencer.c:881
+#: sequencer.c:1178
msgid "unexpected end of file"
msgstr "неочакван край на файл"
-#: sequencer.c:887
+#: sequencer.c:1184
#, c-format
msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
msgstr ""
"запазеният преди започването на отбирането файл за указателя „HEAD“ — „%s“ е "
"повреден"
-#: sequencer.c:909
-#, c-format
-msgid "Could not format %s."
-msgstr "Файлът „%s“ не може да се форматира по подходящия начин."
-
-#: sequencer.c:1054
+#: sequencer.c:1354
#, c-format
msgid "%s: can't cherry-pick a %s"
msgstr "%s: не може да се отбере „%s“"
-#: sequencer.c:1057
+#: sequencer.c:1358
#, c-format
msgid "%s: bad revision"
msgstr "%s: неправилна версия"
-#: sequencer.c:1091
-msgid "Can't revert as initial commit"
-msgstr "Първоначалното подаване не може да бъде отменено"
+#: sequencer.c:1391
+msgid "can't revert as initial commit"
+msgstr "първоначалното подаване не може да бъде отменено"
-#: sequencer.c:1092
-msgid "Can't cherry-pick into empty head"
-msgstr "При празен връх не могат да се отбират подавания"
+#: setup.c:160
+#, c-format
+msgid ""
+"%s: no such path in the working tree.\n"
+"Use 'git <command> -- <path>...' to specify paths that do not exist locally."
+msgstr ""
+"%s: в това работно дърво няма такъв път.\n"
+"За да указвате пътища, които локално не съществуват, използвайте:\n"
+"\n"
+" git КОМАНДА -- ПЪТ…"
-#: setup.c:248
+#: setup.c:173
#, c-format
-msgid "failed to read %s"
-msgstr "файлът „%s“ не може да бъде прочетен"
+msgid ""
+"ambiguous argument '%s': unknown revision or path not in the working tree.\n"
+"Use '--' to separate paths from revisions, like this:\n"
+"'git <command> [<revision>...] -- [<file>...]'"
+msgstr ""
+"нееднозначен аргумент „%s: непозната версия или пътят не е част от работното "
+"дърво.\n"
+"Разделяйте пътищата от версиите с „--“, ето така:\n"
+"\n"
+" git КОМАНДА [ВЕРСИЯ…] -- [ФАЙЛ…]"
+
+#: setup.c:223
+#, c-format
+msgid ""
+"ambiguous argument '%s': both revision and filename\n"
+"Use '--' to separate paths from revisions, like this:\n"
+"'git <command> [<revision>...] -- [<file>...]'"
+msgstr ""
+"нееднозначен аргумент „%s: както версия, така и път.\n"
+"Разделяйте пътищата от версиите с „--“, ето така:\n"
+"\n"
+" git КОМАНДА [ВЕРСИЯ…] -- [ФАЙЛ…]"
#: setup.c:468
#, c-format
@@ -1825,26 +3084,101 @@ msgstr "Очаква се версия на хранилището на git <= %
msgid "unknown repository extensions found:"
msgstr "открити са непознати разширения в хранилището:"
-#: sha1_file.c:1080
+#: setup.c:762
+#, c-format
+msgid "Not a git repository (or any of the parent directories): %s"
+msgstr ""
+"Нито тази, нито която и да е от по-горните директории, не е хранилище на "
+"git: %s"
+
+#: setup.c:764 setup.c:915 builtin/index-pack.c:1641
+msgid "Cannot come back to cwd"
+msgstr "Процесът не може да се върне към предишната работна директория"
+
+#: setup.c:845
+msgid "Unable to read current working directory"
+msgstr "Текущата работна директория не може да бъде прочетена"
+
+#: setup.c:920
+#, c-format
+msgid ""
+"Not a git repository (or any parent up to mount point %s)\n"
+"Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set)."
+msgstr ""
+"Нито тази, нито която и да е от по-горните директории (до точката на "
+"монтиране „%s“), не е хранилище на git.\n"
+"Git работи в рамките на една файлова система, защото променливата на средата "
+"„GIT_DISCOVERY_ACROSS_FILESYSTEM“ не е зададена."
+
+#: setup.c:927
+#, c-format
+msgid "Cannot change to '%s/..'"
+msgstr "Не може да се влезе в директорията „%s“"
+
+#: setup.c:989
+#, c-format
+msgid ""
+"Problem with core.sharedRepository filemode value (0%.3o).\n"
+"The owner of files must always have read and write permissions."
+msgstr ""
+"Зададеният в „core.sharedRepository“ режим за достъп до файлове е неправилен "
+"(0%.3o).\n"
+"Собственикът на файла трябва да има права за писане и четене."
+
+#: sha1_file.c:473
+#, c-format
+msgid "path '%s' does not exist"
+msgstr "пътят „%s“ не съществува."
+
+#: sha1_file.c:499
+#, c-format
+msgid "reference repository '%s' as a linked checkout is not supported yet."
+msgstr "все още не се поддържа еталонно хранилище „%s“ като свързано."
+
+#: sha1_file.c:505
+#, c-format
+msgid "reference repository '%s' is not a local repository."
+msgstr "еталонното хранилище „%s“ не е локално"
+
+#: sha1_file.c:511
+#, c-format
+msgid "reference repository '%s' is shallow"
+msgstr "еталонното хранилище „%s“ е плитко"
+
+#: sha1_file.c:519
+#, c-format
+msgid "reference repository '%s' is grafted"
+msgstr "еталонното хранилище „%s“ е с присаждане"
+
+#: sha1_file.c:1159
msgid "offset before end of packfile (broken .idx?)"
msgstr ""
"отместване преди края на пакетния файл (възможно е индексът да е повреден)"
-#: sha1_file.c:2458
+#: sha1_file.c:2592
#, c-format
msgid "offset before start of pack index for %s (corrupt index?)"
msgstr ""
"отместване преди началото на индекса на пакетния файл „%s“ (възможно е "
"индексът да е повреден)"
-#: sha1_file.c:2462
+#: sha1_file.c:2596
#, c-format
msgid "offset beyond end of pack index for %s (truncated index?)"
msgstr ""
"отместване преди края на индекса на пакетния файл „%s“ (възможно е индексът "
"да е отрязан)"
-#: sha1_name.c:462
+#: sha1_name.c:407
+#, c-format
+msgid "short SHA1 %s is ambiguous"
+msgstr "късият SHA1 „%s“ не е еднозначен"
+
+#: sha1_name.c:418
+msgid "The candidates are:"
+msgstr "Възможностите са:"
+
+#: sha1_name.c:578
msgid ""
"Git normally never creates a ref that ends with 40 hex characters\n"
"because it will be ignored when you just specify 40-hex. These refs\n"
@@ -1858,12 +3192,12 @@ msgid ""
msgstr ""
"При нормална работа Git никога не създава указатели, които завършват с 40\n"
"шестнадесетични знака, защото стандартно те ще бъдат прескачани.\n"
-"Възможно е такива указатели да са създадени случайно. Например:\n"
+"Възможно е такива указатели да са създадени случайно. Например:\n"
"\n"
" git checkout -b $BRANCH $(git rev-parse…)\n"
"\n"
"където стойността на променливата на средата BRANCH е празна, при което се\n"
-"създава подобен указател. Прегледайте тези указатели и ги изтрийте. Можете "
+"създава подобен указател. Прегледайте тези указатели и ги изтрийте. Можете "
"да\n"
"спрете това съобщение като изпълните командата:\n"
"„git config advice.objectNameWarning false“"
@@ -1871,7 +3205,7 @@ msgstr ""
#: submodule.c:64 submodule.c:98
msgid "Cannot change unmerged .gitmodules, resolve merge conflicts first"
msgstr ""
-"Неслетите файлове „.gitmodules“ не могат да бъдат променяни. Първо "
+"Неслетите файлове „.gitmodules“ не могат да бъдат променяни. Първо "
"коригирайте конфликтите"
#: submodule.c:68 submodule.c:102
@@ -1893,79 +3227,143 @@ msgstr "Записът „%s“ във файла „.gitmodules“ не мож
msgid "staging updated .gitmodules failed"
msgstr "неуспешно добавяне на променения файл „.gitmodules“ в индекса"
-#: submodule.c:177
+#: submodule.c:158
msgid "negative values not allowed for submodule.fetchJobs"
msgstr "Настройката „submodule.fetchJobs“ не приема отрицателни стойности"
-#: submodule-config.c:355
+#: submodule-config.c:358
#, c-format
msgid "invalid value for %s"
msgstr "Неправилна стойност за „%s“"
-#: trailer.c:237
+#: trailer.c:238
#, c-format
msgid "running trailer command '%s' failed"
msgstr "неуспешно изпълнение на завършващата команда „%s“"
-#: trailer.c:492 trailer.c:496 trailer.c:500 trailer.c:554 trailer.c:558
-#: trailer.c:562
+#: trailer.c:471 trailer.c:475 trailer.c:479 trailer.c:533 trailer.c:537
+#: trailer.c:541
#, c-format
msgid "unknown value '%s' for key '%s'"
msgstr "неправилна стойност „%s“ за настройката „%s“"
-#: trailer.c:544 trailer.c:549 builtin/remote.c:289
+#: trailer.c:523 trailer.c:528 builtin/remote.c:289
#, c-format
msgid "more than one %s"
msgstr "стойността „%s“ се повтаря в настройките"
-#: trailer.c:582
+#: trailer.c:672
#, c-format
msgid "empty trailer token in trailer '%.*s'"
msgstr "празна завършваща лексема в епилога „%.*s“"
-#: trailer.c:702
+#: trailer.c:695
#, c-format
msgid "could not read input file '%s'"
msgstr "входният файл „%s“ не може да бъде прочетен"
-#: trailer.c:705
+#: trailer.c:698
msgid "could not read from stdin"
msgstr "от стандартния вход не може да се чете"
-#: trailer.c:857 builtin/am.c:42
+#: trailer.c:929 builtin/am.c:44
#, c-format
msgid "could not stat %s"
msgstr "Не може да се получи информация чрез „stat“ за „%s“"
-#: trailer.c:859
+#: trailer.c:931
#, c-format
msgid "file %s is not a regular file"
msgstr "„%s“ не е обикновен файл"
-#: trailer.c:861
+#: trailer.c:933
#, c-format
msgid "file %s is not writable by user"
msgstr "„%s“: няма права за записване на файла"
-#: trailer.c:873
+#: trailer.c:945
msgid "could not open temporary file"
msgstr "временният файл не може да се отвори"
-#: trailer.c:912
+#: trailer.c:983
#, c-format
msgid "could not rename temporary file to %s"
msgstr "временният файл не може да се преименува на „%s“"
-#: transport-helper.c:1041
+#: transport.c:62
+#, c-format
+msgid "Would set upstream of '%s' to '%s' of '%s'\n"
+msgstr "Клонът „%s“ ще следи „%s“ от „%s“\n"
+
+#: transport.c:151
+#, c-format
+msgid "transport: invalid depth option '%s'"
+msgstr "transport: неправилна опция за дълбочина: %s"
+
+#: transport.c:817
+#, c-format
+msgid ""
+"The following submodule paths contain changes that can\n"
+"not be found on any remote:\n"
+msgstr ""
+"Следните пътища за подмодули съдържат промени,\n"
+"които липсват от всички отдалечени хранилища:\n"
+
+#: transport.c:821
+#, c-format
+msgid ""
+"\n"
+"Please try\n"
+"\n"
+"\tgit push --recurse-submodules=on-demand\n"
+"\n"
+"or cd to the path and use\n"
+"\n"
+"\tgit push\n"
+"\n"
+"to push them to a remote.\n"
+"\n"
+msgstr ""
+"\n"
+"Пробвайте да ги изтласкате чрез командата:\n"
+"\n"
+" git push --recurse-submodules=on-demand\n"
+"\n"
+"или отидете в съответната директория и изпълнете:\n"
+"\n"
+" git push\n"
+"\n"
+
+#: transport.c:829
+msgid "Aborting."
+msgstr "Преустановяване на действието."
+
+#: transport-helper.c:1075
#, c-format
msgid "Could not read ref %s"
msgstr "Указателят „%s“ не може да се прочете."
+#: tree-walk.c:31
+msgid "too-short tree object"
+msgstr "прекалено кратък обект-дърво"
+
+#: tree-walk.c:37
+msgid "malformed mode in tree entry"
+msgstr "неправилни права за достъп в запис в дърво"
+
+#: tree-walk.c:41
+msgid "empty filename in tree entry"
+msgstr "празно име на файл в запис в дърво"
+
+#: tree-walk.c:113
+msgid "too-short tree file"
+msgstr "прекалено кратък файл-дърво"
+
#: unpack-trees.c:64
#, c-format
msgid ""
"Your local changes to the following files would be overwritten by checkout:\n"
-"%%sPlease commit your changes or stash them before you can switch branches."
+"%%sPlease commit your changes or stash them before you switch branches."
msgstr ""
"Изтеглянето ще презапише локалните промени на тези файлове:\n"
"%%sПодайте или скатайте промените, за да преминете към нов клон."
@@ -1983,7 +3381,7 @@ msgstr ""
#, c-format
msgid ""
"Your local changes to the following files would be overwritten by merge:\n"
-"%%sPlease commit your changes or stash them before you can merge."
+"%%sPlease commit your changes or stash them before you merge."
msgstr ""
"Сливането ще презапише локалните промени на тези файлове:\n"
"%%sПодайте или скатайте промените, за да слеете."
@@ -2001,7 +3399,7 @@ msgstr ""
#, c-format
msgid ""
"Your local changes to the following files would be overwritten by %s:\n"
-"%%sPlease commit your changes or stash them before you can %s."
+"%%sPlease commit your changes or stash them before you %s."
msgstr ""
"„%s“ ще презапише локалните промени на тези файлове:\n"
"%%sПодайте или скатайте промените, за да извършите „%s“."
@@ -2028,7 +3426,7 @@ msgstr ""
#, c-format
msgid ""
"The following untracked working tree files would be removed by checkout:\n"
-"%%sPlease move or remove them before you can switch branches."
+"%%sPlease move or remove them before you switch branches."
msgstr ""
"Изтеглянето ще изтрие тези неследени файлове в работното дърво:\n"
"%%sПреместете ги или ги изтрийте, за да преминете на друг клон."
@@ -2046,7 +3444,7 @@ msgstr ""
#, c-format
msgid ""
"The following untracked working tree files would be removed by merge:\n"
-"%%sPlease move or remove them before you can merge."
+"%%sPlease move or remove them before you merge."
msgstr ""
"Сливането ще изтрие тези неследени файлове в работното дърво:\n"
"%%sПреместете ги или ги изтрийте, за да слеете."
@@ -2064,7 +3462,7 @@ msgstr ""
#, c-format
msgid ""
"The following untracked working tree files would be removed by %s:\n"
-"%%sPlease move or remove them before you can %s."
+"%%sPlease move or remove them before you %s."
msgstr ""
"„%s“ ще изтрие тези неследени файлове в работното дърво:\n"
"%%sПреместете ги или ги изтрийте, за да извършите „%s“."
@@ -2083,7 +3481,7 @@ msgstr ""
msgid ""
"The following untracked working tree files would be overwritten by "
"checkout:\n"
-"%%sPlease move or remove them before you can switch branches."
+"%%sPlease move or remove them before you switch branches."
msgstr ""
"Изтеглянето ще презапише тези неследени файлове в работното дърво:\n"
"%%sПреместете ги или ги изтрийте, за да смените клон."
@@ -2102,7 +3500,7 @@ msgstr ""
#, c-format
msgid ""
"The following untracked working tree files would be overwritten by merge:\n"
-"%%sPlease move or remove them before you can merge."
+"%%sPlease move or remove them before you merge."
msgstr ""
"Сливането ще презапише тези неследени файлове в работното дърво:\n"
"%%sПреместете ги или ги изтрийте, за да слеете."
@@ -2120,7 +3518,7 @@ msgstr ""
#, c-format
msgid ""
"The following untracked working tree files would be overwritten by %s:\n"
-"%%sPlease move or remove them before you can %s."
+"%%sPlease move or remove them before you %s."
msgstr ""
"„%s“ ще презапише тези неследени файлове в работното дърво:\n"
"%%sПреместете ги или ги изтрийте, за да извършите „%s“."
@@ -2137,7 +3535,7 @@ msgstr ""
#: unpack-trees.c:121
#, c-format
msgid "Entry '%s' overlaps with '%s'. Cannot bind."
-msgstr "Записът за „%s“ съвпада с този за „%s“. Не може да се присвои."
+msgstr "Записът за „%s“ съвпада с този за „%s“. Не може да се присвои."
#: unpack-trees.c:124
#, c-format
@@ -2152,7 +3550,7 @@ msgstr ""
#: unpack-trees.c:126
#, c-format
msgid ""
-"The following Working tree files would be overwritten by sparse checkout "
+"The following working tree files would be overwritten by sparse checkout "
"update:\n"
"%s"
msgstr ""
@@ -2163,7 +3561,7 @@ msgstr ""
#: unpack-trees.c:128
#, c-format
msgid ""
-"The following Working tree files would be removed by sparse checkout "
+"The following working tree files would be removed by sparse checkout "
"update:\n"
"%s"
msgstr ""
@@ -2209,206 +3607,196 @@ msgstr "неправилен номер на порт"
msgid "invalid '..' path segment"
msgstr "неправилна част от пътя „..“"
-#: wrapper.c:222 wrapper.c:381
+#: worktree.c:282
+#, c-format
+msgid "failed to read '%s'"
+msgstr "„%s“ не може да бъде прочетен"
+
+#: wrapper.c:222 wrapper.c:392
#, c-format
msgid "could not open '%s' for reading and writing"
msgstr "„%s“ не може да бъде отворен и за четене, и за запис"
-#: wrapper.c:224 wrapper.c:383 builtin/am.c:779
+#: wrapper.c:224 wrapper.c:394 builtin/am.c:766
#, c-format
msgid "could not open '%s' for writing"
msgstr "„%s“ не може да бъде отворен за запис"
-#: wrapper.c:226 wrapper.c:385 builtin/am.c:323 builtin/am.c:772
-#: builtin/am.c:860 builtin/commit.c:1711 builtin/merge.c:1086
-#: builtin/pull.c:407
+#: wrapper.c:226 wrapper.c:396 builtin/am.c:320 builtin/am.c:759
+#: builtin/am.c:847 builtin/commit.c:1705 builtin/merge.c:1029
+#: builtin/pull.c:341
#, c-format
msgid "could not open '%s' for reading"
msgstr "файлът не може да бъде прочетен: „%s“"
-#: wrapper.c:594 wrapper.c:615
+#: wrapper.c:605 wrapper.c:626
#, c-format
msgid "unable to access '%s'"
msgstr "няма достъп до „%s“"
-#: wrapper.c:623
+#: wrapper.c:634
msgid "unable to get current working directory"
msgstr "текущата работна директория е недостъпна"
-#: wrapper.c:650
-#, c-format
-msgid "could not open %s for writing"
-msgstr "„%s“ не може да бъде отворен за запис"
-
# FIXME - must be the same as Could not write to '%s' above
-#: wrapper.c:661 builtin/am.c:410
+#: wrapper.c:658
#, c-format
msgid "could not write to %s"
msgstr "„%s“ не може да бъде записан"
-#: wrapper.c:667
+#: wrapper.c:660
#, c-format
msgid "could not close %s"
msgstr "„%s“ не може да се затвори"
-#: wt-status.c:150
+#: wt-status.c:151
msgid "Unmerged paths:"
msgstr "Неслети пътища:"
-#: wt-status.c:177 wt-status.c:204
+#: wt-status.c:178 wt-status.c:205
#, c-format
msgid " (use \"git reset %s <file>...\" to unstage)"
msgstr " (използвайте „git reset %s ФАЙЛ…“, за да извадите ФАЙЛа от индекса)"
-#: wt-status.c:179 wt-status.c:206
+#: wt-status.c:180 wt-status.c:207
msgid " (use \"git rm --cached <file>...\" to unstage)"
msgstr ""
" (използвайте „git rm --cached %s ФАЙЛ…“, за да извадите ФАЙЛа от индекса)"
-#: wt-status.c:183
+#: wt-status.c:184
msgid " (use \"git add <file>...\" to mark resolution)"
msgstr ""
" (използвайте „git add ФАЙЛ…“, за да укажете разрешаването на конфликта)"
-#: wt-status.c:185 wt-status.c:189
+#: wt-status.c:186 wt-status.c:190
msgid " (use \"git add/rm <file>...\" as appropriate to mark resolution)"
msgstr ""
" (използвайте „git add/rm ФАЙЛ…“, според решението, което избирате за "
"конфликта)"
-#: wt-status.c:187
+#: wt-status.c:188
msgid " (use \"git rm <file>...\" to mark resolution)"
msgstr ""
" (използвайте „git rm ФАЙЛ…“, за да укажете разрешаването на конфликта)"
-#: wt-status.c:198 wt-status.c:881
+#: wt-status.c:199 wt-status.c:945
msgid "Changes to be committed:"
msgstr "Промени, които ще бъдат подадени:"
-#: wt-status.c:216 wt-status.c:890
+#: wt-status.c:217 wt-status.c:954
msgid "Changes not staged for commit:"
msgstr "Промени, които не са в индекса за подаване:"
-#: wt-status.c:220
+#: wt-status.c:221
msgid " (use \"git add <file>...\" to update what will be committed)"
msgstr ""
" (използвайте „git add ФАЙЛ…“, за да обновите съдържанието за подаване)"
-#: wt-status.c:222
+#: wt-status.c:223
msgid " (use \"git add/rm <file>...\" to update what will be committed)"
msgstr ""
" (използвайте „git add/rm ФАЙЛ…“, за да обновите съдържанието за подаване)"
-#: wt-status.c:223
+#: wt-status.c:224
msgid ""
" (use \"git checkout -- <file>...\" to discard changes in working directory)"
msgstr ""
" (използвайте „git checkout -- ФАЙЛ…“, за да отхвърлите промените в "
"работното дърво)"
-#: wt-status.c:225
+#: wt-status.c:226
msgid " (commit or discard the untracked or modified content in submodules)"
msgstr ""
" (подайте или отхвърлете неследеното или промененото съдържание в "
"подмодулите)"
-#: wt-status.c:237
+#: wt-status.c:238
#, c-format
msgid " (use \"git %s <file>...\" to include in what will be committed)"
msgstr ""
" (използвайте „git %s ФАЙЛ…“, за да определите какво включвате в подаването)"
-#: wt-status.c:252
+#: wt-status.c:253
msgid "both deleted:"
msgstr "изтрити в двата случая:"
-#: wt-status.c:254
+#: wt-status.c:255
msgid "added by us:"
msgstr "добавени от вас:"
-#: wt-status.c:256
+#: wt-status.c:257
msgid "deleted by them:"
msgstr "изтрити от тях:"
-#: wt-status.c:258
+#: wt-status.c:259
msgid "added by them:"
msgstr "добавени от тях:"
-#: wt-status.c:260
+#: wt-status.c:261
msgid "deleted by us:"
msgstr "изтрити от вас:"
-#: wt-status.c:262
+#: wt-status.c:263
msgid "both added:"
msgstr "добавени и в двата случая:"
-#: wt-status.c:264
+#: wt-status.c:265
msgid "both modified:"
msgstr "променени и в двата случая:"
-#: wt-status.c:266
-#, c-format
-msgid "bug: unhandled unmerged status %x"
-msgstr "грешка: състоянието на промяната „%x“ не може да бъде обработено"
-
-#: wt-status.c:274
+#: wt-status.c:275
msgid "new file:"
msgstr "нов файл:"
-#: wt-status.c:276
+#: wt-status.c:277
msgid "copied:"
msgstr "копиран:"
-#: wt-status.c:278
+#: wt-status.c:279
msgid "deleted:"
msgstr "изтрит:"
-#: wt-status.c:280
+#: wt-status.c:281
msgid "modified:"
msgstr "променен:"
-#: wt-status.c:282
+#: wt-status.c:283
msgid "renamed:"
msgstr "преименуван:"
-#: wt-status.c:284
+#: wt-status.c:285
msgid "typechange:"
msgstr "смяна на вида:"
-#: wt-status.c:286
+#: wt-status.c:287
msgid "unknown:"
msgstr "непозната промяна:"
-#: wt-status.c:288
+#: wt-status.c:289
msgid "unmerged:"
msgstr "неслят:"
-#: wt-status.c:370
+#: wt-status.c:371
msgid "new commits, "
msgstr "нови подавания, "
-#: wt-status.c:372
+#: wt-status.c:373
msgid "modified content, "
msgstr "променено съдържание, "
-#: wt-status.c:374
+#: wt-status.c:375
msgid "untracked content, "
msgstr "неследено съдържание, "
-#: wt-status.c:391
-#, c-format
-msgid "bug: unhandled diff status %c"
-msgstr "грешка: състоянието на промяната „%c“ не може да бъде обработено"
-
-#: wt-status.c:755
+#: wt-status.c:818
msgid "Submodules changed but not updated:"
msgstr "Подмодулите са променени, но не са обновени:"
-#: wt-status.c:757
+#: wt-status.c:820
msgid "Submodule changes to be committed:"
msgstr "Промени в подмодулите за подаване:"
-#: wt-status.c:838
+#: wt-status.c:901
msgid ""
"Do not touch the line above.\n"
"Everything below will be removed."
@@ -2416,229 +3804,233 @@ msgstr ""
"Не променяйте горния ред.\n"
"Всичко отдолу ще бъде изтрито."
-#: wt-status.c:949
+#: wt-status.c:1013
msgid "You have unmerged paths."
msgstr "Някои пътища не са слети."
-#: wt-status.c:952
+#: wt-status.c:1016
msgid " (fix conflicts and run \"git commit\")"
msgstr " (коригирайте конфликтите и изпълнете „git commit“)"
-#: wt-status.c:956
+#: wt-status.c:1018
+msgid " (use \"git merge --abort\" to abort the merge)"
+msgstr " (използвайте „git merge --abort“, за да преустановите сливането)"
+
+#: wt-status.c:1023
msgid "All conflicts fixed but you are still merging."
msgstr "Всички конфликти са решени, но продължавате сливането."
-#: wt-status.c:959
+#: wt-status.c:1026
msgid " (use \"git commit\" to conclude merge)"
msgstr " (използвайте „git commit“, за да завършите сливането)"
-#: wt-status.c:969
+#: wt-status.c:1036
msgid "You are in the middle of an am session."
msgstr "В момента прилагате поредица от кръпки чрез „git am“."
-#: wt-status.c:972
+#: wt-status.c:1039
msgid "The current patch is empty."
msgstr "Текущата кръпка е празна."
-#: wt-status.c:976
+#: wt-status.c:1043
msgid " (fix conflicts and then run \"git am --continue\")"
msgstr " (коригирайте конфликтите и изпълнете „git am --continue“)"
-#: wt-status.c:978
+#: wt-status.c:1045
msgid " (use \"git am --skip\" to skip this patch)"
msgstr " (използвайте „git am --skip“, за да пропуснете тази кръпка)"
-#: wt-status.c:980
+#: wt-status.c:1047
msgid " (use \"git am --abort\" to restore the original branch)"
msgstr ""
" (използвайте „git am --abort“, за да възстановите първоначалния клон)"
-#: wt-status.c:1105
+#: wt-status.c:1172
msgid "No commands done."
msgstr "Не са изпълнени команди."
-#: wt-status.c:1108
+#: wt-status.c:1175
#, c-format
msgid "Last command done (%d command done):"
msgid_plural "Last commands done (%d commands done):"
msgstr[0] "Последна изпълнена команда (изпълнена е общо %d команда):"
msgstr[1] "Последна изпълнена команда (изпълнени са общо %d команди):"
-#: wt-status.c:1119
+#: wt-status.c:1186
#, c-format
msgid " (see more in file %s)"
msgstr " повече информация има във файла „%s“)"
-#: wt-status.c:1124
+#: wt-status.c:1191
msgid "No commands remaining."
msgstr "Не остават повече команди."
-#: wt-status.c:1127
+#: wt-status.c:1194
#, c-format
msgid "Next command to do (%d remaining command):"
msgid_plural "Next commands to do (%d remaining commands):"
msgstr[0] "Следваща команда за изпълнение (остава още %d команда):"
msgstr[1] "Следваща команда за изпълнение (остават още %d команди):"
-#: wt-status.c:1135
+#: wt-status.c:1202
msgid " (use \"git rebase --edit-todo\" to view and edit)"
msgstr ""
" (използвайте „git rebase --edit-todo“, за да разгледате и редактирате)"
-#: wt-status.c:1148
+#: wt-status.c:1215
#, c-format
msgid "You are currently rebasing branch '%s' on '%s'."
msgstr "В момента пребазирате клона „%s“ върху „%s“."
-#: wt-status.c:1153
+#: wt-status.c:1220
msgid "You are currently rebasing."
msgstr "В момента пребазирате."
-#: wt-status.c:1167
+#: wt-status.c:1234
msgid " (fix conflicts and then run \"git rebase --continue\")"
msgstr " (коригирайте конфликтите и използвайте „git rebase --continue“)"
-#: wt-status.c:1169
+#: wt-status.c:1236
msgid " (use \"git rebase --skip\" to skip this patch)"
msgstr " (използвайте „git rebase --skip“, за да пропуснете тази кръпка)"
-#: wt-status.c:1171
+#: wt-status.c:1238
msgid " (use \"git rebase --abort\" to check out the original branch)"
msgstr ""
" (използвайте „git rebase --abort“, за да възстановите първоначалния клон)"
-#: wt-status.c:1177
+#: wt-status.c:1244
msgid " (all conflicts fixed: run \"git rebase --continue\")"
msgstr " (всички конфликти са коригирани: изпълнете „git rebase --continue“)"
-#: wt-status.c:1181
+#: wt-status.c:1248
#, c-format
msgid ""
"You are currently splitting a commit while rebasing branch '%s' on '%s'."
msgstr "В момента разделяте подаване докато пребазирате клона „%s“ върху „%s“."
-#: wt-status.c:1186
+#: wt-status.c:1253
msgid "You are currently splitting a commit during a rebase."
msgstr "В момента разделяте подаване докато пребазирате."
-#: wt-status.c:1189
+#: wt-status.c:1256
msgid " (Once your working directory is clean, run \"git rebase --continue\")"
msgstr ""
" (След като работното ви дърво стане чисто, използвайте „git rebase --"
"continue“)"
-#: wt-status.c:1193
+#: wt-status.c:1260
#, c-format
msgid "You are currently editing a commit while rebasing branch '%s' on '%s'."
msgstr ""
"В момента редактирате подаване докато пребазирате клона „%s“ върху „%s“."
-#: wt-status.c:1198
+#: wt-status.c:1265
msgid "You are currently editing a commit during a rebase."
msgstr "В момента редактирате подаване докато пребазирате."
-#: wt-status.c:1201
+#: wt-status.c:1268
msgid " (use \"git commit --amend\" to amend the current commit)"
msgstr ""
" (използвайте „git commit --amend“, за да редактирате текущото подаване)"
-#: wt-status.c:1203
+#: wt-status.c:1270
msgid ""
" (use \"git rebase --continue\" once you are satisfied with your changes)"
msgstr ""
" (използвайте „git rebase --continue“, след като завършите промените си)"
-#: wt-status.c:1213
+#: wt-status.c:1280
#, c-format
msgid "You are currently cherry-picking commit %s."
msgstr "В момента отбирате подаването „%s“."
-#: wt-status.c:1218
+#: wt-status.c:1285
msgid " (fix conflicts and run \"git cherry-pick --continue\")"
msgstr " (коригирайте конфликтите и изпълнете „git cherry-pick --continue“)"
-#: wt-status.c:1221
+#: wt-status.c:1288
msgid " (all conflicts fixed: run \"git cherry-pick --continue\")"
msgstr ""
" (всички конфликти са коригирани, изпълнете „git cherry-pick --continue“)"
-#: wt-status.c:1223
+#: wt-status.c:1290
msgid " (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)"
msgstr ""
" (използвайте „git cherry-pick --abort“, за да отмените всички действия с "
"отбиране)"
-#: wt-status.c:1232
+#: wt-status.c:1299
#, c-format
msgid "You are currently reverting commit %s."
msgstr "В момента отменяте подаване „%s“."
-#: wt-status.c:1237
+#: wt-status.c:1304
msgid " (fix conflicts and run \"git revert --continue\")"
msgstr " (коригирайте конфликтите и изпълнете „git revert --continue“)"
-#: wt-status.c:1240
+#: wt-status.c:1307
msgid " (all conflicts fixed: run \"git revert --continue\")"
msgstr " (всички конфликти са коригирани, изпълнете „git revert --continue“)"
-#: wt-status.c:1242
+#: wt-status.c:1309
msgid " (use \"git revert --abort\" to cancel the revert operation)"
msgstr ""
" (използвайте „git revert --abort“, за да преустановите отмяната на "
"подаване)"
-#: wt-status.c:1253
+#: wt-status.c:1320
#, c-format
msgid "You are currently bisecting, started from branch '%s'."
msgstr "В момента търсите двоично, като сте стартирали от клон „%s“."
-#: wt-status.c:1257
+#: wt-status.c:1324
msgid "You are currently bisecting."
msgstr "В момента търсите двоично."
-#: wt-status.c:1260
+#: wt-status.c:1327
msgid " (use \"git bisect reset\" to get back to the original branch)"
msgstr ""
" (използвайте „git bisect reset“, за да се върнете към първоначалното "
"състояние и клон)"
-#: wt-status.c:1460
+#: wt-status.c:1524
msgid "On branch "
msgstr "На клон "
-#: wt-status.c:1466
+#: wt-status.c:1530
msgid "interactive rebase in progress; onto "
msgstr "извършвате интерактивно пребазиране върху "
-#: wt-status.c:1468
+#: wt-status.c:1532
msgid "rebase in progress; onto "
msgstr "извършвате пребазиране върху "
-#: wt-status.c:1473
+#: wt-status.c:1537
msgid "HEAD detached at "
msgstr "Указателят „HEAD“ не е свързан и е при "
-#: wt-status.c:1475
+#: wt-status.c:1539
msgid "HEAD detached from "
msgstr "Указателят „HEAD“ не е свързан и е отделѐн от "
-#: wt-status.c:1478
+#: wt-status.c:1542
msgid "Not currently on any branch."
msgstr "Извън всички клони."
-#: wt-status.c:1496
+#: wt-status.c:1560
msgid "Initial commit"
msgstr "Първоначално подаване"
-#: wt-status.c:1510
+#: wt-status.c:1574
msgid "Untracked files"
msgstr "Неследени файлове"
-#: wt-status.c:1512
+#: wt-status.c:1576
msgid "Ignored files"
msgstr "Игнорирани файлове"
-#: wt-status.c:1516
+#: wt-status.c:1580
#, c-format
msgid ""
"It took %.2f seconds to enumerate untracked files. 'status -uno'\n"
@@ -2650,32 +4042,32 @@ msgstr ""
"изпълнението, но не трябва да забравяте ръчно да добавяте новите файлове.\n"
"За повече подробности погледнете „git status help“."
-#: wt-status.c:1522
+#: wt-status.c:1586
#, c-format
msgid "Untracked files not listed%s"
msgstr "Неследените файлове не са изведени%s"
-#: wt-status.c:1524
+#: wt-status.c:1588
msgid " (use -u option to show untracked files)"
msgstr " (използвайте опцията „-u“, за да изведете неследените файлове)"
-#: wt-status.c:1530
+#: wt-status.c:1594
msgid "No changes"
msgstr "Няма промени"
-#: wt-status.c:1535
+#: wt-status.c:1599
#, c-format
msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n"
msgstr ""
"към индекса за подаване не са добавени промени (използвайте „git add“ и/или "
"„git commit -a“)\n"
-#: wt-status.c:1538
+#: wt-status.c:1602
#, c-format
msgid "no changes added to commit\n"
msgstr "към индекса за подаване не са добавени промени\n"
-#: wt-status.c:1541
+#: wt-status.c:1605
#, c-format
msgid ""
"nothing added to commit but untracked files present (use \"git add\" to "
@@ -2684,56 +4076,71 @@ msgstr ""
"към индекса за подаване не са добавени промени, но има нови файлове "
"(използвайте „git add“, за да започне тяхното следене)\n"
-#: wt-status.c:1544
+#: wt-status.c:1608
#, c-format
msgid "nothing added to commit but untracked files present\n"
msgstr "към индекса за подаване не са добавени промени, но има нови файлове\n"
-#: wt-status.c:1547
+#: wt-status.c:1611
#, c-format
msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
msgstr ""
"липсват каквито и да е промени (създайте или копирайте файлове и използвайте "
"„git add“, за да започне тяхното следене)\n"
-#: wt-status.c:1550 wt-status.c:1555
+#: wt-status.c:1614 wt-status.c:1619
#, c-format
msgid "nothing to commit\n"
msgstr "липсват каквито и да е промени\n"
-#: wt-status.c:1553
+#: wt-status.c:1617
#, c-format
msgid "nothing to commit (use -u to show untracked files)\n"
msgstr ""
"липсват каквито и да е промени (използвайте опцията „-u“, за да се изведат и "
"неследените файлове)\n"
-#: wt-status.c:1557
+#: wt-status.c:1621
#, c-format
-msgid "nothing to commit, working directory clean\n"
+msgid "nothing to commit, working tree clean\n"
msgstr "липсват каквито и да е промени, работното дърво е чисто\n"
-#: wt-status.c:1664
+#: wt-status.c:1728
msgid "Initial commit on "
msgstr "Първоначално подаване на клон"
-#: wt-status.c:1668
+#: wt-status.c:1732
msgid "HEAD (no branch)"
msgstr "HEAD (извън клон)"
-#: wt-status.c:1697
+#: wt-status.c:1761
msgid "gone"
msgstr "изтрит"
-#: wt-status.c:1699 wt-status.c:1707
+#: wt-status.c:1763 wt-status.c:1771
msgid "behind "
msgstr "назад с "
-#: wt-status.c:1702 wt-status.c:1705
+#: wt-status.c:1766 wt-status.c:1769
msgid "ahead "
msgstr "напред с "
-#: compat/precompose_utf8.c:57 builtin/clone.c:415
+#. TRANSLATORS: the action is e.g. "pull with rebase"
+#: wt-status.c:2270
+#, c-format
+msgid "cannot %s: You have unstaged changes."
+msgstr "не може да извършите „%s“, защото има промени, които не са в индекса."
+
+#: wt-status.c:2276
+msgid "additionally, your index contains uncommitted changes."
+msgstr "освен това в индекса има неподадени промени."
+
+#: wt-status.c:2278
+#, c-format
+msgid "cannot %s: Your index contains uncommitted changes."
+msgstr "не може да извършите „%s“, защото в индекса има неподадени промени."
+
+#: compat/precompose_utf8.c:57 builtin/clone.c:414
#, c-format
msgid "failed to unlink '%s'"
msgstr "неуспешно изтриване на „%s“"
@@ -2742,265 +4149,264 @@ msgstr "неуспешно изтриване на „%s“"
msgid "git add [<options>] [--] <pathspec>..."
msgstr "git add [ОПЦИЯ…] [--] ПЪТ…"
-#: builtin/add.c:65
+#: builtin/add.c:80
#, c-format
msgid "unexpected diff status %c"
msgstr "неочакван изходен код при генериране на разлика: %c"
-#: builtin/add.c:70 builtin/commit.c:280
+#: builtin/add.c:85 builtin/commit.c:291
msgid "updating files failed"
msgstr "неуспешно обновяване на файловете"
-#: builtin/add.c:80
+#: builtin/add.c:95
#, c-format
msgid "remove '%s'\n"
msgstr "изтриване на „%s“\n"
-#: builtin/add.c:134
+#: builtin/add.c:149
msgid "Unstaged changes after refreshing the index:"
msgstr "Промени, които и след обновяването на индекса не са добавени към него:"
-#: builtin/add.c:194 builtin/rev-parse.c:811
+#: builtin/add.c:209 builtin/rev-parse.c:840
msgid "Could not read the index"
msgstr "Индексът не може да бъде прочетен"
-#: builtin/add.c:205
+#: builtin/add.c:220
#, c-format
msgid "Could not open '%s' for writing."
msgstr "Файлът „%s“ не може да бъде отворен за запис."
-#: builtin/add.c:209
+#: builtin/add.c:224
msgid "Could not write patch"
msgstr "Кръпката не може да бъде записана"
-#: builtin/add.c:212
+#: builtin/add.c:227
msgid "editing patch failed"
msgstr "неуспешно редактиране на кръпка"
-#: builtin/add.c:215
+#: builtin/add.c:230
#, c-format
msgid "Could not stat '%s'"
msgstr "Не може да се получи информация чрез „stat“ за файла „%s“"
-#: builtin/add.c:217
+#: builtin/add.c:232
msgid "Empty patch. Aborted."
msgstr "Празна кръпка, преустановяване на действието."
-#: builtin/add.c:222
+#: builtin/add.c:237
#, c-format
msgid "Could not apply '%s'"
msgstr "Кръпката „%s“ не може да бъде приложена"
-#: builtin/add.c:232
+#: builtin/add.c:247
msgid "The following paths are ignored by one of your .gitignore files:\n"
msgstr ""
"Следните пътища ще бъдат игнорирани според някой от файловете „.gitignore“:\n"
-#: builtin/add.c:249 builtin/clean.c:870 builtin/fetch.c:112 builtin/mv.c:111
-#: builtin/prune-packed.c:55 builtin/pull.c:197 builtin/push.c:511
-#: builtin/remote.c:1332 builtin/rm.c:268 builtin/send-pack.c:162
+#: builtin/add.c:266 builtin/clean.c:870 builtin/fetch.c:115 builtin/mv.c:111
+#: builtin/prune-packed.c:55 builtin/pull.c:198 builtin/push.c:521
+#: builtin/remote.c:1326 builtin/rm.c:268 builtin/send-pack.c:162
msgid "dry run"
-msgstr "пробно изпълнeние"
+msgstr "пробно изпълнение"
-#: builtin/add.c:250 builtin/apply.c:4563 builtin/check-ignore.c:19
-#: builtin/commit.c:1333 builtin/count-objects.c:85 builtin/fsck.c:557
-#: builtin/log.c:1826 builtin/mv.c:110 builtin/read-tree.c:114
-msgid "be verbose"
-msgstr "повече подробности"
-
-#: builtin/add.c:252
+#: builtin/add.c:269
msgid "interactive picking"
msgstr "интерактивно отбиране на промени"
-#: builtin/add.c:253 builtin/checkout.c:1154 builtin/reset.c:286
+#: builtin/add.c:270 builtin/checkout.c:1156 builtin/reset.c:286
msgid "select hunks interactively"
msgstr "интерактивен избор на парчета код"
-#: builtin/add.c:254
+#: builtin/add.c:271
msgid "edit current diff and apply"
msgstr "редактиране на текущата разлика и прилагане"
-#: builtin/add.c:255
+#: builtin/add.c:272
msgid "allow adding otherwise ignored files"
msgstr "добавяне и на иначе игнорираните файлове"
-#: builtin/add.c:256
+#: builtin/add.c:273
msgid "update tracked files"
msgstr "обновяване на следените файлове"
-#: builtin/add.c:257
+#: builtin/add.c:274
msgid "record only the fact that the path will be added later"
msgstr "отбелязване само на факта, че пътят ще бъде добавен по-късно"
-#: builtin/add.c:258
+#: builtin/add.c:275
msgid "add changes from all tracked and untracked files"
msgstr "добавяне на всички промени в следените и неследените файлове"
-#: builtin/add.c:261
+#: builtin/add.c:278
msgid "ignore paths removed in the working tree (same as --no-all)"
msgstr ""
"игнориране на пътищата, които са изтрити от работното дърво (същото като „--"
"no-all“)"
-#: builtin/add.c:263
+#: builtin/add.c:280
msgid "don't add, only refresh the index"
msgstr "без добавяне на нови файлове, само обновяване на индекса"
-#: builtin/add.c:264
+#: builtin/add.c:281
msgid "just skip files which cannot be added because of errors"
msgstr ""
"прескачане на файловете, които не могат да бъдат добавени поради грешки"
-#: builtin/add.c:265
+#: builtin/add.c:282
msgid "check if - even missing - files are ignored in dry run"
msgstr ""
"проверка, че при пробно изпълнение всички файлове, дори и изтритите, се "
"игнорират"
-#: builtin/add.c:287
+#: builtin/add.c:283 builtin/update-index.c:947
+msgid "(+/-)x"
+msgstr "(+/-)x"
+
+#: builtin/add.c:283 builtin/update-index.c:948
+msgid "override the executable bit of the listed files"
+msgstr "изрично задаване на стойността на флага дали файлът е изпълним"
+
+#: builtin/add.c:305
#, c-format
msgid "Use -f if you really want to add them.\n"
msgstr "Използвайте опцията „-f“, за да ги добавите наистина.\n"
-#: builtin/add.c:294
+#: builtin/add.c:312
msgid "adding files failed"
msgstr "неуспешно добавяне на файлове"
-#: builtin/add.c:330
+#: builtin/add.c:348
msgid "-A and -u are mutually incompatible"
msgstr "опциите „-A“ и „-u“ са несъвместими"
-#: builtin/add.c:337
+#: builtin/add.c:355
msgid "Option --ignore-missing can only be used together with --dry-run"
msgstr "Опцията „--ignore-missing“ е съвместима само с „--dry-run“"
-#: builtin/add.c:352
+#: builtin/add.c:359
+#, c-format
+msgid "--chmod param '%s' must be either -x or +x"
+msgstr "параметърът към „--chmod“ — „%s“ може да е или „-x“, или „+x“"
+
+#: builtin/add.c:374
#, c-format
msgid "Nothing specified, nothing added.\n"
msgstr "Нищо не е зададено и нищо не е добавено.\n"
-#: builtin/add.c:353
+#: builtin/add.c:375
#, c-format
msgid "Maybe you wanted to say 'git add .'?\n"
msgstr "Вероятно искахте да използвате „git add .“?\n"
-#: builtin/add.c:358 builtin/check-ignore.c:172 builtin/clean.c:914
-#: builtin/commit.c:339 builtin/mv.c:131 builtin/reset.c:235 builtin/rm.c:298
-#: builtin/submodule--helper.c:240
+#: builtin/add.c:380 builtin/check-ignore.c:172 builtin/checkout.c:279
+#: builtin/checkout.c:472 builtin/clean.c:914 builtin/commit.c:350
+#: builtin/mv.c:131 builtin/reset.c:235 builtin/rm.c:298
+#: builtin/submodule--helper.c:244
msgid "index file corrupt"
msgstr "файлът с индекса е повреден"
-#: builtin/add.c:439 builtin/apply.c:4661 builtin/mv.c:283 builtin/rm.c:430
-msgid "Unable to write new index file"
-msgstr "Новият индекс не може да бъде записан"
-
-#: builtin/am.c:256 builtin/commit.c:749 builtin/merge.c:1089
-#, c-format
-msgid "could not read '%s'"
-msgstr "файлът „%s“ не може да бъде прочетен"
-
-#: builtin/am.c:430
+#: builtin/am.c:414
msgid "could not parse author script"
msgstr "скриптът за автор не може да се анализира"
-#: builtin/am.c:507
+#: builtin/am.c:491
#, c-format
msgid "'%s' was deleted by the applypatch-msg hook"
msgstr "„%s“ бе изтрит от куката „applypatch-msg“"
-#: builtin/am.c:548 builtin/notes.c:300
+#: builtin/am.c:532
#, c-format
msgid "Malformed input line: '%s'."
msgstr "Даденият входен ред е с неправилен формат: „%s“."
-#: builtin/am.c:585 builtin/notes.c:315
+#: builtin/am.c:569
#, c-format
msgid "Failed to copy notes from '%s' to '%s'"
msgstr "Бележката не може да се копира от „%s“ към „%s“"
-#: builtin/am.c:611
+#: builtin/am.c:595
msgid "fseek failed"
msgstr "неуспешно изпълнение на „fseek“"
-#: builtin/am.c:788
+#: builtin/am.c:775
#, c-format
msgid "could not parse patch '%s'"
msgstr "кръпката „%s“ не може да се анализира"
-#: builtin/am.c:853
+#: builtin/am.c:840
msgid "Only one StGIT patch series can be applied at once"
msgstr ""
"Само една серия кръпки от „StGIT“ може да бъде прилагана в даден момент"
-#: builtin/am.c:900
+#: builtin/am.c:887
msgid "invalid timestamp"
msgstr "неправилна стойност за време"
-#: builtin/am.c:903 builtin/am.c:911
+#: builtin/am.c:890 builtin/am.c:898
msgid "invalid Date line"
msgstr "неправилен ред за дата „Date“"
-#: builtin/am.c:908
+#: builtin/am.c:895
msgid "invalid timezone offset"
msgstr "неправилно отместване на часовия пояс"
-#: builtin/am.c:995
+#: builtin/am.c:984
msgid "Patch format detection failed."
msgstr "Форматът на кръпката не може да бъде определен."
-#: builtin/am.c:1000 builtin/clone.c:380
+#: builtin/am.c:989 builtin/clone.c:379
#, c-format
msgid "failed to create directory '%s'"
msgstr "директорията „%s“ не може да бъде създадена"
-#: builtin/am.c:1004
+#: builtin/am.c:993
msgid "Failed to split patches."
msgstr "Кръпките не могат да бъдат разделени."
-#: builtin/am.c:1136 builtin/commit.c:365
+#: builtin/am.c:1125 builtin/commit.c:376
msgid "unable to write index file"
msgstr "индексът не може да бъде записан"
-#: builtin/am.c:1187
+#: builtin/am.c:1176
#, c-format
msgid "When you have resolved this problem, run \"%s --continue\"."
msgstr "След коригирането на този проблем изпълнете „%s --continue“."
-#: builtin/am.c:1188
+#: builtin/am.c:1177
#, c-format
msgid "If you prefer to skip this patch, run \"%s --skip\" instead."
msgstr "Ако предпочитате да прескочите тази кръпка, изпълнете „%s --skip“."
-#: builtin/am.c:1189
+#: builtin/am.c:1178
#, c-format
msgid "To restore the original branch and stop patching, run \"%s --abort\"."
msgstr "За да се върнете към първоначалното състояние, изпълнете „%s --abort“."
-#: builtin/am.c:1327
+#: builtin/am.c:1316
msgid "Patch is empty. Was it split wrong?"
-msgstr "Празна кръпка. Дали не е разделена погрешно?"
+msgstr "Празна кръпка. Дали не е разделена погрешно?"
-#: builtin/am.c:1401 builtin/log.c:1516
+#: builtin/am.c:1390 builtin/log.c:1550
#, c-format
msgid "invalid ident line: %s"
msgstr "грешна идентичност: %s"
-#: builtin/am.c:1428
+#: builtin/am.c:1417
#, c-format
msgid "unable to parse commit %s"
msgstr "подаването не може да бъде анализирано: %s"
-#: builtin/am.c:1630
+#: builtin/am.c:1610
msgid "Repository lacks necessary blobs to fall back on 3-way merge."
msgstr ""
"В хранилището липсват необходимите обекти BLOB, за да се премине към тройно "
"сливане."
-#: builtin/am.c:1632
+#: builtin/am.c:1612
msgid "Using index info to reconstruct a base tree..."
msgstr "Базовото дърво се реконструира от информацията в индекса…"
-#: builtin/am.c:1651
+#: builtin/am.c:1631
msgid ""
"Did you hand edit your patch?\n"
"It does not apply to blobs recorded in its index."
@@ -3008,39 +4414,39 @@ msgstr ""
"Кръпката не може да се приложи към обектите BLOB в индекса.\n"
"Да не би да сте я редактирали на ръка?"
-#: builtin/am.c:1657
+#: builtin/am.c:1637
msgid "Falling back to patching base and 3-way merge..."
msgstr "Преминаване към прилагане на кръпка към базата и тройно сливане…"
-#: builtin/am.c:1672
+#: builtin/am.c:1662
msgid "Failed to merge in the changes."
msgstr "Неуспешно сливане на промените."
-#: builtin/am.c:1696 builtin/merge.c:636
+#: builtin/am.c:1686 builtin/merge.c:628
msgid "git write-tree failed to write a tree"
msgstr "Командата „git write-tree“ не успя да запише обект-дърво"
-#: builtin/am.c:1703
+#: builtin/am.c:1693
msgid "applying to an empty history"
msgstr "прилагане върху празна история"
-#: builtin/am.c:1716 builtin/commit.c:1775 builtin/merge.c:841
-#: builtin/merge.c:866
+#: builtin/am.c:1706 builtin/commit.c:1769 builtin/merge.c:798
+#: builtin/merge.c:823
msgid "failed to write commit object"
msgstr "обектът за подаването не може да бъде записан"
-#: builtin/am.c:1748 builtin/am.c:1752
+#: builtin/am.c:1739 builtin/am.c:1743
#, c-format
msgid "cannot resume: %s does not exist."
msgstr "не може да се продължи — „%s“ не съществува."
-#: builtin/am.c:1768
+#: builtin/am.c:1759
msgid "cannot be interactive without stdin connected to a terminal."
msgstr ""
"За интерактивно изпълнение е необходимо стандартният\n"
"изход да е свързан с терминал, а в момента не е."
-#: builtin/am.c:1773
+#: builtin/am.c:1764
msgid "Commit Body is:"
msgstr "Тялото на кръпката за прилагане е:"
@@ -3048,38 +4454,38 @@ msgstr "Тялото на кръпката за прилагане е:"
#. in your translation. The program will only accept English
#. input at this point.
#.
-#: builtin/am.c:1783
+#: builtin/am.c:1774
msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all: "
msgstr ""
"Прилагане? „y“ — да/„n“ — не/„e“ — редактиране/„v“ — преглед/„a“ — приемане "
"на всичко:"
-#: builtin/am.c:1833
+#: builtin/am.c:1824
#, c-format
msgid "Dirty index: cannot apply patches (dirty: %s)"
msgstr ""
"Индексът не е чист: кръпките не могат да бъдат приложени (замърсени са: %s)"
-#: builtin/am.c:1868 builtin/am.c:1940
+#: builtin/am.c:1861 builtin/am.c:1933
#, c-format
msgid "Applying: %.*s"
msgstr "Прилагане: %.*s"
-#: builtin/am.c:1884
+#: builtin/am.c:1877
msgid "No changes -- Patch already applied."
msgstr "Без промени — кръпката вече е приложена."
-#: builtin/am.c:1892
+#: builtin/am.c:1885
#, c-format
msgid "Patch failed at %s %.*s"
msgstr "Неуспешно прилагане на кръпка при %s %.*s“"
-#: builtin/am.c:1898
+#: builtin/am.c:1891
#, c-format
msgid "The copy of the patch that failed is found in: %s"
msgstr "Дубликат на проблемната кръпка се намира в: %s"
-#: builtin/am.c:1943
+#: builtin/am.c:1936
msgid ""
"No changes - did you forget to use 'git add'?\n"
"If there is nothing left to stage, chances are that something else\n"
@@ -3089,7 +4495,7 @@ msgstr ""
"Ако няма друга промяна за включване в индекса, най-вероятно някоя друга\n"
"кръпка е довела до същите промени и в такъв случай просто пропуснете тази."
-#: builtin/am.c:1950
+#: builtin/am.c:1943
msgid ""
"You still have unmerged paths in your index.\n"
"Did you forget to use 'git add'?"
@@ -3097,199 +4503,178 @@ msgstr ""
"Индексът все още съдържа неслети промени.\n"
"Възможно е да не сте изпълнили „git add“."
-#: builtin/am.c:2058 builtin/am.c:2062 builtin/am.c:2074 builtin/reset.c:308
+#: builtin/am.c:2051 builtin/am.c:2055 builtin/am.c:2067 builtin/reset.c:308
#: builtin/reset.c:316
#, c-format
msgid "Could not parse object '%s'."
msgstr "„%s“ не е разпознат като обект."
-#: builtin/am.c:2110
+#: builtin/am.c:2103
msgid "failed to clean index"
msgstr "индексът не може да бъде изчистен"
-#: builtin/am.c:2144
+#: builtin/am.c:2137
msgid ""
"You seem to have moved HEAD since the last 'am' failure.\n"
"Not rewinding to ORIG_HEAD"
msgstr ""
"Изглежда указателят „HEAD“ е променен и не сочи към същия обект както по "
"времето\n"
-"на последното неуспешно изпълнение на „git am“. Указателят се задава да сочи "
-"към\n"
+"на последното неуспешно изпълнение на „git am“. Указателят се задава да "
+"сочи към\n"
"„ORIG_HEAD“"
-#: builtin/am.c:2205
+#: builtin/am.c:2200
#, c-format
msgid "Invalid value for --patch-format: %s"
msgstr "Неправилна стойност за „--patch-format“: „%s“"
-#: builtin/am.c:2238
-msgid "git am [<options>] [(<mbox>|<Maildir>)...]"
-msgstr "git am [ОПЦИЯ…] [ФАЙЛ_С_ПОЩА|ДИРЕКТОРИЯ_С_ПОЩА]…"
+#: builtin/am.c:2233
+msgid "git am [<options>] [(<mbox> | <Maildir>)...]"
+msgstr "git am [ОПЦИЯ…] [(ФАЙЛ_С_ПОЩА|ДИРЕКТОРИЯ_С_ПОЩА)…]"
-#: builtin/am.c:2239
+#: builtin/am.c:2234
msgid "git am [<options>] (--continue | --skip | --abort)"
msgstr "git am [ОПЦИЯ…] (--continue | --quit | --abort)"
-#: builtin/am.c:2245
+#: builtin/am.c:2240
msgid "run interactively"
msgstr "интерактивна работа"
-#: builtin/am.c:2247
+#: builtin/am.c:2242
msgid "historical option -- no-op"
msgstr "изоставена опция, съществува по исторически причини, нищо не прави"
-#: builtin/am.c:2249
+#: builtin/am.c:2244
msgid "allow fall back on 3way merging if needed"
msgstr "да се преминава към тройно сливане при нужда."
-#: builtin/am.c:2250 builtin/init-db.c:478 builtin/prune-packed.c:57
-#: builtin/repack.c:171
+#: builtin/am.c:2245 builtin/init-db.c:483 builtin/prune-packed.c:57
+#: builtin/repack.c:172
msgid "be quiet"
msgstr "без извеждане на информация"
-#: builtin/am.c:2252
+#: builtin/am.c:2247
msgid "add a Signed-off-by line to the commit message"
msgstr "добавяне на ред за подпис „Signed-off-by“ в съобщението за подаване"
-#: builtin/am.c:2255
+#: builtin/am.c:2250
msgid "recode into utf8 (default)"
msgstr "прекодиране в UTF-8 (стандартно)"
-#: builtin/am.c:2257
+#: builtin/am.c:2252
msgid "pass -k flag to git-mailinfo"
msgstr "подаване на опцията „-k“ на командата „git-mailinfo“"
-#: builtin/am.c:2259
+#: builtin/am.c:2254
msgid "pass -b flag to git-mailinfo"
msgstr "подаване на опцията „-b“ на командата „git-mailinfo“"
-#: builtin/am.c:2261
+#: builtin/am.c:2256
msgid "pass -m flag to git-mailinfo"
msgstr "подаване на опцията „-m“ на командата „git-mailinfo“"
-#: builtin/am.c:2263
+#: builtin/am.c:2258
msgid "pass --keep-cr flag to git-mailsplit for mbox format"
msgstr ""
"подаване на опцията „--keep-cr“ на командата „git-mailsplit“ за формат „mbox“"
-#: builtin/am.c:2266
+#: builtin/am.c:2261
msgid "do not pass --keep-cr flag to git-mailsplit independent of am.keepcr"
msgstr ""
"без подаване на опцията „--keep-cr“ на командата „git-mailsplit“ независимо "
"от „am.keepcr“"
-#: builtin/am.c:2269
+#: builtin/am.c:2264
msgid "strip everything before a scissors line"
msgstr "пропускане на всичко преди реда за отрязване"
-#: builtin/am.c:2270 builtin/apply.c:4546
-msgid "action"
-msgstr "действие"
-
-#: builtin/am.c:2271 builtin/am.c:2274 builtin/am.c:2277 builtin/am.c:2280
-#: builtin/am.c:2283 builtin/am.c:2286 builtin/am.c:2289 builtin/am.c:2292
-#: builtin/am.c:2298
+#: builtin/am.c:2266 builtin/am.c:2269 builtin/am.c:2272 builtin/am.c:2275
+#: builtin/am.c:2278 builtin/am.c:2281 builtin/am.c:2284 builtin/am.c:2287
+#: builtin/am.c:2293
msgid "pass it through git-apply"
msgstr "прекарване през „git-apply“"
-#: builtin/am.c:2279 builtin/apply.c:4570
-msgid "root"
-msgstr "НАЧАЛНА_ДИРЕКТОРИЯ"
-
-#: builtin/am.c:2282 builtin/am.c:2285 builtin/apply.c:4508
-#: builtin/apply.c:4511 builtin/clone.c:90 builtin/fetch.c:95
-#: builtin/pull.c:179 builtin/submodule--helper.c:277
-#: builtin/submodule--helper.c:404 builtin/submodule--helper.c:485
-#: builtin/submodule--helper.c:488 builtin/submodule--helper.c:767
-#: builtin/submodule--helper.c:770
-msgid "path"
-msgstr "път"
-
-#: builtin/am.c:2288 builtin/fmt-merge-msg.c:666 builtin/fmt-merge-msg.c:669
-#: builtin/grep.c:706 builtin/merge.c:199 builtin/pull.c:134 builtin/pull.c:193
-#: builtin/repack.c:178 builtin/repack.c:182 builtin/show-branch.c:645
+#: builtin/am.c:2283 builtin/fmt-merge-msg.c:662 builtin/fmt-merge-msg.c:665
+#: builtin/grep.c:707 builtin/merge.c:200 builtin/pull.c:135 builtin/pull.c:194
+#: builtin/repack.c:181 builtin/repack.c:185 builtin/show-branch.c:644
#: builtin/show-ref.c:175 builtin/tag.c:340 parse-options.h:132
-#: parse-options.h:134 parse-options.h:244
+#: parse-options.h:134 parse-options.h:245
msgid "n"
msgstr "БРОЙ"
-#: builtin/am.c:2291 builtin/apply.c:4514
-msgid "num"
-msgstr "БРОЙ"
-
-#: builtin/am.c:2294 builtin/for-each-ref.c:37 builtin/replace.c:438
+#: builtin/am.c:2289 builtin/for-each-ref.c:37 builtin/replace.c:438
#: builtin/tag.c:372
msgid "format"
msgstr "ФОРМАТ"
-#: builtin/am.c:2295
+#: builtin/am.c:2290
msgid "format the patch(es) are in"
msgstr "формат на кръпките"
-#: builtin/am.c:2301
+#: builtin/am.c:2296
msgid "override error message when patch failure occurs"
msgstr "избрано от вас съобщение за грешка при прилагане на кръпки"
-#: builtin/am.c:2303
+#: builtin/am.c:2298
msgid "continue applying patches after resolving a conflict"
msgstr "продължаване на прилагането на кръпки след коригирането на конфликт"
-#: builtin/am.c:2306
+#: builtin/am.c:2301
msgid "synonyms for --continue"
msgstr "синоними на „--continue“"
-#: builtin/am.c:2309
+#: builtin/am.c:2304
msgid "skip the current patch"
msgstr "прескачане на текущата кръпка"
-#: builtin/am.c:2312
+#: builtin/am.c:2307
msgid "restore the original branch and abort the patching operation."
msgstr ""
"възстановяване на първоначалното състояние на клона и преустановяване на "
"прилагането на кръпката."
-#: builtin/am.c:2316
+#: builtin/am.c:2311
msgid "lie about committer date"
msgstr "дата за подаване различна от първоначалната"
-#: builtin/am.c:2318
+#: builtin/am.c:2313
msgid "use current timestamp for author date"
msgstr "използване на текущото време като това за автор"
-#: builtin/am.c:2320 builtin/commit.c:1609 builtin/merge.c:228
-#: builtin/pull.c:164 builtin/revert.c:92 builtin/tag.c:355
+#: builtin/am.c:2315 builtin/commit.c:1605 builtin/merge.c:229
+#: builtin/pull.c:165 builtin/revert.c:92 builtin/tag.c:355
msgid "key-id"
msgstr "ИДЕНТИФИКАТОР_НА_КЛЮЧ"
-#: builtin/am.c:2321
+#: builtin/am.c:2316
msgid "GPG-sign commits"
msgstr "подписване на подаванията с GPG"
-#: builtin/am.c:2324
+#: builtin/am.c:2319
msgid "(internal use for git-rebase)"
msgstr "(ползва се вътрешно за „git-rebase“)"
-#: builtin/am.c:2339
+#: builtin/am.c:2334
msgid ""
"The -b/--binary option has been a no-op for long time, and\n"
"it will be removed. Please do not use it anymore."
msgstr ""
"Опциите „-b“/„--binary“ отдавна не правят нищо и\n"
-"ще бъдат премахнати в бъдеще. Не ги ползвайте."
+"ще бъдат премахнати в бъдеще. Не ги ползвайте."
-#: builtin/am.c:2346
+#: builtin/am.c:2341
msgid "failed to read the index"
msgstr "неуспешно изчитане на индекса"
-#: builtin/am.c:2361
+#: builtin/am.c:2356
#, c-format
msgid "previous rebase directory %s still exists but mbox given."
msgstr ""
"предишната директория за пребазиране „%s“ все още съществува, а е зададен "
"файл „mbox“."
-#: builtin/am.c:2385
+#: builtin/am.c:2380
#, c-format
msgid ""
"Stray %s directory found.\n"
@@ -3298,512 +4683,14 @@ msgstr ""
"Открита е излишна директория „%s“.\n"
"Можете да я изтриете с командата „git am --abort“."
-#: builtin/am.c:2391
+#: builtin/am.c:2386
msgid "Resolve operation not in progress, we are not resuming."
msgstr "В момента не тече операция по коригиране и няма как да се продължи."
-#: builtin/apply.c:59
+#: builtin/apply.c:8
msgid "git apply [<options>] [<patch>...]"
msgstr "git apply [ОПЦИЯ…] [КРЪПКА…]"
-#: builtin/apply.c:111
-#, c-format
-msgid "unrecognized whitespace option '%s'"
-msgstr "непозната опция за знаците за интервали „%s“"
-
-#: builtin/apply.c:126
-#, c-format
-msgid "unrecognized whitespace ignore option '%s'"
-msgstr "непозната опция за игнориране на знаците за интервали „%s“"
-
-#: builtin/apply.c:818
-#, c-format
-msgid "Cannot prepare timestamp regexp %s"
-msgstr "Регулярният израз за времето „%s“ не може за бъде компилиран"
-
-#: builtin/apply.c:827
-#, c-format
-msgid "regexec returned %d for input: %s"
-msgstr "Регулярният израз върна %d при подадена последователност „%s“ на входа"
-
-#: builtin/apply.c:908
-#, c-format
-msgid "unable to find filename in patch at line %d"
-msgstr "Липсва име на файл на ред %d от кръпката"
-
-#: builtin/apply.c:937
-#, c-format
-msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d"
-msgstr ""
-"git apply: лош изход от командата „git-diff“ — на ред %2$d се очакваше „/dev/"
-"null“, а бе получен „%1$s“"
-
-#: builtin/apply.c:942
-#, c-format
-msgid "git apply: bad git-diff - inconsistent new filename on line %d"
-msgstr ""
-"git apply: лош изход от командата „git-diff“ — на ред %d бе получено "
-"неправилно име на нов файл"
-
-#: builtin/apply.c:943
-#, c-format
-msgid "git apply: bad git-diff - inconsistent old filename on line %d"
-msgstr ""
-"git apply: лош изход от командата „git-diff“ — на ред %d бе получено "
-"неправилно име на стар файл"
-
-#: builtin/apply.c:949
-#, c-format
-msgid "git apply: bad git-diff - expected /dev/null on line %d"
-msgstr ""
-"git apply: лош изход от командата „git-diff“ — на ред %d се очакваше „/dev/"
-"null“"
-
-#: builtin/apply.c:1406
-#, c-format
-msgid "recount: unexpected line: %.*s"
-msgstr "при повторното преброяване бе получен неочакван ред: „%.*s“"
-
-#: builtin/apply.c:1463
-#, c-format
-msgid "patch fragment without header at line %d: %.*s"
-msgstr "част от кръпка без заглавна част на ред %d: %.*s"
-
-#: builtin/apply.c:1480
-#, c-format
-msgid ""
-"git diff header lacks filename information when removing %d leading pathname "
-"component (line %d)"
-msgid_plural ""
-"git diff header lacks filename information when removing %d leading pathname "
-"components (line %d)"
-msgstr[0] ""
-"След съкращаването на %d-та част от компонентите на пътя, в заглавната част "
-"на „git diff“ липсва информация за име на файл (ред: %d)"
-msgstr[1] ""
-"След съкращаването на първите %d части от компонентите на пътя, в заглавната "
-"част на „git diff“ липсва информация за име на файл (ред: %d)"
-
-#: builtin/apply.c:1646
-msgid "new file depends on old contents"
-msgstr "новият файл зависи от старото съдържание на файла"
-
-#: builtin/apply.c:1648
-msgid "deleted file still has contents"
-msgstr "изтритият файл не е празен"
-
-#: builtin/apply.c:1674
-#, c-format
-msgid "corrupt patch at line %d"
-msgstr "грешка в кръпката на ред %d"
-
-#: builtin/apply.c:1710
-#, c-format
-msgid "new file %s depends on old contents"
-msgstr "новият файл „%s“ зависи от старото съдържание на файла"
-
-#: builtin/apply.c:1712
-#, c-format
-msgid "deleted file %s still has contents"
-msgstr "изтритият файл „%s“ не е празен"
-
-#: builtin/apply.c:1715
-#, c-format
-msgid "** warning: file %s becomes empty but is not deleted"
-msgstr "● предупреждение: файлът „%s“ вече е празен, но не е изтрит"
-
-#: builtin/apply.c:1861
-#, c-format
-msgid "corrupt binary patch at line %d: %.*s"
-msgstr "грешка в двоичната кръпка на ред %d: %.*s"
-
-#: builtin/apply.c:1895
-#, c-format
-msgid "unrecognized binary patch at line %d"
-msgstr "неразпозната двоичната кръпка на ред %d"
-
-#: builtin/apply.c:2048
-#, c-format
-msgid "patch with only garbage at line %d"
-msgstr "кръпката е с изцяло повредени данни на ред %d"
-
-#: builtin/apply.c:2138
-#, c-format
-msgid "unable to read symlink %s"
-msgstr "символната връзка „%s“ не може да бъде прочетена"
-
-#: builtin/apply.c:2142
-#, c-format
-msgid "unable to open or read %s"
-msgstr "файлът „%s“ не може да бъде отворен или прочетен"
-
-#: builtin/apply.c:2775
-#, c-format
-msgid "invalid start of line: '%c'"
-msgstr "неправилно начало на ред: „%c“"
-
-#: builtin/apply.c:2894
-#, c-format
-msgid "Hunk #%d succeeded at %d (offset %d line)."
-msgid_plural "Hunk #%d succeeded at %d (offset %d lines)."
-msgstr[0] ""
-"%d-то парче код бе успешно приложено на ред %d (отместване от %d ред)."
-msgstr[1] ""
-"%d-то парче код бе успешно приложено на ред %d (отместване от %d реда)."
-
-#: builtin/apply.c:2906
-#, c-format
-msgid "Context reduced to (%ld/%ld) to apply fragment at %d"
-msgstr ""
-"Контекстът е намален на (%ld/%ld) за прилагането на парчето код на ред %d"
-
-#: builtin/apply.c:2912
-#, c-format
-msgid ""
-"while searching for:\n"
-"%.*s"
-msgstr ""
-"при търсене за:\n"
-"%.*s"
-
-#: builtin/apply.c:2932
-#, c-format
-msgid "missing binary patch data for '%s'"
-msgstr "липсват данните за двоичната кръпка за „%s“"
-
-#: builtin/apply.c:3033
-#, c-format
-msgid "binary patch does not apply to '%s'"
-msgstr "двоичната кръпка не може да бъде приложена върху „%s“"
-
-#: builtin/apply.c:3039
-#, c-format
-msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)"
-msgstr ""
-"двоичната кръпка за „%s“ води до неправилни резултати (очакваше се SHA1: "
-"„%s“, а бе получено: „%s“)"
-
-#: builtin/apply.c:3060
-#, c-format
-msgid "patch failed: %s:%ld"
-msgstr "неуспешно прилагане на кръпка: „%s:%ld“"
-
-#: builtin/apply.c:3184
-#, c-format
-msgid "cannot checkout %s"
-msgstr "„%s“ не може да се изтегли"
-
-#: builtin/apply.c:3229 builtin/apply.c:3240 builtin/apply.c:3285
-#, c-format
-msgid "read of %s failed"
-msgstr "неуспешно прочитане на „%s“"
-
-#: builtin/apply.c:3237
-#, c-format
-msgid "reading from '%s' beyond a symbolic link"
-msgstr "изчитане на „%s“ след проследяване на символна връзка"
-
-#: builtin/apply.c:3265 builtin/apply.c:3487
-#, c-format
-msgid "path %s has been renamed/deleted"
-msgstr "обектът с път „%s“ е преименуван или изтрит"
-
-#: builtin/apply.c:3346 builtin/apply.c:3501
-#, c-format
-msgid "%s: does not exist in index"
-msgstr "„%s“ не съществува в индекса"
-
-#: builtin/apply.c:3350 builtin/apply.c:3493 builtin/apply.c:3515
-#, c-format
-msgid "%s: %s"
-msgstr "„%s“: %s"
-
-#: builtin/apply.c:3355 builtin/apply.c:3509
-#, c-format
-msgid "%s: does not match index"
-msgstr "„%s“ не съответства на индекса"
-
-#: builtin/apply.c:3457
-msgid "removal patch leaves file contents"
-msgstr "изтриващата кръпка оставя файла непразен"
-
-#: builtin/apply.c:3526
-#, c-format
-msgid "%s: wrong type"
-msgstr "„%s“: неправилен вид"
-
-#: builtin/apply.c:3528
-#, c-format
-msgid "%s has type %o, expected %o"
-msgstr "„%s“ е от вид „%o“, а се очакваше „%o“"
-
-#: builtin/apply.c:3687 builtin/apply.c:3689
-#, c-format
-msgid "invalid path '%s'"
-msgstr "неправилен път: „%s“"
-
-#: builtin/apply.c:3744
-#, c-format
-msgid "%s: already exists in index"
-msgstr "„%s“: вече съществува в индекса"
-
-#: builtin/apply.c:3747
-#, c-format
-msgid "%s: already exists in working directory"
-msgstr "„%s“: вече съществува в работното дърво"
-
-#: builtin/apply.c:3767
-#, c-format
-msgid "new mode (%o) of %s does not match old mode (%o)"
-msgstr "новите права за достъп (%o) на „%s“ не съвпадат със старите (%o)"
-
-#: builtin/apply.c:3772
-#, c-format
-msgid "new mode (%o) of %s does not match old mode (%o) of %s"
-msgstr ""
-"новите права за достъп (%o) на „%s“ не съвпадат със старите (%o) на „%s“"
-
-#: builtin/apply.c:3792
-#, c-format
-msgid "affected file '%s' is beyond a symbolic link"
-msgstr "засегнатият файл „%s“ е след символна връзка"
-
-#: builtin/apply.c:3796
-#, c-format
-msgid "%s: patch does not apply"
-msgstr "Кръпката „%s“ не може да бъде приложена"
-
-#: builtin/apply.c:3810
-#, c-format
-msgid "Checking patch %s..."
-msgstr "Проверяване на кръпката „%s“…"
-
-#: builtin/apply.c:3903 builtin/checkout.c:233 builtin/reset.c:135
-#, c-format
-msgid "make_cache_entry failed for path '%s'"
-msgstr "неуспешно създаване на запис в кеша чрез „make_cache_entry“ за „%s“"
-
-#: builtin/apply.c:4046
-#, c-format
-msgid "unable to remove %s from index"
-msgstr "„%s“ не може да се извади от индекса"
-
-#: builtin/apply.c:4075
-#, c-format
-msgid "corrupt patch for submodule %s"
-msgstr "повредена кръпка за модула „%s“"
-
-#: builtin/apply.c:4079
-#, c-format
-msgid "unable to stat newly created file '%s'"
-msgstr ""
-"не може да се получи информация чрез „stat“ за новосъздадения файл „%s“"
-
-#: builtin/apply.c:4084
-#, c-format
-msgid "unable to create backing store for newly created file %s"
-msgstr ""
-"не може да се за създаде мястото за съхранение на новосъздадения файл „%s“"
-
-#: builtin/apply.c:4087 builtin/apply.c:4195
-#, c-format
-msgid "unable to add cache entry for %s"
-msgstr "не може да се добави запис в кеша за „%s“"
-
-#: builtin/apply.c:4120
-#, c-format
-msgid "closing file '%s'"
-msgstr "затваряне на файла „%s“"
-
-#: builtin/apply.c:4169
-#, c-format
-msgid "unable to write file '%s' mode %o"
-msgstr "файлът „%s“ не може да се запише с режим на достъп „%o“"
-
-#: builtin/apply.c:4256
-#, c-format
-msgid "Applied patch %s cleanly."
-msgstr "Кръпката „%s“ бе приложена чисто."
-
-#: builtin/apply.c:4264
-msgid "internal error"
-msgstr "вътрешна грешка"
-
-#: builtin/apply.c:4267
-#, c-format
-msgid "Applying patch %%s with %d reject..."
-msgid_plural "Applying patch %%s with %d rejects..."
-msgstr[0] "Прилагане на кръпката „%%s“ с %d отхвърлено парче…"
-msgstr[1] "Прилагане на кръпката „%%s“ с %d отхвърлени парчета…"
-
-#: builtin/apply.c:4277
-#, c-format
-msgid "truncating .rej filename to %.*s.rej"
-msgstr "съкращаване на името на файла с отхвърлените парчета на „ %.*s.rej“"
-
-#: builtin/apply.c:4285
-#, c-format
-msgid "cannot open %s: %s"
-msgstr "файлът „%s“ не може да бъде отворен: %s"
-
-#: builtin/apply.c:4298
-#, c-format
-msgid "Hunk #%d applied cleanly."
-msgstr "%d-то парче бе успешно приложено."
-
-#: builtin/apply.c:4301
-#, c-format
-msgid "Rejected hunk #%d."
-msgstr "%d-то парче бе отхвърлено."
-
-#: builtin/apply.c:4387
-#, c-format
-msgid "Skipped patch '%s'."
-msgstr "Пропусната кръпка: „%s“"
-
-#: builtin/apply.c:4395
-msgid "unrecognized input"
-msgstr "непознат вход"
-
-#: builtin/apply.c:4406
-msgid "unable to read index file"
-msgstr "индексът не може да бъде записан"
-
-#: builtin/apply.c:4509
-msgid "don't apply changes matching the given path"
-msgstr "без прилагане на промените напасващи на дадения път"
-
-#: builtin/apply.c:4512
-msgid "apply changes matching the given path"
-msgstr "прилагане на промените напасващи на дадения път"
-
-#: builtin/apply.c:4515
-msgid "remove <num> leading slashes from traditional diff paths"
-msgstr "премахване на този БРОЙ водещи елементи от пътищата в разликата"
-
-#: builtin/apply.c:4518
-msgid "ignore additions made by the patch"
-msgstr "игнориране на редовете добавени от тази кръпка"
-
-#: builtin/apply.c:4520
-msgid "instead of applying the patch, output diffstat for the input"
-msgstr "извеждане на статистика на промените без прилагане на кръпката"
-
-#: builtin/apply.c:4524
-msgid "show number of added and deleted lines in decimal notation"
-msgstr "извеждане на броя на добавените и изтритите редове"
-
-#: builtin/apply.c:4526
-msgid "instead of applying the patch, output a summary for the input"
-msgstr "извеждане на статистика на входните данни без прилагане на кръпката"
-
-#: builtin/apply.c:4528
-msgid "instead of applying the patch, see if the patch is applicable"
-msgstr "проверка дали кръпката може да се приложи, без действително прилагане"
-
-#: builtin/apply.c:4530
-msgid "make sure the patch is applicable to the current index"
-msgstr "проверка дали кръпката може да бъде приложена към текущия индекс"
-
-#: builtin/apply.c:4532
-msgid "apply a patch without touching the working tree"
-msgstr "прилагане на кръпката без промяна на работното дърво"
-
-#: builtin/apply.c:4534
-msgid "accept a patch that touches outside the working area"
-msgstr "прилагане на кръпка, която променя и файлове извън работното дърво"
-
-#: builtin/apply.c:4536
-msgid "also apply the patch (use with --stat/--summary/--check)"
-msgstr ""
-"кръпката да бъде приложена. Опцията се комбинира с „--check“/„--stat“/„--"
-"summary“"
-
-#: builtin/apply.c:4538
-msgid "attempt three-way merge if a patch does not apply"
-msgstr "пробване с тройно сливане, ако кръпката не може да се приложи директно"
-
-#: builtin/apply.c:4540
-msgid "build a temporary index based on embedded index information"
-msgstr ""
-"създаване на временен индекс на база на включената информация за индекса"
-
-#: builtin/apply.c:4543 builtin/checkout-index.c:169 builtin/ls-files.c:425
-msgid "paths are separated with NUL character"
-msgstr "разделяне на пътищата с нулевия знак „NUL“"
-
-#: builtin/apply.c:4545
-msgid "ensure at least <n> lines of context match"
-msgstr "да се осигури контекст от поне такъв БРОЙ съвпадащи редове"
-
-#: builtin/apply.c:4547
-msgid "detect new or modified lines that have whitespace errors"
-msgstr "засичане на нови или променени редове с грешки в знаците за интервали"
-
-#: builtin/apply.c:4550 builtin/apply.c:4553
-msgid "ignore changes in whitespace when finding context"
-msgstr ""
-"игнориране на промените в знаците за интервали при откриване на контекста"
-
-#: builtin/apply.c:4556
-msgid "apply the patch in reverse"
-msgstr "прилагане на кръпката в обратна посока"
-
-#: builtin/apply.c:4558
-msgid "don't expect at least one line of context"
-msgstr "без изискване на дори и един ред контекст"
-
-#: builtin/apply.c:4560
-msgid "leave the rejected hunks in corresponding *.rej files"
-msgstr "оставяне на отхвърлените парчета във файлове с разширение „.rej“"
-
-#: builtin/apply.c:4562
-msgid "allow overlapping hunks"
-msgstr "позволяване на застъпващи се парчета"
-
-#: builtin/apply.c:4565
-msgid "tolerate incorrectly detected missing new-line at the end of file"
-msgstr "пренебрегване на неправилно липсващ знак за нов ред в края на файл"
-
-#: builtin/apply.c:4568
-msgid "do not trust the line counts in the hunk headers"
-msgstr "без доверяване на номерата на редовете в заглавните части на парчетата"
-
-#: builtin/apply.c:4571
-msgid "prepend <root> to all filenames"
-msgstr "добавяне на тази НАЧАЛНА_ДИРЕКТОРИЯ към имената на всички файлове"
-
-#: builtin/apply.c:4593
-msgid "--3way outside a repository"
-msgstr "като „--3way“, но извън хранилище"
-
-#: builtin/apply.c:4601
-msgid "--index outside a repository"
-msgstr "като „--index“, но извън хранилище"
-
-#: builtin/apply.c:4604
-msgid "--cached outside a repository"
-msgstr "като „--cached“, но извън хранилище"
-
-#: builtin/apply.c:4623
-#, c-format
-msgid "can't open patch '%s'"
-msgstr "кръпката „%s“ не може да бъде отворена"
-
-#: builtin/apply.c:4637
-#, c-format
-msgid "squelched %d whitespace error"
-msgid_plural "squelched %d whitespace errors"
-msgstr[0] "пренебрегната е %d грешка в знаците за интервали"
-msgstr[1] "пренебрегнати са %d грешки в знаците за интервали"
-
-#: builtin/apply.c:4643 builtin/apply.c:4653
-#, c-format
-msgid "%d line adds whitespace errors."
-msgid_plural "%d lines add whitespace errors."
-msgstr[0] "%d ред добавя грешки в знаците за интервали."
-msgstr[1] "%d реда добавят грешки в знаците за интервали."
-
#: builtin/archive.c:17
#, c-format
msgid "could not create archive file '%s'"
@@ -3860,135 +4747,188 @@ msgstr "git blame [ОПЦИЯ…] [ОПЦИЯ_ЗА_ВЕРСИЯТА…] [ВЕР
msgid "<rev-opts> are documented in git-rev-list(1)"
msgstr "ОПЦИИте_ЗА_ВЕРСИЯТА са документирани в ръководството git-rev-list(1)"
-#: builtin/blame.c:1782
+#: builtin/blame.c:1781
msgid "Blaming lines"
msgstr "Анотирани редове"
-#: builtin/blame.c:2531
+#: builtin/blame.c:2577
msgid "Show blame entries as we find them, incrementally"
msgstr "Извеждане на анотациите с намирането им, последователно"
-# FIXME SHA-1 -> SHA1
-#: builtin/blame.c:2532
+#: builtin/blame.c:2578
msgid "Show blank SHA-1 for boundary commits (Default: off)"
msgstr ""
"Извеждане на празни суми по SHA1 за граничните подавания (стандартно опцията "
"е изключена)"
-#: builtin/blame.c:2533
+#: builtin/blame.c:2579
msgid "Do not treat root commits as boundaries (Default: off)"
msgstr ""
"Началните подавания да не се считат за гранични (стандартно опцията е "
"изключена)"
-#: builtin/blame.c:2534
+#: builtin/blame.c:2580
msgid "Show work cost statistics"
msgstr "Извеждане на статистика за извършените действия"
-#: builtin/blame.c:2535
+#: builtin/blame.c:2581
msgid "Force progress reporting"
msgstr "Принудително извеждане на напредъка"
-#: builtin/blame.c:2536
+#: builtin/blame.c:2582
msgid "Show output score for blame entries"
msgstr "Извеждане на допълнителна информация за определянето на анотациите"
-#: builtin/blame.c:2537
+#: builtin/blame.c:2583
msgid "Show original filename (Default: auto)"
msgstr ""
"Извеждане на първоначалното име на файл (стандартно това е автоматично)"
-#: builtin/blame.c:2538
+#: builtin/blame.c:2584
msgid "Show original linenumber (Default: off)"
msgstr ""
"Извеждане на първоначалният номер на ред (стандартно опцията е изключена)"
-#: builtin/blame.c:2539
+#: builtin/blame.c:2585
msgid "Show in a format designed for machine consumption"
msgstr "Извеждане във формат за по-нататъшна обработка"
-#: builtin/blame.c:2540
+#: builtin/blame.c:2586
msgid "Show porcelain format with per-line commit information"
msgstr ""
"Извеждане във формат за команди от потребителско ниво с информация на всеки "
"ред"
-#: builtin/blame.c:2541
+#: builtin/blame.c:2587
msgid "Use the same output mode as git-annotate (Default: off)"
msgstr ""
"Използване на същия формат като „git-annotate“ (стандартно опцията е "
"изключена)"
-#: builtin/blame.c:2542
+#: builtin/blame.c:2588
msgid "Show raw timestamp (Default: off)"
msgstr "Извеждане на неформатирани времена (стандартно опцията е изключена)"
-#: builtin/blame.c:2543
+#: builtin/blame.c:2589
msgid "Show long commit SHA1 (Default: off)"
msgstr "Извеждане на пълните суми по SHA1 (стандартно опцията е изключена)"
-#: builtin/blame.c:2544
+#: builtin/blame.c:2590
msgid "Suppress author name and timestamp (Default: off)"
msgstr "Без име на автор и време на промяна (стандартно опцията е изключена)"
-#: builtin/blame.c:2545
+#: builtin/blame.c:2591
msgid "Show author email instead of name (Default: off)"
msgstr ""
"Извеждане на е-пощата на автора, а не името му (стандартно опцията е "
"изключена)"
-#: builtin/blame.c:2546
+#: builtin/blame.c:2592
msgid "Ignore whitespace differences"
msgstr "Без разлики в знаците за интервали"
-#: builtin/blame.c:2547
+#: builtin/blame.c:2599
+msgid "Use an experimental indent-based heuristic to improve diffs"
+msgstr "Подобряване на разликите чрез експериментална евристика според отстъпа"
+
+#: builtin/blame.c:2600
+msgid "Use an experimental blank-line-based heuristic to improve diffs"
+msgstr ""
+"Подобряване на разликите чрез експериментална евристика според празните "
+"редове"
+
+#: builtin/blame.c:2602
msgid "Spend extra cycles to find better match"
msgstr "Допълнителни изчисления за по-добри резултати"
-#: builtin/blame.c:2548
+#: builtin/blame.c:2603
msgid "Use revisions from <file> instead of calling git-rev-list"
msgstr "Изчитане на версиите от ФАЙЛ, а не чрез изпълнение на „git-rev-list“"
-#: builtin/blame.c:2549
+#: builtin/blame.c:2604
msgid "Use <file>'s contents as the final image"
msgstr "Използване на съдържанието на ФАЙЛа като крайно положение"
-#: builtin/blame.c:2550 builtin/blame.c:2551
+#: builtin/blame.c:2605 builtin/blame.c:2606
msgid "score"
msgstr "напасване на редовете"
-#: builtin/blame.c:2550
+#: builtin/blame.c:2605
msgid "Find line copies within and across files"
msgstr ""
"Търсене на копирани редове както в рамките на един файл, така и от един файл "
"към друг"
-#: builtin/blame.c:2551
+#: builtin/blame.c:2606
msgid "Find line movements within and across files"
msgstr ""
"Търсене на преместени редове както в рамките на един файл, така и от един "
"файл към друг"
-#: builtin/blame.c:2552
+#: builtin/blame.c:2607
msgid "n,m"
msgstr "n,m"
-#: builtin/blame.c:2552
+#: builtin/blame.c:2607
msgid "Process only line range n,m, counting from 1"
msgstr ""
-"Информация само за редовете в интервала от n до m включително. Броенето "
+"Информация само за редовете в диапазона от n до m включително. Броенето "
"започва от 1"
+#: builtin/blame.c:2654
+msgid "--progress can't be used with --incremental or porcelain formats"
+msgstr ""
+"опцията „--progress“ е несъвместима с „--incremental“ и форма̀та на командите "
+"от потребителско ниво"
+
#. TRANSLATORS: This string is used to tell us the maximum
#. display width for a relative timestamp in "git blame"
#. output. For C locale, "4 years, 11 months ago", which
#. takes 22 places, is the longest among various forms of
#. relative timestamps, but your language may need more or
#. fewer display columns.
-#: builtin/blame.c:2641
+#: builtin/blame.c:2700
msgid "4 years, 11 months ago"
msgstr "преди 4 години и 11 месеца"
+#: builtin/blame.c:2780
+msgid "--contents and --reverse do not blend well."
+msgstr "Опциите „--contents“ и „--reverse“ са несъвместими"
+
+#: builtin/blame.c:2800
+msgid "cannot use --contents with final commit object name"
+msgstr "Опцията „--contents“ е несъвместима с име на обект от крайно подаване"
+
+#: builtin/blame.c:2805
+msgid "--reverse and --first-parent together require specified latest commit"
+msgstr ""
+"Едновременното задаване на опциите „--reverse“ и „--first-parent“ изисква "
+"указването на крайно подаване"
+
+#: builtin/blame.c:2832
+msgid ""
+"--reverse --first-parent together require range along first-parent chain"
+msgstr ""
+"Едновременното задаване на опциите „--reverse“ и „--first-parent“ изисква "
+"указването на диапазон по веригата на първите наследници"
+
+#: builtin/blame.c:2843
+#, c-format
+msgid "no such path %s in %s"
+msgstr "няма път на име „%s“ в „%s“"
+
+#: builtin/blame.c:2854
+#, c-format
+msgid "cannot read blob %s for path %s"
+msgstr "обектът BLOB „%s“ в пътя %s не може да бъде прочетен"
+
+#: builtin/blame.c:2873
+#, c-format
+msgid "file %s has only %lu line"
+msgid_plural "file %s has only %lu lines"
+msgstr[0] "има само %2$lu ред във файла „%1$s“"
+msgstr[1] "има само %2$lu реда във файла „%1$s“"
+
#: builtin/branch.c:26
msgid "git branch [<options>] [-r | -a] [--merged | --no-merged]"
msgstr "git branch [ОПЦИЯ…] [-r | -a] [--merged | --no-merged]"
@@ -4038,7 +4978,7 @@ msgid ""
"The branch '%s' is not fully merged.\n"
"If you are sure you want to delete it, run 'git branch -D %s'."
msgstr ""
-"Клонът „%s“ не е слят напълно. Ако сте сигурни, че искате\n"
+"Клонът „%s“ не е слят напълно. Ако сте сигурни, че искате\n"
"да го изтриете, изпълнете „git branch -D %s“."
#: builtin/branch.c:178
@@ -4088,119 +5028,126 @@ msgstr "Изтрит следящ клон „%s“ (той сочеше към
msgid "Deleted branch %s (was %s).\n"
msgstr "Изтрит клон „%s“ (той сочеше към „%s“).\n"
-#: builtin/branch.c:309
+#: builtin/branch.c:312
#, c-format
msgid "[%s: gone]"
msgstr "[%s: изтрит]"
-#: builtin/branch.c:314
+#: builtin/branch.c:317
#, c-format
msgid "[%s]"
msgstr "[%s]"
-#: builtin/branch.c:319
+#: builtin/branch.c:322
#, c-format
msgid "[%s: behind %d]"
msgstr "[%s: назад с %d]"
-#: builtin/branch.c:321
+#: builtin/branch.c:324
#, c-format
msgid "[behind %d]"
msgstr "[назад с %d]"
-#: builtin/branch.c:325
+#: builtin/branch.c:328
#, c-format
msgid "[%s: ahead %d]"
msgstr "[%s: напред с %d]"
-#: builtin/branch.c:327
+#: builtin/branch.c:330
#, c-format
msgid "[ahead %d]"
msgstr "[напред с %d]"
-#: builtin/branch.c:330
+#: builtin/branch.c:333
#, c-format
msgid "[%s: ahead %d, behind %d]"
msgstr "[%s: напред с %d, назад с %d]"
-#: builtin/branch.c:333
+#: builtin/branch.c:336
#, c-format
msgid "[ahead %d, behind %d]"
msgstr "[напред с %d, назад с %d]"
-#: builtin/branch.c:346
+#: builtin/branch.c:349
msgid " **** invalid ref ****"
msgstr " ●●● неправилен указател ●●●"
-#: builtin/branch.c:372
+#: builtin/branch.c:375
#, c-format
msgid "(no branch, rebasing %s)"
msgstr "(извън клон, пребазиране на „%s“)"
-#: builtin/branch.c:375
+#: builtin/branch.c:378
#, c-format
msgid "(no branch, bisect started on %s)"
msgstr "(извън клон, двоично търсене от „%s“)"
#. TRANSLATORS: make sure this matches
#. "HEAD detached at " in wt-status.c
-#: builtin/branch.c:381
+#: builtin/branch.c:384
#, c-format
msgid "(HEAD detached at %s)"
msgstr "(Указателят „HEAD“ не е свързан и е при „%s“)"
#. TRANSLATORS: make sure this matches
#. "HEAD detached from " in wt-status.c
-#: builtin/branch.c:386
+#: builtin/branch.c:389
#, c-format
msgid "(HEAD detached from %s)"
msgstr "Указателят „HEAD“ не е свързан и е отделѐн от „%s“"
-#: builtin/branch.c:390
+#: builtin/branch.c:393
msgid "(no branch)"
msgstr "(извън клон)"
-#: builtin/branch.c:541
+#: builtin/branch.c:544
#, c-format
msgid "Branch %s is being rebased at %s"
msgstr "Клонът „%s“ се пребазира върху „%s“"
-#: builtin/branch.c:545
+#: builtin/branch.c:548
#, c-format
msgid "Branch %s is being bisected at %s"
msgstr "Търси се двоично в клона „%s“ при „%s“"
-#: builtin/branch.c:560
+#: builtin/branch.c:563
msgid "cannot rename the current branch while not on any."
msgstr ""
"не можете да преименувате текущия клон, защото сте извън който и да е клон"
-#: builtin/branch.c:570
+#: builtin/branch.c:573
#, c-format
msgid "Invalid branch name: '%s'"
msgstr "Неправилно име на клон: „%s“"
-#: builtin/branch.c:587
+#: builtin/branch.c:590
msgid "Branch rename failed"
msgstr "Неуспешно преименуване на клон"
-#: builtin/branch.c:591
+#: builtin/branch.c:594
#, c-format
msgid "Renamed a misnamed branch '%s' away"
msgstr "На клона с неправилно име „%s“ е дадено служебно име"
-#: builtin/branch.c:594
+#: builtin/branch.c:597
#, c-format
msgid "Branch renamed to %s, but HEAD is not updated!"
msgstr "Клонът е преименуван на „%s“, но указателят „HEAD“ не е обновен"
-#: builtin/branch.c:601
+#: builtin/branch.c:604
msgid "Branch is renamed, but update of config-file failed"
msgstr "Клонът е преименуван, но конфигурационният файл не е обновен"
-#: builtin/branch.c:623
-msgid "could not write branch description template"
-msgstr "шаблонът за описание на клон не бе записан"
+#: builtin/branch.c:620
+#, c-format
+msgid ""
+"Please edit the description for the branch\n"
+" %s\n"
+"Lines starting with '%c' will be stripped.\n"
+msgstr ""
+"Въведете описание на клона.\n"
+" %s\n"
+"Редовете, които започват с „%c“, ще бъдат пропуснати.\n"
#: builtin/branch.c:651
msgid "Generic options"
@@ -4209,7 +5156,8 @@ msgstr "Общи настройки"
#: builtin/branch.c:653
msgid "show hash and subject, give twice for upstream branch"
msgstr ""
-"извеждане на хеша и темата. Повтарянето на опцията прибавя отдалечените клони"
+"извеждане на хеша и темата. Повтарянето на опцията прибавя отдалечените "
+"клони"
#: builtin/branch.c:654
msgid "suppress informational messages"
@@ -4231,6 +5179,10 @@ msgstr "клон-източник"
msgid "change the upstream info"
msgstr "смяна на клона-източник"
+#: builtin/branch.c:660
+msgid "Unset the upstream info"
+msgstr "без клон-източник"
+
#: builtin/branch.c:661
msgid "use colored output"
msgstr "цветен изход"
@@ -4304,8 +5256,8 @@ msgstr "КЛЮЧ"
msgid "field name to sort on"
msgstr "име на полето, по което да е подредбата"
-#: builtin/branch.c:686 builtin/for-each-ref.c:41 builtin/notes.c:401
-#: builtin/notes.c:404 builtin/notes.c:564 builtin/notes.c:567
+#: builtin/branch.c:686 builtin/for-each-ref.c:41 builtin/notes.c:404
+#: builtin/notes.c:407 builtin/notes.c:567 builtin/notes.c:570
#: builtin/tag.c:369
msgid "object"
msgstr "ОБЕКТ"
@@ -4318,7 +5270,7 @@ msgstr "извеждане само на клоните на ОБЕКТА"
msgid "Failed to resolve HEAD as a valid ref."
msgstr "Не може да се открие към какво сочи указателят „HEAD“"
-#: builtin/branch.c:709 builtin/clone.c:707
+#: builtin/branch.c:709 builtin/clone.c:706
msgid "HEAD not found below refs/heads!"
msgstr "В директорията „refs/heads“ липсва файл „HEAD“"
@@ -4332,7 +5284,7 @@ msgstr "Необходимо е име на клон"
#: builtin/branch.c:758
msgid "Cannot give description to detached HEAD"
-msgstr "Не може да зададете описание на „HEAD“ извън клон"
+msgstr "Не може да зададете описание на несвързан „HEAD“"
#: builtin/branch.c:763
msgid "cannot edit description of more than one branch"
@@ -4402,7 +5354,7 @@ msgid ""
"The --set-upstream flag is deprecated and will be removed. Consider using --"
"track or --set-upstream-to\n"
msgstr ""
-"Опцията „--set-upstream“ вече е остаряла и предстои да бъде махната. "
+"Опцията „--set-upstream“ вече е остаряла и предстои да бъде махната. "
"Използвайте „--track“ или „--set-upstream-to“\n"
#: builtin/branch.c:866
@@ -4429,70 +5381,87 @@ msgstr "За създаването на пратка е необходимо х
msgid "Need a repository to unbundle."
msgstr "За приемането на пратка е необходимо хранилище."
-#: builtin/cat-file.c:428
+#: builtin/cat-file.c:513
msgid ""
-"git cat-file (-t [--allow-unknown-type]|-s [--allow-unknown-type]|-e|-p|"
-"<type>|--textconv) <object>"
+"git cat-file (-t [--allow-unknown-type] | -s [--allow-unknown-type] | -e | -"
+"p | <type> | --textconv | --filters) [--path=<path>] <object>"
msgstr ""
"git cat-file (-t [--allow-unknown-type] | -s [--allow-unknown-type] | -e | -"
-"p | ВИД | --textconv) ОБЕКТ"
+"p | ВИД | --textconv --filters) [--path=ПЪТ] ОБЕКТ"
-#: builtin/cat-file.c:429
-msgid "git cat-file (--batch | --batch-check) [--follow-symlinks]"
-msgstr "git cat-file (--batch | --batch-check) [--follow-symlinks]"
+#: builtin/cat-file.c:514
+msgid ""
+"git cat-file (--batch | --batch-check) [--follow-symlinks] [--textconv | --"
+"filters]"
+msgstr ""
+"git cat-file (--batch | --batch-check) [--follow-symlinks] [--textconv | --"
+"filters]"
-#: builtin/cat-file.c:466
+#: builtin/cat-file.c:551
msgid "<type> can be one of: blob, tree, commit, tag"
msgstr ""
"ВИДът може да е: „blob“ (обект BLOB), „tree“ (дърво), „commit“ (подаване), "
"„tag“ (етикет)"
-#: builtin/cat-file.c:467
+#: builtin/cat-file.c:552
msgid "show object type"
msgstr "извеждане на вида на обект"
-#: builtin/cat-file.c:468
+#: builtin/cat-file.c:553
msgid "show object size"
msgstr "извеждане на размера на обект"
-#: builtin/cat-file.c:470
+#: builtin/cat-file.c:555
msgid "exit with zero when there's no error"
msgstr "изход с 0, когато няма грешка"
-#: builtin/cat-file.c:471
+#: builtin/cat-file.c:556
msgid "pretty-print object's content"
msgstr "форматирано извеждане на съдържанието на обекта"
-#: builtin/cat-file.c:473
+#: builtin/cat-file.c:558
msgid "for blob objects, run textconv on object's content"
msgstr ""
"да се стартира програмата зададена в настройката „textconv“ за преобразуване "
"на съдържанието на обекта BLOB"
-#: builtin/cat-file.c:475
+#: builtin/cat-file.c:560
+msgid "for blob objects, run filters on object's content"
+msgstr ""
+"да се стартират програмите за преобразуване на съдържанието на обектите BLOB"
+
+#: builtin/cat-file.c:561 git-submodule.sh:923
+msgid "blob"
+msgstr "обект BLOB"
+
+#: builtin/cat-file.c:562
+msgid "use a specific path for --textconv/--filters"
+msgstr "опциите „--textconv“/„--filters“ изискват път"
+
+#: builtin/cat-file.c:564
msgid "allow -s and -t to work with broken/corrupt objects"
msgstr "позволяване на опциите „-s“ и „-t“ да работят с повредени обекти"
-#: builtin/cat-file.c:476
+#: builtin/cat-file.c:565
msgid "buffer --batch output"
msgstr "буфериране на изхода от „--batch“"
-#: builtin/cat-file.c:478
+#: builtin/cat-file.c:567
msgid "show info and content of objects fed from the standard input"
msgstr ""
"извеждане на информация и съдържание на обектите подадени на стандартния вход"
-#: builtin/cat-file.c:481
+#: builtin/cat-file.c:570
msgid "show info about objects fed from the standard input"
msgstr "извеждане на информация за обектите подадени на стандартния вход"
-#: builtin/cat-file.c:484
+#: builtin/cat-file.c:573
msgid "follow in-tree symlinks (used with --batch or --batch-check)"
msgstr ""
"следване на символните връзки сочещи в дървото (ползва се с „--batch“ или „--"
"batch-check“)"
-#: builtin/cat-file.c:486
+#: builtin/cat-file.c:575
msgid "show all objects with --batch or --batch-check"
msgstr "извеждане на всички обекти с „--batch“ или „--batch-check“"
@@ -4512,7 +5481,7 @@ msgstr "извеждане на всички атрибути, зададени
msgid "use .gitattributes only from the index"
msgstr "използване на файла „.gitattributes“ само от индекса"
-#: builtin/check-attr.c:21 builtin/check-ignore.c:22 builtin/hash-object.c:97
+#: builtin/check-attr.c:21 builtin/check-ignore.c:22 builtin/hash-object.c:98
msgid "read file names from stdin"
msgstr "изчитане на имената на файловете от стандартния вход"
@@ -4520,7 +5489,7 @@ msgstr "изчитане на имената на файловете от ста
msgid "terminate input and output records by a NUL character"
msgstr "разделяне на входните и изходните записи с нулевия знак „NUL“"
-#: builtin/check-ignore.c:18 builtin/checkout.c:1135 builtin/gc.c:325
+#: builtin/check-ignore.c:18 builtin/checkout.c:1137 builtin/gc.c:325
msgid "suppress progress reporting"
msgstr "без показване на напредъка"
@@ -4610,9 +5579,9 @@ msgid "write the content to temporary files"
msgstr "записване на съдържанието във временни файлове"
#: builtin/checkout-index.c:174 builtin/column.c:30
-#: builtin/submodule--helper.c:491 builtin/submodule--helper.c:494
-#: builtin/submodule--helper.c:497 builtin/submodule--helper.c:500
-#: builtin/submodule--helper.c:774
+#: builtin/submodule--helper.c:595 builtin/submodule--helper.c:598
+#: builtin/submodule--helper.c:604 builtin/submodule--helper.c:951
+#: builtin/worktree.c:469
msgid "string"
msgstr "НИЗ"
@@ -4679,63 +5648,59 @@ msgid "Cannot update paths and switch to branch '%s' at the same time."
msgstr ""
"Невъзможно е едновременно да обновявате пътища и да преминете към клона „%s“."
-#: builtin/checkout.c:279 builtin/checkout.c:473
-msgid "corrupt index file"
-msgstr "повреден файл на индекса"
-
#: builtin/checkout.c:339 builtin/checkout.c:346
#, c-format
msgid "path '%s' is unmerged"
msgstr "пътят „%s“ не е слят"
-#: builtin/checkout.c:495
+#: builtin/checkout.c:494
msgid "you need to resolve your current index first"
msgstr "първо трябва да коригирате индекса си"
-#: builtin/checkout.c:622
+#: builtin/checkout.c:624
#, c-format
msgid "Can not do reflog for '%s': %s\n"
msgstr "Журналът на указателите за „%s“ не може да се проследи: %s\n"
-#: builtin/checkout.c:660
+#: builtin/checkout.c:663
msgid "HEAD is now at"
msgstr "Указателят „HEAD“ в момента сочи към"
-#: builtin/checkout.c:664 builtin/clone.c:661
+#: builtin/checkout.c:667 builtin/clone.c:660
msgid "unable to update HEAD"
msgstr "Указателят „HEAD“ не може да бъде обновен"
-#: builtin/checkout.c:668
+#: builtin/checkout.c:671
#, c-format
msgid "Reset branch '%s'\n"
msgstr "Зануляване на клона „%s“\n"
-#: builtin/checkout.c:671
+#: builtin/checkout.c:674
#, c-format
msgid "Already on '%s'\n"
msgstr "Вече сте на „%s“\n"
-#: builtin/checkout.c:675
+#: builtin/checkout.c:678
#, c-format
msgid "Switched to and reset branch '%s'\n"
msgstr "Преминаване към клона „%s“ и зануляване на промените\n"
-#: builtin/checkout.c:677 builtin/checkout.c:1067
+#: builtin/checkout.c:680 builtin/checkout.c:1069
#, c-format
msgid "Switched to a new branch '%s'\n"
msgstr "Преминахте към новия клон „%s“\n"
-#: builtin/checkout.c:679
+#: builtin/checkout.c:682
#, c-format
msgid "Switched to branch '%s'\n"
msgstr "Преминахте към клона „%s“\n"
-#: builtin/checkout.c:731
+#: builtin/checkout.c:733
#, c-format
msgid " ... and %d more.\n"
msgstr "… и още %d.\n"
-#: builtin/checkout.c:737
+#: builtin/checkout.c:739
#, c-format
msgid ""
"Warning: you are leaving %d commit behind, not connected to\n"
@@ -4757,7 +5722,7 @@ msgstr[1] ""
"\n"
"%s\n"
-#: builtin/checkout.c:756
+#: builtin/checkout.c:758
#, c-format
msgid ""
"If you want to keep it by creating a new branch, this may be a good time\n"
@@ -4784,154 +5749,154 @@ msgstr[1] ""
" git branch ИМЕ_НА_НОВИЯ_КЛОН %s\n"
"\n"
-#: builtin/checkout.c:792
+#: builtin/checkout.c:794
msgid "internal error in revision walk"
msgstr "вътрешна грешка при обхождането на версиите"
-#: builtin/checkout.c:796
+#: builtin/checkout.c:798
msgid "Previous HEAD position was"
msgstr "Преди това „HEAD“ сочеше към"
-#: builtin/checkout.c:823 builtin/checkout.c:1062
+#: builtin/checkout.c:825 builtin/checkout.c:1064
msgid "You are on a branch yet to be born"
msgstr "В момента сте на клон, който предстои да бъде създаден"
-#: builtin/checkout.c:968
+#: builtin/checkout.c:970
#, c-format
msgid "only one reference expected, %d given."
msgstr "очакваше се един указател, а сте подали %d."
-#: builtin/checkout.c:1008 builtin/worktree.c:212
+#: builtin/checkout.c:1010 builtin/worktree.c:214
#, c-format
msgid "invalid reference: %s"
msgstr "неправилен указател: %s"
-#: builtin/checkout.c:1037
+#: builtin/checkout.c:1039
#, c-format
msgid "reference is not a tree: %s"
msgstr "указателят не сочи към обект-дърво: %s"
-#: builtin/checkout.c:1076
+#: builtin/checkout.c:1078
msgid "paths cannot be used with switching branches"
msgstr "задаването на път е несъвместимо с преминаването от един клон към друг"
-#: builtin/checkout.c:1079 builtin/checkout.c:1083
+#: builtin/checkout.c:1081 builtin/checkout.c:1085
#, c-format
msgid "'%s' cannot be used with switching branches"
msgstr "опцията „%s“ е несъвместима с преминаването от един клон към друг"
-#: builtin/checkout.c:1087 builtin/checkout.c:1090 builtin/checkout.c:1095
-#: builtin/checkout.c:1098
+#: builtin/checkout.c:1089 builtin/checkout.c:1092 builtin/checkout.c:1097
+#: builtin/checkout.c:1100
#, c-format
msgid "'%s' cannot be used with '%s'"
msgstr "опцията „%s“ е несъвместима с „%s“"
-#: builtin/checkout.c:1103
+#: builtin/checkout.c:1105
#, c-format
msgid "Cannot switch branch to a non-commit '%s'"
msgstr ""
-"За да преминете към клон, подайте указател, който сочи към подаване. „%s“ не "
-"е такъв"
+"За да преминете към клон, подайте указател, който сочи към подаване. „%s“ "
+"не е такъв"
-#: builtin/checkout.c:1136 builtin/checkout.c:1138 builtin/clone.c:88
-#: builtin/remote.c:165 builtin/remote.c:167 builtin/worktree.c:323
-#: builtin/worktree.c:325
+#: builtin/checkout.c:1138 builtin/checkout.c:1140 builtin/clone.c:93
+#: builtin/remote.c:165 builtin/remote.c:167 builtin/worktree.c:324
+#: builtin/worktree.c:326
msgid "branch"
msgstr "клон"
-#: builtin/checkout.c:1137
+#: builtin/checkout.c:1139
msgid "create and checkout a new branch"
msgstr "създаване и преминаване към нов клон"
-#: builtin/checkout.c:1139
+#: builtin/checkout.c:1141
msgid "create/reset and checkout a branch"
msgstr "създаване/зануляване на клон и преминаване към него"
-#: builtin/checkout.c:1140
+#: builtin/checkout.c:1142
msgid "create reflog for new branch"
msgstr "създаване на журнал на указателите за нов клон"
-#: builtin/checkout.c:1141
-msgid "detach the HEAD at named commit"
+#: builtin/checkout.c:1143 builtin/worktree.c:328
+msgid "detach HEAD at named commit"
msgstr "отделяне на указателя „HEAD“ към указаното подаване"
-#: builtin/checkout.c:1142
+#: builtin/checkout.c:1144
msgid "set upstream info for new branch"
msgstr "задаване на кой клон бива следен при създаването на новия клон"
-#: builtin/checkout.c:1144
+#: builtin/checkout.c:1146
msgid "new-branch"
msgstr "НОВ_КЛОН"
-#: builtin/checkout.c:1144
+#: builtin/checkout.c:1146
msgid "new unparented branch"
msgstr "нов клон без родител"
-#: builtin/checkout.c:1145
+#: builtin/checkout.c:1147
msgid "checkout our version for unmerged files"
msgstr "изтегляне на вашата версия на неслетите файлове"
-#: builtin/checkout.c:1147
+#: builtin/checkout.c:1149
msgid "checkout their version for unmerged files"
msgstr "изтегляне на чуждата версия на неслетите файлове"
-#: builtin/checkout.c:1149
+#: builtin/checkout.c:1151
msgid "force checkout (throw away local modifications)"
msgstr "принудително изтегляне (вашите промени ще бъдат занулени)"
-#: builtin/checkout.c:1150
+#: builtin/checkout.c:1152
msgid "perform a 3-way merge with the new branch"
msgstr "извършване на тройно сливане с новия клон"
-#: builtin/checkout.c:1151 builtin/merge.c:230
+#: builtin/checkout.c:1153 builtin/merge.c:231
msgid "update ignored files (default)"
msgstr "обновяване на игнорираните файлове (стандартно)"
-#: builtin/checkout.c:1152 builtin/log.c:1432 parse-options.h:250
+#: builtin/checkout.c:1154 builtin/log.c:1466 parse-options.h:251
msgid "style"
msgstr "СТИЛ"
-#: builtin/checkout.c:1153
+#: builtin/checkout.c:1155
msgid "conflict style (merge or diff3)"
msgstr "действие при конфликт (сливане или тройна разлика)"
-#: builtin/checkout.c:1156
+#: builtin/checkout.c:1158
msgid "do not limit pathspecs to sparse entries only"
msgstr "без ограничаване на изброените пътища само до частично изтеглените"
-#: builtin/checkout.c:1158
+#: builtin/checkout.c:1160
msgid "second guess 'git checkout <no-such-branch>'"
msgstr ""
"опит за отгатване на име на клон след неуспешен опит с „git checkout "
"НЕСЪЩЕСТВУВАЩ_КЛОН“"
-#: builtin/checkout.c:1160
+#: builtin/checkout.c:1162
msgid "do not check if another worktree is holding the given ref"
msgstr "без проверка дали друго работно дърво държи указателя"
-#: builtin/checkout.c:1161 builtin/clone.c:60 builtin/fetch.c:116
-#: builtin/merge.c:227 builtin/pull.c:116 builtin/push.c:526
+#: builtin/checkout.c:1163 builtin/clone.c:63 builtin/fetch.c:119
+#: builtin/merge.c:228 builtin/pull.c:117 builtin/push.c:536
#: builtin/send-pack.c:168
msgid "force progress reporting"
msgstr "извеждане на напредъка"
-#: builtin/checkout.c:1192
+#: builtin/checkout.c:1194
msgid "-b, -B and --orphan are mutually exclusive"
msgstr "Опциите „-b“, „-B“ и „--orphan“ са несъвместими една с друга"
-#: builtin/checkout.c:1209
+#: builtin/checkout.c:1211
msgid "--track needs a branch name"
msgstr "опцията „--track“ изисква име на клон"
-#: builtin/checkout.c:1214
+#: builtin/checkout.c:1216
msgid "Missing branch name; try -b"
msgstr "Липсва име на клон, използвайте опцията „-b“"
-#: builtin/checkout.c:1250
+#: builtin/checkout.c:1252
msgid "invalid path specification"
msgstr "указан е неправилен път"
-#: builtin/checkout.c:1257
+#: builtin/checkout.c:1259
#, c-format
msgid ""
"Cannot update paths and switch to branch '%s' at the same time.\n"
@@ -4940,12 +5905,12 @@ msgstr ""
"Не можете едновременно да обновявате пътища и да преминете към клона „%s“.\n"
"Дали не искате да изтеглите „%s“, който не сочи към подаване?"
-#: builtin/checkout.c:1262
+#: builtin/checkout.c:1264
#, c-format
msgid "git checkout: --detach does not take a path argument '%s'"
msgstr "git checkout: опцията „--detach“ не приема аргумент-път „%s“"
-#: builtin/checkout.c:1266
+#: builtin/checkout.c:1268
msgid ""
"git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
"checking out of the index."
@@ -5008,8 +5973,8 @@ msgid ""
msgstr ""
"Подсказка:\n"
"1 — избор на един обект\n"
-"3-5 — интервал за избор на обекти\n"
-"2-3,6-9 — множество интервали за избор на обекти\n"
+"3-5 — диапазон за избор на обекти\n"
+"2-3,6-9 — множество диапазон за избор на обекти\n"
"ПРЕФИКС — избор на единствен обект по този уникален префикс\n"
"-… — отмяна на избора на обекти\n"
"* — избиране на всички обекти\n"
@@ -5018,9 +5983,8 @@ msgstr ""
#: builtin/clean.c:511
#, c-format
msgid "Huh (%s)?"
-msgstr "Неправилен избор (%s). Изберете отново."
+msgstr "Неправилен избор (%s). Изберете отново."
-# FIXME - should we use >> or sth else
#: builtin/clean.c:653
#, c-format
msgid "Input ignore patterns>> "
@@ -5041,7 +6005,7 @@ msgstr "Избиране на обекти за изтриване"
msgid "Remove %s [y/N]? "
msgstr "Да се изтрие ли „%s“? „y“ — да, „N“ — НЕ"
-# FIXME improve message
+#
#: builtin/clean.c:777
msgid "Bye."
msgstr "Изход."
@@ -5068,7 +6032,6 @@ msgstr ""
msgid "*** Commands ***"
msgstr "●●● Команди ●●●"
-# FIXME improve message
#: builtin/clean.c:813
msgid "What now"
msgstr "Избор на следващо действие"
@@ -5081,7 +6044,7 @@ msgstr[1] "Следните обекти ще бъдат изтрити:"
#: builtin/clean.c:838
msgid "No more files to clean, exiting."
-msgstr "Файловете за изчистване свършиха. Изход от програмата."
+msgstr "Файловете за изчистване свършиха. Изход от програмата."
#: builtin/clean.c:869
msgid "do not print names of files removed"
@@ -5099,8 +6062,8 @@ msgstr "интерактивно изтриване"
msgid "remove whole directories"
msgstr "изтриване на цели директории"
-#: builtin/clean.c:875 builtin/describe.c:407 builtin/grep.c:724
-#: builtin/ls-files.c:456 builtin/name-rev.c:314 builtin/show-ref.c:182
+#: builtin/clean.c:875 builtin/describe.c:407 builtin/grep.c:725
+#: builtin/ls-files.c:536 builtin/name-rev.c:313 builtin/show-ref.c:182
msgid "pattern"
msgstr "ШАБЛОН"
@@ -5126,7 +6089,7 @@ msgid ""
"clean"
msgstr ""
"Настройката „clean.requireForce“ е зададена като истина, което изисква някоя "
-"от опциите „-i“, „-n“ или „-f“. Няма да се извърши изчистване"
+"от опциите „-i“, „-n“ или „-f“. Няма да се извърши изчистване"
#: builtin/clean.c:904
msgid ""
@@ -5134,122 +6097,139 @@ msgid ""
"refusing to clean"
msgstr ""
"Настройката „clean.requireForce“ не е зададена, но стандартно е истина, "
-"което изисква някоя от опциите „-i“, „-n“ или „-f“. Няма да се извърши "
+"което изисква някоя от опциите „-i“, „-n“ или „-f“. Няма да се извърши "
"изчистване"
#: builtin/clone.c:37
msgid "git clone [<options>] [--] <repo> [<dir>]"
msgstr "git clone [ОПЦИЯ…] [--] ХРАНИЛИЩЕ [ДИРЕКТОРИЯ]"
-#: builtin/clone.c:62
+#: builtin/clone.c:65
msgid "don't create a checkout"
msgstr "без създаване на работно дърво"
-#: builtin/clone.c:63 builtin/clone.c:65 builtin/init-db.c:473
+#: builtin/clone.c:66 builtin/clone.c:68 builtin/init-db.c:478
msgid "create a bare repository"
msgstr "създаване на голо хранилище"
-#: builtin/clone.c:67
+#: builtin/clone.c:70
msgid "create a mirror repository (implies bare)"
msgstr ""
"създаване на хранилище-огледало (включва опцията „--bare“ за голо хранилище)"
-#: builtin/clone.c:69
+#: builtin/clone.c:72
msgid "to clone from a local repository"
msgstr "клониране от локално хранилище"
-#: builtin/clone.c:71
+#: builtin/clone.c:74
msgid "don't use local hardlinks, always copy"
msgstr "без твърди връзки, файловете винаги да се копират"
-#: builtin/clone.c:73
+#: builtin/clone.c:76
msgid "setup as shared repository"
msgstr "настройване за споделено хранилище"
-#: builtin/clone.c:75 builtin/clone.c:77
+#: builtin/clone.c:78 builtin/clone.c:80
msgid "initialize submodules in the clone"
msgstr "инициализиране на подмодулите при това клониране"
-#: builtin/clone.c:79
+#: builtin/clone.c:82
msgid "number of submodules cloned in parallel"
msgstr "брой подмодули, клонирани паралелно"
-#: builtin/clone.c:80 builtin/init-db.c:470
+#: builtin/clone.c:83 builtin/init-db.c:475
msgid "template-directory"
msgstr "директория с шаблони"
-#: builtin/clone.c:81 builtin/init-db.c:471
+#: builtin/clone.c:84 builtin/init-db.c:476
msgid "directory from which templates will be used"
msgstr "директория, която съдържа шаблоните, които да се ползват"
-#: builtin/clone.c:83 builtin/submodule--helper.c:498
-#: builtin/submodule--helper.c:777
+#: builtin/clone.c:86 builtin/clone.c:88 builtin/submodule--helper.c:602
+#: builtin/submodule--helper.c:954
msgid "reference repository"
msgstr "еталонно хранилище"
-#: builtin/clone.c:85
+#: builtin/clone.c:90
msgid "use --reference only while cloning"
msgstr "опцията „--reference“ може да се използва само при клониране"
-#: builtin/clone.c:86 builtin/column.c:26 builtin/merge-file.c:44
+#: builtin/clone.c:91 builtin/column.c:26 builtin/merge-file.c:44
msgid "name"
msgstr "ИМЕ"
-#: builtin/clone.c:87
+#: builtin/clone.c:92
msgid "use <name> instead of 'origin' to track upstream"
msgstr "използване на това ИМЕ вместо „origin“ при проследяване на клони"
-#: builtin/clone.c:89
+#: builtin/clone.c:94
msgid "checkout <branch> instead of the remote's HEAD"
msgstr "изтегляне на този КЛОН, а не соченият от отдалечения указател „HEAD“"
-#: builtin/clone.c:91
+#: builtin/clone.c:96
msgid "path to git-upload-pack on the remote"
msgstr "път към командата „git-upload-pack“ на отдалеченото хранилище"
-#: builtin/clone.c:92 builtin/fetch.c:117 builtin/grep.c:667 builtin/pull.c:201
+#: builtin/clone.c:97 builtin/fetch.c:120 builtin/grep.c:668 builtin/pull.c:202
msgid "depth"
msgstr "ДЪЛБОЧИНА"
-#: builtin/clone.c:93
+#: builtin/clone.c:98
msgid "create a shallow clone of that depth"
msgstr "плитко клониране до тази ДЪЛБОЧИНА"
-#: builtin/clone.c:95
+#: builtin/clone.c:99 builtin/fetch.c:122 builtin/pack-objects.c:2848
+#: parse-options.h:142
+msgid "time"
+msgstr "ВРЕМЕ"
+
+#: builtin/clone.c:100
+msgid "create a shallow clone since a specific time"
+msgstr "плитко клониране до момент във времето"
+
+#: builtin/clone.c:101 builtin/fetch.c:124
+msgid "revision"
+msgstr "версия"
+
+#: builtin/clone.c:102 builtin/fetch.c:125
+msgid "deepen history of shallow clone by excluding rev"
+msgstr "задълбочаване на историята на плитко хранилище до изключващ указател"
+
+#: builtin/clone.c:104
msgid "clone only one branch, HEAD or --branch"
msgstr ""
"клониране само на един клон — или сочения от отдалечения „HEAD“, или изрично "
"зададения с „--branch“"
-#: builtin/clone.c:97
+#: builtin/clone.c:106
msgid "any cloned submodules will be shallow"
msgstr "всички клонирани подмодули ще са плитки"
-#: builtin/clone.c:98 builtin/init-db.c:479
+#: builtin/clone.c:107 builtin/init-db.c:484
msgid "gitdir"
msgstr "СЛУЖЕБНА_ДИРЕКТОРИЯ"
-#: builtin/clone.c:99 builtin/init-db.c:480
+#: builtin/clone.c:108 builtin/init-db.c:485
msgid "separate git dir from working tree"
msgstr "отделна СЛУЖЕБНА_ДИРЕКТОРИЯ за git извън работното дърво"
-#: builtin/clone.c:100
+#: builtin/clone.c:109
msgid "key=value"
msgstr "КЛЮЧ=СТОЙНОСТ"
-#: builtin/clone.c:101
+#: builtin/clone.c:110
msgid "set config inside the new repository"
msgstr "задаване на настройките на новото хранилище"
-#: builtin/clone.c:102 builtin/fetch.c:131 builtin/push.c:536
+#: builtin/clone.c:111 builtin/fetch.c:140 builtin/push.c:547
msgid "use IPv4 addresses only"
msgstr "само адреси IPv4"
-#: builtin/clone.c:104 builtin/fetch.c:133 builtin/push.c:538
+#: builtin/clone.c:113 builtin/fetch.c:142 builtin/push.c:549
msgid "use IPv6 addresses only"
msgstr "само адреси IPv6"
-#: builtin/clone.c:241
+#: builtin/clone.c:250
msgid ""
"No directory name could be guessed.\n"
"Please specify a directory on the command line"
@@ -5257,190 +6237,195 @@ msgstr ""
"Името на директорията не може да бъде отгатнато.\n"
"Задайте директорията изрично на командния ред"
-#: builtin/clone.c:307
-#, c-format
-msgid "reference repository '%s' as a linked checkout is not supported yet."
-msgstr "все още не се поддържа еталонно хранилище „%s“ като свързано."
-
-#: builtin/clone.c:309
-#, c-format
-msgid "reference repository '%s' is not a local repository."
-msgstr "еталонното хранилище „%s“ не е локално"
-
-#: builtin/clone.c:314
+#: builtin/clone.c:303
#, c-format
-msgid "reference repository '%s' is shallow"
-msgstr "еталонното хранилище „%s“ е плитко"
+msgid "info: Could not add alternate for '%s': %s\n"
+msgstr ""
+"ПРЕДУПРЕЖДЕНИЕ: не може да се добави алтернативен източник на „%s“: %s\n"
-#: builtin/clone.c:317
+#: builtin/clone.c:375
#, c-format
-msgid "reference repository '%s' is grafted"
-msgstr "еталонното хранилище „%s“ е с присаждане"
+msgid "failed to open '%s'"
+msgstr "директорията „%s“ не може да бъде отворена"
-#: builtin/clone.c:384
+#: builtin/clone.c:383
#, c-format
msgid "%s exists and is not a directory"
msgstr "„%s“ съществува и не е директория"
-#: builtin/clone.c:398
+#: builtin/clone.c:397
#, c-format
msgid "failed to stat %s\n"
msgstr "не може да бъде получена информация чрез „stat“ за „%s“\n"
-#: builtin/clone.c:420
+#: builtin/clone.c:419
#, c-format
msgid "failed to create link '%s'"
msgstr "връзката „%s“ не може да бъде създадена"
-#: builtin/clone.c:424
+#: builtin/clone.c:423
#, c-format
msgid "failed to copy file to '%s'"
msgstr "файлът не може да бъде копиран като „%s“"
-#: builtin/clone.c:449 builtin/clone.c:633
+#: builtin/clone.c:448
#, c-format
msgid "done.\n"
msgstr "действието завърши.\n"
-#: builtin/clone.c:461
+#: builtin/clone.c:460
msgid ""
"Clone succeeded, but checkout failed.\n"
"You can inspect what was checked out with 'git status'\n"
"and retry the checkout with 'git checkout -f HEAD'\n"
msgstr ""
"Клонирането бе успешно за разлика от подготовката на работното дърво\n"
-"за определен клон. Все пак можете да проверите кои файлове и от кой\n"
-"клон в момента са изтеглени с командата „git status“. Можете да\n"
+"за определен клон. Все пак можете да проверите кои файлове и от кой\n"
+"клон в момента са изтеглени с командата „git status“. Можете да\n"
"завършите изтеглянето на клона с командата „git checkout -f HEAD“.\n"
-#: builtin/clone.c:538
+#: builtin/clone.c:537
#, c-format
msgid "Could not find remote branch %s to clone."
msgstr ""
"Клонът „%s“ от отдалеченото хранилище, което клонирате,\n"
"и който следва да бъде изтеглен, не съществува."
-# FIXME translator note that the space at end is necesssary
-#: builtin/clone.c:628
-#, c-format
-msgid "Checking connectivity... "
-msgstr "Проверка на връзката… "
-
-#: builtin/clone.c:631
+#: builtin/clone.c:632
msgid "remote did not send all necessary objects"
msgstr "отдалеченото хранилище не изпрати всички необходими обекти."
# FIXME merge with next?
-#: builtin/clone.c:649
+#: builtin/clone.c:648
#, c-format
msgid "unable to update %s"
msgstr "обектът „%s“ не може да бъде обновен"
-#: builtin/clone.c:698
+#: builtin/clone.c:697
msgid "remote HEAD refers to nonexistent ref, unable to checkout.\n"
msgstr ""
"указателят „HEAD“ от отдалеченото хранилище сочи към нещо,\n"
-"което не съществува. Не може да се изтегли определен клон.\n"
+"което не съществува. Не може да се изтегли определен клон.\n"
-#: builtin/clone.c:729
+#: builtin/clone.c:728
msgid "unable to checkout working tree"
msgstr "работното дърво не може да бъде подготвено"
-#: builtin/clone.c:767
+#: builtin/clone.c:768
msgid "unable to write parameters to config file"
msgstr "настройките не могат да бъдат записани в конфигурационния файл"
-#: builtin/clone.c:830
+#: builtin/clone.c:831
msgid "cannot repack to clean up"
msgstr "не може да се извърши пакетиране за изчистване на файловете"
-#: builtin/clone.c:832
+#: builtin/clone.c:833
msgid "cannot unlink temporary alternates file"
msgstr "временният файл за алтернативни обекти не може да бъде изтрит"
-#: builtin/clone.c:864 builtin/receive-pack.c:1731
+#: builtin/clone.c:866 builtin/receive-pack.c:1895
msgid "Too many arguments."
msgstr "Прекалено много аргументи."
-#: builtin/clone.c:868
+#: builtin/clone.c:870
msgid "You must specify a repository to clone."
msgstr "Трябва да укажете кое хранилище искате да клонирате."
-#: builtin/clone.c:879
+#: builtin/clone.c:883
#, c-format
msgid "--bare and --origin %s options are incompatible."
msgstr "опциите „--bare“ и „--origin %s“ са несъвместими."
-#: builtin/clone.c:882
+#: builtin/clone.c:886
msgid "--bare and --separate-git-dir are incompatible."
msgstr "опциите „--bare“ и „--separate-git-dir“ са несъвместими."
-#: builtin/clone.c:895
+#: builtin/clone.c:899
#, c-format
msgid "repository '%s' does not exist"
msgstr "не съществува хранилище „%s“"
-#: builtin/clone.c:901 builtin/fetch.c:1174
+#: builtin/clone.c:905 builtin/fetch.c:1338
#, c-format
msgid "depth %s is not a positive number"
msgstr "дълбочината трябва да е положително цяло число, а не „%s“"
-#: builtin/clone.c:911
+#: builtin/clone.c:915
#, c-format
msgid "destination path '%s' already exists and is not an empty directory."
msgstr "целевият път „%s“ съществува и не е празна директория."
-#: builtin/clone.c:921
+#: builtin/clone.c:925
#, c-format
msgid "working tree '%s' already exists."
msgstr "в „%s“ вече съществува работно дърво."
-#: builtin/clone.c:936 builtin/clone.c:947 builtin/submodule--helper.c:547
-#: builtin/worktree.c:220 builtin/worktree.c:247
+#: builtin/clone.c:940 builtin/clone.c:951 builtin/submodule--helper.c:657
+#: builtin/worktree.c:222 builtin/worktree.c:249
#, c-format
msgid "could not create leading directories of '%s'"
msgstr "родителските директории на „%s“ не могат да бъдат създадени"
-#: builtin/clone.c:939
+#: builtin/clone.c:943
#, c-format
msgid "could not create work tree dir '%s'"
msgstr "работното дърво в „%s“ не може да бъде създадено."
-#: builtin/clone.c:957
+#: builtin/clone.c:955
#, c-format
msgid "Cloning into bare repository '%s'...\n"
msgstr "Клониране и създаване на голо хранилище в „%s“…\n"
-#: builtin/clone.c:959
+#: builtin/clone.c:957
#, c-format
msgid "Cloning into '%s'...\n"
msgstr "Клониране и създаване на хранилище в „%s“…\n"
-#: builtin/clone.c:998
+#: builtin/clone.c:963
+msgid ""
+"clone --recursive is not compatible with both --reference and --reference-if-"
+"able"
+msgstr ""
+"Опцията „--recursive“ е несъвместима с опциите „--reference“ и „--reference-"
+"if-able“"
+
+#: builtin/clone.c:1019
msgid "--depth is ignored in local clones; use file:// instead."
msgstr ""
-"При локално клониране опцията „--depth“ се игнорира. Ползвайте схемата "
+"При локално клониране опцията „--depth“ се прескача. Ползвайте схемата "
"„file://“."
-#: builtin/clone.c:1001
+#: builtin/clone.c:1021
+msgid "--shallow-since is ignored in local clones; use file:// instead."
+msgstr ""
+"При локално клониране опцията „--shallow-since“ се прескача. Ползвайте "
+"схемата „file://“."
+
+#: builtin/clone.c:1023
+msgid "--shallow-exclude is ignored in local clones; use file:// instead."
+msgstr ""
+"При локално клониране опцията „--shallow-exclude“ се прескача. Ползвайте "
+"схемата „file://“."
+
+#: builtin/clone.c:1026
msgid "source repository is shallow, ignoring --local"
-msgstr "клонираното хранилище е плитко, затова опцията „--local“ се игнорира"
+msgstr "клонираното хранилище е плитко, затова опцията „--local“ се прескача"
-#: builtin/clone.c:1006
+#: builtin/clone.c:1031
msgid "--local is ignored"
-msgstr "опцията „--local“ се игнорира"
+msgstr "опцията „--local“ се прескача"
-#: builtin/clone.c:1010
+#: builtin/clone.c:1035
#, c-format
msgid "Don't know how to clone %s"
msgstr "Не се поддържа клониране на връзки от вида „%s“ "
-#: builtin/clone.c:1059 builtin/clone.c:1067
+#: builtin/clone.c:1090 builtin/clone.c:1098
#, c-format
msgid "Remote branch %s not found in upstream %s"
msgstr "Отдалеченият клон „%s“ липсва в клонираното хранилище „%s“"
-#: builtin/clone.c:1070
+#: builtin/clone.c:1101
msgid "You appear to have cloned an empty repository."
msgstr "Изглежда клонирахте празно хранилище."
@@ -5499,8 +6484,8 @@ msgid ""
" git commit --amend --reset-author\n"
msgstr ""
"Името и адресът за е-поща са настроени автоматично на базата на името на\n"
-"потребителя и името на машината. Проверете дали са верни. Можете да спрете\n"
-"това съобщение като изрично зададете стойностите. Изпълнете следната "
+"потребителя и името на машината. Проверете дали са верни. Можете да спрете\n"
+"това съобщение като изрично зададете стойностите. Изпълнете следната "
"команда\n"
"и следвайте инструкциите в текстовия ви редактор, за да редактирате\n"
"конфигурационния файл:\n"
@@ -5526,7 +6511,7 @@ msgid ""
" git commit --amend --reset-author\n"
msgstr ""
"Името и адресът за е-поща са настроени автоматично на базата на името на\n"
-"потребителя и името на машината. Проверете дали са верни. Можете да спрете\n"
+"потребителя и името на машината. Проверете дали са верни. Можете да спрете\n"
"това съобщение като изрично зададете стойностите:\n"
"\n"
" git config --global user.name \"Вашето Име\"\n"
@@ -5543,8 +6528,8 @@ msgid ""
"it empty. You can repeat your command with --allow-empty, or you can\n"
"remove the commit entirely with \"git reset HEAD^\".\n"
msgstr ""
-"Поискахте да поправите последното си подаване. Това действие ще превърне\n"
-"подаването в празно. Можете или да го повторите като разрешите такива "
+"Поискахте да поправите последното си подаване. Това действие ще превърне\n"
+"подаването в празно. Можете или да го повторите като разрешите такива "
"подавания\n"
"с опцията „--allow-empty“, или да го изтриете от историята с командата:\n"
"„git reset HEAD^“.\n"
@@ -5558,7 +6543,7 @@ msgid ""
"\n"
msgstr ""
"Предишното отбрано подаване вече е празно, като най-вероятната причина е\n"
-"корекция на конфликт. Ако все пак искате да го ползвате, използвайте "
+"корекция на конфликт. Ако все пак искате да го ползвате, използвайте "
"командата:\n"
"\n"
" git commit --allow-empty\n"
@@ -5584,43 +6569,43 @@ msgstr ""
"Чрез командата „git cherry-pick --continue“ ще продължите отбирането на\n"
"останалите подавания.\n"
-#: builtin/commit.c:307
+#: builtin/commit.c:318
msgid "failed to unpack HEAD tree object"
msgstr "върховото дърво (HEAD tree object) не може да бъде извадено от пакет"
-#: builtin/commit.c:348
+#: builtin/commit.c:359
msgid "unable to create temporary index"
msgstr "временният индекс не може да бъде създаден"
-#: builtin/commit.c:354
+#: builtin/commit.c:365
msgid "interactive add failed"
msgstr "неуспешно интерактивно добавяне"
-#: builtin/commit.c:367
+#: builtin/commit.c:378
msgid "unable to update temporary index"
msgstr "временният индекс не може да бъде обновен"
-#: builtin/commit.c:369
+#: builtin/commit.c:380
msgid "Failed to update main cache tree"
msgstr "Дървото на основния кеш не може да бъде обновено"
-#: builtin/commit.c:393 builtin/commit.c:416 builtin/commit.c:465
+#: builtin/commit.c:404 builtin/commit.c:427 builtin/commit.c:476
msgid "unable to write new_index file"
msgstr "новият индекс не може да бъде записан"
-#: builtin/commit.c:447
+#: builtin/commit.c:458
msgid "cannot do a partial commit during a merge."
msgstr "по време на сливане не може да се извърши частично подаване."
-#: builtin/commit.c:449
+#: builtin/commit.c:460
msgid "cannot do a partial commit during a cherry-pick."
msgstr "по време на отбиране не може да се извърши частично подаване."
-#: builtin/commit.c:458
+#: builtin/commit.c:469
msgid "cannot read the index"
msgstr "индексът не може да бъде прочетен"
-#: builtin/commit.c:477
+#: builtin/commit.c:488
msgid "unable to write temporary index file"
msgstr "временният индекс не може да бъде записан"
@@ -5651,12 +6636,12 @@ msgstr ""
"не може да се избере знак за коментар — в текущото съобщение за подаване са "
"използвани всички подобни знаци"
-#: builtin/commit.c:692 builtin/commit.c:725 builtin/commit.c:1091
+#: builtin/commit.c:692 builtin/commit.c:725 builtin/commit.c:1096
#, c-format
msgid "could not lookup commit %s"
msgstr "следното подаване не може да бъде открито: %s"
-#: builtin/commit.c:704 builtin/shortlog.c:285
+#: builtin/commit.c:704 builtin/shortlog.c:286
#, c-format
msgid "(reading log message from standard input)\n"
msgstr "(изчитане на съобщението за подаване от стандартния вход)\n"
@@ -5682,7 +6667,6 @@ msgstr "съобщението за сливане MERGE_MSG не може да
msgid "could not write commit template"
msgstr "шаблонът за подаване не може да бъде запазен"
-# FIXME
#: builtin/commit.c:814
#, c-format
msgid ""
@@ -5693,12 +6677,11 @@ msgid ""
"and try again.\n"
msgstr ""
"\n"
-"Изглежда, че подавате сливане. Ако това не е така, изтрийте файла:\n"
+"Изглежда, че подавате сливане. Ако това не е така, изтрийте файла:\n"
"\n"
" %s\n"
"и опитайте отново.\n"
-# FIXME
#: builtin/commit.c:819
#, c-format
msgid ""
@@ -5709,7 +6692,7 @@ msgid ""
"and try again.\n"
msgstr ""
"\n"
-"Изглежда, че извършвате отбрано подаване. Ако това не е така, изтрийте "
+"Изглежда, че извършвате отбрано подаване. Ако това не е така, изтрийте "
"файла:\n"
"\n"
" %s\n"
@@ -5721,7 +6704,7 @@ msgid ""
"Please enter the commit message for your changes. Lines starting\n"
"with '%c' will be ignored, and an empty message aborts the commit.\n"
msgstr ""
-"Въведете съобщението за подаване на промените. Редовете, които започват\n"
+"Въведете съобщението за подаване на промените. Редовете, които започват\n"
"с „%c“, ще бъдат пропуснати, а празно съобщение преустановява подаването.\n"
#: builtin/commit.c:839
@@ -5731,8 +6714,8 @@ msgid ""
"with '%c' will be kept; you may remove them yourself if you want to.\n"
"An empty message aborts the commit.\n"
msgstr ""
-"Въведете съобщението за подаване на промените. Редовете, които започват\n"
-"с „%c“, също ще бъдат включени — може да ги изтриете вие. Празно \n"
+"Въведете съобщението за подаване на промените. Редовете, които започват\n"
+"с „%c“, също ще бъдат включени — може да ги изтриете вие. Празно \n"
"съобщение преустановява подаването.\n"
#: builtin/commit.c:859
@@ -5754,501 +6737,505 @@ msgstr "%sПодаващ: %.*s <%.*s>"
msgid "Cannot read index"
msgstr "Индексът не може да бъде прочетен"
-#: builtin/commit.c:949
+#: builtin/commit.c:954
msgid "Error building trees"
msgstr "Грешка при изграждане на дърветата"
-#: builtin/commit.c:964 builtin/tag.c:266
+#: builtin/commit.c:969 builtin/tag.c:266
#, c-format
msgid "Please supply the message using either -m or -F option.\n"
msgstr "Подайте съобщението с някоя от опциите „-m“ или „-F“.\n"
-#: builtin/commit.c:1066
+#: builtin/commit.c:1071
#, c-format
msgid "--author '%s' is not 'Name <email>' and matches no existing author"
msgstr ""
"Опцията „--author '%s'“ не отговаря на форма̀та „Име <е-поща>“ и не съвпада с "
"никой автор"
-#: builtin/commit.c:1081 builtin/commit.c:1321
+#: builtin/commit.c:1086 builtin/commit.c:1327
#, c-format
msgid "Invalid untracked files mode '%s'"
msgstr "Неправилна стойност за неследените файлове: „%s“"
-#: builtin/commit.c:1118
+#: builtin/commit.c:1124
msgid "--long and -z are incompatible"
msgstr "Опциите „--long“ и „-z“ са несъвместими."
-#: builtin/commit.c:1148
+#: builtin/commit.c:1154
msgid "Using both --reset-author and --author does not make sense"
msgstr "Опциите „--reset-author“ и „--author“ са несъвместими."
-#: builtin/commit.c:1157
+#: builtin/commit.c:1163
msgid "You have nothing to amend."
msgstr "Няма какво да бъде поправено."
-#: builtin/commit.c:1160
+#: builtin/commit.c:1166
msgid "You are in the middle of a merge -- cannot amend."
msgstr "В момента се извършва сливане, не можете да поправяте."
-#: builtin/commit.c:1162
+#: builtin/commit.c:1168
msgid "You are in the middle of a cherry-pick -- cannot amend."
msgstr "В момента се извършва отбиране на подаване, не можете да поправяте."
-#: builtin/commit.c:1165
+#: builtin/commit.c:1171
msgid "Options --squash and --fixup cannot be used together"
msgstr "Опциите „--squash“ и „--fixup“ са несъвместими."
-#: builtin/commit.c:1175
+#: builtin/commit.c:1181
msgid "Only one of -c/-C/-F/--fixup can be used."
msgstr "Опциите „-c“, „-C“, „-F“ и „--fixup““ са несъвместими."
-#: builtin/commit.c:1177
+#: builtin/commit.c:1183
msgid "Option -m cannot be combined with -c/-C/-F/--fixup."
msgstr "Опцията „-m“ е несъвместима с „-c“, „-C“, „-F“ и „--fixup“."
-#: builtin/commit.c:1185
+#: builtin/commit.c:1191
msgid "--reset-author can be used only with -C, -c or --amend."
msgstr ""
"Опцията „--reset-author“ може да се използва само заедно с „-C“, „-c“ или\n"
"„--amend“."
-#: builtin/commit.c:1202
+#: builtin/commit.c:1208
msgid "Only one of --include/--only/--all/--interactive/--patch can be used."
msgstr ""
"Опциите „--include“, „--only“, „--all“, „--interactive“ и „--patch“ са\n"
"несъвместими."
-#: builtin/commit.c:1204
+#: builtin/commit.c:1210
msgid "No paths with --include/--only does not make sense."
msgstr "Опциите „--include“ и „--only“ изискват аргументи."
-# FIXME bad message
-#: builtin/commit.c:1206
+#: builtin/commit.c:1212
msgid "Clever... amending the last one with dirty index."
msgstr ""
"Чудесно сте се сетили как да поправите съобщението на последното подаване "
"при\n"
-"променен индекс. Споделете и с друг потребител трика с „git commit --amend -"
+"променен индекс. Споделете и с друг потребител трика с „git commit --amend -"
"o“."
-#: builtin/commit.c:1208
+#: builtin/commit.c:1214
msgid "Explicit paths specified without -i or -o; assuming --only paths..."
msgstr ""
-"Зададени са изрични пътища без опциите „-i“ или „-o“. Приема се, че все едно "
-"сте\n"
+"Зададени са изрични пътища без опциите „-i“ или „-o“. Приема се, че все "
+"едно сте\n"
"ползвали опцията „--only“ с ПЪТища…"
-#: builtin/commit.c:1220 builtin/tag.c:474
+#: builtin/commit.c:1226 builtin/tag.c:474
#, c-format
msgid "Invalid cleanup mode %s"
msgstr "Несъществуващ режим на изчистване „%s“"
-#: builtin/commit.c:1225
+#: builtin/commit.c:1231
msgid "Paths with -a does not make sense."
msgstr "Опцията „-a“ е несъвместима със задаването на пътища."
-#: builtin/commit.c:1335 builtin/commit.c:1621
+#: builtin/commit.c:1341 builtin/commit.c:1617
msgid "show status concisely"
msgstr "кратка информация за състоянието"
-#: builtin/commit.c:1337 builtin/commit.c:1623
+#: builtin/commit.c:1343 builtin/commit.c:1619
msgid "show branch information"
msgstr "информация за клоните"
-#: builtin/commit.c:1339 builtin/commit.c:1625 builtin/push.c:512
-#: builtin/worktree.c:437
+#: builtin/commit.c:1345
+msgid "version"
+msgstr "версия"
+
+#: builtin/commit.c:1345 builtin/commit.c:1621 builtin/push.c:522
+#: builtin/worktree.c:440
msgid "machine-readable output"
msgstr "формат на изхода за четене от програма"
-#: builtin/commit.c:1342 builtin/commit.c:1627
+#: builtin/commit.c:1348 builtin/commit.c:1623
msgid "show status in long format (default)"
msgstr "подробна информация за състоянието (стандартно)"
-#: builtin/commit.c:1345 builtin/commit.c:1630
+#: builtin/commit.c:1351 builtin/commit.c:1626
msgid "terminate entries with NUL"
msgstr "разделяне на елементите с нулевия знак „NUL“"
-#: builtin/commit.c:1347 builtin/commit.c:1633 builtin/fast-export.c:981
+#: builtin/commit.c:1353 builtin/commit.c:1629 builtin/fast-export.c:981
#: builtin/fast-export.c:984 builtin/tag.c:353
msgid "mode"
msgstr "РЕЖИМ"
-#: builtin/commit.c:1348 builtin/commit.c:1633
+#: builtin/commit.c:1354 builtin/commit.c:1629
msgid "show untracked files, optional modes: all, normal, no. (Default: all)"
msgstr ""
-"извеждане на неследените файлове. Възможните РЕЖИМи са „all“ (подробна "
-"информация), „normal“ (кратка информация), „no“ (без неследените файлове). "
+"извеждане на неследените файлове. Възможните РЕЖИМи са „all“ (подробна "
+"информация), „normal“ (кратка информация), „no“ (без неследените файлове). "
"Стандартният РЕЖИМ е: „all“."
-#: builtin/commit.c:1351
+#: builtin/commit.c:1357
msgid "show ignored files"
msgstr "извеждане на игнорираните файлове"
-#: builtin/commit.c:1352 parse-options.h:155
+#: builtin/commit.c:1358 parse-options.h:155
msgid "when"
msgstr "КОГА"
-#: builtin/commit.c:1353
+#: builtin/commit.c:1359
msgid ""
"ignore changes to submodules, optional when: all, dirty, untracked. "
"(Default: all)"
msgstr ""
-"игнориране на промените в подмодулите. Опция с незадължителна стойност — "
+"игнориране на промените в подмодулите. Опция с незадължителна стойност — "
"една от „all“ (всички), „dirty“ (тези с неподадени промени), "
"„untracked“ (неследени)"
-#: builtin/commit.c:1355
+#: builtin/commit.c:1361
msgid "list untracked files in columns"
msgstr "извеждане на неследените файлове в колони"
-#: builtin/commit.c:1441
+#: builtin/commit.c:1437
msgid "couldn't look up newly created commit"
msgstr "току що създаденото подаване не може да бъде открито"
-#: builtin/commit.c:1443
+#: builtin/commit.c:1439
msgid "could not parse newly created commit"
msgstr "току що създаденото подаване не може да бъде анализирано"
-#: builtin/commit.c:1488
+#: builtin/commit.c:1484
msgid "detached HEAD"
msgstr "несвързан връх „HEAD“"
-#: builtin/commit.c:1491
+#: builtin/commit.c:1487
msgid " (root-commit)"
msgstr " (начално подаване)"
-#: builtin/commit.c:1591
+#: builtin/commit.c:1587
msgid "suppress summary after successful commit"
msgstr "без информация след успешно подаване"
-#: builtin/commit.c:1592
+#: builtin/commit.c:1588
msgid "show diff in commit message template"
msgstr "добавяне на разликата към шаблона за съобщението при подаване"
-#: builtin/commit.c:1594
+#: builtin/commit.c:1590
msgid "Commit message options"
msgstr "Опции за съобщението при подаване"
-#: builtin/commit.c:1595 builtin/tag.c:351
+#: builtin/commit.c:1591 builtin/tag.c:351
msgid "read message from file"
msgstr "взимане на съобщението от ФАЙЛ"
-#: builtin/commit.c:1596
+#: builtin/commit.c:1592
msgid "author"
msgstr "АВТОР"
-#: builtin/commit.c:1596
+#: builtin/commit.c:1592
msgid "override author for commit"
msgstr "задаване на АВТОР за подаването"
-#: builtin/commit.c:1597 builtin/gc.c:326
+#: builtin/commit.c:1593 builtin/gc.c:326
msgid "date"
msgstr "ДАТА"
-#: builtin/commit.c:1597
+#: builtin/commit.c:1593
msgid "override date for commit"
msgstr "задаване на ДАТА за подаването"
-#: builtin/commit.c:1598 builtin/merge.c:219 builtin/notes.c:395
-#: builtin/notes.c:558 builtin/tag.c:349
+#: builtin/commit.c:1594 builtin/merge.c:220 builtin/notes.c:398
+#: builtin/notes.c:561 builtin/tag.c:349
msgid "message"
msgstr "СЪОБЩЕНИЕ"
-#: builtin/commit.c:1598
+#: builtin/commit.c:1594
msgid "commit message"
msgstr "СЪОБЩЕНИЕ при подаване"
-#: builtin/commit.c:1599 builtin/commit.c:1600 builtin/commit.c:1601
-#: builtin/commit.c:1602 parse-options.h:256 ref-filter.h:79
+#: builtin/commit.c:1595 builtin/commit.c:1596 builtin/commit.c:1597
+#: builtin/commit.c:1598 parse-options.h:257 ref-filter.h:79
msgid "commit"
msgstr "ПОДАВАНЕ"
-#: builtin/commit.c:1599
+#: builtin/commit.c:1595
msgid "reuse and edit message from specified commit"
msgstr "преизползване и редактиране на съобщението от указаното ПОДАВАНЕ"
-#: builtin/commit.c:1600
+#: builtin/commit.c:1596
msgid "reuse message from specified commit"
msgstr "преизползване на съобщението от указаното ПОДАВАНЕ"
-#: builtin/commit.c:1601
+#: builtin/commit.c:1597
msgid "use autosquash formatted message to fixup specified commit"
msgstr ""
"използване на автоматичното съобщение при смачкване за вкарване на указаното "
"ПОДАВАНЕ в предното без следа"
-#: builtin/commit.c:1602
+#: builtin/commit.c:1598
msgid "use autosquash formatted message to squash specified commit"
msgstr ""
"използване на автоматичното съобщение при смачкване за смачкване на "
"указаното ПОДАВАНЕ в предното"
-#: builtin/commit.c:1603
+#: builtin/commit.c:1599
msgid "the commit is authored by me now (used with -C/-c/--amend)"
msgstr ""
"смяна на автора да съвпада с подаващия (използва се с „-C“/„-c“/„--amend“)"
-#: builtin/commit.c:1604 builtin/log.c:1382 builtin/revert.c:86
+#: builtin/commit.c:1600 builtin/log.c:1413 builtin/revert.c:86
msgid "add Signed-off-by:"
msgstr "добавяне на поле за подпис — „Signed-off-by:“"
-#: builtin/commit.c:1605
+#: builtin/commit.c:1601
msgid "use specified template file"
msgstr "използване на указания шаблонен ФАЙЛ"
-#: builtin/commit.c:1606
+#: builtin/commit.c:1602
msgid "force edit of commit"
msgstr "редактиране на подаване"
-#: builtin/commit.c:1607
+#: builtin/commit.c:1603
msgid "default"
msgstr "стандартно"
-#: builtin/commit.c:1607 builtin/tag.c:354
+#: builtin/commit.c:1603 builtin/tag.c:354
msgid "how to strip spaces and #comments from message"
msgstr "кои празни знаци и #коментари да се махат от съобщенията"
-#: builtin/commit.c:1608
+#: builtin/commit.c:1604
msgid "include status in commit message template"
msgstr "вмъкване на състоянието в шаблона за съобщението при подаване"
-#: builtin/commit.c:1610 builtin/merge.c:229 builtin/pull.c:165
+#: builtin/commit.c:1606 builtin/merge.c:230 builtin/pull.c:166
#: builtin/revert.c:93
msgid "GPG sign commit"
msgstr "подписване на подаването с GPG"
-#: builtin/commit.c:1613
+#: builtin/commit.c:1609
msgid "Commit contents options"
msgstr "Опции за избор на файлове при подаване"
-#: builtin/commit.c:1614
+#: builtin/commit.c:1610
msgid "commit all changed files"
msgstr "подаване на всички променени файлове"
-#: builtin/commit.c:1615
+#: builtin/commit.c:1611
msgid "add specified files to index for commit"
msgstr "добавяне на указаните файлове към индекса за подаване"
-#: builtin/commit.c:1616
+#: builtin/commit.c:1612
msgid "interactively add files"
msgstr "интерактивно добавяне на файлове"
-#: builtin/commit.c:1617
+#: builtin/commit.c:1613
msgid "interactively add changes"
msgstr "интерактивно добавяне на промени"
-#: builtin/commit.c:1618
+#: builtin/commit.c:1614
msgid "commit only specified files"
msgstr "подаване само на указаните файлове"
-#: builtin/commit.c:1619
-msgid "bypass pre-commit hook"
-msgstr "без изпълнение на куката преди подаване (pre-commit)"
+#: builtin/commit.c:1615
+msgid "bypass pre-commit and commit-msg hooks"
+msgstr ""
+"без изпълнение на куките преди подаване и при промяна на съобщението за "
+"подаване (pre-commit и commit-msg)"
-#: builtin/commit.c:1620
+#: builtin/commit.c:1616
msgid "show what would be committed"
msgstr "отпечатване на това, което би било подадено"
-#: builtin/commit.c:1631
+#: builtin/commit.c:1627
msgid "amend previous commit"
msgstr "поправяне на предишното подаване"
-#: builtin/commit.c:1632
+#: builtin/commit.c:1628
msgid "bypass post-rewrite hook"
msgstr "без изпълнение на куката след презаписване (post-rewrite)"
-#: builtin/commit.c:1637
+#: builtin/commit.c:1633
msgid "ok to record an empty change"
msgstr "позволяване на празни подавания"
-#: builtin/commit.c:1639
+#: builtin/commit.c:1635
msgid "ok to record a change with an empty message"
msgstr "позволяване на подавания с празни съобщения"
-#: builtin/commit.c:1668
+#: builtin/commit.c:1664
msgid "could not parse HEAD commit"
msgstr "върховото подаване „HEAD“ не може да бъде прочетено"
-#: builtin/commit.c:1718
+#: builtin/commit.c:1712
#, c-format
msgid "Corrupt MERGE_HEAD file (%s)"
msgstr "Повреден файл за върха за сливането „MERGE_HEAD“ (%s)"
-#: builtin/commit.c:1725
+#: builtin/commit.c:1719
msgid "could not read MERGE_MODE"
msgstr "режимът на сливане „MERGE_MODE“ не може да бъде прочетен"
-#: builtin/commit.c:1744
+#: builtin/commit.c:1738
#, c-format
msgid "could not read commit message: %s"
msgstr "съобщението за подаване не може да бъде прочетено: %s"
-#: builtin/commit.c:1755
+#: builtin/commit.c:1749
#, c-format
msgid "Aborting commit; you did not edit the message.\n"
msgstr "Неизвършване на подаване поради нередактирано съобщение.\n"
-#: builtin/commit.c:1760
+#: builtin/commit.c:1754
#, c-format
msgid "Aborting commit due to empty commit message.\n"
msgstr "Неизвършване на подаване поради празно съобщение.\n"
-#: builtin/commit.c:1808
+#: builtin/commit.c:1802
msgid ""
"Repository has been updated, but unable to write\n"
"new_index file. Check that disk is not full and quota is\n"
"not exceeded, and then \"git reset HEAD\" to recover."
msgstr ""
"Хранилището е обновено, но новият файл за индекс „new_index“\n"
-"не е записан. Проверете дали дискът не е препълнен или не сте\n"
-"превишили дисковата си квота. След това изпълнете „git reset HEAD“."
+"не е записан. Проверете дали дискът не е препълнен или не сте\n"
+"превишили дисковата си квота. След това изпълнете „git reset HEAD“."
#: builtin/config.c:9
msgid "git config [<options>]"
msgstr "git config [ОПЦИЯ…]"
-#: builtin/config.c:56
+#: builtin/config.c:55
msgid "Config file location"
msgstr "Местоположение на конфигурационния файл"
-#: builtin/config.c:57
+#: builtin/config.c:56
msgid "use global config file"
msgstr "използване на глобалния конфигурационен файл"
-#: builtin/config.c:58
+#: builtin/config.c:57
msgid "use system config file"
msgstr "използване на системния конфигурационен файл"
-#: builtin/config.c:59
+#: builtin/config.c:58
msgid "use repository config file"
msgstr "използване на конфигурационния файл на хранилището"
-#: builtin/config.c:60
+#: builtin/config.c:59
msgid "use given config file"
msgstr "използване на зададения конфигурационен ФАЙЛ"
-#: builtin/config.c:61
+#: builtin/config.c:60
msgid "blob-id"
msgstr "ИДЕНТИФИКАТОР"
-#: builtin/config.c:61
+#: builtin/config.c:60
msgid "read config from given blob object"
msgstr ""
"изчитане на конфигурацията от BLOB с този ИДЕНТИФИКАТОР на съдържанието"
-#: builtin/config.c:62
+#: builtin/config.c:61
msgid "Action"
msgstr "Действие"
-#: builtin/config.c:63
+#: builtin/config.c:62
msgid "get value: name [value-regex]"
msgstr "извеждане на стойност: ИМЕ [РЕГУЛЯРЕН_ИЗРАЗ_ЗА_СТОЙНОСТТА]"
-#: builtin/config.c:64
+#: builtin/config.c:63
msgid "get all values: key [value-regex]"
msgstr "извеждане на всички стойности: ключ [РЕГУЛЯРЕН_ИЗРАЗ_ЗА_СТОЙНОСТТА]"
-#: builtin/config.c:65
+#: builtin/config.c:64
msgid "get values for regexp: name-regex [value-regex]"
msgstr ""
"извеждане на стойностите за РЕГУЛЯРНия_ИЗРАЗ: РЕГУЛЯРЕН_ИЗРАЗ_ЗА_ИМЕТО "
"[РЕГУЛЯРЕН_ИЗРАЗ_ЗА_СТОЙНОСТТА]"
-#: builtin/config.c:66
+#: builtin/config.c:65
msgid "get value specific for the URL: section[.var] URL"
msgstr "извеждане на стойността за указания адрес: РАЗДЕЛ[.ПРОМЕНЛИВА] АДРЕС"
-#: builtin/config.c:67
+#: builtin/config.c:66
msgid "replace all matching variables: name value [value_regex]"
msgstr ""
"замяна на всички съвпадащи променливи: ИМЕ СТОЙНОСТ "
"[РЕГУЛЯРЕН_ИЗРАЗ_ЗА_СТОЙНОСТТА]"
-#: builtin/config.c:68
+#: builtin/config.c:67
msgid "add a new variable: name value"
msgstr "добавяне на нова променлива: ИМЕ СТОЙНОСТ"
-#: builtin/config.c:69
+#: builtin/config.c:68
msgid "remove a variable: name [value-regex]"
msgstr "изтриване на променлива: ИМЕ [РЕГУЛЯРЕН_ИЗРАЗ_ЗА_СТОЙНОСТТА]"
-#: builtin/config.c:70
+#: builtin/config.c:69
msgid "remove all matches: name [value-regex]"
msgstr "изтриване на всички съвпадащи: ИМЕ [РЕГУЛЯРЕН_ИЗРАЗ_ЗА_СТОЙНОСТТА]"
-#: builtin/config.c:71
+#: builtin/config.c:70
msgid "rename section: old-name new-name"
msgstr "преименуване на раздел: СТАРО_ИМЕ НОВО_ИМЕ"
-#: builtin/config.c:72
+#: builtin/config.c:71
msgid "remove a section: name"
msgstr "изтриване на раздел: ИМЕ"
-#: builtin/config.c:73
+#: builtin/config.c:72
msgid "list all"
msgstr "изброяване на всички"
-#: builtin/config.c:74
+#: builtin/config.c:73
msgid "open an editor"
msgstr "отваряне на редактор"
-#: builtin/config.c:75
+#: builtin/config.c:74
msgid "find the color configured: slot [default]"
msgstr "извеждане на зададения цвят: номер [стандартно]"
-#: builtin/config.c:76
+#: builtin/config.c:75
msgid "find the color setting: slot [stdout-is-tty]"
msgstr "извеждане на зададения цвят: номер [стандартният изход е терминал]"
-#: builtin/config.c:77
+#: builtin/config.c:76
msgid "Type"
msgstr "Вид"
-#: builtin/config.c:78
+#: builtin/config.c:77
msgid "value is \"true\" or \"false\""
msgstr "СТОЙНОСТТА е „true“ (истина) или „false“ (лъжа)"
-#: builtin/config.c:79
+#: builtin/config.c:78
msgid "value is decimal number"
msgstr "СТОЙНОСТТА е цяло, десетично число"
-#: builtin/config.c:80
+#: builtin/config.c:79
msgid "value is --bool or --int"
msgstr "СТОЙНОСТТА е „--bool“ (булева) или „--int“ (десетично цяло число)"
-#: builtin/config.c:81
+#: builtin/config.c:80
msgid "value is a path (file or directory name)"
msgstr "СТОЙНОСТТА е път (до файл или директория)"
-#: builtin/config.c:82
+#: builtin/config.c:81
msgid "Other"
msgstr "Други"
-# FIXME NUL byte to null char, terminate -> razdelitel - da stane ednakvo
-#: builtin/config.c:83
+#: builtin/config.c:82
msgid "terminate values with NUL byte"
msgstr "разделяне на стойностите с нулевия знак „NUL“"
-#: builtin/config.c:84
+#: builtin/config.c:83
msgid "show variable names only"
msgstr "извеждане на имената на променливите"
-#: builtin/config.c:85
+#: builtin/config.c:84
msgid "respect include directives on lookup"
msgstr "при търсене да се уважат и директивите за включване"
-#: builtin/config.c:86
+#: builtin/config.c:85
msgid "show origin of config (file, standard input, blob, command line)"
msgstr ""
"извеждане на мястото на задаване на настройката (файл, стандартен вход, "
"обект BLOB, команден ред)"
-#: builtin/config.c:328
+#: builtin/config.c:327
msgid "unable to parse default color value"
msgstr "неразпозната стойност на стандартния цвят"
-#: builtin/config.c:472
+#: builtin/config.c:471
#, c-format
msgid ""
"# This is Git's per-user configuration file.\n"
@@ -6263,20 +7250,29 @@ msgstr ""
"#\tname = %s\n"
"#\temail = %s\n"
-#: builtin/config.c:614
+#: builtin/config.c:613
#, c-format
msgid "cannot create configuration file %s"
msgstr "конфигурационният файл „%s“ не може да бъде създаден"
-#: builtin/count-objects.c:77
+#: builtin/config.c:625
+#, c-format
+msgid ""
+"cannot overwrite multiple values with a single value\n"
+" Use a regexp, --add or --replace-all to change %s."
+msgstr ""
+"множество стойности не могат да се заменят с една.\n"
+"За да промените „%s“, ползвайте регулярен израз или оциите „--add“ и „--"
+"replace-all“."
+
+#: builtin/count-objects.c:86
msgid "git count-objects [-v] [-H | --human-readable]"
msgstr "git count-objects [-v] [-H | --human-readable]"
-#: builtin/count-objects.c:87
+#: builtin/count-objects.c:96
msgid "print sizes in human readable format"
msgstr "извеждане на размерите на обектите във формат лесно четим от хора"
-# FIXME ... instead of *???
#: builtin/describe.c:17
msgid "git describe [<options>] [<commit-ish>...]"
msgstr "git describe [ОПЦИЯ…] УКАЗАТЕЛ_КЪМ_ПОДАВАНЕ…"
@@ -6300,7 +7296,7 @@ msgstr "в анотирания етикет „%s“ липсва вграде
msgid "tag '%s' is really '%s' here"
msgstr "етикетът „%s“ тук е всъщност „%s“"
-#: builtin/describe.c:250 builtin/log.c:465
+#: builtin/describe.c:250 builtin/log.c:480
#, c-format
msgid "Not a valid object name %s"
msgstr "Неправилно име на обект „%s“"
@@ -6332,7 +7328,7 @@ msgid ""
"However, there were unannotated tags: try --tags."
msgstr ""
"Никой анотиран етикет не описва „%s“.\n"
-"Съществуват и неанотирани етикети. Пробвайте с опцията „--tags“."
+"Съществуват и неанотирани етикети. Пробвайте с опцията „--tags“."
#: builtin/describe.c:350
#, c-format
@@ -6396,7 +7392,7 @@ msgstr "да се търси само в този БРОЙ последни ет
msgid "only consider tags matching <pattern>"
msgstr "да се търси само измежду етикетите напасващи този ШАБЛОН"
-#: builtin/describe.c:410 builtin/name-rev.c:321
+#: builtin/describe.c:410 builtin/name-rev.c:320
msgid "show abbreviated commit object as fallback"
msgstr "извеждане на съкратено име на обект като резервен вариант"
@@ -6430,21 +7426,21 @@ msgstr "„%s“: не е нито обикновен файл, нито сим
msgid "invalid option: %s"
msgstr "неправилна опция: %s"
-#: builtin/diff.c:360
+#: builtin/diff.c:361
msgid "Not a git repository"
msgstr "Не е хранилище на Git"
-#: builtin/diff.c:403
+#: builtin/diff.c:404
#, c-format
msgid "invalid object '%s' given."
msgstr "зададен е неправилен обект „%s“."
-#: builtin/diff.c:412
+#: builtin/diff.c:413
#, c-format
msgid "more than two blobs given: '%s'"
msgstr "зададени са повече от 2 обекта BLOB: „%s“"
-#: builtin/diff.c:419
+#: builtin/diff.c:420
#, c-format
msgid "unhandled object '%s' given."
msgstr "зададен е неподдържан обект „%s“."
@@ -6501,271 +7497,283 @@ msgstr "Прилагане на УКАЗАТЕЛя_НА_ВЕРСИЯ към из
msgid "anonymize output"
msgstr "анонимизиране на извежданата информация"
-#: builtin/fetch.c:20
+#: builtin/fetch.c:21
msgid "git fetch [<options>] [<repository> [<refspec>...]]"
msgstr "git fetch [ОПЦИЯ…] [ХРАНИЛИЩЕ [УКАЗАТЕЛ…]]"
-#: builtin/fetch.c:21
+#: builtin/fetch.c:22
msgid "git fetch [<options>] <group>"
msgstr "git fetch [ОПЦИЯ…] ГРУПА"
-#: builtin/fetch.c:22
+#: builtin/fetch.c:23
msgid "git fetch --multiple [<options>] [(<repository> | <group>)...]"
msgstr "git fetch --multiple [ОПЦИЯ…] [(ХРАНИЛИЩЕ | ГРУПА)…]"
-#: builtin/fetch.c:23
+#: builtin/fetch.c:24
msgid "git fetch --all [<options>]"
msgstr "git fetch --all [ОПЦИЯ…]"
-#: builtin/fetch.c:92 builtin/pull.c:174
+#: builtin/fetch.c:95 builtin/pull.c:175
msgid "fetch from all remotes"
msgstr "доставяне от всички отдалечени хранилища"
-#: builtin/fetch.c:94 builtin/pull.c:177
+#: builtin/fetch.c:97 builtin/pull.c:178
msgid "append to .git/FETCH_HEAD instead of overwriting"
msgstr "добавяне към „.git/FETCH_HEAD“ вместо замяна"
-#: builtin/fetch.c:96 builtin/pull.c:180
+#: builtin/fetch.c:99 builtin/pull.c:181
msgid "path to upload pack on remote end"
msgstr "отдалечен път, където да се качи пакетът"
-#: builtin/fetch.c:97 builtin/pull.c:182
+#: builtin/fetch.c:100 builtin/pull.c:183
msgid "force overwrite of local branch"
msgstr "принудително презаписване на локалния клон"
-#: builtin/fetch.c:99
+#: builtin/fetch.c:102
msgid "fetch from multiple remotes"
msgstr "доставяне от множество отдалечени хранилища"
-#: builtin/fetch.c:101 builtin/pull.c:184
+#: builtin/fetch.c:104 builtin/pull.c:185
msgid "fetch all tags and associated objects"
msgstr "доставяне на всички етикети и принадлежащи обекти"
-#: builtin/fetch.c:103
+#: builtin/fetch.c:106
msgid "do not fetch all tags (--no-tags)"
msgstr "без доставянето на всички етикети „--no-tags“"
-#: builtin/fetch.c:105
+#: builtin/fetch.c:108
msgid "number of submodules fetched in parallel"
msgstr "брой подмодули доставени паралелно"
-#: builtin/fetch.c:107 builtin/pull.c:187
+#: builtin/fetch.c:110 builtin/pull.c:188
msgid "prune remote-tracking branches no longer on remote"
msgstr "окастряне на клоните следящи вече несъществуващи отдалечени клони"
-#: builtin/fetch.c:108 builtin/pull.c:190
+#: builtin/fetch.c:111 builtin/pull.c:191
msgid "on-demand"
msgstr "ПРИ НУЖДА"
-#: builtin/fetch.c:109 builtin/pull.c:191
+#: builtin/fetch.c:112 builtin/pull.c:192
msgid "control recursive fetching of submodules"
msgstr "управление на рекурсивното доставяне на подмодулите"
-#: builtin/fetch.c:113 builtin/pull.c:199
+#: builtin/fetch.c:116 builtin/pull.c:200
msgid "keep downloaded pack"
msgstr "запазване на изтеглените пакети с обекти"
-#: builtin/fetch.c:115
+#: builtin/fetch.c:118
msgid "allow updating of HEAD ref"
msgstr "позволяване на обновяването на указателя „HEAD“"
-#: builtin/fetch.c:118 builtin/pull.c:202
+#: builtin/fetch.c:121 builtin/fetch.c:127 builtin/pull.c:203
msgid "deepen history of shallow clone"
msgstr "задълбочаване на историята на плитко хранилище"
-#: builtin/fetch.c:120 builtin/pull.c:205
+#: builtin/fetch.c:123
+msgid "deepen history of shallow repository based on time"
+msgstr "задълбочаване на историята на плитко хранилище до определено време"
+
+#: builtin/fetch.c:129 builtin/pull.c:206
msgid "convert to a complete repository"
msgstr "превръщане в пълно хранилище"
-#: builtin/fetch.c:122 builtin/log.c:1399
+#: builtin/fetch.c:131 builtin/log.c:1433
msgid "dir"
msgstr "директория"
-#: builtin/fetch.c:123
+#: builtin/fetch.c:132
msgid "prepend this to submodule path output"
msgstr "добавяне на това пред пътя на подмодула"
-#: builtin/fetch.c:126
+#: builtin/fetch.c:135
msgid "default mode for recursion"
msgstr "стандартен режим на рекурсия"
-#: builtin/fetch.c:128 builtin/pull.c:208
+#: builtin/fetch.c:137 builtin/pull.c:209
msgid "accept refs that update .git/shallow"
msgstr "приемане на указатели, които обновяват „.git/shallow“"
-#: builtin/fetch.c:129 builtin/pull.c:210
+#: builtin/fetch.c:138 builtin/pull.c:211
msgid "refmap"
msgstr "КАРТА_С_УКАЗАТЕЛИ"
-#: builtin/fetch.c:130 builtin/pull.c:211
+#: builtin/fetch.c:139 builtin/pull.c:212
msgid "specify fetch refmap"
msgstr "указване на КАРТАта_С_УКАЗАТЕЛИ за доставяне"
-#: builtin/fetch.c:386
+#: builtin/fetch.c:398
msgid "Couldn't find remote ref HEAD"
msgstr "Указателят „HEAD“ в отдалеченото хранилище не може да бъде открит"
-#: builtin/fetch.c:466
+#: builtin/fetch.c:514
+#, c-format
+msgid "configuration fetch.output contains invalid value %s"
+msgstr "настройката „fetch.output“ е с неправилна стойност „%s“"
+
+#: builtin/fetch.c:607
#, c-format
msgid "object %s not found"
msgstr "обектът „%s“ липсва"
-#: builtin/fetch.c:471
+#: builtin/fetch.c:611
msgid "[up to date]"
msgstr "[актуализиран]"
-#: builtin/fetch.c:485
-#, c-format
-msgid "! %-*s %-*s -> %s (can't fetch in current branch)"
-msgstr "! %-*s %-*s → %s (в текущия клон не може да се доставя)"
-
-#: builtin/fetch.c:486 builtin/fetch.c:574
+#: builtin/fetch.c:624 builtin/fetch.c:704
msgid "[rejected]"
msgstr "[отхвърлен]"
-#: builtin/fetch.c:497
+#: builtin/fetch.c:625
+msgid "can't fetch in current branch"
+msgstr "в текущия клон не може да се доставя"
+
+#: builtin/fetch.c:634
msgid "[tag update]"
msgstr "[обновяване на етикетите]"
-#: builtin/fetch.c:499 builtin/fetch.c:534 builtin/fetch.c:552
-msgid " (unable to update local ref)"
-msgstr " (локалните указатели не могат да бъдат обновени)"
+#: builtin/fetch.c:635 builtin/fetch.c:668 builtin/fetch.c:684
+#: builtin/fetch.c:699
+msgid "unable to update local ref"
+msgstr "локален указател не може да бъде обновен"
-#: builtin/fetch.c:517
+#: builtin/fetch.c:654
msgid "[new tag]"
msgstr "[нов етикет]"
-#: builtin/fetch.c:520
+#: builtin/fetch.c:657
msgid "[new branch]"
msgstr "[нов клон]"
-#: builtin/fetch.c:523
+#: builtin/fetch.c:660
msgid "[new ref]"
msgstr "[нов указател]"
-#: builtin/fetch.c:569
-msgid "unable to update local ref"
-msgstr "локален указател не може да бъде обновен"
-
-#: builtin/fetch.c:569
+#: builtin/fetch.c:699
msgid "forced update"
msgstr "принудително обновяване"
-#: builtin/fetch.c:576
-msgid "(non-fast-forward)"
-msgstr "(сливането не е тривиално)"
+#: builtin/fetch.c:704
+msgid "non-fast-forward"
+msgstr "сливането не е тривиално"
-#: builtin/fetch.c:619
+#: builtin/fetch.c:749
#, c-format
msgid "%s did not send all necessary objects\n"
msgstr "хранилището „%s“ не изпрати всички необходими обекти\n"
-#: builtin/fetch.c:637
+#: builtin/fetch.c:769
#, c-format
msgid "reject %s because shallow roots are not allowed to be updated"
msgstr ""
"отхвърляне на върха „%s“, защото плитките хранилища не могат да бъдат "
"обновявани"
-#: builtin/fetch.c:724 builtin/fetch.c:816
+#: builtin/fetch.c:856 builtin/fetch.c:952
#, c-format
msgid "From %.*s\n"
msgstr "От %.*s\n"
-# FIXME - is the space necessary
-#: builtin/fetch.c:735
+#: builtin/fetch.c:867
#, c-format
msgid ""
"some local refs could not be updated; try running\n"
" 'git remote prune %s' to remove any old, conflicting branches"
msgstr ""
-"някои локални указатели не могат да бъдат обновени. Изпълнете командата\n"
+"някои локални указатели не могат да бъдат обновени. Изпълнете командата\n"
"„git remote prune %s“, за да премахнете остарелите клони, които\n"
"предизвикват конфликта"
-#: builtin/fetch.c:787
+#: builtin/fetch.c:922
#, c-format
msgid " (%s will become dangling)"
msgstr " (обектът „%s“ ще се окаже извън клон)"
-#: builtin/fetch.c:788
+#: builtin/fetch.c:923
#, c-format
msgid " (%s has become dangling)"
msgstr " (обектът „%s“ вече е извън клон)"
-#: builtin/fetch.c:820
+#: builtin/fetch.c:955
msgid "[deleted]"
msgstr "[изтрит]"
-#: builtin/fetch.c:821 builtin/remote.c:1025
+#: builtin/fetch.c:956 builtin/remote.c:1020
msgid "(none)"
msgstr "(нищо)"
-#: builtin/fetch.c:841
+#: builtin/fetch.c:979
#, c-format
msgid "Refusing to fetch into current branch %s of non-bare repository"
msgstr "Не може да доставите в текущия клон „%s“ на хранилище, което не е голо"
-#: builtin/fetch.c:860
+#: builtin/fetch.c:998
#, c-format
msgid "Option \"%s\" value \"%s\" is not valid for %s"
msgstr "Стойността „%2$s“ за опцията „%1$s“ не е съвместима с „%3$s“"
-#: builtin/fetch.c:863
+#: builtin/fetch.c:1001
#, c-format
msgid "Option \"%s\" is ignored for %s\n"
-msgstr "Опцията „%s“ се игнорира при „%s“\n"
+msgstr "Опцията „%s“ се прескача при „%s“\n"
-#: builtin/fetch.c:920
+#: builtin/fetch.c:1077
#, c-format
msgid "Don't know how to fetch from %s"
msgstr "Не се поддържа доставяне от „%s“"
-#: builtin/fetch.c:1080
+#: builtin/fetch.c:1237
#, c-format
msgid "Fetching %s\n"
msgstr "Доставяне на „%s“\n"
-#: builtin/fetch.c:1082 builtin/remote.c:96
+#: builtin/fetch.c:1239 builtin/remote.c:96
#, c-format
msgid "Could not fetch %s"
msgstr "„%s“ не може да се достави"
-#: builtin/fetch.c:1100
+#: builtin/fetch.c:1257
msgid ""
"No remote repository specified. Please, specify either a URL or a\n"
"remote name from which new revisions should be fetched."
msgstr ""
-"Не сте указали отдалечено хранилище. Задайте или адрес, или име\n"
+"Не сте указали отдалечено хранилище. Задайте или адрес, или име\n"
"на отдалечено хранилище, откъдето да се доставят новите версии."
-#: builtin/fetch.c:1123
+#: builtin/fetch.c:1280
msgid "You need to specify a tag name."
msgstr "Трябва да укажете име на етикет."
-#: builtin/fetch.c:1165
+#: builtin/fetch.c:1322
+msgid "Negative depth in --deepen is not supported"
+msgstr "Отрицателна дълбочина като аргумент на „--deepen“ не се поддържа"
+
+#: builtin/fetch.c:1324
+msgid "--deepen and --depth are mutually exclusive"
+msgstr "Опциите „--deepen“ и „--depth“ са несъвместими една с друга"
+
+#: builtin/fetch.c:1329
msgid "--depth and --unshallow cannot be used together"
msgstr "опциите „--depth“ и „--unshallow“ са несъвместими"
-#: builtin/fetch.c:1167
+#: builtin/fetch.c:1331
msgid "--unshallow on a complete repository does not make sense"
msgstr "не можете да използвате опцията „--unshallow“ върху пълно хранилище"
-#: builtin/fetch.c:1187
+#: builtin/fetch.c:1353
msgid "fetch --all does not take a repository argument"
msgstr "към „git fetch --all“ не можете да добавите аргумент — хранилище"
-#: builtin/fetch.c:1189
+#: builtin/fetch.c:1355
msgid "fetch --all does not make sense with refspecs"
msgstr ""
"към „git fetch --all“ не можете да добавите аргумент — указател на версия"
-#: builtin/fetch.c:1200
+#: builtin/fetch.c:1366
#, c-format
msgid "No such remote or remote group: %s"
msgstr "Няма нито отдалечено хранилище, нито група от хранилища на име „%s“"
-#: builtin/fetch.c:1208
+#: builtin/fetch.c:1374
msgid "Fetching a group and specifying refspecs does not make sense"
msgstr "Указването на група и указването на версия са несъвместими"
@@ -6775,25 +7783,25 @@ msgid ""
msgstr ""
"git fmt-merge-msg [-m СЪОБЩЕНИЕ] [--log[=БРОЙ] | --no-log] [--file ФАЙЛ]"
-#: builtin/fmt-merge-msg.c:667
+#: builtin/fmt-merge-msg.c:663
msgid "populate log with at most <n> entries from shortlog"
msgstr ""
"вмъкване на журнал състоящ се от не повече от БРОЙ записа от съкратения "
"журнал"
-#: builtin/fmt-merge-msg.c:670
+#: builtin/fmt-merge-msg.c:666
msgid "alias for --log (deprecated)"
msgstr "синоним на „--log“ (остаряло)"
-#: builtin/fmt-merge-msg.c:673
+#: builtin/fmt-merge-msg.c:669
msgid "text"
msgstr "ТЕКСТ"
-#: builtin/fmt-merge-msg.c:674
+#: builtin/fmt-merge-msg.c:670
msgid "use <text> as start of message"
msgstr "за начало на съобщението да се ползва ТЕКСТ"
-#: builtin/fmt-merge-msg.c:675
+#: builtin/fmt-merge-msg.c:671
msgid "file to read from"
msgstr "файл, от който да се чете"
@@ -6853,68 +7861,67 @@ msgstr "извеждане само на неслетите указатели"
msgid "print only refs which contain the commit"
msgstr "извеждане само на указателите, които съдържат това ПОДАВАНЕ"
-#: builtin/fsck.c:156 builtin/prune.c:140
-msgid "Checking connectivity"
-msgstr "Проверка на връзката"
-
-#: builtin/fsck.c:486
+#: builtin/fsck.c:519
msgid "Checking object directories"
msgstr "Проверка на директориите с обекти"
-#: builtin/fsck.c:552
+#: builtin/fsck.c:588
msgid "git fsck [<options>] [<object>...]"
msgstr "git fsck [ОПЦИЯ…] [ОБЕКТ…]"
-#: builtin/fsck.c:558
+#: builtin/fsck.c:594
msgid "show unreachable objects"
msgstr "показване на недостижимите обекти"
-#: builtin/fsck.c:559
+#: builtin/fsck.c:595
msgid "show dangling objects"
msgstr "показване на обектите извън клоните"
-#: builtin/fsck.c:560
+#: builtin/fsck.c:596
msgid "report tags"
msgstr "показване на етикетите"
-#: builtin/fsck.c:561
+#: builtin/fsck.c:597
msgid "report root nodes"
msgstr "показване на кореновите възли"
-#: builtin/fsck.c:562
+#: builtin/fsck.c:598
msgid "make index objects head nodes"
msgstr "задаване на обекти от индекса да са коренови"
# FIXME bad message
-#: builtin/fsck.c:563
+#: builtin/fsck.c:599
msgid "make reflogs head nodes (default)"
msgstr "проследяване на указателите от журнала като глави (стандартно)"
-#: builtin/fsck.c:564
+#: builtin/fsck.c:600
msgid "also consider packs and alternate objects"
msgstr "допълнително да се проверяват пакетите и алтернативните обекти"
-#: builtin/fsck.c:565
+#: builtin/fsck.c:601
msgid "check only connectivity"
msgstr "проверка само на връзката"
-#: builtin/fsck.c:566
+#: builtin/fsck.c:602
msgid "enable more strict checking"
msgstr "по-строги проверки"
-#: builtin/fsck.c:568
+#: builtin/fsck.c:604
msgid "write dangling objects in .git/lost-found"
msgstr "запазване на обектите извън клоните в директорията „.git/lost-found“"
-#: builtin/fsck.c:569 builtin/prune.c:107
+#: builtin/fsck.c:605 builtin/prune.c:107
msgid "show progress"
msgstr "показване на напредъка"
-#: builtin/fsck.c:630
+#: builtin/fsck.c:606
+msgid "show verbose names for reachable objects"
+msgstr "показване на подробни имена на достижимите обекти"
+
+#: builtin/fsck.c:665
msgid "Checking objects"
msgstr "Проверка на обектите"
-# FIXME plural with ...
#: builtin/gc.c:25
msgid "git gc [<options>]"
msgstr "git gc [ОПЦИЯ…]"
@@ -6938,7 +7945,7 @@ msgid ""
"\n"
"%s"
msgstr ""
-"При последното изпълнение на „git gc“ бе докладвана грешка. Коригирайте "
+"При последното изпълнение на „git gc“ бе докладвана грешка. Коригирайте "
"причината за\n"
"нея и изтрийте „%s“.\n"
"Автоматичното изчистване на боклука няма да работи, преди да изтриете "
@@ -6999,7 +8006,6 @@ msgstr ""
"Има прекалено много недостижими, непакетирани обекти.\n"
"Използвайте „git prune“, за да ги окастрите."
-# FIXME plural ... options
#: builtin/grep.c:23
msgid "git grep [<options>] [-e] <pattern> [<rev>...] [[--] <path>...]"
msgstr "git grep [ОПЦИЯ…] [-e] ШАБЛОН [ВЕРСИЯ…] [[--] ПЪТ…]"
@@ -7014,239 +8020,234 @@ msgstr "grep: неуспешно създаване на нишка: %s"
msgid "invalid number of threads specified (%d) for %s"
msgstr "зададен е неправилен брой нишки (%d) за %s"
-#: builtin/grep.c:452 builtin/grep.c:487
+#: builtin/grep.c:453 builtin/grep.c:488
#, c-format
msgid "unable to read tree (%s)"
msgstr "дървото не може да бъде прочетено (%s)"
-#: builtin/grep.c:502
+#: builtin/grep.c:503
#, c-format
msgid "unable to grep from object of type %s"
msgstr "не може да се изпълни „grep“ от обект от вида %s"
-#: builtin/grep.c:560
+#: builtin/grep.c:561
#, c-format
msgid "switch `%c' expects a numerical value"
msgstr "опцията „%c“ очаква число за аргумент"
-#: builtin/grep.c:577
-#, c-format
-msgid "cannot open '%s'"
-msgstr "„%s“ не може да бъде отворен"
-
-#: builtin/grep.c:646
+#: builtin/grep.c:647
msgid "search in index instead of in the work tree"
msgstr "търсене в индекса, а не в работното дърво"
-#: builtin/grep.c:648
+#: builtin/grep.c:649
msgid "find in contents not managed by git"
msgstr "търсене и във файловете, които не са под управлението на git"
-#: builtin/grep.c:650
+#: builtin/grep.c:651
msgid "search in both tracked and untracked files"
msgstr "търсене и в следените, и в неследените файлове"
-#: builtin/grep.c:652
+#: builtin/grep.c:653
msgid "ignore files specified via '.gitignore'"
msgstr "игнориране на файловете указани в „.gitignore“"
-#: builtin/grep.c:655
+#: builtin/grep.c:656
msgid "show non-matching lines"
msgstr "извеждане на редовете, които не съвпадат"
-#: builtin/grep.c:657
+#: builtin/grep.c:658
msgid "case insensitive matching"
msgstr "без значение на регистъра на буквите (главни/малки)"
-#: builtin/grep.c:659
+#: builtin/grep.c:660
msgid "match patterns only at word boundaries"
msgstr "напасване на шаблоните само по границите на думите"
-#: builtin/grep.c:661
+#: builtin/grep.c:662
msgid "process binary files as text"
msgstr "обработване на двоичните файлове като текстови"
-#: builtin/grep.c:663
+#: builtin/grep.c:664
msgid "don't match patterns in binary files"
msgstr "прескачане на двоичните файлове"
-#: builtin/grep.c:666
+#: builtin/grep.c:667
msgid "process binary files with textconv filters"
msgstr ""
"обработване на двоичните файлове чрез филтри за преобразуване към текст"
-#: builtin/grep.c:668
+#: builtin/grep.c:669
msgid "descend at most <depth> levels"
msgstr "навлизане максимално на тази ДЪЛБОЧИНА в дървото"
-#: builtin/grep.c:672
+#: builtin/grep.c:673
msgid "use extended POSIX regular expressions"
msgstr "разширени регулярни изрази по POSIX"
-#: builtin/grep.c:675
+#: builtin/grep.c:676
msgid "use basic POSIX regular expressions (default)"
msgstr "основни регулярни изрази по POSIX (стандартно)"
-#: builtin/grep.c:678
+#: builtin/grep.c:679
msgid "interpret patterns as fixed strings"
msgstr "шаблоните са дословни низове"
-#: builtin/grep.c:681
+#: builtin/grep.c:682
msgid "use Perl-compatible regular expressions"
msgstr "регулярни изрази на Perl"
-#: builtin/grep.c:684
+#: builtin/grep.c:685
msgid "show line numbers"
msgstr "извеждане на номерата на редовете"
-#: builtin/grep.c:685
+#: builtin/grep.c:686
msgid "don't show filenames"
msgstr "без извеждане на имената на файловете"
-#: builtin/grep.c:686
+#: builtin/grep.c:687
msgid "show filenames"
msgstr "извеждане на имената на файловете"
-#: builtin/grep.c:688
+#: builtin/grep.c:689
msgid "show filenames relative to top directory"
msgstr ""
"извеждане на относителните имена на файловете спрямо основната директория на "
"хранилището"
-#: builtin/grep.c:690
+#: builtin/grep.c:691
msgid "show only filenames instead of matching lines"
msgstr "извеждане само на имената на файловете без напасващите редове"
-#: builtin/grep.c:692
+#: builtin/grep.c:693
msgid "synonym for --files-with-matches"
msgstr "синоним на „--files-with-matches“"
-#: builtin/grep.c:695
+#: builtin/grep.c:696
msgid "show only the names of files without match"
msgstr ""
"извеждане само на имената на файловете, които не съдържат ред, напасващ на "
"шаблона"
-#: builtin/grep.c:697
+#: builtin/grep.c:698
msgid "print NUL after filenames"
msgstr "извеждане на нулевия знак „NUL“ след всяко име на файл"
-#: builtin/grep.c:699
+#: builtin/grep.c:700
msgid "show the number of matches instead of matching lines"
msgstr "извеждане на броя на съвпаденията вместо напасващите редове"
-#: builtin/grep.c:700
+#: builtin/grep.c:701
msgid "highlight matches"
msgstr "оцветяване на напасванията"
-#: builtin/grep.c:702
+#: builtin/grep.c:703
msgid "print empty line between matches from different files"
msgstr "извеждане на празен ред между напасванията от различни файлове"
-#: builtin/grep.c:704
+#: builtin/grep.c:705
msgid "show filename only once above matches from same file"
msgstr ""
"извеждане на името на файла само веднъж за всички напасвания от този файл"
-#: builtin/grep.c:707
+#: builtin/grep.c:708
msgid "show <n> context lines before and after matches"
msgstr "извеждане на такъв БРОЙ редове преди и след напасванията"
-#: builtin/grep.c:710
+#: builtin/grep.c:711
msgid "show <n> context lines before matches"
msgstr "извеждане на такъв БРОЙ редове преди напасванията"
-#: builtin/grep.c:712
+#: builtin/grep.c:713
msgid "show <n> context lines after matches"
msgstr "извеждане на такъв БРОЙ редове след напасванията"
-#: builtin/grep.c:714
+#: builtin/grep.c:715
msgid "use <n> worker threads"
msgstr "използване на такъв БРОЙ работещи нишки"
-#: builtin/grep.c:715
+#: builtin/grep.c:716
msgid "shortcut for -C NUM"
msgstr "синоним на „-C БРОЙ“"
-#: builtin/grep.c:718
+#: builtin/grep.c:719
msgid "show a line with the function name before matches"
msgstr "извеждане на ред с името на функцията, в която е напаснат шаблона"
-#: builtin/grep.c:720
+#: builtin/grep.c:721
msgid "show the surrounding function"
msgstr "извеждане на обхващащата функция"
-#: builtin/grep.c:723
+#: builtin/grep.c:724
msgid "read patterns from file"
msgstr "изчитане на шаблоните от ФАЙЛ"
-#: builtin/grep.c:725
+#: builtin/grep.c:726
msgid "match <pattern>"
msgstr "напасване на ШАБЛОН"
-#: builtin/grep.c:727
+#: builtin/grep.c:728
msgid "combine patterns specified with -e"
msgstr "комбиниране на шаблоните указани с опцията „-e“"
-#: builtin/grep.c:739
+#: builtin/grep.c:740
msgid "indicate hit with exit status without output"
msgstr ""
-"без извеждане на стандартния изход. Изходният код указва наличието на "
+"без извеждане на стандартния изход. Изходният код указва наличието на "
"напасване"
-#: builtin/grep.c:741
+#: builtin/grep.c:742
msgid "show only matches from files that match all patterns"
msgstr ""
"извеждане на редове само от файловете, които напасват на всички шаблони"
-#: builtin/grep.c:743
+#: builtin/grep.c:744
msgid "show parse tree for grep expression"
msgstr "извеждане на дървото за анализ на регулярния израз"
-#: builtin/grep.c:747
+#: builtin/grep.c:748
msgid "pager"
msgstr "програма за преглед по страници"
-#: builtin/grep.c:747
+#: builtin/grep.c:748
msgid "show matching files in the pager"
msgstr "извеждане на съвпадащите файлове в програма за преглед по страници"
-#: builtin/grep.c:750
+#: builtin/grep.c:751
msgid "allow calling of grep(1) (ignored by this build)"
msgstr ""
"позволяване на стартирането на grep(1) (текущият компилат пренебрегва тази "
"опция)"
-#: builtin/grep.c:813
+#: builtin/grep.c:814
msgid "no pattern given."
msgstr "липсва шаблон."
-#: builtin/grep.c:845 builtin/index-pack.c:1477
+#: builtin/grep.c:846 builtin/index-pack.c:1480
#, c-format
msgid "invalid number of threads specified (%d)"
msgstr "зададен е неправилен брой нишки: %d"
-#: builtin/grep.c:875
+#: builtin/grep.c:876
msgid "--open-files-in-pager only works on the worktree"
msgstr ""
"опцията „--open-files-in-pager“ е съвместима само с търсене в работното дърво"
-#: builtin/grep.c:901
+#: builtin/grep.c:902
msgid "--cached or --untracked cannot be used with --no-index."
msgstr "опциите „--cached“ и „--untracked“ са несъвместими с „--no-index“."
-#: builtin/grep.c:906
+#: builtin/grep.c:907
msgid "--no-index or --untracked cannot be used with revs."
msgstr ""
"опциите „--cached“ и „--untracked“ са несъвместими с търсене във версии."
-#: builtin/grep.c:909
+#: builtin/grep.c:910
msgid "--[no-]exclude-standard cannot be used for tracked contents."
msgstr ""
"опциите „--(no-)exclude-standard“ са несъвместими с търсене по следени "
"файлове."
-#: builtin/grep.c:917
+#: builtin/grep.c:918
msgid "both --cached and trees are given."
msgstr "опцията „--cached“ е несъвместима със задаване на дърво."
@@ -7262,547 +8263,549 @@ msgstr ""
msgid "git hash-object --stdin-paths"
msgstr "git hash-object --stdin-paths"
-#: builtin/hash-object.c:93
+#: builtin/hash-object.c:94
msgid "type"
msgstr "ВИД"
-#: builtin/hash-object.c:93
+#: builtin/hash-object.c:94
msgid "object type"
msgstr "ВИД на обекта"
-#: builtin/hash-object.c:94
+#: builtin/hash-object.c:95
msgid "write the object into the object database"
msgstr "записване на обекта в базата от данни за обектите"
-#: builtin/hash-object.c:96
+#: builtin/hash-object.c:97
msgid "read the object from stdin"
msgstr "изчитане на обекта от стандартния вход"
-#: builtin/hash-object.c:98
+#: builtin/hash-object.c:99
msgid "store file as is without filters"
msgstr "запазване на файла както е — без филтри"
-#: builtin/hash-object.c:99
+#: builtin/hash-object.c:100
msgid ""
"just hash any random garbage to create corrupt objects for debugging Git"
msgstr ""
"създаване и хеширане на произволни данни за повредени обекти за трасиране на "
"Git"
-#: builtin/hash-object.c:100
+#: builtin/hash-object.c:101
msgid "process file as it were from this path"
msgstr "обработване на ФАЙЛа все едно е с този път"
-#: builtin/help.c:41
+#: builtin/help.c:42
msgid "print all available commands"
msgstr "показване на всички налични команди"
-#: builtin/help.c:42
+#: builtin/help.c:43
+msgid "exclude guides"
+msgstr "без пътеводетели"
+
+#: builtin/help.c:44
msgid "print list of useful guides"
msgstr "показване на списък с пътеводители"
-#: builtin/help.c:43
+#: builtin/help.c:45
msgid "show man page"
msgstr "показване на страница от ръководството"
-#: builtin/help.c:44
+#: builtin/help.c:46
msgid "show manual in web browser"
msgstr "показване на страница от ръководството в уеб браузър"
-#: builtin/help.c:46
+#: builtin/help.c:48
msgid "show info page"
msgstr "показване на информационна страница"
-#: builtin/help.c:52
+#: builtin/help.c:54
msgid "git help [--all] [--guides] [--man | --web | --info] [<command>]"
msgstr "git help [--all] [--guides] [--man | --web | --info] [КОМАНДА]"
-#: builtin/help.c:64
+#: builtin/help.c:66
#, c-format
msgid "unrecognized help format '%s'"
msgstr "непознат формат на помощта „%s“"
-#: builtin/help.c:91
+#: builtin/help.c:93
msgid "Failed to start emacsclient."
msgstr "Неуспешно стартиране на „emacsclient“."
-#: builtin/help.c:104
+#: builtin/help.c:106
msgid "Failed to parse emacsclient version."
msgstr "Версията на „emacsclient“ не може да се анализира."
-#: builtin/help.c:112
+#: builtin/help.c:114
#, c-format
msgid "emacsclient version '%d' too old (< 22)."
msgstr "Прекалено стара версия на „emacsclient“ — %d (< 22)."
-#: builtin/help.c:130 builtin/help.c:151 builtin/help.c:160 builtin/help.c:168
+#: builtin/help.c:132 builtin/help.c:153 builtin/help.c:162 builtin/help.c:170
#, c-format
msgid "failed to exec '%s'"
msgstr "неуспешно изпълнение на „%s“"
-#: builtin/help.c:205
+#: builtin/help.c:207
#, c-format
msgid ""
"'%s': path for unsupported man viewer.\n"
"Please consider using 'man.<tool>.cmd' instead."
msgstr ""
"„%s“: път към неподдържана програма за преглед на\n"
-" ръководството. Вместо нея пробвайте „man.<tool>.cmd“."
+" ръководството. Вместо нея пробвайте „man.<tool>.cmd“."
-#: builtin/help.c:217
+#: builtin/help.c:219
#, c-format
msgid ""
"'%s': cmd for supported man viewer.\n"
"Please consider using 'man.<tool>.path' instead."
msgstr ""
"„%s“: команда за поддържана програма за преглед на\n"
-" ръководството. Вместо нея пробвайте „man.<tool>.path“."
+" ръководството. Вместо нея пробвайте „man.<tool>.path“."
-#: builtin/help.c:334
+#: builtin/help.c:336
#, c-format
msgid "'%s': unknown man viewer."
msgstr "„%s“: непозната програма за преглед на ръководството."
-#: builtin/help.c:351
+#: builtin/help.c:353
msgid "no man viewer handled the request"
msgstr "никоя програма за преглед на ръководство не успя да обработи заявката"
-#: builtin/help.c:359
+#: builtin/help.c:361
msgid "no info viewer handled the request"
msgstr ""
"никоя програма за преглед на информационните страници не успя да обработи "
"заявката"
-#: builtin/help.c:408
+#: builtin/help.c:403
msgid "Defining attributes per path"
msgstr "Указване на атрибути към път"
-#: builtin/help.c:409
+#: builtin/help.c:404
msgid "Everyday Git With 20 Commands Or So"
msgstr "Ежедневието в Git в рамките на 20-ина команди"
-#: builtin/help.c:410
+#: builtin/help.c:405
msgid "A Git glossary"
msgstr "Речник с термините на Git"
-#: builtin/help.c:411
+#: builtin/help.c:406
msgid "Specifies intentionally untracked files to ignore"
msgstr "Указване на неследени файлове, които да бъдат нарочно пренебрегвани"
-#: builtin/help.c:412
+#: builtin/help.c:407
msgid "Defining submodule properties"
msgstr "Дефиниране на свойствата на подмодулите"
-#: builtin/help.c:413
+#: builtin/help.c:408
msgid "Specifying revisions and ranges for Git"
-msgstr "Указване на версии и интервали в Git"
+msgstr "Указване на версии и диапазони в Git"
-#: builtin/help.c:414
+#: builtin/help.c:409
msgid "A tutorial introduction to Git (for version 1.5.1 or newer)"
msgstr "Въвеждащ урок за Git (версии поне 1.5.1)"
-#: builtin/help.c:415
+#: builtin/help.c:410
msgid "An overview of recommended workflows with Git"
msgstr "Общ преглед на препоръчваните начини за работа с Git"
-#: builtin/help.c:427
+#: builtin/help.c:422
msgid "The common Git guides are:\n"
msgstr "Популярните пътеводители в Git са:\n"
-#: builtin/help.c:448 builtin/help.c:465
-#, c-format
-msgid "usage: %s%s"
-msgstr "употреба: %s%s"
-
-#: builtin/help.c:481
+#: builtin/help.c:440
#, c-format
msgid "`git %s' is aliased to `%s'"
msgstr "„git %s“ е синоним на „%s“"
+#: builtin/help.c:462 builtin/help.c:479
+#, c-format
+msgid "usage: %s%s"
+msgstr "употреба: %s%s"
+
# FIXME merge with next?
-#: builtin/index-pack.c:152
+#: builtin/index-pack.c:154
#, c-format
msgid "unable to open %s"
msgstr "обектът „%s“ не може да бъде отворен"
-#: builtin/index-pack.c:202
+#: builtin/index-pack.c:204
#, c-format
msgid "object type mismatch at %s"
msgstr "неправилен вид на обекта „%s“"
-#: builtin/index-pack.c:222
+#: builtin/index-pack.c:224
#, c-format
msgid "did not receive expected object %s"
msgstr "очакваният обект „%s“ не бе получен"
-#: builtin/index-pack.c:225
+#: builtin/index-pack.c:227
#, c-format
msgid "object %s: expected type %s, found %s"
msgstr "неправилен вид на обекта „%s“: очакваше се „%s“, а бе получен „%s“"
-#: builtin/index-pack.c:267
+#: builtin/index-pack.c:269
#, c-format
msgid "cannot fill %d byte"
msgid_plural "cannot fill %d bytes"
msgstr[0] "не може да се запълни %d байт"
msgstr[1] "не може да се запълнят %d байта"
-#: builtin/index-pack.c:277
+#: builtin/index-pack.c:279
msgid "early EOF"
msgstr "неочакван край на файл"
-#: builtin/index-pack.c:278
+#: builtin/index-pack.c:280
msgid "read error on input"
msgstr "грешка при четене на входните данни"
-#: builtin/index-pack.c:290
+#: builtin/index-pack.c:292
msgid "used more bytes than were available"
msgstr "използвани са повече от наличните байтове"
-#: builtin/index-pack.c:297
+#: builtin/index-pack.c:299
msgid "pack too large for current definition of off_t"
msgstr "пакетният файл е прекалено голям за текущата стойност на типа „off_t“"
-#: builtin/index-pack.c:313
+#: builtin/index-pack.c:302 builtin/unpack-objects.c:92
+msgid "pack exceeds maximum allowed size"
+msgstr "пакетният файл надвишава максималния възможен размер"
+
+#: builtin/index-pack.c:317
#, c-format
msgid "unable to create '%s'"
msgstr "пакетният файл „%s“ не може да бъде създаден"
-#: builtin/index-pack.c:318
+#: builtin/index-pack.c:322
#, c-format
msgid "cannot open packfile '%s'"
msgstr "пакетният файл „%s“ не може да бъде отворен"
-#: builtin/index-pack.c:332
+#: builtin/index-pack.c:336
msgid "pack signature mismatch"
msgstr "несъответствие в подписа към пакетния файл"
-#: builtin/index-pack.c:334
+#: builtin/index-pack.c:338
#, c-format
msgid "pack version %<PRIu32> unsupported"
msgstr "не се поддържа пакетиране вeрсия „%<PRIu32>“"
-#: builtin/index-pack.c:352
+#: builtin/index-pack.c:356
#, c-format
-msgid "pack has bad object at offset %lu: %s"
-msgstr "повреден обект в пакетния файл при отместване %lu: %s"
+msgid "pack has bad object at offset %<PRIuMAX>: %s"
+msgstr "повреден обект в пакетния файл при отместване %<PRIuMAX>: %s"
-#: builtin/index-pack.c:473
+#: builtin/index-pack.c:478
#, c-format
msgid "inflate returned %d"
msgstr "декомпресирането с „inflate“ върна %d"
-#: builtin/index-pack.c:522
+#: builtin/index-pack.c:527
msgid "offset value overflow for delta base object"
msgstr "стойността на отместването за обекта-разлика води до препълване"
-#: builtin/index-pack.c:530
+#: builtin/index-pack.c:535
msgid "delta base offset is out of bound"
msgstr "стойността на отместването за обекта-разлика е извън диапазона"
-#: builtin/index-pack.c:538
+#: builtin/index-pack.c:543
#, c-format
msgid "unknown object type %d"
msgstr "непознат вид обект %d"
-#: builtin/index-pack.c:569
+#: builtin/index-pack.c:574
msgid "cannot pread pack file"
msgstr "пакетният файл не може да бъде прочетен"
-#: builtin/index-pack.c:571
+#: builtin/index-pack.c:576
#, c-format
-msgid "premature end of pack file, %lu byte missing"
-msgid_plural "premature end of pack file, %lu bytes missing"
-msgstr[0] "неочакван край на файл, липсва %lu байт"
-msgstr[1] "неочакван край на файл, липсват %lu байта"
+msgid "premature end of pack file, %<PRIuMAX> byte missing"
+msgid_plural "premature end of pack file, %<PRIuMAX> bytes missing"
+msgstr[0] "неочакван край на файл, липсва %<PRIuMAX> байт"
+msgstr[1] "неочакван край на файл, липсват %<PRIuMAX> байта"
-#: builtin/index-pack.c:597
+#: builtin/index-pack.c:602
msgid "serious inflate inconsistency"
msgstr "сериозна грешка при декомпресиране с „inflate“"
-#: builtin/index-pack.c:743 builtin/index-pack.c:749 builtin/index-pack.c:772
-#: builtin/index-pack.c:806 builtin/index-pack.c:815
+#: builtin/index-pack.c:748 builtin/index-pack.c:754 builtin/index-pack.c:777
+#: builtin/index-pack.c:811 builtin/index-pack.c:820
#, c-format
msgid "SHA1 COLLISION FOUND WITH %s !"
msgstr ""
"СЪВПАДЕНИЕ НА СТОЙНОСТИТЕ ЗА СУМИТЕ ЗА SHA1: „%s“ НА ДВА РАЗЛИЧНИ ОБЕКТА!"
# FIXME merge with next?
-#: builtin/index-pack.c:746 builtin/pack-objects.c:162
-#: builtin/pack-objects.c:254
+#: builtin/index-pack.c:751 builtin/pack-objects.c:166
+#: builtin/pack-objects.c:258
#, c-format
msgid "unable to read %s"
msgstr "обектът „%s“ не може да бъде прочетен"
-#: builtin/index-pack.c:812
+#: builtin/index-pack.c:817
#, c-format
msgid "cannot read existing object %s"
msgstr "съществуващият обект „%s“ не може да бъде прочетен"
-#: builtin/index-pack.c:826
+#: builtin/index-pack.c:831
#, c-format
msgid "invalid blob object %s"
msgstr "неправилен обект BLOB „%s“"
# FIXME perhaps invalid object
-#: builtin/index-pack.c:840
+#: builtin/index-pack.c:845
#, c-format
msgid "invalid %s"
msgstr "неправилен обект „%s“"
-#: builtin/index-pack.c:843
+#: builtin/index-pack.c:848
msgid "Error in object"
msgstr "Грешка в обекта"
-#: builtin/index-pack.c:845
+#: builtin/index-pack.c:850
#, c-format
msgid "Not all child objects of %s are reachable"
msgstr "Някои обекти, наследници на „%s“, не могат да бъдат достигнати"
-#: builtin/index-pack.c:917 builtin/index-pack.c:948
+#: builtin/index-pack.c:922 builtin/index-pack.c:953
msgid "failed to apply delta"
msgstr "разликата не може да бъде приложена"
-#: builtin/index-pack.c:1118
+#: builtin/index-pack.c:1123
msgid "Receiving objects"
msgstr "Получаване на обекти"
-#: builtin/index-pack.c:1118
+#: builtin/index-pack.c:1123
msgid "Indexing objects"
msgstr "Индексиране на обекти"
-#: builtin/index-pack.c:1150
+#: builtin/index-pack.c:1155
msgid "pack is corrupted (SHA1 mismatch)"
msgstr "пакетният файл е повреден (нееднакви суми по SHA1)"
-#: builtin/index-pack.c:1155
+#: builtin/index-pack.c:1160
msgid "cannot fstat packfile"
msgstr "не може да се получи информация за пакетния файл с „fstat“"
-#: builtin/index-pack.c:1158
+#: builtin/index-pack.c:1163
msgid "pack has junk at the end"
msgstr "в края на пакетния файл има повредени данни"
-# FIXME WTF message
-#: builtin/index-pack.c:1169
+#: builtin/index-pack.c:1174
msgid "confusion beyond insanity in parse_pack_objects()"
msgstr ""
-"фатална грешка във функцията „parse_pack_objects“. Това е грешка в Git, "
+"фатална грешка във функцията „parse_pack_objects“. Това е грешка в Git, "
"докладвайте я на разработчиците, като пратите е-писмо на адрес: „git@vger."
"kernel.org“."
-#: builtin/index-pack.c:1194
+#: builtin/index-pack.c:1197
msgid "Resolving deltas"
msgstr "Откриване на съответните разлики"
-#: builtin/index-pack.c:1205
+#: builtin/index-pack.c:1208
#, c-format
msgid "unable to create thread: %s"
msgstr "не може да се създаде нишка: %s"
-# FIXME WTF message
-#: builtin/index-pack.c:1247
+#: builtin/index-pack.c:1250
msgid "confusion beyond insanity"
msgstr ""
-"фатална грешка във функцията „conclude_pack“. Това е грешка в Git, "
+"фатална грешка във функцията „conclude_pack“. Това е грешка в Git, "
"докладвайте я на разработчиците, като пратите е-писмо на адрес: „git@vger."
"kernel.org“."
-#: builtin/index-pack.c:1253
+#: builtin/index-pack.c:1256
#, c-format
msgid "completed with %d local object"
msgid_plural "completed with %d local objects"
msgstr[0] "действието завърши с %d локален обект"
msgstr[1] "действието завърши с %d локални обекта"
-#: builtin/index-pack.c:1265
+#: builtin/index-pack.c:1268
#, c-format
msgid "Unexpected tail checksum for %s (disk corruption?)"
msgstr ""
"Неочаквана последваща сума за грешки за „%s“ (причината може да е грешка в "
"диска)"
-#: builtin/index-pack.c:1269
+#: builtin/index-pack.c:1272
#, c-format
msgid "pack has %d unresolved delta"
msgid_plural "pack has %d unresolved deltas"
msgstr[0] "в пакета има %d ненапасваща разлика"
msgstr[1] "в пакета има %d ненапасващи разлики"
-#: builtin/index-pack.c:1293
+#: builtin/index-pack.c:1296
#, c-format
msgid "unable to deflate appended object (%d)"
msgstr "добавеният обект не може да се компресира с „deflate“: %d"
-#: builtin/index-pack.c:1369
+#: builtin/index-pack.c:1372
#, c-format
msgid "local object %s is corrupt"
msgstr "локалният обект „%s“ е повреден"
-#: builtin/index-pack.c:1393
+#: builtin/index-pack.c:1396
msgid "error while closing pack file"
msgstr "грешка при затварянето на пакетния файл"
-#: builtin/index-pack.c:1406
+#: builtin/index-pack.c:1409
#, c-format
msgid "cannot write keep file '%s'"
msgstr ""
"грешка при записването на файла „%s“, осигуряващ запазване на директория"
-#: builtin/index-pack.c:1414
+#: builtin/index-pack.c:1417
#, c-format
msgid "cannot close written keep file '%s'"
msgstr ""
"грешка при затварянето на записания файл „%s“, осигуряващ запазване на "
"директория"
-#: builtin/index-pack.c:1427
+#: builtin/index-pack.c:1430
msgid "cannot store pack file"
msgstr "пакетният файл не може да бъде запазен"
-#: builtin/index-pack.c:1438
+#: builtin/index-pack.c:1441
msgid "cannot store index file"
msgstr "файлът за индекса не може да бъде съхранен"
-#: builtin/index-pack.c:1471
+#: builtin/index-pack.c:1474
#, c-format
msgid "bad pack.indexversion=%<PRIu32>"
msgstr "зададена е неправилна версия пакетиране: „pack.indexversion=%<PRIu32>“"
-#: builtin/index-pack.c:1481 builtin/index-pack.c:1678
+#: builtin/index-pack.c:1484 builtin/index-pack.c:1681
#, c-format
msgid "no threads support, ignoring %s"
-msgstr "липсва поддръжка за нишки. „%s“ ще се пренебрегне"
+msgstr "липсва поддръжка за нишки. „%s“ ще се пренебрегне"
-#: builtin/index-pack.c:1540
+#: builtin/index-pack.c:1542
#, c-format
msgid "Cannot open existing pack file '%s'"
msgstr "Съществуващият пакетен файл „%s“ не може да бъде отворен"
-#: builtin/index-pack.c:1542
+#: builtin/index-pack.c:1544
#, c-format
msgid "Cannot open existing pack idx file for '%s'"
msgstr "Съществуващият индекс за пакетния файл „%s“ не може да бъде отворен"
-#: builtin/index-pack.c:1589
+#: builtin/index-pack.c:1591
#, c-format
msgid "non delta: %d object"
msgid_plural "non delta: %d objects"
msgstr[0] "%d обект не е разлика"
msgstr[1] "%d обекта не са разлика"
-#: builtin/index-pack.c:1596
+#: builtin/index-pack.c:1598
#, c-format
msgid "chain length = %d: %lu object"
msgid_plural "chain length = %d: %lu objects"
msgstr[0] "дължината на веригата е %d: %lu обект"
msgstr[1] "дължината на веригата е %d: %lu обекта"
-#: builtin/index-pack.c:1609
+#: builtin/index-pack.c:1611
#, c-format
msgid "packfile name '%s' does not end with '.pack'"
msgstr "името на пакетния файл „%s“ не завършва на „.pack“"
-# FIXME it is not the cwd it is the previous cwd
-#: builtin/index-pack.c:1638
-msgid "Cannot come back to cwd"
-msgstr "Процесът не може да се върне към предишната работна директория"
-
-#: builtin/index-pack.c:1690 builtin/index-pack.c:1693
-#: builtin/index-pack.c:1705 builtin/index-pack.c:1709
+#: builtin/index-pack.c:1693 builtin/index-pack.c:1696
+#: builtin/index-pack.c:1712 builtin/index-pack.c:1716
#, c-format
msgid "bad %s"
msgstr "неправилна стойност „%s“"
-#: builtin/index-pack.c:1723
+#: builtin/index-pack.c:1732
msgid "--fix-thin cannot be used without --stdin"
msgstr "опцията „--fix-thin“ изисква „--stdin“"
-#: builtin/index-pack.c:1731
+#: builtin/index-pack.c:1740
msgid "--verify with no packfile name given"
msgstr "опцията „--verify“ изисква име на пакетен файл"
-#: builtin/init-db.c:55
+#: builtin/init-db.c:54
#, c-format
msgid "cannot stat '%s'"
msgstr "не може да се получи информация чрез „stat“ за директорията „%s“"
-#: builtin/init-db.c:61
+#: builtin/init-db.c:60
#, c-format
msgid "cannot stat template '%s'"
msgstr "не може да се получи информация чрез „stat“ за шаблона „%s“"
-#: builtin/init-db.c:66
+#: builtin/init-db.c:65
#, c-format
msgid "cannot opendir '%s'"
msgstr "директорията „%s“ не може да бъде отворена"
-#: builtin/init-db.c:77
+#: builtin/init-db.c:76
#, c-format
msgid "cannot readlink '%s'"
msgstr "връзката „%s“ не може да бъде прочетена"
-#: builtin/init-db.c:79
+#: builtin/init-db.c:78
#, c-format
msgid "cannot symlink '%s' '%s'"
msgstr "не може да се създаде символна връзка „%s“ в „%s“"
-#: builtin/init-db.c:85
+#: builtin/init-db.c:84
#, c-format
msgid "cannot copy '%s' to '%s'"
msgstr "„%s“ не може да се копира в „%s“"
-#: builtin/init-db.c:89
+#: builtin/init-db.c:88
#, c-format
msgid "ignoring template %s"
msgstr "игнориране на шаблона „%s“"
-#: builtin/init-db.c:120
+#: builtin/init-db.c:119
#, c-format
msgid "templates not found %s"
msgstr "директорията с шаблоните не е открита: „%s“"
-#: builtin/init-db.c:135
+#: builtin/init-db.c:134
#, c-format
msgid "not copying templates from '%s': %s"
msgstr "шаблоните няма да бъдат копирани от „%s“: „%s“"
-#: builtin/init-db.c:312 builtin/init-db.c:315
-#, c-format
-msgid "%s already exists"
-msgstr "Директорията „%s“ вече съществува"
-
-#: builtin/init-db.c:344
+#: builtin/init-db.c:327
#, c-format
msgid "unable to handle file type %d"
msgstr "файлове от вид %d не се поддържат"
-#: builtin/init-db.c:347
+#: builtin/init-db.c:330
#, c-format
msgid "unable to move %s to %s"
msgstr "„%s“ не може да се премести в „%s“"
-#. TRANSLATORS: The first '%s' is either "Reinitialized
-#. existing" or "Initialized empty", the second " shared" or
-#. "", and the last '%s%s' is the verbatim directory name.
+#: builtin/init-db.c:347 builtin/init-db.c:350
+#, c-format
+msgid "%s already exists"
+msgstr "Директорията „%s“ вече съществува"
+
#: builtin/init-db.c:403
#, c-format
-msgid "%s%s Git repository in %s%s\n"
-msgstr "%s%s хранилище на Git в „%s%s“\n"
+msgid "Reinitialized existing shared Git repository in %s%s\n"
+msgstr ""
+"Инициализиране наново на съществуващо, споделено хранилище на Git в „%s%s“\n"
#: builtin/init-db.c:404
-msgid "Reinitialized existing"
-msgstr "Наново инициализирано, съществуващо"
+#, c-format
+msgid "Reinitialized existing Git repository in %s%s\n"
+msgstr "Инициализиране наново на съществуващо хранилище на Git в „%s%s“\n"
-#: builtin/init-db.c:404
-msgid "Initialized empty"
-msgstr "Инициализирано празно"
+#: builtin/init-db.c:408
+#, c-format
+msgid "Initialized empty shared Git repository in %s%s\n"
+msgstr "Инициализиране на празно, споделено хранилище на Git в „%s%s“\n"
-#: builtin/init-db.c:405
-msgid " shared"
-msgstr ", споделено"
+#: builtin/init-db.c:409
+#, c-format
+msgid "Initialized empty Git repository in %s%s\n"
+msgstr "Инициализиране на празно хранилище на Git в „%s%s“\n"
-#: builtin/init-db.c:452
+#: builtin/init-db.c:457
msgid ""
"git init [-q | --quiet] [--bare] [--template=<template-directory>] [--"
"shared[=<permissions>]] [<directory>]"
@@ -7810,27 +8813,27 @@ msgstr ""
"git init [-q | --quiet] [--bare] [--template=ДИРЕКТОРИЯ_С_ШАБЛОНИ] [--"
"shared[=ПРАВА]] [ДИРЕКТОРИЯ]"
-#: builtin/init-db.c:475
+#: builtin/init-db.c:480
msgid "permissions"
msgstr "права"
-#: builtin/init-db.c:476
+#: builtin/init-db.c:481
msgid "specify that the git repository is to be shared amongst several users"
msgstr ""
"указване, че хранилището на Git ще бъде споделено от повече от един "
"потребител"
-#: builtin/init-db.c:510 builtin/init-db.c:515
+#: builtin/init-db.c:515 builtin/init-db.c:520
#, c-format
msgid "cannot mkdir %s"
msgstr "директорията „%s“ не може да бъде създадена"
-#: builtin/init-db.c:519
+#: builtin/init-db.c:524
#, c-format
msgid "cannot chdir to %s"
msgstr "не може да се влезе в директорията „%s“"
-#: builtin/init-db.c:540
+#: builtin/init-db.c:545
#, c-format
msgid ""
"%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-"
@@ -7839,7 +8842,7 @@ msgstr ""
"%s (или --work-tree=ДИРЕКТОРИЯ) изисква указването на %s (или --git-"
"dir=ДИРЕКТОРИЯ)"
-#: builtin/init-db.c:568
+#: builtin/init-db.c:573
#, c-format
msgid "Cannot access work tree '%s'"
msgstr "Работното дърво в „%s“ е недостъпно"
@@ -7872,340 +8875,340 @@ msgstr "епилог(зи) за добавяне"
msgid "no input file given for in-place editing"
msgstr "не е зададен входен файл за редактиране на място"
-#: builtin/log.c:43
+#: builtin/log.c:44
msgid "git log [<options>] [<revision-range>] [[--] <path>...]"
msgstr "git log [ОПЦИЯ…] [ДИАПАЗОН_НА_ВЕРСИИТЕ] [[--] ПЪТ…]"
-#: builtin/log.c:44
+#: builtin/log.c:45
msgid "git show [<options>] <object>..."
msgstr "git show [ОПЦИЯ…] ОБЕКТ…"
-#: builtin/log.c:83
+#: builtin/log.c:84
#, c-format
msgid "invalid --decorate option: %s"
msgstr "неправилна опция „--decorate“: %s"
-#: builtin/log.c:137
+#: builtin/log.c:139
msgid "suppress diff output"
msgstr "без извеждане на разликите"
-#: builtin/log.c:138
+#: builtin/log.c:140
msgid "show source"
msgstr "извеждане на изходния код"
-#: builtin/log.c:139
+#: builtin/log.c:141
msgid "Use mail map file"
msgstr ""
"Използване на файл за съответствията на имената и адресите на е-поща („."
"mailmap“)"
-#: builtin/log.c:140
+#: builtin/log.c:142
msgid "decorate options"
msgstr "настройки на форма̀та на извежданата информация"
-#: builtin/log.c:143
+#: builtin/log.c:145
msgid "Process line range n,m in file, counting from 1"
msgstr ""
-"Обработване само на редовете във файла в интервала от n до m включително. "
+"Обработване само на редовете във файла в диапазона от n до m включително. "
"Броенето започва от 1"
-#: builtin/log.c:239
+#: builtin/log.c:241
#, c-format
msgid "Final output: %d %s\n"
msgstr "Резултат: %d %s\n"
-#: builtin/log.c:471
+#: builtin/log.c:486
#, c-format
msgid "git show %s: bad file"
msgstr "git show %s: повреден файл"
-#: builtin/log.c:485 builtin/log.c:578
+#: builtin/log.c:500 builtin/log.c:594
#, c-format
msgid "Could not read object %s"
msgstr "Обектът не може да бъде прочетен: %s"
-#: builtin/log.c:602
+#: builtin/log.c:618
#, c-format
msgid "Unknown type: %d"
msgstr "Неизвестен вид: %d"
-#: builtin/log.c:722
+#: builtin/log.c:739
msgid "format.headers without value"
msgstr "не е зададена стойност на „format.headers“"
-#: builtin/log.c:812
+#: builtin/log.c:839
msgid "name of output directory is too long"
msgstr "прекалено дълго име на директорията за изходната информация"
-#: builtin/log.c:827
+#: builtin/log.c:854
#, c-format
msgid "Cannot open patch file %s"
msgstr "Файлът-кръпка „%s“ не може да бъде отворен"
-#: builtin/log.c:841
+#: builtin/log.c:868
msgid "Need exactly one range."
msgstr "Трябва да зададете точно един диапазон."
-#: builtin/log.c:851
+#: builtin/log.c:878
msgid "Not a range."
msgstr "Не е диапазон."
-#: builtin/log.c:957
+#: builtin/log.c:984
msgid "Cover letter needs email format"
msgstr "Придружаващото писмо трябва да е форматирано като е-писмо"
-# FIXME bad wording insanely
-#: builtin/log.c:1036
+#: builtin/log.c:1063
#, c-format
msgid "insane in-reply-to: %s"
msgstr "неправилен формат на заглавната част за отговор „in-reply-to“: %s"
-#: builtin/log.c:1064
+#: builtin/log.c:1091
msgid "git format-patch [<options>] [<since> | <revision-range>]"
msgstr "git format-patch [ОПЦИЯ…] [ОТ | ДИАПАЗОН_НА_ВЕРСИИТЕ]"
-#: builtin/log.c:1109
+#: builtin/log.c:1141
msgid "Two output directories?"
msgstr "Можете да укажете максимум една директория за изход."
-#: builtin/log.c:1216 builtin/log.c:1857 builtin/log.c:1859 builtin/log.c:1871
+#: builtin/log.c:1248 builtin/log.c:1891 builtin/log.c:1893 builtin/log.c:1905
#, c-format
msgid "Unknown commit %s"
msgstr "Непознато подаване „%s“"
-#: builtin/log.c:1226 builtin/notes.c:253 builtin/notes.c:304
-#: builtin/notes.c:306 builtin/notes.c:369 builtin/notes.c:424
-#: builtin/notes.c:510 builtin/notes.c:515 builtin/notes.c:593
-#: builtin/notes.c:656 builtin/notes.c:881 builtin/tag.c:455
+#: builtin/log.c:1258 builtin/notes.c:884 builtin/tag.c:455
#, c-format
msgid "Failed to resolve '%s' as a valid ref."
msgstr "Не може да се открие към какво сочи „%s“."
-#: builtin/log.c:1231
+#: builtin/log.c:1263
msgid "Could not find exact merge base."
msgstr "Точната база за сливане не може да се открие."
-#: builtin/log.c:1235
+#: builtin/log.c:1267
msgid ""
"Failed to get upstream, if you want to record base commit automatically,\n"
"please use git branch --set-upstream-to to track a remote branch.\n"
"Or you could specify base commit by --base=<base-commit-id> manually."
msgstr ""
-"Следеният клон не може да бъде установен. Ако искате ръчно да го\n"
+"Следеният клон не може да бъде установен. Ако искате ръчно да го\n"
"зададете, използвайте „git branch --set-upstream-to“.\n"
"Можете ръчно да зададете базово подаване чрез „--base=<base-commit-id>“."
-#: builtin/log.c:1255
+#: builtin/log.c:1287
msgid "Failed to find exact merge base"
msgstr "Точната база при сливане не може да бъде открита"
-#: builtin/log.c:1266
+#: builtin/log.c:1298
msgid "base commit should be the ancestor of revision list"
msgstr "базовото подаване трябва да е предшественикът на списъка с версиите"
-#: builtin/log.c:1270
+#: builtin/log.c:1302
msgid "base commit shouldn't be in revision list"
msgstr "базовото подаване не може да е в списъка с версиите"
-#: builtin/log.c:1319
+#: builtin/log.c:1351
msgid "cannot get patch id"
msgstr "идентификаторът на кръпката не може да бъде получен"
-#: builtin/log.c:1377
+#: builtin/log.c:1408
msgid "use [PATCH n/m] even with a single patch"
msgstr "номерация „[PATCH n/m]“ дори и при единствена кръпка"
-#: builtin/log.c:1380
+#: builtin/log.c:1411
msgid "use [PATCH] even with multiple patches"
msgstr "номерация „[PATCH]“ дори и при множество кръпки"
-#: builtin/log.c:1384
+#: builtin/log.c:1415
msgid "print patches to standard out"
msgstr "извеждане на кръпките на стандартния изход"
-#: builtin/log.c:1386
+#: builtin/log.c:1417
msgid "generate a cover letter"
msgstr "създаване на придружаващо писмо"
-#: builtin/log.c:1388
+#: builtin/log.c:1419
msgid "use simple number sequence for output file names"
msgstr "проста числова последователност за имената на файловете-кръпки"
-#: builtin/log.c:1389
+#: builtin/log.c:1420
msgid "sfx"
msgstr "ЗНАЦИ"
-#: builtin/log.c:1390
+#: builtin/log.c:1421
msgid "use <sfx> instead of '.patch'"
msgstr "използване на тези ЗНАЦИ за суфикс вместо „.patch“"
-#: builtin/log.c:1392
+#: builtin/log.c:1423
msgid "start numbering patches at <n> instead of 1"
msgstr "номерирането на кръпките да започва от този БРОЙ, а не с 1"
-#: builtin/log.c:1394
+#: builtin/log.c:1425
msgid "mark the series as Nth re-roll"
msgstr "отбелязване, че това е N-тата поредна редакция на поредицата от кръпки"
-#: builtin/log.c:1396
+#: builtin/log.c:1427
+msgid "Use [RFC PATCH] instead of [PATCH]"
+msgstr "Използване на „[RFC PATCH]“ вместо „[PATCH]“"
+
+#: builtin/log.c:1430
msgid "Use [<prefix>] instead of [PATCH]"
msgstr "Използване на този „[ПРЕФИКС]“ вместо „[PATCH]“"
-#: builtin/log.c:1399
+#: builtin/log.c:1433
msgid "store resulting files in <dir>"
msgstr "запазване на изходните файлове в тази ДИРЕКТОРИЯ"
-#: builtin/log.c:1402
+#: builtin/log.c:1436
msgid "don't strip/add [PATCH]"
msgstr "без добавяне/махане на префикса „[PATCH]“"
-#: builtin/log.c:1405
+#: builtin/log.c:1439
msgid "don't output binary diffs"
msgstr "без извеждане на разлики между двоични файлове"
-#: builtin/log.c:1407
+#: builtin/log.c:1441
msgid "output all-zero hash in From header"
msgstr "в заглавната част „From:“ (от) хешът да е само от нули"
-#: builtin/log.c:1409
+#: builtin/log.c:1443
msgid "don't include a patch matching a commit upstream"
msgstr "да не се включват кръпки, които присъстват в следения клон"
-#: builtin/log.c:1411
+#: builtin/log.c:1445
msgid "show patch format instead of default (patch + stat)"
msgstr ""
"извеждане във формат за кръпки, а на в стандартния (кръпка и статистика)"
-#: builtin/log.c:1413
+#: builtin/log.c:1447
msgid "Messaging"
msgstr "Опции при изпращане"
-#: builtin/log.c:1414
+#: builtin/log.c:1448
msgid "header"
msgstr "ЗАГЛАВНА_ЧАСТ"
-#: builtin/log.c:1415
+#: builtin/log.c:1449
msgid "add email header"
msgstr "добавяне на тази ЗАГЛАВНА_ЧАСТ"
-#: builtin/log.c:1416 builtin/log.c:1418
+#: builtin/log.c:1450 builtin/log.c:1452
msgid "email"
msgstr "Е-ПОЩА"
-#: builtin/log.c:1416
+#: builtin/log.c:1450
msgid "add To: header"
msgstr "добавяне на заглавна част „To:“ (до)"
-#: builtin/log.c:1418
+#: builtin/log.c:1452
msgid "add Cc: header"
msgstr "добавяне на заглавна част „Cc:“ (и до)"
-#: builtin/log.c:1420
+#: builtin/log.c:1454
msgid "ident"
msgstr "ИДЕНТИЧНОСТ"
-#: builtin/log.c:1421
+#: builtin/log.c:1455
msgid "set From address to <ident> (or committer ident if absent)"
msgstr ""
-"задаване на адреса в заглавната част „From“ (от) да е тази ИДЕНТИЧНОСТ. Ако "
+"задаване на адреса в заглавната част „From“ (от) да е тази ИДЕНТИЧНОСТ. Ако "
"не е зададена такава, се взима адреса на подаващия"
-#: builtin/log.c:1423
+#: builtin/log.c:1457
msgid "message-id"
msgstr "ИДЕНТИФИКАТОР_НА_СЪОБЩЕНИЕ"
-#: builtin/log.c:1424
+#: builtin/log.c:1458
msgid "make first mail a reply to <message-id>"
msgstr ""
"първото съобщение да е в отговор на е-писмото с този "
"ИДЕНТИФИКАТОР_НА_СЪОБЩЕНИЕ"
-#: builtin/log.c:1425 builtin/log.c:1428
+#: builtin/log.c:1459 builtin/log.c:1462
msgid "boundary"
msgstr "граница"
-#: builtin/log.c:1426
+#: builtin/log.c:1460
msgid "attach the patch"
msgstr "прикрепяне на кръпката"
-#: builtin/log.c:1429
+#: builtin/log.c:1463
msgid "inline the patch"
msgstr "включване на кръпката в текста на писмата"
-#: builtin/log.c:1433
+#: builtin/log.c:1467
msgid "enable message threading, styles: shallow, deep"
msgstr ""
-"използване на нишки за съобщенията. СТИЛът е „shallow“ (плитък) или "
+"използване на нишки за съобщенията. СТИЛът е „shallow“ (плитък) или "
"„deep“ (дълбок)"
-#: builtin/log.c:1435
+#: builtin/log.c:1469
msgid "signature"
msgstr "подпис"
-#: builtin/log.c:1436
+#: builtin/log.c:1470
msgid "add a signature"
msgstr "добавяне на поле за подпис"
-#: builtin/log.c:1437
+#: builtin/log.c:1471
msgid "base-commit"
msgstr "БАЗОВО_ПОДАВАНЕ"
-#: builtin/log.c:1438
+#: builtin/log.c:1472
msgid "add prerequisite tree info to the patch series"
msgstr "добавяне на необходимото БАЗово дърво към серията кръпки"
-#: builtin/log.c:1440
+#: builtin/log.c:1474
msgid "add a signature from a file"
msgstr "добавяне на подпис от файл"
-#: builtin/log.c:1441
+#: builtin/log.c:1475
msgid "don't print the patch filenames"
msgstr "без извеждане на имената на кръпките"
-#: builtin/log.c:1531
+#: builtin/log.c:1565
msgid "-n and -k are mutually exclusive."
msgstr "опциите „-n“ и „-k“ са несъвместими."
-#: builtin/log.c:1533
-msgid "--subject-prefix and -k are mutually exclusive."
-msgstr "опциите „--subject-prefix“ и „-k“ са несъвместими."
+#: builtin/log.c:1567
+msgid "--subject-prefix/--rfc and -k are mutually exclusive."
+msgstr "опциите „--subject-prefix“/„-rfc“ и „-k“ са несъвместими."
-#: builtin/log.c:1541
+#: builtin/log.c:1575
msgid "--name-only does not make sense"
msgstr "опцията „--name-only“ е несъвместима с генерирането на кръпки"
-#: builtin/log.c:1543
+#: builtin/log.c:1577
msgid "--name-status does not make sense"
msgstr "опцията „--name-status“ е несъвместима с генерирането на кръпки"
-#: builtin/log.c:1545
+#: builtin/log.c:1579
msgid "--check does not make sense"
msgstr "опцията „--check“ е несъвместима с генерирането на кръпки"
-#: builtin/log.c:1573
+#: builtin/log.c:1609
msgid "standard output, or directory, which one?"
msgstr ""
"изходът може да или стандартният, или да е в директория, но не и двете."
-#: builtin/log.c:1575
+#: builtin/log.c:1611
#, c-format
msgid "Could not create directory '%s'"
msgstr "Директорията „%s“ не може да бъде създадена"
-#: builtin/log.c:1672
+#: builtin/log.c:1705
#, c-format
msgid "unable to read signature file '%s'"
msgstr "файлът „%s“ с подпис не може да бъде прочетен"
-#: builtin/log.c:1743
+#: builtin/log.c:1777
msgid "Failed to create output files"
msgstr "Изходните файлове не могат да бъдат създадени"
-#: builtin/log.c:1792
+#: builtin/log.c:1826
msgid "git cherry [-v] [<upstream> [<head> [<limit>]]]"
msgstr "git cherry [-v] [ОТДАЛЕЧЕН_КЛОН [ВРЪХ [ПРЕДЕЛ]]]"
-#: builtin/log.c:1846
+#: builtin/log.c:1880
#, c-format
msgid ""
"Could not find a tracked remote branch, please specify <upstream> manually.\n"
@@ -8213,102 +9216,106 @@ msgstr ""
"Следеният отдалечен клон не бе открит, затова изрично задайте "
"ОТДАЛЕЧЕН_КЛОН.\n"
-#: builtin/ls-files.c:378
+#: builtin/ls-files.c:458
msgid "git ls-files [<options>] [<file>...]"
msgstr "git ls-files [ОПЦИЯ…] [ФАЙЛ…]"
-#: builtin/ls-files.c:427
+#: builtin/ls-files.c:507
msgid "identify the file status with tags"
msgstr "извеждане на състоянието на файловете с еднобуквени флагове"
-#: builtin/ls-files.c:429
+#: builtin/ls-files.c:509
msgid "use lowercase letters for 'assume unchanged' files"
msgstr "малки букви за файловете, които да се счетат за непроменени"
-#: builtin/ls-files.c:431
+#: builtin/ls-files.c:511
msgid "show cached files in the output (default)"
msgstr "извеждане на кешираните файлове (стандартно)"
-#: builtin/ls-files.c:433
+#: builtin/ls-files.c:513
msgid "show deleted files in the output"
msgstr "извеждане на изтритите файлове"
-#: builtin/ls-files.c:435
+#: builtin/ls-files.c:515
msgid "show modified files in the output"
msgstr "извеждане на променените файлове"
-#: builtin/ls-files.c:437
+#: builtin/ls-files.c:517
msgid "show other files in the output"
msgstr "извеждане на другите файлове"
-#: builtin/ls-files.c:439
+#: builtin/ls-files.c:519
msgid "show ignored files in the output"
msgstr "извеждане на игнорираните файлове"
-#: builtin/ls-files.c:442
+#: builtin/ls-files.c:522
msgid "show staged contents' object name in the output"
msgstr "извеждане на името на обекта за съдържанието на индекса"
-#: builtin/ls-files.c:444
+#: builtin/ls-files.c:524
msgid "show files on the filesystem that need to be removed"
msgstr "извеждане на файловете, които трябва да бъдат изтрити"
-#: builtin/ls-files.c:446
+#: builtin/ls-files.c:526
msgid "show 'other' directories' names only"
msgstr "извеждане само на името на другите (неследените) директории"
-#: builtin/ls-files.c:448
+#: builtin/ls-files.c:528
msgid "show line endings of files"
msgstr "извеждане на знаците за край на ред във файловете"
-#: builtin/ls-files.c:450
+#: builtin/ls-files.c:530
msgid "don't show empty directories"
msgstr "без извеждане на празните директории"
-#: builtin/ls-files.c:453
+#: builtin/ls-files.c:533
msgid "show unmerged files in the output"
msgstr "извеждане на неслетите файлове"
# FIXME not clear about what this option does
-#: builtin/ls-files.c:455
+#: builtin/ls-files.c:535
msgid "show resolve-undo information"
msgstr "извеждане на информацията за отмяна на разрешените подавания"
-#: builtin/ls-files.c:457
+#: builtin/ls-files.c:537
msgid "skip files matching pattern"
msgstr "прескачане на файловете напасващи ШАБЛОНа"
-#: builtin/ls-files.c:460
+#: builtin/ls-files.c:540
msgid "exclude patterns are read from <file>"
msgstr "шаблоните за игнориране да се прочетат от този ФАЙЛ"
-#: builtin/ls-files.c:463
+#: builtin/ls-files.c:543
msgid "read additional per-directory exclude patterns in <file>"
msgstr ""
"изчитане на допълнителните шаблони за игнориране по директория от този ФАЙЛ"
-#: builtin/ls-files.c:465
+#: builtin/ls-files.c:545
msgid "add the standard git exclusions"
msgstr "добавяне на стандартно игнорираните от Git файлове"
-#: builtin/ls-files.c:468
+#: builtin/ls-files.c:548
msgid "make the output relative to the project top directory"
msgstr "пътищата да са относителни спрямо основната директория на проекта"
-#: builtin/ls-files.c:471
+#: builtin/ls-files.c:551
+msgid "recurse through submodules"
+msgstr "рекурсивно обхождане подмодулите"
+
+#: builtin/ls-files.c:553
msgid "if any <file> is not in the index, treat this as an error"
msgstr "грешка, ако някой от тези ФАЙЛове не е в индекса"
-#: builtin/ls-files.c:472
+#: builtin/ls-files.c:554
msgid "tree-ish"
msgstr "УКАЗАТЕЛ_КЪМ_ДЪРВО"
-#: builtin/ls-files.c:473
+#: builtin/ls-files.c:555
msgid "pretend that paths removed since <tree-ish> are still present"
msgstr ""
"считане, че пътищата изтрити след УКАЗАТЕЛя_КЪМ_ДЪРВО все още съществуват"
-#: builtin/ls-files.c:475
+#: builtin/ls-files.c:557
msgid "show debugging data"
msgstr "извеждане на информацията за изчистване на грешки"
@@ -8396,192 +9403,177 @@ msgstr ""
"извеждане на цялото дърво, не само на текущата директория (включва опцията "
"„--full-name“)"
-#: builtin/merge.c:45
+#: builtin/merge.c:46
msgid "git merge [<options>] [<commit>...]"
msgstr "git merge [ОПЦИЯ…] [ПОДАВАНЕ…]"
-#: builtin/merge.c:46
+#: builtin/merge.c:47
msgid "git merge [<options>] <msg> HEAD <commit>"
msgstr "git merge [ОПЦИЯ…] СЪОБЩЕНИЕ HEAD ПОДАВАНЕ"
-#: builtin/merge.c:47
+#: builtin/merge.c:48
msgid "git merge --abort"
msgstr "git merge --abort"
-# FIXME -m rather than just m
-#: builtin/merge.c:101
+#: builtin/merge.c:102
msgid "switch `m' requires a value"
msgstr "опцията „-m“ изисква стойност"
-#: builtin/merge.c:138
+#: builtin/merge.c:139
#, c-format
msgid "Could not find merge strategy '%s'.\n"
msgstr "Няма такава стратегия за сливане: „%s“.\n"
-#: builtin/merge.c:139
+#: builtin/merge.c:140
#, c-format
msgid "Available strategies are:"
msgstr "Наличните стратегии са:"
-#: builtin/merge.c:144
+#: builtin/merge.c:145
#, c-format
msgid "Available custom strategies are:"
msgstr "Допълнителните стратегии са:"
-#: builtin/merge.c:194 builtin/pull.c:126
+#: builtin/merge.c:195 builtin/pull.c:127
msgid "do not show a diffstat at the end of the merge"
msgstr "без извеждане на статистиката след завършване на сливане"
-#: builtin/merge.c:197 builtin/pull.c:129
+#: builtin/merge.c:198 builtin/pull.c:130
msgid "show a diffstat at the end of the merge"
msgstr "извеждане на статистиката след завършване на сливане"
-#: builtin/merge.c:198 builtin/pull.c:132
+#: builtin/merge.c:199 builtin/pull.c:133
msgid "(synonym to --stat)"
msgstr "(синоним на „--stat“)"
-#: builtin/merge.c:200 builtin/pull.c:135
+#: builtin/merge.c:201 builtin/pull.c:136
msgid "add (at most <n>) entries from shortlog to merge commit message"
msgstr ""
"добавяне (на максимум такъв БРОЙ) записи от съкратения журнал в съобщението "
"за подаване"
-#: builtin/merge.c:203 builtin/pull.c:138
+#: builtin/merge.c:204 builtin/pull.c:139
msgid "create a single commit instead of doing a merge"
msgstr "създаване на едно подаване вместо извършване на сливане"
-#: builtin/merge.c:205 builtin/pull.c:141
+#: builtin/merge.c:206 builtin/pull.c:142
msgid "perform a commit if the merge succeeds (default)"
msgstr "извършване на подаване при успешно сливане (стандартно действие)"
-#: builtin/merge.c:207 builtin/pull.c:144
+#: builtin/merge.c:208 builtin/pull.c:145
msgid "edit message before committing"
msgstr "редактиране на съобщението преди подаване"
-#: builtin/merge.c:208
+#: builtin/merge.c:209
msgid "allow fast-forward (default)"
msgstr "позволяване на тривиално сливане (стандартно действие)"
-#: builtin/merge.c:210 builtin/pull.c:150
+#: builtin/merge.c:211 builtin/pull.c:151
msgid "abort if fast-forward is not possible"
msgstr "преустановяване, ако сливането не е тривиално"
-#: builtin/merge.c:214
-msgid "Verify that the named commit has a valid GPG signature"
-msgstr "Проверка, че именуваното подаване е с правилен подпис на GPG"
+#: builtin/merge.c:215 builtin/pull.c:154
+msgid "verify that the named commit has a valid GPG signature"
+msgstr "Проверка, че указаното подаване е с правилен подпис на GPG"
-#: builtin/merge.c:215 builtin/notes.c:771 builtin/pull.c:157
+#: builtin/merge.c:216 builtin/notes.c:774 builtin/pull.c:158
#: builtin/revert.c:89
msgid "strategy"
msgstr "СТРАТЕГИЯ"
-#: builtin/merge.c:216 builtin/pull.c:158
+#: builtin/merge.c:217 builtin/pull.c:159
msgid "merge strategy to use"
msgstr "СТРАТЕГИЯ за сливане, която да се ползва"
-#: builtin/merge.c:217 builtin/pull.c:161
+#: builtin/merge.c:218 builtin/pull.c:162
msgid "option=value"
msgstr "ОПЦИЯ=СТОЙНОСТ"
-#: builtin/merge.c:218 builtin/pull.c:162
+#: builtin/merge.c:219 builtin/pull.c:163
msgid "option for selected merge strategy"
msgstr "ОПЦИЯ за избраната стратегия за сливане"
-#: builtin/merge.c:220
+#: builtin/merge.c:221
msgid "merge commit message (for a non-fast-forward merge)"
msgstr "СЪОБЩЕНИЕ при подаването със сливане (при нетривиални сливания)"
-#: builtin/merge.c:224
+#: builtin/merge.c:225
msgid "abort the current in-progress merge"
msgstr "преустановяване на текущото сливане"
-#: builtin/merge.c:226 builtin/pull.c:169
+#: builtin/merge.c:227 builtin/pull.c:170
msgid "allow merging unrelated histories"
msgstr "позволяване на сливане на независими истории"
-#: builtin/merge.c:254
+#: builtin/merge.c:255
msgid "could not run stash."
msgstr "не може да се извърши скатаване"
-#: builtin/merge.c:259
+#: builtin/merge.c:260
msgid "stash failed"
msgstr "неуспешно скатаване"
-#: builtin/merge.c:264
+#: builtin/merge.c:265
#, c-format
msgid "not a valid object: %s"
msgstr "неправилен обект: „%s“"
-#: builtin/merge.c:283 builtin/merge.c:300
+#: builtin/merge.c:284 builtin/merge.c:301
msgid "read-tree failed"
msgstr "неуспешно прочитане на обект-дърво"
-#: builtin/merge.c:330
+#: builtin/merge.c:331
msgid " (nothing to squash)"
msgstr " (няма какво да се смачка)"
-#: builtin/merge.c:343
+#: builtin/merge.c:342
#, c-format
msgid "Squash commit -- not updating HEAD\n"
msgstr "Подаване със смачкване — указателят „HEAD“ няма да бъде обновен\n"
-#: builtin/merge.c:347 builtin/merge.c:767 builtin/merge.c:987
-#: builtin/merge.c:1000
-#, c-format
-msgid "Could not write to '%s'"
-msgstr "„%s“ не може да бъде записан"
-
-#: builtin/merge.c:375
-msgid "Writing SQUASH_MSG"
-msgstr "Записване на съобщението за смачкване SQUASH_MSG"
-
-#: builtin/merge.c:377
-msgid "Finishing SQUASH_MSG"
-msgstr "Завършване на съобщението за смачкване SQUASH_MSG"
-
-#: builtin/merge.c:400
+#: builtin/merge.c:392
#, c-format
msgid "No merge message -- not updating HEAD\n"
msgstr ""
"Липсва съобщение при подаване — указателят „HEAD“ няма да бъде обновен\n"
-#: builtin/merge.c:451
+#: builtin/merge.c:443
#, c-format
msgid "'%s' does not point to a commit"
msgstr "„%s“ не сочи към подаване"
-#: builtin/merge.c:541
+#: builtin/merge.c:533
#, c-format
msgid "Bad branch.%s.mergeoptions string: %s"
msgstr "Неправилен низ за настройката „branch.%s.mergeoptions“: „%s“"
-#: builtin/merge.c:660
+#: builtin/merge.c:652
msgid "Not handling anything other than two heads merge."
msgstr "Поддържа се само сливане на точно две истории."
-#: builtin/merge.c:674
+#: builtin/merge.c:666
#, c-format
msgid "Unknown option for merge-recursive: -X%s"
msgstr "Непозната опция за рекурсивното сливане „merge-recursive“: „-X%s“"
-#: builtin/merge.c:687
+#: builtin/merge.c:681
#, c-format
msgid "unable to write %s"
msgstr "„%s“ не може да бъде записан"
-#: builtin/merge.c:776
+#: builtin/merge.c:733
#, c-format
msgid "Could not read from '%s'"
msgstr "От „%s“ не може да се чете"
-#: builtin/merge.c:785
+#: builtin/merge.c:742
#, c-format
msgid "Not committing merge; use 'git commit' to complete the merge.\n"
msgstr ""
-"Сливането няма да бъде подадено. За завършването му и подаването му "
+"Сливането няма да бъде подадено. За завършването му и подаването му "
"използвайте командата „git commit“.\n"
-#: builtin/merge.c:791
+#: builtin/merge.c:748
#, c-format
msgid ""
"Please enter a commit message to explain why this merge is necessary,\n"
@@ -8596,183 +9588,203 @@ msgstr ""
"Редовете, които започват с „%c“ ще бъдат пропуснати, а празно съобщение\n"
"преустановява подаването.\n"
-#: builtin/merge.c:815
+#: builtin/merge.c:772
msgid "Empty commit message."
msgstr "Празно съобщение при подаване."
-# FIXME - WTF is wonderful.
-#: builtin/merge.c:835
+#: builtin/merge.c:792
#, c-format
msgid "Wonderful.\n"
msgstr "Първият етап на тривиалното сливане завърши.\n"
-#: builtin/merge.c:890
+#: builtin/merge.c:847
#, c-format
msgid "Automatic merge failed; fix conflicts and then commit the result.\n"
msgstr "Неуспешно сливане — коригирайте конфликтите и подайте резултата.\n"
-#: builtin/merge.c:906
+#: builtin/merge.c:863
#, c-format
msgid "'%s' is not a commit"
msgstr "„%s“ не е подаване"
-#: builtin/merge.c:947
+#: builtin/merge.c:904
msgid "No current branch."
msgstr "Няма текущ клон."
-#: builtin/merge.c:949
+#: builtin/merge.c:906
msgid "No remote for the current branch."
msgstr "Текущият клон не следи никой."
-#: builtin/merge.c:951
+#: builtin/merge.c:908
msgid "No default upstream defined for the current branch."
msgstr "Текущият клон не следи никой клон."
-#: builtin/merge.c:956
+#: builtin/merge.c:913
#, c-format
msgid "No remote-tracking branch for %s from %s"
msgstr "Никой клон не следи клона „%s“ от хранилището „%s“"
-#: builtin/merge.c:1091
+#: builtin/merge.c:960
+#, c-format
+msgid "Bad value '%s' in environment '%s'"
+msgstr "Неправилна стойност „%s“ в средата „%s“"
+
+#: builtin/merge.c:1034
#, c-format
msgid "could not close '%s'"
msgstr "„%s“ не може да се затвори"
-#: builtin/merge.c:1219
+#: builtin/merge.c:1061
+#, c-format
+msgid "not something we can merge in %s: %s"
+msgstr "не може да се слее в „%s“: %s"
+
+#: builtin/merge.c:1095
+msgid "not something we can merge"
+msgstr "не може да се слее"
+
+#: builtin/merge.c:1162
msgid "There is no merge to abort (MERGE_HEAD missing)."
msgstr ""
"Не може да преустановите сливане, защото в момента не се извършва такова "
"(липсва указател „MERGE_HEAD“)."
-#: builtin/merge.c:1235
+#: builtin/merge.c:1178
msgid ""
"You have not concluded your merge (MERGE_HEAD exists).\n"
"Please, commit your changes before you merge."
msgstr ""
-"Не сте завършили сливане. (Указателят „MERGE_HEAD“ съществува).\n"
+"Не сте завършили сливане. (Указателят „MERGE_HEAD“ съществува).\n"
"Подайте промените си, преди да започнете ново сливане."
-#: builtin/merge.c:1242
+#: builtin/merge.c:1185
msgid ""
"You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n"
"Please, commit your changes before you merge."
msgstr ""
"Не сте завършили отбиране на подаване (указателят „CHERRY_PICK_HEAD“\n"
-"съществува). Подайте промените си, преди да започнете ново сливане."
+"съществува). Подайте промените си, преди да започнете ново сливане."
-#: builtin/merge.c:1245
+#: builtin/merge.c:1188
msgid "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)."
msgstr ""
"Не сте завършили отбиране на подаване (указателят „CHERRY_PICK_HEAD“\n"
"съществува)."
-#: builtin/merge.c:1254
+#: builtin/merge.c:1197
msgid "You cannot combine --squash with --no-ff."
msgstr "Опцията „--squash“ е несъвместима с „--no-ff“."
-#: builtin/merge.c:1262
+#: builtin/merge.c:1205
msgid "No commit specified and merge.defaultToUpstream not set."
msgstr ""
"Не е указано подаване и настройката „merge.defaultToUpstream“ не е зададена."
-#: builtin/merge.c:1279
+#: builtin/merge.c:1222
msgid "Squash commit into empty head not supported yet"
msgstr "Подаване със смачкване във връх без история все още не се поддържа"
-#: builtin/merge.c:1281
+#: builtin/merge.c:1224
msgid "Non-fast-forward commit does not make sense into an empty head"
msgstr ""
"Понеже върхът е без история, всички сливания са тривиални, не може да се "
"извърши нетривиално сливане изисквано от опцията „--no-ff“"
-#: builtin/merge.c:1286
+#: builtin/merge.c:1229
#, c-format
msgid "%s - not something we can merge"
msgstr "„%s“ — не е нещо, което може да се слее"
-#: builtin/merge.c:1288
+#: builtin/merge.c:1231
msgid "Can merge only exactly one commit into empty head"
msgstr "Можете да слеете точно едно подаване във връх без история"
-#: builtin/merge.c:1344
+#: builtin/merge.c:1287
#, c-format
msgid "Commit %s has an untrusted GPG signature, allegedly by %s."
msgstr ""
"Подаването „%s“ е с недоверен подпис от GPG, който твърди, че е на „%s“."
-#: builtin/merge.c:1347
+#: builtin/merge.c:1290
#, c-format
msgid "Commit %s has a bad GPG signature allegedly by %s."
msgstr ""
"Подаването „%s“ е с неправилен подпис от GPG, който твърди, че е на „%s“."
-#: builtin/merge.c:1350
+#: builtin/merge.c:1293
#, c-format
msgid "Commit %s does not have a GPG signature."
msgstr "Подаването „%s“ е без подпис от GPG."
-#: builtin/merge.c:1353
+#: builtin/merge.c:1296
#, c-format
msgid "Commit %s has a good GPG signature by %s\n"
msgstr "Подаването „%s“ е с коректен подпис от GPG на „%s“.\n"
-#: builtin/merge.c:1415
+#: builtin/merge.c:1358
msgid "refusing to merge unrelated histories"
msgstr "независими истории не може да се слеят"
-#: builtin/merge.c:1439
+#: builtin/merge.c:1367
+msgid "Already up-to-date."
+msgstr "Вече е обновено."
+
+#: builtin/merge.c:1377
#, c-format
msgid "Updating %s..%s\n"
msgstr "Обновяване „%s..%s“\n"
-#: builtin/merge.c:1476
+#: builtin/merge.c:1418
#, c-format
msgid "Trying really trivial in-index merge...\n"
msgstr "Проба с най-тривиалното сливане в рамките на индекса…\n"
-# FIXME WTF message
-#: builtin/merge.c:1483
+#: builtin/merge.c:1425
#, c-format
msgid "Nope.\n"
msgstr "Неуспешно сливане.\n"
-#: builtin/merge.c:1515
+#: builtin/merge.c:1450
+msgid "Already up-to-date. Yeeah!"
+msgstr "Вече е обновено!"
+
+#: builtin/merge.c:1456
msgid "Not possible to fast-forward, aborting."
msgstr ""
"Не може да се извърши тривиално сливане, преустановяване на действието."
-#: builtin/merge.c:1538 builtin/merge.c:1617
+#: builtin/merge.c:1479 builtin/merge.c:1558
#, c-format
msgid "Rewinding the tree to pristine...\n"
msgstr "Привеждане на дървото към първоначалното…\n"
-#: builtin/merge.c:1542
+#: builtin/merge.c:1483
#, c-format
msgid "Trying merge strategy %s...\n"
msgstr "Пробване със стратегията за сливане „%s“…\n"
-#: builtin/merge.c:1608
+#: builtin/merge.c:1549
#, c-format
msgid "No merge strategy handled the merge.\n"
msgstr "Никоя стратегия за сливане не може да извърши сливането.\n"
-#: builtin/merge.c:1610
+#: builtin/merge.c:1551
#, c-format
msgid "Merge with strategy %s failed.\n"
msgstr "Неуспешно сливане със стратегия „%s“.\n"
-#: builtin/merge.c:1619
+#: builtin/merge.c:1560
#, c-format
msgid "Using the %s to prepare resolving by hand.\n"
msgstr ""
"Ползва се стратегията „%s“, която ще подготви дървото за коригиране на "
"ръка.\n"
-#: builtin/merge.c:1631
+#: builtin/merge.c:1572
#, c-format
msgid "Automatic merge went well; stopped before committing as requested\n"
msgstr ""
-"Автоматичното сливане завърши успешно. Самото подаване не е извършено, "
+"Автоматичното сливане завърши успешно. Самото подаване не е извършено, "
"защото бе зададена опцията „--no-commit“.\n"
#: builtin/merge-base.c:29
@@ -8795,24 +9807,24 @@ msgstr "git merge-base --is-ancestor ПОДАВАНЕ_1 ПОДАВАНЕ_2"
msgid "git merge-base --fork-point <ref> [<commit>]"
msgstr "git merge-base --fork-point УКАЗАТЕЛ [ПОДАВАНЕ]"
-#: builtin/merge-base.c:214
+#: builtin/merge-base.c:217
msgid "output all common ancestors"
msgstr "извеждане на всички общи предшественици"
-#: builtin/merge-base.c:216
+#: builtin/merge-base.c:219
msgid "find ancestors for a single n-way merge"
msgstr ""
"откриване на предшествениците за еднократно сливане на множество истории"
-#: builtin/merge-base.c:218
+#: builtin/merge-base.c:221
msgid "list revs not reachable from others"
msgstr "извеждане на недостижимите от другите указатели"
-#: builtin/merge-base.c:220
+#: builtin/merge-base.c:223
msgid "is the first one ancestor of the other?"
msgstr "ПОДАВАНЕ_1 предшественик ли е на ПОДАВАНЕ_2?"
-#: builtin/merge-base.c:222
+#: builtin/merge-base.c:225
msgid "find where <commit> forked from reflog of <ref>"
msgstr "откриване къде ПОДАВАНЕто се е отклонило от историята на УКАЗАТЕЛя"
@@ -8856,6 +9868,37 @@ msgstr "без предупреждения при конфликти"
msgid "set labels for file1/orig-file/file2"
msgstr "задаване на етикети за ФАЙЛ_1/ОРИГИНАЛ/ФАЙЛ_2"
+#: builtin/merge-recursive.c:45
+#, c-format
+msgid "unknown option %s"
+msgstr "непозната опция: „%s“"
+
+#: builtin/merge-recursive.c:51
+#, c-format
+msgid "could not parse object '%s'"
+msgstr "неуспешен анализ на обекта „%s“"
+
+#: builtin/merge-recursive.c:55
+#, c-format
+msgid "cannot handle more than %d base. Ignoring %s."
+msgid_plural "cannot handle more than %d bases. Ignoring %s."
+msgstr[0] "не се поддържа повече от %d база. „%s“ се прескача."
+msgstr[1] "не се поддържат повече от %d бази. „%s“ се прескача."
+
+#: builtin/merge-recursive.c:63
+msgid "not handling anything other than two heads merge."
+msgstr "поддържа се само сливане на точно две истории."
+
+#: builtin/merge-recursive.c:69 builtin/merge-recursive.c:71
+#, c-format
+msgid "could not resolve ref '%s'"
+msgstr "указателят „%s“ не може да бъде изтрит"
+
+#: builtin/merge-recursive.c:77
+#, c-format
+msgid "Merging %s with %s\n"
+msgstr "Сливане на „%s“ с „%s“\n"
+
#: builtin/mktree.c:65
msgid "git mktree [-z] [--missing] [--batch]"
msgstr "git mktree [-z] [--missing] [--batch]"
@@ -8900,112 +9943,111 @@ msgstr "принудително преместване/преименуване
msgid "skip move/rename errors"
msgstr "прескачане на грешките при преместване/преименуване"
-#: builtin/mv.c:152
+#: builtin/mv.c:155
#, c-format
msgid "destination '%s' is not a directory"
msgstr "целта „%s“ съществува и не е директория"
-#: builtin/mv.c:163
+#: builtin/mv.c:166
#, c-format
msgid "Checking rename of '%s' to '%s'\n"
msgstr "Проверка на преименуването на обект от „%s“ на „%s“\n"
-#: builtin/mv.c:167
+#: builtin/mv.c:170
msgid "bad source"
msgstr "неправилен обект"
-#: builtin/mv.c:170
+#: builtin/mv.c:173
msgid "can not move directory into itself"
msgstr "директория не може да се премести в себе си"
-#: builtin/mv.c:173
+#: builtin/mv.c:176
msgid "cannot move directory over file"
msgstr "директория не може да се премести върху файл"
-#: builtin/mv.c:182
+#: builtin/mv.c:185
msgid "source directory is empty"
msgstr "първоначалната директория е празна"
-#: builtin/mv.c:207
+#: builtin/mv.c:210
msgid "not under version control"
msgstr "не е под контрола на Git"
-#: builtin/mv.c:210
+#: builtin/mv.c:213
msgid "destination exists"
msgstr "целта съществува"
-#: builtin/mv.c:218
+#: builtin/mv.c:221
#, c-format
msgid "overwriting '%s'"
msgstr "презаписване на „%s“"
-#: builtin/mv.c:221
+#: builtin/mv.c:224
msgid "Cannot overwrite"
msgstr "Презаписването е невъзможно"
-#: builtin/mv.c:224
+#: builtin/mv.c:227
msgid "multiple sources for the same target"
msgstr "множество източници за една цел"
-#: builtin/mv.c:226
+#: builtin/mv.c:229
msgid "destination directory does not exist"
msgstr "целевата директория не съществува"
-#: builtin/mv.c:233
+#: builtin/mv.c:236
#, c-format
msgid "%s, source=%s, destination=%s"
msgstr "%s, обект: „%s“, цел: „%s“"
-#: builtin/mv.c:254
+#: builtin/mv.c:257
#, c-format
msgid "Renaming %s to %s\n"
msgstr "Преименуване на „%s“ на „%s“\n"
-#: builtin/mv.c:260 builtin/remote.c:714 builtin/repack.c:365
+#: builtin/mv.c:263 builtin/remote.c:710 builtin/repack.c:375
#, c-format
msgid "renaming '%s' failed"
msgstr "неуспешно преименуване на „%s“"
-#: builtin/name-rev.c:258
+#: builtin/name-rev.c:257
msgid "git name-rev [<options>] <commit>..."
msgstr "git name-rev [ОПЦИЯ…] ПОДАВАНЕ…"
-#: builtin/name-rev.c:259
+#: builtin/name-rev.c:258
msgid "git name-rev [<options>] --all"
msgstr "git name-rev [ОПЦИЯ…] --all"
-#: builtin/name-rev.c:260
+#: builtin/name-rev.c:259
msgid "git name-rev [<options>] --stdin"
msgstr "git name-rev [ОПЦИЯ…] --stdin"
-# FIXME sha
-#: builtin/name-rev.c:312
+#: builtin/name-rev.c:311
msgid "print only names (no SHA-1)"
msgstr "извеждане само на имената (без сумите по SHA1)"
-#: builtin/name-rev.c:313
+#: builtin/name-rev.c:312
msgid "only use tags to name the commits"
msgstr "използване само на етикетите за именуване на подаванията"
-#: builtin/name-rev.c:315
+#: builtin/name-rev.c:314
msgid "only use refs matching <pattern>"
msgstr "използване само на указателите напасващи на ШАБЛОНа"
-#: builtin/name-rev.c:317
+#: builtin/name-rev.c:316
msgid "list all commits reachable from all refs"
msgstr ""
"извеждане на всички подавания, които могат да бъдат достигнати от всички "
"указатели"
-#: builtin/name-rev.c:318
+#: builtin/name-rev.c:317
msgid "read from stdin"
msgstr "четене от стандартния вход"
-#: builtin/name-rev.c:319
+#: builtin/name-rev.c:318
msgid "allow to print `undefined` names (default)"
msgstr "да се извеждат и недефинираните имена (стандартна стойност на опцията)"
-#: builtin/name-rev.c:325
+#: builtin/name-rev.c:324
msgid "dereference tags in the input (internal use)"
msgstr "извеждане на идентификаторите на обекти-етикети (за вътрешни нужди)"
@@ -9083,7 +10125,7 @@ msgstr "git n