summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.github/CONTRIBUTING.md3
-rw-r--r--.github/workflows/main.yml97
-rw-r--r--Documentation/CodingGuidelines19
-rw-r--r--Documentation/Makefile1
-rw-r--r--Documentation/RelNotes/2.27.0.txt75
-rw-r--r--Documentation/RelNotes/2.28.0.txt168
-rw-r--r--Documentation/SubmittingPatches5
-rw-r--r--Documentation/config/diff.txt4
-rw-r--r--Documentation/config/feature.txt4
-rw-r--r--Documentation/config/protocol.txt3
-rw-r--r--Documentation/date-formats.txt3
-rw-r--r--Documentation/diff-options.txt5
-rw-r--r--Documentation/git-bugreport.txt4
-rw-r--r--Documentation/git-commit-graph.txt9
-rw-r--r--Documentation/git-credential.txt34
-rw-r--r--Documentation/git-diff.txt20
-rw-r--r--Documentation/git-fast-import.txt9
-rw-r--r--Documentation/git-http-fetch.txt9
-rw-r--r--Documentation/git-multi-pack-index.txt3
-rw-r--r--Documentation/git-sparse-checkout.txt32
-rw-r--r--Documentation/git-worktree.txt4
-rw-r--r--Documentation/git.txt13
-rw-r--r--Documentation/gitcredentials.txt26
-rw-r--r--Documentation/gitfaq.txt18
-rw-r--r--Documentation/gitremote-helpers.txt4
-rw-r--r--Documentation/rev-list-options.txt35
-rw-r--r--Documentation/technical/commit-graph-format.txt8
-rw-r--r--Documentation/technical/http-protocol.txt2
-rw-r--r--Documentation/technical/pack-protocol.txt6
-rw-r--r--Documentation/technical/packfile-uri.txt78
-rw-r--r--Documentation/technical/protocol-v2.txt50
-rw-r--r--Documentation/technical/reftable.txt1083
-rwxr-xr-xGIT-VERSION-GEN2
-rw-r--r--Makefile10
l---------RelNotes2
-rw-r--r--add-patch.c30
-rw-r--r--bloom.c65
-rw-r--r--bloom.h7
-rw-r--r--bugreport.c62
-rw-r--r--builtin/am.c3
-rw-r--r--builtin/bisect--helper.c13
-rw-r--r--builtin/branch.c2
-rw-r--r--builtin/checkout.c6
-rw-r--r--builtin/clean.c49
-rw-r--r--builtin/clone.c13
-rw-r--r--builtin/commit-graph.c75
-rw-r--r--builtin/commit.c3
-rw-r--r--builtin/diff-files.c7
-rw-r--r--builtin/diff.c147
-rw-r--r--builtin/fetch-pack.c19
-rw-r--r--builtin/fetch.c23
-rw-r--r--builtin/fsck.c3
-rw-r--r--builtin/merge.c5
-rw-r--r--builtin/pack-objects.c77
-rw-r--r--builtin/prune.c1
-rw-r--r--builtin/pull.c1
-rw-r--r--builtin/rebase.c3
-rw-r--r--builtin/receive-pack.c3
-rw-r--r--builtin/repack.c1
-rw-r--r--builtin/rev-parse.c1
-rw-r--r--builtin/sparse-checkout.c6
-rw-r--r--builtin/submodule--helper.c76
-rw-r--r--builtin/worktree.c128
-rw-r--r--cache.h1
-rwxr-xr-xci/config/allow-ref.sample27
-rw-r--r--ci/git-problem-matcher.json16
-rwxr-xr-xci/lib.sh5
-rw-r--r--command-list.txt1
-rw-r--r--commit-graph.c63
-rw-r--r--commit-graph.h4
-rw-r--r--commit-reach.c26
-rw-r--r--commit-slab-decl.h6
-rw-r--r--commit.c16
-rw-r--r--commit.h50
-rw-r--r--compat/gmtime.c29
-rwxr-xr-xcompat/vcbuild/scripts/clink.pl4
-rw-r--r--config.mak.uname1
-rw-r--r--connect.c18
-rw-r--r--connect.h4
-rw-r--r--connected.c8
-rw-r--r--contrib/completion/git-completion.bash257
-rw-r--r--credential.h8
-rw-r--r--diff.c16
-rw-r--r--dir.c65
-rw-r--r--environment.c1
-rw-r--r--fast-import.c25
-rw-r--r--fetch-pack.c153
-rw-r--r--fetch-pack.h2
-rw-r--r--fsck.c72
-rw-r--r--fuzz-commit-graph.c2
-rwxr-xr-xgit-add--interactive.perl21
-rwxr-xr-xgit-bisect.sh6
-rw-r--r--git-compat-util.h7
-rwxr-xr-xgit-gui/git-gui.sh6
-rw-r--r--git-gui/lib/index.tcl6
-rw-r--r--git-gui/lib/mergetool.tcl2
-rwxr-xr-xgit-p4.py52
-rwxr-xr-xgit-submodule.sh54
-rw-r--r--git.c1
-rw-r--r--help.c1
-rw-r--r--http-fetch.c126
-rw-r--r--http-push.c8
-rw-r--r--http-walker.c5
-rw-r--r--http.c125
-rw-r--r--http.h31
-rw-r--r--imap-send.c2
-rw-r--r--line-log.c43
-rw-r--r--line-log.h5
-rw-r--r--list-objects-filter-options.c3
-rw-r--r--list-objects-filter.c3
-rw-r--r--merge-recursive.c12
-rw-r--r--midx.c42
-rw-r--r--pack-bitmap.c72
-rw-r--r--pkt-line.c17
-rw-r--r--pkt-line.h11
-rw-r--r--po/bg.po7130
-rw-r--r--po/ca.po11578
-rw-r--r--po/de.po7130
-rw-r--r--po/es.po7030
-rw-r--r--po/fr.po7092
-rw-r--r--po/git.pot6919
-rw-r--r--po/it.po7224
-rw-r--r--po/sv.po7187
-rw-r--r--po/tr.po7126
-rw-r--r--po/vi.po7242
-rw-r--r--po/zh_CN.po7046
-rw-r--r--po/zh_TW.po7847
-rw-r--r--progress.c13
-rw-r--r--protocol.c4
-rw-r--r--refs.h18
-rw-r--r--refs/refs-internal.h18
-rw-r--r--remote-curl.c70
-rw-r--r--remote.h3
-rw-r--r--repository.h6
-rw-r--r--revision.c43
-rw-r--r--run-command.c13
-rw-r--r--run-command.h5
-rw-r--r--send-pack.c1
-rw-r--r--sequencer.c7
-rw-r--r--serve.c2
-rw-r--r--setup.c41
-rw-r--r--shallow.c36
-rw-r--r--shallow.h81
-rw-r--r--strbuf.c5
-rw-r--r--strbuf.h1
-rw-r--r--t/README14
-rw-r--r--t/helper/test-bloom.c4
-rw-r--r--t/helper/test-pkt-line.c4
-rw-r--r--t/helper/test-regex.c94
-rw-r--r--t/lib-httpd.sh2
-rw-r--r--t/lib-httpd/apache.conf8
-rw-r--r--t/lib-httpd/incomplete-body-upload-pack-v2-http.sh3
-rw-r--r--t/lib-httpd/incomplete-length-upload-pack-v2-http.sh3
-rwxr-xr-xt/perf/p5310-pack-bitmaps.sh10
-rwxr-xr-xt/t0002-gitfile.sh2
-rwxr-xr-xt/t0091-bugreport.sh15
-rwxr-xr-xt/t0095-bloom.sh8
-rwxr-xr-xt/t0410-partial-clone.sh23
-rwxr-xr-xt/t0500-progress-display.sh26
-rwxr-xr-xt/t1090-sparse-checkout-scope.sh1
-rwxr-xr-xt/t1091-sparse-checkout-builtin.sh22
-rwxr-xr-xt/t1400-update-ref.sh32
-rwxr-xr-xt/t1450-fsck.sh29
-rwxr-xr-xt/t1506-rev-parse-diagnosis.sh2
-rwxr-xr-xt/t1509-root-work-tree.sh4
-rwxr-xr-xt/t2018-checkout-branch.sh10
-rwxr-xr-xt/t2027-checkout-track.sh24
-rwxr-xr-xt/t2060-switch.sh8
-rwxr-xr-xt/t2203-add-intent.sh53
-rwxr-xr-xt/t2401-worktree-prune.sh24
-rwxr-xr-xt/t2403-worktree-move.sh21
-rwxr-xr-xt/t2404-worktree-config.sh4
-rwxr-xr-xt/t3200-branch.sh67
-rwxr-xr-xt/t3415-rebase-autosquash.sh16
-rwxr-xr-xt/t3430-rebase-merges.sh2
-rwxr-xr-xt/t3701-add-interactive.sh19
-rwxr-xr-xt/t4014-format-patch.sh21
-rwxr-xr-xt/t4045-diff-relative.sh82
-rwxr-xr-xt/t4067-diff-partial-clone.sh4
-rwxr-xr-xt/t4068-diff-symmetric.sh91
-rwxr-xr-xt/t4202-log.sh2
-rwxr-xr-xt/t4210-log-i18n.sh77
-rwxr-xr-xt/t4211-line-log.sh68
-rwxr-xr-xt/t4216-log-bloom.sh4
-rwxr-xr-xt/t5318-commit-graph.sh54
-rwxr-xr-xt/t5319-multi-pack-index.sh27
-rwxr-xr-xt/t5500-fetch-pack.sh13
-rwxr-xr-xt/t5520-pull.sh2
-rwxr-xr-xt/t5541-http-push-smart.sh15
-rwxr-xr-xt/t5550-http-fetch-dumb.sh30
-rwxr-xr-xt/t5551-http-fetch-smart.sh56
-rwxr-xr-xt/t5581-http-curl-verbose.sh2
-rwxr-xr-xt/t5608-clone-2gb.sh11
-rwxr-xr-xt/t5616-partial-clone.sh7
-rwxr-xr-xt/t5702-protocol-v2.sh136
-rwxr-xr-xt/t5703-upload-pack-ref-in-want.sh9
-rwxr-xr-xt/t6030-bisect-porcelain.sh9
-rwxr-xr-xt/t6042-merge-rename-corner-cases.sh55
-rwxr-xr-xt/t6050-replace.sh2
-rwxr-xr-xt/t6113-rev-list-bitmap-filters.sh21
-rwxr-xr-xt/t6132-pathspec-exclude.sh33
-rwxr-xr-xt/t6200-fmt-merge-msg.sh2
-rwxr-xr-xt/t9020-remote-svn.sh4
-rwxr-xr-xt/t9300-fast-import.sh28
-rwxr-xr-xt/t9834-git-p4-file-dir-bug.sh70
-rwxr-xr-xt/t9902-completion.sh455
-rw-r--r--t/test-lib.sh34
-rw-r--r--trace.c20
-rw-r--r--trace.h6
-rw-r--r--transport-helper.c5
-rw-r--r--transport.c38
-rw-r--r--transport.h6
-rw-r--r--unpack-trees.c16
-rw-r--r--upload-pack.c859
214 files changed, 53528 insertions, 44536 deletions
diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md
index e7b4e2f..c8755e3 100644
--- a/.github/CONTRIBUTING.md
+++ b/.github/CONTRIBUTING.md
@@ -16,4 +16,7 @@ If you prefer video, then [this talk](https://www.youtube.com/watch?v=Q7i_qQW__q
might be useful to you as the presenter walks you through the contribution
process by example.
+Or, you can follow the ["My First Contribution"](https://git-scm.com/docs/MyFirstContribution)
+tutorial for another example of the contribution process.
+
Your friendly Git community!
diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index fd4df93..84a5dcf 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -6,13 +6,57 @@ env:
DEVELOPER: 1
jobs:
+ ci-config:
+ runs-on: ubuntu-latest
+ outputs:
+ enabled: ${{ steps.check-ref.outputs.enabled }}
+ steps:
+ - name: try to clone ci-config branch
+ continue-on-error: true
+ run: |
+ git -c protocol.version=2 clone \
+ --no-tags \
+ --single-branch \
+ -b ci-config \
+ --depth 1 \
+ --no-checkout \
+ --filter=blob:none \
+ https://github.com/${{ github.repository }} \
+ config-repo &&
+ cd config-repo &&
+ git checkout HEAD -- ci/config
+ - id: check-ref
+ name: check whether CI is enabled for ref
+ run: |
+ enabled=yes
+ if test -x config-repo/ci/config/allow-ref &&
+ ! config-repo/ci/config/allow-ref '${{ github.ref }}'
+ then
+ enabled=no
+ fi
+ echo "::set-output name=enabled::$enabled"
+
windows-build:
+ needs: ci-config
+ if: needs.ci-config.outputs.enabled == 'yes'
runs-on: windows-latest
steps:
- uses: actions/checkout@v1
- name: download git-sdk-64-minimal
shell: bash
- run: a=git-sdk-64-minimal && mkdir -p $a && curl -# https://wingit.blob.core.windows.net/ci-artifacts/$a.tar.xz | tar -C $a -xJf -
+ run: |
+ ## Get artifact
+ urlbase=https://dev.azure.com/git-for-windows/git/_apis/build/builds
+ id=$(curl "$urlbase?definitions=22&statusFilter=completed&resultFilter=succeeded&\$top=1" |
+ jq -r ".value[] | .id")
+ download_url="$(curl "$urlbase/$id/artifacts" |
+ jq -r '.value[] | select(.name == "git-sdk-64-minimal").resource.downloadUrl')"
+ curl --connect-timeout 10 --retry 5 --retry-delay 0 --retry-max-time 240 \
+ -o artifacts.zip "$download_url"
+
+ ## Unzip and remove the artifact
+ unzip artifacts.zip
+ rm artifacts.zip
- name: build
shell: powershell
env:
@@ -30,6 +74,11 @@ jobs:
with:
name: windows-artifacts
path: artifacts
+ - name: upload git-sdk-64-minimal
+ uses: actions/upload-artifact@v1
+ with:
+ name: git-sdk-64-minimal
+ path: git-sdk-64-minimal
windows-test:
runs-on: windows-latest
needs: [windows-build]
@@ -38,9 +87,6 @@ jobs:
nr: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
steps:
- uses: actions/checkout@v1
- - name: download git-sdk-64-minimal
- shell: bash
- run: a=git-sdk-64-minimal && mkdir -p $a && curl -# https://wingit.blob.core.windows.net/ci-artifacts/$a.tar.xz | tar -C $a -xJf -
- name: download build artifacts
uses: actions/download-artifact@v1
with:
@@ -49,6 +95,11 @@ jobs:
- name: extract build artifacts
shell: bash
run: tar xf artifacts.tar.gz
+ - name: download git-sdk-64-minimal
+ uses: actions/download-artifact@v1
+ with:
+ name: git-sdk-64-minimal
+ path: ${{github.workspace}}/git-sdk-64-minimal/
- name: test
shell: powershell
run: |
@@ -70,6 +121,8 @@ jobs:
name: failed-tests-windows
path: ${{env.FAILED_TEST_ARTIFACTS}}
vs-build:
+ needs: ci-config
+ if: needs.ci-config.outputs.enabled == 'yes'
env:
MSYSTEM: MINGW64
NO_PERL: 1
@@ -79,7 +132,19 @@ jobs:
- uses: actions/checkout@v1
- name: download git-sdk-64-minimal
shell: bash
- run: a=git-sdk-64-minimal && mkdir -p $a && curl -# https://wingit.blob.core.windows.net/ci-artifacts/$a.tar.xz | tar -C $a -xJf -
+ run: |
+ ## Get artifact
+ urlbase=https://dev.azure.com/git-for-windows/git/_apis/build/builds
+ id=$(curl "$urlbase?definitions=22&statusFilter=completed&resultFilter=succeeded&\$top=1" |
+ jq -r ".value[] | .id")
+ download_url="$(curl "$urlbase/$id/artifacts" |
+ jq -r '.value[] | select(.name == "git-sdk-64-minimal").resource.downloadUrl')"
+ curl --connect-timeout 10 --retry 5 --retry-delay 0 --retry-max-time 240 \
+ -o artifacts.zip "$download_url"
+
+ ## Unzip and remove the artifact
+ unzip artifacts.zip
+ rm artifacts.zip
- name: generate Visual Studio solution
shell: powershell
run: |
@@ -119,15 +184,17 @@ jobs:
path: artifacts
vs-test:
runs-on: windows-latest
- needs: [vs-build]
+ needs: [vs-build, windows-build]
strategy:
matrix:
nr: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
steps:
- uses: actions/checkout@v1
- - name: download git-64-portable
- shell: bash
- run: a=git-64-portable && mkdir -p $a && curl -# https://wingit.blob.core.windows.net/ci-artifacts/$a.tar.xz | tar -C $a -xJf -
+ - name: download git-sdk-64-minimal
+ uses: actions/download-artifact@v1
+ with:
+ name: git-sdk-64-minimal
+ path: ${{github.workspace}}/git-sdk-64-minimal/
- name: download build artifacts
uses: actions/download-artifact@v1
with:
@@ -143,9 +210,9 @@ jobs:
NO_SVN_TESTS: 1
GIT_TEST_SKIP_REBASE_P: 1
run: |
- & git-64-portable\git-cmd.exe --command=usr\bin\bash.exe -lc @"
+ & .\git-sdk-64-minimal\usr\bin\bash.exe -lc @"
# Let Git ignore the SDK and the test-cache
- printf '%s\n' /git-64-portable/ /test-cache/ >>.git/info/exclude
+ printf '%s\n' /git-sdk-64-minimal/ /test-cache/ >>.git/info/exclude
cd t &&
PATH=\"`$PWD/helper:`$PATH\" &&
@@ -154,6 +221,8 @@ jobs:
${{matrix.nr}} 10 t[0-9]*.sh)
"@
regular:
+ needs: ci-config
+ if: needs.ci-config.outputs.enabled == 'yes'
strategy:
matrix:
vector:
@@ -189,6 +258,8 @@ jobs:
name: failed-tests-${{matrix.vector.jobname}}
path: ${{env.FAILED_TEST_ARTIFACTS}}
dockerized:
+ needs: ci-config
+ if: needs.ci-config.outputs.enabled == 'yes'
strategy:
matrix:
vector:
@@ -213,6 +284,8 @@ jobs:
name: failed-tests-${{matrix.vector.jobname}}
path: ${{env.FAILED_TEST_ARTIFACTS}}
static-analysis:
+ needs: ci-config
+ if: needs.ci-config.outputs.enabled == 'yes'
env:
jobname: StaticAnalysis
runs-on: ubuntu-latest
@@ -221,6 +294,8 @@ jobs:
- run: ci/install-dependencies.sh
- run: ci/run-static-analysis.sh
documentation:
+ needs: ci-config
+ if: needs.ci-config.outputs.enabled == 'yes'
env:
jobname: Documentation
runs-on: ubuntu-latest
diff --git a/Documentation/CodingGuidelines b/Documentation/CodingGuidelines
index a89e8dc..45465bc 100644
--- a/Documentation/CodingGuidelines
+++ b/Documentation/CodingGuidelines
@@ -232,6 +232,18 @@ For C programs:
while( condition )
func (bar+1);
+ - Do not explicitly compare an integral value with constant 0 or '\0',
+ or a pointer value with constant NULL. For instance, to validate that
+ counted array <ptr, cnt> is initialized but has no elements, write:
+
+ if (!ptr || cnt)
+ BUG("empty array expected");
+
+ and not:
+
+ if (ptr == NULL || cnt != 0);
+ BUG("empty array expected");
+
- We avoid using braces unnecessarily. I.e.
if (bla) {
@@ -477,16 +489,11 @@ For Python scripts:
- We follow PEP-8 (http://www.python.org/dev/peps/pep-0008/).
- - As a minimum, we aim to be compatible with Python 2.6 and 2.7.
+ - As a minimum, we aim to be compatible with Python 2.7.
- Where required libraries do not restrict us to Python 2, we try to
also be compatible with Python 3.1 and later.
- - When you must differentiate between Unicode literals and byte string
- literals, it is OK to use the 'b' prefix. Even though the Python
- documentation for version 2.6 does not mention this prefix, it has
- been supported since version 2.6.0.
-
Error Messages
- Do not end error messages with a full stop.
diff --git a/Documentation/Makefile b/Documentation/Makefile
index 15d9d04..ecd0b34 100644
--- a/Documentation/Makefile
+++ b/Documentation/Makefile
@@ -93,6 +93,7 @@ TECH_DOCS += technical/protocol-capabilities
TECH_DOCS += technical/protocol-common
TECH_DOCS += technical/protocol-v2
TECH_DOCS += technical/racy-git
+TECH_DOCS += technical/reftable
TECH_DOCS += technical/send-pack-pipeline
TECH_DOCS += technical/shallow
TECH_DOCS += technical/signature-format
diff --git a/Documentation/RelNotes/2.27.0.txt b/Documentation/RelNotes/2.27.0.txt
index 2a8c6e8..15518d0 100644
--- a/Documentation/RelNotes/2.27.0.txt
+++ b/Documentation/RelNotes/2.27.0.txt
@@ -24,6 +24,10 @@ Backward compatibility notes
users may find annoying---those who prefer not to rebase need to
set the variable to false to squelch the warning.
+ * The transport protocol version 2, which was promoted to the default
+ in Git 2.26 release, turned out to have some remaining rough edges,
+ so it has been demoted from the default.
+
UI, Workflows & Features
@@ -108,6 +112,13 @@ UI, Workflows & Features
* "git restore --staged --worktree" now defaults to take the contents
out of "HEAD", instead of erring out.
+ * "git p4" learned to recover from a (broken) state where a directory
+ and a file are recorded at the same path in the Perforce repository
+ the same way as their clients do.
+
+ * "git multi-pack-index repack" has been taught to honor some
+ repack.* configuration variables.
+
Performance, Internal Implementation, Development Support etc.
@@ -161,6 +172,21 @@ Performance, Internal Implementation, Development Support etc.
* The "bugreport" tool has been added.
+ * The object walk with object filter "--filter=tree:0" can now take
+ advantage of the pack bitmap when available.
+
+ * Instead of always building all branches at GitHub via Actions,
+ users can specify which branches to build.
+
+ * Codepaths that show progress meter have been taught to also use the
+ start_progress() and the stop_progress() calls as a "region" to be
+ traced.
+
+ * Instead of downloading Windows SDK for CI jobs for windows builds
+ from an external site (wingit.blob.core.windows.net), use the one
+ created in the windows-build job, to work around quota issues at
+ the external site.
+
Fixes since v2.26
-----------------
@@ -420,6 +446,54 @@ Fixes since v2.26
been corrected.
(merge 0555e4af58 cb/t0000-use-the-configured-shell later to maint).
+ * Minor in-code comments and documentation updates around credential
+ API.
+ (merge 1aed817f99 cb/credential-doc-fixes later to maint).
+
+ * Teach "am", "commit", "merge" and "rebase", when they are run with
+ the "--quiet" option, to pass "--quiet" down to "gc --auto".
+ (merge 7c3e9e8cfb jc/auto-gc-quiet later to maint).
+
+ * The code to skip unmerged paths in the index when sparse checkout
+ is in use would have made out-of-bound access of the in-core index
+ when the last path was unmerged, which has been corrected.
+
+ * Serving a "git fetch" client over "git://" and "ssh://" protocols
+ using the on-wire protocol version 2 was buggy on the server end
+ when the client needs to make a follow-up request to
+ e.g. auto-follow tags.
+ (merge 08450ef791 cc/upload-pack-v2-fetch-fix later to maint).
+
+ * "git bisect replay" had trouble with input files when they used
+ CRLF line ending, which has been corrected.
+ (merge 6c722cbe5a cw/bisect-replay-with-dos later to maint).
+
+ * "rebase -i" segfaulted when rearranging a sequence that has a
+ fix-up that applies another fix-up (which may or may not be a
+ fix-up of yet another step).
+ (merge 02471e7e20 js/rebase-autosquash-double-fixup-fix later to maint).
+
+ * "git fsck" ensures that the paths recorded in tree objects are
+ sorted and without duplicates, but it failed to notice a case where
+ a blob is followed by entries that sort before a tree with the same
+ name. This has been corrected.
+ (merge 9068cfb20f rs/fsck-duplicate-names-in-trees later to maint).
+
+ * Code clean-up by removing a compatibility implementation of a
+ function we no longer use.
+ (merge 84b0115f0d cb/no-more-gmtime later to maint).
+
+ * When a binary file gets modified and renamed on both sides of history
+ to different locations, both files would be written to the working
+ tree but both would have the contents from "ours". This has been
+ corrected so that the path from each side gets their original content.
+
+ * Fix for a copy-and-paste error introduced during 2.20 era.
+ (merge e68a5272b1 ds/multi-pack-verify later to maint).
+
+ * Update an unconditional use of "grep -a" with a perl script in a test.
+ (merge 1eb7371236 dd/t5703-grep-a-fix later to maint).
+
* Other code cleanup, docfix, build fix, etc.
(merge 564956f358 jc/maintain-doc later to maint).
(merge 7422b2a0a1 sg/commit-slab-clarify-peek later to maint).
@@ -448,3 +522,4 @@ Fixes since v2.26
(merge bdccbf7047 mt/doc-worktree-ref later to maint).
(merge ce9baf234f dl/push-recurse-submodules-fix later to maint).
(merge 4153274052 bc/doc-credential-helper-value later to maint).
+ (merge 5c7bb0146e jc/codingstyle-compare-with-null later to maint).
diff --git a/Documentation/RelNotes/2.28.0.txt b/Documentation/RelNotes/2.28.0.txt
new file mode 100644
index 0000000..02e150e
--- /dev/null
+++ b/Documentation/RelNotes/2.28.0.txt
@@ -0,0 +1,168 @@
+Git 2.28 Release Notes
+======================
+
+Updates since v2.27
+-------------------
+
+Backward compatibility notes
+
+ * "feature.experimental" configuration variable is to let volunteers
+ easily opt into a set of newer features, which use of the v2
+ transport protocol is now a part of.
+
+ * It used to be that setting extensions.* configuration variables
+ alone, while leaving core.repositoryFormatVersion=0, made these
+ settings effective, which was a wrong thing to do. In version 0,
+ there was no special meaning in extensions.* configuration
+ variables. This has been corrected. If you need these repository
+ extensions to be effective, the core.repositoryFormatVersion
+ variable needs to be updated to 1 after vetting these extensions.*
+ variables are set correctly.
+
+
+UI, Workflows & Features
+
+ * The commands in the "diff" family learned to honor "diff.relative"
+ configuration variable.
+
+ * The check in "git fsck" to ensure that the tree objects are sorted
+ still had corner cases it missed unsorted entries.
+
+ * The interface to redact sensitive information in the trace output
+ has been simplified.
+
+ * The command line completion (in contrib/) learned to complete
+ options that the "git switch" command takes.
+
+ * "git diff" used to take arguments in random and nonsense range
+ notation, e.g. "git diff A..B C", "git diff A..B C...D", etc.,
+ which has been cleaned up.
+
+ * "git diff-files" has been taught to say paths that are marked as
+ intent-to-add are new files, not modified from an empty blob.
+
+
+Performance, Internal Implementation, Development Support etc.
+
+ * Code optimization for a common case.
+ (merge 8777616e4d an/merge-single-strategy-optim later to maint).
+
+ * We've adopted a convention that any on-stack structure can be
+ initialized to have zero values in all fields with "= { 0 }",
+ even when the first field happens to be a pointer, but sparse
+ complained that a null pointer should be spelled NULL for a long
+ time. Start using -Wno-universal-initializer option to squelch
+ it (the latest sparse has it on by default).
+
+ * "git log -L..." now takes advantage of the "which paths are touched
+ by this commit?" info stored in the commit-graph system.
+
+ * As FreeBSD is not the only platform whose regexp library reports
+ a REG_ILLSEQ error when fed invalid UTF-8, add logic to detect that
+ automatically and skip the affected tests.
+
+ * "git bugreport" learns to report what shell is in use.
+
+ * Support for GIT_CURL_VERBOSE has been rewritten in terms of
+ GIT_TRACE_CURL.
+
+ * Preliminary clean-ups around refs API, plus file format
+ specification documentation for the reftable backend.
+
+ * Workaround breakage in MSVC build, where "curl-config --cflags"
+ gives settings appropriate for GCC build.
+
+ * Code clean-up of "git clean" resulted in a fix of recent
+ performance regression.
+
+ * Code clean-up in the codepath that serves "git fetch" continues.
+
+ * "git merge-base --is-ancestor" is taught to take advantage of the
+ commit graph.
+
+ * Rewrite of parts of the scripted "git submodule" Porcelain command
+ continues; this time it is "git submodule set-branch" subcommand's
+ turn.
+
+ * The "fetch/clone" protocol has been updated to allow the server to
+ instruct the clients to grab pre-packaged packfile(s) in addition
+ to the packed object data coming over the wire.
+
+ * A misdesigned strbuf_write_fd() function has been retired.
+
+
+
+Fixes since v2.27
+-----------------
+
+ * The "--prepare-p4-only" option of "git p4" is supposed to stop
+ after replaying one changeset, but kept going (by mistake?)
+
+ * The error message from "git checkout -b foo -t bar baz" was
+ confusing.
+
+ * Some repositories in the wild have commits that record nonsense
+ committer timezone (e.g. rails.git); "git fast-import" learned an
+ option to pass these nonsense timestamps intact to allow recreating
+ existing repositories as-is.
+ (merge d42a2fb72f en/fast-import-looser-date later to maint).
+
+ * The command line completion script (in contrib/) tried to complete
+ "git stash -p" as if it were "git stash push -p", but it was too
+ aggressive and also affected "git stash show -p", which has been
+ corrected.
+ (merge fffd0cf520 vs/complete-stash-show-p-fix later to maint).
+
+ * On-the-wire protocol v2 easily falls into a deadlock between the
+ remote-curl helper and the fetch-pack process when the server side
+ prematurely throws an error and disconnects. The communication has
+ been updated to make it more robust.
+
+ * "git checkout -p" did not handle a newly added path at all.
+ (merge 2c8bd8471a js/checkout-p-new-file later to maint).
+
+ * The code to parse "git bisect start" command line was lax in
+ validating the arguments.
+ (merge 4d9005ff5d cb/bisect-helper-parser-fix later to maint).
+
+ * Reduce memory usage during "diff --quiet" in a worktree with too
+ many stat-unmatched paths.
+ (merge d2d7fbe129 jk/diff-memuse-optim-with-stat-unmatch later to maint).
+
+ * The reflog entries for "git clone" and "git fetch" did not
+ anonymize the URL they operated on.
+ (merge 46da295a77 js/reflog-anonymize-for-clone-and-fetch later to maint).
+
+ * The behaviour of "sparse-checkout" in the state "git clone
+ --no-checkout" left was changed accidentally in 2.27, which has
+ been corrected.
+
+ * Use of negative pathspec, while collecting paths including
+ untracked ones in the working tree, was broken.
+
+ * The same worktree directory must be registered only once, but
+ "git worktree move" allowed this invariant to be violated, which
+ has been corrected.
+ (merge 810382ed37 es/worktree-duplicate-paths later to maint).
+
+ * The effect of sparse checkout settings on submodules is documented.
+ (merge e7d7c73249 en/sparse-with-submodule-doc later to maint).
+
+ * Code clean-up around "git branch" with a minor bugfix.
+ (merge dc44639904 dl/branch-cleanup later to maint).
+
+ * A branch name used in a test has been clarified to match what is
+ going on.
+ (merge 08dc26061f pb/t4014-unslave later to maint).
+
+ * An in-code comment in "git diff" has been updated.
+ (merge c592fd4c83 dl/diff-usage-comment-update later to maint).
+
+ * Other code cleanup, docfix, build fix, etc.
+ (merge 2c31a7aa44 jx/pkt-line-doc-count-fix later to maint).
+ (merge d63ae31962 cb/t5608-cleanup later to maint).
+ (merge 788db145c7 dl/t-readme-spell-git-correctly later to maint).
+ (merge 45a87a83bb dl/python-2.7-is-the-floor-version later to maint).
+ (merge b75a219904 es/advertise-contribution-doc later to maint).
+ (merge 0c9a4f638a rs/pull-leakfix later to maint).
+ (merge d546fe2874 rs/commit-reach-leakfix later to maint).
diff --git a/Documentation/SubmittingPatches b/Documentation/SubmittingPatches
index 4515cab..ecf9438 100644
--- a/Documentation/SubmittingPatches
+++ b/Documentation/SubmittingPatches
@@ -3,8 +3,9 @@ Submitting Patches
== Guidelines
-Here are some guidelines for people who want to contribute their code
-to this software.
+Here are some guidelines for people who want to contribute their code to this
+software. There is also a link:MyFirstContribution.html[step-by-step tutorial]
+available which covers many of these same guidelines.
[[base-branch]]
=== Decide what to base your work on.
diff --git a/Documentation/config/diff.txt b/Documentation/config/diff.txt
index ff09f1c..c3ae136 100644
--- a/Documentation/config/diff.txt
+++ b/Documentation/config/diff.txt
@@ -105,6 +105,10 @@ diff.mnemonicPrefix::
diff.noprefix::
If set, 'git diff' does not show any source or destination prefix.
+diff.relative::
+ If set to 'true', 'git diff' does not show changes outside of the directory
+ and show pathnames relative to the current directory.
+
diff.orderFile::
File indicating how to order files within a diff.
See the '-O' option to linkgit:git-diff[1] for details.
diff --git a/Documentation/config/feature.txt b/Documentation/config/feature.txt
index 4e3a5c0..28c3360 100644
--- a/Documentation/config/feature.txt
+++ b/Documentation/config/feature.txt
@@ -22,6 +22,10 @@ existing commit-graph file(s). Occasionally, these files will merge and the
write may take longer. Having an updated commit-graph file helps performance
of many Git commands, including `git merge-base`, `git push -f`, and
`git log --graph`.
++
+* `protocol.version=2` speeds up fetches from repositories with many refs by
+allowing the client to specify which refs to list before the server lists
+them.
feature.manyFiles::
Enable config options that optimize for repos with many files in the
diff --git a/Documentation/config/protocol.txt b/Documentation/config/protocol.txt
index 0b40141..c46e9b3 100644
--- a/Documentation/config/protocol.txt
+++ b/Documentation/config/protocol.txt
@@ -48,7 +48,8 @@ protocol.version::
If set, clients will attempt to communicate with a server
using the specified protocol version. If the server does
not support it, communication falls back to version 0.
- If unset, the default is `0`.
+ If unset, the default is `0`, unless `feature.experimental`
+ is enabled, in which case the default is `2`.
Supported versions:
+
--
diff --git a/Documentation/date-formats.txt b/Documentation/date-formats.txt
index 7e7eaba..f1097fa 100644
--- a/Documentation/date-formats.txt
+++ b/Documentation/date-formats.txt
@@ -22,8 +22,7 @@ ISO 8601::
`2005-04-07T22:13:13`. The parser accepts a space instead of the
`T` character as well. Fractional parts of a second will be ignored,
for example `2005-04-07T22:13:13.019` will be treated as
- `2005-04-07T22:13:13`
-
+ `2005-04-07T22:13:13`.
+
NOTE: In addition, the date part is accepted in the following formats:
`YYYY.MM.DD`, `MM/DD/YYYY` and `DD.MM.YYYY`.
diff --git a/Documentation/diff-options.txt b/Documentation/diff-options.txt
index bb31f0c..7987d72 100644
--- a/Documentation/diff-options.txt
+++ b/Documentation/diff-options.txt
@@ -643,15 +643,18 @@ ifndef::git-format-patch[]
-R::
Swap two inputs; that is, show differences from index or
on-disk file to tree contents.
+endif::git-format-patch[]
--relative[=<path>]::
+--no-relative::
When run from a subdirectory of the project, it can be
told to exclude changes outside the directory and show
pathnames relative to it with this option. When you are
not in a subdirectory (e.g. in a bare repository), you
can name which subdirectory to make the output relative
to by giving a <path> as an argument.
-endif::git-format-patch[]
+ `--no-relative` can be used to countermand both `diff.relative` config
+ option and previous `--relative`.
-a::
--text::
diff --git a/Documentation/git-bugreport.txt b/Documentation/git-bugreport.txt
index 643d1b2..66e88c2 100644
--- a/Documentation/git-bugreport.txt
+++ b/Documentation/git-bugreport.txt
@@ -28,6 +28,8 @@ The following information is captured automatically:
- 'git version --build-options'
- uname sysname, release, version, and machine strings
- Compiler-specific info string
+ - A list of enabled hooks
+ - $SHELL
This tool is invoked via the typical Git setup process, which means that in some
cases, it might not be able to launch - for example, if a relevant config file
@@ -45,7 +47,7 @@ OPTIONS
--suffix <format>::
Specify an alternate suffix for the bugreport name, to create a file
named 'git-bugreport-<formatted suffix>'. This should take the form of a
- link:strftime[3] format string; the current local time will be used.
+ strftime(3) format string; the current local time will be used.
GIT
---
diff --git a/Documentation/git-commit-graph.txt b/Documentation/git-commit-graph.txt
index 53a6502..8ca1764 100644
--- a/Documentation/git-commit-graph.txt
+++ b/Documentation/git-commit-graph.txt
@@ -47,8 +47,10 @@ with `--stdin-commits` or `--reachable`.)
+
With the `--stdin-commits` option, generate the new commit graph by
walking commits starting at the commits specified in stdin as a list
-of OIDs in hex, one OID per line. (Cannot be combined with
-`--stdin-packs` or `--reachable`.)
+of OIDs in hex, one OID per line. OIDs that resolve to non-commits
+(either directly, or by peeling tags) are silently ignored. OIDs that
+are malformed, or do not exist generate an error. (Cannot be combined
+with `--stdin-packs` or `--reachable`.)
+
With the `--reachable` option, generate the new commit graph by walking
commits starting at all refs. (Cannot be combined with `--stdin-commits`
@@ -58,7 +60,7 @@ With the `--append` option, include all commits that are present in the
existing commit-graph file.
+
With the `--changed-paths` option, compute and write information about the
-paths changed between a commit and it's first parent. This operation can
+paths changed between a commit and its first parent. This operation can
take a while on large repositories. It provides significant performance gains
for getting history of a directory or a file with `git log -- <path>`.
+
@@ -68,6 +70,7 @@ chain of multiple commit-graph files stored in
strategy and other splitting options. The new commits not already in the
commit-graph are added in a new "tip" file. This file is merged with the
existing file if the following merge conditions are met:
++
* If `--split=no-merge` is specified, a merge is never performed, and
the remaining options are ignored. `--split=replace` overwrites the
existing chain with a new one. A bare `--split` defers to the remaining
diff --git a/Documentation/git-credential.txt b/Documentation/git-credential.txt
index 6f0c7ca..31c81c4 100644
--- a/Documentation/git-credential.txt
+++ b/Documentation/git-credential.txt
@@ -103,17 +103,20 @@ INPUT/OUTPUT FORMAT
`git credential` reads and/or writes (depending on the action used)
credential information in its standard input/output. This information
can correspond either to keys for which `git credential` will obtain
-the login/password information (e.g. host, protocol, path), or to the
-actual credential data to be obtained (login/password).
+the login information (e.g. host, protocol, path), or to the actual
+credential data to be obtained (username/password).
The credential is split into a set of named attributes, with one
-attribute per line. Each attribute is
-specified by a key-value pair, separated by an `=` (equals) sign,
-followed by a newline. The key may contain any bytes except `=`,
-newline, or NUL. The value may contain any bytes except newline or NUL.
+attribute per line. Each attribute is specified by a key-value pair,
+separated by an `=` (equals) sign, followed by a newline.
+
+The key may contain any bytes except `=`, newline, or NUL. The value may
+contain any bytes except newline or NUL.
+
In both cases, all bytes are treated as-is (i.e., there is no quoting,
and one cannot transmit a value with newline or NUL in it). The list of
attributes is terminated by a blank line or end-of-file.
+
Git understands the following attributes:
`protocol`::
@@ -123,7 +126,8 @@ Git understands the following attributes:
`host`::
- The remote hostname for a network credential.
+ The remote hostname for a network credential. This includes
+ the port number if one was specified (e.g., "example.com:8088").
`path`::
@@ -134,7 +138,7 @@ Git understands the following attributes:
`username`::
The credential's username, if we already have one (e.g., from a
- URL, from the user, or from a previously run helper).
+ URL, the configuration, the user, or from a previously run helper).
`password`::
@@ -146,8 +150,12 @@ Git understands the following attributes:
value is parsed as a URL and treated as if its constituent parts
were read (e.g., `url=https://example.com` would behave as if
`protocol=https` and `host=example.com` had been provided). This
- can help callers avoid parsing URLs themselves. Note that any
- components which are missing from the URL (e.g., there is no
- username in the example above) will be set to empty; if you want
- to provide a URL and override some attributes, provide the URL
- attribute first, followed by any overrides.
+ can help callers avoid parsing URLs themselves.
++
+Note that specifying a protocol is mandatory and if the URL
+doesn't specify a hostname (e.g., "cert:///path/to/file") the
+credential will contain a hostname attribute whose value is an
+empty string.
++
+Components which are missing from the URL (e.g., there is no
+username in the example above) will be left unset.
diff --git a/Documentation/git-diff.txt b/Documentation/git-diff.txt
index 37781cf..1018110 100644
--- a/Documentation/git-diff.txt
+++ b/Documentation/git-diff.txt
@@ -11,15 +11,17 @@ SYNOPSIS
[verse]
'git diff' [<options>] [<commit>] [--] [<path>...]
'git diff' [<options>] --cached [<commit>] [--] [<path>...]
-'git diff' [<options>] <commit> <commit> [--] [<path>...]
+'git diff' [<options>] <commit> [<commit>...] <commit> [--] [<path>...]
+'git diff' [<options>] <commit>...<commit> [--] [<path>...]
'git diff' [<options>] <blob> <blob>
'git diff' [<options>] --no-index [--] <path> <path>
DESCRIPTION
-----------
Show changes between the working tree and the index or a tree, changes
-between the index and a tree, changes between two trees, changes between
-two blob objects, or changes between two files on disk.
+between the index and a tree, changes between two trees, changes resulting
+from a merge, changes between two blob objects, or changes between two
+files on disk.
'git diff' [<options>] [--] [<path>...]::
@@ -67,6 +69,15 @@ two blob objects, or changes between two files on disk.
one side is omitted, it will have the same effect as
using HEAD instead.
+'git diff' [<options>] <commit> [<commit>...] <commit> [--] [<path>...]::
+
+ This form is to view the results of a merge commit. The first
+ listed <commit> must be the merge itself; the remaining two or
+ more commits should be its parents. A convenient way to produce
+ the desired set of revisions is to use the {caret}@ suffix.
+ For instance, if `master` names a merge commit, `git diff master
+ master^@` gives the same combined diff as `git show master`.
+
'git diff' [<options>] <commit>\...<commit> [--] [<path>...]::
This form is to view the changes on the branch containing
@@ -196,7 +207,8 @@ linkgit:git-difftool[1],
linkgit:git-log[1],
linkgit:gitdiffcore[7],
linkgit:git-format-patch[1],
-linkgit:git-apply[1]
+linkgit:git-apply[1],
+linkgit:git-show[1]
GIT
---
diff --git a/Documentation/git-fast-import.txt b/Documentation/git-fast-import.txt
index 77c6b3d..7d9aad2 100644
--- a/Documentation/git-fast-import.txt
+++ b/Documentation/git-fast-import.txt
@@ -293,7 +293,14 @@ by users who are located in the same location and time zone. In this
case a reasonable offset from UTC could be assumed.
+
Unlike the `rfc2822` format, this format is very strict. Any
-variation in formatting will cause fast-import to reject the value.
+variation in formatting will cause fast-import to reject the value,
+and some sanity checks on the numeric values may also be performed.
+
+`raw-permissive`::
+ This is the same as `raw` except that no sanity checks on
+ the numeric epoch and local offset are performed. This can
+ be useful when trying to filter or import an existing history
+ with e.g. bogus timezone values.
`rfc2822`::
This is the standard email format as described by RFC 2822.
diff --git a/Documentation/git-http-fetch.txt b/Documentation/git-http-fetch.txt
index 666b042..4deb489 100644
--- a/Documentation/git-http-fetch.txt
+++ b/Documentation/git-http-fetch.txt
@@ -9,7 +9,7 @@ git-http-fetch - Download from a remote Git repository via HTTP
SYNOPSIS
--------
[verse]
-'git http-fetch' [-c] [-t] [-a] [-d] [-v] [-w filename] [--recover] [--stdin] <commit> <url>
+'git http-fetch' [-c] [-t] [-a] [-d] [-v] [-w filename] [--recover] [--stdin | --packfile=<hash> | <commit>] <url>
DESCRIPTION
-----------
@@ -40,6 +40,13 @@ commit-id::
<commit-id>['\t'<filename-as-in--w>]
+--packfile=<hash>::
+ Instead of a commit id on the command line (which is not expected in
+ this case), 'git http-fetch' fetches the packfile directly at the given
+ URL and uses index-pack to generate corresponding .idx and .keep files.
+ The hash is used to determine the name of the temporary file and is
+ arbitrary. The output of index-pack is printed to stdout.
+
--recover::
Verify that everything reachable from target is fetched. Used after
an earlier fetch is interrupted.
diff --git a/Documentation/git-multi-pack-index.txt b/Documentation/git-multi-pack-index.txt
index 642d9ac..0c66194 100644
--- a/Documentation/git-multi-pack-index.txt
+++ b/Documentation/git-multi-pack-index.txt
@@ -56,6 +56,9 @@ repack::
file is created, rewrite the multi-pack-index to reference the
new pack-file. A later run of 'git multi-pack-index expire' will
delete the pack-files that were part of this batch.
++
+If `repack.packKeptObjects` is `false`, then any pack-files with an
+associated `.keep` file will not be selected for the batch to repack.
EXAMPLES
diff --git a/Documentation/git-sparse-checkout.txt b/Documentation/git-sparse-checkout.txt
index 1a3ace6..a0eeaeb 100644
--- a/Documentation/git-sparse-checkout.txt
+++ b/Documentation/git-sparse-checkout.txt
@@ -70,7 +70,7 @@ C-style quoted strings.
`core.sparseCheckoutCone` is enabled, the given patterns are interpreted
as directory names as in the 'set' subcommand.
-'reapply::
+'reapply'::
Reapply the sparsity pattern rules to paths in the working tree.
Commands like merge or rebase can materialize paths to do their
work (e.g. in order to show you a conflict), and other
@@ -200,10 +200,32 @@ directory.
SUBMODULES
----------
-If your repository contains one or more submodules, then those submodules will
-appear based on which you initialized with the `git submodule` command. If
-your sparse-checkout patterns exclude an initialized submodule, then that
-submodule will still appear in your working directory.
+If your repository contains one or more submodules, then submodules
+are populated based on interactions with the `git submodule` command.
+Specifically, `git submodule init -- <path>` will ensure the submodule
+at `<path>` is present, while `git submodule deinit [-f] -- <path>`
+will remove the files for the submodule at `<path>` (including any
+untracked files, uncommitted changes, and unpushed history). Similar
+to how sparse-checkout removes files from the working tree but still
+leaves entries in the index, deinitialized submodules are removed from
+the working directory but still have an entry in the index.
+
+Since submodules may have unpushed changes or untracked files,
+removing them could result in data loss. Thus, changing sparse
+inclusion/exclusion rules will not cause an already checked out
+submodule to be removed from the working copy. Said another way, just
+as `checkout` will not cause submodules to be automatically removed or
+initialized even when switching between branches that remove or add
+submodules, using `sparse-checkout` to reduce or expand the scope of
+"interesting" files will not cause submodules to be automatically
+deinitialized or initialized either.
+
+Further, the above facts mean that there are multiple reasons that
+"tracked" files might not be present in the working copy: sparsity
+pattern application from sparse-checkout, and submodule initialization
+state. Thus, commands like `git grep` that work on tracked files in
+the working copy may return results that are limited by either or both
+of these restrictions.
SEE ALSO
diff --git a/Documentation/git-worktree.txt b/Documentation/git-worktree.txt
index 85d92c9..4796c3c 100644
--- a/Documentation/git-worktree.txt
+++ b/Documentation/git-worktree.txt
@@ -126,7 +126,9 @@ OPTIONS
locked working tree path, specify `--force` twice.
+
`move` refuses to move a locked working tree unless `--force` is specified
-twice.
+twice. If the destination is already assigned to some other working tree but is
+missing (for instance, if `<new-path>` was deleted manually), then `--force`
+allows the move to proceed; use --force twice if the destination is locked.
+
`remove` refuses to remove an unclean working tree unless `--force` is used.
To remove a locked working tree, specify `--force` twice.
diff --git a/Documentation/git.txt b/Documentation/git.txt
index 9d6769e..3e50065 100644
--- a/Documentation/git.txt
+++ b/Documentation/git.txt
@@ -493,7 +493,7 @@ double-quotes and respecting backslash escapes. E.g., the value
details. This variable has lower precedence than other path
variables such as GIT_INDEX_FILE, GIT_OBJECT_DIRECTORY...
-`GIT_DEFAULT_HASH_ALGORITHM`::
+`GIT_DEFAULT_HASH`::
If this variable is set, the default hash algorithm for new
repositories will be set to this value. This value is currently
ignored when cloning; the setting of the remote repository
@@ -721,8 +721,6 @@ of clones and fetches.
Enables a curl full trace dump of all incoming and outgoing data,
including descriptive information, of the git transport protocol.
This is similar to doing curl `--trace-ascii` on the command line.
- This option overrides setting the `GIT_CURL_VERBOSE` environment
- variable.
See `GIT_TRACE` for available trace output options.
`GIT_TRACE_CURL_NO_DATA`::
@@ -777,11 +775,10 @@ for full details.
See `GIT_TRACE2` for available trace output options and
link:technical/api-trace2.html[Trace2 documentation] for full details.
-`GIT_REDACT_COOKIES`::
- This can be set to a comma-separated list of strings. When a curl trace
- is enabled (see `GIT_TRACE_CURL` above), whenever a "Cookies:" header
- sent by the client is dumped, values of cookies whose key is in that
- list (case-sensitive) are redacted.
+`GIT_TRACE_REDACT`::
+ By default, when tracing is activated, Git redacts the values of
+ cookies, the "Authorization:" header, and the "Proxy-Authorization:"
+ header. Set this variable to `0` to prevent this redaction.
`GIT_LITERAL_PATHSPECS`::
Setting this variable to `1` will cause Git to treat all
diff --git a/Documentation/gitcredentials.txt b/Documentation/gitcredentials.txt
index 0d0f714..9e481ae 100644
--- a/Documentation/gitcredentials.txt
+++ b/Documentation/gitcredentials.txt
@@ -268,16 +268,26 @@ For a `get` operation, the helper should produce a list of attributes on
stdout in the same format (see linkgit:git-credential[1] for common
attributes). A helper is free to produce a subset, or even no values at
all if it has nothing useful to provide. Any provided attributes will
-overwrite those already known about by Git. If a helper outputs a
-`quit` attribute with a value of `true` or `1`, no further helpers will
-be consulted, nor will the user be prompted (if no credential has been
-provided, the operation will then fail).
+overwrite those already known about by Git's credential subsystem.
+
+While it is possible to override all attributes, well behaving helpers
+should refrain from doing so for any attribute other than username and
+password.
+
+If a helper outputs a `quit` attribute with a value of `true` or `1`,
+no further helpers will be consulted, nor will the user be prompted
+(if no credential has been provided, the operation will then fail).
+
+Similarly, no more helpers will be consulted once both username and
+password had been provided.
For a `store` or `erase` operation, the helper's output is ignored.
-If it fails to perform the requested operation, it may complain to
-stderr to inform the user. If it does not support the requested
-operation (e.g., a read-only store), it should silently ignore the
-request.
+
+If a helper fails to perform the requested operation or needs to notify
+the user of a potential issue, it may write to stderr.
+
+If it does not support the requested operation (e.g., a read-only store),
+it should silently ignore the request.
If a helper receives any other operation, it should silently ignore the
request. This leaves room for future operations to be added (older
diff --git a/Documentation/gitfaq.txt b/Documentation/gitfaq.txt
index 1cf83df..9cd7a59 100644
--- a/Documentation/gitfaq.txt
+++ b/Documentation/gitfaq.txt
@@ -223,6 +223,24 @@ a file checked into the repository which is a template or set of defaults which
can then be copied alongside and modified as appropriate. This second, modified
file is usually ignored to prevent accidentally committing it.
+[[files-in-gitignore-are-tracked]]
+I asked Git to ignore various files, yet they are still tracked::
+ A `gitignore` file ensures that certain file(s) which are not
+ tracked by Git remain untracked. However, sometimes particular
+ file(s) may have been tracked before adding them into the
+ `.gitignore`, hence they still remain tracked. To untrack and
+ ignore files/patterns, use `git rm --cached <file/pattern>`
+ and add a pattern to `.gitignore` that matches the <file>.
+ See linkgit:gitignore[5] for details.
+
+[[fetching-and-pulling]]
+How do I know if I want to do a fetch or a pull?::
+ A fetch stores a copy of the latest changes from the remote
+ repository, without modifying the working tree or current branch.
+ You can then at your leisure inspect, merge, rebase on top of, or
+ ignore the upstream changes. A pull consists of a fetch followed
+ immediately by either a merge or rebase. See linkgit:git-pull[1].
+
Hooks
-----
diff --git a/Documentation/gitremote-helpers.txt b/Documentation/gitremote-helpers.txt
index 26f32e4..6f1e269 100644
--- a/Documentation/gitremote-helpers.txt
+++ b/Documentation/gitremote-helpers.txt
@@ -410,7 +410,9 @@ Supported if the helper has the "connect" capability.
trying to fall back). After line feed terminating the positive
(empty) response, the output of the service starts. Messages
(both request and response) must consist of zero or more
- PKT-LINEs, terminating in a flush packet. The client must not
+ PKT-LINEs, terminating in a flush packet. Response messages will
+ then have a response end packet after the flush packet to
+ indicate the end of a response. The client must not
expect the server to store any state in between request-response
pairs. After the connection ends, the remote helper exits.
+
diff --git a/Documentation/rev-list-options.txt b/Documentation/rev-list-options.txt
index 04ad7dd..b01b2b6 100644
--- a/Documentation/rev-list-options.txt
+++ b/Documentation/rev-list-options.txt
@@ -581,12 +581,12 @@ option does. Applied to the 'D..M' range, it results in:
Before discussing another option, `--show-pulls`, we need to
create a new example history.
-+
+
A common problem users face when looking at simplified history is that a
commit they know changed a file somehow does not appear in the file's
simplified history. Let's demonstrate a new example and show how options
such as `--full-history` and `--simplify-merges` works in that case:
-+
+
-----------------------------------------------------------------------
.-A---M-----C--N---O---P
/ / \ \ \/ / /
@@ -595,7 +595,7 @@ such as `--full-history` and `--simplify-merges` works in that case:
\ / /\ /
`---X--' `---Y--'
-----------------------------------------------------------------------
-+
+
For this example, suppose `I` created `file.txt` which was modified by
`A`, `B`, and `X` in different ways. The single-parent commits `C`, `Z`,
and `Y` do not change `file.txt`. The merge commit `M` was created by
@@ -607,19 +607,19 @@ the contents of `file.txt` at `X`. Hence, `R` is TREESAME to `X` but not
contents of `file.txt` at `R`, so `N` is TREESAME to `R` but not `C`.
The merge commits `O` and `P` are TREESAME to their first parents, but
not to their second parents, `Z` and `Y` respectively.
-+
+
When using the default mode, `N` and `R` both have a TREESAME parent, so
those edges are walked and the others are ignored. The resulting history
graph is:
-+
+
-----------------------------------------------------------------------
I---X
-----------------------------------------------------------------------
-+
+
When using `--full-history`, Git walks every edge. This will discover
the commits `A` and `B` and the merge `M`, but also will reveal the
merge commits `O` and `P`. With parent rewriting, the resulting graph is:
-+
+
-----------------------------------------------------------------------
.-A---M--------N---O---P
/ / \ \ \/ / /
@@ -628,21 +628,21 @@ merge commits `O` and `P`. With parent rewriting, the resulting graph is:
\ / /\ /
`---X--' `------'
-----------------------------------------------------------------------
-+
+
Here, the merge commits `O` and `P` contribute extra noise, as they did
not actually contribute a change to `file.txt`. They only merged a topic
that was based on an older version of `file.txt`. This is a common
issue in repositories using a workflow where many contributors work in
parallel and merge their topic branches along a single trunk: manu
unrelated merges appear in the `--full-history` results.
-+
+
When using the `--simplify-merges` option, the commits `O` and `P`
disappear from the results. This is because the rewritten second parents
of `O` and `P` are reachable from their first parents. Those edges are
removed and then the commits look like single-parent commits that are
TREESAME to their parent. This also happens to the commit `N`, resulting
in a history view as follows:
-+
+
-----------------------------------------------------------------------
.-A---M--.
/ / \
@@ -651,18 +651,18 @@ in a history view as follows:
\ / /
`---X--'
-----------------------------------------------------------------------
-+
+
In this view, we see all of the important single-parent changes from
`A`, `B`, and `X`. We also see the carefully-resolved merge `M` and the
not-so-carefully-resolved merge `R`. This is usually enough information
to determine why the commits `A` and `B` "disappeared" from history in
the default view. However, there are a few issues with this approach.
-+
+
The first issue is performance. Unlike any previous option, the
`--simplify-merges` option requires walking the entire commit history
before returning a single result. This can make the option difficult to
use for very large repositories.
-+
+
The second issue is one of auditing. When many contributors are working
on the same repository, it is important which merge commits introduced
a change into an important branch. The problematic merge `R` above is
@@ -671,10 +671,13 @@ important branch. Instead, the merge `N` was used to merge `R` and `X`
into the important branch. This commit may have information about why
the change `X` came to override the changes from `A` and `B` in its
commit message.
+
+--show-pulls::
+ In addition to the commits shown in the default history, show
+ each merge commit that is not TREESAME to its first parent but
+ is TREESAME to a later parent.
+
-The `--show-pulls` option helps with both of these issues by adding more
-merge commits to the history results. If a merge is not TREESAME to its
-first parent but is TREESAME to a later parent, then that merge is
+When a merge commit is included by `--show-pulls`, the merge is
treated as if it "pulled" the change from another branch. When using
`--show-pulls` on this example (and no other options) the resulting
graph is:
diff --git a/Documentation/technical/commit-graph-format.txt b/Documentation/technical/commit-graph-format.txt
index de56f9f..1beef17 100644
--- a/Documentation/technical/commit-graph-format.txt
+++ b/Documentation/technical/commit-graph-format.txt
@@ -97,10 +97,10 @@ CHUNK DATA:
bit on. The other bits correspond to the position of the last parent.
Bloom Filter Index (ID: {'B', 'I', 'D', 'X'}) (N * 4 bytes) [Optional]
- * The ith entry, BIDX[i], stores the number of 8-byte word blocks in all
- Bloom filters from commit 0 to commit i (inclusive) in lexicographic
- order. The Bloom filter for the i-th commit spans from BIDX[i-1] to
- BIDX[i] (plus header length), where BIDX[-1] is 0.
+ * The ith entry, BIDX[i], stores the number of bytes in all Bloom filters
+ from commit 0 to commit i (inclusive) in lexicographic order. The Bloom
+ filter for the i-th commit spans from BIDX[i-1] to BIDX[i] (plus header
+ length), where BIDX[-1] is 0.
* The BIDX chunk is ignored if the BDAT chunk is not present.
Bloom Filter Data (ID: {'B', 'D', 'A', 'T'}) [Optional]
diff --git a/Documentation/technical/http-protocol.txt b/Documentation/technical/http-protocol.txt
index 9c5b6f0..51a79e6 100644
--- a/Documentation/technical/http-protocol.txt
+++ b/Documentation/technical/http-protocol.txt
@@ -216,7 +216,7 @@ smart server reply:
S: 001e# service=git-upload-pack\n
S: 0000
S: 004895dcfa3633004da0049d3d0fa03f80589cbcaf31 refs/heads/maint\0multi_ack\n
- S: 0042d049f6c27a2244e12041955e262a404c7faba355 refs/heads/master\n
+ S: 003fd049f6c27a2244e12041955e262a404c7faba355 refs/heads/master\n
S: 003c2cb58b79488a98d2721cea644875a8dd0026b115 refs/tags/v1.0\n
S: 003fa3c2e2402b99163d1d59756e5f207ae21cccba4c refs/tags/v1.0^{}\n
S: 0000
diff --git a/Documentation/technical/pack-protocol.txt b/Documentation/technical/pack-protocol.txt
index d5ce4ee..a4573d1 100644
--- a/Documentation/technical/pack-protocol.txt
+++ b/Documentation/technical/pack-protocol.txt
@@ -96,7 +96,7 @@ Basically what the Git client is doing to connect to an 'upload-pack'
process on the server side over the Git protocol is this:
$ echo -e -n \
- "0039git-upload-pack /schacon/gitbook.git\0host=example.com\0" |
+ "003agit-upload-pack /schacon/gitbook.git\0host=example.com\0" |
nc -v example.com 9418
@@ -171,9 +171,9 @@ with a version number (if "version=1" is sent as an Extra Parameter),
and a listing of each reference it has (all branches and tags) along
with the object name that each reference currently points to.
- $ echo -e -n "0044git-upload-pack /schacon/gitbook.git\0host=example.com\0\0version=1\0" |
+ $ echo -e -n "0045git-upload-pack /schacon/gitbook.git\0host=example.com\0\0version=1\0" |
nc -v example.com 9418
- 000aversion 1
+ 000eversion 1
00887217a7c7e582c46cec22a130adf4b9d7d950fba0 HEAD\0multi_ack thin-pack
side-band side-band-64k ofs-delta shallow no-progress include-tag
00441d3fcd5ced445d1abc402225c0b8a1299641f497 refs/heads/integration
diff --git a/Documentation/technical/packfile-uri.txt b/Documentation/technical/packfile-uri.txt
new file mode 100644
index 0000000..318713a
--- /dev/null
+++ b/Documentation/technical/packfile-uri.txt
@@ -0,0 +1,78 @@
+Packfile URIs
+=============
+
+This feature allows servers to serve part of their packfile response as URIs.
+This allows server designs that improve scalability in bandwidth and CPU usage
+(for example, by serving some data through a CDN), and (in the future) provides
+some measure of resumability to clients.
+
+This feature is available only in protocol version 2.
+
+Protocol
+--------
+
+The server advertises the `packfile-uris` capability.
+
+If the client then communicates which protocols (HTTPS, etc.) it supports with
+a `packfile-uris` argument, the server MAY send a `packfile-uris` section
+directly before the `packfile` section (right after `wanted-refs` if it is
+sent) containing URIs of any of the given protocols. The URIs point to
+packfiles that use only features that the client has declared that it supports
+(e.g. ofs-delta and thin-pack). See protocol-v2.txt for the documentation of
+this section.
+
+Clients should then download and index all the given URIs (in addition to
+downloading and indexing the packfile given in the `packfile` section of the
+response) before performing the connectivity check.
+
+Server design
+-------------
+
+The server can be trivially made compatible with the proposed protocol by
+having it advertise `packfile-uris`, tolerating the client sending
+`packfile-uris`, and never sending any `packfile-uris` section. But we should
+include some sort of non-trivial implementation in the Minimum Viable Product,
+at least so that we can test the client.
+
+This is the implementation: a feature, marked experimental, that allows the
+server to be configured by one or more `uploadpack.blobPackfileUri=<sha1>
+<uri>` entries. Whenever the list of objects to be sent is assembled, all such
+blobs are excluded, replaced with URIs. The client will download those URIs,
+expecting them to each point to packfiles containing single blobs.
+
+Client design
+-------------
+
+The client has a config variable `fetch.uriprotocols` that determines which
+protocols the end user is willing to use. By default, this is empty.
+
+When the client downloads the given URIs, it should store them with "keep"
+files, just like it does with the packfile in the `packfile` section. These
+additional "keep" files can only be removed after the refs have been updated -
+just like the "keep" file for the packfile in the `packfile` section.
+
+The division of work (initial fetch + additional URIs) introduces convenient
+points for resumption of an interrupted clone - such resumption can be done
+after the Minimum Viable Product (see "Future work").
+
+Future work
+-----------
+
+The protocol design allows some evolution of the server and client without any
+need for protocol changes, so only a small-scoped design is included here to
+form the MVP. For example, the following can be done:
+
+ * On the server, more sophisticated means of excluding objects (e.g. by
+ specifying a commit to represent that commit and all objects that it
+ references).
+ * On the client, resumption of clone. If a clone is interrupted, information
+ could be recorded in the repository's config and a "clone-resume" command
+ can resume the clone in progress. (Resumption of subsequent fetches is more
+ difficult because that must deal with the user wanting to use the repository
+ even after the fetch was interrupted.)
+
+There are some possible features that will require a change in protocol:
+
+ * Additional HTTP headers (e.g. authentication)
+ * Byte range support
+ * Different file formats referenced by URIs (e.g. raw object)
diff --git a/Documentation/technical/protocol-v2.txt b/Documentation/technical/protocol-v2.txt
index 107e421..e597b74 100644
--- a/Documentation/technical/protocol-v2.txt
+++ b/Documentation/technical/protocol-v2.txt
@@ -33,6 +33,8 @@ In protocol v2 these special packets will have the following semantics:
* '0000' Flush Packet (flush-pkt) - indicates the end of a message
* '0001' Delimiter Packet (delim-pkt) - separates sections of a message
+ * '0002' Message Packet (response-end-pkt) - indicates the end of a response
+ for stateless connections
Initial Client Request
----------------------
@@ -323,13 +325,26 @@ included in the client's request:
indicating its sideband (1, 2, or 3), and the server may send "0005\2"
(a PKT-LINE of sideband 2 with no payload) as a keepalive packet.
+If the 'packfile-uris' feature is advertised, the following argument
+can be included in the client's request as well as the potential
+addition of the 'packfile-uris' section in the server's response as
+explained below.
+
+ packfile-uris <comma-separated list of protocols>
+ Indicates to the server that the client is willing to receive
+ URIs of any of the given protocols in place of objects in the
+ sent packfile. Before performing the connectivity check, the
+ client should download from all given URIs. Currently, the
+ protocols supported are "http" and "https".
+
The response of `fetch` is broken into a number of sections separated by
delimiter packets (0001), with each section beginning with its section
-header.
+header. Most sections are sent only when the packfile is sent.
- output = *section
- section = (acknowledgments | shallow-info | wanted-refs | packfile)
- (flush-pkt | delim-pkt)
+ output = acknowledgements flush-pkt |
+ [acknowledgments delim-pkt] [shallow-info delim-pkt]
+ [wanted-refs delim-pkt] [packfile-uris delim-pkt]
+ packfile flush-pkt
acknowledgments = PKT-LINE("acknowledgments" LF)
(nak | *ack)
@@ -347,13 +362,17 @@ header.
*PKT-LINE(wanted-ref LF)
wanted-ref = obj-id SP refname
+ packfile-uris = PKT-LINE("packfile-uris" LF) *packfile-uri
+ packfile-uri = PKT-LINE(40*(HEXDIGIT) SP *%x20-ff LF)
+
packfile = PKT-LINE("packfile" LF)
*PKT-LINE(%x01-03 *%x00-ff)
acknowledgments section
- * If the client determines that it is finished with negotiations
- by sending a "done" line, the acknowledgments sections MUST be
- omitted from the server's response.
+ * If the client determines that it is finished with negotiations by
+ sending a "done" line (thus requiring the server to send a packfile),
+ the acknowledgments sections MUST be omitted from the server's
+ response.
* Always begins with the section header "acknowledgments"
@@ -404,9 +423,6 @@ header.
which the client has not indicated was shallow as a part of
its request.
- * This section is only included if a packfile section is also
- included in the response.
-
wanted-refs section
* This section is only included if the client has requested a
ref using a 'want-ref' line and if a packfile section is also
@@ -420,6 +436,20 @@ header.
* The server MUST NOT send any refs which were not requested
using 'want-ref' lines.
+ packfile-uris section
+ * This section is only included if the client sent
+ 'packfile-uris' and the server has at least one such URI to
+ send.
+
+ * Always begins with the section header "packfile-uris".
+
+ * For each URI the server sends, it sends a hash of the pack's
+ contents (as output by git index-pack) followed by the URI.
+
+ * The hashes are 40 hex characters long. When Git upgrades to a new
+ hash algorithm, this might need to be updated. (It should match
+ whatever index-pack outputs after "pack\t" or "keep\t".
+
packfile section
* This section is only included if the client has sent 'want'
lines in its request and either requested that no more
diff --git a/Documentation/technical/reftable.txt b/Documentation/technical/reftable.txt
new file mode 100644
index 0000000..2951840
--- /dev/null
+++ b/Documentation/technical/reftable.txt
@@ -0,0 +1,1083 @@
+reftable
+--------
+
+Overview
+~~~~~~~~
+
+Problem statement
+^^^^^^^^^^^^^^^^^
+
+Some repositories contain a lot of references (e.g. android at 866k,
+rails at 31k). The existing packed-refs format takes up a lot of space
+(e.g. 62M), and does not scale with additional references. Lookup of a
+single reference requires linearly scanning the file.
+
+Atomic pushes modifying multiple references require copying the entire
+packed-refs file, which can be a considerable amount of data moved
+(e.g. 62M in, 62M out) for even small transactions (2 refs modified).
+
+Repositories with many loose references occupy a large number of disk
+blocks from the local file system, as each reference is its own file
+storing 41 bytes (and another file for the corresponding reflog). This
+negatively affects the number of inodes available when a large number of
+repositories are stored on the same filesystem. Readers can be penalized
+due to the larger number of syscalls required to traverse and read the
+`$GIT_DIR/refs` directory.
+
+
+Objectives
+^^^^^^^^^^
+
+* Near constant time lookup for any single reference, even when the
+repository is cold and not in process or kernel cache.
+* Near constant time verification if an object name is referred to by at least
+one reference (for allow-tip-sha1-in-want).
+* Efficient enumeration of an entire namespace, such as `refs/tags/`.
+* Support atomic push with `O(size_of_update)` operations.
+* Combine reflog storage with ref storage for small transactions.
+* Separate reflog storage for base refs and historical logs.
+
+Description
+^^^^^^^^^^^
+
+A reftable file is a portable binary file format customized for
+reference storage. References are sorted, enabling linear scans, binary
+search lookup, and range scans.
+
+Storage in the file is organized into variable sized blocks. Prefix
+compression is used within a single block to reduce disk space. Block
+size and alignment is tunable by the writer.
+
+Performance
+^^^^^^^^^^^
+
+Space used, packed-refs vs. reftable:
+
+[cols=",>,>,>,>,>",options="header",]
+|===============================================================
+|repository |packed-refs |reftable |% original |avg ref |avg obj
+|android |62.2 M |36.1 M |58.0% |33 bytes |5 bytes
+|rails |1.8 M |1.1 M |57.7% |29 bytes |4 bytes
+|git |78.7 K |48.1 K |61.0% |50 bytes |4 bytes
+|git (heads) |332 b |269 b |81.0% |33 bytes |0 bytes
+|===============================================================
+
+Scan (read 866k refs), by reference name lookup (single ref from 866k
+refs), and by SHA-1 lookup (refs with that SHA-1, from 866k refs):
+
+[cols=",>,>,>,>",options="header",]
+|=========================================================
+|format |cache |scan |by name |by SHA-1
+|packed-refs |cold |402 ms |409,660.1 usec |412,535.8 usec
+|packed-refs |hot | |6,844.6 usec |20,110.1 usec
+|reftable |cold |112 ms |33.9 usec |323.2 usec
+|reftable |hot | |20.2 usec |320.8 usec
+|=========================================================
+
+Space used for 149,932 log entries for 43,061 refs, reflog vs. reftable:
+
+[cols=",>,>",options="header",]
+|================================
+|format |size |avg entry
+|$GIT_DIR/logs |173 M |1209 bytes
+|reftable |5 M |37 bytes
+|================================
+
+Details
+~~~~~~~
+
+Peeling
+^^^^^^^
+
+References stored in a reftable are peeled, a record for an annotated
+(or signed) tag records both the tag object, and the object it refers
+to. This is analogous to storage in the packed-refs format.
+
+Reference name encoding
+^^^^^^^^^^^^^^^^^^^^^^^
+
+Reference names are an uninterpreted sequence of bytes that must pass
+linkgit:git-check-ref-format[1] as a valid reference name.
+
+Key unicity
+^^^^^^^^^^^
+
+Each entry must have a unique key; repeated keys are disallowed.
+
+Network byte order
+^^^^^^^^^^^^^^^^^^
+
+All multi-byte, fixed width fields are in network byte order.
+
+Varint encoding
+^^^^^^^^^^^^^^^
+
+Varint encoding is identical to the ofs-delta encoding method used
+within pack files.
+
+Decoder works such as:
+
+....
+val = buf[ptr] & 0x7f
+while (buf[ptr] & 0x80) {
+ ptr++
+ val = ((val + 1) << 7) | (buf[ptr] & 0x7f)
+}
+....
+
+Ordering
+^^^^^^^^
+
+Blocks are lexicographically ordered by their first reference.
+
+Directory/file conflicts
+^^^^^^^^^^^^^^^^^^^^^^^^
+
+The reftable format accepts both `refs/heads/foo` and
+`refs/heads/foo/bar` as distinct references.
+
+This property is useful for retaining log records in reftable, but may
+confuse versions of Git using `$GIT_DIR/refs` directory tree to maintain
+references. Users of reftable may choose to continue to reject `foo` and
+`foo/bar` type conflicts to prevent problems for peers.
+
+File format
+~~~~~~~~~~~
+
+Structure
+^^^^^^^^^
+
+A reftable file has the following high-level structure:
+
+....
+first_block {
+ header
+ first_ref_block
+}
+ref_block*
+ref_index*
+obj_block*
+obj_index*
+log_block*
+log_index*
+footer
+....
+
+A log-only file omits the `ref_block`, `ref_index`, `obj_block` and
+`obj_index` sections, containing only the file header and log block:
+
+....
+first_block {
+ header
+}
+log_block*
+log_index*
+footer
+....
+
+in a log-only file the first log block immediately follows the file
+header, without padding to block alignment.
+
+Block size
+^^^^^^^^^^
+
+The file's block size is arbitrarily determined by the writer, and does
+not have to be a power of 2. The block size must be larger than the
+longest reference name or log entry used in the repository, as
+references cannot span blocks.
+
+Powers of two that are friendly to the virtual memory system or
+filesystem (such as 4k or 8k) are recommended. Larger sizes (64k) can
+yield better compression, with a possible increased cost incurred by
+readers during access.
+
+The largest block size is `16777215` bytes (15.99 MiB).
+
+Block alignment
+^^^^^^^^^^^^^^^
+
+Writers may choose to align blocks at multiples of the block size by
+including `padding` filled with NUL bytes at the end of a block to round
+out to the chosen alignment. When alignment is used, writers must
+specify the alignment with the file header's `block_size` field.
+
+Block alignment is not required by the file format. Unaligned files must
+set `block_size = 0` in the file header, and omit `padding`. Unaligned
+files with more than one ref block must include the link:#Ref-index[ref
+index] to support fast lookup. Readers must be able to read both aligned
+and non-aligned files.
+
+Very small files (e.g. a single ref block) may omit `padding` and the ref
+index to reduce total file size.
+
+Header (version 1)
+^^^^^^^^^^^^^^^^^^
+
+A 24-byte header appears at the beginning of the file:
+
+....
+'REFT'
+uint8( version_number = 1 )
+uint24( block_size )
+uint64( min_update_index )
+uint64( max_update_index )
+....
+
+Aligned files must specify `block_size` to configure readers with the
+expected block alignment. Unaligned files must set `block_size = 0`.
+
+The `min_update_index` and `max_update_index` describe bounds for the
+`update_index` field of all log records in this file. When reftables are
+used in a stack for link:#Update-transactions[transactions], these
+fields can order the files such that the prior file's
+`max_update_index + 1` is the next file's `min_update_index`.
+
+Header (version 2)
+^^^^^^^^^^^^^^^^^^
+
+A 28-byte header appears at the beginning of the file:
+
+....
+'REFT'
+uint8( version_number = 2 )
+uint24( block_size )
+uint64( min_update_index )
+uint64( max_update_index )
+uint32( hash_id )
+....
+
+The header is identical to `version_number=1`, with the 4-byte hash ID
+("sha1" for SHA1 and "s256" for SHA-256) append to the header.
+
+For maximum backward compatibility, it is recommended to use version 1 when
+writing SHA1 reftables.
+
+First ref block
+^^^^^^^^^^^^^^^
+
+The first ref block shares the same block as the file header, and is 24
+bytes smaller than all other blocks in the file. The first block
+immediately begins after the file header, at position 24.
+
+If the first block is a log block (a log-only file), its block header
+begins immediately at position 24.
+
+Ref block format
+^^^^^^^^^^^^^^^^
+
+A ref block is written as:
+
+....
+'r'
+uint24( block_len )
+ref_record+
+uint24( restart_offset )+
+uint16( restart_count )
+
+padding?
+....
+
+Blocks begin with `block_type = 'r'` and a 3-byte `block_len` which
+encodes the number of bytes in the block up to, but not including the
+optional `padding`. This is always less than or equal to the file's
+block size. In the first ref block, `block_len` includes 24 bytes for
+the file header.
+
+The 2-byte `restart_count` stores the number of entries in the
+`restart_offset` list, which must not be empty. Readers can use
+`restart_count` to binary search between restarts before starting a
+linear scan.
+
+Exactly `restart_count` 3-byte `restart_offset` values precedes the
+`restart_count`. Offsets are relative to the start of the block and
+refer to the first byte of any `ref_record` whose name has not been
+prefix compressed. Entries in the `restart_offset` list must be sorted,
+ascending. Readers can start linear scans from any of these records.
+
+A variable number of `ref_record` fill the middle of the block,
+describing reference names and values. The format is described below.
+
+As the first ref block shares the first file block with the file header,
+all `restart_offset` in the first block are relative to the start of the
+file (position 0), and include the file header. This forces the first
+`restart_offset` to be `28`.
+
+ref record
+++++++++++
+
+A `ref_record` describes a single reference, storing both the name and
+its value(s). Records are formatted as:
+
+....
+varint( prefix_length )
+varint( (suffix_length << 3) | value_type )
+suffix
+varint( update_index_delta )
+value?
+....
+
+The `prefix_length` field specifies how many leading bytes of the prior
+reference record's name should be copied to obtain this reference's
+name. This must be 0 for the first reference in any block, and also must
+be 0 for any `ref_record` whose offset is listed in the `restart_offset`
+table at the end of the block.
+
+Recovering a reference name from any `ref_record` is a simple concat:
+
+....
+this_name = prior_name[0..prefix_length] + suffix
+....
+
+The `suffix_length` value provides the number of bytes available in
+`suffix` to copy from `suffix` to complete the reference name.
+
+The `update_index` that last modified the reference can be obtained by
+adding `update_index_delta` to the `min_update_index` from the file
+header: `min_update_index + update_index_delta`.
+
+The `value` follows. Its format is determined by `value_type`, one of
+the following:
+
+* `0x0`: deletion; no value data (see transactions, below)
+* `0x1`: one object name; value of the ref
+* `0x2`: two object names; value of the ref, peeled target
+* `0x3`: symbolic reference: `varint( target_len ) target`
+
+Symbolic references use `0x3`, followed by the complete name of the
+reference target. No compression is applied to the target name.
+
+Types `0x4..0x7` are reserved for future use.
+
+Ref index
+^^^^^^^^^
+
+The ref index stores the name of the last reference from every ref block
+in the file, enabling reduced disk seeks for lookups. Any reference can
+be found by searching the index, identifying the containing block, and
+searching within that block.
+
+The index may be organized into a multi-level index, where the 1st level
+index block points to additional ref index blocks (2nd level), which may
+in turn point to either additional index blocks (e.g. 3rd level) or ref
+blocks (leaf level). Disk reads required to access a ref go up with
+higher index levels. Multi-level indexes may be required to ensure no
+single index block exceeds the file format's max block size of
+`16777215` bytes (15.99 MiB). To achieve constant O(1) disk seeks for
+lookups the index must be a single level, which is permitted to exceed
+the file's configured block size, but not the format's max block size of
+15.99 MiB.
+
+If present, the ref index block(s) appears after the last ref block.
+
+If there are at least 4 ref blocks, a ref index block should be written
+to improve lookup times. Cold reads using the index require 2 disk reads
+(read index, read block), and binary searching < 4 blocks also requires
+<= 2 reads. Omitting the index block from smaller files saves space.
+
+If the file is unaligned and contains more than one ref block, the ref
+index must be written.
+
+Index block format:
+
+....
+'i'
+uint24( block_len )
+index_record+
+uint24( restart_offset )+
+uint16( restart_count )
+
+padding?
+....
+
+The index blocks begin with `block_type = 'i'` and a 3-byte `block_len`
+which encodes the number of bytes in the block, up to but not including
+the optional `padding`.
+
+The `restart_offset` and `restart_count` fields are identical in format,
+meaning and usage as in ref blocks.
+
+To reduce the number of reads required for random access in very large
+files the index block may be larger than other blocks. However, readers
+must hold the entire index in memory to benefit from this, so it's a
+time-space tradeoff in both file size and reader memory.
+
+Increasing the file's block size decreases the index size. Alternatively
+a multi-level index may be used, keeping index blocks within the file's
+block size, but increasing the number of blocks that need to be
+accessed.
+
+index record
+++++++++++++
+
+An index record describes the last entry in another block. Index records
+are written as:
+
+....
+varint( prefix_length )
+varint( (suffix_length << 3) | 0 )
+suffix
+varint( block_position )
+....
+
+Index records use prefix compression exactly like `ref_record`.
+
+Index records store `block_position` after the suffix, specifying the
+absolute position in bytes (from the start of the file) of the block
+that ends with this reference. Readers can seek to `block_position` to
+begin reading the block header.
+
+Readers must examine the block header at `block_position` to determine
+if the next block is another level index block, or the leaf-level ref
+block.
+
+Reading the index
++++++++++++++++++
+
+Readers loading the ref index must first read the footer (below) to
+obtain `ref_index_position`. If not present, the position will be 0. The
+`ref_index_position` is for the 1st level root of the ref index.
+
+Obj block format
+^^^^^^^^^^^^^^^^
+
+Object blocks are optional. Writers may choose to omit object blocks,
+especially if readers will not use the object name to ref mapping.
+
+Object blocks use unique, abbreviated 2-32 object name keys, mapping to
+ref blocks containing references pointing to that object directly, or as
+the peeled value of an annotated tag. Like ref blocks, object blocks use
+the file's standard block size. The abbrevation length is available in
+the footer as `obj_id_len`.
+
+To save space in small files, object blocks may be omitted if the ref
+index is not present, as brute force search will only need to read a few
+ref blocks. When missing, readers should brute force a linear search of
+all references to lookup by object name.
+
+An object block is written as:
+
+....
+'o'
+uint24( block_len )
+obj_record+
+uint24( restart_offset )+
+uint16( restart_count )
+
+padding?
+....
+
+Fields are identical to ref block. Binary search using the restart table
+works the same as in reference blocks.
+
+Because object names are abbreviated by writers to the shortest unique
+abbreviation within the reftable, obj key lengths have a variable length. Their
+length must be at least 2 bytes. Readers must compare only for common prefix
+match within an obj block or obj index.
+
+obj record
+++++++++++
+
+An `obj_record` describes a single object abbreviation, and the blocks
+containing references using that unique abbreviation:
+
+....
+varint( prefix_length )
+varint( (suffix_length << 3) | cnt_3 )
+suffix
+varint( cnt_large )?
+varint( position_delta )*
+....
+
+Like in reference blocks, abbreviations are prefix compressed within an
+obj block. On large reftables with many unique objects, higher block
+sizes (64k), and higher restart interval (128), a `prefix_length` of 2
+or 3 and `suffix_length` of 3 may be common in obj records (unique
+abbreviation of 5-6 raw bytes, 10-12 hex digits).
+
+Each record contains `position_count` number of positions for matching
+ref blocks. For 1-7 positions the count is stored in `cnt_3`. When
+`cnt_3 = 0` the actual count follows in a varint, `cnt_large`.
+
+The use of `cnt_3` bets most objects are pointed to by only a single
+reference, some may be pointed to by a couple of references, and very
+few (if any) are pointed to by more than 7 references.
+
+A special case exists when `cnt_3 = 0` and `cnt_large = 0`: there are no
+`position_delta`, but at least one reference starts with this
+abbreviation. A reader that needs exact reference names must scan all
+references to find which specific references have the desired object.
+Writers should use this format when the `position_delta` list would have
+overflowed the file's block size due to a high number of references
+pointing to the same object.
+
+The first `position_delta` is the position from the start of the file.
+Additional `position_delta` entries are sorted ascending and relative to
+the prior entry, e.g. a reader would perform:
+
+....
+pos = position_delta[0]
+prior = pos
+for (j = 1; j < position_count; j++) {
+ pos = prior + position_delta[j]
+ prior = pos
+}
+....
+
+With a position in hand, a reader must linearly scan the ref block,
+starting from the first `ref_record`, testing each reference's object names
+(for `value_type = 0x1` or `0x2`) for full equality. Faster searching by
+object name within a single ref block is not supported by the reftable format.
+Smaller block sizes reduce the number of candidates this step must
+consider.
+
+Obj index
+^^^^^^^^^
+
+The obj index stores the abbreviation from the last entry for every obj
+block in the file, enabling reduced disk seeks for all lookups. It is
+formatted exactly the same as the ref index, but refers to obj blocks.
+
+The obj index should be present if obj blocks are present, as obj blocks
+should only be written in larger files.
+
+Readers loading the obj index must first read the footer (below) to
+obtain `obj_index_position`. If not present, the position will be 0.
+
+Log block format
+^^^^^^^^^^^^^^^^
+
+Unlike ref and obj blocks, log blocks are always unaligned.
+
+Log blocks are variable in size, and do not match the `block_size`
+specified in the file header or footer. Writers should choose an
+appropriate buffer size to prepare a log block for deflation, such as
+`2 * block_size`.
+
+A log block is written as:
+
+....
+'g'
+uint24( block_len )
+zlib_deflate {
+ log_record+
+ uint24( restart_offset )+
+ uint16( restart_count )
+}
+....
+
+Log blocks look similar to ref blocks, except `block_type = 'g'`.
+
+The 4-byte block header is followed by the deflated block contents using
+zlib deflate. The `block_len` in the header is the inflated size
+(including 4-byte block header), and should be used by readers to
+preallocate the inflation output buffer. A log block's `block_len` may
+exceed the file's block size.
+
+Offsets within the log block (e.g. `restart_offset`) still include the
+4-byte header. Readers may prefer prefixing the inflation output buffer
+with the 4-byte header.
+
+Within the deflate container, a variable number of `log_record` describe
+reference changes. The log record format is described below. See ref
+block format (above) for a description of `restart_offset` and
+`restart_count`.
+
+Because log blocks have no alignment or padding between blocks, readers
+must keep track of the bytes consumed by the inflater to know where the
+next log block begins.
+
+log record
+++++++++++
+
+Log record keys are structured as:
+
+....
+ref_name '\0' reverse_int64( update_index )
+....
+
+where `update_index` is the unique transaction identifier. The
+`update_index` field must be unique within the scope of a `ref_name`.
+See the update transactions section below for further details.
+
+The `reverse_int64` function inverses the value so lexicographical
+ordering the network byte order encoding sorts the more recent records
+with higher `update_index` values first:
+
+....
+reverse_int64(int64 t) {
+ return 0xffffffffffffffff - t;
+}
+....
+
+Log records have a similar starting structure to ref and index records,
+utilizing the same prefix compression scheme applied to the log record
+key described above.
+
+....
+ varint( prefix_length )
+ varint( (suffix_length << 3) | log_type )
+ suffix
+ log_data {
+ old_id
+ new_id
+ varint( name_length ) name
+ varint( email_length ) email
+ varint( time_seconds )
+ sint16( tz_offset )
+ varint( message_length ) message
+ }?
+....
+
+Log record entries use `log_type` to indicate what follows:
+
+* `0x0`: deletion; no log data.
+* `0x1`: standard git reflog data using `log_data` above.
+
+The `log_type = 0x0` is mostly useful for `git stash drop`, removing an
+entry from the reflog of `refs/stash` in a transaction file (below),
+without needing to rewrite larger files. Readers reading a stack of
+reflogs must treat this as a deletion.
+
+For `log_type = 0x1`, the `log_data` section follows
+linkgit:git-update-ref[1] logging and includes:
+
+* two object names (old id, new id)
+* varint string of committer's name
+* varint string of committer's email
+* varint time in seconds since epoch (Jan 1, 1970)
+* 2-byte timezone offset in minutes (signed)
+* varint string of message
+
+`tz_offset` is the absolute number of minutes from GMT the committer was
+at the time of the update. For example `GMT-0800` is encoded in reftable
+as `sint16(-480)` and `GMT+0230` is `sint16(150)`.
+
+The committer email does not contain `<` or `>`, it's the value normally
+found between the `<>` in a git commit object header.
+
+The `message_length` may be 0, in which case there was no message
+supplied for the update.
+
+Contrary to traditional reflog (which is a file), renames are encoded as
+a combination of ref deletion and ref creation. A deletion is a log
+record with a zero new_id, and a creation is a log record with a zero old_id.
+
+Reading the log
++++++++++++++++
+
+Readers accessing the log must first read the footer (below) to
+determine the `log_position`. The first block of the log begins at
+`log_position` bytes since the start of the file. The `log_position` is
+not block aligned.
+
+Importing logs
+++++++++++++++
+
+When importing from `$GIT_DIR/logs` writers should globally order all
+log records roughly by timestamp while preserving file order, and assign
+unique, increasing `update_index` values for each log line. Newer log
+records get higher `update_index` values.
+
+Although an import may write only a single reftable file, the reftable
+file must span many unique `update_index`, as each log line requires its
+own `update_index` to preserve semantics.
+
+Log index
+^^^^^^^^^
+
+The log index stores the log key
+(`refname \0 reverse_int64(update_index)`) for the last log record of
+every log block in the file, supporting bounded-time lookup.
+
+A log index block must be written if 2 or more log blocks are written to
+the file. If present, the log index appears after the last log block.
+There is no padding used to align the log index to block alignment.
+
+Log index format is identical to ref index, except the keys are 9 bytes
+longer to include `'\0'` and the 8-byte `reverse_int64(update_index)`.
+Records use `block_position` to refer to the start of a log block.
+
+Reading the index
++++++++++++++++++
+
+Readers loading the log index must first read the footer (below) to
+obtain `log_index_position`. If not present, the position will be 0.
+
+Footer
+^^^^^^
+
+After the last block of the file, a file footer is written. It begins
+like the file header, but is extended with additional data.
+
+....
+ HEADER
+
+ uint64( ref_index_position )
+ uint64( (obj_position << 5) | obj_id_len )
+ uint64( obj_index_position )
+
+ uint64( log_position )
+ uint64( log_index_position )
+
+ uint32( CRC-32 of above )
+....
+
+If a section is missing (e.g. ref index) the corresponding position
+field (e.g. `ref_index_position`) will be 0.
+
+* `obj_position`: byte position for the first obj block.
+* `obj_id_len`: number of bytes used to abbreviate object names in
+obj blocks.
+* `log_position`: byte position for the first log block.
+* `ref_index_position`: byte position for the start of the ref index.
+* `obj_index_position`: byte position for the start of the obj index.
+* `log_index_position`: byte position for the start of the log index.
+
+The size of the footer is 68 bytes for version 1, and 72 bytes for
+version 2.
+
+Reading the footer
+++++++++++++++++++
+
+Readers must first read the file start to determine the version
+number. Then they seek to `file_length - FOOTER_LENGTH` to access the
+footer. A trusted external source (such as `stat(2)`) is necessary to
+obtain `file_length`. When reading the footer, readers must verify:
+
+* 4-byte magic is correct
+* 1-byte version number is recognized
+* 4-byte CRC-32 matches the other 64 bytes (including magic, and
+version)
+
+Once verified, the other fields of the footer can be accessed.
+
+Empty tables
+++++++++++++
+
+A reftable may be empty. In this case, the file starts with a header
+and is immediately followed by a footer.
+
+Binary search
+^^^^^^^^^^^^^
+
+Binary search within a block is supported by the `restart_offset` fields
+at the end of the block. Readers can binary search through the restart
+table to locate between which two restart points the sought reference or
+key should appear.
+
+Each record identified by a `restart_offset` stores the complete key in
+the `suffix` field of the record, making the compare operation during
+binary search straightforward.
+
+Once a restart point lexicographically before the sought reference has
+been identified, readers can linearly scan through the following record
+entries to locate the sought record, terminating if the current record
+sorts after (and therefore the sought key is not present).
+
+Restart point selection
++++++++++++++++++++++++
+
+Writers determine the restart points at file creation. The process is
+arbitrary, but every 16 or 64 records is recommended. Every 16 may be
+more suitable for smaller block sizes (4k or 8k), every 64 for larger
+block sizes (64k).
+
+More frequent restart points reduces prefix compression and increases
+space consumed by the restart table, both of which increase file size.
+
+Less frequent restart points makes prefix compression more effective,
+decreasing overall file size, with increased penalties for readers
+walking through more records after the binary search step.
+
+A maximum of `65535` restart points per block is supported.
+
+Considerations
+~~~~~~~~~~~~~~
+
+Lightweight refs dominate
+^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The reftable format assumes the vast majority of references are single
+object names valued with common prefixes, such as Gerrit Code Review's
+`refs/changes/` namespace, GitHub's `refs/pulls/` namespace, or many
+lightweight tags in the `refs/tags/` namespace.
+
+Annotated tags storing the peeled object cost an additional object name per
+reference.
+
+Low overhead
+^^^^^^^^^^^^
+
+A reftable with very few references (e.g. git.git with 5 heads) is 269
+bytes for reftable, vs. 332 bytes for packed-refs. This supports
+reftable scaling down for transaction logs (below).
+
+Block size
+^^^^^^^^^^
+
+For a Gerrit Code Review type repository with many change refs, larger
+block sizes (64 KiB) and less frequent restart points (every 64) yield
+better compression due to more references within the block compressing
+against the prior reference.
+
+Larger block sizes reduce the index size, as the reftable will require
+fewer blocks to store the same number of references.
+
+Minimal disk seeks
+^^^^^^^^^^^^^^^^^^
+
+Assuming the index block has been loaded into memory, binary searching
+for any single reference requires exactly 1 disk seek to load the
+containing block.
+
+Scans and lookups dominate
+^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Scanning all references and lookup by name (or namespace such as
+`refs/heads/`) are the most common activities performed on repositories.
+Object names are stored directly with references to optimize this use case.
+
+Logs are infrequently read
+^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Logs are infrequently accessed, but can be large. Deflating log blocks
+saves disk space, with some increased penalty at read time.
+
+Logs are stored in an isolated section from refs, reducing the burden on
+reference readers that want to ignore logs. Further, historical logs can
+be isolated into log-only files.
+
+Logs are read backwards
+^^^^^^^^^^^^^^^^^^^^^^^
+
+Logs are frequently accessed backwards (most recent N records for master
+to answer `master@{4}`), so log records are grouped by reference, and
+sorted descending by update index.
+
+Repository format
+~~~~~~~~~~~~~~~~~
+
+Version 1
+^^^^^^^^^
+
+A repository must set its `$GIT_DIR/config` to configure reftable:
+
+....
+[core]
+ repositoryformatversion = 1
+[extensions]
+ refStorage = reftable
+....
+
+Layout
+^^^^^^
+
+A collection of reftable files are stored in the `$GIT_DIR/reftable/`
+directory:
+
+....
+00000001-00000001.log
+00000002-00000002.ref
+00000003-00000003.ref
+....
+
+where reftable files are named by a unique name such as produced by the
+function `${min_update_index}-${max_update_index}.ref`.
+
+Log-only files use the `.log` extension, while ref-only and mixed ref
+and log files use `.ref`. extension.
+
+The stack ordering file is `$GIT_DIR/reftable/tables.list` and lists the
+current files, one per line, in order, from oldest (base) to newest
+(most recent):
+
+....
+$ cat .git/reftable/tables.list
+00000001-00000001.log
+00000002-00000002.ref
+00000003-00000003.ref
+....
+
+Readers must read `$GIT_DIR/reftable/tables.list` to determine which
+files are relevant right now, and search through the stack in reverse
+order (last reftable is examined first).
+
+Reftable files not listed in `tables.list` may be new (and about to be
+added to the stack by the active writer), or ancient and ready to be
+pruned.
+
+Backward compatibility
+^^^^^^^^^^^^^^^^^^^^^^
+
+Older clients should continue to recognize the directory as a git
+repository so they don't look for an enclosing repository in parent
+directories. To this end, a reftable-enabled repository must contain the
+following dummy files
+
+* `.git/HEAD`, a regular file containing `ref: refs/heads/.invalid`.
+* `.git/refs/`, a directory
+* `.git/refs/heads`, a regular file
+
+Readers
+^^^^^^^
+
+Readers can obtain a consistent snapshot of the reference space by
+following:
+
+1. Open and read the `tables.list` file.
+2. Open each of the reftable files that it mentions.
+3. If any of the files is missing, goto 1.
+4. Read from the now-open files as long as necessary.
+
+Update transactions
+^^^^^^^^^^^^^^^^^^^
+
+Although reftables are immutable, mutations are supported by writing a
+new reftable and atomically appending it to the stack:
+
+1. Acquire `tables.list.lock`.
+2. Read `tables.list` to determine current reftables.
+3. Select `update_index` to be most recent file's
+`max_update_index + 1`.
+4. Prepare temp reftable `tmp_XXXXXX`, including log entries.
+5. Rename `tmp_XXXXXX` to `${update_index}-${update_index}.ref`.
+6. Copy `tables.list` to `tables.list.lock`, appending file from (5).
+7. Rename `tables.list.lock` to `tables.list`.
+
+During step 4 the new file's `min_update_index` and `max_update_index`
+are both set to the `update_index` selected by step 3. All log records
+for the transaction use the same `update_index` in their keys. This
+enables later correlation of which references were updated by the same
+transaction.
+
+Because a single `tables.list.lock` file is used to manage locking, the
+repository is single-threaded for writers. Writers may have to busy-spin
+(with backoff) around creating `tables.list.lock`, for up to an
+acceptable wait period, aborting if the repository is too busy to
+mutate. Application servers wrapped around repositories (e.g. Gerrit
+Code Review) can layer their own lock/wait queue to improve fairness to
+writers.
+
+Reference deletions
+^^^^^^^^^^^^^^^^^^^
+
+Deletion of any reference can be explicitly stored by setting the `type`
+to `0x0` and omitting the `value` field of the `ref_record`. This serves
+as a tombstone, overriding any assertions about the existence of the
+reference from earlier files in the stack.
+
+Compaction
+^^^^^^^^^^
+
+A partial stack of reftables can be compacted by merging references
+using a straightforward merge join across reftables, selecting the most
+recent value for output, and omitting deleted references that do not
+appear in remaining, lower reftables.
+
+A compacted reftable should set its `min_update_index` to the smallest
+of the input files' `min_update_index`, and its `max_update_index`
+likewise to the largest input `max_update_index`.
+
+For sake of illustration, assume the stack currently consists of
+reftable files (from oldest to newest): A, B, C, and D. The compactor is
+going to compact B and C, leaving A and D alone.
+
+1. Obtain lock `tables.list.lock` and read the `tables.list` file.
+2. Obtain locks `B.lock` and `C.lock`. Ownership of these locks
+prevents other processes from trying to compact these files.
+3. Release `tables.list.lock`.
+4. Compact `B` and `C` into a temp file
+`${min_update_index}-${max_update_index}_XXXXXX`.
+5. Reacquire lock `tables.list.lock`.
+6. Verify that `B` and `C` are still in the stack, in that order. This
+should always be the case, assuming that other processes are adhering to
+the locking protocol.
+7. Rename `${min_update_index}-${max_update_index}_XXXXXX` to
+`${min_update_index}-${max_update_index}.ref`.
+8. Write the new stack to `tables.list.lock`, replacing `B` and `C`
+with the file from (4).
+9. Rename `tables.list.lock` to `tables.list`.
+10. Delete `B` and `C`, perhaps after a short sleep to avoid forcing
+readers to backtrack.
+
+This strategy permits compactions to proceed independently of updates.
+
+Each reftable (compacted or not) is uniquely identified by its name, so
+open reftables can be cached by their name.
+
+Alternatives considered
+~~~~~~~~~~~~~~~~~~~~~~~
+
+bzip packed-refs
+^^^^^^^^^^^^^^^^
+
+`bzip2` can significantly shrink a large packed-refs file (e.g. 62 MiB
+compresses to 23 MiB, 37%). However the bzip format does not support
+random access to a single reference. Readers must inflate and discard
+while performing a linear scan.
+
+Breaking packed-refs into chunks (individually compressing each chunk)
+would reduce the amount of data a reader must inflate, but still leaves
+the problem of indexing chunks to support readers efficiently locating
+the correct chunk.
+
+Given the compression achieved by reftable's encoding, it does not seem
+necessary to add the complexity of bzip/gzip/zlib.
+
+Michael Haggerty's alternate format
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Michael Haggerty proposed
+link:https://lore.kernel.org/git/CAMy9T_HCnyc1g8XWOOWhe7nN0aEFyyBskV2aOMb_fe%2BwGvEJ7A%40mail.gmail.com/[an
+alternate] format to reftable on the Git mailing list. This format uses
+smaller chunks, without the restart table, and avoids block alignment
+with padding. Reflog entries immediately follow each ref, and are thus
+interleaved between refs.
+
+Performance testing indicates reftable is faster for lookups (51%
+faster, 11.2 usec vs. 5.4 usec), although reftable produces a slightly
+larger file (+ ~3.2%, 28.3M vs 29.2M):
+
+[cols=">,>,>,>",options="header",]
+|=====================================
+|format |size |seek cold |seek hot
+|mh-alt |28.3 M |23.4 usec |11.2 usec
+|reftable |29.2 M |19.9 usec |5.4 usec
+|=====================================
+
+JGit Ketch RefTree
+^^^^^^^^^^^^^^^^^^
+
+https://dev.eclipse.org/mhonarc/lists/jgit-dev/msg03073.html[JGit Ketch]
+proposed
+link:https://lore.kernel.org/git/CAJo%3DhJvnAPNAdDcAAwAvU9C4RVeQdoS3Ev9WTguHx4fD0V_nOg%40mail.gmail.com/[RefTree],
+an encoding of references inside Git tree objects stored as part of the
+repository's object database.
+
+The RefTree format adds additional load on the object database storage
+layer (more loose objects, more objects in packs), and relies heavily on
+the packer's delta compression to save space. Namespaces which are flat
+(e.g. thousands of tags in refs/tags) initially create very large loose
+objects, and so RefTree does not address the problem of copying many
+references to modify a handful.
+
+Flat namespaces are not efficiently searchable in RefTree, as tree
+objects in canonical formatting cannot be binary searched. This fails
+the need to handle a large number of references in a single namespace,
+such as GitHub's `refs/pulls`, or a project with many tags.
+
+LMDB
+^^^^
+
+David Turner proposed
+https://lore.kernel.org/git/1455772670-21142-26-git-send-email-dturner@twopensource.com/[using
+LMDB], as LMDB is lightweight (64k of runtime code) and GPL-compatible
+license.
+
+A downside of LMDB is its reliance on a single C implementation. This
+makes embedding inside JGit (a popular reimplementation of Git)
+difficult, and hoisting onto virtual storage (for JGit DFS) virtually
+impossible.
+
+A common format that can be supported by all major Git implementations
+(git-core, JGit, libgit2) is strongly preferred.
diff --git a/GIT-VERSION-GEN b/GIT-VERSION-GEN
index 21f929e..7b0cfeb 100755
--- a/GIT-VERSION-GEN
+++ b/GIT-VERSION-GEN
@@ -1,7 +1,7 @@
#!/bin/sh
GVF=GIT-VERSION-FILE
-DEF_VER=v2.26.GIT
+DEF_VER=v2.27.GIT
LF='
'
diff --git a/Makefile b/Makefile
index 3d3a39f..372139f 100644
--- a/Makefile
+++ b/Makefile
@@ -399,9 +399,6 @@ all::
# with a different indexfile format version. If it isn't set the index
# file format used is index-v[23].
#
-# Define GMTIME_UNRELIABLE_ERRORS if your gmtime() function does not
-# return NULL when it receives a bogus time_t.
-#
# Define HAVE_CLOCK_GETTIME if your platform has clock_gettime.
#
# Define HAVE_CLOCK_MONOTONIC if your platform has CLOCK_MONOTONIC.
@@ -1189,7 +1186,7 @@ PTHREAD_CFLAGS =
# For the 'sparse' target
SPARSE_FLAGS ?=
-SP_EXTRA_FLAGS =
+SP_EXTRA_FLAGS = -Wno-universal-initializer
# For the 'coccicheck' target; setting SPATCH_BATCH_SIZE higher will
# usually result in less CPU usage at the cost of higher peak memory.
@@ -1809,11 +1806,6 @@ ifndef NO_MSGFMT_EXTENDED_OPTIONS
MSGFMT += --check --statistics
endif
-ifdef GMTIME_UNRELIABLE_ERRORS
- COMPAT_OBJS += compat/gmtime.o
- BASIC_CFLAGS += -DGMTIME_UNRELIABLE_ERRORS
-endif
-
ifdef HAVE_CLOCK_GETTIME
BASIC_CFLAGS += -DHAVE_CLOCK_GETTIME
endif
diff --git a/RelNotes b/RelNotes
index f3d8527..a7b4f6d 120000
--- a/RelNotes
+++ b/RelNotes
@@ -1 +1 @@
-Documentation/RelNotes/2.27.0.txt \ No newline at end of file
+Documentation/RelNotes/2.28.0.txt \ No newline at end of file
diff --git a/add-patch.c b/add-patch.c
index d8bfe37..f899389 100644
--- a/add-patch.c
+++ b/add-patch.c
@@ -10,7 +10,7 @@
#include "prompt.h"
enum prompt_mode_type {
- PROMPT_MODE_CHANGE = 0, PROMPT_DELETION, PROMPT_HUNK,
+ PROMPT_MODE_CHANGE = 0, PROMPT_DELETION, PROMPT_ADDITION, PROMPT_HUNK,
PROMPT_MODE_MAX, /* must be last */
};
@@ -33,6 +33,7 @@ static struct patch_mode patch_mode_add = {
.prompt_mode = {
N_("Stage mode change [y,n,q,a,d%s,?]? "),
N_("Stage deletion [y,n,q,a,d%s,?]? "),
+ N_("Stage addition [y,n,q,a,d%s,?]? "),
N_("Stage this hunk [y,n,q,a,d%s,?]? ")
},
.edit_hunk_hint = N_("If the patch applies cleanly, the edited hunk "
@@ -54,6 +55,7 @@ static struct patch_mode patch_mode_stash = {
.prompt_mode = {
N_("Stash mode change [y,n,q,a,d%s,?]? "),
N_("Stash deletion [y,n,q,a,d%s,?]? "),
+ N_("Stash addition [y,n,q,a,d%s,?]? "),
N_("Stash this hunk [y,n,q,a,d%s,?]? "),
},
.edit_hunk_hint = N_("If the patch applies cleanly, the edited hunk "
@@ -77,6 +79,7 @@ static struct patch_mode patch_mode_reset_head = {
.prompt_mode = {
N_("Unstage mode change [y,n,q,a,d%s,?]? "),
N_("Unstage deletion [y,n,q,a,d%s,?]? "),
+ N_("Unstage addition [y,n,q,a,d%s,?]? "),
N_("Unstage this hunk [y,n,q,a,d%s,?]? "),
},
.edit_hunk_hint = N_("If the patch applies cleanly, the edited hunk "
@@ -99,6 +102,7 @@ static struct patch_mode patch_mode_reset_nothead = {
.prompt_mode = {
N_("Apply mode change to index [y,n,q,a,d%s,?]? "),
N_("Apply deletion to index [y,n,q,a,d%s,?]? "),
+ N_("Apply addition to index [y,n,q,a,d%s,?]? "),
N_("Apply this hunk to index [y,n,q,a,d%s,?]? "),
},
.edit_hunk_hint = N_("If the patch applies cleanly, the edited hunk "
@@ -121,6 +125,7 @@ static struct patch_mode patch_mode_checkout_index = {
.prompt_mode = {
N_("Discard mode change from worktree [y,n,q,a,d%s,?]? "),
N_("Discard deletion from worktree [y,n,q,a,d%s,?]? "),
+ N_("Discard addition from worktree [y,n,q,a,d%s,?]? "),
N_("Discard this hunk from worktree [y,n,q,a,d%s,?]? "),
},
.edit_hunk_hint = N_("If the patch applies cleanly, the edited hunk "
@@ -143,6 +148,7 @@ static struct patch_mode patch_mode_checkout_head = {
.prompt_mode = {
N_("Discard mode change from index and worktree [y,n,q,a,d%s,?]? "),
N_("Discard deletion from index and worktree [y,n,q,a,d%s,?]? "),
+ N_("Discard addition from index and worktree [y,n,q,a,d%s,?]? "),
N_("Discard this hunk from index and worktree [y,n,q,a,d%s,?]? "),
},
.edit_hunk_hint = N_("If the patch applies cleanly, the edited hunk "
@@ -164,6 +170,7 @@ static struct patch_mode patch_mode_checkout_nothead = {
.prompt_mode = {
N_("Apply mode change to index and worktree [y,n,q,a,d%s,?]? "),
N_("Apply deletion to index and worktree [y,n,q,a,d%s,?]? "),
+ N_("Apply addition to index and worktree [y,n,q,a,d%s,?]? "),
N_("Apply this hunk to index and worktree [y,n,q,a,d%s,?]? "),
},
.edit_hunk_hint = N_("If the patch applies cleanly, the edited hunk "
@@ -186,6 +193,7 @@ static struct patch_mode patch_mode_worktree_head = {
.prompt_mode = {
N_("Discard mode change from index and worktree [y,n,q,a,d%s,?]? "),
N_("Discard deletion from index and worktree [y,n,q,a,d%s,?]? "),
+ N_("Discard addition from index and worktree [y,n,q,a,d%s,?]? "),
N_("Discard this hunk from index and worktree [y,n,q,a,d%s,?]? "),
},
.edit_hunk_hint = N_("If the patch applies cleanly, the edited hunk "
@@ -207,6 +215,7 @@ static struct patch_mode patch_mode_worktree_nothead = {
.prompt_mode = {
N_("Apply mode change to index and worktree [y,n,q,a,d%s,?]? "),
N_("Apply deletion to index and worktree [y,n,q,a,d%s,?]? "),
+ N_("Apply addition to index and worktree [y,n,q,a,d%s,?]? "),
N_("Apply this hunk to index and worktree [y,n,q,a,d%s,?]? "),
},
.edit_hunk_hint = N_("If the patch applies cleanly, the edited hunk "
@@ -248,7 +257,7 @@ struct add_p_state {
struct hunk head;
struct hunk *hunk;
size_t hunk_nr, hunk_alloc;
- unsigned deleted:1, mode_change:1,binary:1;
+ unsigned deleted:1, added:1, mode_change:1,binary:1;
} *file_diff;
size_t file_diff_nr;
@@ -442,7 +451,7 @@ static int parse_diff(struct add_p_state *s, const struct pathspec *ps)
pend = p + plain->len;
while (p != pend) {
char *eol = memchr(p, '\n', pend - p);
- const char *deleted = NULL, *mode_change = NULL;
+ const char *deleted = NULL, *added = NULL, *mode_change = NULL;
if (!eol)
eol = pend;
@@ -461,11 +470,12 @@ static int parse_diff(struct add_p_state *s, const struct pathspec *ps)
} else if (p == plain->buf)
BUG("diff starts with unexpected line:\n"
"%.*s\n", (int)(eol - p), p);
- else if (file_diff->deleted)
+ else if (file_diff->deleted || file_diff->added)
; /* keep the rest of the file in a single "hunk" */
else if (starts_with(p, "@@ ") ||
(hunk == &file_diff->head &&
- skip_prefix(p, "deleted file", &deleted))) {
+ (skip_prefix(p, "deleted file", &deleted) ||
+ skip_prefix(p, "new file", &added)))) {
if (marker == '-' || marker == '+')
/*
* Should not happen; previous hunk did not end
@@ -485,6 +495,8 @@ static int parse_diff(struct add_p_state *s, const struct pathspec *ps)
if (deleted)
file_diff->deleted = 1;
+ else if (added)
+ file_diff->added = 1;
else if (parse_hunk_header(s, hunk) < 0)
return -1;
@@ -537,8 +549,10 @@ static int parse_diff(struct add_p_state *s, const struct pathspec *ps)
starts_with(p, "Binary files "))
file_diff->binary = 1;
- if (file_diff->deleted && file_diff->mode_change)
- BUG("diff contains delete *and* a mode change?!?\n%.*s",
+ if (!!file_diff->deleted + !!file_diff->added +
+ !!file_diff->mode_change > 1)
+ BUG("diff can only contain delete *or* add *or* a "
+ "mode change?!?\n%.*s",
(int)(eol - (plain->buf + file_diff->head.start)),
plain->buf + file_diff->head.start);
@@ -1397,6 +1411,8 @@ static int patch_update_file(struct add_p_state *s,
if (file_diff->deleted)
prompt_mode_type = PROMPT_DELETION;
+ else if (file_diff->added)
+ prompt_mode_type = PROMPT_ADDITION;
else if (file_diff->mode_change && !hunk_index)
prompt_mode_type = PROMPT_MODE_CHANGE;
else
diff --git a/bloom.c b/bloom.c
index dd9bab9..6c76118 100644
--- a/bloom.c
+++ b/bloom.c
@@ -9,7 +9,7 @@
define_commit_slab(bloom_filter_slab, struct bloom_filter);
-struct bloom_filter_slab bloom_filters;
+static struct bloom_filter_slab bloom_filters;
struct pathmap_hash_entry {
struct hashmap_entry entry;
@@ -29,8 +29,8 @@ static inline unsigned char get_bitmask(uint32_t pos)
}
static int load_bloom_filter_from_graph(struct commit_graph *g,
- struct bloom_filter *filter,
- struct commit *c)
+ struct bloom_filter *filter,
+ struct commit *c)
{
uint32_t lex_pos, start_index, end_index;
@@ -123,9 +123,9 @@ uint32_t murmur3_seeded(uint32_t seed, const char *data, size_t len)
}
void fill_bloom_key(const char *data,
- size_t len,
- struct bloom_key *key,
- const struct bloom_filter_settings *settings)
+ size_t len,
+ struct bloom_key *key,
+ const struct bloom_filter_settings *settings)
{
int i;
const uint32_t seed0 = 0x293ae76f;
@@ -138,9 +138,14 @@ void fill_bloom_key(const char *data,
key->hashes[i] = hash0 + i * hash1;
}
+void clear_bloom_key(struct bloom_key *key)
+{
+ FREE_AND_NULL(key->hashes);
+}
+
void add_key_to_filter(const struct bloom_key *key,
- struct bloom_filter *filter,
- const struct bloom_filter_settings *settings)
+ struct bloom_filter *filter,
+ const struct bloom_filter_settings *settings)
{
int i;
uint64_t mod = filter->len * BITS_PER_WORD;
@@ -158,9 +163,22 @@ void init_bloom_filters(void)
init_bloom_filter_slab(&bloom_filters);
}
+static int pathmap_cmp(const void *hashmap_cmp_fn_data,
+ const struct hashmap_entry *eptr,
+ const struct hashmap_entry *entry_or_key,
+ const void *keydata)
+{
+ const struct pathmap_hash_entry *e1, *e2;
+
+ e1 = container_of(eptr, const struct pathmap_hash_entry, entry);
+ e2 = container_of(entry_or_key, const struct pathmap_hash_entry, entry);
+
+ return strcmp(e1->path, e2->path);
+}
+
struct bloom_filter *get_bloom_filter(struct repository *r,
struct commit *c,
- int compute_if_not_present)
+ int compute_if_not_present)
{
struct bloom_filter *filter;
struct bloom_filter_settings settings = DEFAULT_BLOOM_FILTER_SETTINGS;
@@ -193,35 +211,42 @@ struct bloom_filter *get_bloom_filter(struct repository *r,
diffopt.max_changes = max_changes;
diff_setup_done(&diffopt);
+ /* ensure commit is parsed so we have parent information */
+ repo_parse_commit(r, c);
+
if (c->parents)
diff_tree_oid(&c->parents->item->object.oid, &c->object.oid, "", &diffopt);
else
diff_tree_oid(NULL, &c->object.oid, "", &diffopt);
diffcore_std(&diffopt);
- if (diff_queued_diff.nr <= max_changes) {
+ if (diffopt.num_changes <= max_changes) {
struct hashmap pathmap;
struct pathmap_hash_entry *e;
struct hashmap_iter iter;
- hashmap_init(&pathmap, NULL, NULL, 0);
+ hashmap_init(&pathmap, pathmap_cmp, NULL, 0);
for (i = 0; i < diff_queued_diff.nr; i++) {
const char *path = diff_queued_diff.queue[i]->two->path;
/*
- * Add each leading directory of the changed file, i.e. for
- * 'dir/subdir/file' add 'dir' and 'dir/subdir' as well, so
- * the Bloom filter could be used to speed up commands like
- * 'git log dir/subdir', too.
- *
- * Note that directories are added without the trailing '/'.
- */
+ * Add each leading directory of the changed file, i.e. for
+ * 'dir/subdir/file' add 'dir' and 'dir/subdir' as well, so
+ * the Bloom filter could be used to speed up commands like
+ * 'git log dir/subdir', too.
+ *
+ * Note that directories are added without the trailing '/'.
+ */
do {
char *last_slash = strrchr(path, '/');
FLEX_ALLOC_STR(e, path, path);
hashmap_entry_init(&e->entry, strhash(path));
- hashmap_add(&pathmap, &e->entry);
+
+ if (!hashmap_get(&pathmap, &e->entry, NULL))
+ hashmap_add(&pathmap, &e->entry);
+ else
+ free(e);
if (!last_slash)
last_slash = (char*)path;
@@ -273,4 +298,4 @@ int bloom_filter_contains(const struct bloom_filter *filter,
}
return 1;
-} \ No newline at end of file
+}
diff --git a/bloom.h b/bloom.h
index b935186..d8fbb0f 100644
--- a/bloom.h
+++ b/bloom.h
@@ -72,10 +72,11 @@ void fill_bloom_key(const char *data,
size_t len,
struct bloom_key *key,
const struct bloom_filter_settings *settings);
+void clear_bloom_key(struct bloom_key *key);
void add_key_to_filter(const struct bloom_key *key,
- struct bloom_filter *filter,
- const struct bloom_filter_settings *settings);
+ struct bloom_filter *filter,
+ const struct bloom_filter_settings *settings);
void init_bloom_filters(void);
@@ -87,4 +88,4 @@ int bloom_filter_contains(const struct bloom_filter *filter,
const struct bloom_key *key,
const struct bloom_filter_settings *settings);
-#endif \ No newline at end of file
+#endif
diff --git a/bugreport.c b/bugreport.c
index acacca8..09579e2 100644
--- a/bugreport.c
+++ b/bugreport.c
@@ -3,10 +3,13 @@
#include "strbuf.h"
#include "help.h"
#include "compat/compiler.h"
+#include "run-command.h"
+
static void get_system_info(struct strbuf *sys_info)
{
struct utsname uname_info;
+ char *shell = NULL;
/* get git version from native cmd */
strbuf_addstr(sys_info, _("git version:\n"));
@@ -27,8 +30,60 @@ static void get_system_info(struct strbuf *sys_info)
strbuf_addstr(sys_info, _("compiler info: "));
get_compiler_info(sys_info);
+
strbuf_addstr(sys_info, _("libc info: "));
get_libc_info(sys_info);
+
+ shell = getenv("SHELL");
+ strbuf_addf(sys_info, "$SHELL (typically, interactive shell): %s\n",
+ shell ? shell : "<unset>");
+}
+
+static void get_populated_hooks(struct strbuf *hook_info, int nongit)
+{
+ /*
+ * NEEDSWORK: Doesn't look like there is a list of all possible hooks;
+ * so below is a transcription of `git help hooks`. Later, this should
+ * be replaced with some programmatically generated list (generated from
+ * doc or else taken from some library which tells us about all the
+ * hooks)
+ */
+ static const char *hook[] = {
+ "applypatch-msg",
+ "pre-applypatch",
+ "post-applypatch",
+ "pre-commit",
+ "pre-merge-commit",
+ "prepare-commit-msg",
+ "commit-msg",
+ "post-commit",
+ "pre-rebase",
+ "post-checkout",
+ "post-merge",
+ "pre-push",
+ "pre-receive",
+ "update",
+ "post-receive",
+ "post-update",
+ "push-to-checkout",
+ "pre-auto-gc",
+ "post-rewrite",
+ "sendemail-validate",
+ "fsmonitor-watchman",
+ "p4-pre-submit",
+ "post-index-change",
+ };
+ int i;
+
+ if (nongit) {
+ strbuf_addstr(hook_info,
+ _("not run from a git repository - no hooks to show\n"));
+ return;
+ }
+
+ for (i = 0; i < ARRAY_SIZE(hook); i++)
+ if (find_hook(hook[i]))
+ strbuf_addf(hook_info, "%s\n", hook[i]);
}
static const char * const bugreport_usage[] = {
@@ -114,6 +169,9 @@ int cmd_main(int argc, const char **argv)
get_header(&buffer, _("System Info"));
get_system_info(&buffer);
+ get_header(&buffer, _("Enabled Hooks"));
+ get_populated_hooks(&buffer, nongit_ok);
+
/* fopen doesn't offer us an O_EXCL alternative, except with glibc. */
report = open(report_path.buf, O_CREAT | O_EXCL | O_WRONLY, 0666);
@@ -122,7 +180,9 @@ int cmd_main(int argc, const char **argv)
die(_("couldn't create a new file at '%s'"), report_path.buf);
}
- strbuf_write_fd(&buffer, report);
+ if (write_in_full(report, buffer.buf, buffer.len) < 0)
+ die_errno(_("unable to write to %s"), report_path.buf);
+
close(report);
/*
diff --git a/builtin/am.c b/builtin/am.c
index e3dfd93..69e50de 100644
--- a/builtin/am.c
+++ b/builtin/am.c
@@ -1691,7 +1691,6 @@ static int do_interactive(struct am_state *state)
*/
static void am_run(struct am_state *state, int resume)
{
- const char *argv_gc_auto[] = {"gc", "--auto", NULL};
struct strbuf sb = STRBUF_INIT;
unlink(am_path(state, "dirtyindex"));
@@ -1796,7 +1795,7 @@ next:
if (!state->rebasing) {
am_destroy(state);
close_object_store(the_repository->objects);
- run_command_v_opt(argv_gc_auto, RUN_GIT_CMD);
+ run_auto_gc(state->quiet);
}
}
diff --git a/builtin/bisect--helper.c b/builtin/bisect--helper.c
index c1c40b5..ec49962 100644
--- a/builtin/bisect--helper.c
+++ b/builtin/bisect--helper.c
@@ -455,9 +455,12 @@ static int bisect_start(struct bisect_terms *terms, int no_checkout,
no_checkout = 1;
} else if (!strcmp(arg, "--term-good") ||
!strcmp(arg, "--term-old")) {
+ i++;
+ if (argc <= i)
+ return error(_("'' is not a valid term"));
must_write_terms = 1;
free((void *) terms->term_good);
- terms->term_good = xstrdup(argv[++i]);
+ terms->term_good = xstrdup(argv[i]);
} else if (skip_prefix(arg, "--term-good=", &arg) ||
skip_prefix(arg, "--term-old=", &arg)) {
must_write_terms = 1;
@@ -465,16 +468,18 @@ static int bisect_start(struct bisect_terms *terms, int no_checkout,
terms->term_good = xstrdup(arg);
} else if (!strcmp(arg, "--term-bad") ||
!strcmp(arg, "--term-new")) {
+ i++;
+ if (argc <= i)
+ return error(_("'' is not a valid term"));
must_write_terms = 1;
free((void *) terms->term_bad);
- terms->term_bad = xstrdup(argv[++i]);
+ terms->term_bad = xstrdup(argv[i]);
} else if (skip_prefix(arg, "--term-bad=", &arg) ||
skip_prefix(arg, "--term-new=", &arg)) {
must_write_terms = 1;
free((void *) terms->term_bad);
terms->term_bad = xstrdup(arg);
- } else if (starts_with(arg, "--") &&
- !one_of(arg, "--term-good", "--term-bad", NULL)) {
+ } else if (starts_with(arg, "--")) {
return error(_("unrecognized option: '%s'"), arg);
} else {
char *commit_id = xstrfmt("%s^{commit}", arg);
diff --git a/builtin/branch.c b/builtin/branch.c
index accb61b..99633ad 100644
--- a/builtin/branch.c
+++ b/builtin/branch.c
@@ -693,7 +693,7 @@ int cmd_branch(int argc, const char **argv, const char *prefix)
list = 1;
if (!!delete + !!rename + !!copy + !!new_upstream + !!show_current +
- list + unset_upstream > 1)
+ list + edit_description + unset_upstream > 1)
usage_with_options(builtin_branch_usage, options);
if (filter.abbrev == -1)
diff --git a/builtin/checkout.c b/builtin/checkout.c
index e9d111b..af849c6 100644
--- a/builtin/checkout.c
+++ b/builtin/checkout.c
@@ -621,9 +621,7 @@ static int reset_tree(struct tree *tree, const struct checkout_opts *o,
opts.src_index = &the_index;
opts.dst_index = &the_index;
init_checkout_metadata(&opts.meta, info->refname,
- info->commit ? &info->commit->object.oid :
- is_null_oid(&info->oid) ? &tree->object.oid :
- &info->oid,
+ info->commit ? &info->commit->object.oid : &null_oid,
NULL);
parse_tree(tree);
init_tree_desc(&tree_desc, tree->buffer, tree->size);
@@ -1689,7 +1687,7 @@ static int checkout_main(int argc, const char **argv, const char *prefix,
* Try to give more helpful suggestion.
* new_branch && argc > 1 will be caught later.
*/
- if (opts->new_branch && argc == 1)
+ if (opts->new_branch && argc == 1 && !new_branch_info.commit)
die(_("'%s' is not a commit and a branch '%s' cannot be created from it"),
argv[0], opts->new_branch);
diff --git a/builtin/clean.c b/builtin/clean.c
index 4ca12bc..5a9c29a 100644
--- a/builtin/clean.c
+++ b/builtin/clean.c
@@ -924,12 +924,6 @@ int cmd_clean(int argc, const char **argv, const char *prefix)
0);
memset(&dir, 0, sizeof(dir));
- if (ignored_only)
- dir.flags |= DIR_SHOW_IGNORED;
-
- if (ignored && ignored_only)
- die(_("-x and -X cannot be used together"));
-
if (!interactive && !dry_run && !force) {
if (config_set)
die(_("clean.requireForce set to true and neither -i, -n, nor -f given; "
@@ -946,6 +940,13 @@ int cmd_clean(int argc, const char **argv, const char *prefix)
dir.flags |= DIR_SHOW_OTHER_DIRECTORIES;
+ if (ignored && ignored_only)
+ die(_("-x and -X cannot be used together"));
+ if (!ignored)
+ setup_standard_excludes(&dir);
+ if (ignored_only)
+ dir.flags |= DIR_SHOW_IGNORED;
+
if (argc) {
/*
* Remaining args implies pathspecs specified, and we should
@@ -954,15 +955,41 @@ int cmd_clean(int argc, const char **argv, const char *prefix)
remove_directories = 1;
}
- if (remove_directories)
- dir.flags |= DIR_SHOW_IGNORED_TOO | DIR_KEEP_UNTRACKED_CONTENTS;
+ if (remove_directories && !ignored_only) {
+ /*
+ * We need to know about ignored files too:
+ *
+ * If (ignored), then we will delete ignored files as well.
+ *
+ * If (!ignored), then even though we not are doing
+ * anything with ignored files, we need to know about them
+ * so that we can avoid deleting a directory of untracked
+ * files that also contains an ignored file within it.
+ *
+ * For the (!ignored) case, since we only need to avoid
+ * deleting ignored files, we can set
+ * DIR_SHOW_IGNORED_TOO_MODE_MATCHING in order to avoid
+ * recursing into a directory which is itself ignored.
+ */
+ dir.flags |= DIR_SHOW_IGNORED_TOO;
+ if (!ignored)
+ dir.flags |= DIR_SHOW_IGNORED_TOO_MODE_MATCHING;
+
+ /*
+ * Let the fill_directory() machinery know that we aren't
+ * just recursing to collect the ignored files; we want all
+ * the untracked ones so that we can delete them. (Note:
+ * we could also set DIR_KEEP_UNTRACKED_CONTENTS when
+ * ignored_only is true, since DIR_KEEP_UNTRACKED_CONTENTS
+ * only has effect in combination with DIR_SHOW_IGNORED_TOO. It makes
+ * the code clearer to exclude it, though.
+ */
+ dir.flags |= DIR_KEEP_UNTRACKED_CONTENTS;
+ }
if (read_cache() < 0)
die(_("index file corrupt"));
- if (!ignored)
- setup_standard_excludes(&dir);
-
pl = add_pattern_list(&dir, EXC_CMDL, "--exclude option");
for (i = 0; i < exclude_list.nr; i++)
add_pattern(exclude_list.items[i].string, "", 0, pl, -(i+1));
diff --git a/builtin/clone.c b/builtin/clone.c
index f27d38b..e3519a8 100644
--- a/builtin/clone.c
+++ b/builtin/clone.c
@@ -945,7 +945,7 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
{
int is_bundle = 0, is_local;
const char *repo_name, *repo, *work_tree, *git_dir;
- char *path, *dir;
+ char *path, *dir, *display_repo = NULL;
int dest_exists;
const struct ref *refs, *remote_head;
const struct ref *remote_head_points_at;
@@ -1000,10 +1000,11 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
path = get_repo_path(repo_name, &is_bundle);
if (path)
repo = absolute_pathdup(repo_name);
- else if (!strchr(repo_name, ':'))
- die(_("repository '%s' does not exist"), repo_name);
- else
+ else if (strchr(repo_name, ':')) {
repo = repo_name;
+ display_repo = transport_anonymize_url(repo);
+ } else
+ die(_("repository '%s' does not exist"), repo_name);
/* no need to be strict, transport_set_option() will validate it again */
if (option_depth && atoi(option_depth) < 1)
@@ -1020,7 +1021,9 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
die(_("destination path '%s' already exists and is not "
"an empty directory."), dir);
- strbuf_addf(&reflog_msg, "clone: from %s", repo);
+ strbuf_addf(&reflog_msg, "clone: from %s",
+ display_repo ? display_repo : repo);
+ free(display_repo);
if (option_bare)
work_tree = NULL;
diff --git a/builtin/commit-graph.c b/builtin/commit-graph.c
index 15fe603..75455da 100644
--- a/builtin/commit-graph.c
+++ b/builtin/commit-graph.c
@@ -6,6 +6,8 @@
#include "repository.h"
#include "commit-graph.h"
#include "object-store.h"
+#include "progress.h"
+#include "tag.h"
static char const * const builtin_commit_graph_usage[] = {
N_("git commit-graph verify [--object-dir <objdir>] [--shallow] [--[no-]progress]"),
@@ -138,14 +140,37 @@ static int write_option_parse_split(const struct option *opt, const char *arg,
return 0;
}
+static int read_one_commit(struct oidset *commits, struct progress *progress,
+ const char *hash)
+{
+ struct object *result;
+ struct object_id oid;
+ const char *end;
+
+ if (parse_oid_hex(hash, &oid, &end))
+ return error(_("unexpected non-hex object ID: %s"), hash);
+
+ result = deref_tag(the_repository, parse_object(the_repository, &oid),
+ NULL, 0);
+ if (!result)
+ return error(_("invalid object: %s"), hash);
+ else if (object_as_type(the_repository, result, OBJ_COMMIT, 1))
+ oidset_insert(commits, &result->oid);
+
+ display_progress(progress, oidset_size(commits));
+
+ return 0;
+}
+
static int graph_write(int argc, const char **argv)
{
- struct string_list *pack_indexes = NULL;
+ struct string_list pack_indexes = STRING_LIST_INIT_NODUP;
+ struct strbuf buf = STRBUF_INIT;
struct oidset commits = OIDSET_INIT;
struct object_directory *odb = NULL;
- struct string_list lines;
int result = 0;
enum commit_graph_write_flags flags = 0;
+ struct progress *progress = NULL;
static struct option builtin_commit_graph_write_options[] = {
OPT_STRING(0, "object-dir", &opts.obj_dir,
@@ -209,44 +234,38 @@ static int graph_write(int argc, const char **argv)
return 0;
}
- string_list_init(&lines, 0);
- if (opts.stdin_packs || opts.stdin_commits) {
- struct strbuf buf = STRBUF_INIT;
-
+ if (opts.stdin_packs) {
while (strbuf_getline(&buf, stdin) != EOF)
- string_list_append(&lines, strbuf_detach(&buf, NULL));
-
- if (opts.stdin_packs)
- pack_indexes = &lines;
- if (opts.stdin_commits) {
- struct string_list_item *item;
- oidset_init(&commits, lines.nr);
- for_each_string_list_item(item, &lines) {
- struct object_id oid;
- const char *end;
-
- if (parse_oid_hex(item->string, &oid, &end)) {
- error(_("unexpected non-hex object ID: "
- "%s"), item->string);
- return 1;
- }
-
- oidset_insert(&commits, &oid);
+ string_list_append(&pack_indexes,
+ strbuf_detach(&buf, NULL));
+ } else if (opts.stdin_commits) {
+ oidset_init(&commits, 0);
+ if (opts.progress)
+ progress = start_delayed_progress(
+ _("Collecting commits from input"), 0);
+
+ while (strbuf_getline(&buf, stdin) != EOF) {
+ if (read_one_commit(&commits, progress, buf.buf)) {
+ result = 1;
+ goto cleanup;
}
- flags |= COMMIT_GRAPH_WRITE_CHECK_OIDS;
}
- UNLEAK(buf);
+
}
if (write_commit_graph(odb,
- pack_indexes,
+ opts.stdin_packs ? &pack_indexes : NULL,
opts.stdin_commits ? &commits : NULL,
flags,
&split_opts))
result = 1;
- UNLEAK(lines);
+cleanup:
+ string_list_clear(&pack_indexes, 0);
+ strbuf_release(&buf);
+ if (progress)
+ stop_progress(&progress);
return result;
}
diff --git a/builtin/commit.c b/builtin/commit.c
index a73de0a..d1b7396 100644
--- a/builtin/commit.c
+++ b/builtin/commit.c
@@ -1494,7 +1494,6 @@ static int git_commit_config(const char *k, const char *v, void *cb)
int cmd_commit(int argc, const char **argv, const char *prefix)
{
- const char *argv_gc_auto[] = {"gc", "--auto", NULL};
static struct wt_status s;
static struct option builtin_commit_options[] = {
OPT__QUIET(&quiet, N_("suppress summary after successful commit")),
@@ -1703,7 +1702,7 @@ int cmd_commit(int argc, const char **argv, const char *prefix)
git_test_write_commit_graph_or_die();
repo_rerere(the_repository, 0);
- run_command_v_opt(argv_gc_auto, RUN_GIT_CMD);
+ run_auto_gc(quiet);
run_commit_hook(use_editor, get_index_file(), "post-commit", NULL);
if (amend && !no_post_rewrite) {
commit_post_rewrite(the_repository, current_head, &oid);
diff --git a/builtin/diff-files.c b/builtin/diff-files.c
index 86ae474..1e352dd 100644
--- a/builtin/diff-files.c
+++ b/builtin/diff-files.c
@@ -28,6 +28,13 @@ int cmd_diff_files(int argc, const char **argv, const char *prefix)
git_config(git_diff_basic_config, NULL); /* no "diff" UI options */
repo_init_revisions(the_repository, &rev, prefix);
rev.abbrev = 0;
+
+ /*
+ * Consider "intent-to-add" files as new by default, unless
+ * explicitly specified in the command line or anywhere else.
+ */
+ rev.diffopt.ita_invisible_in_index = 1;
+
precompose_argv(argc, argv);
argc = setup_revisions(argc, argv, &rev, NULL);
diff --git a/builtin/diff.c b/builtin/diff.c
index 8537b17..8c36da0 100644
--- a/builtin/diff.c
+++ b/builtin/diff.c
@@ -6,6 +6,7 @@
#define USE_THE_INDEX_COMPATIBILITY_MACROS
#include "cache.h"
#include "config.h"
+#include "ewah/ewok.h"
#include "lockfile.h"
#include "color.h"
#include "commit.h"
@@ -23,7 +24,13 @@
#define DIFF_NO_INDEX_IMPLICIT 2
static const char builtin_diff_usage[] =
-"git diff [<options>] [<commit> [<commit>]] [--] [<path>...]";
+"git diff [<options>] [<commit>] [--] [<path>...]\n"
+" or: git diff [<options>] --cached [<commit>] [--] [<path>...]\n"
+" or: git diff [<options>] <commit> [<commit>...] <commit> [--] [<path>...]\n"
+" or: git diff [<options>] <commit>...<commit>] [--] [<path>...]\n"
+" or: git diff [<options>] <blob> <blob>]\n"
+" or: git diff [<options>] --no-index [--] <path> <path>]\n"
+COMMON_DIFF_OPTIONS_HELP;
static const char *blob_path(struct object_array_entry *entry)
{
@@ -254,6 +261,108 @@ static int builtin_diff_files(struct rev_info *revs, int argc, const char **argv
return run_diff_files(revs, options);
}
+struct symdiff {
+ struct bitmap *skip;
+ int warn;
+ const char *base, *left, *right;
+};
+
+/*
+ * Check for symmetric-difference arguments, and if present, arrange
+ * everything we need to know to handle them correctly. As a bonus,
+ * weed out all bogus range-based revision specifications, e.g.,
+ * "git diff A..B C..D" or "git diff A..B C" get rejected.
+ *
+ * For an actual symmetric diff, *symdiff is set this way:
+ *
+ * - its skip is non-NULL and marks *all* rev->pending.objects[i]
+ * indices that the caller should ignore (extra merge bases, of
+ * which there might be many, and A in A...B). Note that the
+ * chosen merge base and right side are NOT marked.
+ * - warn is set if there are multiple merge bases.
+ * - base, left, and right point to the names to use in a
+ * warning about multiple merge bases.
+ *
+ * If there is no symmetric diff argument, sym->skip is NULL and
+ * sym->warn is cleared. The remaining fields are not set.
+ */
+static void symdiff_prepare(struct rev_info *rev, struct symdiff *sym)
+{
+ int i, is_symdiff = 0, basecount = 0, othercount = 0;
+ int lpos = -1, rpos = -1, basepos = -1;
+ struct bitmap *map = NULL;
+
+ /*
+ * Use the whence fields to find merge bases and left and
+ * right parts of symmetric difference, so that we do not
+ * depend on the order that revisions are parsed. If there
+ * are any revs that aren't from these sources, we have a
+ * "git diff C A...B" or "git diff A...B C" case. Or we
+ * could even get "git diff A...B C...E", for instance.
+ *
+ * If we don't have just one merge base, we pick one
+ * at random.
+ *
+ * NB: REV_CMD_LEFT, REV_CMD_RIGHT are also used for A..B,
+ * so we must check for SYMMETRIC_LEFT too. The two arrays
+ * rev->pending.objects and rev->cmdline.rev are parallel.
+ */
+ for (i = 0; i < rev->cmdline.nr; i++) {
+ struct object *obj = rev->pending.objects[i].item;
+ switch (rev->cmdline.rev[i].whence) {
+ case REV_CMD_MERGE_BASE:
+ if (basepos < 0)
+ basepos = i;
+ basecount++;
+ break; /* do mark all bases */
+ case REV_CMD_LEFT:
+ if (lpos >= 0)
+ usage(builtin_diff_usage);
+ lpos = i;
+ if (obj->flags & SYMMETRIC_LEFT) {
+ is_symdiff = 1;
+ break; /* do mark A */
+ }
+ continue;
+ case REV_CMD_RIGHT:
+ if (rpos >= 0)
+ usage(builtin_diff_usage);
+ rpos = i;
+ continue; /* don't mark B */
+ case REV_CMD_PARENTS_ONLY:
+ case REV_CMD_REF:
+ case REV_CMD_REV:
+ othercount++;
+ continue;
+ }
+ if (map == NULL)
+ map = bitmap_new();
+ bitmap_set(map, i);
+ }
+
+ /*
+ * Forbid any additional revs for both A...B and A..B.
+ */
+ if (lpos >= 0 && othercount > 0)
+ usage(builtin_diff_usage);
+
+ if (!is_symdiff) {
+ bitmap_free(map);
+ sym->warn = 0;
+ sym->skip = NULL;
+ return;
+ }
+
+ sym->left = rev->pending.objects[lpos].name;
+ sym->right = rev->pending.objects[rpos].name;
+ sym->base = rev->pending.objects[basepos].name;
+ if (basecount == 0)
+ die(_("%s...%s: no merge base"), sym->left, sym->right);
+ bitmap_unset(map, basepos); /* unmark the base we want */
+ sym->warn = basecount > 1;
+ sym->skip = map;
+}
+
int cmd_diff(int argc, const char **argv, const char *prefix)
{
int i;
@@ -263,19 +372,29 @@ int cmd_diff(int argc, const char **argv, const char *prefix)
struct object_array_entry *blob[2];
int nongit = 0, no_index = 0;
int result = 0;
+ struct symdiff sdiff;
/*
* We could get N tree-ish in the rev.pending_objects list.
- * Also there could be M blobs there, and P pathspecs.
+ * Also there could be M blobs there, and P pathspecs. --cached may
+ * also be present.
*
* N=0, M=0:
- * cache vs files (diff-files)
+ * cache vs files (diff-files)
+ *
+ * N=0, M=0, --cached:
+ * HEAD vs cache (diff-index --cached)
+ *
* N=0, M=2:
* compare two random blobs. P must be zero.
+ *
* N=0, M=1, P=1:
- * compare a blob with a working tree file.
+ * compare a blob with a working tree file.
*
* N=1, M=0:
+ * tree vs files (diff-index)
+ *
+ * N=1, M=0, --cached:
* tree vs cache (diff-index --cached)
*
* N=2, M=0:
@@ -382,6 +501,7 @@ int cmd_diff(int argc, const char **argv, const char *prefix)
}
}
+ symdiff_prepare(&rev, &sdiff);
for (i = 0; i < rev.pending.nr; i++) {
struct object_array_entry *entry = &rev.pending.objects[i];
struct object *obj = entry->item;
@@ -396,6 +516,8 @@ int cmd_diff(int argc, const char **argv, const char *prefix)
obj = &get_commit_tree(((struct commit *)obj))->object;
if (obj->type == OBJ_TREE) {
+ if (sdiff.skip && bitmap_get(sdiff.skip, i))
+ continue;
obj->flags |= flags;
add_object_array(obj, name, &ent);
} else if (obj->type == OBJ_BLOB) {
@@ -437,21 +559,12 @@ int cmd_diff(int argc, const char **argv, const char *prefix)
usage(builtin_diff_usage);
else if (ent.nr == 1)
result = builtin_diff_index(&rev, argc, argv);
- else if (ent.nr == 2)
+ else if (ent.nr == 2) {
+ if (sdiff.warn)
+ warning(_("%s...%s: multiple merge bases, using %s"),
+ sdiff.left, sdiff.right, sdiff.base);
result = builtin_diff_tree(&rev, argc, argv,
&ent.objects[0], &ent.objects[1]);
- else if (ent.objects[0].item->flags & UNINTERESTING) {
- /*
- * diff A...B where there is at least one merge base
- * between A and B. We have ent.objects[0] ==
- * merge-base, ent.objects[ents-2] == A, and
- * ent.objects[ents-1] == B. Show diff between the
- * base and B. Note that we pick one merge base at
- * random if there are more than one.
- */
- result = builtin_diff_tree(&rev, argc, argv,
- &ent.objects[0],
- &ent.objects[ent.nr-1]);
} else
result = builtin_diff_combined(&rev, argc, argv,
ent.objects, ent.nr);
diff --git a/builtin/fetch-pack.c b/builtin/fetch-pack.c
index 4771100..bbb5c96 100644
--- a/builtin/fetch-pack.c
+++ b/builtin/fetch-pack.c
@@ -48,8 +48,8 @@ int cmd_fetch_pack(int argc, const char **argv, const char *prefix)
struct ref **sought = NULL;
int nr_sought = 0, alloc_sought = 0;
int fd[2];
- char *pack_lockfile = NULL;
- char **pack_lockfile_ptr = NULL;
+ struct string_list pack_lockfiles = STRING_LIST_INIT_DUP;
+ struct string_list *pack_lockfiles_ptr = NULL;
struct child_process *conn;
struct fetch_pack_args args;
struct oid_array shallow = OID_ARRAY_INIT;
@@ -134,7 +134,7 @@ int cmd_fetch_pack(int argc, const char **argv, const char *prefix)
}
if (!strcmp("--lock-pack", arg)) {
args.lock_pack = 1;
- pack_lockfile_ptr = &pack_lockfile;
+ pack_lockfiles_ptr = &pack_lockfiles;
continue;
}
if (!strcmp("--check-self-contained-and-connected", arg)) {
@@ -224,7 +224,7 @@ int cmd_fetch_pack(int argc, const char **argv, const char *prefix)
version = discover_version(&reader);
switch (version) {
case protocol_v2:
- get_remote_refs(fd[1], &reader, &ref, 0, NULL, NULL);
+ get_remote_refs(fd[1], &reader, &ref, 0, NULL, NULL, args.stateless_rpc);
break;
case protocol_v1:
case protocol_v0:
@@ -235,10 +235,15 @@ int cmd_fetch_pack(int argc, const char **argv, const char *prefix)
}
ref = fetch_pack(&args, fd, ref, sought, nr_sought,
- &shallow, pack_lockfile_ptr, version);
- if (pack_lockfile) {
- printf("lock %s\n", pack_lockfile);
+ &shallow, pack_lockfiles_ptr, version);
+ if (pack_lockfiles.nr) {
+ int i;
+
+ printf("lock %s\n", pack_lockfiles.items[0].string);
fflush(stdout);
+ for (i = 1; i < pack_lockfiles.nr; i++)
+ warning(_("Lockfile created but not reported: %s"),
+ pack_lockfiles.items[i].string);
}
if (args.check_self_contained_and_connected &&
args.self_contained_and_connected) {
diff --git a/builtin/fetch.c b/builtin/fetch.c
index 3ae52c0..82ac4be 100644
--- a/builtin/fetch.c
+++ b/builtin/fetch.c
@@ -27,6 +27,7 @@
#include "branch.h"
#include "promisor-remote.h"
#include "commit-graph.h"
+#include "shallow.h"
#define FORCED_UPDATES_DELAY_WARNING_IN_MS (10 * 1000)
@@ -1752,14 +1753,18 @@ int cmd_fetch(int argc, const char **argv, const char *prefix)
struct remote *remote = NULL;
int result = 0;
int prune_tags_ok = 1;
- struct argv_array argv_gc_auto = ARGV_ARRAY_INIT;
packet_trace_identity("fetch");
/* Record the command line for the reflog */
strbuf_addstr(&default_rla, "fetch");
- for (i = 1; i < argc; i++)
- strbuf_addf(&default_rla, " %s", argv[i]);
+ for (i = 1; i < argc; i++) {
+ /* This handles non-URLs gracefully */
+ char *anon = transport_anonymize_url(argv[i]);
+
+ strbuf_addf(&default_rla, " %s", anon);
+ free(anon);
+ }
fetch_config_from_gitmodules(&submodule_fetch_jobs_config,
&recurse_submodules);
@@ -1790,9 +1795,6 @@ int cmd_fetch(int argc, const char **argv, const char *prefix)
if (depth || deepen_since || deepen_not.nr)
deepen = 1;
- if (filter_options.choice && !has_promisor_remote())
- die("--filter can only be used when extensions.partialClone is set");
-
if (all) {
if (argc == 1)
die(_("fetch --all does not take a repository argument"));
@@ -1879,13 +1881,8 @@ int cmd_fetch(int argc, const char **argv, const char *prefix)
close_object_store(the_repository->objects);
- if (enable_auto_gc) {
- argv_array_pushl(&argv_gc_auto, "gc", "--auto", NULL);
- if (verbosity < 0)
- argv_array_push(&argv_gc_auto, "--quiet");
- run_command_v_opt(argv_gc_auto.argv, RUN_GIT_CMD);
- argv_array_clear(&argv_gc_auto);
- }
+ if (enable_auto_gc)
+ run_auto_gc(verbosity < 0);
return result;
}
diff --git a/builtin/fsck.c b/builtin/fsck.c
index 8d13794..f02cbdb 100644
--- a/builtin/fsck.c
+++ b/builtin/fsck.c
@@ -49,6 +49,7 @@ static int name_objects;
#define ERROR_PACK 04
#define ERROR_REFS 010
#define ERROR_COMMIT_GRAPH 020
+#define ERROR_MULTI_PACK_INDEX 040
static const char *describe_object(const struct object_id *oid)
{
@@ -952,7 +953,7 @@ int cmd_fsck(int argc, const char **argv, const char *prefix)
midx_argv[2] = "--object-dir";
midx_argv[3] = odb->path;
if (run_command(&midx_verify))
- errors_found |= ERROR_COMMIT_GRAPH;
+ errors_found |= ERROR_MULTI_PACK_INDEX;
}
}
diff --git a/builtin/merge.c b/builtin/merge.c
index 923e32a..7da707b 100644
--- a/builtin/merge.c
+++ b/builtin/merge.c
@@ -450,7 +450,6 @@ static void finish(struct commit *head_commit,
if (verbosity >= 0 && !merge_msg.len)
printf(_("No merge message -- not updating HEAD\n"));
else {
- const char *argv_gc_auto[] = { "gc", "--auto", NULL };
update_ref(reflog_message.buf, "HEAD", new_head, head,
0, UPDATE_REFS_DIE_ON_ERR);
/*
@@ -458,7 +457,7 @@ static void finish(struct commit *head_commit,
* user should see them.
*/
close_object_store(the_repository->objects);
- run_command_v_opt(argv_gc_auto, RUN_GIT_CMD);
+ run_auto_gc(verbosity < 0);
}
}
if (new_head && show_diffstat) {
@@ -1657,7 +1656,7 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
}
merge_was_ok = 1;
}
- cnt = evaluate_result();
+ cnt = (use_strategies_nr > 1) ? evaluate_result() : 0;
if (best_cnt <= 0 || cnt <= best_cnt) {
best_strategy = use_strategies[i]->name;
best_cnt = cnt;
diff --git a/builtin/pack-objects.c b/builtin/pack-objects.c
index 03b85f5..7016b28 100644
--- a/builtin/pack-objects.c
+++ b/builtin/pack-objects.c
@@ -34,6 +34,7 @@
#include "dir.h"
#include "midx.h"
#include "trace2.h"
+#include "shallow.h"
#define IN_PACK(obj) oe_in_pack(&to_pack, obj)
#define SIZE(obj) oe_size(&to_pack, obj)
@@ -116,6 +117,8 @@ static unsigned long window_memory_limit = 0;
static struct list_objects_filter_options filter_options;
+static struct string_list uri_protocols = STRING_LIST_INIT_NODUP;
+
enum missing_action {
MA_ERROR = 0, /* fail if any missing objects are encountered */
MA_ALLOW_ANY, /* silently allow ALL missing objects */
@@ -124,6 +127,15 @@ enum missing_action {
static enum missing_action arg_missing_action;
static show_object_fn fn_show_object;
+struct configured_exclusion {
+ struct oidmap_entry e;
+ char *pack_hash_hex;
+ char *uri;
+};
+static struct oidmap configured_exclusions;
+
+static struct oidset excluded_by_config;
+
/*
* stats
*/
@@ -968,6 +980,25 @@ static void write_reused_pack(struct hashfile *f)
unuse_pack(&w_curs);
}
+static void write_excluded_by_configs(void)
+{
+ struct oidset_iter iter;
+ const struct object_id *oid;
+
+ oidset_iter_init(&excluded_by_config, &iter);
+ while ((oid = oidset_iter_next(&iter))) {
+ struct configured_exclusion *ex =
+ oidmap_get(&configured_exclusions, oid);
+
+ if (!ex)
+ BUG("configured exclusion wasn't configured");
+ write_in_full(1, ex->pack_hash_hex, strlen(ex->pack_hash_hex));
+ write_in_full(1, " ", 1);
+ write_in_full(1, ex->uri, strlen(ex->uri));
+ write_in_full(1, "\n", 1);
+ }
+}
+
static const char no_split_warning[] = N_(
"disabling bitmap writing, packs are split due to pack.packSizeLimit"
);
@@ -1265,6 +1296,25 @@ static int want_object_in_pack(const struct object_id *oid,
}
}
+ if (uri_protocols.nr) {
+ struct configured_exclusion *ex =
+ oidmap_get(&configured_exclusions, oid);
+ int i;
+ const char *p;
+
+ if (ex) {
+ for (i = 0; i < uri_protocols.nr; i++) {
+ if (skip_prefix(ex->uri,
+ uri_protocols.items[i].string,
+ &p) &&
+ *p == ':') {
+ oidset_insert(&excluded_by_config, oid);
+ return 0;
+ }
+ }
+ }
+ }
+
return 1;
}
@@ -2863,6 +2913,29 @@ static int git_pack_config(const char *k, const char *v, void *cb)
pack_idx_opts.version);
return 0;
}
+ if (!strcmp(k, "uploadpack.blobpackfileuri")) {
+ struct configured_exclusion *ex = xmalloc(sizeof(*ex));
+ const char *oid_end, *pack_end;
+ /*
+ * Stores the pack hash. This is not a true object ID, but is
+ * of the same form.
+ */
+ struct object_id pack_hash;
+
+ if (parse_oid_hex(v, &ex->e.oid, &oid_end) ||
+ *oid_end != ' ' ||
+ parse_oid_hex(oid_end + 1, &pack_hash, &pack_end) ||
+ *pack_end != ' ')
+ die(_("value of uploadpack.blobpackfileuri must be "
+ "of the form '<object-hash> <pack-hash> <uri>' (got '%s')"), v);
+ if (oidmap_get(&configured_exclusions, &ex->e.oid))
+ die(_("object already configured in another "
+ "uploadpack.blobpackfileuri (got '%s')"), v);
+ ex->pack_hash_hex = xcalloc(1, pack_end - oid_end);
+ memcpy(ex->pack_hash_hex, oid_end + 1, pack_end - oid_end - 1);
+ ex->uri = xstrdup(pack_end + 1);
+ oidmap_put(&configured_exclusions, ex);
+ }
return git_default_config(k, v, cb);
}
@@ -3461,6 +3534,9 @@ int cmd_pack_objects(int argc, const char **argv, const char *prefix)
N_("do not pack objects in promisor packfiles")),
OPT_BOOL(0, "delta-islands", &use_delta_islands,
N_("respect islands during delta compression")),
+ OPT_STRING_LIST(0, "uri-protocol", &uri_protocols,
+ N_("protocol"),
+ N_("exclude any configured uploadpack.blobpackfileuri with this protocol")),
OPT_END(),
};
@@ -3649,6 +3725,7 @@ int cmd_pack_objects(int argc, const char **argv, const char *prefix)
}
trace2_region_enter("pack-objects", "write-pack-file", the_repository);
+ write_excluded_by_configs();
write_pack_file();
trace2_region_leave("pack-objects", "write-pack-file", the_repository);
diff --git a/builtin/prune.c b/builtin/prune.c
index fd9acc7..02c6ab7 100644
--- a/builtin/prune.c
+++ b/builtin/prune.c
@@ -8,6 +8,7 @@
#include "progress.h"
#include "prune-packed.h"
#include "object-store.h"
+#include "shallow.h"
static const char * const prune_usage[] = {
N_("git prune [-n] [-v] [--progress] [--expire <time>] [--] [<head>...]"),
diff --git a/builtin/pull.c b/builtin/pull.c
index 00e5857..8e6572d 100644
--- a/builtin/pull.c
+++ b/builtin/pull.c
@@ -1031,6 +1031,7 @@ int cmd_pull(int argc, const char **argv, const char *prefix)
ran_ff = 1;
ret = run_merge();
}
+ free_commit_list(list);
}
if (!ran_ff)
ret = run_rebase(&curr_head, merge_heads.oid, &rebase_fork_point);
diff --git a/builtin/rebase.c b/builtin/rebase.c
index ca6aa0d..37ba76a 100644
--- a/builtin/rebase.c
+++ b/builtin/rebase.c
@@ -722,7 +722,6 @@ static int rebase_write_basic_state(struct rebase_options *opts)
static int finish_rebase(struct rebase_options *opts)
{
struct strbuf dir = STRBUF_INIT;
- const char *argv_gc_auto[] = { "gc", "--auto", NULL };
int ret = 0;
delete_ref(NULL, "REBASE_HEAD", NULL, REF_NO_DEREF);
@@ -732,7 +731,7 @@ static int finish_rebase(struct rebase_options *opts)
* We ignore errors in 'gc --auto', since the
* user should see them.
*/
- run_command_v_opt(argv_gc_auto, RUN_GIT_CMD);
+ run_auto_gc(!(opts->flags & (REBASE_NO_QUIET|REBASE_VERBOSE)));
if (opts->type == REBASE_MERGE) {
struct replay_opts replay = REPLAY_OPTS_INIT;
diff --git a/builtin/receive-pack.c b/builtin/receive-pack.c
index 0da8ca5..d43663b 100644
--- a/builtin/receive-pack.c
+++ b/builtin/receive-pack.c
@@ -28,6 +28,7 @@
#include "protocol.h"
#include "commit-reach.h"
#include "worktree.h"
+#include "shallow.h"
static const char * const receive_pack_usage[] = {
N_("git receive-pack <git-dir>"),
@@ -877,7 +878,7 @@ static void refuse_unconfigured_deny_delete_current(void)
static int command_singleton_iterator(void *cb_data, struct object_id *oid);
static int update_shallow_ref(struct command *cmd, struct shallow_info *si)
{
- struct lock_file shallow_lock = LOCK_INIT;
+ struct shallow_lock shallow_lock = SHALLOW_LOCK_INIT;
struct oid_array extra = OID_ARRAY_INIT;
struct check_connected_options opt = CHECK_CONNECTED_INIT;
uint32_t mask = 1 << (cmd->index % 32);
diff --git a/builtin/repack.c b/builtin/repack.c
index 1b686ee..df28773 100644
--- a/builtin/repack.c
+++ b/builtin/repack.c
@@ -13,6 +13,7 @@
#include "prune-packed.h"
#include "object-store.h"
#include "promisor-remote.h"
+#include "shallow.h"
static int delta_base_offset = 1;
static int pack_kept_objects = -1;
diff --git a/builtin/rev-parse.c b/builtin/rev-parse.c
index 0605643..669dd2f 100644
--- a/builtin/rev-parse.c
+++ b/builtin/rev-parse.c
@@ -16,6 +16,7 @@
#include "split-index.h"
#include "submodule.h"
#include "commit-reach.h"
+#include "shallow.h"
#define DO_REVS 1
#define DO_NOREV 2
diff --git a/builtin/sparse-checkout.c b/builtin/sparse-checkout.c
index 95d0882..4003f4d 100644
--- a/builtin/sparse-checkout.c
+++ b/builtin/sparse-checkout.c
@@ -99,6 +99,10 @@ static int update_working_directory(struct pattern_list *pl)
struct lock_file lock_file = LOCK_INIT;
struct repository *r = the_repository;
+ /* If no branch has been checked out, there are no updates to make. */
+ if (is_index_unborn(r->index))
+ return UPDATE_SPARSITY_SUCCESS;
+
memset(&o, 0, sizeof(o));
o.verbose_update = isatty(2);
o.update = 1;
@@ -249,6 +253,8 @@ static int set_config(enum sparse_checkout_mode mode)
{
const char *config_path;
+ if (upgrade_repository_format(1) < 0)
+ die(_("unable to upgrade repository format to enable worktreeConfig"));
if (git_config_set_gently("extensions.worktreeConfig", "true")) {
error(_("failed to set extensions.worktreeConfig setting"));
return 1;
diff --git a/builtin/submodule--helper.c b/builtin/submodule--helper.c
index 1a4b391..59c1e12 100644
--- a/builtin/submodule--helper.c
+++ b/builtin/submodule--helper.c
@@ -2246,6 +2246,80 @@ static int module_config(int argc, const char **argv, const char *prefix)
usage_with_options(git_submodule_helper_usage, module_config_options);
}
+static int module_set_url(int argc, const char **argv, const char *prefix)
+{
+ int quiet = 0;
+ const char *newurl;
+ const char *path;
+ char *config_name;
+
+ struct option options[] = {
+ OPT__QUIET(&quiet, N_("Suppress output for setting url of a submodule")),
+ OPT_END()
+ };
+ const char *const usage[] = {
+ N_("git submodule--helper set-url [--quiet] <path> <newurl>"),
+ NULL
+ };
+
+ argc = parse_options(argc, argv, prefix, options, usage, 0);
+
+ if (argc != 2 || !(path = argv[0]) || !(newurl = argv[1]))
+ usage_with_options(usage, options);
+
+ config_name = xstrfmt("submodule.%s.url", path);
+
+ config_set_in_gitmodules_file_gently(config_name, newurl);
+ sync_submodule(path, prefix, quiet ? OPT_QUIET : 0);
+
+ free(config_name);
+
+ return 0;
+}
+
+static int module_set_branch(int argc, const char **argv, const char *prefix)
+{
+ int opt_default = 0, ret;
+ const char *opt_branch = NULL;
+ const char *path;
+ char *config_name;
+
+ /*
+ * We accept the `quiet` option for uniformity across subcommands,
+ * though there is nothing to make less verbose in this subcommand.
+ */
+ struct option options[] = {
+ OPT_NOOP_NOARG('q', "quiet"),
+ OPT_BOOL('d', "default", &opt_default,
+ N_("set the default tracking branch to master")),
+ OPT_STRING('b', "branch", &opt_branch, N_("branch"),
+ N_("set the default tracking branch")),
+ OPT_END()
+ };
+ const char *const usage[] = {
+ N_("git submodule--helper set-branch [-q|--quiet] (-d|--default) <path>"),
+ N_("git submodule--helper set-branch [-q|--quiet] (-b|--branch) <branch> <path>"),
+ NULL
+ };
+
+ argc = parse_options(argc, argv, prefix, options, usage, 0);
+
+ if (!opt_branch && !opt_default)
+ die(_("--branch or --default required"));
+
+ if (opt_branch && opt_default)
+ die(_("--branch and --default are mutually exclusive"));
+
+ if (argc != 1 || !(path = argv[0]))
+ usage_with_options(usage, options);
+
+ config_name = xstrfmt("submodule.%s.branch", path);
+ ret = config_set_in_gitmodules_file_gently(config_name, opt_branch);
+
+ free(config_name);
+ return !!ret;
+}
+
#define SUPPORT_SUPER_PREFIX (1<<0)
struct cmd_struct {
@@ -2276,6 +2350,8 @@ static struct cmd_struct commands[] = {
{"is-active", is_active, 0},
{"check-name", check_name, 0},
{"config", module_config, 0},
+ {"set-url", module_set_url, 0},
+ {"set-branch", module_set_branch, 0},
};
int cmd_submodule__helper(int argc, const char **argv, const char *prefix)
diff --git a/builtin/worktree.c b/builtin/worktree.c
index d99db35..1238b6b 100644
--- a/builtin/worktree.c
+++ b/builtin/worktree.c
@@ -67,7 +67,12 @@ static void delete_worktrees_dir_if_empty(void)
rmdir(git_path("worktrees")); /* ignore failed removal */
}
-static int prune_worktree(const char *id, struct strbuf *reason)
+/*
+ * Return true if worktree entry should be pruned, along with the reason for
+ * pruning. Otherwise, return false and the worktree's path, or NULL if it
+ * cannot be determined. Caller is responsible for freeing returned path.
+ */
+static int should_prune_worktree(const char *id, struct strbuf *reason, char **wtpath)
{
struct stat st;
char *path;
@@ -75,20 +80,21 @@ static int prune_worktree(const char *id, struct strbuf *reason)
size_t len;
ssize_t read_result;
+ *wtpath = NULL;
if (!is_directory(git_path("worktrees/%s", id))) {
- strbuf_addf(reason, _("Removing worktrees/%s: not a valid directory"), id);
+ strbuf_addstr(reason, _("not a valid directory"));
return 1;
}
if (file_exists(git_path("worktrees/%s/locked", id)))
return 0;
if (stat(git_path("worktrees/%s/gitdir", id), &st)) {
- strbuf_addf(reason, _("Removing worktrees/%s: gitdir file does not exist"), id);
+ strbuf_addstr(reason, _("gitdir file does not exist"));
return 1;
}
fd = open(git_path("worktrees/%s/gitdir", id), O_RDONLY);
if (fd < 0) {
- strbuf_addf(reason, _("Removing worktrees/%s: unable to read gitdir file (%s)"),
- id, strerror(errno));
+ strbuf_addf(reason, _("unable to read gitdir file (%s)"),
+ strerror(errno));
return 1;
}
len = xsize_t(st.st_size);
@@ -96,8 +102,8 @@ static int prune_worktree(const char *id, struct strbuf *reason)
read_result = read_in_full(fd, path, len);
if (read_result < 0) {
- strbuf_addf(reason, _("Removing worktrees/%s: unable to read gitdir file (%s)"),
- id, strerror(errno));
+ strbuf_addf(reason, _("unable to read gitdir file (%s)"),
+ strerror(errno));
close(fd);
free(path);
return 1;
@@ -106,53 +112,103 @@ static int prune_worktree(const char *id, struct strbuf *reason)
if (read_result != len) {
strbuf_addf(reason,
- _("Removing worktrees/%s: short read (expected %"PRIuMAX" bytes, read %"PRIuMAX")"),
- id, (uintmax_t)len, (uintmax_t)read_result);
+ _("short read (expected %"PRIuMAX" bytes, read %"PRIuMAX")"),
+ (uintmax_t)len, (uintmax_t)read_result);
free(path);
return 1;
}
while (len && (path[len - 1] == '\n' || path[len - 1] == '\r'))
len--;
if (!len) {
- strbuf_addf(reason, _("Removing worktrees/%s: invalid gitdir file"), id);
+ strbuf_addstr(reason, _("invalid gitdir file"));
free(path);
return 1;
}
path[len] = '\0';
if (!file_exists(path)) {
- free(path);
if (stat(git_path("worktrees/%s/index", id), &st) ||
st.st_mtime <= expire) {
- strbuf_addf(reason, _("Removing worktrees/%s: gitdir file points to non-existent location"), id);
+ strbuf_addstr(reason, _("gitdir file points to non-existent location"));
+ free(path);
return 1;
} else {
+ *wtpath = path;
return 0;
}
}
- free(path);
+ *wtpath = path;
return 0;
}
+static void prune_worktree(const char *id, const char *reason)
+{
+ if (show_only || verbose)
+ printf_ln(_("Removing %s/%s: %s"), "worktrees", id, reason);
+ if (!show_only)
+ delete_git_dir(id);
+}
+
+static int prune_cmp(const void *a, const void *b)
+{
+ const struct string_list_item *x = a;
+ const struct string_list_item *y = b;
+ int c;
+
+ if ((c = fspathcmp(x->string, y->string)))
+ return c;
+ /*
+ * paths same; prune_dupes() removes all but the first worktree entry
+ * having the same path, so sort main worktree ('util' is NULL) above
+ * linked worktrees ('util' not NULL) since main worktree can't be
+ * removed
+ */
+ if (!x->util)
+ return -1;
+ if (!y->util)
+ return 1;
+ /* paths same; sort by .git/worktrees/<id> */
+ return strcmp(x->util, y->util);
+}
+
+static void prune_dups(struct string_list *l)
+{
+ int i;
+
+ QSORT(l->items, l->nr, prune_cmp);
+ for (i = 1; i < l->nr; i++) {
+ if (!fspathcmp(l->items[i].string, l->items[i - 1].string))
+ prune_worktree(l->items[i].util, "duplicate entry");
+ }
+}
+
static void prune_worktrees(void)
{
struct strbuf reason = STRBUF_INIT;
+ struct strbuf main_path = STRBUF_INIT;
+ struct string_list kept = STRING_LIST_INIT_NODUP;
DIR *dir = opendir(git_path("worktrees"));
struct dirent *d;
if (!dir)
return;
while ((d = readdir(dir)) != NULL) {
+ char *path;
if (is_dot_or_dotdot(d->d_name))
continue;
strbuf_reset(&reason);
- if (!prune_worktree(d->d_name, &reason))
- continue;
- if (show_only || verbose)
- printf("%s\n", reason.buf);
- if (show_only)
- continue;
- delete_git_dir(d->d_name);
+ if (should_prune_worktree(d->d_name, &reason, &path))
+ prune_worktree(d->d_name, reason.buf);
+ else if (path)
+ string_list_append(&kept, path)->util = xstrdup(d->d_name);
}
closedir(dir);
+
+ strbuf_add_absolute_path(&main_path, get_git_common_dir());
+ /* massage main worktree absolute path to match 'gitdir' content */
+ strbuf_strip_suffix(&main_path, "/.");
+ string_list_append(&kept, strbuf_detach(&main_path, NULL));
+ prune_dups(&kept);
+ string_list_clear(&kept, 1);
+
if (!show_only)
delete_worktrees_dir_if_empty();
strbuf_release(&reason);
@@ -224,34 +280,33 @@ static const char *worktree_basename(const char *path, int *olen)
return name;
}
-static void validate_worktree_add(const char *path, const struct add_opts *opts)
+/* check that path is viable location for worktree */
+static void check_candidate_path(const char *path,
+ int force,
+ struct worktree **worktrees,
+ const char *cmd)
{
- struct worktree **worktrees;
struct worktree *wt;
int locked;
if (file_exists(path) && !is_empty_dir(path))
die(_("'%s' already exists"), path);
- worktrees = get_worktrees(0);
wt = find_worktree_by_path(worktrees, path);
if (!wt)
- goto done;
+ return;
locked = !!worktree_lock_reason(wt);
- if ((!locked && opts->force) || (locked && opts->force > 1)) {
+ if ((!locked && force) || (locked && force > 1)) {
if (delete_git_dir(wt->id))
- die(_("unable to re-add worktree '%s'"), path);
- goto done;
+ die(_("unusable worktree destination '%s'"), path);
+ return;
}
if (locked)
- die(_("'%s' is a missing but locked worktree;\nuse 'add -f -f' to override, or 'unlock' and 'prune' or 'remove' to clear"), path);
+ die(_("'%s' is a missing but locked worktree;\nuse '%s -f -f' to override, or 'unlock' and 'prune' or 'remove' to clear"), cmd, path);
else
- die(_("'%s' is a missing but already registered worktree;\nuse 'add -f' to override, or 'prune' or 'remove' to clear"), path);
-
-done:
- free_worktrees(worktrees);
+ die(_("'%s' is a missing but already registered worktree;\nuse '%s -f' to override, or 'prune' or 'remove' to clear"), cmd, path);
}
static int add_worktree(const char *path, const char *refname,
@@ -268,8 +323,12 @@ static int add_worktree(const char *path, const char *refname,
struct commit *commit = NULL;
int is_branch = 0;
struct strbuf sb_name = STRBUF_INIT;
+ struct worktree **worktrees;
- validate_worktree_add(path, opts);
+ worktrees = get_worktrees(0);
+ check_candidate_path(path, opts->force, worktrees, "add");
+ free_worktrees(worktrees);
+ worktrees = NULL;
/* is 'refname' a branch or commit? */
if (!opts->detach && !strbuf_check_branch_ref(&symref, refname) &&
@@ -804,8 +863,7 @@ static int move_worktree(int ac, const char **av, const char *prefix)
strbuf_trim_trailing_dir_sep(&dst);
strbuf_addstr(&dst, sep);
}
- if (file_exists(dst.buf))
- die(_("target '%s' already exists"), dst.buf);
+ check_candidate_path(dst.buf, force, worktrees, "move");
validate_no_submodules(wt);
diff --git a/cache.h b/cache.h
index 0f0485e..e5885cc 100644
--- a/cache.h
+++ b/cache.h
@@ -1042,6 +1042,7 @@ struct repository_format {
int worktree_config;
int is_bare;
int hash_algo;
+ int has_extensions;
char *work_tree;
struct string_list unknown_extensions;
};
diff --git a/ci/config/allow-ref.sample b/ci/config/allow-ref.sample
new file mode 100755
index 0000000..af0e076
--- /dev/null
+++ b/ci/config/allow-ref.sample
@@ -0,0 +1,27 @@
+#!/bin/sh
+#
+# Sample script for enabling/disabling GitHub Actions CI runs on
+# particular refs. By default, CI is run for all branches pushed to
+# GitHub. You can override this by dropping the ".sample" from the script,
+# editing it, committing, and pushing the result to the "ci-config" branch of
+# your repository:
+#
+# git checkout -b ci-config
+# cp allow-ref.sample allow-ref
+# $EDITOR allow-ref
+# git add allow-ref
+# git commit -am "implement my ci preferences"
+# git push
+#
+# This script will then be run when any refs are pushed to that repository. It
+# gets the fully qualified refname as the first argument, and should exit with
+# success only for refs for which you want to run CI.
+
+case "$1" in
+# allow one-off tests by pushing to "for-ci" or "for-ci/mybranch"
+refs/heads/for-ci*) true ;;
+# always build your integration branch
+refs/heads/my-integration-branch) true ;;
+# don't build any other branches or tags
+*) false ;;
+esac
diff --git a/ci/git-problem-matcher.json b/ci/git-problem-matcher.json
deleted file mode 100644
index 506dfbd..0000000
--- a/ci/git-problem-matcher.json
+++ /dev/null
@@ -1,16 +0,0 @@
-{
- "problemMatcher": [
- {
- "owner": "git-test-suite",
- "pattern": [
- {
- "regexp": "^([^ :]+\\.sh):(\\d+): (error|warning|info):\\s+(.*)$",
- "file": 1,
- "line": 2,
- "severity": 3,
- "message": 4
- }
- ]
- }
- ]
-}
diff --git a/ci/lib.sh b/ci/lib.sh
index dac3688..ff24c54 100755
--- a/ci/lib.sh
+++ b/ci/lib.sh
@@ -157,11 +157,6 @@ then
MAKEFLAGS="$MAKEFLAGS --jobs=10"
test windows != "$CI_OS_NAME" ||
GIT_TEST_OPTS="--no-chain-lint --no-bin-wrappers $GIT_TEST_OPTS"
-
- # https://github.com/actions/toolkit/blob/master/docs/commands.md#problem-matchers
- echo "::add-matcher::ci/git-problem-matcher.json"
- test linux-musl = "$jobname" ||
- MAKEFLAGS="$MAKEFLAGS TEST_SHELL_PATH=/bin/sh"
else
echo "Could not identify CI type" >&2
env >&2
diff --git a/command-list.txt b/command-list.txt
index 185e5e3..cbb960c 100644
--- a/command-list.txt
+++ b/command-list.txt
@@ -198,6 +198,7 @@ gitcore-tutorial guide
gitcvs-migration guide
gitdiffcore guide
giteveryday guide
+gitfaq guide
gitglossary guide
githooks guide
gitignore guide
diff --git a/commit-graph.c b/commit-graph.c
index 5ea0c8e..2ff042f 100644
--- a/commit-graph.c
+++ b/commit-graph.c
@@ -18,6 +18,7 @@
#include "progress.h"
#include "bloom.h"
#include "commit-slab.h"
+#include "shallow.h"
void git_test_write_commit_graph_or_die(void)
{
@@ -880,7 +881,6 @@ struct write_commit_graph_context {
unsigned append:1,
report_progress:1,
split:1,
- check_oids:1,
changed_paths:1,
order_by_pack:1;
@@ -1318,13 +1318,25 @@ static void compute_bloom_filters(struct write_commit_graph_context *ctx)
stop_progress(&progress);
}
+struct refs_cb_data {
+ struct oidset *commits;
+ struct progress *progress;
+};
+
static int add_ref_to_set(const char *refname,
const struct object_id *oid,
int flags, void *cb_data)
{
- struct oidset *commits = (struct oidset *)cb_data;
+ struct object_id peeled;
+ struct refs_cb_data *data = (struct refs_cb_data *)cb_data;
+
+ if (!peel_ref(refname, &peeled))
+ oid = &peeled;
+ if (oid_object_info(the_repository, oid, NULL) == OBJ_COMMIT)
+ oidset_insert(data->commits, oid);
+
+ display_progress(data->progress, oidset_size(data->commits));
- oidset_insert(commits, oid);
return 0;
}
@@ -1333,13 +1345,22 @@ int write_commit_graph_reachable(struct object_directory *odb,
const struct split_commit_graph_opts *split_opts)
{
struct oidset commits = OIDSET_INIT;
+ struct refs_cb_data data;
int result;
- for_each_ref(add_ref_to_set, &commits);
+ memset(&data, 0, sizeof(data));
+ data.commits = &commits;
+ if (flags & COMMIT_GRAPH_WRITE_PROGRESS)
+ data.progress = start_delayed_progress(
+ _("Collecting referenced commits"), 0);
+
+ for_each_ref(add_ref_to_set, &data);
result = write_commit_graph(odb, NULL, &commits,
flags, split_opts);
oidset_clear(&commits);
+ if (data.progress)
+ stop_progress(&data.progress);
return result;
}
@@ -1391,46 +1412,19 @@ static int fill_oids_from_packs(struct write_commit_graph_context *ctx,
static int fill_oids_from_commits(struct write_commit_graph_context *ctx,
struct oidset *commits)
{
- uint32_t i = 0;
- struct strbuf progress_title = STRBUF_INIT;
struct oidset_iter iter;
struct object_id *oid;
if (!oidset_size(commits))
return 0;
- if (ctx->report_progress) {
- strbuf_addf(&progress_title,
- Q_("Finding commits for commit graph from %d ref",
- "Finding commits for commit graph from %d refs",
- oidset_size(commits)),
- oidset_size(commits));
- ctx->progress = start_delayed_progress(
- progress_title.buf,
- oidset_size(commits));
- }
-
oidset_iter_init(commits, &iter);
while ((oid = oidset_iter_next(&iter))) {
- struct commit *result;
-
- display_progress(ctx->progress, ++i);
-
- result = lookup_commit_reference_gently(ctx->r, oid, 1);
- if (result) {
- ALLOC_GROW(ctx->oids.list, ctx->oids.nr + 1, ctx->oids.alloc);
- oidcpy(&ctx->oids.list[ctx->oids.nr], &(result->object.oid));
- ctx->oids.nr++;
- } else if (ctx->check_oids) {
- error(_("invalid commit object id: %s"),
- oid_to_hex(oid));
- return -1;
- }
+ ALLOC_GROW(ctx->oids.list, ctx->oids.nr + 1, ctx->oids.alloc);
+ oidcpy(&ctx->oids.list[ctx->oids.nr], oid);
+ ctx->oids.nr++;
}
- stop_progress(&ctx->progress);
- strbuf_release(&progress_title);
-
return 0;
}
@@ -2016,7 +2010,6 @@ int write_commit_graph(struct object_directory *odb,
ctx->append = flags & COMMIT_GRAPH_WRITE_APPEND ? 1 : 0;
ctx->report_progress = flags & COMMIT_GRAPH_WRITE_PROGRESS ? 1 : 0;
ctx->split = flags & COMMIT_GRAPH_WRITE_SPLIT ? 1 : 0;
- ctx->check_oids = flags & COMMIT_GRAPH_WRITE_CHECK_OIDS ? 1 : 0;
ctx->split_opts = split_opts;
ctx->changed_paths = flags & COMMIT_GRAPH_WRITE_BLOOM_FILTERS ? 1 : 0;
ctx->total_bloom_filter_data_size = 0;
diff --git a/commit-graph.h b/commit-graph.h
index 4212766..3ba0da1 100644
--- a/commit-graph.h
+++ b/commit-graph.h
@@ -91,9 +91,7 @@ enum commit_graph_write_flags {
COMMIT_GRAPH_WRITE_APPEND = (1 << 0),
COMMIT_GRAPH_WRITE_PROGRESS = (1 << 1),
COMMIT_GRAPH_WRITE_SPLIT = (1 << 2),
- /* Make sure that each OID in the input is a valid commit OID. */
- COMMIT_GRAPH_WRITE_CHECK_OIDS = (1 << 3),
- COMMIT_GRAPH_WRITE_BLOOM_FILTERS = (1 << 4),
+ COMMIT_GRAPH_WRITE_BLOOM_FILTERS = (1 << 3),
};
enum commit_graph_split_flags {
diff --git a/commit-reach.c b/commit-reach.c
index 4ca7e70..1761217 100644
--- a/commit-reach.c
+++ b/commit-reach.c
@@ -283,7 +283,9 @@ struct commit_list *repo_get_merge_bases(struct repository *r,
/*
* Is "commit" a descendant of one of the elements on the "with_commit" list?
*/
-int is_descendant_of(struct commit *commit, struct commit_list *with_commit)
+static int repo_is_descendant_of(struct repository *r,
+ struct commit *commit,
+ struct commit_list *with_commit)
{
if (!with_commit)
return 1;
@@ -301,13 +303,18 @@ int is_descendant_of(struct commit *commit, struct commit_list *with_commit)
other = with_commit->item;
with_commit = with_commit->next;
- if (in_merge_bases(other, commit))
+ if (repo_in_merge_bases_many(r, other, 1, &commit))
return 1;
}
return 0;
}
}
+int is_descendant_of(struct commit *commit, struct commit_list *with_commit)
+{
+ return repo_is_descendant_of(the_repository, commit, with_commit);
+}
+
/*
* Is "commit" an ancestor of one of the "references"?
*/
@@ -348,7 +355,15 @@ int repo_in_merge_bases(struct repository *r,
struct commit *commit,
struct commit *reference)
{
- return repo_in_merge_bases_many(r, commit, 1, &reference);
+ int res;
+ struct commit_list *list = NULL;
+ struct commit_list **next = &list;
+
+ next = commit_list_append(commit, next);
+ res = repo_is_descendant_of(r, reference, list);
+ free_commit_list(list);
+
+ return res;
}
struct commit_list *reduce_heads(struct commit_list *heads)
@@ -396,6 +411,7 @@ int ref_newer(const struct object_id *new_oid, const struct object_id *old_oid)
struct object *o;
struct commit *old_commit, *new_commit;
struct commit_list *old_commit_list = NULL;
+ int ret;
/*
* Both new_commit and old_commit must be commit-ish and new_commit is descendant of
@@ -417,7 +433,9 @@ int ref_newer(const struct object_id *new_oid, const struct object_id *old_oid)
return 0;
commit_list_insert(old_commit, &old_commit_list);
- return is_descendant_of(new_commit, old_commit_list);
+ ret = is_descendant_of(new_commit, old_commit_list);
+ free_commit_list(old_commit_list);
+ return ret;
}
/*
diff --git a/commit-slab-decl.h b/commit-slab-decl.h
index adc7b46..bfbed15 100644
--- a/commit-slab-decl.h
+++ b/commit-slab-decl.h
@@ -1,5 +1,5 @@
-#ifndef COMMIT_SLAB_HDR_H
-#define COMMIT_SLAB_HDR_H
+#ifndef COMMIT_SLAB_DECL_H
+#define COMMIT_SLAB_DECL_H
/* allocate ~512kB at once, allowing for malloc overhead */
#ifndef COMMIT_SLAB_SIZE
@@ -40,4 +40,4 @@ elemtype *slabname## _peek(struct slabname *s, const struct commit *c)
declare_commit_slab(slabname, elemtype); \
declare_commit_slab_prototypes(slabname, elemtype)
-#endif /* COMMIT_SLAB_HDR_H */
+#endif /* COMMIT_SLAB_DECL_H */
diff --git a/commit.c b/commit.c
index c7099da..87686a7 100644
--- a/commit.c
+++ b/commit.c
@@ -20,6 +20,7 @@
#include "refs.h"
#include "commit-reach.h"
#include "run-command.h"
+#include "shallow.h"
static struct commit_extra_header *read_commit_extra_header_lines(const char *buf, size_t len, const char **);
@@ -110,7 +111,7 @@ static const unsigned char *commit_graft_sha1_access(size_t index, void *table)
return commit_graft_table[index]->oid.hash;
}
-static int commit_graft_pos(struct repository *r, const unsigned char *sha1)
+int commit_graft_pos(struct repository *r, const unsigned char *sha1)
{
return sha1_pos(sha1, r->parsed_objects->grafts,
r->parsed_objects->grafts_nr,
@@ -245,19 +246,6 @@ int for_each_commit_graft(each_commit_graft_fn fn, void *cb_data)
return ret;
}
-int unregister_shallow(const struct object_id *oid)
-{
- int pos = commit_graft_pos(the_repository, oid->hash);
- if (pos < 0)
- return -1;
- if (pos + 1 < the_repository->parsed_objects->grafts_nr)
- MOVE_ARRAY(the_repository->parsed_objects->grafts + pos,
- the_repository->parsed_objects->grafts + pos + 1,
- the_repository->parsed_objects->grafts_nr - pos - 1);
- the_repository->parsed_objects->grafts_nr--;
- return 0;
-}
-
struct commit_buffer {
void *buffer;
unsigned long size;
diff --git a/commit.h b/commit.h
index ab91d21..1b2dea5 100644
--- a/commit.h
+++ b/commit.h
@@ -236,6 +236,8 @@ struct commit_graft {
typedef int (*each_commit_graft_fn)(const struct commit_graft *, void *);
struct commit_graft *read_graft_line(struct strbuf *line);
+/* commit_graft_pos returns an index into r->parsed_objects->grafts. */
+int commit_graft_pos(struct repository *r, const unsigned char *sha1);
int register_commit_graft(struct repository *r, struct commit_graft *, int);
void prepare_commit_graft(struct repository *r);
struct commit_graft *lookup_commit_graft(struct repository *r, const struct object_id *oid);
@@ -247,55 +249,7 @@ struct commit *get_fork_point(const char *refname, struct commit *commit);
struct oid_array;
struct ref;
-int register_shallow(struct repository *r, const struct object_id *oid);
-int unregister_shallow(const struct object_id *oid);
-int commit_shallow_file(struct repository *r, struct lock_file *lk);
-void rollback_shallow_file(struct repository *r, struct lock_file *lk);
int for_each_commit_graft(each_commit_graft_fn, void *);
-int is_repository_shallow(struct repository *r);
-struct commit_list *get_shallow_commits(struct object_array *heads,
- int depth, int shallow_flag, int not_shallow_flag);
-struct commit_list *get_shallow_commits_by_rev_list(
- int ac, const char **av, int shallow_flag, int not_shallow_flag);
-void set_alternate_shallow_file(struct repository *r, const char *path, int override);
-int write_shallow_commits(struct strbuf *out, int use_pack_protocol,
- const struct oid_array *extra);
-void setup_alternate_shallow(struct lock_file *shallow_lock,
- const char **alternate_shallow_file,
- const struct oid_array *extra);
-const char *setup_temporary_shallow(const struct oid_array *extra);
-void advertise_shallow_grafts(int);
-
-/*
- * Initialize with prepare_shallow_info() or zero-initialize (equivalent to
- * prepare_shallow_info with a NULL oid_array).
- */
-struct shallow_info {
- struct oid_array *shallow;
- int *ours, nr_ours;
- int *theirs, nr_theirs;
- struct oid_array *ref;
-
- /* for receive-pack */
- uint32_t **used_shallow;
- int *need_reachability_test;
- int *reachable;
- int *shallow_ref;
- struct commit **commits;
- int nr_commits;
-};
-
-void prepare_shallow_info(struct shallow_info *, struct oid_array *);
-void clear_shallow_info(struct shallow_info *);
-void remove_nonexistent_theirs_shallow(struct shallow_info *);
-void assign_shallow_commits_to_refs(struct shallow_info *info,
- uint32_t **used,
- int *ref_status);
-int delayed_reachability_test(struct shallow_info *si, int c);
-#define PRUNE_SHOW_ONLY 1
-#define PRUNE_QUICK 2
-void prune_shallow(unsigned options);
-extern struct trace_key trace_shallow;
int interactive_add(int argc, const char **argv, const char *prefix, int patch);
int run_add_interactive(const char *revision, const char *patch_mode,
diff --git a/compat/gmtime.c b/compat/gmtime.c
deleted file mode 100644
index e8362dd..0000000
--- a/compat/gmtime.c
+++ /dev/null
@@ -1,29 +0,0 @@
-#include "../git-compat-util.h"
-#undef gmtime
-#undef gmtime_r
-
-struct tm *git_gmtime(const time_t *timep)
-{
- static struct tm result;
- return git_gmtime_r(timep, &result);
-}
-
-struct tm *git_gmtime_r(const time_t *timep, struct tm *result)
-{
- struct tm *ret;
-
- memset(result, 0, sizeof(*result));
- ret = gmtime_r(timep, result);
-
- /*
- * Rather than NULL, FreeBSD gmtime simply leaves the "struct tm"
- * untouched when it encounters overflow. Since "mday" cannot otherwise
- * be zero, we can test this very quickly.
- */
- if (ret && !ret->tm_mday) {
- ret = NULL;
- errno = EOVERFLOW;
- }
-
- return ret;
-}
diff --git a/compat/vcbuild/scripts/clink.pl b/compat/vcbuild/scripts/clink.pl
index d9f71b7..61ad084 100755
--- a/compat/vcbuild/scripts/clink.pl
+++ b/compat/vcbuild/scripts/clink.pl
@@ -23,7 +23,9 @@ while (@ARGV) {
# before any "-l*" flags.
$is_debug = 1;
}
- if ("$arg" =~ /^-[DIMGOZ]/) {
+ if ("$arg" =~ /^-I\/mingw(32|64)/) {
+ # eat
+ } elsif ("$arg" =~ /^-[DIMGOZ]/) {
push(@cflags, $arg);
} elsif ("$arg" eq "-o") {
my $file_out = shift @ARGV;
diff --git a/config.mak.uname b/config.mak.uname
index 5ad43c8..c7eba69 100644
--- a/config.mak.uname
+++ b/config.mak.uname
@@ -246,7 +246,6 @@ ifeq ($(uname_S),FreeBSD)
PYTHON_PATH = /usr/local/bin/python
PERL_PATH = /usr/local/bin/perl
HAVE_PATHS_H = YesPlease
- GMTIME_UNRELIABLE_ERRORS = UnfortunatelyYes
HAVE_BSD_SYSCTL = YesPlease
HAVE_BSD_KERN_PROC_SYSCTL = YesPlease
PAGER_ENV = LESS=FRX LV=-c MORE=FRX
diff --git a/connect.c b/connect.c
index 2ada5b5..e0d5b9f 100644
--- a/connect.c
+++ b/connect.c
@@ -142,6 +142,7 @@ enum protocol_version discover_version(struct packet_reader *reader)
die_initial_contact(0);
case PACKET_READ_FLUSH:
case PACKET_READ_DELIM:
+ case PACKET_READ_RESPONSE_END:
version = protocol_v0;
break;
case PACKET_READ_NORMAL:
@@ -342,6 +343,7 @@ struct ref **get_remote_heads(struct packet_reader *reader,
state = EXPECTING_DONE;
break;
case PACKET_READ_DELIM:
+ case PACKET_READ_RESPONSE_END:
die(_("invalid packet"));
}
@@ -439,10 +441,21 @@ out:
return ret;
}
+void check_stateless_delimiter(int stateless_rpc,
+ struct packet_reader *reader,
+ const char *error)
+{
+ if (!stateless_rpc)
+ return; /* not in stateless mode, no delimiter expected */
+ if (packet_reader_read(reader) != PACKET_READ_RESPONSE_END)
+ die("%s", error);
+}
+
struct ref **get_remote_refs(int fd_out, struct packet_reader *reader,
struct ref **list, int for_push,
const struct argv_array *ref_prefixes,
- const struct string_list *server_options)
+ const struct string_list *server_options,
+ int stateless_rpc)
{
int i;
const char *hash_name;
@@ -490,6 +503,9 @@ struct ref **get_remote_refs(int fd_out, struct packet_reader *reader,
if (reader->status != PACKET_READ_FLUSH)
die(_("expected flush after ref listing"));
+ check_stateless_delimiter(stateless_rpc, reader,
+ _("expected response end packet after ref listing"));
+
return list;
}
diff --git a/connect.h b/connect.h
index ace074d..c53586e 100644
--- a/connect.h
+++ b/connect.h
@@ -25,4 +25,8 @@ int server_feature_v2(const char *c, const char **v);
int server_supports_feature(const char *c, const char *feature,
int die_on_error);
+void check_stateless_delimiter(int stateless_rpc,
+ struct packet_reader *reader,
+ const char *error);
+
#endif
diff --git a/connected.c b/connected.c
index 3135b71..937b4ba 100644
--- a/connected.c
+++ b/connected.c
@@ -43,10 +43,12 @@ int check_connected(oid_iterate_fn fn, void *cb_data,
if (transport && transport->smart_options &&
transport->smart_options->self_contained_and_connected &&
- transport->pack_lockfile &&
- strip_suffix(transport->pack_lockfile, ".keep", &base_len)) {
+ transport->pack_lockfiles.nr == 1 &&
+ strip_suffix(transport->pack_lockfiles.items[0].string,
+ ".keep", &base_len)) {
struct strbuf idx_file = STRBUF_INIT;
- strbuf_add(&idx_file, transport->pack_lockfile, base_len);
+ strbuf_add(&idx_file, transport->pack_lockfiles.items[0].string,
+ base_len);
strbuf_addstr(&idx_file, ".idx");
new_pack = add_packed_git(idx_file.buf, idx_file.len, 1);
strbuf_release(&idx_file);
diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
index b1d6e5e..de5d0fb 100644
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -301,6 +301,19 @@ __gitcomp_direct ()
COMPREPLY=($1)
}
+# Similar to __gitcomp_direct, but appends to COMPREPLY instead.
+# Callers must take care of providing only words that match the current word
+# to be completed and adding any prefix and/or suffix (trailing space!), if
+# necessary.
+# 1: List of newline-separated matching completion words, complete with
+# prefix and suffix.
+__gitcomp_direct_append ()
+{
+ local IFS=$'\n'
+
+ COMPREPLY+=($1)
+}
+
__gitcompappend ()
{
local x i=${#COMPREPLY[@]}
@@ -373,7 +386,7 @@ __gitcomp ()
# Clear the variables caching builtins' options when (re-)sourcing
# the completion script.
if [[ -n ${ZSH_VERSION-} ]]; then
- unset $(set |sed -ne 's/^\(__gitcomp_builtin_[a-zA-Z0-9_][a-zA-Z0-9_]*\)=.*/\1/p') 2>/dev/null
+ unset ${(M)${(k)parameters[@]}:#__gitcomp_builtin_*} 2>/dev/null
else
unset $(compgen -v __gitcomp_builtin_)
fi
@@ -611,6 +624,19 @@ __git_heads ()
"refs/heads/$cur_*" "refs/heads/$cur_*/**"
}
+# Lists branches from remote repositories.
+# 1: A prefix to be added to each listed branch (optional).
+# 2: List only branches matching this word (optional; list all branches if
+# unset or empty).
+# 3: A suffix to be appended to each listed branch (optional).
+__git_remote_heads ()
+{
+ local pfx="${1-}" cur_="${2-}" sfx="${3-}"
+
+ __git for-each-ref --format="${pfx//\%/%%}%(refname:strip=2)$sfx" \
+ "refs/remotes/$cur_*" "refs/remotes/$cur_*/**"
+}
+
# Lists tags from the local repository.
# Accepts the same positional parameters as __git_heads() above.
__git_tags ()
@@ -621,6 +647,26 @@ __git_tags ()
"refs/tags/$cur_*" "refs/tags/$cur_*/**"
}
+# List unique branches from refs/remotes used for 'git checkout' and 'git
+# switch' tracking DWIMery.
+# 1: A prefix to be added to each listed branch (optional)
+# 2: List only branches matching this word (optional; list all branches if
+# unset or empty).
+# 3: A suffix to be appended to each listed branch (optional).
+__git_dwim_remote_heads ()
+{
+ local pfx="${1-}" cur_="${2-}" sfx="${3-}"
+ local fer_pfx="${pfx//\%/%%}" # "escape" for-each-ref format specifiers
+
+ # employ the heuristic used by git checkout and git switch
+ # Try to find a remote branch that cur_es the completion word
+ # but only output if the branch name is unique
+ __git for-each-ref --format="$fer_pfx%(refname:strip=3)$sfx" \
+ --sort="refname:strip=3" \
+ "refs/remotes/*/$cur_*" "refs/remotes/*/$cur_*/**" | \
+ uniq -u
+}
+
# 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).
@@ -696,13 +742,7 @@ __git_refs ()
__git_dir="$dir" __git for-each-ref --format="$fer_pfx%($format)$sfx" \
"${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
- __git for-each-ref --format="$fer_pfx%(refname:strip=3)$sfx" \
- --sort="refname:strip=3" \
- "refs/remotes/*/$match*" "refs/remotes/*/$match*/**" | \
- uniq -u
+ __git_dwim_remote_heads "$pfx" "$match" "$sfx"
fi
return
fi
@@ -749,29 +789,51 @@ __git_refs ()
# Usage: __git_complete_refs [<option>]...
# --remote=<remote>: The remote to list refs from, can be the name of a
# configured remote, a path, or a URL.
-# --track: List unique remote branches for 'git checkout's tracking DWIMery.
+# --dwim: List unique remote branches for 'git switch's tracking DWIMery.
# --pfx=<prefix>: A prefix to be added to each ref.
# --cur=<word>: The current ref to be completed. Defaults to the current
# word to be completed.
# --sfx=<suffix>: A suffix to be appended to each ref instead of the default
# space.
+# --mode=<mode>: What set of refs to complete, one of 'refs' (the default) to
+# complete all refs, 'heads' to complete only branches, or
+# 'remote-heads' to complete only remote branches. Note that
+# --remote is only compatible with --mode=refs.
__git_complete_refs ()
{
- local remote track pfx cur_="$cur" sfx=" "
+ local remote dwim pfx cur_="$cur" sfx=" " mode="refs"
while test $# != 0; do
case "$1" in
--remote=*) remote="${1##--remote=}" ;;
- --track) track="yes" ;;
+ --dwim) dwim="yes" ;;
+ # --track is an old spelling of --dwim
+ --track) dwim="yes" ;;
--pfx=*) pfx="${1##--pfx=}" ;;
--cur=*) cur_="${1##--cur=}" ;;
--sfx=*) sfx="${1##--sfx=}" ;;
+ --mode=*) mode="${1##--mode=}" ;;
*) return 1 ;;
esac
shift
done
- __gitcomp_direct "$(__git_refs "$remote" "$track" "$pfx" "$cur_" "$sfx")"
+ # complete references based on the specified mode
+ case "$mode" in
+ refs)
+ __gitcomp_direct "$(__git_refs "$remote" "" "$pfx" "$cur_" "$sfx")" ;;
+ heads)
+ __gitcomp_direct "$(__git_heads "$pfx" "$cur_" "$sfx")" ;;
+ remote-heads)
+ __gitcomp_direct "$(__git_remote_heads "$pfx" "$cur_" "$sfx")" ;;
+ *)
+ return 1 ;;
+ esac
+
+ # Append DWIM remote branch names if requested
+ if [ "$dwim" = "yes" ]; then
+ __gitcomp_direct_append "$(__git_dwim_remote_heads "$pfx" "$cur_" "$sfx")"
+ fi
}
# __git_refs2 requires 1 argument (to pass to __git_refs)
@@ -1102,6 +1164,40 @@ __git_find_on_cmdline ()
done
}
+# Similar to __git_find_on_cmdline, except that it loops backwards and thus
+# prints the *last* word found. Useful for finding which of two options that
+# supersede each other came last, such as "--guess" and "--no-guess".
+#
+# Usage: __git_find_last_on_cmdline [<option>]... "<wordlist>"
+# --show-idx: Optionally show the index of the found word in the $words array.
+__git_find_last_on_cmdline ()
+{
+ local word c=$cword show_idx
+
+ while test $# -gt 1; do
+ case "$1" in
+ --show-idx) show_idx=y ;;
+ *) return 1 ;;
+ esac
+ shift
+ done
+ local wordlist="$1"
+
+ while [ $c -gt 1 ]; do
+ ((c--))
+ for word in $wordlist; do
+ if [ "$word" = "${words[c]}" ]; then
+ if [ -n "$show_idx" ]; then
+ echo "$c $word"
+ else
+ echo "$word"
+ fi
+ return
+ fi
+ done
+ done
+}
+
# Echo the value of an option set on the command line or config
#
# $1: short option name
@@ -1356,6 +1452,46 @@ _git_bundle ()
esac
}
+# Helper function to decide whether or not we should enable DWIM logic for
+# git-switch and git-checkout.
+#
+# To decide between the following rules in priority order
+# 1) the last provided of "--guess" or "--no-guess" explicitly enable or
+# disable completion of DWIM logic respectively.
+# 2) If the --no-track option is provided, take this as a hint to disable the
+# DWIM completion logic
+# 3) If GIT_COMPLETION_CHECKOUT_NO_GUESS is set, disable the DWIM completion
+# logic, as requested by the user.
+# 4) Enable DWIM logic otherwise.
+#
+__git_checkout_default_dwim_mode ()
+{
+ local last_option dwim_opt="--dwim"
+
+ if [ "$GIT_COMPLETION_CHECKOUT_NO_GUESS" = "1" ]; then
+ dwim_opt=""
+ fi
+
+ # --no-track disables DWIM, but with lower priority than
+ # --guess/--no-guess
+ if [ -n "$(__git_find_on_cmdline "--no-track")" ]; then
+ dwim_opt=""
+ fi
+
+ # Find the last provided --guess or --no-guess
+ last_option="$(__git_find_last_on_cmdline "--guess --no-guess")"
+ case "$last_option" in
+ --guess)
+ dwim_opt="--dwim"
+ ;;
+ --no-guess)
+ dwim_opt=""
+ ;;
+ esac
+
+ echo "$dwim_opt"
+}
+
_git_checkout ()
{
__git_has_doubledash && return
@@ -1368,14 +1504,38 @@ _git_checkout ()
__gitcomp_builtin checkout
;;
*)
- # check if --track, --no-track, or --no-guess was specified
- # if so, disable DWIM mode
- local flags="--track --no-track --no-guess" track_opt="--track"
- if [ "$GIT_COMPLETION_CHECKOUT_NO_GUESS" = "1" ] ||
- [ -n "$(__git_find_on_cmdline "$flags")" ]; then
- track_opt=''
+ local dwim_opt="$(__git_checkout_default_dwim_mode)"
+ local prevword prevword="${words[cword-1]}"
+
+ case "$prevword" in
+ -b|-B|--orphan)
+ # Complete local branches (and DWIM branch
+ # remote branch names) for an option argument
+ # specifying a new branch name. This is for
+ # convenience, assuming new branches are
+ # possibly based on pre-existing branch names.
+ __git_complete_refs $dwim_opt --mode="heads"
+ return
+ ;;
+ *)
+ ;;
+ esac
+
+ # At this point, we've already handled special completion for
+ # the arguments to -b/-B, and --orphan. There are 3 main
+ # things left we can possibly complete:
+ # 1) a start-point for -b/-B, -d/--detach, or --orphan
+ # 2) a remote head, for --track
+ # 3) an arbitrary reference, possibly including DWIM names
+ #
+
+ if [ -n "$(__git_find_on_cmdline "-b -B -d --detach --orphan")" ]; then
+ __git_complete_refs --mode="refs"
+ elif [ -n "$(__git_find_on_cmdline "--track")" ]; then
+ __git_complete_refs --mode="remote-heads"
+ else
+ __git_complete_refs $dwim_opt --mode="refs"
fi
- __git_complete_refs $track_opt
;;
esac
}
@@ -1860,6 +2020,7 @@ _git_log ()
$merge
$__git_diff_common_options
--pickaxe-all --pickaxe-regex
+ --patch --no-patch
"
return
;;
@@ -2223,29 +2384,43 @@ _git_switch ()
__gitcomp_builtin switch
;;
*)
- # check if --track, --no-track, or --no-guess was specified
- # if so, disable DWIM mode
- local track_opt="--track" only_local_ref=n
- if [ "$GIT_COMPLETION_CHECKOUT_NO_GUESS" = "1" ] ||
- [ -n "$(__git_find_on_cmdline "--track --no-track --no-guess")" ]; then
- track_opt=''
- fi
- # explicit --guess enables DWIM mode regardless of
- # $GIT_COMPLETION_CHECKOUT_NO_GUESS
- if [ -n "$(__git_find_on_cmdline "--guess")" ]; then
- track_opt='--track'
- fi
- if [ -z "$(__git_find_on_cmdline "-d --detach")" ]; then
- only_local_ref=y
- else
- # --guess --detach is invalid combination, no
- # dwim will be done when --detach is specified
- track_opt=
+ local dwim_opt="$(__git_checkout_default_dwim_mode)"
+ local prevword prevword="${words[cword-1]}"
+
+ case "$prevword" in
+ -c|-C|--orphan)
+ # Complete local branches (and DWIM branch
+ # remote branch names) for an option argument
+ # specifying a new branch name. This is for
+ # convenience, assuming new branches are
+ # possibly based on pre-existing branch names.
+ __git_complete_refs $dwim_opt --mode="heads"
+ return
+ ;;
+ *)
+ ;;
+ esac
+
+ # Unlike in git checkout, git switch --orphan does not take
+ # a start point. Thus we really have nothing to complete after
+ # the branch name.
+ if [ -n "$(__git_find_on_cmdline "--orphan")" ]; then
+ return
fi
- if [ $only_local_ref = y -a -z "$track_opt" ]; then
- __gitcomp_direct "$(__git_heads "" "$cur" " ")"
+
+ # At this point, we've already handled special completion for
+ # -c/-C, and --orphan. There are 3 main things left to
+ # complete:
+ # 1) a start-point for -c/-C or -d/--detach
+ # 2) a remote head, for --track
+ # 3) a branch name, possibly including DWIM remote branches
+
+ if [ -n "$(__git_find_on_cmdline "-c -C -d --detach")" ]; then
+ __git_complete_refs --mode="refs"
+ elif [ -n "$(__git_find_on_cmdline "--track")" ]; then
+ __git_complete_refs --mode="remote-heads"
else
- __git_complete_refs $track_opt
+ __git_complete_refs $dwim_opt --mode="heads"
fi
;;
esac
@@ -2781,7 +2956,7 @@ _git_stash ()
local save_opts='--all --keep-index --no-keep-index --quiet --patch --include-untracked'
local subcommands='push list show apply clear drop pop create branch'
local subcommand="$(__git_find_on_cmdline "$subcommands save")"
- if [ -n "$(__git_find_on_cmdline "-p")" ]; then
+ if [ -z "$subcommand" -a -n "$(__git_find_on_cmdline "-p")" ]; then
subcommand="push"
fi
if [ -z "$subcommand" ]; then
diff --git a/credential.h b/credential.h
index d99ec42..c0e17e3 100644
--- a/credential.h
+++ b/credential.h
@@ -177,8 +177,8 @@ void credential_write(const struct credential *, FILE *);
* Parse a url into a credential struct, replacing any existing contents.
*
* If the url can't be parsed (e.g., a missing "proto://" component), the
- * resulting credential will be empty but we'll still return success from the
- * "gently" form.
+ * resulting credential will be empty and the function will return an
+ * error (even in the "gently" form).
*
* If we encounter a component which cannot be represented as a credential
* value (e.g., because it contains a newline), the "gently" form will return
@@ -189,7 +189,7 @@ void credential_write(const struct credential *, FILE *);
void credential_from_url(struct credential *, const char *url);
int credential_from_url_gently(struct credential *, const char *url, int quiet);
-int credential_match(const struct credential *have,
- const struct credential *want);
+int credential_match(const struct credential *want,
+ const struct credential *have);
#endif /* CREDENTIAL_H */
diff --git a/diff.c b/diff.c
index d1ad6a3..d24aaa3 100644
--- a/diff.c
+++ b/diff.c
@@ -48,6 +48,7 @@ static const char *diff_order_file_cfg;
int diff_auto_refresh_index = 1;
static int diff_mnemonic_prefix;
static int diff_no_prefix;
+static int diff_relative;
static int diff_stat_graph_width;
static int diff_dirstat_permille_default = 30;
static struct diff_options default_diff_options;
@@ -386,6 +387,10 @@ int git_diff_ui_config(const char *var, const char *value, void *cb)
diff_no_prefix = git_config_bool(var, value);
return 0;
}
+ if (!strcmp(var, "diff.relative")) {
+ diff_relative = git_config_bool(var, value);
+ return 0;
+ }
if (!strcmp(var, "diff.statgraphwidth")) {
diff_stat_graph_width = git_config_int(var, value);
return 0;
@@ -4538,6 +4543,7 @@ void repo_diff_setup(struct repository *r, struct diff_options *options)
options->interhunkcontext = diff_interhunk_context_default;
options->ws_error_highlight = ws_error_highlight_default;
options->flags.rename_empty = 1;
+ options->flags.relative_name = diff_relative;
options->objfind = NULL;
/* pathchange left =NULL by default */
@@ -5195,8 +5201,7 @@ static int diff_opt_relative(const struct option *opt,
{
struct diff_options *options = opt->value;
- BUG_ON_OPT_NEG(unset);
- options->flags.relative_name = 1;
+ options->flags.relative_name = !unset;
if (arg)
options->prefix = arg;
return 0;
@@ -5492,7 +5497,7 @@ static void prep_parse_options(struct diff_options *options)
OPT_GROUP(N_("Other diff options")),
OPT_CALLBACK_F(0, "relative", options, N_("<prefix>"),
N_("when run from subdir, exclude changes outside and show relative paths"),
- PARSE_OPT_NONEG | PARSE_OPT_OPTARG,
+ PARSE_OPT_OPTARG,
diff_opt_relative),
OPT_BOOL('a', "text", &options->flags.text,
N_("treat all files as text")),
@@ -6758,8 +6763,11 @@ void diff_change(struct diff_options *options,
return;
if (options->flags.quick && options->skip_stat_unmatch &&
- !diff_filespec_check_stat_unmatch(options->repo, p))
+ !diff_filespec_check_stat_unmatch(options->repo, p)) {
+ diff_free_filespec_data(p->one);
+ diff_free_filespec_data(p->two);
return;
+ }
options->flags.has_changes = 1;
}
diff --git a/dir.c b/dir.c
index d97e955..1045cc9 100644
--- a/dir.c
+++ b/dir.c
@@ -193,6 +193,10 @@ int fill_directory(struct dir_struct *dir,
const char *prefix;
size_t prefix_len;
+ unsigned exclusive_flags = DIR_SHOW_IGNORED | DIR_SHOW_IGNORED_TOO;
+ if ((dir->flags & exclusive_flags) == exclusive_flags)
+ BUG("DIR_SHOW_IGNORED and DIR_SHOW_IGNORED_TOO are exclusive");
+
/*
* Calculate common prefix for the pathspec, and
* use that to optimize the directory walk
@@ -364,7 +368,8 @@ static int match_pathspec_item(const struct index_state *istate,
return MATCHED_FNMATCH;
/* Perform checks to see if "name" is a leading string of the pathspec */
- if (flags & DO_MATCH_LEADING_PATHSPEC) {
+ if ( (flags & DO_MATCH_LEADING_PATHSPEC) &&
+ !(flags & DO_MATCH_EXCLUDE)) {
/* name is a literal prefix of the pathspec */
int offset = name[namelen-1] == '/' ? 1 : 0;
if ((namelen < matchlen) &&
@@ -401,6 +406,10 @@ static int match_pathspec_item(const struct index_state *istate,
}
/*
+ * do_match_pathspec() is meant to ONLY be called by
+ * match_pathspec_with_flags(); calling it directly risks pathspecs
+ * like ':!unwanted_path' being ignored.
+ *
* Given a name and a list of pathspecs, returns the nature of the
* closest (i.e. most specific) match of the name to any of the
* pathspecs.
@@ -486,13 +495,12 @@ static int do_match_pathspec(const struct index_state *istate,
return retval;
}
-int match_pathspec(const struct index_state *istate,
- const struct pathspec *ps,
- const char *name, int namelen,
- int prefix, char *seen, int is_dir)
+static int match_pathspec_with_flags(const struct index_state *istate,
+ const struct pathspec *ps,
+ const char *name, int namelen,
+ int prefix, char *seen, unsigned flags)
{
int positive, negative;
- unsigned flags = is_dir ? DO_MATCH_DIRECTORY : 0;
positive = do_match_pathspec(istate, ps, name, namelen,
prefix, seen, flags);
if (!(ps->magic & PATHSPEC_EXCLUDE) || !positive)
@@ -503,6 +511,16 @@ int match_pathspec(const struct index_state *istate,
return negative ? 0 : positive;
}
+int match_pathspec(const struct index_state *istate,
+ const struct pathspec *ps,
+ const char *name, int namelen,
+ int prefix, char *seen, int is_dir)
+{
+ unsigned flags = is_dir ? DO_MATCH_DIRECTORY : 0;
+ return match_pathspec_with_flags(istate, ps, name, namelen,
+ prefix, seen, flags);
+}
+
/**
* Check if a submodule is a superset of the pathspec
*/
@@ -511,11 +529,11 @@ int submodule_path_match(const struct index_state *istate,
const char *submodule_name,
char *seen)
{
- int matched = do_match_pathspec(istate, ps, submodule_name,
- strlen(submodule_name),
- 0, seen,
- DO_MATCH_DIRECTORY |
- DO_MATCH_LEADING_PATHSPEC);
+ int matched = match_pathspec_with_flags(istate, ps, submodule_name,
+ strlen(submodule_name),
+ 0, seen,
+ DO_MATCH_DIRECTORY |
+ DO_MATCH_LEADING_PATHSPEC);
return matched;
}
@@ -1757,9 +1775,11 @@ static enum path_treatment treat_directory(struct dir_struct *dir,
* for matching patterns.
*/
if (pathspec && !excluded) {
- matches_how = do_match_pathspec(istate, pathspec, dirname, len,
- 0 /* prefix */, NULL /* seen */,
- DO_MATCH_LEADING_PATHSPEC);
+ matches_how = match_pathspec_with_flags(istate, pathspec,
+ dirname, len,
+ 0 /* prefix */,
+ NULL /* seen */,
+ DO_MATCH_LEADING_PATHSPEC);
if (!matches_how)
return path_none;
}
@@ -1820,7 +1840,7 @@ static enum path_treatment treat_directory(struct dir_struct *dir,
* to recurse into untracked/ignored directories if either of the
* following bits is set:
* - DIR_SHOW_IGNORED_TOO (because then we need to determine if
- * there are ignored directories below)
+ * there are ignored entries below)
* - DIR_HIDE_EMPTY_DIRECTORIES (because we have to determine if
* the directory is empty)
*/
@@ -1838,10 +1858,11 @@ static enum path_treatment treat_directory(struct dir_struct *dir,
return path_excluded;
/*
- * If we have we don't want to know the all the paths under an
- * untracked or ignored directory, we still need to go into the
- * directory to determine if it is empty (because an empty directory
- * should be path_none instead of path_excluded or path_untracked).
+ * Even if we don't want to know all the paths under an untracked or
+ * ignored directory, we may still need to go into the directory to
+ * determine if it is empty (because with DIR_HIDE_EMPTY_DIRECTORIES,
+ * an empty directory should be path_none instead of path_excluded or
+ * path_untracked).
*/
check_only = ((dir->flags & DIR_HIDE_EMPTY_DIRECTORIES) &&
!(dir->flags & DIR_SHOW_IGNORED_TOO));
@@ -2191,9 +2212,9 @@ static enum path_treatment treat_path(struct dir_struct *dir,
if (excluded)
return path_excluded;
if (pathspec &&
- !do_match_pathspec(istate, pathspec, path->buf, path->len,
- 0 /* prefix */, NULL /* seen */,
- 0 /* flags */))
+ !match_pathspec(istate, pathspec, path->buf, path->len,
+ 0 /* prefix */, NULL /* seen */,
+ 0 /* is_dir */))
return path_none;
return path_untracked;
}
diff --git a/environment.c b/environment.c
index 10c9061..aaca0e9 100644
--- a/environment.c
+++ b/environment.c
@@ -17,6 +17,7 @@
#include "argv-array.h"
#include "object-store.h"
#include "chdir-notify.h"
+#include "shallow.h"
int trust_executable_bit = 1;
int trust_ctime = 1;
diff --git a/fast-import.c b/fast-import.c
index c989702..0dfa14d 100644
--- a/fast-import.c
+++ b/fast-import.c
@@ -139,6 +139,7 @@ struct hash_list {
typedef enum {
WHENSPEC_RAW = 1,
+ WHENSPEC_RAW_PERMISSIVE,
WHENSPEC_RFC2822,
WHENSPEC_NOW
} whenspec_type;
@@ -1911,7 +1912,7 @@ static int parse_data(struct strbuf *sb, uintmax_t limit, uintmax_t *len_res)
return 1;
}
-static int validate_raw_date(const char *src, struct strbuf *result)
+static int validate_raw_date(const char *src, struct strbuf *result, int strict)
{
const char *orig_src = src;
char *endp;
@@ -1920,7 +1921,11 @@ static int validate_raw_date(const char *src, struct strbuf *result)
errno = 0;
num = strtoul(src, &endp, 10);
- /* NEEDSWORK: perhaps check for reasonable values? */
+ /*
+ * NEEDSWORK: perhaps check for reasonable values? For example, we
+ * could error on values representing times more than a
+ * day in the future.
+ */
if (errno || endp == src || *endp != ' ')
return -1;
@@ -1929,7 +1934,13 @@ static int validate_raw_date(const char *src, struct strbuf *result)
return -1;
num = strtoul(src + 1, &endp, 10);
- if (errno || endp == src + 1 || *endp || 1400 < num)
+ /*
+ * NEEDSWORK: check for brokenness other than num > 1400, such as
+ * (num % 100) >= 60, or ((num % 100) % 15) != 0 ?
+ */
+ if (errno || endp == src + 1 || *endp || /* did not parse */
+ (strict && (1400 < num)) /* parsed a broken timezone */
+ )
return -1;
strbuf_addstr(result, orig_src);
@@ -1963,7 +1974,11 @@ static char *parse_ident(const char *buf)
switch (whenspec) {
case WHENSPEC_RAW:
- if (validate_raw_date(ltgt, &ident) < 0)
+ if (validate_raw_date(ltgt, &ident, 1) < 0)
+ die("Invalid raw date \"%s\" in ident: %s", ltgt, buf);
+ break;
+ case WHENSPEC_RAW_PERMISSIVE:
+ if (validate_raw_date(ltgt, &ident, 0) < 0)
die("Invalid raw date \"%s\" in ident: %s", ltgt, buf);
break;
case WHENSPEC_RFC2822:
@@ -3258,6 +3273,8 @@ static void option_date_format(const char *fmt)
{
if (!strcmp(fmt, "raw"))
whenspec = WHENSPEC_RAW;
+ else if (!strcmp(fmt, "raw-permissive"))
+ whenspec = WHENSPEC_RAW_PERMISSIVE;
else if (!strcmp(fmt, "rfc2822"))
whenspec = WHENSPEC_RFC2822;
else if (!strcmp(fmt, "now"))
diff --git a/fetch-pack.c b/fetch-pack.c
index d5a919f..80fb3bd 100644
--- a/fetch-pack.c
+++ b/fetch-pack.c
@@ -22,6 +22,7 @@
#include "connected.h"
#include "fetch-negotiator.h"
#include "fsck.h"
+#include "shallow.h"
static int transfer_unpack_limit = -1;
static int fetch_unpack_limit = -1;
@@ -34,9 +35,10 @@ static int fetch_fsck_objects = -1;
static int transfer_fsck_objects = -1;
static int agent_supported;
static int server_supports_filtering;
-static struct lock_file shallow_lock;
+static struct shallow_lock shallow_lock;
static const char *alternate_shallow_file;
static struct strbuf fsck_msg_types = STRBUF_INIT;
+static struct string_list uri_protocols = STRING_LIST_INIT_DUP;
/* Remember to update object flag allocation in object.h */
#define COMPLETE (1U << 0)
@@ -793,7 +795,8 @@ static void write_promisor_file(const char *keep_name,
}
static int get_pack(struct fetch_pack_args *args,
- int xd[2], char **pack_lockfile,
+ int xd[2], struct string_list *pack_lockfiles,
+ int only_packfile,
struct ref **sought, int nr_sought)
{
struct async demux;
@@ -837,7 +840,7 @@ static int get_pack(struct fetch_pack_args *args,
}
if (do_keep || args->from_promisor) {
- if (pack_lockfile)
+ if (pack_lockfiles)
cmd.out = -1;
cmd_name = "index-pack";
argv_array_push(&cmd.args, cmd_name);
@@ -854,15 +857,22 @@ static int get_pack(struct fetch_pack_args *args,
"--keep=fetch-pack %"PRIuMAX " on %s",
(uintmax_t)getpid(), hostname);
}
- if (args->check_self_contained_and_connected)
+ if (only_packfile && args->check_self_contained_and_connected)
argv_array_push(&cmd.args, "--check-self-contained-and-connected");
+ else
+ /*
+ * We cannot perform any connectivity checks because
+ * not all packs have been downloaded; let the caller
+ * have this responsibility.
+ */
+ args->check_self_contained_and_connected = 0;
/*
* If we're obtaining the filename of a lockfile, we'll use
* that filename to write a .promisor file with more
* information below. If not, we need index-pack to do it for
* us.
*/
- if (!(do_keep && pack_lockfile) && args->from_promisor)
+ if (!(do_keep && pack_lockfiles) && args->from_promisor)
argv_array_push(&cmd.args, "--promisor");
}
else {
@@ -898,8 +908,9 @@ static int get_pack(struct fetch_pack_args *args,
cmd.git_cmd = 1;
if (start_command(&cmd))
die(_("fetch-pack: unable to fork off %s"), cmd_name);
- if (do_keep && pack_lockfile) {
- *pack_lockfile = index_pack_lockfile(cmd.out);
+ if (do_keep && pack_lockfiles) {
+ string_list_append_nodup(pack_lockfiles,
+ index_pack_lockfile(cmd.out));
close(cmd.out);
}
@@ -921,8 +932,8 @@ static int get_pack(struct fetch_pack_args *args,
* Now that index-pack has succeeded, write the promisor file using the
* obtained .keep filename if necessary
*/
- if (do_keep && pack_lockfile && args->from_promisor)
- write_promisor_file(*pack_lockfile, sought, nr_sought);
+ if (do_keep && pack_lockfiles && pack_lockfiles->nr && args->from_promisor)
+ write_promisor_file(pack_lockfiles->items[0].string, sought, nr_sought);
return 0;
}
@@ -939,7 +950,7 @@ static struct ref *do_fetch_pack(struct fetch_pack_args *args,
const struct ref *orig_ref,
struct ref **sought, int nr_sought,
struct shallow_info *si,
- char **pack_lockfile)
+ struct string_list *pack_lockfiles)
{
struct repository *r = the_repository;
struct ref *ref = copy_ref_list(orig_ref);
@@ -1068,7 +1079,7 @@ static struct ref *do_fetch_pack(struct fetch_pack_args *args,
alternate_shallow_file = setup_temporary_shallow(si->shallow);
else
alternate_shallow_file = NULL;
- if (get_pack(args, fd, pack_lockfile, sought, nr_sought))
+ if (get_pack(args, fd, pack_lockfiles, 1, sought, nr_sought))
die(_("git fetch-pack: fetch failed."));
all_done:
@@ -1234,6 +1245,26 @@ static int send_fetch_request(struct fetch_negotiator *negotiator, int fd_out,
warning("filtering not recognized by server, ignoring");
}
+ if (server_supports_feature("fetch", "packfile-uris", 0)) {
+ int i;
+ struct strbuf to_send = STRBUF_INIT;
+
+ for (i = 0; i < uri_protocols.nr; i++) {
+ const char *s = uri_protocols.items[i].string;
+
+ if (!strcmp(s, "https") || !strcmp(s, "http")) {
+ if (to_send.len)
+ strbuf_addch(&to_send, ',');
+ strbuf_addstr(&to_send, s);
+ }
+ }
+ if (to_send.len) {
+ packet_buf_write(&req_buf, "packfile-uris %s",
+ to_send.buf);
+ strbuf_release(&to_send);
+ }
+ }
+
/* add wants */
add_wants(args->no_dependents, wants, &req_buf);
@@ -1456,6 +1487,21 @@ static void receive_wanted_refs(struct packet_reader *reader,
die(_("error processing wanted refs: %d"), reader->status);
}
+static void receive_packfile_uris(struct packet_reader *reader,
+ struct string_list *uris)
+{
+ process_section_header(reader, "packfile-uris", 0);
+ while (packet_reader_read(reader) == PACKET_READ_NORMAL) {
+ if (reader->pktlen < the_hash_algo->hexsz ||
+ reader->line[the_hash_algo->hexsz] != ' ')
+ die("expected '<hash> <uri>', got: %s\n", reader->line);
+
+ string_list_append(uris, reader->line);
+ }
+ if (reader->status != PACKET_READ_DELIM)
+ die("expected DELIM");
+}
+
enum fetch_state {
FETCH_CHECK_LOCAL = 0,
FETCH_SEND_REQUEST,
@@ -1464,13 +1510,20 @@ enum fetch_state {
FETCH_DONE,
};
+static void do_check_stateless_delimiter(const struct fetch_pack_args *args,
+ struct packet_reader *reader)
+{
+ check_stateless_delimiter(args->stateless_rpc, reader,
+ _("git fetch-pack: expected response end packet"));
+}
+
static struct ref *do_fetch_pack_v2(struct fetch_pack_args *args,
int fd[2],
const struct ref *orig_ref,
struct ref **sought, int nr_sought,
struct oid_array *shallows,
struct shallow_info *si,
- char **pack_lockfile)
+ struct string_list *pack_lockfiles)
{
struct repository *r = the_repository;
struct ref *ref = copy_ref_list(orig_ref);
@@ -1482,6 +1535,8 @@ static struct ref *do_fetch_pack_v2(struct fetch_pack_args *args,
struct fetch_negotiator negotiator_alloc;
struct fetch_negotiator *negotiator;
int seen_ack = 0;
+ struct string_list packfile_uris = STRING_LIST_INIT_DUP;
+ int i;
if (args->no_dependents) {
negotiator = NULL;
@@ -1548,6 +1603,10 @@ static struct ref *do_fetch_pack_v2(struct fetch_pack_args *args,
/* Process ACKs/NAKs */
switch (process_acks(negotiator, &reader, &common)) {
case READY:
+ /*
+ * Don't check for response delimiter; get_pack() will
+ * read the rest of this response.
+ */
state = FETCH_GET_PACK;
break;
case COMMON_FOUND:
@@ -1555,6 +1614,7 @@ static struct ref *do_fetch_pack_v2(struct fetch_pack_args *args,
seen_ack = 1;
/* fallthrough */
case NO_COMMON_FOUND:
+ do_check_stateless_delimiter(args, &reader);
state = FETCH_SEND_REQUEST;
break;
}
@@ -1570,10 +1630,14 @@ static struct ref *do_fetch_pack_v2(struct fetch_pack_args *args,
if (process_section_header(&reader, "wanted-refs", 1))
receive_wanted_refs(&reader, sought, nr_sought);
- /* get the pack */
+ /* get the pack(s) */
+ if (process_section_header(&reader, "packfile-uris", 1))
+ receive_packfile_uris(&reader, &packfile_uris);
process_section_header(&reader, "packfile", 0);
- if (get_pack(args, fd, pack_lockfile, sought, nr_sought))
+ if (get_pack(args, fd, pack_lockfiles,
+ !packfile_uris.nr, sought, nr_sought))
die(_("git fetch-pack: fetch failed."));
+ do_check_stateless_delimiter(args, &reader);
state = FETCH_DONE;
break;
@@ -1582,8 +1646,55 @@ static struct ref *do_fetch_pack_v2(struct fetch_pack_args *args,
}
}
+ for (i = 0; i < packfile_uris.nr; i++) {
+ struct child_process cmd = CHILD_PROCESS_INIT;
+ char packname[GIT_MAX_HEXSZ + 1];
+ const char *uri = packfile_uris.items[i].string +
+ the_hash_algo->hexsz + 1;
+
+ argv_array_push(&cmd.args, "http-fetch");
+ argv_array_pushf(&cmd.args, "--packfile=%.*s",
+ (int) the_hash_algo->hexsz,
+ packfile_uris.items[i].string);
+ argv_array_push(&cmd.args, uri);
+ cmd.git_cmd = 1;
+ cmd.no_stdin = 1;
+ cmd.out = -1;
+ if (start_command(&cmd))
+ die("fetch-pack: unable to spawn http-fetch");
+
+ if (read_in_full(cmd.out, packname, 5) < 0 ||
+ memcmp(packname, "keep\t", 5))
+ die("fetch-pack: expected keep then TAB at start of http-fetch output");
+
+ if (read_in_full(cmd.out, packname,
+ the_hash_algo->hexsz + 1) < 0 ||
+ packname[the_hash_algo->hexsz] != '\n')
+ die("fetch-pack: expected hash then LF at end of http-fetch output");
+
+ packname[the_hash_algo->hexsz] = '\0';
+
+ close(cmd.out);
+
+ if (finish_command(&cmd))
+ die("fetch-pack: unable to finish http-fetch");
+
+ if (memcmp(packfile_uris.items[i].string, packname,
+ the_hash_algo->hexsz))
+ die("fetch-pack: pack downloaded from %s does not match expected hash %.*s",
+ uri, (int) the_hash_algo->hexsz,
+ packfile_uris.items[i].string);
+
+ string_list_append_nodup(pack_lockfiles,
+ xstrfmt("%s/pack/pack-%s.keep",
+ get_object_directory(),
+ packname));
+ }
+ string_list_clear(&packfile_uris, 0);
+
if (negotiator)
negotiator->release(negotiator);
+
oidset_clear(&common);
return ref;
}
@@ -1620,6 +1731,14 @@ static void fetch_pack_config(void)
git_config_get_bool("repack.usedeltabaseoffset", &prefer_ofs_delta);
git_config_get_bool("fetch.fsckobjects", &fetch_fsck_objects);
git_config_get_bool("transfer.fsckobjects", &transfer_fsck_objects);
+ if (!uri_protocols.nr) {
+ char *str;
+
+ if (!git_config_get_string("fetch.uriprotocols", &str) && str) {
+ string_list_split(&uri_protocols, str, ',', -1);
+ free(str);
+ }
+ }
git_config(fetch_pack_config_cb, NULL);
}
@@ -1772,7 +1891,7 @@ struct ref *fetch_pack(struct fetch_pack_args *args,
const struct ref *ref,
struct ref **sought, int nr_sought,
struct oid_array *shallow,
- char **pack_lockfile,
+ struct string_list *pack_lockfiles,
enum protocol_version version)
{
struct ref *ref_cpy;
@@ -1807,11 +1926,11 @@ struct ref *fetch_pack(struct fetch_pack_args *args,
memset(&si, 0, sizeof(si));
ref_cpy = do_fetch_pack_v2(args, fd, ref, sought, nr_sought,
&shallows_scratch, &si,
- pack_lockfile);
+ pack_lockfiles);
} else {
prepare_shallow_info(&si, shallow);
ref_cpy = do_fetch_pack(args, fd, ref, sought, nr_sought,
- &si, pack_lockfile);
+ &si, pack_lockfiles);
}
reprepare_packed_git(the_repository);
diff --git a/fetch-pack.h b/fetch-pack.h
index 67f6842..85d1e39 100644
--- a/fetch-pack.h
+++ b/fetch-pack.h
@@ -83,7 +83,7 @@ struct ref *fetch_pack(struct fetch_pack_args *args,
struct ref **sought,
int nr_sought,
struct oid_array *shallow,
- char **pack_lockfile,
+ struct string_list *pack_lockfiles,
enum protocol_version version);
/*
diff --git a/fsck.c b/fsck.c
index 087a7f1..f82e2fe 100644
--- a/fsck.c
+++ b/fsck.c
@@ -523,6 +523,28 @@ int fsck_walk(struct object *obj, void *data, struct fsck_options *options)
}
}
+struct name_stack {
+ const char **names;
+ size_t nr, alloc;
+};
+
+static void name_stack_push(struct name_stack *stack, const char *name)
+{
+ ALLOC_GROW(stack->names, stack->nr + 1, stack->alloc);
+ stack->names[stack->nr++] = name;
+}
+
+static const char *name_stack_pop(struct name_stack *stack)
+{
+ return stack->nr ? stack->names[--stack->nr] : NULL;
+}
+
+static void name_stack_clear(struct name_stack *stack)
+{
+ FREE_AND_NULL(stack->names);
+ stack->nr = stack->alloc = 0;
+}
+
/*
* The entries in a tree are ordered in the _path_ order,
* which means that a directory entry is ordered by adding
@@ -534,7 +556,14 @@ int fsck_walk(struct object *obj, void *data, struct fsck_options *options)
#define TREE_UNORDERED (-1)
#define TREE_HAS_DUPS (-2)
-static int verify_ordered(unsigned mode1, const char *name1, unsigned mode2, const char *name2)
+static int is_less_than_slash(unsigned char c)
+{
+ return '\0' < c && c < '/';
+}
+
+static int verify_ordered(unsigned mode1, const char *name1,
+ unsigned mode2, const char *name2,
+ struct name_stack *candidates)
{
int len1 = strlen(name1);
int len2 = strlen(name2);
@@ -566,6 +595,41 @@ static int verify_ordered(unsigned mode1, const char *name1, unsigned mode2, con
c1 = '/';
if (!c2 && S_ISDIR(mode2))
c2 = '/';
+
+ /*
+ * There can be non-consecutive duplicates due to the implicitly
+ * added slash, e.g.:
+ *
+ * foo
+ * foo.bar
+ * foo.bar.baz
+ * foo.bar/
+ * foo/
+ *
+ * Record non-directory candidates (like "foo" and "foo.bar" in
+ * the example) on a stack and check directory candidates (like
+ * foo/" and "foo.bar/") against that stack.
+ */
+ if (!c1 && is_less_than_slash(c2)) {
+ name_stack_push(candidates, name1);
+ } else if (c2 == '/' && is_less_than_slash(c1)) {
+ for (;;) {
+ const char *p;
+ const char *f_name = name_stack_pop(candidates);
+
+ if (!f_name)
+ break;
+ if (!skip_prefix(name2, f_name, &p))
+ continue;
+ if (!*p)
+ return TREE_HAS_DUPS;
+ if (is_less_than_slash(*p)) {
+ name_stack_push(candidates, f_name);
+ break;
+ }
+ }
+ }
+
return c1 < c2 ? 0 : TREE_UNORDERED;
}
@@ -587,6 +651,7 @@ static int fsck_tree(const struct object_id *oid,
struct tree_desc desc;
unsigned o_mode;
const char *o_name;
+ struct name_stack df_dup_candidates = { NULL };
if (init_tree_desc_gently(&desc, buffer, size)) {
retval += report(options, oid, OBJ_TREE, FSCK_MSG_BAD_TREE, "cannot be parsed as a tree");
@@ -666,7 +731,8 @@ static int fsck_tree(const struct object_id *oid,
}
if (o_name) {
- switch (verify_ordered(o_mode, o_name, mode, name)) {
+ switch (verify_ordered(o_mode, o_name, mode, name,
+ &df_dup_candidates)) {
case TREE_UNORDERED:
not_properly_sorted = 1;
break;
@@ -682,6 +748,8 @@ static int fsck_tree(const struct object_id *oid,
o_name = name;
}
+ name_stack_clear(&df_dup_candidates);
+
if (has_null_sha1)
retval += report(options, oid, OBJ_TREE, FSCK_MSG_NULL_SHA1, "contains entries pointing to null sha1");
if (has_full_path)
diff --git a/fuzz-commit-graph.c b/fuzz-commit-graph.c
index 9fd1c04..4308172 100644
--- a/fuzz-commit-graph.c
+++ b/fuzz-commit-graph.c
@@ -12,7 +12,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
initialize_the_repository();
g = parse_commit_graph((void *)data, size);
repo_clear(the_repository);
- free(g);
+ free_commit_graph(g);
return 0;
}
diff --git a/git-add--interactive.perl b/git-add--interactive.perl
index 10fd30a..f36c007 100755
--- a/git-add--interactive.perl
+++ b/git-add--interactive.perl
@@ -754,16 +754,18 @@ sub parse_diff_header {
my $head = { TEXT => [], DISPLAY => [], TYPE => 'header' };
my $mode = { TEXT => [], DISPLAY => [], TYPE => 'mode' };
my $deletion = { TEXT => [], DISPLAY => [], TYPE => 'deletion' };
+ my $addition = { TEXT => [], DISPLAY => [], TYPE => 'addition' };
for (my $i = 0; $i < @{$src->{TEXT}}; $i++) {
my $dest =
$src->{TEXT}->[$i] =~ /^(old|new) mode (\d+)$/ ? $mode :
$src->{TEXT}->[$i] =~ /^deleted file/ ? $deletion :
+ $src->{TEXT}->[$i] =~ /^new file/ ? $addition :
$head;
push @{$dest->{TEXT}}, $src->{TEXT}->[$i];
push @{$dest->{DISPLAY}}, $src->{DISPLAY}->[$i];
}
- return ($head, $mode, $deletion);
+ return ($head, $mode, $deletion, $addition);
}
sub hunk_splittable {
@@ -1427,46 +1429,55 @@ my %patch_update_prompt_modes = (
stage => {
mode => N__("Stage mode change [y,n,q,a,d%s,?]? "),
deletion => N__("Stage deletion [y,n,q,a,d%s,?]? "),
+ addition => N__("Stage addition [y,n,q,a,d%s,?]? "),
hunk => N__("Stage this hunk [y,n,q,a,d%s,?]? "),
},
stash => {
mode => N__("Stash mode change [y,n,q,a,d%s,?]? "),
deletion => N__("Stash deletion [y,n,q,a,d%s,?]? "),
+ addition => N__("Stash addition [y,n,q,a,d%s,?]? "),
hunk => N__("Stash this hunk [y,n,q,a,d%s,?]? "),
},
reset_head => {
mode => N__("Unstage mode change [y,n,q,a,d%s,?]? "),
deletion => N__("Unstage deletion [y,n,q,a,d%s,?]? "),
+ addition => N__("Unstage addition [y,n,q,a,d%s,?]? "),
hunk => N__("Unstage this hunk [y,n,q,a,d%s,?]? "),
},
reset_nothead => {
mode => N__("Apply mode change to index [y,n,q,a,d%s,?]? "),
deletion => N__("Apply deletion to index [y,n,q,a,d%s,?]? "),
+ addition => N__("Apply addition to index [y,n,q,a,d%s,?]? "),
hunk => N__("Apply this hunk to index [y,n,q,a,d%s,?]? "),
},
checkout_index => {
mode => N__("Discard mode change from worktree [y,n,q,a,d%s,?]? "),
deletion => N__("Discard deletion from worktree [y,n,q,a,d%s,?]? "),
+ addition => N__("Discard addition from worktree [y,n,q,a,d%s,?]? "),
hunk => N__("Discard this hunk from worktree [y,n,q,a,d%s,?]? "),
},
checkout_head => {
mode => N__("Discard mode change from index and worktree [y,n,q,a,d%s,?]? "),
deletion => N__("Discard deletion from index and worktree [y,n,q,a,d%s,?]? "),
+ addition => N__("Discard addition from index and worktree [y,n,q,a,d%s,?]? "),
hunk => N__("Discard this hunk from index and worktree [y,n,q,a,d%s,?]? "),
},
checkout_nothead => {
mode => N__("Apply mode change to index and worktree [y,n,q,a,d%s,?]? "),
deletion => N__("Apply deletion to index and worktree [y,n,q,a,d%s,?]? "),
+ addition => N__("Apply addition to index and worktree [y,n,q,a,d%s,?]? "),
hunk => N__("Apply this hunk to index and worktree [y,n,q,a,d%s,?]? "),
},
worktree_head => {
mode => N__("Discard mode change from worktree [y,n,q,a,d%s,?]? "),
deletion => N__("Discard deletion from worktree [y,n,q,a,d%s,?]? "),
+ addition => N__("Discard addition from worktree [y,n,q,a,d%s,?]? "),
hunk => N__("Discard this hunk from worktree [y,n,q,a,d%s,?]? "),
},
worktree_nothead => {
mode => N__("Apply mode change to worktree [y,n,q,a,d%s,?]? "),
deletion => N__("Apply deletion to worktree [y,n,q,a,d%s,?]? "),
+ addition => N__("Apply addition to worktree [y,n,q,a,d%s,?]? "),
hunk => N__("Apply this hunk to worktree [y,n,q,a,d%s,?]? "),
},
);
@@ -1476,7 +1487,7 @@ sub patch_update_file {
my ($ix, $num);
my $path = shift;
my ($head, @hunk) = parse_diff($path);
- ($head, my $mode, my $deletion) = parse_diff_header($head);
+ ($head, my $mode, my $deletion, my $addition) = parse_diff_header($head);
for (@{$head->{DISPLAY}}) {
print;
}
@@ -1490,6 +1501,12 @@ sub patch_update_file {
push @{$deletion->{DISPLAY}}, @{$hunk->{DISPLAY}};
}
@hunk = ($deletion);
+ } elsif (@{$addition->{TEXT}}) {
+ foreach my $hunk (@hunk) {
+ push @{$addition->{TEXT}}, @{$hunk->{TEXT}};
+ push @{$addition->{DISPLAY}}, @{$hunk->{DISPLAY}};
+ }
+ @hunk = ($addition);
}
$num = scalar @hunk;
diff --git a/git-bisect.sh b/git-bisect.sh
index efee12b..08a6ed5 100755
--- a/git-bisect.sh
+++ b/git-bisect.sh
@@ -209,7 +209,8 @@ bisect_replay () {
test "$#" -eq 1 || die "$(gettext "No logfile given")"
test -r "$file" || die "$(eval_gettext "cannot read \$file for replaying")"
git bisect--helper --bisect-reset || exit
- while read git bisect command rev
+ oIFS="$IFS" IFS="$IFS$(printf '\015')"
+ while read git bisect command rev tail
do
test "$git $bisect" = "git bisect" || test "$git" = "git-bisect" || continue
if test "$git" = "git-bisect"
@@ -222,7 +223,7 @@ bisect_replay () {
get_terms
case "$command" in
start)
- cmd="bisect_start $rev"
+ cmd="bisect_start $rev $tail"
eval "$cmd" ;;
"$TERM_GOOD"|"$TERM_BAD"|skip)
git bisect--helper --bisect-write "$command" "$rev" "$TERM_GOOD" "$TERM_BAD" || exit;;
@@ -232,6 +233,7 @@ bisect_replay () {
die "$(gettext "?? what are you talking about?")" ;;
esac
done <"$file"
+ IFS="$oIFS"
bisect_auto_next
}
diff --git a/git-compat-util.h b/git-compat-util.h
index a3dcfc8..5637114 100644
--- a/git-compat-util.h
+++ b/git-compat-util.h
@@ -1222,13 +1222,6 @@ int access_or_die(const char *path, int mode, unsigned flag);
/* Warn on an inaccessible file if errno indicates this is an error */
int warn_on_fopen_errors(const char *path);
-#ifdef GMTIME_UNRELIABLE_ERRORS
-struct tm *git_gmtime(const time_t *);
-struct tm *git_gmtime_r(const time_t *, struct tm *);
-#define gmtime git_gmtime
-#define gmtime_r git_gmtime_r
-#endif
-
#if !defined(USE_PARENS_AROUND_GETTEXT_N) && defined(__GNUC__)
#define USE_PARENS_AROUND_GETTEXT_N 1
#endif
diff --git a/git-gui/git-gui.sh b/git-gui/git-gui.sh
index 4610e4c..49bd86e 100755
--- a/git-gui/git-gui.sh
+++ b/git-gui/git-gui.sh
@@ -2600,12 +2600,12 @@ proc toggle_or_diff {mode w args} {
update_indexinfo \
"Unstaging [short_path $path] from commit" \
[list $path] \
- [concat $after [list ui_ready]]
+ [concat $after {ui_ready;}]
} elseif {$w eq $ui_workdir} {
update_index \
"Adding [short_path $path]" \
[list $path] \
- [concat $after [list ui_ready]]
+ [concat $after {ui_ready;}]
}
} else {
set selected_paths($path) 1
@@ -3928,6 +3928,8 @@ bind $ui_comm <$M1B-Key-KP_Subtract> {show_less_context;break}
bind $ui_comm <$M1B-Key-equal> {show_more_context;break}
bind $ui_comm <$M1B-Key-plus> {show_more_context;break}
bind $ui_comm <$M1B-Key-KP_Add> {show_more_context;break}
+bind $ui_comm <$M1B-Key-BackSpace> {event generate %W <Meta-Delete>;break}
+bind $ui_comm <$M1B-Key-Delete> {event generate %W <Meta-d>;break}
bind $ui_diff <$M1B-Key-x> {tk_textCopy %W;break}
bind $ui_diff <$M1B-Key-X> {tk_textCopy %W;break}
diff --git a/git-gui/lib/index.tcl b/git-gui/lib/index.tcl
index 1fc5b42..d2ec24b 100644
--- a/git-gui/lib/index.tcl
+++ b/git-gui/lib/index.tcl
@@ -60,7 +60,7 @@ proc rescan_on_error {err {after {}}} {
$::main_status stop_all
unlock_index
- rescan [concat $after [list ui_ready]] 0
+ rescan [concat $after {ui_ready;}] 0
}
proc update_indexinfo {msg path_list after} {
@@ -314,7 +314,7 @@ proc unstage_helper {txt paths} {
update_indexinfo \
$txt \
$path_list \
- [concat $after [list ui_ready]]
+ [concat $after {ui_ready;}]
}
}
@@ -366,7 +366,7 @@ proc add_helper {txt paths} {
update_index \
$txt \
$path_list \
- [concat $after {ui_status [mc "Ready to commit."]}]
+ [concat $after {ui_status [mc "Ready to commit."];}]
}
}
diff --git a/git-gui/lib/mergetool.tcl b/git-gui/lib/mergetool.tcl
index 120bc40..e688b01 100644
--- a/git-gui/lib/mergetool.tcl
+++ b/git-gui/lib/mergetool.tcl
@@ -59,7 +59,7 @@ proc merge_add_resolution {path} {
update_index \
[mc "Adding resolution for %s" [short_path $path]] \
[list $path] \
- [concat $after [list ui_ready]]
+ [concat $after {ui_ready;}]
}
proc merge_force_stage {stage} {
diff --git a/git-p4.py b/git-p4.py
index b8b2a16..ca79dc0 100755
--- a/git-p4.py
+++ b/git-p4.py
@@ -2537,11 +2537,12 @@ class P4Submit(Command, P4UserMap):
ok = self.applyCommit(commit)
if ok:
applied.append(commit)
- else:
- if self.prepare_p4_only and i < last:
- print("Processing only the first commit due to option" \
- " --prepare-p4-only")
+ if self.prepare_p4_only:
+ if i < last:
+ print("Processing only the first commit due to option" \
+ " --prepare-p4-only")
break
+ else:
if i < last:
# prompt for what to do, or use the option/variable
if self.conflict_behavior == "ask":
@@ -3214,6 +3215,42 @@ class P4Sync(Command, P4UserMap):
print('Ignoring file outside of prefix: {0}'.format(path))
return hasPrefix
+ def findShadowedFiles(self, files, change):
+ # Perforce allows you commit files and directories with the same name,
+ # so you could have files //depot/foo and //depot/foo/bar both checked
+ # in. A p4 sync of a repository in this state fails. Deleting one of
+ # the files recovers the repository.
+ #
+ # Git will not allow the broken state to exist and only the most recent
+ # of the conflicting names is left in the repository. When one of the
+ # conflicting files is deleted we need to re-add the other one to make
+ # sure the git repository recovers in the same way as perforce.
+ deleted = [f for f in files if f['action'] in self.delete_actions]
+ to_check = set()
+ for f in deleted:
+ path = decode_path(f['path'])
+ to_check.add(path + '/...')
+ while True:
+ path = path.rsplit("/", 1)[0]
+ if path == "/" or path in to_check:
+ break
+ to_check.add(path)
+ to_check = ['%s@%s' % (wildcard_encode(p), change) for p in to_check
+ if self.hasBranchPrefix(p)]
+ if to_check:
+ stat_result = p4CmdList(["-x", "-", "fstat", "-T",
+ "depotFile,headAction,headRev,headType"], stdin=to_check)
+ for record in stat_result:
+ if record['code'] != 'stat':
+ continue
+ if record['headAction'] in self.delete_actions:
+ continue
+ files.append({
+ 'action': 'add',
+ 'path': record['depotFile'],
+ 'rev': record['headRev'],
+ 'type': record['headType']})
+
def commit(self, details, files, branch, parent = "", allow_empty=False):
epoch = details["time"]
author = details["user"]
@@ -3222,11 +3259,14 @@ class P4Sync(Command, P4UserMap):
if self.verbose:
print('commit into {0}'.format(branch))
+ files = [f for f in files
+ if self.hasBranchPrefix(decode_path(f['path']))]
+ self.findShadowedFiles(files, details['change'])
+
if self.clientSpecDirs:
self.clientSpecDirs.update_client_spec_path_cache(files)
- files = [f for (f, path) in ((f, decode_path(f['path'])) for f in files)
- if self.inClientSpec(path) and self.hasBranchPrefix(path)]
+ files = [f for f in files if self.inClientSpec(decode_path(f['path']))]
if gitConfigBool('git-p4.keepEmptyCommits'):
allow_empty = True
diff --git a/git-submodule.sh b/git-submodule.sh
index 08e0439..43eb605 100755
--- a/git-submodule.sh
+++ b/git-submodule.sh
@@ -719,7 +719,7 @@ cmd_update()
# $@ = requested path
#
cmd_set_branch() {
- unset_branch=false
+ default=
branch=
while test $# -ne 0
@@ -729,7 +729,7 @@ cmd_set_branch() {
# we don't do anything with this but we need to accept it
;;
-d|--default)
- unset_branch=true
+ default=1
;;
-b|--branch)
case "$2" in '') usage ;; esac
@@ -750,33 +750,7 @@ cmd_set_branch() {
shift
done
- if test $# -ne 1
- then
- usage
- fi
-
- # we can't use `git submodule--helper name` here because internally, it
- # hashes the path so a trailing slash could lead to an unintentional no match
- name="$(git submodule--helper list "$1" | cut -f2)"
- if test -z "$name"
- then
- exit 1
- fi
-
- test -n "$branch"; has_branch=$?
- test "$unset_branch" = true; has_unset_branch=$?
-
- if test $((!$has_branch != !$has_unset_branch)) -eq 0
- then
- usage
- fi
-
- if test $has_branch -eq 0
- then
- git submodule--helper config submodule."$name".branch "$branch"
- else
- git submodule--helper config --unset submodule."$name".branch
- fi
+ git ${wt_prefix:+-C "$wt_prefix"} ${prefix:+--super-prefix "$prefix"} submodule--helper set-branch ${GIT_QUIET:+--quiet} ${branch:+--branch "$branch"} ${default:+--default} -- "$@"
}
#
@@ -805,27 +779,7 @@ cmd_set_url() {
shift
done
- if test $# -ne 2
- then
- usage
- fi
-
- # we can't use `git submodule--helper name` here because internally, it
- # hashes the path so a trailing slash could lead to an unintentional no match
- name="$(git submodule--helper list "$1" | cut -f2)"
- if test -z "$name"
- then
- exit 1
- fi
-
- url="$2"
- if test -z "$url"
- then
- exit 1
- fi
-
- git submodule--helper config submodule."$name".url "$url"
- git submodule--helper sync ${GIT_QUIET:+--quiet} "$name"
+ git ${wt_prefix:+-C "$wt_prefix"} ${prefix:+--super-prefix "$prefix"} submodule--helper set-url ${GIT_QUIET:+--quiet} -- "$@"
}
#
diff --git a/git.c b/git.c
index e53e815..2f021b9 100644
--- a/git.c
+++ b/git.c
@@ -4,6 +4,7 @@
#include "help.h"
#include "run-command.h"
#include "alias.h"
+#include "shallow.h"
#define RUN_SETUP (1<<0)
#define RUN_SETUP_GENTLY (1<<1)
diff --git a/help.c b/help.c
index 1de9c0d..44cee69 100644
--- a/help.c
+++ b/help.c
@@ -641,6 +641,7 @@ void get_version_info(struct strbuf *buf, int show_build_options)
strbuf_addstr(buf, "no commit associated with this build\n");
strbuf_addf(buf, "sizeof-long: %d\n", (int)sizeof(long));
strbuf_addf(buf, "sizeof-size_t: %d\n", (int)sizeof(size_t));
+ strbuf_addf(buf, "shell-path: %s\n", SHELL_PATH);
/* NEEDSWORK: also save and output GIT-BUILD_OPTIONS? */
}
}
diff --git a/http-fetch.c b/http-fetch.c
index a32ac11..1df376e 100644
--- a/http-fetch.c
+++ b/http-fetch.c
@@ -5,22 +5,90 @@
#include "walker.h"
static const char http_fetch_usage[] = "git http-fetch "
-"[-c] [-t] [-a] [-v] [--recover] [-w ref] [--stdin] commit-id url";
+"[-c] [-t] [-a] [-v] [--recover] [-w ref] [--stdin | --packfile=hash | commit-id] url";
-int cmd_main(int argc, const char **argv)
+static int fetch_using_walker(const char *raw_url, int get_verbosely,
+ int get_recover, int commits, char **commit_id,
+ const char **write_ref, int commits_on_stdin)
{
+ char *url = NULL;
struct walker *walker;
+ int rc;
+
+ str_end_url_with_slash(raw_url, &url);
+
+ http_init(NULL, url, 0);
+
+ walker = get_http_walker(url);
+ walker->get_verbosely = get_verbosely;
+ walker->get_recover = get_recover;
+ walker->get_progress = 0;
+
+ rc = walker_fetch(walker, commits, commit_id, write_ref, url);
+
+ if (commits_on_stdin)
+ walker_targets_free(commits, commit_id, write_ref);
+
+ if (walker->corrupt_object_found) {
+ fprintf(stderr,
+"Some loose object were found to be corrupt, but they might be just\n"
+"a false '404 Not Found' error message sent with incorrect HTTP\n"
+"status code. Suggest running 'git fsck'.\n");
+ }
+
+ walker_free(walker);
+ http_cleanup();
+ free(url);
+
+ return rc;
+}
+
+static void fetch_single_packfile(struct object_id *packfile_hash,
+ const char *url) {
+ struct http_pack_request *preq;
+ struct slot_results results;
+ int ret;
+
+ http_init(NULL, url, 0);
+
+ preq = new_direct_http_pack_request(packfile_hash->hash, xstrdup(url));
+ if (preq == NULL)
+ die("couldn't create http pack request");
+ preq->slot->results = &results;
+ preq->generate_keep = 1;
+
+ if (start_active_slot(preq->slot)) {
+ run_active_slot(preq->slot);
+ if (results.curl_result != CURLE_OK) {
+ die("Unable to get pack file %s\n%s", preq->url,
+ curl_errorstr);
+ }
+ } else {
+ die("Unable to start request");
+ }
+
+ if ((ret = finish_http_pack_request(preq)))
+ die("finish_http_pack_request gave result %d", ret);
+
+ release_http_pack_request(preq);
+ http_cleanup();
+}
+
+int cmd_main(int argc, const char **argv)
+{
int commits_on_stdin = 0;
int commits;
const char **write_ref = NULL;
char **commit_id;
- char *url = NULL;
int arg = 1;
- int rc = 0;
int get_verbosely = 0;
int get_recover = 0;
+ int packfile = 0;
+ struct object_id packfile_hash;
while (arg < argc && argv[arg][0] == '-') {
+ const char *p;
+
if (argv[arg][1] == 't') {
} else if (argv[arg][1] == 'c') {
} else if (argv[arg][1] == 'a') {
@@ -35,46 +103,34 @@ int cmd_main(int argc, const char **argv)
get_recover = 1;
} else if (!strcmp(argv[arg], "--stdin")) {
commits_on_stdin = 1;
+ } else if (skip_prefix(argv[arg], "--packfile=", &p)) {
+ const char *end;
+
+ packfile = 1;
+ if (parse_oid_hex(p, &packfile_hash, &end) || *end)
+ die(_("argument to --packfile must be a valid hash (got '%s')"), p);
}
arg++;
}
- if (argc != arg + 2 - commits_on_stdin)
+ if (argc != arg + 2 - (commits_on_stdin || packfile))
usage(http_fetch_usage);
- if (commits_on_stdin) {
- commits = walker_targets_stdin(&commit_id, &write_ref);
- } else {
- commit_id = (char **) &argv[arg++];
- commits = 1;
- }
-
- if (argv[arg])
- str_end_url_with_slash(argv[arg], &url);
setup_git_directory();
git_config(git_default_config, NULL);
- http_init(NULL, url, 0);
- walker = get_http_walker(url);
- walker->get_verbosely = get_verbosely;
- walker->get_recover = get_recover;
-
- rc = walker_fetch(walker, commits, commit_id, write_ref, url);
-
- if (commits_on_stdin)
- walker_targets_free(commits, commit_id, write_ref);
-
- if (walker->corrupt_object_found) {
- fprintf(stderr,
-"Some loose object were found to be corrupt, but they might be just\n"
-"a false '404 Not Found' error message sent with incorrect HTTP\n"
-"status code. Suggest running 'git fsck'.\n");
+ if (packfile) {
+ fetch_single_packfile(&packfile_hash, argv[arg]);
+ return 0;
}
- walker_free(walker);
- http_cleanup();
-
- free(url);
-
- return rc;
+ if (commits_on_stdin) {
+ commits = walker_targets_stdin(&commit_id, &write_ref);
+ } else {
+ commit_id = (char **) &argv[arg++];
+ commits = 1;
+ }
+ return fetch_using_walker(argv[arg], get_verbosely, get_recover,
+ commits, commit_id, write_ref,
+ commits_on_stdin);
}
diff --git a/http-push.c b/http-push.c
index 822f326..ac7868f 100644
--- a/http-push.c
+++ b/http-push.c
@@ -117,6 +117,7 @@ enum transfer_state {
struct transfer_request {
struct object *obj;
+ struct packed_git *target;
char *url;
char *dest;
struct remote_lock *lock;
@@ -314,17 +315,18 @@ static void start_fetch_packed(struct transfer_request *request)
release_request(request);
return;
}
+ close_pack_index(target);
+ request->target = target;
fprintf(stderr, "Fetching pack %s\n",
hash_to_hex(target->hash));
fprintf(stderr, " which contains %s\n", oid_to_hex(&request->obj->oid));
- preq = new_http_pack_request(target, repo->url);
+ preq = new_http_pack_request(target->hash, repo->url);
if (preq == NULL) {
repo->can_update_info_refs = 0;
return;
}
- preq->lst = &repo->packs;
/* Make sure there isn't another open request for this pack */
while (check_request) {
@@ -597,6 +599,8 @@ static void finish_request(struct transfer_request *request)
}
if (fail)
repo->can_update_info_refs = 0;
+ else
+ http_install_packfile(request->target, &repo->packs);
release_request(request);
}
}
diff --git a/http-walker.c b/http-walker.c
index fe15e32..4fb1235 100644
--- a/http-walker.c
+++ b/http-walker.c
@@ -439,6 +439,7 @@ static int http_fetch_pack(struct walker *walker, struct alt_base *repo, unsigne
target = find_sha1_pack(sha1, repo->packs);
if (!target)
return -1;
+ close_pack_index(target);
if (walker->get_verbosely) {
fprintf(stderr, "Getting pack %s\n",
@@ -447,10 +448,9 @@ static int http_fetch_pack(struct walker *walker, struct alt_base *repo, unsigne
hash_to_hex(sha1));
}
- preq = new_http_pack_request(target, repo->base);
+ preq = new_http_pack_request(target->hash, repo->base);
if (preq == NULL)
goto abort;
- preq->lst = &repo->packs;
preq->slot->results = &results;
if (start_active_slot(preq->slot)) {
@@ -469,6 +469,7 @@ static int http_fetch_pack(struct walker *walker, struct alt_base *repo, unsigne
release_http_pack_request(preq);
if (ret)
return ret;
+ http_install_packfile(target, &repo->packs);
return 0;
diff --git a/http.c b/http.c
index 62aa995..3b12843 100644
--- a/http.c
+++ b/http.c
@@ -18,7 +18,7 @@
static struct trace_key trace_curl = TRACE_KEY_INIT(CURL);
static int trace_curl_data = 1;
-static struct string_list cookies_to_redact = STRING_LIST_INIT_DUP;
+static int trace_curl_redact = 1;
#if LIBCURL_VERSION_NUM >= 0x070a08
long int git_curl_ipresolve = CURL_IPRESOLVE_WHATEVER;
#else
@@ -642,8 +642,9 @@ static void redact_sensitive_header(struct strbuf *header)
{
const char *sensitive_header;
- if (skip_prefix(header->buf, "Authorization:", &sensitive_header) ||
- skip_prefix(header->buf, "Proxy-Authorization:", &sensitive_header)) {
+ if (trace_curl_redact &&
+ (skip_prefix(header->buf, "Authorization:", &sensitive_header) ||
+ skip_prefix(header->buf, "Proxy-Authorization:", &sensitive_header))) {
/* The first token is the type, which is OK to log */
while (isspace(*sensitive_header))
sensitive_header++;
@@ -652,20 +653,15 @@ static void redact_sensitive_header(struct strbuf *header)
/* Everything else is opaque and possibly sensitive */
strbuf_setlen(header, sensitive_header - header->buf);
strbuf_addstr(header, " <redacted>");
- } else if (cookies_to_redact.nr &&
+ } else if (trace_curl_redact &&
skip_prefix(header->buf, "Cookie:", &sensitive_header)) {
struct strbuf redacted_header = STRBUF_INIT;
- char *cookie;
+ const char *cookie;
while (isspace(*sensitive_header))
sensitive_header++;
- /*
- * The contents of header starting from sensitive_header will
- * subsequently be overridden, so it is fine to mutate this
- * string (hence the assignment to "char *").
- */
- cookie = (char *) sensitive_header;
+ cookie = sensitive_header;
while (cookie) {
char *equals;
@@ -678,14 +674,8 @@ static void redact_sensitive_header(struct strbuf *header)
strbuf_addstr(&redacted_header, cookie);
continue;
}
- *equals = 0; /* temporarily set to NUL for lookup */
- if (string_list_lookup(&cookies_to_redact, cookie)) {
- strbuf_addstr(&redacted_header, cookie);
- strbuf_addstr(&redacted_header, "=<redacted>");
- } else {
- *equals = '=';
- strbuf_addstr(&redacted_header, cookie);
- }
+ strbuf_add(&redacted_header, cookie, equals - cookie);
+ strbuf_addstr(&redacted_header, "=<redacted>");
if (semicolon) {
/*
* There are more cookies. (Or, for some
@@ -804,6 +794,12 @@ static int curl_trace(CURL *handle, curl_infotype type, char *data, size_t size,
return 0;
}
+void http_trace_curl_no_data(void)
+{
+ trace_override_envvar(&trace_curl, "1");
+ trace_curl_data = 0;
+}
+
void setup_curl_trace(CURL *handle)
{
if (!trace_want(&trace_curl))
@@ -993,15 +989,12 @@ static CURL *get_curl_handle(void)
warning(_("Protocol restrictions not supported with cURL < 7.19.4"));
#endif
if (getenv("GIT_CURL_VERBOSE"))
- curl_easy_setopt(result, CURLOPT_VERBOSE, 1L);
+ http_trace_curl_no_data();
setup_curl_trace(result);
if (getenv("GIT_TRACE_CURL_NO_DATA"))
trace_curl_data = 0;
- if (getenv("GIT_REDACT_COOKIES")) {
- string_list_split(&cookies_to_redact,
- getenv("GIT_REDACT_COOKIES"), ',', -1);
- string_list_sort(&cookies_to_redact);
- }
+ if (!git_env_bool("GIT_TRACE_REDACT", 1))
+ trace_curl_redact = 0;
curl_easy_setopt(result, CURLOPT_USERAGENT,
user_agent ? user_agent : git_user_agent());
@@ -2268,70 +2261,74 @@ void release_http_pack_request(struct http_pack_request *preq)
int finish_http_pack_request(struct http_pack_request *preq)
{
- struct packed_git **lst;
- struct packed_git *p = preq->target;
- char *tmp_idx;
- size_t len;
struct child_process ip = CHILD_PROCESS_INIT;
-
- close_pack_index(p);
+ int tmpfile_fd;
+ int ret = 0;
fclose(preq->packfile);
preq->packfile = NULL;
- lst = preq->lst;
- while (*lst != p)
- lst = &((*lst)->next);
- *lst = (*lst)->next;
-
- if (!strip_suffix(preq->tmpfile.buf, ".pack.temp", &len))
- BUG("pack tmpfile does not end in .pack.temp?");
- tmp_idx = xstrfmt("%.*s.idx.temp", (int)len, preq->tmpfile.buf);
+ tmpfile_fd = xopen(preq->tmpfile.buf, O_RDONLY);
argv_array_push(&ip.args, "index-pack");
- argv_array_pushl(&ip.args, "-o", tmp_idx, NULL);
- argv_array_push(&ip.args, preq->tmpfile.buf);
+ argv_array_push(&ip.args, "--stdin");
ip.git_cmd = 1;
- ip.no_stdin = 1;
- ip.no_stdout = 1;
+ ip.in = tmpfile_fd;
+ if (preq->generate_keep) {
+ argv_array_pushf(&ip.args, "--keep=git %"PRIuMAX,
+ (uintmax_t)getpid());
+ ip.out = 0;
+ } else {
+ ip.no_stdout = 1;
+ }
if (run_command(&ip)) {
- unlink(preq->tmpfile.buf);
- unlink(tmp_idx);
- free(tmp_idx);
- return -1;
+ ret = -1;
+ goto cleanup;
}
- unlink(sha1_pack_index_name(p->hash));
+cleanup:
+ close(tmpfile_fd);
+ unlink(preq->tmpfile.buf);
+ return ret;
+}
- if (finalize_object_file(preq->tmpfile.buf, sha1_pack_name(p->hash))
- || finalize_object_file(tmp_idx, sha1_pack_index_name(p->hash))) {
- free(tmp_idx);
- return -1;
- }
+void http_install_packfile(struct packed_git *p,
+ struct packed_git **list_to_remove_from)
+{
+ struct packed_git **lst = list_to_remove_from;
+
+ while (*lst != p)
+ lst = &((*lst)->next);
+ *lst = (*lst)->next;
install_packed_git(the_repository, p);
- free(tmp_idx);
- return 0;
}
struct http_pack_request *new_http_pack_request(
- struct packed_git *target, const char *base_url)
+ const unsigned char *packed_git_hash, const char *base_url) {
+
+ struct strbuf buf = STRBUF_INIT;
+
+ end_url_with_slash(&buf, base_url);
+ strbuf_addf(&buf, "objects/pack/pack-%s.pack",
+ hash_to_hex(packed_git_hash));
+ return new_direct_http_pack_request(packed_git_hash,
+ strbuf_detach(&buf, NULL));
+}
+
+struct http_pack_request *new_direct_http_pack_request(
+ const unsigned char *packed_git_hash, char *url)
{
off_t prev_posn = 0;
- struct strbuf buf = STRBUF_INIT;
struct http_pack_request *preq;
preq = xcalloc(1, sizeof(*preq));
strbuf_init(&preq->tmpfile, 0);
- preq->target = target;
- end_url_with_slash(&buf, base_url);
- strbuf_addf(&buf, "objects/pack/pack-%s.pack",
- hash_to_hex(target->hash));
- preq->url = strbuf_detach(&buf, NULL);
+ preq->url = url;
- strbuf_addf(&preq->tmpfile, "%s.temp", sha1_pack_name(target->hash));
+ strbuf_addf(&preq->tmpfile, "%s.temp", sha1_pack_name(packed_git_hash));
preq->packfile = fopen(preq->tmpfile.buf, "a");
if (!preq->packfile) {
error("Unable to open local file %s for pack",
@@ -2355,7 +2352,7 @@ struct http_pack_request *new_http_pack_request(
if (http_is_verbose)
fprintf(stderr,
"Resuming fetch of pack %s at byte %"PRIuMAX"\n",
- hash_to_hex(target->hash),
+ hash_to_hex(packed_git_hash),
(uintmax_t)prev_posn);
http_opt_request_remainder(preq->slot->curl, prev_posn);
}
diff --git a/http.h b/http.h
index 5e0ad72..5de792e 100644
--- a/http.h
+++ b/http.h
@@ -216,18 +216,36 @@ int http_get_info_packs(const char *base_url,
struct http_pack_request {
char *url;
- struct packed_git *target;
- struct packed_git **lst;
+
+ /*
+ * If this is true, finish_http_pack_request() will pass "--keep" to
+ * index-pack, resulting in the creation of a keep file, and will not
+ * suppress its stdout (that is, the "keep\t<hash>\n" line will be
+ * printed to stdout).
+ */
+ unsigned generate_keep : 1;
+
FILE *packfile;
struct strbuf tmpfile;
struct active_request_slot *slot;
};
struct http_pack_request *new_http_pack_request(
- struct packed_git *target, const char *base_url);
+ const unsigned char *packed_git_hash, const char *base_url);
+struct http_pack_request *new_direct_http_pack_request(
+ const unsigned char *packed_git_hash, char *url);
int finish_http_pack_request(struct http_pack_request *preq);
void release_http_pack_request(struct http_pack_request *preq);
+/*
+ * Remove p from the given list, and invoke install_packed_git() on it.
+ *
+ * This is a convenience function for users that have obtained a list of packs
+ * from http_get_info_packs() and have chosen a specific pack to fetch.
+ */
+void http_install_packfile(struct packed_git *p,
+ struct packed_git **list_to_remove_from);
+
/* Helpers for fetching object */
struct http_object_request {
char *url;
@@ -252,6 +270,13 @@ int finish_http_object_request(struct http_object_request *freq);
void abort_http_object_request(struct http_object_request *freq);
void release_http_object_request(struct http_object_request *freq);
+/*
+ * Instead of using environment variables to determine if curl tracing happens,
+ * behave as if GIT_TRACE_CURL=1 and GIT_TRACE_CURL_NO_DATA=1 is set. Call this
+ * before calling setup_curl_trace().
+ */
+void http_trace_curl_no_data(void);
+
/* setup routine for curl_easy_setopt CURLOPT_DEBUGFUNCTION */
void setup_curl_trace(CURL *handle);
#endif /* HTTP_H */
diff --git a/imap-send.c b/imap-send.c
index 6c54d8c..5273754 100644
--- a/imap-send.c
+++ b/imap-send.c
@@ -1464,7 +1464,7 @@ static CURL *setup_curl(struct imap_server_conf *srvc, struct credential *cred)
curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
if (0 < verbosity || getenv("GIT_CURL_VERBOSE"))
- curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
+ http_trace_curl_no_data();
setup_curl_trace(curl);
return curl;
diff --git a/line-log.c b/line-log.c
index 40e1738..c536928 100644
--- a/line-log.c
+++ b/line-log.c
@@ -15,6 +15,7 @@
#include "userdiff.h"
#include "line-log.h"
#include "argv-array.h"
+#include "bloom.h"
static void range_set_grow(struct range_set *rs, size_t extra)
{
@@ -1146,6 +1147,37 @@ int line_log_print(struct rev_info *rev, struct commit *commit)
return 1;
}
+static int bloom_filter_check(struct rev_info *rev,
+ struct commit *commit,
+ struct line_log_data *range)
+{
+ struct bloom_filter *filter;
+ struct bloom_key key;
+ int result = 0;
+
+ if (!commit->parents)
+ return 1;
+
+ if (!rev->bloom_filter_settings ||
+ !(filter = get_bloom_filter(rev->repo, commit, 0)))
+ return 1;
+
+ if (!range)
+ return 0;
+
+ while (!result && range) {
+ fill_bloom_key(range->path, strlen(range->path), &key, rev->bloom_filter_settings);
+
+ if (bloom_filter_contains(filter, &key, rev->bloom_filter_settings))
+ result = 1;
+
+ clear_bloom_key(&key);
+ range = range->next;
+ }
+
+ return result;
+}
+
static int process_ranges_ordinary_commit(struct rev_info *rev, struct commit *commit,
struct line_log_data *range)
{
@@ -1159,6 +1191,7 @@ static int process_ranges_ordinary_commit(struct rev_info *rev, struct commit *c
queue_diffs(range, &rev->diffopt, &queue, commit, parent);
changed = process_all_files(&parent_range, rev, &queue, range);
+
if (parent)
add_line_range(rev, parent, parent_range);
free_line_log_data(parent_range);
@@ -1227,13 +1260,17 @@ static int process_ranges_merge_commit(struct rev_info *rev, struct commit *comm
/* NEEDSWORK leaking like a sieve */
}
-static int process_ranges_arbitrary_commit(struct rev_info *rev, struct commit *commit)
+int line_log_process_ranges_arbitrary_commit(struct rev_info *rev, struct commit *commit)
{
struct line_log_data *range = lookup_line_range(rev, commit);
int changed = 0;
if (range) {
- if (!commit->parents || !commit->parents->next)
+ if (commit->parents && !bloom_filter_check(rev, commit, range)) {
+ struct line_log_data *prange = line_log_data_copy(range);
+ add_line_range(rev, commit->parents->item, prange);
+ clear_commit_line_range(rev, commit);
+ } else if (!commit->parents || !commit->parents->next)
changed = process_ranges_ordinary_commit(rev, commit, range);
else
changed = process_ranges_merge_commit(rev, commit, range);
@@ -1270,7 +1307,7 @@ int line_log_filter(struct rev_info *rev)
while (list) {
struct commit_list *to_free = NULL;
commit = list->item;
- if (process_ranges_arbitrary_commit(rev, commit)) {
+ if (line_log_process_ranges_arbitrary_commit(rev, commit)) {
*pp = list;
pp = &list->next;
} else
diff --git a/line-log.h b/line-log.h
index 8ee7a2b..82ae8d9 100644
--- a/line-log.h
+++ b/line-log.h
@@ -46,10 +46,7 @@ void sort_and_merge_range_set(struct range_set *);
struct line_log_data {
struct line_log_data *next;
char *path;
- char status;
struct range_set ranges;
- int arg_alloc, arg_nr;
- const char **args;
struct diff_filepair *pair;
struct diff_ranges diff;
};
@@ -57,6 +54,8 @@ struct line_log_data {
void line_log_init(struct rev_info *rev, const char *prefix, struct string_list *args);
int line_log_filter(struct rev_info *rev);
+int line_log_process_ranges_arbitrary_commit(struct rev_info *rev,
+ struct commit *commit);
int line_log_print(struct rev_info *rev, struct commit *commit);
diff --git a/list-objects-filter-options.c b/list-objects-filter-options.c
index 256bcfb..3553ad7 100644
--- a/list-objects-filter-options.c
+++ b/list-objects-filter-options.c
@@ -326,7 +326,8 @@ void partial_clone_register(
/* Check if it is already registered */
if (!promisor_remote_find(remote)) {
- git_config_set("core.repositoryformatversion", "1");
+ if (upgrade_repository_format(1) < 0)
+ die(_("unable to upgrade repository format to support partial clone"));
/* Add promisor config for the remote */
cfg_name = xstrfmt("remote.%s.promisor", remote);
diff --git a/list-objects-filter.c b/list-objects-filter.c
index 1e8d4e7..0a3ef3c 100644
--- a/list-objects-filter.c
+++ b/list-objects-filter.c
@@ -663,6 +663,9 @@ struct filter *list_objects_filter__init(
assert((sizeof(s_filters) / sizeof(s_filters[0])) == LOFC__COUNT);
+ if (!filter_options)
+ return NULL;
+
if (filter_options->choice >= LOFC__COUNT)
BUG("invalid list-objects filter choice: %d",
filter_options->choice);
diff --git a/merge-recursive.c b/merge-recursive.c
index d92e2ac..36948ea 100644
--- a/merge-recursive.c
+++ b/merge-recursive.c
@@ -1750,6 +1750,18 @@ static int handle_rename_rename_1to2(struct merge_options *opt,
return -1;
}
+ if (!mfi.clean && mfi.blob.mode == a->mode &&
+ oideq(&mfi.blob.oid, &a->oid)) {
+ /*
+ * Getting here means we were attempting to merge a binary
+ * blob. Since we can't merge binaries, the merge algorithm
+ * just takes one side. But we don't want to copy the
+ * contents of one side to both paths; we'd rather use the
+ * original content at the given path for each path.
+ */
+ oidcpy(&mfi.blob.oid, &b->oid);
+ mfi.blob.mode = b->mode;
+ }
add = &ci->ren2->dst_entry->stages[flip_stage(3)];
if (is_valid(add)) {
add->path = mfi.blob.path = b->path;
diff --git a/midx.c b/midx.c
index 9a61d3b..6d1584c 100644
--- a/midx.c
+++ b/midx.c
@@ -1293,15 +1293,26 @@ static int compare_by_mtime(const void *a_, const void *b_)
return 0;
}
-static int fill_included_packs_all(struct multi_pack_index *m,
+static int fill_included_packs_all(struct repository *r,
+ struct multi_pack_index *m,
unsigned char *include_pack)
{
- uint32_t i;
+ uint32_t i, count = 0;
+ int pack_kept_objects = 0;
+
+ repo_config_get_bool(r, "repack.packkeptobjects", &pack_kept_objects);
+
+ for (i = 0; i < m->num_packs; i++) {
+ if (prepare_midx_pack(r, m, i))
+ continue;
+ if (!pack_kept_objects && m->packs[i]->pack_keep)
+ continue;
- for (i = 0; i < m->num_packs; i++)
include_pack[i] = 1;
+ count++;
+ }
- return m->num_packs < 2;
+ return count < 2;
}
static int fill_included_packs_batch(struct repository *r,
@@ -1312,6 +1323,9 @@ static int fill_included_packs_batch(struct repository *r,
uint32_t i, packs_to_repack;
size_t total_size;
struct repack_info *pack_info = xcalloc(m->num_packs, sizeof(struct repack_info));
+ int pack_kept_objects = 0;
+
+ repo_config_get_bool(r, "repack.packkeptobjects", &pack_kept_objects);
for (i = 0; i < m->num_packs; i++) {
pack_info[i].pack_int_id = i;
@@ -1338,6 +1352,8 @@ static int fill_included_packs_batch(struct repository *r,
if (!p)
continue;
+ if (!pack_kept_objects && p->pack_keep)
+ continue;
if (open_pack_index(p) || !p->num_objects)
continue;
@@ -1370,6 +1386,14 @@ int midx_repack(struct repository *r, const char *object_dir, size_t batch_size,
struct strbuf base_name = STRBUF_INIT;
struct multi_pack_index *m = load_multi_pack_index(object_dir, 1);
+ /*
+ * When updating the default for these configuration
+ * variables in builtin/repack.c, these must be adjusted
+ * to match.
+ */
+ int delta_base_offset = 1;
+ int use_delta_islands = 0;
+
if (!m)
return 0;
@@ -1378,15 +1402,23 @@ int midx_repack(struct repository *r, const char *object_dir, size_t batch_size,
if (batch_size) {
if (fill_included_packs_batch(r, m, include_pack, batch_size))
goto cleanup;
- } else if (fill_included_packs_all(m, include_pack))
+ } else if (fill_included_packs_all(r, m, include_pack))
goto cleanup;
+ repo_config_get_bool(r, "repack.usedeltabaseoffset", &delta_base_offset);
+ repo_config_get_bool(r, "repack.usedeltaislands", &use_delta_islands);
+
argv_array_push(&cmd.args, "pack-objects");
strbuf_addstr(&base_name, object_dir);
strbuf_addstr(&base_name, "/pack/pack");
argv_array_push(&cmd.args, base_name.buf);
+ if (delta_base_offset)
+ argv_array_push(&cmd.args, "--delta-base-offset");
+ if (use_delta_islands)
+ argv_array_push(&cmd.args, "--delta-islands");
+
if (flags & MIDX_PROGRESS)
argv_array_push(&cmd.args, "--progress");
else
diff --git a/pack-bitmap.c b/pack-bitmap.c
index 49a8d10..4077e73 100644
--- a/pack-bitmap.c
+++ b/pack-bitmap.c
@@ -506,7 +506,8 @@ static int should_include(struct commit *commit, void *_data)
static struct bitmap *find_objects(struct bitmap_index *bitmap_git,
struct rev_info *revs,
struct object_list *roots,
- struct bitmap *seen)
+ struct bitmap *seen,
+ struct list_objects_filter_options *filter)
{
struct bitmap *base = NULL;
int needs_walk = 0;
@@ -599,8 +600,9 @@ static struct bitmap *find_objects(struct bitmap_index *bitmap_git,
show_data.bitmap_git = bitmap_git;
show_data.base = base;
- traverse_commit_list(revs, show_commit, show_object,
- &show_data);
+ traverse_commit_list_filtered(filter, revs,
+ show_commit, show_object,
+ &show_data, NULL);
}
return base;
@@ -715,8 +717,9 @@ static int in_bitmapped_pack(struct bitmap_index *bitmap_git,
return 0;
}
-static struct bitmap *find_tip_blobs(struct bitmap_index *bitmap_git,
- struct object_list *tip_objects)
+static struct bitmap *find_tip_objects(struct bitmap_index *bitmap_git,
+ struct object_list *tip_objects,
+ enum object_type type)
{
struct bitmap *result = bitmap_new();
struct object_list *p;
@@ -724,7 +727,7 @@ static struct bitmap *find_tip_blobs(struct bitmap_index *bitmap_git,
for (p = tip_objects; p; p = p->next) {
int pos;
- if (p->item->type != OBJ_BLOB)
+ if (p->item->type != type)
continue;
pos = bitmap_position(bitmap_git, &p->item->oid);
@@ -737,9 +740,10 @@ static struct bitmap *find_tip_blobs(struct bitmap_index *bitmap_git,
return result;
}
-static void filter_bitmap_blob_none(struct bitmap_index *bitmap_git,
- struct object_list *tip_objects,
- struct bitmap *to_filter)
+static void filter_bitmap_exclude_type(struct bitmap_index *bitmap_git,
+ struct object_list *tip_objects,
+ struct bitmap *to_filter,
+ enum object_type type)
{
struct eindex *eindex = &bitmap_git->ext_index;
struct bitmap *tips;
@@ -747,18 +751,21 @@ static void filter_bitmap_blob_none(struct bitmap_index *bitmap_git,
eword_t mask;
uint32_t i;
+ if (type != OBJ_BLOB && type != OBJ_TREE)
+ BUG("filter_bitmap_exclude_type: unsupported type '%d'", type);
+
/*
* The non-bitmap version of this filter never removes
- * blobs which the other side specifically asked for,
+ * objects which the other side specifically asked for,
* so we must match that behavior.
*/
- tips = find_tip_blobs(bitmap_git, tip_objects);
+ tips = find_tip_objects(bitmap_git, tip_objects, type);
/*
* We can use the blob type-bitmap to work in whole words
* for the objects that are actually in the bitmapped packfile.
*/
- for (i = 0, init_type_iterator(&it, bitmap_git, OBJ_BLOB);
+ for (i = 0, init_type_iterator(&it, bitmap_git, type);
i < to_filter->word_alloc && ewah_iterator_next(&mask, &it);
i++) {
if (i < tips->word_alloc)
@@ -773,7 +780,7 @@ static void filter_bitmap_blob_none(struct bitmap_index *bitmap_git,
*/
for (i = 0; i < eindex->count; i++) {
uint32_t pos = i + bitmap_git->pack->num_objects;
- if (eindex->objects[i]->type == OBJ_BLOB &&
+ if (eindex->objects[i]->type == type &&
bitmap_get(to_filter, pos) &&
!bitmap_get(tips, pos))
bitmap_unset(to_filter, pos);
@@ -782,6 +789,14 @@ static void filter_bitmap_blob_none(struct bitmap_index *bitmap_git,
bitmap_free(tips);
}
+static void filter_bitmap_blob_none(struct bitmap_index *bitmap_git,
+ struct object_list *tip_objects,
+ struct bitmap *to_filter)
+{
+ filter_bitmap_exclude_type(bitmap_git, tip_objects, to_filter,
+ OBJ_BLOB);
+}
+
static unsigned long get_size_by_pos(struct bitmap_index *bitmap_git,
uint32_t pos)
{
@@ -820,7 +835,7 @@ static void filter_bitmap_blob_limit(struct bitmap_index *bitmap_git,
eword_t mask;
uint32_t i;
- tips = find_tip_blobs(bitmap_git, tip_objects);
+ tips = find_tip_objects(bitmap_git, tip_objects, OBJ_BLOB);
for (i = 0, init_type_iterator(&it, bitmap_git, OBJ_BLOB);
i < to_filter->word_alloc && ewah_iterator_next(&mask, &it);
@@ -854,6 +869,20 @@ static void filter_bitmap_blob_limit(struct bitmap_index *bitmap_git,
bitmap_free(tips);
}
+static void filter_bitmap_tree_depth(struct bitmap_index *bitmap_git,
+ struct object_list *tip_objects,
+ struct bitmap *to_filter,
+ unsigned long limit)
+{
+ if (limit)
+ BUG("filter_bitmap_tree_depth given non-zero limit");
+
+ filter_bitmap_exclude_type(bitmap_git, tip_objects, to_filter,
+ OBJ_TREE);
+ filter_bitmap_exclude_type(bitmap_git, tip_objects, to_filter,
+ OBJ_BLOB);
+}
+
static int filter_bitmap(struct bitmap_index *bitmap_git,
struct object_list *tip_objects,
struct bitmap *to_filter,
@@ -877,6 +906,15 @@ static int filter_bitmap(struct bitmap_index *bitmap_git,
return 0;
}
+ if (filter->choice == LOFC_TREE_DEPTH &&
+ filter->tree_exclude_depth == 0) {
+ if (bitmap_git)
+ filter_bitmap_tree_depth(bitmap_git, tip_objects,
+ to_filter,
+ filter->tree_exclude_depth);
+ return 0;
+ }
+
/* filter choice not handled */
return -1;
}
@@ -963,7 +1001,8 @@ struct bitmap_index *prepare_bitmap_walk(struct rev_info *revs,
if (haves) {
revs->ignore_missing_links = 1;
- haves_bitmap = find_objects(bitmap_git, revs, haves, NULL);
+ haves_bitmap = find_objects(bitmap_git, revs, haves, NULL,
+ filter);
reset_revision_walk();
revs->ignore_missing_links = 0;
@@ -971,7 +1010,8 @@ struct bitmap_index *prepare_bitmap_walk(struct rev_info *revs,
BUG("failed to perform bitmap walk");
}
- wants_bitmap = find_objects(bitmap_git, revs, wants, haves_bitmap);
+ wants_bitmap = find_objects(bitmap_git, revs, wants, haves_bitmap,
+ filter);
if (!wants_bitmap)
BUG("failed to perform bitmap walk");
diff --git a/pkt-line.c b/pkt-line.c
index a4aea07..844c253 100644
--- a/pkt-line.c
+++ b/pkt-line.c
@@ -99,6 +99,13 @@ void packet_delim(int fd)
die_errno(_("unable to write delim packet"));
}
+void packet_response_end(int fd)
+{
+ packet_trace("0002", 4, 1);
+ if (write_in_full(fd, "0002", 4) < 0)
+ die_errno(_("unable to write stateless separator packet"));
+}
+
int packet_flush_gently(int fd)
{
packet_trace("0000", 4, 1);
@@ -306,10 +313,10 @@ static int get_packet_data(int fd, char **src_buf, size_t *src_size,
return ret;
}
-static int packet_length(const char *linelen)
+int packet_length(const char lenbuf_hex[4])
{
- int val = hex2chr(linelen);
- return (val < 0) ? val : (val << 8) | hex2chr(linelen + 2);
+ int val = hex2chr(lenbuf_hex);
+ return (val < 0) ? val : (val << 8) | hex2chr(lenbuf_hex + 2);
}
enum packet_read_status packet_read_with_status(int fd, char **src_buffer,
@@ -337,6 +344,10 @@ enum packet_read_status packet_read_with_status(int fd, char **src_buffer,
packet_trace("0001", 4, 0);
*pktlen = 0;
return PACKET_READ_DELIM;
+ } else if (len == 2) {
+ packet_trace("0002", 4, 0);
+ *pktlen = 0;
+ return PACKET_READ_RESPONSE_END;
} else if (len < 4) {
die(_("protocol error: bad line length %d"), len);
}
diff --git a/pkt-line.h b/pkt-line.h
index 4cd9435..8c90daa 100644
--- a/pkt-line.h
+++ b/pkt-line.h
@@ -22,6 +22,7 @@
*/
void packet_flush(int fd);
void packet_delim(int fd);
+void packet_response_end(int fd);
void packet_write_fmt(int fd, const char *fmt, ...) __attribute__((format (printf, 2, 3)));
void packet_buf_flush(struct strbuf *buf);
void packet_buf_delim(struct strbuf *buf);
@@ -75,6 +76,15 @@ int packet_read(int fd, char **src_buffer, size_t *src_len, char
*buffer, unsigned size, int options);
/*
+ * Convert a four hex digit packet line length header into its numeric
+ * representation.
+ *
+ * If lenbuf_hex contains non-hex characters, return -1. Otherwise, return the
+ * numeric value of the length header.
+ */
+int packet_length(const char lenbuf_hex[4]);
+
+/*
* Read a packetized line into a buffer like the 'packet_read()' function but
* returns an 'enum packet_read_status' which indicates the status of the read.
* The number of bytes read will be assigned to *pktlen if the status of the
@@ -85,6 +95,7 @@ enum packet_read_status {
PACKET_READ_NORMAL,
PACKET_READ_FLUSH,
PACKET_READ_DELIM,
+ PACKET_READ_RESPONSE_END,
};
enum packet_read_status packet_read_with_status(int fd, char **src_buffer,
size_t *src_len, char *buffer,
diff --git a/po/bg.po b/po/bg.po
index 7990313..a189b16 100644
--- a/po/bg.po
+++ b/po/bg.po
@@ -133,7 +133,7 @@
# hash контролна сума, изчисляване на контролна сума
# fanout откъс (разперване???)
# idx - index of pack file, 1 index per 1 packfile
-# midx - multi-pack index, for objects across multiple packfiles
+# midx, multi-pack index - файл с индекса за множество пакети
# overlay mode - припокриващ режим (при изтеглянe)
# incremental file нарастващ файл
# split (commit-graphr) раздробен (граф с подавания)
@@ -143,6 +143,7 @@
# cone pattern matching пътеводно напасване
# negative pattern отрицателен шаблон
# colored hunk/diff оцветено парче/разлика
+# up to date обновен, освен като самостотелва дума - актуален или completely up to date - напълно актуален
# ------------------------
# „$var“ - може да не сработва за shell има gettext и eval_gettext - проверка - намират се лесно по „$
# ------------------------
@@ -159,10 +160,10 @@
# for i in `sort -u FILES`; do cnt=`grep $i FILES | wc -l`; echo $cnt $i ;done | sort -n
msgid ""
msgstr ""
-"Project-Id-Version: git 2.25\n"
+"Project-Id-Version: git 2.27\n"
"Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2020-03-11 15:26+0800\n"
-"PO-Revision-Date: 2020-03-12 00:03+0100\n"
+"POT-Creation-Date: 2020-05-27 09:34+0200\n"
+"PO-Revision-Date: 2020-05-27 09:43+0200\n"
"Last-Translator: Alexander Shopov <ash@kambanaria.org>\n"
"Language-Team: Bulgarian <dict@fsa-bg.org>\n"
"Language: bg\n"
@@ -176,9 +177,9 @@ msgstr ""
msgid "Huh (%s)?"
msgstr "Неуспешен анализ — „%s“."
-#: add-interactive.c:521 add-interactive.c:822 sequencer.c:3124
-#: sequencer.c:3562 builtin/rebase.c:875 builtin/rebase.c:1687
-#: builtin/rebase.c:2086 builtin/rebase.c:2130
+#: add-interactive.c:521 add-interactive.c:822 reset.c:65 sequencer.c:3142
+#: sequencer.c:3581 sequencer.c:3723 builtin/rebase.c:1518
+#: builtin/rebase.c:1919
msgid "could not read index"
msgstr "индексът не може да бъде прочетен"
@@ -206,8 +207,7 @@ msgstr "Обновяване"
msgid "could not stage '%s'"
msgstr "неуспешно добавяне в индекса на „%s“"
-#: add-interactive.c:695 add-interactive.c:884 sequencer.c:3317
-#: builtin/rebase.c:899
+#: add-interactive.c:695 add-interactive.c:884 reset.c:89 sequencer.c:3336
msgid "could not write index"
msgstr "индексът не може да бъде записан"
@@ -223,8 +223,8 @@ msgstr[1] "%d файла обновени\n"
msgid "note: %s is untracked now.\n"
msgstr "БЕЛЕЖКА: „%s“ вече не се следи.\n"
-#: add-interactive.c:721 apply.c:4110 builtin/checkout.c:281
-#: builtin/reset.c:144
+#: add-interactive.c:721 apply.c:4110 builtin/checkout.c:294
+#: builtin/reset.c:145
#, c-format
msgid "make_cache_entry failed for path '%s'"
msgstr "неуспешно създаване на запис в кеша чрез „make_cache_entry“ за „%s“"
@@ -347,11 +347,11 @@ msgstr "избор на номериран елемент"
msgid "(empty) select nothing"
msgstr "(празно) без избор на нищо"
-#: add-interactive.c:1083 builtin/clean.c:822 git-add--interactive.perl:1851
+#: add-interactive.c:1083 builtin/clean.c:816 git-add--interactive.perl:1851
msgid "*** Commands ***"
msgstr "●●● Команди ●●●"
-#: add-interactive.c:1084 builtin/clean.c:823 git-add--interactive.perl:1848
+#: add-interactive.c:1084 builtin/clean.c:817 git-add--interactive.perl:1848
msgid "What now"
msgstr "Избор на следващо действие"
@@ -363,12 +363,13 @@ msgstr "в индекса"
msgid "unstaged"
msgstr "извън индекса"
-#: add-interactive.c:1136 apply.c:4967 apply.c:4970 builtin/am.c:2251
-#: builtin/am.c:2254 builtin/clone.c:123 builtin/fetch.c:144
-#: builtin/merge.c:274 builtin/pull.c:189 builtin/submodule--helper.c:409
+#: add-interactive.c:1136 apply.c:4967 apply.c:4970 builtin/am.c:2250
+#: builtin/am.c:2253 builtin/clone.c:123 builtin/fetch.c:145
+#: builtin/merge.c:276 builtin/pull.c:190 builtin/submodule--helper.c:409
#: builtin/submodule--helper.c:1394 builtin/submodule--helper.c:1397
#: builtin/submodule--helper.c:1902 builtin/submodule--helper.c:1905
-#: builtin/submodule--helper.c:2148 git-add--interactive.perl:213
+#: builtin/submodule--helper.c:2148 bugreport.c:129
+#: git-add--interactive.perl:213
msgid "path"
msgstr "път"
@@ -377,27 +378,27 @@ msgid "could not refresh index"
msgstr "индексът не може да бъде обновен"
#
-#: add-interactive.c:1157 builtin/clean.c:787 git-add--interactive.perl:1765
+#: add-interactive.c:1157 builtin/clean.c:781 git-add--interactive.perl:1765
#, c-format
msgid "Bye.\n"
msgstr "Изход.\n"
-#: add-patch.c:33 git-add--interactive.perl:1428
+#: add-patch.c:34 git-add--interactive.perl:1428
#, c-format, perl-format
msgid "Stage mode change [y,n,q,a,d%s,?]? "
msgstr "Добавяне на промяната на правата за достъп [y,n,q,a,d%s,?]? "
-#: add-patch.c:34 git-add--interactive.perl:1429
+#: add-patch.c:35 git-add--interactive.perl:1429
#, c-format, perl-format
msgid "Stage deletion [y,n,q,a,d%s,?]? "
msgstr "Добавяне на изтриването [y,n,q,a,d%s,?]? "
-#: add-patch.c:35 git-add--interactive.perl:1430
+#: add-patch.c:36 git-add--interactive.perl:1430
#, c-format, perl-format
msgid "Stage this hunk [y,n,q,a,d%s,?]? "
msgstr "Добавяне на това парче [y,n,q,a,d%s,?]? "
-#: add-patch.c:37
+#: add-patch.c:38
msgid ""
"If the patch applies cleanly, the edited hunk will immediately be marked for "
"staging."
@@ -405,7 +406,7 @@ msgstr ""
"Ако кръпката може да се приложи чисто, редактираното парче ще бъде незабавно "
"добавено към индекса."
-#: add-patch.c:40
+#: add-patch.c:41
msgid ""
"y - stage this hunk\n"
"n - do not stage this hunk\n"
@@ -419,22 +420,22 @@ msgstr ""
"a — добавяне на това и всички следващи парчета от файла в индекса\n"
"d — без добавяне на това и всички следващи парчета от файла в индекса\n"
-#: add-patch.c:54 git-add--interactive.perl:1433
+#: add-patch.c:55 git-add--interactive.perl:1433
#, c-format, perl-format
msgid "Stash mode change [y,n,q,a,d%s,?]? "
msgstr "Скатаване на промяната на правата за достъп [y,n,q,a,d%s,?]? "
-#: add-patch.c:55 git-add--interactive.perl:1434
+#: add-patch.c:56 git-add--interactive.perl:1434
#, c-format, perl-format
msgid "Stash deletion [y,n,q,a,d%s,?]? "
msgstr "Скатаване на изтриването [y,n,q,a,d%s,?]? "
-#: add-patch.c:56 git-add--interactive.perl:1435
+#: add-patch.c:57 git-add--interactive.perl:1435
#, c-format, perl-format
msgid "Stash this hunk [y,n,q,a,d%s,?]? "
msgstr "Скатаване на това парче [y,n,q,a,d%s,?]? "
-#: add-patch.c:58
+#: add-patch.c:59
msgid ""
"If the patch applies cleanly, the edited hunk will immediately be marked for "
"stashing."
@@ -442,7 +443,7 @@ msgstr ""
"Ако кръпката може да се приложи чисто, редактираното парче ще бъде незабавно "
"скътано."
-#: add-patch.c:61
+#: add-patch.c:62
msgid ""
"y - stash this hunk\n"
"n - do not stash this hunk\n"
@@ -456,22 +457,22 @@ msgstr ""
"a — скатаване на това и всички следващи парчета от файла\n"
"d — без скатаване на това и всички следващи парчета от файла\n"
-#: add-patch.c:77 git-add--interactive.perl:1438
+#: add-patch.c:78 git-add--interactive.perl:1438
#, c-format, perl-format
msgid "Unstage mode change [y,n,q,a,d%s,?]? "
msgstr "Изваждане на промяната на правата за достъп [y,n,q,a,d%s,?]? "
-#: add-patch.c:78 git-add--interactive.perl:1439
+#: add-patch.c:79 git-add--interactive.perl:1439
#, c-format, perl-format
msgid "Unstage deletion [y,n,q,a,d%s,?]? "
msgstr "Изваждане на изтриването [y,n,q,a,d%s,?]? "
-#: add-patch.c:79 git-add--interactive.perl:1440
+#: add-patch.c:80 git-add--interactive.perl:1440
#, c-format, perl-format
msgid "Unstage this hunk [y,n,q,a,d%s,?]? "
msgstr "Изваждане на това парче [y,n,q,a,d%s,?]? "
-#: add-patch.c:81
+#: add-patch.c:82
msgid ""
"If the patch applies cleanly, the edited hunk will immediately be marked for "
"unstaging."
@@ -479,7 +480,7 @@ msgstr ""
"Ако кръпката може да се приложи чисто, редактираното парче ще бъде незабавно "
"извадено от индекса."
-#: add-patch.c:84
+#: add-patch.c:85
msgid ""
"y - unstage this hunk\n"
"n - do not unstage this hunk\n"
@@ -493,23 +494,23 @@ msgstr ""
"a — изваждане на това и всички следващи парчета от файла от индекса\n"
"d — без изваждане на това и всички следващи парчета от файла от индекса\n"
-#: add-patch.c:99 git-add--interactive.perl:1443
+#: add-patch.c:100 git-add--interactive.perl:1443
#, c-format, perl-format
msgid "Apply mode change to index [y,n,q,a,d%s,?]? "
msgstr ""
"Прилагане на промяната на правата за достъп към индекса [y,n,q,a,d%s,?]? "
-#: add-patch.c:100 git-add--interactive.perl:1444
+#: add-patch.c:101 git-add--interactive.perl:1444
#, c-format, perl-format
msgid "Apply deletion to index [y,n,q,a,d%s,?]? "
msgstr "Прилагане на изтриването към индекса [y,n,q,a,d%s,?]? "
-#: add-patch.c:101 git-add--interactive.perl:1445
+#: add-patch.c:102 git-add--interactive.perl:1445
#, c-format, perl-format
msgid "Apply this hunk to index [y,n,q,a,d%s,?]? "
msgstr "Прилагане на това парче към индекса [y,n,q,a,d%s,?]? "
-#: add-patch.c:103 add-patch.c:168 add-patch.c:211
+#: add-patch.c:104 add-patch.c:169 add-patch.c:212
msgid ""
"If the patch applies cleanly, the edited hunk will immediately be marked for "
"applying."
@@ -517,7 +518,7 @@ msgstr ""
"Ако кръпката може да се приложи чисто, редактираното парче ще бъде незабавно "
"набелязано за прилагане."
-#: add-patch.c:106
+#: add-patch.c:107
msgid ""
"y - apply this hunk to index\n"
"n - do not apply this hunk to index\n"
@@ -531,7 +532,7 @@ msgstr ""
"a — прилагане на това и всички следващи парчета от файла към индекса\n"
"d — без прилагане на това и всички следващи парчета от файла към индекса\n"
-#: add-patch.c:121 git-add--interactive.perl:1448
+#: add-patch.c:122 git-add--interactive.perl:1448
#: git-add--interactive.perl:1463
#, c-format, perl-format
msgid "Discard mode change from worktree [y,n,q,a,d%s,?]? "
@@ -539,19 +540,19 @@ msgstr ""
"Премахване на промяната в правата за достъп от работното дърво [y,n,q,a,d"
"%s,?]? "
-#: add-patch.c:122 git-add--interactive.perl:1449
+#: add-patch.c:123 git-add--interactive.perl:1449
#: git-add--interactive.perl:1464
#, c-format, perl-format
msgid "Discard deletion from worktree [y,n,q,a,d%s,?]? "
msgstr "Премахване на изтриването от работното дърво [y,n,q,a,d%s,?]? "
-#: add-patch.c:123 git-add--interactive.perl:1450
+#: add-patch.c:124 git-add--interactive.perl:1450
#: git-add--interactive.perl:1465
#, c-format, perl-format
msgid "Discard this hunk from worktree [y,n,q,a,d%s,?]? "
msgstr "Премахване на парчето от работното дърво [y,n,q,a,d%s,?]? "
-#: add-patch.c:125 add-patch.c:147 add-patch.c:190
+#: add-patch.c:126 add-patch.c:148 add-patch.c:191
msgid ""
"If the patch applies cleanly, the edited hunk will immediately be marked for "
"discarding."
@@ -559,7 +560,7 @@ msgstr ""
"Ако кръпката може да се приложи чисто, редактираното парче ще бъде незабавно "
"набелязано за зануляване."
-#: add-patch.c:128 add-patch.c:193
+#: add-patch.c:129 add-patch.c:194
msgid ""
"y - discard this hunk from worktree\n"
"n - do not discard this hunk from worktree\n"
@@ -576,25 +577,25 @@ msgstr ""
"d — без премахване на това и всички следващи парчета от файла от работното "
"дърво\n"
-#: add-patch.c:143 add-patch.c:186 git-add--interactive.perl:1453
+#: add-patch.c:144 add-patch.c:187 git-add--interactive.perl:1453
#, c-format, perl-format
msgid "Discard mode change from index and worktree [y,n,q,a,d%s,?]? "
msgstr ""
"Премахване на промяната в правата за достъп от индекса и работното дърво [y,"
"n,q,a,d%s,?]? "
-#: add-patch.c:144 add-patch.c:187 git-add--interactive.perl:1454
+#: add-patch.c:145 add-patch.c:188 git-add--interactive.perl:1454
#, c-format, perl-format
msgid "Discard deletion from index and worktree [y,n,q,a,d%s,?]? "
msgstr ""
"Премахване на изтриването от индекса и работното дърво [y,n,q,a,d%s,?]? "
-#: add-patch.c:145 add-patch.c:188 git-add--interactive.perl:1455
+#: add-patch.c:146 add-patch.c:189 git-add--interactive.perl:1455
#, c-format, perl-format
msgid "Discard this hunk from index and worktree [y,n,q,a,d%s,?]? "
msgstr "Премахване на парчето от индекса и работното дърво [y,n,q,a,d%s,?]? "
-#: add-patch.c:150
+#: add-patch.c:151
msgid ""
"y - discard this hunk from index and worktree\n"
"n - do not discard this hunk from index and worktree\n"
@@ -611,25 +612,25 @@ msgstr ""
"d — без премахване на това и всички следващи парчета от файла от индекса и "
"работното дърво\n"
-#: add-patch.c:164 add-patch.c:207 git-add--interactive.perl:1458
+#: add-patch.c:165 add-patch.c:208 git-add--interactive.perl:1458
#, c-format, perl-format
msgid "Apply mode change to index and worktree [y,n,q,a,d%s,?]? "
msgstr ""
"Прилагане на промяната в правата за достъп от индекса и работното дърво [y,n,"
"q,a,d%s,?]? "
-#: add-patch.c:165 add-patch.c:208 git-add--interactive.perl:1459
+#: add-patch.c:166 add-patch.c:209 git-add--interactive.perl:1459
#, c-format, perl-format
msgid "Apply deletion to index and worktree [y,n,q,a,d%s,?]? "
msgstr ""
"Прилагане на изтриването от индекса и работното дърво [y,n,q,a,d%s,?]? "
-#: add-patch.c:166 add-patch.c:209 git-add--interactive.perl:1460
+#: add-patch.c:167 add-patch.c:210 git-add--interactive.perl:1460
#, c-format, perl-format
msgid "Apply this hunk to index and worktree [y,n,q,a,d%s,?]? "
msgstr "Прилагане на парчето от индекса и работното дърво [y,n,q,a,d%s,?]? "
-#: add-patch.c:171
+#: add-patch.c:172
msgid ""
"y - apply this hunk to index and worktree\n"
"n - do not apply this hunk to index and worktree\n"
@@ -646,7 +647,7 @@ msgstr ""
"d — без прилагане на това и всички следващи парчета от файла от индекса и "
"работното дърво\n"
-#: add-patch.c:214
+#: add-patch.c:215
msgid ""
"y - apply this hunk to worktree\n"
"n - do not apply this hunk to worktree\n"
@@ -660,34 +661,34 @@ msgstr ""
"a — прилагане на това и всички следващи парчета от файла\n"
"d — без прилагане на това и всички следващи парчета от файла\n"
-#: add-patch.c:318
+#: add-patch.c:319
#, c-format
msgid "could not parse hunk header '%.*s'"
msgstr "заглавната част на парчето „%.*s“ не може да се анализира"
-#: add-patch.c:337 add-patch.c:341
+#: add-patch.c:338 add-patch.c:342
#, c-format
msgid "could not parse colored hunk header '%.*s'"
msgstr "заглавната част на оцветеното парче „%.*s“ не може да се анализира"
-#: add-patch.c:395
+#: add-patch.c:396
msgid "could not parse diff"
msgstr "разликата не може да се анализира"
-#: add-patch.c:414
+#: add-patch.c:415
msgid "could not parse colored diff"
msgstr "оцветената разлика не може да се анализира"
-#: add-patch.c:428
+#: add-patch.c:429
#, c-format
msgid "failed to run '%s'"
msgstr "неуспешно изпълнение на „%s“"
-#: add-patch.c:587
+#: add-patch.c:588
msgid "mismatched output from interactive.diffFilter"
msgstr "изходът от „interactive.diffFilter“ не напасва"
-#: add-patch.c:588
+#: add-patch.c:589
msgid ""
"Your filter must maintain a one-to-one correspondence\n"
"between its input and output lines."
@@ -695,7 +696,7 @@ msgstr ""
"Обработените редове на изхода на ползвания филтър, трябва\n"
"да се отнасят едно към едно спрямо редовете на входа."
-#: add-patch.c:761
+#: add-patch.c:762
#, c-format
msgid ""
"expected context line #%d in\n"
@@ -704,7 +705,7 @@ msgstr ""
"очаква се ред №%d от контекста в\n"
"%.*s"
-#: add-patch.c:776
+#: add-patch.c:777
#, c-format
msgid ""
"hunks do not overlap:\n"
@@ -717,11 +718,11 @@ msgstr ""
" не завършва с:\n"
"%.*s"
-#: add-patch.c:1052 git-add--interactive.perl:1112
+#: add-patch.c:1053 git-add--interactive.perl:1112
msgid "Manual hunk edit mode -- see bottom for a quick guide.\n"
msgstr "Ръчно редактиране на парчета код — отдолу има подсказка.\n"
-#: add-patch.c:1056
+#: add-patch.c:1057
#, c-format
msgid ""
"---\n"
@@ -736,7 +737,7 @@ msgstr ""
"Редовете, които започват с „%c“ ще бъдат пропуснати.\n"
#. TRANSLATORS: 'it' refers to the patch mentioned in the previous messages.
-#: add-patch.c:1070 git-add--interactive.perl:1126
+#: add-patch.c:1071 git-add--interactive.perl:1126
msgid ""
"If it does not apply cleanly, you will be given an opportunity to\n"
"edit again. If all lines of the hunk are removed, then the edit is\n"
@@ -746,11 +747,11 @@ msgstr ""
"изтриете всички редове от парчето код, то ще бъде оставено непроменено, а\n"
"редактирането — отказано.\n"
-#: add-patch.c:1103
+#: add-patch.c:1104
msgid "could not parse hunk header"
msgstr "заглавната част парчето не може да се анализира"
-#: add-patch.c:1148
+#: add-patch.c:1149
msgid "'git apply --cached' failed"
msgstr "неуспешно изпълнение на „git apply --cached“"
@@ -874,37 +875,47 @@ msgstr "Това парче не може да бъде редактирано"
msgid "'git apply' failed"
msgstr "неуспешно изпълнение на „git apply“"
-#: advice.c:115
+#: advice.c:140
+#, c-format
+msgid ""
+"\n"
+"Disable this message with \"git config advice.%s false\""
+msgstr ""
+"\n"
+"За да изключите това предупреждение, изпълнете:\n"
+" git config advice.%s false"
+
+#: advice.c:156
#, c-format
msgid "%shint: %.*s%s\n"
msgstr "%sподсказка: %.*s%s\n"
-#: advice.c:168
+#: advice.c:247
msgid "Cherry-picking is not possible because you have unmerged files."
msgstr "Отбирането на подавания е блокирано от неслети файлове."
-#: advice.c:170
+#: advice.c:249
msgid "Committing is not possible because you have unmerged files."
msgstr "Подаването е блокирано от неслети файлове."
-#: advice.c:172
+#: advice.c:251
msgid "Merging is not possible because you have unmerged files."
msgstr "Сливането е блокирано от неслети файлове."
-#: advice.c:174
+#: advice.c:253
msgid "Pulling is not possible because you have unmerged files."
msgstr "Издърпването е блокирано от неслети файлове."
-#: advice.c:176
+#: advice.c:255
msgid "Reverting is not possible because you have unmerged files."
msgstr "Отмяната е блокирана от неслети файлове."
-#: advice.c:178
+#: advice.c:257
#, c-format
msgid "It is not possible to %s because you have unmerged files."
msgstr "Действието „%s“ е блокирано от неслети файлове."
-#: advice.c:186
+#: advice.c:265
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."
@@ -912,23 +923,23 @@ msgstr ""
"Редактирайте ги в работното дърво, и тогава ползвайте „git add/rm ФАЙЛ“,\n"
"за да отбележите коригирането им. След това извършете подаването."
-#: advice.c:194
+#: advice.c:273
msgid "Exiting because of an unresolved conflict."
msgstr "Изход от програмата заради некоригиран конфликт."
-#: advice.c:199 builtin/merge.c:1335
+#: advice.c:278 builtin/merge.c:1353
msgid "You have not concluded your merge (MERGE_HEAD exists)."
msgstr "Не сте завършили сливане. (Указателят „MERGE_HEAD“ съществува)."
-#: advice.c:201
+#: advice.c:280
msgid "Please, commit your changes before merging."
msgstr "Промените трябва да се подадат преди сливане."
-#: advice.c:202
+#: advice.c:281
msgid "Exiting because of unfinished merge."
msgstr "Изход от програмата заради незавършено сливане."
-#: advice.c:208
+#: advice.c:287
#, c-format
msgid ""
"Note: switching to '%s'.\n"
@@ -1232,7 +1243,7 @@ msgstr "неуспешно прилагане на кръпка: „%s:%ld“"
msgid "cannot checkout %s"
msgstr "„%s“ не може да се изтегли"
-#: apply.c:3405 apply.c:3416 apply.c:3462 midx.c:61 setup.c:298
+#: apply.c:3405 apply.c:3416 apply.c:3462 midx.c:61 setup.c:308
#, c-format
msgid "failed to read %s"
msgstr "файлът „%s“ не може да бъде прочетен"
@@ -1433,7 +1444,7 @@ msgstr[1] "Прилагане на кръпката „%%s“ с %d отхвър
msgid "truncating .rej filename to %.*s.rej"
msgstr "съкращаване на името на файла с отхвърлените парчета на „ %.*s.rej“"
-#: apply.c:4561 builtin/fetch.c:901 builtin/fetch.c:1201
+#: apply.c:4561 builtin/fetch.c:902 builtin/fetch.c:1195
#, c-format
msgid "cannot open %s"
msgstr "„%s“ не може да бъде отворен"
@@ -1501,7 +1512,7 @@ msgstr "без прилагане на промените напасващи н
msgid "apply changes matching the given path"
msgstr "прилагане на промените напасващи на дадения път"
-#: apply.c:4973 builtin/am.c:2260
+#: apply.c:4973 builtin/am.c:2259
msgid "num"
msgstr "БРОЙ"
@@ -1560,7 +1571,7 @@ msgid "build a temporary index based on embedded index information"
msgstr ""
"създаване на временен индекс на база на включената информация за индекса"
-#: apply.c:5005 builtin/checkout-index.c:173 builtin/ls-files.c:524
+#: apply.c:5005 builtin/checkout-index.c:173 builtin/ls-files.c:525
msgid "paths are separated with NUL character"
msgstr "разделяне на пътищата с нулевия знак „NUL“"
@@ -1568,9 +1579,9 @@ msgstr "разделяне на пътищата с нулевия знак „N
msgid "ensure at least <n> lines of context match"
msgstr "да се осигури контекст от поне такъв БРОЙ съвпадащи редове"
-#: apply.c:5008 builtin/am.c:2239 builtin/interpret-trailers.c:98
+#: apply.c:5008 builtin/am.c:2238 builtin/interpret-trailers.c:98
#: builtin/interpret-trailers.c:100 builtin/interpret-trailers.c:102
-#: builtin/pack-objects.c:3457 builtin/rebase.c:1508
+#: builtin/pack-objects.c:3458 builtin/rebase.c:1332
msgid "action"
msgstr "действие"
@@ -1600,8 +1611,8 @@ msgid "allow overlapping hunks"
msgstr "позволяване на застъпващи се парчета"
#: apply.c:5025 builtin/add.c:323 builtin/check-ignore.c:22
-#: builtin/commit.c:1360 builtin/count-objects.c:98 builtin/fsck.c:774
-#: builtin/log.c:2166 builtin/mv.c:123 builtin/read-tree.c:128
+#: builtin/commit.c:1366 builtin/count-objects.c:98 builtin/fsck.c:775
+#: builtin/log.c:2186 builtin/mv.c:123 builtin/read-tree.c:128
msgid "be verbose"
msgstr "повече подробности"
@@ -1613,7 +1624,7 @@ msgstr "пренебрегване на неправилно липсващ зн
msgid "do not trust the line counts in the hunk headers"
msgstr "без доверяване на номерата на редовете в заглавните части на парчетата"
-#: apply.c:5032 builtin/am.c:2248
+#: apply.c:5032 builtin/am.c:2247
msgid "root"
msgstr "НАЧАЛНА_ДИРЕКТОРИЯ"
@@ -1621,6 +1632,55 @@ msgstr "НАЧАЛНА_ДИРЕКТОРИЯ"
msgid "prepend <root> to all filenames"
msgstr "добавяне на тази НАЧАЛНА_ДИРЕКТОРИЯ към имената на всички файлове"
+#: archive-tar.c:125 archive-zip.c:351
+#, c-format
+msgid "cannot stream blob %s"
+msgstr "обектът-BLOB „%s“ не може да бъде обработен"
+
+#: archive-tar.c:266 archive-zip.c:369
+#, c-format
+msgid "unsupported file mode: 0%o (SHA1: %s)"
+msgstr "неподдържани права за достъп до файл: 0%o (SHA1: %s)"
+
+#: archive-tar.c:293 archive-zip.c:359
+#, c-format
+msgid "cannot read %s"
+msgstr "обектът „%s“ не може да бъде прочетен"
+
+#: archive-tar.c:465
+#, c-format
+msgid "unable to start '%s' filter"
+msgstr "филтърът „%s“ не може да бъде стартиран"
+
+#: archive-tar.c:468
+msgid "unable to redirect descriptor"
+msgstr "дескрипторът не може да бъде пренасочен"
+
+#: archive-tar.c:475
+#, c-format
+msgid "'%s' filter reported error"
+msgstr "филтърът „%s“ върна грешка"
+
+#: archive-zip.c:319
+#, c-format
+msgid "path is not valid UTF-8: %s"
+msgstr "пътят не е правилно кодиран в UTF-8: %s"
+
+#: archive-zip.c:323
+#, c-format
+msgid "path too long (%d chars, SHA1: %s): %s"
+msgstr "твърде дълъг път (%d знака, SHA1: %s): %s"
+
+#: archive-zip.c:480 builtin/pack-objects.c:232 builtin/pack-objects.c:235
+#, c-format
+msgid "deflate error (%d)"
+msgstr "грешка при декомпресиране с „deflate“ (%d)"
+
+#: archive-zip.c:615
+#, c-format
+msgid "timestamp too large for this system: %<PRIuMAX>"
+msgstr "времевата стойност е твърде голяма за тази система: %<PRIuMAX>"
+
#: archive.c:14
msgid "git archive [<options>] <tree-ish> [<path>...]"
msgstr "git archive [ОПЦИЯ…] УКАЗАТЕЛ_КЪМ_ДЪРВО [ПЪТ…]"
@@ -1640,172 +1700,123 @@ msgstr ""
msgid "git archive --remote <repo> [--exec <cmd>] --list"
msgstr "git archive --remote ХРАНИЛИЩЕ [--exec КОМАНДА] --list"
-#: archive.c:372 builtin/add.c:181 builtin/add.c:588 builtin/rm.c:315
+#: archive.c:377 builtin/add.c:181 builtin/add.c:588 builtin/rm.c:315
#, c-format
msgid "pathspec '%s' did not match any files"
msgstr "пътят „%s“ не съвпада с никой файл"
-#: archive.c:396
+#: archive.c:401
#, c-format
msgid "no such ref: %.*s"
msgstr "такъв указател няма: %.*s"
-#: archive.c:401
+#: archive.c:407
#, c-format
msgid "not a valid object name: %s"
msgstr "неправилно име на обект: „%s“"
-#: archive.c:414
+#: archive.c:420
#, c-format
msgid "not a tree object: %s"
msgstr "не е обект-дърво: %s"
-#: archive.c:426
+#: archive.c:432
msgid "current working directory is untracked"
msgstr "текущата работна директория не е следена"
-#: archive.c:457
+#: archive.c:464
msgid "fmt"
msgstr "ФОРМАТ"
-#: archive.c:457
+#: archive.c:464
msgid "archive format"
msgstr "ФОРМАТ на архива"
-#: archive.c:458 builtin/log.c:1653
+#: archive.c:465 builtin/log.c:1674
msgid "prefix"
msgstr "ПРЕФИКС"
-#: archive.c:459
+#: archive.c:466
msgid "prepend prefix to each pathname in the archive"
msgstr "добавяне на този ПРЕФИКС към всеки път в архива"
-#: archive.c:460 builtin/blame.c:861 builtin/blame.c:865 builtin/blame.c:866
+#: archive.c:467 builtin/blame.c:861 builtin/blame.c:865 builtin/blame.c:866
#: builtin/commit-tree.c:117 builtin/config.c:130 builtin/fast-export.c:1162
-#: builtin/fast-export.c:1164 builtin/fast-export.c:1168 builtin/grep.c:887
-#: builtin/hash-object.c:105 builtin/ls-files.c:560 builtin/ls-files.c:563
+#: builtin/fast-export.c:1164 builtin/fast-export.c:1168 builtin/grep.c:907
+#: builtin/hash-object.c:105 builtin/ls-files.c:561 builtin/ls-files.c:564
#: builtin/notes.c:412 builtin/notes.c:578 builtin/read-tree.c:123
#: parse-options.h:190
msgid "file"
msgstr "ФАЙЛ"
-#: archive.c:461 builtin/archive.c:90
+#: archive.c:468 builtin/archive.c:90
msgid "write the archive to this file"
msgstr "запазване на архива в този ФАЙЛ"
-#: archive.c:463
+#: archive.c:470
msgid "read .gitattributes in working directory"
msgstr "изчитане на „.gitattributes“ в работната директория"
-#: archive.c:464
+#: archive.c:471
msgid "report archived files on stderr"
msgstr "извеждане на архивираните файлове на стандартната грешка"
-#: archive.c:465
+#: archive.c:472
msgid "store only"
msgstr "съхранение без компресиране"
-#: archive.c:466
+#: archive.c:473
msgid "compress faster"
msgstr "бързо компресиране"
-#: archive.c:474
+#: archive.c:481
msgid "compress better"
msgstr "добро компресиране"
-#: archive.c:477
+#: archive.c:484
msgid "list supported archive formats"
msgstr "извеждане на списъка с поддържаните формати"
-#: archive.c:479 builtin/archive.c:91 builtin/clone.c:113 builtin/clone.c:116
+#: archive.c:486 builtin/archive.c:91 builtin/clone.c:113 builtin/clone.c:116
#: builtin/submodule--helper.c:1406 builtin/submodule--helper.c:1911
msgid "repo"
msgstr "хранилище"
-#: archive.c:480 builtin/archive.c:92
+#: archive.c:487 builtin/archive.c:92
msgid "retrieve the archive from remote repository <repo>"
msgstr "изтегляне на архива от отдалеченото ХРАНИЛИЩЕ"
-#: archive.c:481 builtin/archive.c:93 builtin/difftool.c:715
+#: archive.c:488 builtin/archive.c:93 builtin/difftool.c:715
#: builtin/notes.c:498
msgid "command"
msgstr "команда"
-#: archive.c:482 builtin/archive.c:94
+#: archive.c:489 builtin/archive.c:94
msgid "path to the remote git-upload-archive command"
msgstr "път към отдалечената команда „git-upload-archive“"
-#: archive.c:489
+#: archive.c:496
msgid "Unexpected option --remote"
msgstr "Неочаквана опция „--remote“"
-#: archive.c:491
+#: archive.c:498
msgid "Option --exec can only be used together with --remote"
msgstr "Опцията „--exec“ изисква „--remote“"
-#: archive.c:493
+#: archive.c:500
msgid "Unexpected option --output"
msgstr "Неочаквана опция „--output“"
-#: archive.c:515
+#: archive.c:522
#, c-format
msgid "Unknown archive format '%s'"
msgstr "Непознат формат на архив: „%s“"
-#: archive.c:522
+#: archive.c:529
#, c-format
msgid "Argument not supported for format '%s': -%d"
msgstr "Аргументът не се поддържа за форма̀та „%s“: -%d"
-#: archive-tar.c:125 archive-zip.c:351
-#, c-format
-msgid "cannot stream blob %s"
-msgstr "обектът-BLOB „%s“ не може да бъде обработен"
-
-#: archive-tar.c:266 archive-zip.c:369
-#, c-format
-msgid "unsupported file mode: 0%o (SHA1: %s)"
-msgstr "неподдържани права за достъп до файл: 0%o (SHA1: %s)"
-
-#: archive-tar.c:293 archive-zip.c:359
-#, c-format
-msgid "cannot read %s"
-msgstr "обектът „%s“ не може да бъде прочетен"
-
-#: archive-tar.c:465
-#, c-format
-msgid "unable to start '%s' filter"
-msgstr "филтърът „%s“ не може да бъде стартиран"
-
-#: archive-tar.c:468
-msgid "unable to redirect descriptor"
-msgstr "дескрипторът не може да бъде пренасочен"
-
-#: archive-tar.c:475
-#, c-format
-msgid "'%s' filter reported error"
-msgstr "филтърът „%s“ върна грешка"
-
-#: archive-zip.c:319
-#, c-format
-msgid "path is not valid UTF-8: %s"
-msgstr "пътят не е правилно кодиран в UTF-8: %s"
-
-#: archive-zip.c:323
-#, c-format
-msgid "path too long (%d chars, SHA1: %s): %s"
-msgstr "твърде дълъг път (%d знака, SHA1: %s): %s"
-
-#: archive-zip.c:480 builtin/pack-objects.c:231 builtin/pack-objects.c:234
-#, c-format
-msgid "deflate error (%d)"
-msgstr "грешка при декомпресиране с „deflate“ (%d)"
-
-#: archive-zip.c:615
-#, c-format
-msgid "timestamp too large for this system: %<PRIuMAX>"
-msgstr "времевата стойност е твърде голяма за тази система: %<PRIuMAX>"
-
#: attr.c:212
#, c-format
msgid "%.*s is not a valid attribute name"
@@ -1898,12 +1909,12 @@ msgstr "Двоично търсене: трябва да се провери б
msgid "a %s revision is needed"
msgstr "необходима е версия „%s“"
-#: bisect.c:920 builtin/notes.c:177 builtin/tag.c:254
+#: bisect.c:920 builtin/notes.c:177 builtin/tag.c:255
#, c-format
msgid "could not create file '%s'"
msgstr "файлът „%s“ не може да бъде създаден"
-#: bisect.c:966 builtin/merge.c:149
+#: bisect.c:966 builtin/merge.c:151
#, c-format
msgid "could not read file '%s'"
msgstr "файлът „%s“ не може да бъде прочетен"
@@ -1943,41 +1954,41 @@ msgid_plural "Bisecting: %d revisions left to test after this %s\n"
msgstr[0] "Двоично търсене: остава %d версия след тази %s\n"
msgstr[1] "Двоично търсене: остават %d версии след тази %s\n"
-#: blame.c:2700
+#: blame.c:2777
msgid "--contents and --reverse do not blend well."
msgstr "Опциите „--contents“ и „--reverse“ са несъвместими"
-#: blame.c:2714
+#: blame.c:2791
msgid "cannot use --contents with final commit object name"
msgstr "Опцията „--contents“ е несъвместима с име на обект от крайно подаване"
-#: blame.c:2735
+#: blame.c:2812
msgid "--reverse and --first-parent together require specified latest commit"
msgstr ""
"Едновременното задаване на опциите „--reverse“ и „--first-parent“ изисква "
"указването на крайно подаване"
-#: blame.c:2744 bundle.c:167 ref-filter.c:2203 remote.c:1942 sequencer.c:2006
-#: sequencer.c:4358 submodule.c:847 builtin/commit.c:1045 builtin/log.c:388
-#: builtin/log.c:991 builtin/log.c:1520 builtin/log.c:1925 builtin/log.c:2215
-#: builtin/merge.c:412 builtin/pack-objects.c:3275 builtin/pack-objects.c:3290
+#: blame.c:2821 bundle.c:167 ref-filter.c:2200 remote.c:1924 sequencer.c:2018
+#: sequencer.c:4466 submodule.c:847 builtin/commit.c:1047 builtin/log.c:405
+#: builtin/log.c:1012 builtin/log.c:1541 builtin/log.c:1945 builtin/log.c:2235
+#: builtin/merge.c:415 builtin/pack-objects.c:3276 builtin/pack-objects.c:3291
#: builtin/shortlog.c:192
msgid "revision walk setup failed"
msgstr "неуспешно настройване на обхождането на версиите"
-#: blame.c:2762
+#: blame.c:2839
msgid ""
"--reverse --first-parent together require range along first-parent chain"
msgstr ""
"Едновременното задаване на опциите „--reverse“ и „--first-parent“ изисква "
"указването на диапазон по веригата на първите наследници"
-#: blame.c:2773
+#: blame.c:2850
#, c-format
msgid "no such path %s in %s"
msgstr "няма път на име „%s“ в „%s“"
-#: blame.c:2784
+#: blame.c:2861
#, c-format
msgid "cannot read blob %s for path %s"
msgstr "обектът-BLOB „%s“ в пътя %s не може да бъде прочетен"
@@ -2110,12 +2121,12 @@ msgstr "Името на обект не е еднозначно: „%s“"
msgid "Not a valid branch point: '%s'."
msgstr "Неправилно място за начало на клон: „%s“"
-#: branch.c:364
+#: branch.c:365
#, c-format
msgid "'%s' is already checked out at '%s'"
msgstr "„%s“ вече е изтеглен в „%s“"
-#: branch.c:387
+#: branch.c:388
#, c-format
msgid "HEAD of working tree %s is not updated"
msgstr "Указателят „HEAD“ на работното дърво „%s“ не е обновен"
@@ -2130,8 +2141,8 @@ msgstr "Файлът „%s“ не изглежда да е пратка на gi
msgid "unrecognized header: %s%s (%d)"
msgstr "непозната заглавна част: %s%s (%d)"
-#: bundle.c:90 rerere.c:480 rerere.c:690 sequencer.c:2258 sequencer.c:3016
-#: builtin/commit.c:815
+#: bundle.c:90 rerere.c:480 rerere.c:690 sequencer.c:2270 sequencer.c:3034
+#: builtin/commit.c:814
#, c-format
msgid "could not open '%s'"
msgstr "„%s“ не може да се отвори"
@@ -2184,7 +2195,7 @@ msgid "ref '%s' is excluded by the rev-list options"
msgstr ""
"указателят „%s“ не е бил включен поради опциите зададени на „git rev-list“"
-#: bundle.c:461 builtin/log.c:203 builtin/log.c:1814 builtin/shortlog.c:306
+#: bundle.c:461 builtin/log.c:208 builtin/log.c:1834 builtin/shortlog.c:306
#, c-format
msgid "unrecognized argument: %s"
msgstr "непознат аргумент: %s"
@@ -2207,313 +2218,263 @@ msgstr "Командата „git index-pack“ не завърши успешн
msgid "invalid color value: %.*s"
msgstr "неправилна стойност за цвят: %.*s"
-#: commit.c:51 sequencer.c:2719 builtin/am.c:359 builtin/am.c:403
-#: builtin/am.c:1371 builtin/am.c:2014 builtin/replace.c:457
-#, c-format
-msgid "could not parse %s"
-msgstr "„%s“ не може да се анализира"
-
-#: commit.c:53
-#, c-format
-msgid "%s %s is not a commit!"
-msgstr "%s %s не е подаване!"
-
-#: commit.c:193
-msgid ""
-"Support for <GIT_DIR>/info/grafts is deprecated\n"
-"and will be removed in a future Git version.\n"
-"\n"
-"Please use \"git replace --convert-graft-file\"\n"
-"to convert the grafts into replace refs.\n"
-"\n"
-"Turn this message off by running\n"
-"\"git config advice.graftFileDeprecated false\""
-msgstr ""
-"Поддръжката на „<GIT_DIR>/info/grafts“ е остаряла.\n"
-"В бъдеща версия на Git ще бъде премахната.\n"
-"\n"
-"Може да преобразувате присадките в заместващи\n"
-"указатели с командата:\n"
-"\n"
-" git replace --convert-graft-file\n"
-"\n"
-"За да изключите това съобщение, изпълнете:\n"
-"\n"
-" git config advice.graftFileDeprecated false"
-
-#: commit.c:1153
-#, c-format
-msgid "Commit %s has an untrusted GPG signature, allegedly by %s."
-msgstr ""
-"Подаването „%s“ е с недоверен подпис от GPG, който твърди, че е на „%s“."
-
-#: commit.c:1157
-#, c-format
-msgid "Commit %s has a bad GPG signature allegedly by %s."
-msgstr ""
-"Подаването „%s“ е с неправилен подпис от GPG, който твърди, че е на „%s“."
-
-#: commit.c:1160
-#, c-format
-msgid "Commit %s does not have a GPG signature."
-msgstr "Подаването „%s“ е без подпис от GPG."
-
-#: commit.c:1163
-#, c-format
-msgid "Commit %s has a good GPG signature by %s\n"
-msgstr "Подаването „%s“ е с коректен подпис от GPG на „%s“.\n"
-
-#: commit.c:1417
-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"
-
-#: commit-graph.c:122
+#: commit-graph.c:183
msgid "commit-graph file is too small"
msgstr "файлът с гра̀фа на подаванията е твърде малък"
-#: commit-graph.c:189
+#: commit-graph.c:248
#, c-format
msgid "commit-graph signature %X does not match signature %X"
msgstr "отпечатъкът на гра̀фа с подаванията %X не съвпада с %X"
-#: commit-graph.c:196
+#: commit-graph.c:255
#, c-format
msgid "commit-graph version %X does not match version %X"
msgstr "версията на гра̀фа с подаванията %X не съвпада с %X"
-#: commit-graph.c:203
+#: commit-graph.c:262
#, c-format
msgid "commit-graph hash version %X does not match version %X"
msgstr "версията на контролната сума на гра̀фа с подаванията %X не съвпада с %X"
-#: commit-graph.c:226
+#: commit-graph.c:284
msgid "commit-graph chunk lookup table entry missing; file may be incomplete"
msgstr ""
"записът в таблицата за откъси липсва, файлът за гра̀фа може да е непълен"
-#: commit-graph.c:237
+#: commit-graph.c:294
#, c-format
msgid "commit-graph improper chunk offset %08x%08x"
msgstr "неправилно отместване на откъс: %08x%08x"
-#: commit-graph.c:280
+#: commit-graph.c:362
#, c-format
msgid "commit-graph chunk id %08x appears multiple times"
msgstr "откъсът %08x се явява многократно"
-#: commit-graph.c:343
+#: commit-graph.c:436
msgid "commit-graph has no base graphs chunk"
msgstr "базовият откъс липсва в гра̀фа с подаванията"
-#: commit-graph.c:353
+#: commit-graph.c:446
msgid "commit-graph chain does not match"
msgstr "веригата на гра̀фа с подаванията не съвпада"
-#: commit-graph.c:401
+#: commit-graph.c:494
#, c-format
msgid "invalid commit-graph chain: line '%s' not a hash"
msgstr ""
"грешка във веригата на гра̀фа с подаванията: ред „%s“ не е контролна сума"
-#: commit-graph.c:425
+#: commit-graph.c:518
msgid "unable to find all commit-graph files"
msgstr "някои файлове на гра̀фа с подаванията не могат да бъдат открити"
-#: commit-graph.c:558 commit-graph.c:618
+#: commit-graph.c:651 commit-graph.c:711
msgid "invalid commit position. commit-graph is likely corrupt"
msgstr ""
"неправилна позиция на подаването. Вероятно графът с подаванията е повреден"
-#: commit-graph.c:579
+#: commit-graph.c:672
#, c-format
msgid "could not find commit %s"
msgstr "подаването „%s“ не може да бъде открито"
-#: commit-graph.c:852 builtin/am.c:1292
+#: commit-graph.c:948 builtin/am.c:1292
#, c-format
msgid "unable to parse commit %s"
msgstr "подаването не може да бъде анализирано: %s"
-#: commit-graph.c:1011 builtin/pack-objects.c:2782
+#: commit-graph.c:1096
+msgid "Writing changed paths Bloom filters index"
+msgstr "Запис на индекса за промените в пътищата следени от филтрите на Блум"
+
+#: commit-graph.c:1121
+msgid "Writing changed paths Bloom filters data"
+msgstr "Запис на данните за промените в пътищата следени от филтрите на Блум"
+
+#: commit-graph.c:1160 builtin/pack-objects.c:2783
#, c-format
msgid "unable to get type of object %s"
msgstr "видът на обекта „%s“ не може да бъде определен"
-#: commit-graph.c:1043
+#: commit-graph.c:1196
msgid "Loading known commits in commit graph"
msgstr "Зареждане на познатите подавания в гра̀фа с подаванията"
-#: commit-graph.c:1060
+#: commit-graph.c:1213
msgid "Expanding reachable commits in commit graph"
msgstr "Разширяване на достижимите подавания в гра̀фа"
-#: commit-graph.c:1079
+#: commit-graph.c:1233
msgid "Clearing commit marks in commit graph"
msgstr "Изчистване на отбелязванията на подаванията в гра̀фа с подаванията"
-#: commit-graph.c:1098
+#: commit-graph.c:1252
msgid "Computing commit graph generation numbers"
msgstr "Изчисляване на номерата на поколенията в гра̀фа с подаванията"
-#: commit-graph.c:1173
+#: commit-graph.c:1300
+msgid "Computing commit changed paths Bloom filters"
+msgstr "Изчисляване на филтрите на Блум на пътищата с промяна при подаването"
+
+#: commit-graph.c:1359
#, c-format
msgid "Finding commits for commit graph in %d pack"
msgid_plural "Finding commits for commit graph in %d packs"
msgstr[0] "Откриване на подаванията в гра̀фа в %d пакетен файл"
msgstr[1] "Откриване на подаванията в гра̀фа в %d пакетни файла"
-#: commit-graph.c:1186
+#: commit-graph.c:1372
#, c-format
msgid "error adding pack %s"
msgstr "грешка при добавяне на пакетен файл „%s“"
-#: commit-graph.c:1190
+#: commit-graph.c:1376
#, c-format
msgid "error opening index for %s"
msgstr "грешка при отваряне на индекса на „%s“"
-#: commit-graph.c:1214
+#: commit-graph.c:1405
#, c-format
msgid "Finding commits for commit graph from %d ref"
msgid_plural "Finding commits for commit graph from %d refs"
msgstr[0] "Откриване на подаванията в гра̀фа измежду %d указател"
msgstr[1] "Откриване на подаванията в гра̀фа измежду %d указатели"
-#: commit-graph.c:1234
+#: commit-graph.c:1426
#, c-format
msgid "invalid commit object id: %s"
msgstr "неправилен идентификатор на обект-подаване: „%s“"
-#: commit-graph.c:1249
+#: commit-graph.c:1442
msgid "Finding commits for commit graph among packed objects"
msgstr "Откриване на подаванията в гра̀фа измежду пакетираните обекти"
-#: commit-graph.c:1264
+#: commit-graph.c:1457
msgid "Counting distinct commits in commit graph"
msgstr "Преброяване на различните подавания в гра̀фа"
-#: commit-graph.c:1294
+#: commit-graph.c:1489
msgid "Finding extra edges in commit graph"
msgstr "Откриване на още върхове в гра̀фа с подаванията"
-#: commit-graph.c:1340
+#: commit-graph.c:1538
msgid "failed to write correct number of base graph ids"
msgstr "правилният брой на базовите идентификатори не може да се запише"
-#: commit-graph.c:1373 midx.c:814
+#: commit-graph.c:1572 midx.c:812
#, c-format
msgid "unable to create leading directories of %s"
msgstr "родителските директории на „%s“ не могат да бъдат създадени"
-#: commit-graph.c:1385 builtin/index-pack.c:306 builtin/repack.c:248
+#: commit-graph.c:1585
+msgid "unable to create temporary graph layer"
+msgstr "не може да бъде създаден временен слой за гра̀фа с подаванията"
+
+#: commit-graph.c:1590
#, c-format
-msgid "unable to create '%s'"
-msgstr "пакетният файл „%s“ не може да бъде създаден"
+msgid "unable to adjust shared permissions for '%s'"
+msgstr "правата за споделен достъп до „%s“ не могат да бъдат зададени"
-#: commit-graph.c:1445
+#: commit-graph.c:1667
#, c-format
msgid "Writing out commit graph in %d pass"
msgid_plural "Writing out commit graph in %d passes"
msgstr[0] "Запазване на гра̀фа с подаванията в %d пас"
msgstr[1] "Запазване на гра̀фа с подаванията в %d паса"
-#: commit-graph.c:1486
+#: commit-graph.c:1712
msgid "unable to open commit-graph chain file"
msgstr "файлът с веригата на гра̀фа с подаванията не може да се отвори"
-#: commit-graph.c:1498
+#: commit-graph.c:1728
msgid "failed to rename base commit-graph file"
msgstr "основният файл на гра̀фа с подаванията не може да бъде преименуван"
-#: commit-graph.c:1518
+#: commit-graph.c:1748
msgid "failed to rename temporary commit-graph file"
msgstr "временният файл на гра̀фа с подаванията не може да бъде преименуван"
-#: commit-graph.c:1631
+#: commit-graph.c:1874
msgid "Scanning merged commits"
msgstr "Търсене на подаванията със сливания"
-#: commit-graph.c:1642
+#: commit-graph.c:1885
#, c-format
msgid "unexpected duplicate commit id %s"
msgstr "неочакван, повтарящ се идентификатор на подаване: %s"
-#: commit-graph.c:1665
+#: commit-graph.c:1908
msgid "Merging commit-graph"
msgstr "Сливане на гра̀фа с подаванията"
-#: commit-graph.c:1844
+#: commit-graph.c:2096
#, c-format
msgid "the commit graph format cannot write %d commits"
msgstr "форматът на гра̀фа с подаванията не може да запише %d подавания"
-#: commit-graph.c:1855
+#: commit-graph.c:2107
msgid "too many commits to write graph"
msgstr "прекалено много подавания за записване на гра̀фа"
-#: commit-graph.c:1944
+#: commit-graph.c:2200
msgid "the commit-graph file has incorrect checksum and is likely corrupt"
msgstr "графът с подаванията е с грешна сума за проверка — вероятно е повреден"
-#: commit-graph.c:1954
+#: commit-graph.c:2210
#, c-format
msgid "commit-graph has incorrect OID order: %s then %s"
msgstr ""
"неправилна подредба на обектите по идентификатор в гра̀фа с подаванията: „%s“ "
"е преди „%s“, а не трябва"
-#: commit-graph.c:1964 commit-graph.c:1979
+#: commit-graph.c:2220 commit-graph.c:2235
#, c-format
msgid "commit-graph has incorrect fanout value: fanout[%d] = %u != %u"
msgstr ""
"неправилна стойност за откъс в гра̀фа с подаванията: fanout[%d] = %u, а "
"трябва да е %u"
-#: commit-graph.c:1971
+#: commit-graph.c:2227
#, c-format
msgid "failed to parse commit %s from commit-graph"
msgstr "подаване „%s“ в гра̀фа с подаванията не може да се анализира"
-#: commit-graph.c:1989
+#: commit-graph.c:2245
msgid "Verifying commits in commit graph"
msgstr "Проверка на подаванията в гра̀фа"
-#: commit-graph.c:2003
+#: commit-graph.c:2259
#, c-format
msgid "failed to parse commit %s from object database for commit-graph"
msgstr ""
"подаване „%s“ в базата от данни към гра̀фа с подаванията не може да се "
"анализира"
-#: commit-graph.c:2010
+#: commit-graph.c:2266
#, c-format
msgid "root tree OID for commit %s in commit-graph is %s != %s"
msgstr ""
"идентификаторът на обект за кореновото дърво за подаване „%s“ в гра̀фа с "
"подаванията е „%s“, а трябва да е „%s“"
-#: commit-graph.c:2020
+#: commit-graph.c:2276
#, c-format
msgid "commit-graph parent list for commit %s is too long"
msgstr "списъкът с родители на „%s“ в гра̀фа с подаванията е прекалено дълъг"
-#: commit-graph.c:2029
+#: commit-graph.c:2285
#, c-format
msgid "commit-graph parent for %s is %s != %s"
msgstr "родителят на „%s“ в гра̀фа с подаванията е „%s“, а трябва да е „%s“"
-#: commit-graph.c:2042
+#: commit-graph.c:2298
#, c-format
msgid "commit-graph parent list for commit %s terminates early"
msgstr "списъкът с родители на „%s“ в гра̀фа с подаванията е прекалено къс"
-#: commit-graph.c:2047
+#: commit-graph.c:2303
#, c-format
msgid ""
"commit-graph has generation number zero for commit %s, but non-zero elsewhere"
@@ -2521,7 +2482,7 @@ msgstr ""
"номерът на поколението на подаване „%s“ в гра̀фа с подаванията е 0, а другаде "
"не е"
-#: commit-graph.c:2051
+#: commit-graph.c:2307
#, c-format
msgid ""
"commit-graph has non-zero generation number for commit %s, but zero elsewhere"
@@ -2529,25 +2490,91 @@ msgstr ""
"номерът на поколението на подаване „%s“ в гра̀фа с подаванията не е 0, а "
"другаде е"
-#: commit-graph.c:2066
+#: commit-graph.c:2322
#, c-format
msgid "commit-graph generation for commit %s is %u != %u"
msgstr ""
"номерът на поколението на подаване „%s“ в гра̀фа с подаванията е %u, а "
"другаде е %u"
-#: commit-graph.c:2072
+#: commit-graph.c:2328
#, c-format
msgid "commit date for commit %s in commit-graph is %<PRIuMAX> != %<PRIuMAX>"
msgstr ""
"датата на подаване на „%s“ в гра̀фа с подаванията е %<PRIuMAX>, а трябва да е "
"%<PRIuMAX>"
+#: commit.c:52 sequencer.c:2739 builtin/am.c:359 builtin/am.c:403
+#: builtin/am.c:1371 builtin/am.c:2013 builtin/replace.c:457
+#, c-format
+msgid "could not parse %s"
+msgstr "„%s“ не може да се анализира"
+
+#: commit.c:54
+#, c-format
+msgid "%s %s is not a commit!"
+msgstr "%s %s не е подаване!"
+
+#: commit.c:194
+msgid ""
+"Support for <GIT_DIR>/info/grafts is deprecated\n"
+"and will be removed in a future Git version.\n"
+"\n"
+"Please use \"git replace --convert-graft-file\"\n"
+"to convert the grafts into replace refs.\n"
+"\n"
+"Turn this message off by running\n"
+"\"git config advice.graftFileDeprecated false\""
+msgstr ""
+"Поддръжката на „<GIT_DIR>/info/grafts“ е остаряла.\n"
+"В бъдеща версия на Git ще бъде премахната.\n"
+"\n"
+"Може да преобразувате присадките в заместващи\n"
+"указатели с командата:\n"
+"\n"
+" git replace --convert-graft-file\n"
+"\n"
+"За да изключите това съобщение, изпълнете:\n"
+"\n"
+" git config advice.graftFileDeprecated false"
+
+#: commit.c:1168
+#, c-format
+msgid "Commit %s has an untrusted GPG signature, allegedly by %s."
+msgstr ""
+"Подаването „%s“ е с недоверен подпис от GPG, който твърди, че е на „%s“."
+
+#: commit.c:1172
+#, c-format
+msgid "Commit %s has a bad GPG signature allegedly by %s."
+msgstr ""
+"Подаването „%s“ е с неправилен подпис от GPG, който твърди, че е на „%s“."
+
+#: commit.c:1175
+#, c-format
+msgid "Commit %s does not have a GPG signature."
+msgstr "Подаването „%s“ е без подпис от GPG."
+
+#: commit.c:1178
+#, c-format
+msgid "Commit %s has a good GPG signature by %s\n"
+msgstr "Подаването „%s“ е с коректен подпис от GPG на „%s“.\n"
+
+#: commit.c:1432
+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:124
+#: config.c:125
#, c-format
msgid ""
"exceeded maximum include depth (%d) while including\n"
@@ -2562,162 +2589,162 @@ msgstr ""
" %s\n"
"Това може да се дължи на зацикляне при вмъкването."
-#: config.c:140
+#: config.c:141
#, c-format
msgid "could not expand include path '%s'"
msgstr "пътят за вмъкване „%s“не може да бъде разширен"
-#: config.c:151
+#: config.c:152
msgid "relative config includes must come from files"
msgstr "относителните вмъквания на конфигурации трябва да идват от файлове"
-#: config.c:197
+#: config.c:198
msgid "relative config include conditionals must come from files"
msgstr "относителните условни изрази за вмъкване трябва да идват от файлове"
-#: config.c:376
+#: config.c:378
#, c-format
msgid "key does not contain a section: %s"
msgstr "ключът не съдържа раздел: „%s“"
-#: config.c:382
+#: config.c:384
#, c-format
msgid "key does not contain variable name: %s"
msgstr "ключът не съдържа име на променлива: „%s“"
-#: config.c:406 sequencer.c:2444
+#: config.c:408 sequencer.c:2456
#, c-format
msgid "invalid key: %s"
msgstr "неправилен ключ: „%s“"
-#: config.c:412
+#: config.c:414
#, c-format
msgid "invalid key (newline): %s"
msgstr "неправилен ключ (нов ред): „%s“"
-#: config.c:448 config.c:460
+#: config.c:450 config.c:462
#, c-format
msgid "bogus config parameter: %s"
msgstr "неправилен конфигурационен параметър: „%s“"
-#: config.c:495
+#: config.c:497
#, c-format
msgid "bogus format in %s"
msgstr "неправилен формат в „%s“"
-#: config.c:821
+#: config.c:836
#, c-format
msgid "bad config line %d in blob %s"
msgstr "неправилен ред за настройки %d в BLOB „%s“"
-#: config.c:825
+#: config.c:840
#, c-format
msgid "bad config line %d in file %s"
msgstr "неправилен ред за настройки %d във файла „%s“"
-#: config.c:829
+#: config.c:844
#, c-format
msgid "bad config line %d in standard input"
msgstr "неправилен ред за настройки %d на стандартния вход"
-#: config.c:833
+#: config.c:848
#, c-format
msgid "bad config line %d in submodule-blob %s"
msgstr "неправилен ред за настройки %d в BLOB за подмодул „%s“"
-#: config.c:837
+#: config.c:852
#, c-format
msgid "bad config line %d in command line %s"
msgstr "неправилен ред за настройки %d на командния ред „%s“"
-#: config.c:841
+#: config.c:856
#, c-format
msgid "bad config line %d in %s"
msgstr "неправилен ред за настройки %d в „%s“"
-#: config.c:978
+#: config.c:993
msgid "out of range"
msgstr "извън диапазона"
-#: config.c:978
+#: config.c:993
msgid "invalid unit"
msgstr "неправилна мерна единица"
-#: config.c:979
+#: config.c:994
#, c-format
msgid "bad numeric config value '%s' for '%s': %s"
msgstr "неправилна числова стойност „%s“ за „%s“: %s"
-#: config.c:998
+#: config.c:1013
#, c-format
msgid "bad numeric config value '%s' for '%s' in blob %s: %s"
msgstr "неправилна числова стойност „%s“ за „%s“ в BLOB „%s“: %s"
-#: config.c:1001
+#: config.c:1016
#, c-format
msgid "bad numeric config value '%s' for '%s' in file %s: %s"
msgstr "неправилна числова стойност „%s“ за „%s“ във файла „%s“: %s"
-#: config.c:1004
+#: config.c:1019
#, c-format
msgid "bad numeric config value '%s' for '%s' in standard input: %s"
msgstr "неправилна числова стойност „%s“ за „%s“ на стандартния вход: %s"
-#: config.c:1007
+#: config.c:1022
#, c-format
msgid "bad numeric config value '%s' for '%s' in submodule-blob %s: %s"
msgstr "неправилна числова стойност „%s“ за „%s“ в BLOB от подмодул „%s“: %s"
-#: config.c:1010
+#: config.c:1025
#, c-format
msgid "bad numeric config value '%s' for '%s' in command line %s: %s"
msgstr "неправилна числова стойност „%s“ за „%s“ на командния ред „%s“: %s"
-#: config.c:1013
+#: config.c:1028
#, c-format
msgid "bad numeric config value '%s' for '%s' in %s: %s"
msgstr "неправилна числова стойност „%s“ за „%s“ в %s: %s"
-#: config.c:1108
+#: config.c:1123
#, c-format
msgid "failed to expand user dir in: '%s'"
msgstr "домашната папка на потребителя не може да бъде открита: „%s“"
-#: config.c:1117
+#: config.c:1132
#, c-format
msgid "'%s' for '%s' is not a valid timestamp"
msgstr "„%s“ не е правилна стойност за време за „%s“"
-#: config.c:1208
+#: config.c:1223
#, c-format
msgid "abbrev length out of range: %d"
msgstr "дължината на съкращаване е извън интервала ([4; 40]): %d"
-#: config.c:1222 config.c:1233
+#: config.c:1237 config.c:1248
#, c-format
msgid "bad zlib compression level %d"
msgstr "неправилно ниво на компресиране: %d"
-#: config.c:1325
+#: config.c:1340
msgid "core.commentChar should only be one character"
msgstr "настройката „core.commentChar“ трябва да е само един знак"
-#: config.c:1358
+#: config.c:1373
#, c-format
msgid "invalid mode for object creation: %s"
msgstr "неправилен режим за създаването на обекти: %s"
-#: config.c:1430
+#: config.c:1445
#, c-format
msgid "malformed value for %s"
msgstr "неправилна стойност за „%s“"
-#: config.c:1456
+#: config.c:1471
#, c-format
msgid "malformed value for %s: %s"
msgstr "неправилна стойност за „%s“: „%s“"
-#: config.c:1457
+#: config.c:1472
msgid "must be one of nothing, matching, simple, upstream or current"
msgstr ""
"трябва да е една от следните стойности: „nothing“ (без изтласкване при липса "
@@ -2725,132 +2752,132 @@ msgstr ""
"„simple“ (клонът със същото име, от който се издърпва), „upstream“ (клонът, "
"от който се издърпва) или „current“ (клонът със същото име)"
-#: config.c:1518 builtin/pack-objects.c:3541
+#: config.c:1533 builtin/pack-objects.c:3542
#, c-format
msgid "bad pack compression level %d"
msgstr "неправилно ниво на компресиране при пакетиране: %d"
-#: config.c:1639
+#: config.c:1655
#, c-format
msgid "unable to load config blob object '%s'"
msgstr "обектът-BLOB „%s“ с конфигурации не може да се зареди"
-#: config.c:1642
+#: config.c:1658
#, c-format
msgid "reference '%s' does not point to a blob"
msgstr "указателят „%s“ не сочи към обект-BLOB"
-#: config.c:1659
+#: config.c:1675
#, c-format
msgid "unable to resolve config blob '%s'"
msgstr "обектът-BLOB „%s“ с конфигурации не може да бъде открит"
-#: config.c:1689
+#: config.c:1705
#, c-format
msgid "failed to parse %s"
msgstr "„%s“ не може да бъде анализиран"
-#: config.c:1743
+#: config.c:1759
msgid "unable to parse command-line config"
msgstr "неправилни настройки от командния ред"
-#: config.c:2097
+#: config.c:2113
msgid "unknown error occurred while reading the configuration files"
msgstr "неочаквана грешка при изчитането на конфигурационните файлове"
-#: config.c:2267
+#: config.c:2283
#, c-format
msgid "Invalid %s: '%s'"
msgstr "Неправилен %s: „%s“"
-#: config.c:2312
+#: config.c:2328
#, c-format
msgid "splitIndex.maxPercentChange value '%d' should be between 0 and 100"
msgstr ""
"стойността на „splitIndex.maxPercentChange“ трябва да е между 1 и 100, а не "
"%d"
-#: config.c:2358
+#: config.c:2374
#, c-format
msgid "unable to parse '%s' from command-line config"
msgstr "неразпозната стойност „%s“ от командния ред"
-#: config.c:2360
+#: config.c:2376
#, c-format
msgid "bad config variable '%s' in file '%s' at line %d"
msgstr "неправилна настройка „%s“ във файла „%s“ на ред №%d"
-#: config.c:2441
+#: config.c:2457
#, c-format
msgid "invalid section name '%s'"
msgstr "неправилно име на раздел: „%s“"
-#: config.c:2473
+#: config.c:2489
#, c-format
msgid "%s has multiple values"
msgstr "зададени са няколко стойности за „%s“"
-#: config.c:2502
+#: config.c:2518
#, c-format
msgid "failed to write new configuration file %s"
msgstr "новият конфигурационен файл „%s“ не може да бъде запазен"
-#: config.c:2754 config.c:3078
+#: config.c:2770 config.c:3094
#, c-format
msgid "could not lock config file %s"
msgstr "конфигурационният файл „%s“ не може да бъде заключен"
-#: config.c:2765
+#: config.c:2781
#, c-format
msgid "opening %s"
msgstr "отваряне на „%s“"
-#: config.c:2800 builtin/config.c:344
+#: config.c:2816 builtin/config.c:344
#, c-format
msgid "invalid pattern: %s"
msgstr "неправилен шаблон: %s"
-#: config.c:2825
+#: config.c:2841
#, c-format
msgid "invalid config file %s"
msgstr "неправилен конфигурационен файл: „%s“"
-#: config.c:2838 config.c:3091
+#: config.c:2854 config.c:3107
#, c-format
msgid "fstat on %s failed"
msgstr "неуспешно изпълнение на „fstat“ върху „%s“"
-#: config.c:2849
+#: config.c:2865
#, c-format
msgid "unable to mmap '%s'"
msgstr "неуспешно изпълнение на „mmap“ върху „%s“"
-#: config.c:2858 config.c:3096
+#: config.c:2874 config.c:3112
#, c-format
msgid "chmod on %s failed"
msgstr "неуспешна смяна на права с „chmod“ върху „%s“"
-#: config.c:2943 config.c:3193
+#: config.c:2959 config.c:3209
#, c-format
msgid "could not write config file %s"
msgstr "конфигурационният файл „%s“ не може да бъде записан"
-#: config.c:2977
+#: config.c:2993
#, c-format
msgid "could not set '%s' to '%s'"
msgstr "„%s“ не може да се зададе да е „%s“"
-#: config.c:2979 builtin/remote.c:655 builtin/remote.c:849 builtin/remote.c:857
+#: config.c:2995 builtin/remote.c:655 builtin/remote.c:849 builtin/remote.c:857
#, c-format
msgid "could not unset '%s'"
msgstr "„%s“ не може да се премахне"
-#: config.c:3069
+#: config.c:3085
#, c-format
msgid "invalid section name: %s"
msgstr "неправилно име на раздел: %s"
-#: config.c:3236
+#: config.c:3252
#, c-format
msgid "missing value for '%s'"
msgstr "липсва стойност за „%s“"
@@ -2920,7 +2947,7 @@ msgstr "неправилен отговор на „ls-refs“: „%s“"
#: connect.c:445
msgid "expected flush after ref listing"
-msgstr "очакваше се изчистване на буферите след изброяването на указателите"
+msgstr "след изброяването на указателите се очаква изчистване на буферите"
#: connect.c:544
#, c-format
@@ -3019,19 +3046,19 @@ msgstr "необичайният път „%s“ е блокиран"
msgid "unable to fork"
msgstr "неуспешно създаване на процес"
-#: connected.c:98 builtin/fsck.c:208 builtin/prune.c:43
+#: connected.c:107 builtin/fsck.c:209 builtin/prune.c:45
msgid "Checking connectivity"
msgstr "Проверка на свързаността"
-#: connected.c:110
+#: connected.c:119
msgid "Could not run 'git rev-list'"
msgstr "Командата „git rev-list“ не може да бъде изпълнена."
-#: connected.c:130
+#: connected.c:139
msgid "failed write to rev-list"
msgstr "неуспешен запис на списъка с версиите"
-#: connected.c:137
+#: connected.c:146
msgid "failed to close rev-list's stdin"
msgstr "стандартният вход на списъка с версиите не може да бъде затворен"
@@ -3140,15 +3167,15 @@ msgstr "неуспешно четене от външния филтър „%s
msgid "external filter '%s' failed"
msgstr "неуспешно изпълнение на външния филтър „%s“"
-#: convert.c:839
+#: convert.c:840
msgid "unexpected filter type"
msgstr "неочакван вид филтър"
-#: convert.c:850
+#: convert.c:851
msgid "path name too long for external filter"
msgstr "пътят е прекалено дълъг за външен филтър"
-#: convert.c:924
+#: convert.c:943
#, c-format
msgid ""
"external filter '%s' is not available anymore although not all paths have "
@@ -3157,20 +3184,48 @@ msgstr ""
"външният филтър „%s“ вече не е наличен, въпреки че не всички пътища са "
"филтрирани"
-#: convert.c:1223
+#: convert.c:1243
msgid "true/false are no valid working-tree-encodings"
msgstr "„true“/„false“ не може да са кодирания на работното дърво"
-#: convert.c:1411 convert.c:1445
+#: convert.c:1431 convert.c:1465
#, c-format
msgid "%s: clean filter '%s' failed"
msgstr "%s: неуспешно изпълнение на декодиращ филтър „%s“"
-#: convert.c:1489
+#: convert.c:1511
#, c-format
msgid "%s: smudge filter %s failed"
msgstr "%s: неуспешно изпълнение на кодиращ филтър „%s“"
+#: credential.c:96
+#, c-format
+msgid "skipping credential lookup for key: credential.%s"
+msgstr "прескачане на търсенето на идентификация според ключа: „credential.%s“"
+
+#: credential.c:112
+msgid "refusing to work with credential missing host field"
+msgstr "адресът трябва задължително да съдържа хост"
+
+#: credential.c:114
+msgid "refusing to work with credential missing protocol field"
+msgstr "адресът трябва задължително да съдържа протокол"
+
+#: credential.c:396
+#, c-format
+msgid "url contains a newline in its %s component: %s"
+msgstr "адресът съдържа нов ред в частта за %s: %s"
+
+#: credential.c:440
+#, c-format
+msgid "url has no scheme: %s"
+msgstr "адресът е без схема: %s"
+
+#: credential.c:513
+#, c-format
+msgid "credential url cannot be parsed: %s"
+msgstr "адресът за идентификация не може да се анализира: „%s“"
+
#: date.c:138
msgid "in the future"
msgstr "в бъдещето"
@@ -3265,15 +3320,6 @@ msgstr ""
msgid "Marked %d islands, done.\n"
msgstr "Отбелязани са %d групи, работата приключи.\n"
-#: diffcore-order.c:24
-#, c-format
-msgid "failed to read orderfile '%s'"
-msgstr "файлът с подредбата на съответствията „%s“ не може да бъде прочетен"
-
-#: diffcore-rename.c:543
-msgid "Performing inexact rename detection"
-msgstr "Търсене на преименувания на обекти съчетани с промени"
-
#: diff-no-index.c:238
msgid "git diff --no-index [<options>] <path> <path>"
msgstr "git diff --no-index [ОПЦИЯ…] ПЪТ ПЪТ"
@@ -3342,38 +3388,38 @@ msgstr ""
"Грешки в настройката „diff.dirstat“:\n"
"%s"
-#: diff.c:4202
+#: diff.c:4238
#, c-format
msgid "external diff died, stopping at %s"
msgstr ""
"външната програма за разлики завърши неуспешно. Спиране на работата при „%s“"
-#: diff.c:4547
+#: diff.c:4583
msgid "--name-only, --name-status, --check and -s are mutually exclusive"
msgstr ""
"Опциите „--name-only“, „--name-status“, „--check“ и „-s“ са несъвместими "
"една с друга"
-#: diff.c:4550
+#: diff.c:4586
msgid "-G, -S and --find-object are mutually exclusive"
msgstr "Опциите „-G“, „-S“ и „--find-object“ са несъвместими една с друга"
-#: diff.c:4628
+#: diff.c:4664
msgid "--follow requires exactly one pathspec"
msgstr "Опцията „--follow“ изисква точно един път"
-#: diff.c:4676
+#: diff.c:4712
#, c-format
msgid "invalid --stat value: %s"
msgstr "неправилна стойност за „--stat“: %s"
-#: diff.c:4681 diff.c:4686 diff.c:4691 diff.c:4696 diff.c:5209
+#: diff.c:4717 diff.c:4722 diff.c:4727 diff.c:4732 diff.c:5245
#: parse-options.c:197 parse-options.c:201
#, c-format
msgid "%s expects a numerical value"
msgstr "опцията „%s“ очаква число за аргумент"
-#: diff.c:4713
+#: diff.c:4749
#, c-format
msgid ""
"Failed to parse --dirstat/-X option parameter:\n"
@@ -3382,44 +3428,44 @@ msgstr ""
"Неразпознат параметър към опцията „--dirstat/-X“:\n"
"%s"
-#: diff.c:4798
+#: diff.c:4834
#, c-format
msgid "unknown change class '%c' in --diff-filter=%s"
msgstr "непознат вид промяна: „%c“ в „--diff-filter=%s“"
-#: diff.c:4822
+#: diff.c:4858
#, c-format
msgid "unknown value after ws-error-highlight=%.*s"
msgstr "непозната стойност след „ws-error-highlight=%.*s“"
-#: diff.c:4836
+#: diff.c:4872
#, c-format
msgid "unable to resolve '%s'"
msgstr "„%s“ не може да се открие"
-#: diff.c:4886 diff.c:4892
+#: diff.c:4922 diff.c:4928
#, c-format
msgid "%s expects <n>/<m> form"
msgstr ""
"опцията „%s“ изисква стойности за МИНИМАЛЕН_%%_ПРОМЯНА_ЗА_ИЗТОЧНИК_/"
"МАКСИМАЛЕН_%%_ПРОМЯНА_ЗА_ЗАМЯНА от"
-#: diff.c:4904
+#: diff.c:4940
#, c-format
msgid "%s expects a character, got '%s'"
msgstr "опцията „%s“ изисква знак, а не: „%s“"
-#: diff.c:4925
+#: diff.c:4961
#, c-format
msgid "bad --color-moved argument: %s"
msgstr "неправилен аргумент за „--color-moved“: „%s“"
-#: diff.c:4944
+#: diff.c:4980
#, c-format
msgid "invalid mode '%s' in --color-moved-ws"
msgstr "неправилен режим „%s“ за „ --color-moved-ws“"
-#: diff.c:4984
+#: diff.c:5020
msgid ""
"option diff-algorithm accepts \"myers\", \"minimal\", \"patience\" and "
"\"histogram\""
@@ -3428,153 +3474,153 @@ msgstr ""
"Майерс), „minimal“ (минимизиране на разликите), „patience“ (пасианс) и "
"„histogram“ (хистограмен)"
-#: diff.c:5020 diff.c:5040
+#: diff.c:5056 diff.c:5076
#, c-format
msgid "invalid argument to %s"
msgstr "неправилен аргумент към „%s“"
-#: diff.c:5178
+#: diff.c:5214
#, c-format
msgid "failed to parse --submodule option parameter: '%s'"
msgstr "неразпознат параметър към опцията „--submodule“: „%s“"
-#: diff.c:5234
+#: diff.c:5270
#, c-format
msgid "bad --word-diff argument: %s"
msgstr "неправилен аргумент към „--word-diff“: „%s“"
-#: diff.c:5257
+#: diff.c:5293
msgid "Diff output format options"
msgstr "Формат на изхода за разликите"
-#: diff.c:5259 diff.c:5265
+#: diff.c:5295 diff.c:5301
msgid "generate patch"
msgstr "създаване на кръпки"
-#: diff.c:5262 builtin/log.c:173
+#: diff.c:5298 builtin/log.c:177
msgid "suppress diff output"
msgstr "без извеждане на разликите"
-#: diff.c:5267 diff.c:5381 diff.c:5388
+#: diff.c:5303 diff.c:5417 diff.c:5424
msgid "<n>"
msgstr "БРОЙ"
-#: diff.c:5268 diff.c:5271
+#: diff.c:5304 diff.c:5307
msgid "generate diffs with <n> lines context"
msgstr "файловете с разлики да са с контекст с такъв БРОЙ редове"
-#: diff.c:5273
+#: diff.c:5309
msgid "generate the diff in raw format"
msgstr "файловете с разлики да са в суров формат"
-#: diff.c:5276
+#: diff.c:5312
msgid "synonym for '-p --raw'"
msgstr "псевдоним на „-p --stat“"
-#: diff.c:5280
+#: diff.c:5316
msgid "synonym for '-p --stat'"
msgstr "псевдоним на „-p --stat“"
-#: diff.c:5284
+#: diff.c:5320
msgid "machine friendly --stat"
msgstr "„--stat“ във формат за четене от програма"
-#: diff.c:5287
+#: diff.c:5323
msgid "output only the last line of --stat"
msgstr "извеждане само на последния ред на „--stat“"
-#: diff.c:5289 diff.c:5297
+#: diff.c:5325 diff.c:5333
msgid "<param1,param2>..."
msgstr "ПАРАМЕТЪР_1, ПАРАМЕТЪР_2, …"
-#: diff.c:5290
+#: diff.c:5326
msgid ""
"output the distribution of relative amount of changes for each sub-directory"
msgstr "извеждане на разпределението на промените за всяка поддиректория"
-#: diff.c:5294
+#: diff.c:5330
msgid "synonym for --dirstat=cumulative"
msgstr "псевдоним на „--dirstat=cumulative“"
-#: diff.c:5298
+#: diff.c:5334
msgid "synonym for --dirstat=files,param1,param2..."
msgstr "псевдоним на „--dirstat=ФАЙЛОВЕ,ПАРАМЕТЪР_1,ПАРАМЕТЪР_2,…“"
-#: diff.c:5302
+#: diff.c:5338
msgid "warn if changes introduce conflict markers or whitespace errors"
msgstr ""
"предупреждаване, ако промените водят до маркери за конфликт или грешки в "
"празните знаци"
-#: diff.c:5305
+#: diff.c:5341
msgid "condensed summary such as creations, renames and mode changes"
msgstr ""
"съкратено резюме на създадените, преименуваните и файловете с промяна на "
"режима на достъп"
-#: diff.c:5308
+#: diff.c:5344
msgid "show only names of changed files"
msgstr "извеждане само на имената на променените файлове"
-#: diff.c:5311
+#: diff.c:5347
msgid "show only names and status of changed files"
msgstr "извеждане само на имената и статистиката за променените файлове"
-#: diff.c:5313
+#: diff.c:5349
msgid "<width>[,<name-width>[,<count>]]"
msgstr "ШИРОЧИНА[,ИМЕ-ШИРОЧИНА[,БРОЙ]]"
-#: diff.c:5314
+#: diff.c:5350
msgid "generate diffstat"
msgstr "извеждане на статистика за промените"
-#: diff.c:5316 diff.c:5319 diff.c:5322
+#: diff.c:5352 diff.c:5355 diff.c:5358
msgid "<width>"
msgstr "ШИРОЧИНА"
-#: diff.c:5317
+#: diff.c:5353
msgid "generate diffstat with a given width"
msgstr "статистика с такава ШИРОЧИНА за промените"
-#: diff.c:5320
+#: diff.c:5356
msgid "generate diffstat with a given name width"
msgstr "статистика за промените с такава ШИРОЧИНА на имената"
-#: diff.c:5323
+#: diff.c:5359
msgid "generate diffstat with a given graph width"
msgstr "статистика за промените с такава ШИРОЧИНА на гра̀фа"
-#: diff.c:5325
+#: diff.c:5361
msgid "<count>"
msgstr "БРОЙ"
-#: diff.c:5326
+#: diff.c:5362
msgid "generate diffstat with limited lines"
msgstr "ограничаване на БРОя на редовете в статистиката за промените"
-#: diff.c:5329
+#: diff.c:5365
msgid "generate compact summary in diffstat"
msgstr "кратко резюме в статистиката за промените"
-#: diff.c:5332
+#: diff.c:5368
msgid "output a binary diff that can be applied"
msgstr "извеждане на двоична разлика във вид за прилагане"
-#: diff.c:5335
+#: diff.c:5371
msgid "show full pre- and post-image object names on the \"index\" lines"
msgstr ""
"показване на пълните имена на обекти в редовете за индекса при вариантите "
"преди и след промяната"
-#: diff.c:5337
+#: diff.c:5373
msgid "show colored diff"
msgstr "разлики в цвят"
-#: diff.c:5338
+#: diff.c:5374
msgid "<kind>"
msgstr "ВИД"
-#: diff.c:5339
+#: diff.c:5375
msgid ""
"highlight whitespace errors in the 'context', 'old' or 'new' lines in the "
"diff"
@@ -3582,7 +3628,7 @@ msgstr ""
"грешките в празните знаци да се указват в редовете за контекста, вариантите "
"преди и след разликата,"
-#: diff.c:5342
+#: diff.c:5378
msgid ""
"do not munge pathnames and use NULs as output field terminators in --raw or "
"--numstat"
@@ -3590,257 +3636,257 @@ msgstr ""
"без преименуване на пътищата. Да се използват нулеви байтове за разделители "
"на полета в изхода при ползване на опцията „--raw“ или „--numstat“"
-#: diff.c:5345 diff.c:5348 diff.c:5351 diff.c:5457
+#: diff.c:5381 diff.c:5384 diff.c:5387 diff.c:5493
msgid "<prefix>"
msgstr "ПРЕФИКС"
-#: diff.c:5346
+#: diff.c:5382
msgid "show the given source prefix instead of \"a/\""
msgstr "префикс вместо „a/“ за източник"
-#: diff.c:5349
+#: diff.c:5385
msgid "show the given destination prefix instead of \"b/\""
msgstr "префикс вместо „b/“ за цел"
-#: diff.c:5352
+#: diff.c:5388
msgid "prepend an additional prefix to every line of output"
msgstr "добавяне на допълнителен префикс за всеки ред на изхода"
-#: diff.c:5355
+#: diff.c:5391
msgid "do not show any source or destination prefix"
msgstr "без префикс за източника и целта"
-#: diff.c:5358
+#: diff.c:5394
msgid "show context between diff hunks up to the specified number of lines"
msgstr ""
"извеждане на контекст между последователните парчета с разлики от указания "
"БРОЙ редове"
-#: diff.c:5362 diff.c:5367 diff.c:5372
+#: diff.c:5398 diff.c:5403 diff.c:5408
msgid "<char>"
msgstr "ЗНАК"
-#: diff.c:5363
+#: diff.c:5399
msgid "specify the character to indicate a new line instead of '+'"
msgstr "знак вместо „+“ за нов вариант на ред"
-#: diff.c:5368
+#: diff.c:5404
msgid "specify the character to indicate an old line instead of '-'"
msgstr "знак вместо „-“ за стар вариант на ред"
-#: diff.c:5373
+#: diff.c:5409
msgid "specify the character to indicate a context instead of ' '"
msgstr "знак вместо „ “ за контекст"
-#: diff.c:5376
+#: diff.c:5412
msgid "Diff rename options"
msgstr "Настройки за разлики с преименуване"
-#: diff.c:5377
+#: diff.c:5413
msgid "<n>[/<m>]"
msgstr "МИНИМАЛЕН_%_ПРОМЯНА_ЗА_ИЗТОЧНИК[/МАКСИМАЛEН_%_ПРОМЯНА_ЗА_ЗАМЯНА]"
-#: diff.c:5378
+#: diff.c:5414
msgid "break complete rewrite changes into pairs of delete and create"
msgstr ""
"заместване на пълните промени с последователност от изтриване и създаване"
-#: diff.c:5382
+#: diff.c:5418
msgid "detect renames"
msgstr "засичане на преименуванията"
-#: diff.c:5386
+#: diff.c:5422
msgid "omit the preimage for deletes"
msgstr "без предварителен вариант при изтриване"
-#: diff.c:5389
+#: diff.c:5425
msgid "detect copies"
msgstr "засичане на копиранията"
-#: diff.c:5393
+#: diff.c:5429
msgid "use unmodified files as source to find copies"
msgstr "търсене на копирано и от непроменените файлове"
-#: diff.c:5395
+#: diff.c:5431
msgid "disable rename detection"
msgstr "без търсене на преименувания"
-#: diff.c:5398
+#: diff.c:5434
msgid "use empty blobs as rename source"
msgstr "празни обекти като източник при преименувания"
-#: diff.c:5400
+#: diff.c:5436
msgid "continue listing the history of a file beyond renames"
msgstr ""
"продължаване на извеждането на историята — без отрязването при преименувания "
"на файл"
-#: diff.c:5403
+#: diff.c:5439
msgid ""
"prevent rename/copy detection if the number of rename/copy targets exceeds "
"given limit"
msgstr ""
"без засичане на преименувания/копирания, ако броят им надвишава тази стойност"
-#: diff.c:5405
+#: diff.c:5441
msgid "Diff algorithm options"
msgstr "Опции към алгоритъма за разлики"
-#: diff.c:5407
+#: diff.c:5443
msgid "produce the smallest possible diff"
msgstr "търсене на възможно най-малка разлика"
-#: diff.c:5410
+#: diff.c:5446
msgid "ignore whitespace when comparing lines"
msgstr "без промени в празните знаци при сравняване на редове"
-#: diff.c:5413
+#: diff.c:5449
msgid "ignore changes in amount of whitespace"
msgstr "без промени в празните знаци"
-#: diff.c:5416
+#: diff.c:5452
msgid "ignore changes in whitespace at EOL"
msgstr "без промени в празните знаци в края на редовете"
-#: diff.c:5419
+#: diff.c:5455
msgid "ignore carrier-return at the end of line"
msgstr "без промени в знаците за край на ред"
-#: diff.c:5422
+#: diff.c:5458
msgid "ignore changes whose lines are all blank"
msgstr "без промени в редовете, които са изцяло от празни знаци"
-#: diff.c:5425
+#: diff.c:5461
msgid "heuristic to shift diff hunk boundaries for easy reading"
msgstr ""
"евристика за преместване на границите на парчетата за улесняване на четенето"
-#: diff.c:5428
+#: diff.c:5464
msgid "generate diff using the \"patience diff\" algorithm"
msgstr "разлика чрез алгоритъм за подредба като пасианс"
-#: diff.c:5432
+#: diff.c:5468
msgid "generate diff using the \"histogram diff\" algorithm"
msgstr "разлика по хистограмния алгоритъм"
-#: diff.c:5434
+#: diff.c:5470
msgid "<algorithm>"
msgstr "АЛГОРИТЪМ"
-#: diff.c:5435
+#: diff.c:5471
msgid "choose a diff algorithm"
msgstr "избор на АЛГОРИТЪМа за разлики"
-#: diff.c:5437
+#: diff.c:5473
msgid "<text>"
msgstr "ТЕКСТ"
-#: diff.c:5438
+#: diff.c:5474
msgid "generate diff using the \"anchored diff\" algorithm"
msgstr "разлика чрез алгоритъма със закотвяне"
-#: diff.c:5440 diff.c:5449 diff.c:5452
+#: diff.c:5476 diff.c:5485 diff.c:5488
msgid "<mode>"
msgstr "РЕЖИМ"
-#: diff.c:5441
+#: diff.c:5477
msgid "show word diff, using <mode> to delimit changed words"
msgstr ""
"разлика по думи, като се ползва този РЕЖИМ за отделянето на променените думи"
-#: diff.c:5443 diff.c:5446 diff.c:5491
+#: diff.c:5479 diff.c:5482 diff.c:5527
msgid "<regex>"
msgstr "РЕГУЛЯРЕН_ИЗРАЗ"
-#: diff.c:5444
+#: diff.c:5480
msgid "use <regex> to decide what a word is"
msgstr "РЕГУЛЯРЕН_ИЗРАЗ за разделяне по думи"
-#: diff.c:5447
+#: diff.c:5483
msgid "equivalent to --word-diff=color --word-diff-regex=<regex>"
msgstr "псевдоним на „--word-diff=color --word-diff-regex=РЕГУЛЯРЕН_ИЗРАЗ“"
-#: diff.c:5450
+#: diff.c:5486
msgid "moved lines of code are colored differently"
msgstr "различен цвят за извеждане на преместените редове"
-#: diff.c:5453
+#: diff.c:5489
msgid "how white spaces are ignored in --color-moved"
msgstr ""
"режим за прескачането на празните знаци при задаването на „--color-moved“"
-#: diff.c:5456
+#: diff.c:5492
msgid "Other diff options"
msgstr "Други опции за разлики"
-#: diff.c:5458
+#: diff.c:5494
msgid "when run from subdir, exclude changes outside and show relative paths"
msgstr ""
"при изпълнение от поддиректория да се пренебрегват разликите извън нея и да "
"се ползват относителни пътища"
-#: diff.c:5462
+#: diff.c:5498
msgid "treat all files as text"
msgstr "обработка на всички файлове като текстови"
-#: diff.c:5464
+#: diff.c:5500
msgid "swap two inputs, reverse the diff"
msgstr "размяна на двата входа — обръщане на разликата"
-#: diff.c:5466
+#: diff.c:5502
msgid "exit with 1 if there were differences, 0 otherwise"
msgstr ""
"завършване с код за състояние 1 при наличието на разлики, а в противен "
"случай — с 0"
-#: diff.c:5468
+#: diff.c:5504
msgid "disable all output of the program"
msgstr "без всякакъв изход от програмата"
-#: diff.c:5470
+#: diff.c:5506
msgid "allow an external diff helper to be executed"
msgstr "позволяване на изпълнение на външна помощна програма за разлики"
-#: diff.c:5472
+#: diff.c:5508
msgid "run external text conversion filters when comparing binary files"
msgstr ""
"изпълнение на външни програми-филтри при сравнението на двоични файлове"
-#: diff.c:5474
+#: diff.c:5510
msgid "<when>"
msgstr "КОГА"
-#: diff.c:5475
+#: diff.c:5511
msgid "ignore changes to submodules in the diff generation"
msgstr "игнориране на промените в подмодулите при извеждането на разликите"
-#: diff.c:5478
+#: diff.c:5514
msgid "<format>"
msgstr "ФОРМАТ"
-#: diff.c:5479
+#: diff.c:5515
msgid "specify how differences in submodules are shown"
msgstr "начин за извеждане на промените в подмодулите"
-#: diff.c:5483
+#: diff.c:5519
msgid "hide 'git add -N' entries from the index"
msgstr "без включване в индекса на записите, добавени с „git add -N“"
-#: diff.c:5486
+#: diff.c:5522
msgid "treat 'git add -N' entries as real in the index"
msgstr "включване в индекса на записите, добавени с „git add -N“"
-#: diff.c:5488
+#: diff.c:5524
msgid "<string>"
msgstr "НИЗ"
-#: diff.c:5489
+#: diff.c:5525
msgid ""
"look for differences that change the number of occurrences of the specified "
"string"
msgstr "търсене на разлики, които променят броя на поява на указаните низове"
-#: diff.c:5492
+#: diff.c:5528
msgid ""
"look for differences that change the number of occurrences of the specified "
"regex"
@@ -3848,62 +3894,71 @@ msgstr ""
"търсене на разлики, които променят броя на поява на низовете, които напасват "
"на регулярния израз"
-#: diff.c:5495
+#: diff.c:5531
msgid "show all changes in the changeset with -S or -G"
msgstr "извеждане на всички промени с „-G“/„-S“"
-#: diff.c:5498
+#: diff.c:5534
msgid "treat <string> in -S as extended POSIX regular expression"
msgstr "НИЗът към „-S“ да се тълкува като разширен регулярен израз по POSIX"
-#: diff.c:5501
+#: diff.c:5537
msgid "control the order in which files appear in the output"
msgstr "управление на подредбата на файловете в изхода"
-#: diff.c:5502
+#: diff.c:5538
msgid "<object-id>"
msgstr "ИДЕНТИФИКАТОР_НА_ОБЕКТ"
-#: diff.c:5503
+#: diff.c:5539
msgid ""
"look for differences that change the number of occurrences of the specified "
"object"
msgstr "търсене на разлики, които променят броя на поява на указания обект"
-#: diff.c:5505
+#: diff.c:5541
msgid "[(A|C|D|M|R|T|U|X|B)...[*]]"
msgstr "[(A|C|D|M|R|T|U|X|B)…[*]]"
-#: diff.c:5506
+#: diff.c:5542
msgid "select files by diff type"
msgstr "избор на файловете по вид разлика"
-#: diff.c:5508
+#: diff.c:5544
msgid "<file>"
msgstr "ФАЙЛ"
-#: diff.c:5509
+#: diff.c:5545
msgid "Output to a specific file"
msgstr "Изход към указания файл"
-#: diff.c:6164
+#: diff.c:6200
msgid "inexact rename detection was skipped due to too many files."
msgstr ""
"търсенето на преименувания на обекти съчетани с промени се прескача поради "
"многото файлове."
-#: diff.c:6167
+#: diff.c:6203
msgid "only found copies from modified paths due to too many files."
msgstr ""
"установени са само точните копия на променените пътища поради многото "
"файлове."
-#: diff.c:6170
+#: diff.c:6206
#, c-format
msgid ""
"you may want to set your %s variable to at least %d and retry the command."
msgstr "задайте променливата „%s“ да е поне %d и отново изпълнете командата."
+#: diffcore-order.c:24
+#, c-format
+msgid "failed to read orderfile '%s'"
+msgstr "файлът с подредбата на съответствията „%s“ не може да бъде прочетен"
+
+#: diffcore-rename.c:592
+msgid "Performing inexact rename detection"
+msgstr "Търсене на преименувания на обекти съчетани с промени"
+
#: dir.c:555
#, c-format
msgid "pathspec '%s' did not match any file(s) known to git"
@@ -3935,36 +3990,36 @@ msgstr "изключване на пътеводното напасване"
msgid "cannot use %s as an exclude file"
msgstr "„%s“ не може да се ползва за игнорираните файлове (като gitignore)"
-#: dir.c:2144
+#: dir.c:2275
#, c-format
msgid "could not open directory '%s'"
msgstr "директорията „%s“ не може да бъде отворена"
-#: dir.c:2479
+#: dir.c:2575
msgid "failed to get kernel name and information"
msgstr "името и версията на ядрото не бяха получени"
-#: dir.c:2603
+#: dir.c:2699
msgid "untracked cache is disabled on this system or location"
msgstr ""
"кешът за неследените файлове е изключен на тази система или местоположение"
-#: dir.c:3407
+#: dir.c:3481
#, c-format
msgid "index file corrupt in repo %s"
msgstr "файлът с индекса е повреден в хранилището „%s“"
-#: dir.c:3452 dir.c:3457
+#: dir.c:3526 dir.c:3531
#, c-format
msgid "could not create directories for %s"
msgstr "директориите за „%s“ не може да бъдат създадени"
-#: dir.c:3486
+#: dir.c:3560
#, c-format
msgid "could not migrate git directory from '%s' to '%s'"
msgstr "директорията на git не може да се мигрира от „%s“ до „%s“"
-#: editor.c:73
+#: editor.c:74
#, c-format
msgid "hint: Waiting for your editor to close the file...%c"
msgstr "Подсказка: чака се редакторът ви да затвори файла …%c"
@@ -3973,17 +4028,17 @@ msgstr "Подсказка: чака се редакторът ви да зат
msgid "Filtering content"
msgstr "Филтриране на съдържанието"
-#: entry.c:476
+#: entry.c:479
#, c-format
msgid "could not stat file '%s'"
msgstr "неуспешно изпълнение на „stat“ върху файла „%s“"
-#: environment.c:149
+#: environment.c:150
#, c-format
msgid "bad git namespace path \"%s\""
msgstr "неправилен път към пространства от имена „%s“"
-#: environment.c:331
+#: environment.c:337
#, c-format
msgid "could not set GIT_DIR to '%s'"
msgstr "GIT_DIR не може да се зададе да е „%s“"
@@ -3993,248 +4048,248 @@ msgstr "GIT_DIR не може да се зададе да е „%s“"
msgid "too many args to run %s"
msgstr "прекалено много аргументи за изпълнение „%s“"
-#: fetch-pack.c:150
+#: fetch-pack.c:151
msgid "git fetch-pack: expected shallow list"
msgstr "git fetch-pack: очаква се плитък списък"
-#: fetch-pack.c:153
+#: fetch-pack.c:154
msgid "git fetch-pack: expected a flush packet after shallow list"
msgstr "git fetch-pack: след плитък списък се очаква изчистващ пакет „flush“"
-#: fetch-pack.c:164
+#: fetch-pack.c:165
msgid "git fetch-pack: expected ACK/NAK, got a flush packet"
msgstr ""
"git fetch-pack: очаква се „ACK“/„NAK“, а бе получен изчистващ пакет „flush“"
-#: fetch-pack.c:184
+#: fetch-pack.c:185
#, c-format
msgid "git fetch-pack: expected ACK/NAK, got '%s'"
msgstr "git fetch-pack: очаква се „ACK“/„NAK“, а бе получено „%s“"
-#: fetch-pack.c:195
+#: fetch-pack.c:196
msgid "unable to write to remote"
msgstr "невъзможно писане към отдалечено хранилище"
-#: fetch-pack.c:257
+#: fetch-pack.c:258
msgid "--stateless-rpc requires multi_ack_detailed"
msgstr "опцията „--stateless-rpc“ изисква „multi_ack_detailed“"
-#: fetch-pack.c:356 fetch-pack.c:1340
+#: fetch-pack.c:357 fetch-pack.c:1364
#, c-format
msgid "invalid shallow line: %s"
msgstr "неправилен плитък ред: „%s“"
-#: fetch-pack.c:362 fetch-pack.c:1346
+#: fetch-pack.c:363 fetch-pack.c:1370
#, c-format
msgid "invalid unshallow line: %s"
msgstr "неправилен неплитък ред: „%s“"
-#: fetch-pack.c:364 fetch-pack.c:1348
+#: fetch-pack.c:365 fetch-pack.c:1372
#, c-format
msgid "object not found: %s"
msgstr "обектът „%s“ липсва"
-#: fetch-pack.c:367 fetch-pack.c:1351
+#: fetch-pack.c:368 fetch-pack.c:1375
#, c-format
msgid "error in object: %s"
msgstr "грешка в обекта: „%s“"
-#: fetch-pack.c:369 fetch-pack.c:1353
+#: fetch-pack.c:370 fetch-pack.c:1377
#, c-format
msgid "no shallow found: %s"
msgstr "не е открит плитък обект: %s"
-#: fetch-pack.c:372 fetch-pack.c:1357
+#: fetch-pack.c:373 fetch-pack.c:1381
#, c-format
msgid "expected shallow/unshallow, got %s"
msgstr "очаква се плитък или не обект, а бе получено: „%s“"
-#: fetch-pack.c:414
+#: fetch-pack.c:415
#, c-format
msgid "got %s %d %s"
msgstr "получено бе %s %d %s"
-#: fetch-pack.c:431
+#: fetch-pack.c:432
#, c-format
msgid "invalid commit %s"
msgstr "неправилно подаване: „%s“"
-#: fetch-pack.c:462
+#: fetch-pack.c:463
msgid "giving up"
msgstr "преустановяване"
-#: fetch-pack.c:475 progress.c:323
+#: fetch-pack.c:476 progress.c:336
msgid "done"
msgstr "действието завърши"
-#: fetch-pack.c:487
+#: fetch-pack.c:488
#, c-format
msgid "got %s (%d) %s"
msgstr "получено бе %s (%d) %s"
-#: fetch-pack.c:533
+#: fetch-pack.c:534
#, c-format
msgid "Marking %s as complete"
msgstr "Отбелязване на „%s“ като пълно"
-#: fetch-pack.c:754
+#: fetch-pack.c:755
#, c-format
msgid "already have %s (%s)"
msgstr "вече има „%s“ (%s)"
-#: fetch-pack.c:818
+#: fetch-pack.c:819
msgid "fetch-pack: unable to fork off sideband demultiplexer"
msgstr "fetch-pack: не може да се създаде процес за демултиплексора"
-#: fetch-pack.c:826
+#: fetch-pack.c:827
msgid "protocol error: bad pack header"
msgstr "протоколна грешка: неправилна заглавна част на пакет"
-#: fetch-pack.c:900
+#: fetch-pack.c:901
#, c-format
msgid "fetch-pack: unable to fork off %s"
msgstr "fetch-pack: не може да се създаде процес за „%s“"
-#: fetch-pack.c:916
+#: fetch-pack.c:917
#, c-format
msgid "%s failed"
msgstr "неуспешно изпълнение на „%s“"
-#: fetch-pack.c:918
+#: fetch-pack.c:919
msgid "error in sideband demultiplexer"
msgstr "грешка в демултиплексора"
-#: fetch-pack.c:965
+#: fetch-pack.c:966
#, c-format
msgid "Server version is %.*s"
msgstr "Версията на сървъра е: %.*s"
-#: fetch-pack.c:970 fetch-pack.c:976 fetch-pack.c:979 fetch-pack.c:985
-#: fetch-pack.c:989 fetch-pack.c:993 fetch-pack.c:997 fetch-pack.c:1001
-#: fetch-pack.c:1005 fetch-pack.c:1009 fetch-pack.c:1013 fetch-pack.c:1017
-#: fetch-pack.c:1023 fetch-pack.c:1029 fetch-pack.c:1034 fetch-pack.c:1039
+#: fetch-pack.c:971 fetch-pack.c:977 fetch-pack.c:980 fetch-pack.c:986
+#: fetch-pack.c:990 fetch-pack.c:994 fetch-pack.c:998 fetch-pack.c:1002
+#: fetch-pack.c:1006 fetch-pack.c:1010 fetch-pack.c:1014 fetch-pack.c:1018
+#: fetch-pack.c:1024 fetch-pack.c:1030 fetch-pack.c:1035 fetch-pack.c:1040
#, c-format
msgid "Server supports %s"
msgstr "Сървърът поддържа „%s“"
-#: fetch-pack.c:972
+#: fetch-pack.c:973
msgid "Server does not support shallow clients"
msgstr "Сървърът не поддържа плитки клиенти"
-#: fetch-pack.c:1032
+#: fetch-pack.c:1033
msgid "Server does not support --shallow-since"
msgstr "Сървърът не поддържа опцията „--shallow-since“"
-#: fetch-pack.c:1037
+#: fetch-pack.c:1038
msgid "Server does not support --shallow-exclude"
msgstr "Сървърът не поддържа опцията „--shallow-exclude“"
-#: fetch-pack.c:1041
+#: fetch-pack.c:1042
msgid "Server does not support --deepen"
msgstr "Сървърът не поддържа опцията „--deepen“"
-#: fetch-pack.c:1058
+#: fetch-pack.c:1059
msgid "no common commits"
msgstr "няма общи подавания"
-#: fetch-pack.c:1070 fetch-pack.c:1536
+#: fetch-pack.c:1071 fetch-pack.c:1563
msgid "git fetch-pack: fetch failed."
msgstr "git fetch-pack: неуспешно доставяне."
-#: fetch-pack.c:1209
+#: fetch-pack.c:1211
msgid "Server does not support shallow requests"
msgstr "Сървърът не поддържа плитки заявки"
-#: fetch-pack.c:1216
+#: fetch-pack.c:1218
msgid "Server supports filter"
msgstr "Сървърът поддържа филтри"
-#: fetch-pack.c:1239
+#: fetch-pack.c:1242
msgid "unable to write request to remote"
msgstr "невъзможно писане към отдалечено хранилище"
-#: fetch-pack.c:1257
+#: fetch-pack.c:1260
#, c-format
msgid "error reading section header '%s'"
msgstr "грешка при прочитане на заглавната част на раздел „%s“"
-#: fetch-pack.c:1263
+#: fetch-pack.c:1266
#, c-format
msgid "expected '%s', received '%s'"
msgstr "очаква се „%s“, а бе получено „%s“"
-#: fetch-pack.c:1303
+#: fetch-pack.c:1327
#, c-format
msgid "unexpected acknowledgment line: '%s'"
msgstr "неочакван ред за потвърждение: „%s“"
-#: fetch-pack.c:1308
+#: fetch-pack.c:1332
#, c-format
msgid "error processing acks: %d"
msgstr "грешка при обработка на потвържденията: %d"
-#: fetch-pack.c:1318
+#: fetch-pack.c:1342
msgid "expected packfile to be sent after 'ready'"
msgstr ""
"очакваше се пакетният файл да бъде изпратен след отговор за готовност (ready)"
-#: fetch-pack.c:1320
+#: fetch-pack.c:1344
msgid "expected no other sections to be sent after no 'ready'"
msgstr ""
"очакваше се след липса на отговор за готовност (ready) да не се се пращат "
"други раздели"
-#: fetch-pack.c:1362
+#: fetch-pack.c:1386
#, c-format
msgid "error processing shallow info: %d"
msgstr "грешка при обработка на информация за дълбочината/плиткостта: %d"
-#: fetch-pack.c:1409
+#: fetch-pack.c:1433
#, c-format
msgid "expected wanted-ref, got '%s'"
msgstr "очаква се искан указател, а бе получено: „%s“"
-#: fetch-pack.c:1414
+#: fetch-pack.c:1438
#, c-format
msgid "unexpected wanted-ref: '%s'"
msgstr "неочакван искан указател: „%s“"
-#: fetch-pack.c:1419
+#: fetch-pack.c:1443
#, c-format
msgid "error processing wanted refs: %d"
msgstr "грешка при обработката на исканите указатели: %d"
-#: fetch-pack.c:1762
+#: fetch-pack.c:1789
msgid "no matching remote head"
msgstr "не може да бъде открит подходящ връх от отдалеченото хранилище"
-#: fetch-pack.c:1785 builtin/clone.c:689
+#: fetch-pack.c:1812 builtin/clone.c:692
msgid "remote did not send all necessary objects"
msgstr "отдалеченото хранилище не изпрати всички необходими обекти."
-#: fetch-pack.c:1812
+#: fetch-pack.c:1839
#, c-format
msgid "no such remote ref %s"
msgstr "такъв отдалечен указател няма: %s"
-#: fetch-pack.c:1815
+#: fetch-pack.c:1842
#, c-format
msgid "Server does not allow request for unadvertised object %s"
msgstr "Сървърът не позволява заявка за необявен обект „%s“"
-#: gpg-interface.c:408
-msgid "gpg failed to sign the data"
-msgstr "Програмата „gpg“ не подписа данните."
-
-#: gpg-interface.c:434
+#: gpg-interface.c:272
msgid "could not create temporary file"
msgstr "не може да се създаде временен файл"
-#: gpg-interface.c:437
+#: gpg-interface.c:275
#, c-format
msgid "failed writing detached signature to '%s'"
msgstr "Програмата не успя да запише самостоятелния подпис в „%s“"
+#: gpg-interface.c:457
+msgid "gpg failed to sign the data"
+msgstr "Програмата „gpg“ не подписа данните."
+
#: graph.c:98
#, c-format
msgid "ignore invalid color '%.*s' in log.graphColors"
@@ -4253,7 +4308,7 @@ msgstr ""
msgid "'%s': unable to read %s"
msgstr "„%s“: файлът сочен от „%s“ не може да бъде прочетен"
-#: grep.c:2145 setup.c:166 builtin/clone.c:411 builtin/diff.c:82
+#: grep.c:2145 setup.c:176 builtin/clone.c:411 builtin/diff.c:82
#: builtin/rm.c:135
#, c-format
msgid "failed to stat '%s'"
@@ -4329,7 +4384,7 @@ msgstr "команди на git от други директории от „$PA
msgid "These are common Git commands used in various situations:"
msgstr "Това са най-често използваните команди на Git:"
-#: help.c:363 git.c:98
+#: help.c:363 git.c:99
#, c-format
msgid "unsupported command listing type '%s'"
msgstr "неподдържан списък от команди „%s“"
@@ -4338,19 +4393,19 @@ msgstr "неподдържан списък от команди „%s“"
msgid "The common Git guides are:"
msgstr "Популярните въведения в Git са:"
-#: help.c:512
+#: help.c:427
msgid "See 'git help <command>' to read about a specific subcommand"
msgstr "За повече информация за КОМАНДА изпълнете „git help КОМАНДА“"
-#: help.c:517
+#: help.c:432
msgid "External commands"
msgstr "Външни команди"
-#: help.c:532
+#: help.c:447
msgid "Command aliases"
msgstr "Псевдоними на командите"
-#: help.c:596
+#: help.c:511
#, c-format
msgid ""
"'%s' appears to be a git command, but we were not\n"
@@ -4359,36 +4414,36 @@ msgstr ""
"Изглежда, че „%s“ е команда на git, но тя не може да\n"
"бъде изпълнена. Вероятно пакетът „git-%s“ е повреден."
-#: help.c:655
+#: help.c:570
msgid "Uh oh. Your system reports no Git commands at all."
msgstr "Странно, изглежда, че на системата ви няма нито една команда на git."
-#: help.c:677
+#: help.c:592
#, c-format
msgid "WARNING: You called a Git command named '%s', which does not exist."
msgstr ""
"ПРЕДУПРЕЖДЕНИЕ: Пробвахте да изпълните команда на Git на име „%s“, а такава "
"не съществува."
-#: help.c:682
+#: help.c:597
#, c-format
msgid "Continuing under the assumption that you meant '%s'."
msgstr ""
"Изпълнението автоматично продължава, като се счита, че имате предвид „%s“."
-#: help.c:687
+#: help.c:602
#, c-format
msgid "Continuing in %0.1f seconds, assuming that you meant '%s'."
msgstr ""
"Изпълнението автоматично ще продължи след %0.1f сек., като се счита, че "
"имате предвид „%s“."
-#: help.c:695
+#: help.c:610
#, c-format
msgid "git: '%s' is not a git command. See 'git --help'."
msgstr "git: „%s“ не е команда на git. Погледнете изхода от „git --help“."
-#: help.c:699
+#: help.c:614
msgid ""
"\n"
"The most similar command is"
@@ -4402,16 +4457,16 @@ msgstr[1] ""
"\n"
"Най-близките команди са"
-#: help.c:714
+#: help.c:653
msgid "git version [<options>]"
msgstr "git version [ОПЦИЯ…]"
-#: help.c:783
+#: help.c:708
#, c-format
msgid "%s: %s - %s"
msgstr "%s: %s — %s"
-#: help.c:787
+#: help.c:712
msgid ""
"\n"
"Did you mean this?"
@@ -4482,37 +4537,11 @@ msgstr "не може да се ползва празно име като иде
msgid "name consists only of disallowed characters: %s"
msgstr "името съдържа само непозволени знаци: „%s“"
-#: ident.c:436 builtin/commit.c:635
+#: ident.c:436 builtin/commit.c:634
#, c-format
msgid "invalid date format: %s"
msgstr "неправилен формат на дата: %s"
-#: list-objects.c:127
-#, c-format
-msgid "entry '%s' in tree %s has tree mode, but is not a tree"
-msgstr "обект „%s“ в дървото „%s“ е отбелязан като дърво, но не е"
-
-#: list-objects.c:140
-#, c-format
-msgid "entry '%s' in tree %s has blob mode, but is not a blob"
-msgstr "обект „%s“ в дървото „%s“ е отбелязан като BLOB, но не е"
-
-#: list-objects.c:375
-#, c-format
-msgid "unable to load root tree for commit %s"
-msgstr "кореновото дърво за подаване „%s“ не може да се зареди"
-
-#: list-objects-filter.c:492
-#, c-format
-msgid "unable to access sparse blob in '%s'"
-msgstr "няма достъп до частично изтегления обект-BLOB в „%s“"
-
-#: list-objects-filter.c:495
-#, c-format
-msgid "unable to parse sparse filter data in %s"
-msgstr ""
-"данните от филтъра за частични изтегляния в „%s“ не може да бъдат анализирани"
-
#: list-objects-filter-options.c:58
msgid "expected 'tree:<depth>'"
msgstr "очаква се „tree:ДЪЛБОЧИНА“"
@@ -4539,7 +4568,33 @@ msgstr "добавете нещо след комбинирането:"
msgid "multiple filter-specs cannot be combined"
msgstr "не може да комбинирате множество филтри"
-#: lockfile.c:151
+#: list-objects-filter.c:492
+#, c-format
+msgid "unable to access sparse blob in '%s'"
+msgstr "няма достъп до частично изтегления обект-BLOB в „%s“"
+
+#: list-objects-filter.c:495
+#, c-format
+msgid "unable to parse sparse filter data in %s"
+msgstr ""
+"данните от филтъра за частични изтегляния в „%s“ не може да бъдат анализирани"
+
+#: list-objects.c:127
+#, c-format
+msgid "entry '%s' in tree %s has tree mode, but is not a tree"
+msgstr "обект „%s“ в дървото „%s“ е отбелязан като дърво, но не е"
+
+#: list-objects.c:140
+#, c-format
+msgid "entry '%s' in tree %s has blob mode, but is not a blob"
+msgstr "обект „%s“ в дървото „%s“ е отбелязан като BLOB, но не е"
+
+#: list-objects.c:375
+#, c-format
+msgid "unable to load root tree for commit %s"
+msgstr "кореновото дърво за подаване „%s“ не може да се зареди"
+
+#: lockfile.c:152
#, c-format
msgid ""
"Unable to create '%s.lock': %s.\n"
@@ -4558,20 +4613,14 @@ msgstr ""
"причина е, че някой процес на git в това хранилище е забил. За да\n"
"продължите работа, ще трябва ръчно да изтриете файла:"
-#: lockfile.c:159
+#: lockfile.c:160
#, c-format
msgid "Unable to create '%s.lock': %s"
msgstr "Файлът-ключалка „%s.lock“ не може да бъде създаден: %s"
-#: merge.c:41
-msgid "failed to read the cache"
-msgstr "кешът не може да бъде прочетен"
-
-#: merge.c:107 rerere.c:720 builtin/am.c:1879 builtin/am.c:1913
-#: builtin/checkout.c:541 builtin/checkout.c:800 builtin/clone.c:810
-#: builtin/stash.c:265
-msgid "unable to write new index file"
-msgstr "неуспешно записване на новия индекс"
+#: ls-refs.c:109
+msgid "expected flush after ls-refs arguments"
+msgstr "след аргументите към „ls-refs“ се очаква изчистване на буферите"
#: merge-recursive.c:356
msgid "(bad commit)\n"
@@ -4766,7 +4815,7 @@ msgstr "преименуване"
msgid "renamed"
msgstr "преименуван"
-#: merge-recursive.c:1577 merge-recursive.c:2472 merge-recursive.c:3117
+#: merge-recursive.c:1577 merge-recursive.c:2484 merge-recursive.c:3129
#, c-format
msgid "Refusing to lose dirty file at %s"
msgstr "Преустановяване на действието, за да не се изгуби промененият „%s“"
@@ -4809,14 +4858,14 @@ msgstr ""
msgid " (left unresolved)"
msgstr " (некоригиран конфликт)"
-#: merge-recursive.c:1793
+#: merge-recursive.c:1805
#, 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:2056
+#: merge-recursive.c:2068
#, c-format
msgid ""
"CONFLICT (directory rename split): Unclear where to place %s because "
@@ -4827,7 +4876,7 @@ msgstr ""
"постави „%s“, защото няколко нови директории поделят съдържанието на "
"директория „%s“, като никоя не съдържа мнозинство от файловете ѝ."
-#: merge-recursive.c:2088
+#: merge-recursive.c:2100
#, c-format
msgid ""
"CONFLICT (implicit dir rename): Existing file/dir at %s in the way of "
@@ -4836,7 +4885,7 @@ msgstr ""
"КОНФЛИКТ (косвено преименуване на директория): следният файл или директория "
"„%s“ не позволяват косвеното преименуване на следния път/ища: %s."
-#: merge-recursive.c:2098
+#: merge-recursive.c:2110
#, c-format
msgid ""
"CONFLICT (implicit dir rename): Cannot map more than one path to %s; "
@@ -4846,7 +4895,7 @@ msgstr ""
"съответства на „%s“. Косвено преименуване на директория води до поставянето "
"на тези пътища там: %s."
-#: merge-recursive.c:2190
+#: merge-recursive.c:2202
#, c-format
msgid ""
"CONFLICT (rename/rename): Rename directory %s->%s in %s. Rename directory %s-"
@@ -4855,7 +4904,7 @@ msgstr ""
"КОНФЛИКТ (преименуване/преименуване): „%s“ е преименуван на „%s“ в клон "
"„%s“, а „%s“ е преименуван на „%s“ в „%s“"
-#: merge-recursive.c:2435
+#: merge-recursive.c:2447
#, c-format
msgid ""
"WARNING: Avoiding applying %s -> %s rename to %s, because %s itself was "
@@ -4864,52 +4913,52 @@ msgstr ""
"ПРЕДУПРЕЖДЕНИЕ: прескачане на преименуването на „%s“ на „%s“ в „%s“, защото "
"„%s“ също е с променено име."
-#: merge-recursive.c:2961
+#: merge-recursive.c:2973
#, c-format
msgid "cannot read object %s"
msgstr "обектът „%s“ не може да се прочете"
-#: merge-recursive.c:2964
+#: merge-recursive.c:2976
#, c-format
msgid "object %s is not a blob"
msgstr "обектът „%s“ не е BLOB"
-#: merge-recursive.c:3028
+#: merge-recursive.c:3040
msgid "modify"
msgstr "промяна"
-#: merge-recursive.c:3028
+#: merge-recursive.c:3040
msgid "modified"
msgstr "променен"
-#: merge-recursive.c:3040
+#: merge-recursive.c:3052
msgid "content"
msgstr "съдържание"
-#: merge-recursive.c:3044
+#: merge-recursive.c:3056
msgid "add/add"
msgstr "добавяне/добавяне"
-#: merge-recursive.c:3067
+#: merge-recursive.c:3079
#, c-format
msgid "Skipped %s (merged same as existing)"
msgstr "Прескачане на „%s“ (слетият резултат е идентичен със сегашния)"
-#: merge-recursive.c:3089 git-submodule.sh:1003
+#: merge-recursive.c:3101 git-submodule.sh:985
msgid "submodule"
msgstr "ПОДМОДУЛ"
-#: merge-recursive.c:3090
+#: merge-recursive.c:3102
#, c-format
msgid "CONFLICT (%s): Merge conflict in %s"
msgstr "КОНФЛИКТ (%s): Конфликт при сливане на „%s“"
-#: merge-recursive.c:3120
+#: merge-recursive.c:3132
#, c-format
msgid "Adding as %s instead"
msgstr "Добавяне като „%s“"
-#: merge-recursive.c:3203
+#: merge-recursive.c:3215
#, c-format
msgid ""
"Path updated: %s added in %s inside a directory that was renamed in %s; "
@@ -4918,7 +4967,7 @@ msgstr ""
"Обновен път: „%s“ е добавен в „%s“ в директория, която е преименувана в "
"„%s“. Обектът се мести в „%s“."
-#: merge-recursive.c:3206
+#: merge-recursive.c:3218
#, c-format
msgid ""
"CONFLICT (file location): %s added in %s inside a directory that was renamed "
@@ -4927,7 +4976,7 @@ msgstr ""
"КОНФЛИКТ (места на файлове): „%s“ е добавен в „%s“ в директория, която е "
"преименувана в „%s“. Предложението е да преместите обекта в „%s“."
-#: merge-recursive.c:3210
+#: merge-recursive.c:3222
#, c-format
msgid ""
"Path updated: %s renamed to %s in %s, inside a directory that was renamed in "
@@ -4936,7 +4985,7 @@ msgstr ""
"Обновен път: „%s“ е преименуван на „%s“ в „%s“ в директория, която е "
"преименувана в „%s“. Обектът се мести в „%s“."
-#: merge-recursive.c:3213
+#: merge-recursive.c:3225
#, c-format
msgid ""
"CONFLICT (file location): %s renamed to %s in %s, inside a directory that "
@@ -4945,61 +4994,61 @@ msgstr ""
"КОНФЛИКТ (места на файлове): „%s“ е преименуван на „%s“ в „%s“ в директория, "
"която е преименувана в „%s“. Предложението е да преместите обекта в „%s“."
-#: merge-recursive.c:3327
+#: merge-recursive.c:3339
#, c-format
msgid "Removing %s"
msgstr "Изтриване на „%s“"
-#: merge-recursive.c:3350
+#: merge-recursive.c:3362
msgid "file/directory"
msgstr "файл/директория"
-#: merge-recursive.c:3355
+#: merge-recursive.c:3367
msgid "directory/file"
msgstr "директория/файл"
-#: merge-recursive.c:3362
+#: merge-recursive.c:3374
#, c-format
msgid "CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s"
msgstr ""
"КОНФЛИКТ (%s): Съществува директория на име „%s“ в „%s“. Добавяне на „%s“ "
"като „%s“"
-#: merge-recursive.c:3371
+#: merge-recursive.c:3383
#, c-format
msgid "Adding %s"
msgstr "Добавяне на „%s“"
-#: merge-recursive.c:3380
+#: merge-recursive.c:3392
#, c-format
msgid "CONFLICT (add/add): Merge conflict in %s"
msgstr "КОНФЛИКТ (добавяне/добавяне): Конфликт при сливане на „%s“"
-#: merge-recursive.c:3424
+#: merge-recursive.c:3436
msgid "Already up to date!"
msgstr "Вече е обновено!"
-#: merge-recursive.c:3433
+#: merge-recursive.c:3445
#, c-format
msgid "merging of trees %s and %s failed"
msgstr "неуспешно сливане на дърветата „%s“ и „%s“"
-#: merge-recursive.c:3537
+#: merge-recursive.c:3549
msgid "Merging:"
msgstr "Сливане:"
-#: merge-recursive.c:3550
+#: merge-recursive.c:3562
#, c-format
msgid "found %u common ancestor:"
msgid_plural "found %u common ancestors:"
msgstr[0] "открит е %u общ предшественик:"
msgstr[1] "открити са %u общи предшественици:"
-#: merge-recursive.c:3600
+#: merge-recursive.c:3612
msgid "merge returned no commit"
msgstr "сливането не върна подаване"
-#: merge-recursive.c:3659
+#: merge-recursive.c:3671
#, c-format
msgid ""
"Your local changes to the following files would be overwritten by merge:\n"
@@ -5008,15 +5057,25 @@ msgstr ""
"Сливането ще презапише локалните промени на тези файлове:\n"
" %s"
-#: merge-recursive.c:3756
+#: merge-recursive.c:3768
#, c-format
msgid "Could not parse object '%s'"
msgstr "Неуспешен анализ на обекта „%s“"
-#: merge-recursive.c:3774 builtin/merge.c:697 builtin/merge.c:877
+#: merge-recursive.c:3786 builtin/merge.c:705 builtin/merge.c:885
msgid "Unable to write index."
msgstr "Индексът не може да бъде прочетен"
+#: merge.c:41
+msgid "failed to read the cache"
+msgstr "кешът не може да бъде прочетен"
+
+#: merge.c:108 rerere.c:720 builtin/am.c:1878 builtin/am.c:1912
+#: builtin/checkout.c:559 builtin/checkout.c:824 builtin/clone.c:816
+#: builtin/stash.c:265
+msgid "unable to write new index file"
+msgstr "неуспешно записване на новия индекс"
+
#: midx.c:68
#, c-format
msgid "multi-pack-index file %s is too small"
@@ -5070,62 +5129,66 @@ msgstr ""
"неправилна подредба на имената в индекс за множество пакети: „%s“ се появи "
"преди „%s“"
-#: midx.c:210
+#: midx.c:208
#, c-format
msgid "bad pack-int-id: %u (%u total packs)"
msgstr ""
"неправилен идентификатор на пакет (pack-int-id): %u (от общо %u пакети)"
-#: midx.c:260
+#: midx.c:258
msgid "multi-pack-index stores a 64-bit offset, but off_t is too small"
msgstr ""
"индексът за множество пакети съдържа 64-битови отмествания, но размерът на "
"„off_t“ е недостатъчен"
-#: midx.c:288
+#: midx.c:286
msgid "error preparing packfile from multi-pack-index"
msgstr ""
"грешка при създаването на пакетен файл на базата на индекс за множество "
"пакети"
-#: midx.c:472
+#: midx.c:470
#, c-format
msgid "failed to add packfile '%s'"
msgstr "пакетният файл „%s“ не може да бъде добавен"
-#: midx.c:478
+#: midx.c:476
#, c-format
msgid "failed to open pack-index '%s'"
msgstr "индексът за пакети „%s“ не може да бъде отворен"
-#: midx.c:538
+#: midx.c:536
#, c-format
msgid "failed to locate object %d in packfile"
msgstr "обект %d в пакетния файл липсва"
-#: midx.c:842
+#: midx.c:840
msgid "Adding packfiles to multi-pack-index"
msgstr "Добавяне на пакетни файлове към индекс за множество пакети"
-#: midx.c:875
+#: midx.c:873
#, c-format
msgid "did not see pack-file %s to drop"
msgstr "пакетният файл за триене „%s“ не може да се открие"
-#: midx.c:973
+#: midx.c:925
+msgid "no pack files to index."
+msgstr "няма пакетни файлове за индексиране"
+
+#: midx.c:977
msgid "Writing chunks to multi-pack-index"
msgstr "Запис на откъси към индекс за множество пакети"
-#: midx.c:1052
+#: midx.c:1056
#, c-format
msgid "failed to clear multi-pack-index at %s"
msgstr "индексът за множество пакети не може да бъде изчистен при „%s“"
-#: midx.c:1108
+#: midx.c:1112
msgid "Looking for referenced packfiles"
msgstr "Търсене на указаните пакетни файлове"
-#: midx.c:1123
+#: midx.c:1127
#, c-format
msgid ""
"oid fanout out of order: fanout[%d] = %<PRIx32> > %<PRIx32> = fanout[%d]"
@@ -5133,54 +5196,58 @@ msgstr ""
"неправилна подредба на откъси (OID fanout): fanout[%d] = %<PRIx32> > "
"%<PRIx32> = fanout[%d]"
-#: midx.c:1128
+#: midx.c:1132
+msgid "the midx contains no oid"
+msgstr "във файла с индекса за множество пакети няма идентификатори на обекти"
+
+#: midx.c:1141
msgid "Verifying OID order in multi-pack-index"
msgstr ""
"Проверка на подредбата на идентификатори на обекти във файл с индекс към "
"множество пакетни файлове"
-#: midx.c:1137
+#: midx.c:1150
#, c-format
msgid "oid lookup out of order: oid[%d] = %s >= %s = oid[%d]"
msgstr ""
"неправилна подредба на откъси (OID lookup): oid[%d] = %s >= %s = oid[%d]"
-#: midx.c:1157
+#: midx.c:1170
msgid "Sorting objects by packfile"
msgstr "Подредба на обектите по пакетни файлове"
-#: midx.c:1164
+#: midx.c:1177
msgid "Verifying object offsets"
msgstr "Проверка на отместването на обекти"
-#: midx.c:1180
+#: midx.c:1193
#, c-format
msgid "failed to load pack entry for oid[%d] = %s"
msgstr "записът в пакета за обекта oid[%d] = %s не може да бъде зареден"
-#: midx.c:1186
+#: midx.c:1199
#, c-format
msgid "failed to load pack-index for packfile %s"
msgstr "индексът на пакета „%s“ не може да бъде зареден"
-#: midx.c:1195
+#: midx.c:1208
#, c-format
msgid "incorrect object offset for oid[%d] = %s: %<PRIx64> != %<PRIx64>"
msgstr "неправилно отместване на обект за oid[%d] = %s: %<PRIx64> != %<PRIx64>"
-#: midx.c:1220
+#: midx.c:1233
msgid "Counting referenced objects"
msgstr "Преброяване на свързаните обекти"
-#: midx.c:1230
+#: midx.c:1243
msgid "Finding and deleting unreferenced packfiles"
msgstr "Търсене и изтриване на несвързаните пакетни файлове"
-#: midx.c:1388
+#: midx.c:1433
msgid "could not start pack-objects"
msgstr "командата „pack-objects“ не може да бъде стартирана"
-#: midx.c:1407
+#: midx.c:1452
msgid "could not finish pack-objects"
msgstr "командата „pack-objects“ не може да бъде завършена"
@@ -5272,6 +5339,11 @@ msgstr "обектът „%s“ не може да бъде анализиран
msgid "hash mismatch %s"
msgstr "разлика в контролната сума: „%s“"
+#: pack-bitmap.c:815 pack-bitmap.c:821 builtin/pack-objects.c:2135
+#, c-format
+msgid "unable to get size of %s"
+msgstr "размерът на „%s“ не може да бъде получен"
+
#: packfile.c:629
msgid "offset before end of packfile (broken .idx?)"
msgstr ""
@@ -5291,10 +5363,27 @@ msgstr ""
"отместване преди края на индекса на пакетния файл „%s“ (възможно е индексът "
"да е отрязан)"
-#: pack-bitmap.c:800 pack-bitmap.c:806 builtin/pack-objects.c:2134
+#: parse-options-cb.c:20 parse-options-cb.c:24
#, c-format
-msgid "unable to get size of %s"
-msgstr "размерът на „%s“ не може да бъде получен"
+msgid "option `%s' expects a numerical value"
+msgstr "опцията „%s“ очаква число за аргумент"
+
+#: parse-options-cb.c:41
+#, c-format
+msgid "malformed expiration date '%s'"
+msgstr "неправилна дата на срок: „%s“"
+
+#: parse-options-cb.c:54
+#, c-format
+msgid "option `%s' expects \"always\", \"auto\", or \"never\""
+msgstr ""
+"опцията „%s“ изисква някоя от стойностите: „always“ (винаги), "
+"„auto“ (автоматично) или „never“ (никога)"
+
+#: parse-options-cb.c:130 parse-options-cb.c:147
+#, c-format
+msgid "malformed object name '%s'"
+msgstr "неправилно име на обект „%s“"
#: parse-options.c:38
#, c-format
@@ -5337,26 +5426,31 @@ msgstr "нееднозначна опция: „%s“ (може да е „--%s%
msgid "did you mean `--%s` (with two dashes)?"
msgstr "„--%s“ (с 2 тирета) ли имахте предвид?"
-#: parse-options.c:857
+#: parse-options.c:663 parse-options.c:963
+#, c-format
+msgid "alias of --%s"
+msgstr "псевдоним на „--%s“"
+
+#: parse-options.c:854
#, c-format
msgid "unknown option `%s'"
msgstr "непозната опция: „%s“"
-#: parse-options.c:859
+#: parse-options.c:856
#, c-format
msgid "unknown switch `%c'"
msgstr "непознат флаг „%c“"
-#: parse-options.c:861
+#: parse-options.c:858
#, c-format
msgid "unknown non-ascii option in string: `%s'"
msgstr "непозната стойност извън „ascii“ в низа: „%s“"
-#: parse-options.c:885
+#: parse-options.c:882
msgid "..."
msgstr "…"
-#: parse-options.c:904
+#: parse-options.c:901
#, c-format
msgid "usage: %s"
msgstr "употреба: %s"
@@ -5364,47 +5458,20 @@ msgstr "употреба: %s"
#. TRANSLATORS: the colon here should align with the
#. one in "usage: %s" translation.
#.
-#: parse-options.c:910
+#: parse-options.c:907
#, c-format
msgid " or: %s"
msgstr " или: %s"
-#: parse-options.c:913
+#: parse-options.c:910
#, c-format
msgid " %s"
msgstr " %s"
-#: parse-options.c:952
+#: parse-options.c:949
msgid "-NUM"
msgstr "-ЧИСЛО"
-#: parse-options.c:966
-#, c-format
-msgid "alias of --%s"
-msgstr "псевдоним на „--%s“"
-
-#: parse-options-cb.c:20 parse-options-cb.c:24
-#, c-format
-msgid "option `%s' expects a numerical value"
-msgstr "опцията „%s“ очаква число за аргумент"
-
-#: parse-options-cb.c:41
-#, c-format
-msgid "malformed expiration date '%s'"
-msgstr "неправилна дата на срок: „%s“"
-
-#: parse-options-cb.c:54
-#, c-format
-msgid "option `%s' expects \"always\", \"auto\", or \"never\""
-msgstr ""
-"опцията „%s“ изисква някоя от стойностите: „always“ (винаги), "
-"„auto“ (автоматично) или „never“ (никога)"
-
-#: parse-options-cb.c:130 parse-options-cb.c:147
-#, c-format
-msgid "malformed object name '%s'"
-msgstr "неправилно име на обект „%s“"
-
#: path.c:915
#, c-format
msgid "Could not make %s writable by group"
@@ -5464,27 +5531,27 @@ msgstr "Магическите пътища „%c“ са без реализа
msgid "%s: 'literal' and 'glob' are incompatible"
msgstr "%s: опциите „literal“ и „glob“ са несъвместими"
-#: pathspec.c:442
+#: pathspec.c:445
#, c-format
msgid "%s: '%s' is outside repository at '%s'"
msgstr "%s: „%s“ е извън хранилището при „%s“"
-#: pathspec.c:517
+#: pathspec.c:521
#, c-format
msgid "'%s' (mnemonic: '%c')"
msgstr "„%s“ (клавиш: „%c“)"
-#: pathspec.c:527
+#: pathspec.c:531
#, c-format
msgid "%s: pathspec magic not supported by this command: %s"
msgstr "%s: магическите пътища не се поддържат от командата „%s“"
-#: pathspec.c:594
+#: pathspec.c:598
#, c-format
msgid "pathspec '%s' is beyond a symbolic link"
msgstr "пътят „%s“ е след символна връзка"
-#: pathspec.c:639
+#: pathspec.c:643
#, c-format
msgid "line is badly quoted: %s"
msgstr "неправилно цитиран ред: %s"
@@ -5551,7 +5618,7 @@ msgstr "Обновяване на индекса"
msgid "unable to create threaded lstat: %s"
msgstr "не може да се създаде нишка за изпълнението на „lstat“: %s"
-#: pretty.c:981
+#: pretty.c:982
msgid "unable to parse --pretty format"
msgstr "аргументът към опцията „--pretty“ не може да се анализира"
@@ -5565,30 +5632,43 @@ msgid "promisor remote name cannot begin with '/': %s"
msgstr ""
"името отдалеченото хранилище-гарант не може за започва със знака „/“: %s"
-#: range-diff.c:75
+#: prune-packed.c:35
+msgid "Removing duplicate objects"
+msgstr "Изтриване на повтарящите се обекти"
+
+#: range-diff.c:77
msgid "could not start `log`"
msgstr "командата за журнала с подавания „log“ не може да се стартира"
-#: range-diff.c:77
+#: range-diff.c:79
msgid "could not read `log` output"
msgstr ""
"изходът от командата за журнала с подавания „log“ не може да се прочете"
-#: range-diff.c:96 sequencer.c:5020
+#: range-diff.c:98 sequencer.c:5143
#, c-format
msgid "could not parse commit '%s'"
msgstr "подаването „%s“ не може да бъде анализирано"
-#: range-diff.c:122
+#: range-diff.c:112
+#, c-format
+msgid ""
+"could not parse first line of `log` output: did not start with 'commit ': "
+"'%s'"
+msgstr ""
+"първият ред от изхода на командата „log“ не може да се анализира, защото не "
+"започва с „commit “: „%s“"
+
+#: range-diff.c:137
#, c-format
msgid "could not parse git header '%.*s'"
msgstr "заглавната част на git „%.*s“ не може да се анализира"
-#: range-diff.c:285
+#: range-diff.c:301
msgid "failed to generate diff"
msgstr "неуспешно търсене на разлика"
-#: range-diff.c:518 range-diff.c:520
+#: range-diff.c:534 range-diff.c:536
#, c-format
msgid "could not parse log for '%s'"
msgstr "журналът с подаванията на „%s“ не може да бъде анализиран"
@@ -5709,9 +5789,9 @@ msgstr "неподредени записи за „%s“"
#: read-cache.c:1983 read-cache.c:2271 rerere.c:565 rerere.c:599 rerere.c:1111
#: submodule.c:1619 builtin/add.c:532 builtin/check-ignore.c:181
-#: builtin/checkout.c:470 builtin/checkout.c:656 builtin/clean.c:967
-#: builtin/commit.c:367 builtin/diff-tree.c:120 builtin/grep.c:485
-#: builtin/mv.c:145 builtin/reset.c:246 builtin/rm.c:290
+#: builtin/checkout.c:488 builtin/checkout.c:676 builtin/clean.c:961
+#: builtin/commit.c:364 builtin/diff-tree.c:121 builtin/grep.c:507
+#: builtin/mv.c:145 builtin/reset.c:247 builtin/rm.c:290
#: builtin/submodule--helper.c:332
msgid "index file corrupt"
msgstr "файлът с индекса е повреден"
@@ -5768,12 +5848,12 @@ msgstr "споделеният индекс „%s“ не може да се о
msgid "broken index, expect %s in %s, got %s"
msgstr "грешки в индекса — в „%2$s“ се очаква „%1$s“, а бе получено „%3$s“"
-#: read-cache.c:3026 strbuf.c:1160 wrapper.c:622 builtin/merge.c:1122
+#: read-cache.c:3026 strbuf.c:1176 wrapper.c:622 builtin/merge.c:1130
#, c-format
msgid "could not close '%s'"
msgstr "„%s“ не може да се затвори"
-#: read-cache.c:3129 sequencer.c:2343 sequencer.c:3959
+#: read-cache.c:3129 sequencer.c:2355 sequencer.c:4066
#, c-format
msgid "could not stat '%s'"
msgstr "неуспешно изпълнение на „stat“ върху „%s“"
@@ -5912,14 +5992,14 @@ msgstr ""
"Ако изтриете всичко, пребазирането ще бъде преустановено.\n"
"\n"
-#: rebase-interactive.c:110 rerere.c:485 rerere.c:692 sequencer.c:3444
-#: sequencer.c:3470 sequencer.c:5125 builtin/fsck.c:346 builtin/rebase.c:252
+#: rebase-interactive.c:110 rerere.c:485 rerere.c:692 sequencer.c:3463
+#: sequencer.c:3489 sequencer.c:5248 builtin/fsck.c:347 builtin/rebase.c:258
#, c-format
msgid "could not write '%s'"
msgstr "„%s“ не може да се запише"
-#: rebase-interactive.c:116 builtin/rebase.c:184 builtin/rebase.c:210
-#: builtin/rebase.c:234
+#: rebase-interactive.c:116 builtin/rebase.c:190 builtin/rebase.c:216
+#: builtin/rebase.c:240
#, c-format
msgid "could not write '%s'."
msgstr "„%s“ не може да се запише."
@@ -5950,132 +6030,14 @@ msgstr ""
"предупреждение)\n"
"или „error“ (считане за грешка).\n"
-#: rebase-interactive.c:233 rebase-interactive.c:238 sequencer.c:2262
-#: builtin/rebase.c:170 builtin/rebase.c:195 builtin/rebase.c:221
-#: builtin/rebase.c:246
+#: rebase-interactive.c:233 rebase-interactive.c:238 sequencer.c:2274
+#: builtin/rebase.c:176 builtin/rebase.c:201 builtin/rebase.c:227
+#: builtin/rebase.c:252
#, c-format
msgid "could not read '%s'."
msgstr "от „%s“ не може да се чете."
-#: refs.c:262
-#, c-format
-msgid "%s does not point to a valid object!"
-msgstr "„%s“ не сочи към позволен обект!"
-
-#: refs.c:667
-#, c-format
-msgid "ignoring dangling symref %s"
-msgstr "игнориране на указател на обект извън клон „%s“"
-
-#: refs.c:669 ref-filter.c:2098
-#, c-format
-msgid "ignoring broken ref %s"
-msgstr "игнориране на повредения указател „%s“"
-
-#: refs.c:804
-#, c-format
-msgid "could not open '%s' for writing: %s"
-msgstr "„%s“ не може да бъде отворен за запис: %s"
-
-#: refs.c:814 refs.c:865
-#, c-format
-msgid "could not read ref '%s'"
-msgstr "указателят „%s“ не може да се прочете"
-
-#: refs.c:820
-#, c-format
-msgid "ref '%s' already exists"
-msgstr "указателят „%s“ вече съществува"
-
-#: refs.c:825
-#, c-format
-msgid "unexpected object ID when writing '%s'"
-msgstr "неочакван идентификатор на обект при записването на „%s“"
-
-#: refs.c:833 sequencer.c:407 sequencer.c:2701 sequencer.c:2905
-#: sequencer.c:2919 sequencer.c:3177 sequencer.c:5036 strbuf.c:1157
-#: wrapper.c:620
-#, c-format
-msgid "could not write to '%s'"
-msgstr "в „%s“ не може да се пише"
-
-#: refs.c:860 strbuf.c:1155 wrapper.c:188 wrapper.c:358 builtin/am.c:719
-#: builtin/rebase.c:1029
-#, c-format
-msgid "could not open '%s' for writing"
-msgstr "„%s“ не може да бъде отворен за запис"
-
-#: refs.c:867
-#, c-format
-msgid "unexpected object ID when deleting '%s'"
-msgstr "неочакван идентификатор на обект при изтриването на „%s“"
-
-#: refs.c:998
-#, c-format
-msgid "log for ref %s has gap after %s"
-msgstr "има пропуски в журнала с подаванията за указателя „%s“ след „%s“"
-
-#: refs.c:1004
-#, c-format
-msgid "log for ref %s unexpectedly ended on %s"
-msgstr "журналът с подаванията за указателя „%s“ свършва неочаквано след „%s“"
-
-#: refs.c:1063
-#, c-format
-msgid "log for %s is empty"
-msgstr "журналът с подаванията за указателя „%s“ е празен"
-
-#: refs.c:1155
-#, c-format
-msgid "refusing to update ref with bad name '%s'"
-msgstr "указател не може да се обнови с грешно име „%s“"
-
-#: refs.c:1231
-#, c-format
-msgid "update_ref failed for ref '%s': %s"
-msgstr "неуспешно обновяване на указателя „%s“: %s"
-
-#: refs.c:2023
-#, c-format
-msgid "multiple updates for ref '%s' not allowed"
-msgstr "не са позволени повече от една промени на указателя „%s“"
-
-#: refs.c:2055
-msgid "ref updates forbidden inside quarantine environment"
-msgstr "обновяванията на указатели са забранени в среди под карантина"
-
-#: refs.c:2151 refs.c:2181
-#, c-format
-msgid "'%s' exists; cannot create '%s'"
-msgstr "„%s“ съществува, не може да се създаде „%s“"
-
-#: refs.c:2157 refs.c:2192
-#, c-format
-msgid "cannot process '%s' and '%s' at the same time"
-msgstr "невъзможно е едновременно да се обработват „%s“ и „%s“"
-
-#: refs/files-backend.c:1233
-#, c-format
-msgid "could not remove reference %s"
-msgstr "Указателят „%s“ не може да бъде изтрит"
-
-#: refs/files-backend.c:1247 refs/packed-backend.c:1541
-#: refs/packed-backend.c:1551
-#, c-format
-msgid "could not delete reference %s: %s"
-msgstr "Указателят „%s“ не може да бъде изтрит: %s"
-
-#: refs/files-backend.c:1250 refs/packed-backend.c:1554
-#, c-format
-msgid "could not delete references: %s"
-msgstr "Указателите не може да бъдат изтрити: %s"
-
-#: refspec.c:137
-#, c-format
-msgid "invalid refspec '%s'"
-msgstr "неправилен указател: „%s“"
-
-#: ref-filter.c:42 wt-status.c:1938
+#: ref-filter.c:42 wt-status.c:1936
msgid "gone"
msgstr "изтрит"
@@ -6260,115 +6222,233 @@ msgstr "формат: лексемата %%(end) е използвана без
msgid "malformed format string %s"
msgstr "неправилен форматиращ низ „%s“"
-#: ref-filter.c:1488
+#: ref-filter.c:1486
#, c-format
msgid "no branch, rebasing %s"
msgstr "извън клон, пребазиране на „%s“"
-#: ref-filter.c:1491
+#: ref-filter.c:1489
#, c-format
msgid "no branch, rebasing detached HEAD %s"
msgstr "извън клон, пребазиране на несвързан указател „HEAD“ при „%s“"
-#: ref-filter.c:1494
+#: ref-filter.c:1492
#, c-format
msgid "no branch, bisect started on %s"
msgstr "извън клон, двоично търсене от „%s“"
-#: ref-filter.c:1504
+#: ref-filter.c:1502
msgid "no branch"
msgstr "извън клон"
-#: ref-filter.c:1540 ref-filter.c:1749
+#: ref-filter.c:1538 ref-filter.c:1747
#, c-format
msgid "missing object %s for %s"
msgstr "обектът „%s“ липсва за „%s“"
-#: ref-filter.c:1550
+#: ref-filter.c:1548
#, c-format
msgid "parse_object_buffer failed on %s for %s"
msgstr "неуспешно анализиране чрез „parse_object_buffer“ на „%s“ за „%s“"
-#: ref-filter.c:2004
+#: ref-filter.c:2001
#, c-format
msgid "malformed object at '%s'"
msgstr "обект със сгрешен формат при „%s“"
-#: ref-filter.c:2093
+#: ref-filter.c:2090
#, c-format
msgid "ignoring ref with broken name %s"
msgstr "игнориране на указателя с грешно име „%s“"
-#: ref-filter.c:2389
+#: ref-filter.c:2095 refs.c:625
+#, c-format
+msgid "ignoring broken ref %s"
+msgstr "игнориране на повредения указател „%s“"
+
+#: ref-filter.c:2395
#, c-format
msgid "format: %%(end) atom missing"
msgstr "грешка във форма̀та: липсва лексемата %%(end)"
-#: ref-filter.c:2489
+#: ref-filter.c:2495
#, c-format
msgid "option `%s' is incompatible with --merged"
msgstr "опциите „%s“ и „--merged“ са несъвместими"
-#: ref-filter.c:2492
+#: ref-filter.c:2498
#, c-format
msgid "option `%s' is incompatible with --no-merged"
msgstr "опциите „%s“ и „--no-merged“ са несъвместими"
-#: ref-filter.c:2502
+#: ref-filter.c:2508
#, c-format
msgid "malformed object name %s"
msgstr "неправилно име на обект „%s“"
-#: ref-filter.c:2507
+#: ref-filter.c:2513
#, c-format
msgid "option `%s' must point to a commit"
msgstr "опцията „%s“ не сочи към подаване"
-#: remote.c:366
+#: refs.c:262
+#, c-format
+msgid "%s does not point to a valid object!"
+msgstr "„%s“ не сочи към позволен обект!"
+
+#: refs.c:623
+#, c-format
+msgid "ignoring dangling symref %s"
+msgstr "игнориране на указател на обект извън клон „%s“"
+
+#: refs.c:760
+#, c-format
+msgid "could not open '%s' for writing: %s"
+msgstr "„%s“ не може да бъде отворен за запис: %s"
+
+#: refs.c:770 refs.c:821
+#, c-format
+msgid "could not read ref '%s'"
+msgstr "указателят „%s“ не може да се прочете"
+
+#: refs.c:776
+#, c-format
+msgid "ref '%s' already exists"
+msgstr "указателят „%s“ вече съществува"
+
+#: refs.c:781
+#, c-format
+msgid "unexpected object ID when writing '%s'"
+msgstr "неочакван идентификатор на обект при записването на „%s“"
+
+#: refs.c:789 sequencer.c:408 sequencer.c:2721 sequencer.c:2925
+#: sequencer.c:2939 sequencer.c:3195 sequencer.c:5159 strbuf.c:1173
+#: wrapper.c:620
+#, c-format
+msgid "could not write to '%s'"
+msgstr "в „%s“ не може да се пише"
+
+#: refs.c:816 strbuf.c:1171 wrapper.c:188 wrapper.c:358 builtin/am.c:719
+#: builtin/rebase.c:852
+#, c-format
+msgid "could not open '%s' for writing"
+msgstr "„%s“ не може да бъде отворен за запис"
+
+#: refs.c:823
+#, c-format
+msgid "unexpected object ID when deleting '%s'"
+msgstr "неочакван идентификатор на обект при изтриването на „%s“"
+
+#: refs.c:954
+#, c-format
+msgid "log for ref %s has gap after %s"
+msgstr "има пропуски в журнала с подаванията за указателя „%s“ след „%s“"
+
+#: refs.c:960
+#, c-format
+msgid "log for ref %s unexpectedly ended on %s"
+msgstr "журналът с подаванията за указателя „%s“ свършва неочаквано след „%s“"
+
+#: refs.c:1019
+#, c-format
+msgid "log for %s is empty"
+msgstr "журналът с подаванията за указателя „%s“ е празен"
+
+#: refs.c:1111
+#, c-format
+msgid "refusing to update ref with bad name '%s'"
+msgstr "указател не може да се обнови с грешно име „%s“"
+
+#: refs.c:1187
+#, c-format
+msgid "update_ref failed for ref '%s': %s"
+msgstr "неуспешно обновяване на указателя „%s“: %s"
+
+#: refs.c:1979
+#, c-format
+msgid "multiple updates for ref '%s' not allowed"
+msgstr "не са позволени повече от една промени на указателя „%s“"
+
+#: refs.c:2011
+msgid "ref updates forbidden inside quarantine environment"
+msgstr "обновяванията на указатели са забранени в среди под карантина"
+
+#: refs.c:2107 refs.c:2137
+#, c-format
+msgid "'%s' exists; cannot create '%s'"
+msgstr "„%s“ съществува, не може да се създаде „%s“"
+
+#: refs.c:2113 refs.c:2148
+#, c-format
+msgid "cannot process '%s' and '%s' at the same time"
+msgstr "невъзможно е едновременно да се обработват „%s“ и „%s“"
+
+#: refs/files-backend.c:1233
+#, c-format
+msgid "could not remove reference %s"
+msgstr "Указателят „%s“ не може да бъде изтрит"
+
+#: refs/files-backend.c:1247 refs/packed-backend.c:1541
+#: refs/packed-backend.c:1551
+#, c-format
+msgid "could not delete reference %s: %s"
+msgstr "Указателят „%s“ не може да бъде изтрит: %s"
+
+#: refs/files-backend.c:1250 refs/packed-backend.c:1554
+#, c-format
+msgid "could not delete references: %s"
+msgstr "Указателите не може да бъдат изтрити: %s"
+
+#: refspec.c:137
+#, c-format
+msgid "invalid refspec '%s'"
+msgstr "неправилен указател: „%s“"
+
+#: remote.c:355
#, c-format
msgid "config remote shorthand cannot begin with '/': %s"
msgstr ""
"съкращението за отдалечено хранилище не може за започва със знака „/“: %s"
-#: remote.c:414
+#: remote.c:403
msgid "more than one receivepack given, using the first"
msgstr "зададен е повече от един пакет за получаване, ще се ползва първият"
-#: remote.c:422
+#: remote.c:411
msgid "more than one uploadpack given, using the first"
msgstr "зададен е повече от един пакет за изпращане, ще се ползва първият"
-#: remote.c:612
+#: remote.c:594
#, c-format
msgid "Cannot fetch both %s and %s to %s"
msgstr "Невъзможно е да се доставят едновременно и „%s“, и „%s“ към „%s“"
-#: remote.c:616
+#: remote.c:598
#, c-format
msgid "%s usually tracks %s, not %s"
msgstr "„%s“ обикновено следи „%s“, а не „%s“"
-#: remote.c:620
+#: remote.c:602
#, c-format
msgid "%s tracks both %s and %s"
msgstr "„%s“ следи както „%s“, така и „%s“"
-#: remote.c:688
+#: remote.c:670
#, c-format
msgid "key '%s' of pattern had no '*'"
msgstr "ключ „%s“ на шаблона не съдържа „*“"
-#: remote.c:698
+#: remote.c:680
#, c-format
msgid "value '%s' of pattern has no '*'"
msgstr "стойност „%s“ на шаблона не съдържа „*“"
-#: remote.c:1004
+#: remote.c:986
#, c-format
msgid "src refspec %s does not match any"
msgstr "указателят на версия-източник „%s“ не съвпада с никой обект"
-#: remote.c:1009
+#: remote.c:991
#, c-format
msgid "src refspec %s matches more than one"
msgstr "указателят на версия-източник „%s“ съвпада с повече от един обект"
@@ -6377,7 +6457,7 @@ msgstr "указателят на версия-източник „%s“ съв
#. <remote> <src>:<dst>" push, and "being pushed ('%s')" is
#. the <src>.
#.
-#: remote.c:1024
+#: remote.c:1006
#, c-format
msgid ""
"The destination you provided is not a full refname (i.e.,\n"
@@ -6401,7 +6481,7 @@ msgstr ""
"Никой от вариантите не сработи. Трябва сами да укажете пълното име на\n"
"указателя."
-#: remote.c:1044
+#: remote.c:1026
#, c-format
msgid ""
"The <src> part of the refspec is a commit object.\n"
@@ -6412,7 +6492,7 @@ msgstr ""
"като\n"
"изтласкате към „%s:refs/heads/%s“?"
-#: remote.c:1049
+#: remote.c:1031
#, c-format
msgid ""
"The <src> part of the refspec is a tag object.\n"
@@ -6423,7 +6503,7 @@ msgstr ""
"като\n"
"изтласкате към „%s:refs/tags/%s“?"
-#: remote.c:1054
+#: remote.c:1036
#, c-format
msgid ""
"The <src> part of the refspec is a tree object.\n"
@@ -6433,7 +6513,7 @@ msgstr ""
"ИЗТОЧНИКът е обект-дърво. Не целите ли всъщност да създадете нов клон като\n"
"изтласкате към „%s:refs/tags/%s“?"
-#: remote.c:1059
+#: remote.c:1041
#, c-format
msgid ""
"The <src> part of the refspec is a blob object.\n"
@@ -6443,118 +6523,118 @@ msgstr ""
"ИЗТОЧНИКът е обект-BLOB. Не целите ли всъщност да създадете нов клон като\n"
"изтласкате към „%s:refs/tags/%s“?"
-#: remote.c:1095
+#: remote.c:1077
#, c-format
msgid "%s cannot be resolved to branch"
msgstr "не е открит клон съответстващ на „%s“"
-#: remote.c:1106
+#: remote.c:1088
#, c-format
msgid "unable to delete '%s': remote ref does not exist"
msgstr "„%s“ не може да се изтрие: отдалечения указател не съществува"
-#: remote.c:1118
+#: remote.c:1100
#, c-format
msgid "dst refspec %s matches more than one"
msgstr "указателят на версия-цел „%s“ съвпада с повече от един обект"
-#: remote.c:1125
+#: remote.c:1107
#, c-format
msgid "dst ref %s receives from more than one src"
msgstr ""
"указателят на версия-цел „%s“ съответства и ще получава от повече от един "
"източник"
-#: remote.c:1628 remote.c:1729
+#: remote.c:1610 remote.c:1711
msgid "HEAD does not point to a branch"
msgstr "Указателят „HEAD“ не сочи към клон"
-#: remote.c:1637
+#: remote.c:1619
#, c-format
msgid "no such branch: '%s'"
msgstr "няма клон на име „%s“"
-#: remote.c:1640
+#: remote.c:1622
#, c-format
msgid "no upstream configured for branch '%s'"
msgstr "не е зададен клон-източник за клона „%s“"
-#: remote.c:1646
+#: remote.c:1628
#, c-format
msgid "upstream branch '%s' not stored as a remote-tracking branch"
msgstr "клонът-източник „%s“ не е съхранен като следящ клон"
-#: remote.c:1661
+#: remote.c:1643
#, c-format
msgid "push destination '%s' on remote '%s' has no local tracking branch"
msgstr ""
"липсва локален следящ клон за местоположението за изтласкване „%s“ в "
"хранилището „%s“"
-#: remote.c:1673
+#: remote.c:1655
#, c-format
msgid "branch '%s' has no remote for pushing"
msgstr "няма информация клонът „%s“ да следи някой друг"
-#: remote.c:1683
+#: remote.c:1665
#, c-format
msgid "push refspecs for '%s' do not include '%s'"
msgstr "указателят за изтласкване на „%s“ не включва „%s“"
-#: remote.c:1696
+#: remote.c:1678
msgid "push has no destination (push.default is 'nothing')"
msgstr "указателят за изтласкване не включва цел („push.default“ е „nothing“)"
-#: remote.c:1718
+#: remote.c:1700
msgid "cannot resolve 'simple' push to a single destination"
msgstr "простото (simple) изтласкване не съответства на една цел"
-#: remote.c:1844
+#: remote.c:1826
#, c-format
msgid "couldn't find remote ref %s"
msgstr "отдалеченият указател „%s“ не може да бъде открит"
-#: remote.c:1857
+#: remote.c:1839
#, c-format
msgid "* Ignoring funny ref '%s' locally"
msgstr "• прескачане на неочаквания локален указател „%s“"
-#: remote.c:2020
+#: remote.c:2002
#, c-format
msgid "Your branch is based on '%s', but the upstream is gone.\n"
msgstr "Този клон следи „%s“, но следеният клон е изтрит.\n"
-#: remote.c:2024
+#: remote.c:2006
msgid " (use \"git branch --unset-upstream\" to fixup)\n"
msgstr " (за да коригирате това, използвайте „git branch --unset-upstream“)\n"
-#: remote.c:2027
+#: remote.c:2009
#, c-format
msgid "Your branch is up to date with '%s'.\n"
-msgstr "Клонът е актуализиран към „%s“.\n"
+msgstr "Клонът е обновен към „%s“.\n"
-#: remote.c:2031
+#: remote.c:2013
#, c-format
msgid "Your branch and '%s' refer to different commits.\n"
msgstr "Клонът ви и „%s“ сочат към различни подавания.\n"
-#: remote.c:2034
+#: remote.c:2016
#, c-format
msgid " (use \"%s\" for details)\n"
msgstr " (за повече информация ползвайте „%s“)\n"
-#: remote.c:2038
+#: remote.c:2020
#, 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:2044
+#: remote.c:2026
msgid " (use \"git push\" to publish your local commits)\n"
msgstr " (публикувайте локалните си промени чрез „git push“)\n"
-#: remote.c:2047
+#: remote.c:2029
#, c-format
msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n"
msgid_plural ""
@@ -6562,11 +6642,11 @@ msgid_plural ""
msgstr[0] "Клонът ви е с %2$d подаване зад „%1$s“ и може да бъде превъртян.\n"
msgstr[1] "Клонът ви е с %2$d подавания зад „%1$s“ и може да бъде превъртян.\n"
-#: remote.c:2055
+#: remote.c:2037
msgid " (use \"git pull\" to update your local branch)\n"
msgstr " (обновете локалния си клон чрез „git pull“)\n"
-#: remote.c:2058
+#: remote.c:2040
#, c-format
msgid ""
"Your branch and '%s' have diverged,\n"
@@ -6581,11 +6661,11 @@ msgstr[1] ""
"Текущият клон се е отделил от „%s“,\n"
"двата имат съответно по %d и %d несъвпадащи подавания.\n"
-#: remote.c:2068
+#: remote.c:2050
msgid " (use \"git pull\" to merge the remote branch into yours)\n"
msgstr " (слейте отдалечения клон в локалния чрез „git pull“)\n"
-#: remote.c:2251
+#: remote.c:2233
#, c-format
msgid "cannot parse expected object name '%s'"
msgstr "очакваното име на обект „%s“ не може да бъде анализирано"
@@ -6605,6 +6685,11 @@ msgstr "повтарящ се указател за замяна: „%s“"
msgid "replace depth too high for object %s"
msgstr "дълбочината на замяна е прекалено голяма за обекта: „%s“"
+#: repository.c:94 builtin/init-db.c:188
+#, c-format
+msgid "The hash algorithm %s is not supported in this build."
+msgstr "Текущият компилат не поддържа контролна сума по алгоритъм „%s“."
+
#: rerere.c:217 rerere.c:226 rerere.c:229
msgid "corrupt MERGE_RR"
msgstr "повреден „MERGE_RR“ (запис за коригиране на конфликт)"
@@ -6666,7 +6751,7 @@ msgstr "излишният обект „%s“ не може да се изтр
msgid "Recorded preimage for '%s'"
msgstr "Предварителният вариант на „%s“ е запазен"
-#: rerere.c:881 submodule.c:2078 builtin/log.c:1871
+#: rerere.c:881 submodule.c:2078 builtin/log.c:1891
#: builtin/submodule--helper.c:1454 builtin/submodule--helper.c:1466
#, c-format
msgid "could not create directory '%s'"
@@ -6701,20 +6786,29 @@ msgstr "Запазената корекция на конфликт при „%s
msgid "unable to open rr-cache directory"
msgstr "директорията „rr-cache“ не може да се отвори"
-#: revision.c:2497
+#: reset.c:42
+msgid "could not determine HEAD revision"
+msgstr "не може да се определи към какво да сочи указателят „HEAD“"
+
+#: reset.c:70 reset.c:76 sequencer.c:3318
+#, c-format
+msgid "failed to find tree of %s"
+msgstr "дървото, сочено от „%s“, не може да бъде открито"
+
+#: revision.c:2655
msgid "your current branch appears to be broken"
msgstr "Текущият клон е повреден"
-#: revision.c:2500
+#: revision.c:2658
#, c-format
msgid "your current branch '%s' does not have any commits yet"
msgstr "Текущият клон „%s“ е без подавания "
-#: revision.c:2708
+#: revision.c:2866
msgid "--first-parent is incompatible with --bisect"
msgstr "опциите „--first-parent“ и „--bisect“ са несъвместими"
-#: revision.c:2712
+#: revision.c:2870
msgid "-L does not yet support diff formats besides -p and -s"
msgstr ""
"опцията „-L“ поддържа единствено форматирането на разликите според опциите „-"
@@ -6739,32 +6833,32 @@ msgstr ""
"За да изключите това предупреждение, изпълнете:\n"
" git config advice.ignoredHook false"
-#: send-pack.c:144
+#: send-pack.c:145
msgid "unexpected flush packet while reading remote unpack status"
msgstr ""
"неочакван изчистващ пакет „flush“ при изчитане на състоянието от "
"отдалеченото разпакетиране"
-#: send-pack.c:146
+#: send-pack.c:147
#, c-format
msgid "unable to parse remote unpack status: %s"
msgstr ""
"състоянието от отдалеченото разпакетиране не може да бъде анализирано: %s"
-#: send-pack.c:148
+#: send-pack.c:149
#, c-format
msgid "remote unpack failed: %s"
msgstr "неуспешно отдалечено разпакетиране: %s"
-#: send-pack.c:309
+#: send-pack.c:308
msgid "failed to sign the push certificate"
msgstr "сертификатът за изтласкване не може да бъде подписан"
-#: send-pack.c:423
+#: send-pack.c:399
msgid "the receiving end does not support --signed push"
msgstr "отсрещната страна не поддържа изтласкване с опцията „--signed“"
-#: send-pack.c:425
+#: send-pack.c:401
msgid ""
"not sending a push certificate since the receiving end does not support --"
"signed push"
@@ -6772,47 +6866,47 @@ msgstr ""
"отсрещната страна не поддържа изтласкване с опцията „--signed“, затова не се "
"използва сертификат"
-#: send-pack.c:437
+#: send-pack.c:413
msgid "the receiving end does not support --atomic push"
msgstr "получаващата страна не поддържа изтласкване с опцията „--atomic“"
-#: send-pack.c:442
+#: send-pack.c:418
msgid "the receiving end does not support push options"
msgstr "отсрещната страна не поддържа опции при изтласкване"
-#: sequencer.c:191
+#: sequencer.c:192
#, c-format
msgid "invalid commit message cleanup mode '%s'"
msgstr "несъществуващ режим на изчистване „%s“ на съобщение при подаване"
-#: sequencer.c:296
+#: sequencer.c:297
#, c-format
msgid "could not delete '%s'"
msgstr "„%s“ не може да бъде изтрит"
-#: sequencer.c:315 builtin/rebase.c:785 builtin/rebase.c:1750 builtin/rm.c:385
+#: sequencer.c:316 builtin/rebase.c:743 builtin/rebase.c:1582 builtin/rm.c:385
#, c-format
msgid "could not remove '%s'"
msgstr "„%s“ не може да бъде изтрит"
-#: sequencer.c:325
+#: sequencer.c:326
msgid "revert"
msgstr "отмяна"
-#: sequencer.c:327
+#: sequencer.c:328
msgid "cherry-pick"
msgstr "отбиране"
-#: sequencer.c:329
+#: sequencer.c:330
msgid "rebase"
msgstr "пребазиране"
-#: sequencer.c:331
+#: sequencer.c:332
#, c-format
msgid "unknown action: %d"
msgstr "неизвестно действие: %d"
-#: sequencer.c:389
+#: sequencer.c:390
msgid ""
"after resolving the conflicts, mark the corrected paths\n"
"with 'git add <paths>' or 'git rm <paths>'"
@@ -6820,7 +6914,7 @@ msgstr ""
"след коригирането на конфликтите, отбележете съответните\n"
"пътища с „git add ПЪТ…“ или „git rm ПЪТ…“."
-#: sequencer.c:392
+#: sequencer.c:393
msgid ""
"after resolving the conflicts, mark the corrected paths\n"
"with 'git add <paths>' or 'git rm <paths>'\n"
@@ -6830,44 +6924,43 @@ msgstr ""
"пътища с „git add ПЪТ…“ или „git rm ПЪТ…“, след което\n"
"подайте резултата с командата „git commit'“."
-#: sequencer.c:405 sequencer.c:2901
+#: sequencer.c:406 sequencer.c:2921
#, c-format
msgid "could not lock '%s'"
msgstr "„%s“ не може да се заключи"
-#: sequencer.c:412
+#: sequencer.c:413
#, c-format
msgid "could not write eol to '%s'"
msgstr "краят на ред не може да се запише в „%s“"
-#: sequencer.c:417 sequencer.c:2706 sequencer.c:2907 sequencer.c:2921
-#: sequencer.c:3185
+#: sequencer.c:418 sequencer.c:2726 sequencer.c:2927 sequencer.c:2941
+#: sequencer.c:3203
#, c-format
msgid "failed to finalize '%s'"
msgstr "„%s“ не може да се завърши"
-#: sequencer.c:440 sequencer.c:1613 sequencer.c:2726 sequencer.c:3167
-#: sequencer.c:3276 builtin/am.c:249 builtin/commit.c:787 builtin/merge.c:1120
-#: builtin/rebase.c:593
+#: sequencer.c:431 sequencer.c:1620 sequencer.c:2746 sequencer.c:3185
+#: sequencer.c:3294 builtin/am.c:249 builtin/commit.c:786 builtin/merge.c:1128
#, c-format
msgid "could not read '%s'"
msgstr "файлът „%s“ не може да бъде прочетен"
-#: sequencer.c:466
+#: sequencer.c:457
#, c-format
msgid "your local changes would be overwritten by %s."
msgstr "локалните ви промени ще бъдат презаписани при %s."
-#: sequencer.c:470
+#: sequencer.c:461
msgid "commit your changes or stash them to proceed."
msgstr "подайте или скатайте промените, за да продължите"
-#: sequencer.c:502
+#: sequencer.c:493
#, c-format
msgid "%s: fast-forward"
msgstr "%s: превъртане"
-#: sequencer.c:541 builtin/tag.c:565
+#: sequencer.c:532 builtin/tag.c:566
#, c-format
msgid "Invalid cleanup mode %s"
msgstr "Несъществуващ режим на изчистване „%s“"
@@ -6875,65 +6968,65 @@ msgstr "Несъществуващ режим на изчистване „%s“
#. TRANSLATORS: %s will be "revert", "cherry-pick" or
#. "rebase".
#.
-#: sequencer.c:635
+#: sequencer.c:626
#, c-format
msgid "%s: Unable to write new index file"
msgstr "%s: новият индекс не може да бъде запазен"
-#: sequencer.c:652
+#: sequencer.c:643
msgid "unable to update cache tree"
msgstr "дървото на кеша не може да бъде обновено"
-#: sequencer.c:666
+#: sequencer.c:657
msgid "could not resolve HEAD commit"
msgstr "подаването, сочено от указателя „HEAD“, не може да бъде открито"
-#: sequencer.c:746
+#: sequencer.c:737
#, c-format
msgid "no key present in '%.*s'"
msgstr "в „%.*s“ няма ключове"
-#: sequencer.c:757
+#: sequencer.c:748
#, c-format
msgid "unable to dequote value of '%s'"
msgstr "цитирането на стойността на „%s“ не може да бъде изчистено"
-#: sequencer.c:794 wrapper.c:190 wrapper.c:360 builtin/am.c:710
-#: builtin/am.c:802 builtin/merge.c:1117 builtin/rebase.c:1072
+#: sequencer.c:785 wrapper.c:190 wrapper.c:360 builtin/am.c:710
+#: builtin/am.c:802 builtin/merge.c:1125 builtin/rebase.c:896
#, c-format
msgid "could not open '%s' for reading"
msgstr "файлът не може да бъде прочетен: „%s“"
-#: sequencer.c:804
+#: sequencer.c:795
msgid "'GIT_AUTHOR_NAME' already given"
msgstr "настройката за автор „GIT_AUTHOR_NAME“ вече е зададена"
-#: sequencer.c:809
+#: sequencer.c:800
msgid "'GIT_AUTHOR_EMAIL' already given"
msgstr "настройката за е-поща „GIT_AUTHOR_EMAIL“ вече е зададена"
-#: sequencer.c:814
+#: sequencer.c:805
msgid "'GIT_AUTHOR_DATE' already given"
msgstr "настройката за дата „GIT_AUTHOR_DATE“ вече е зададена"
-#: sequencer.c:818
+#: sequencer.c:809
#, c-format
msgid "unknown variable '%s'"
msgstr "непозната променлива „%s“"
-#: sequencer.c:823
+#: sequencer.c:814
msgid "missing 'GIT_AUTHOR_NAME'"
msgstr "настройката за автор „GIT_AUTHOR_NAME“ липсва"
-#: sequencer.c:825
+#: sequencer.c:816
msgid "missing 'GIT_AUTHOR_EMAIL'"
msgstr "настройката за е-поща „GIT_AUTHOR_EMAIL“ липсва"
-#: sequencer.c:827
+#: sequencer.c:818
msgid "missing 'GIT_AUTHOR_DATE'"
msgstr "настройката за дата „GIT_AUTHOR_DATE“ липсва"
-#: sequencer.c:876
+#: sequencer.c:867
#, c-format
msgid ""
"you have staged changes in your working tree\n"
@@ -6962,13 +7055,13 @@ msgstr ""
"\n"
" git rebase --continue\n"
-#: sequencer.c:1148
+#: sequencer.c:1141
msgid "'prepare-commit-msg' hook failed"
msgstr ""
"неуспешно изпълнение на куката при промяна на съобщението при подаване "
"(prepare-commit-msg)"
-#: sequencer.c:1154
+#: sequencer.c:1147
msgid ""
"Your name and email address were configured automatically based\n"
"on your username and hostname. Please check that they are accurate.\n"
@@ -6997,7 +7090,7 @@ msgstr ""
"\n"
" git commit --amend --reset-author\n"
-#: sequencer.c:1167
+#: sequencer.c:1160
msgid ""
"Your name and email address were configured automatically based\n"
"on your username and hostname. Please check that they are accurate.\n"
@@ -7023,337 +7116,342 @@ msgstr ""
"\n"
" git commit --amend --reset-author\n"
-#: sequencer.c:1209
+#: sequencer.c:1202
msgid "couldn't look up newly created commit"
msgstr "току що създаденото подаване не може да бъде открито"
-#: sequencer.c:1211
+#: sequencer.c:1204
msgid "could not parse newly created commit"
msgstr "току що създаденото подаване не може да бъде анализирано"
-#: sequencer.c:1257
+#: sequencer.c:1250
msgid "unable to resolve HEAD after creating commit"
msgstr ""
"състоянието сочено от указателя „HEAD“ не може да бъде открито след "
"подаването"
-#: sequencer.c:1259
+#: sequencer.c:1252
msgid "detached HEAD"
msgstr "несвързан връх „HEAD“"
-#: sequencer.c:1263
+#: sequencer.c:1256
msgid " (root-commit)"
msgstr " (начално подаване)"
-#: sequencer.c:1284
+#: sequencer.c:1277
msgid "could not parse HEAD"
msgstr "указателят „HEAD“ не може да бъде анализиран"
-#: sequencer.c:1286
+#: sequencer.c:1279
#, c-format
msgid "HEAD %s is not a commit!"
msgstr "указателят „HEAD“ „%s“ сочи към нещо, което не е подаване!"
-#: sequencer.c:1290 sequencer.c:1364 builtin/commit.c:1574
+#: sequencer.c:1283 sequencer.c:1357 builtin/commit.c:1579
msgid "could not parse HEAD commit"
msgstr "върховото подаване „HEAD“ не може да бъде прочетено"
-#: sequencer.c:1342 sequencer.c:1968
+#: sequencer.c:1335 sequencer.c:1980
msgid "unable to parse commit author"
msgstr "авторът на подаването не може да бъде анализиран"
-#: sequencer.c:1353 builtin/am.c:1566 builtin/merge.c:687
+#: sequencer.c:1346 builtin/am.c:1566 builtin/merge.c:695
msgid "git write-tree failed to write a tree"
msgstr "Командата „git write-tree“ не успя да запише обект-дърво"
-#: sequencer.c:1386 sequencer.c:1447
+#: sequencer.c:1379 sequencer.c:1450
#, c-format
msgid "unable to read commit message from '%s'"
msgstr "съобщението за подаване не може да бъде прочетено от „%s“"
-#: sequencer.c:1413 builtin/am.c:1588 builtin/commit.c:1673 builtin/merge.c:886
-#: builtin/merge.c:911
+#: sequencer.c:1406 builtin/am.c:1588 builtin/commit.c:1680 builtin/merge.c:894
+#: builtin/merge.c:919
msgid "failed to write commit object"
msgstr "обектът за подаването не може да бъде записан"
-#: sequencer.c:1474
+#: sequencer.c:1433 sequencer.c:4118
+#, c-format
+msgid "could not update %s"
+msgstr "„%s“ не може да се обнови"
+
+#: sequencer.c:1481
#, c-format
msgid "could not parse commit %s"
msgstr "подаването „%s“ не може да бъде анализирано"
-#: sequencer.c:1479
+#: sequencer.c:1486
#, c-format
msgid "could not parse parent commit %s"
msgstr "родителското подаване „%s“ не може да бъде анализирано"
-#: sequencer.c:1562 sequencer.c:1673
+#: sequencer.c:1569 sequencer.c:1680
#, c-format
msgid "unknown command: %d"
msgstr "непозната команда: %d"
-#: sequencer.c:1620 sequencer.c:1645
+#: sequencer.c:1627 sequencer.c:1652
#, c-format
msgid "This is a combination of %d commits."
msgstr "Това е обединение от %d подавания"
-#: sequencer.c:1630
+#: sequencer.c:1637
msgid "need a HEAD to fixup"
msgstr "За вкарване в предходното подаване ви трябва указател „HEAD“"
-#: sequencer.c:1632 sequencer.c:3212
+#: sequencer.c:1639 sequencer.c:3230
msgid "could not read HEAD"
msgstr "указателят „HEAD“ не може да се прочете"
-#: sequencer.c:1634
+#: sequencer.c:1641
msgid "could not read HEAD's commit message"
msgstr ""
"съобщението за подаване към указателя „HEAD“ не може да бъде прочетено: %s"
-#: sequencer.c:1640
+#: sequencer.c:1647
#, c-format
msgid "cannot write '%s'"
msgstr "„%s“ не може да се запази"
-#: sequencer.c:1647 git-rebase--preserve-merges.sh:496
+#: sequencer.c:1654 git-rebase--preserve-merges.sh:496
msgid "This is the 1st commit message:"
msgstr "Това е 1-то съобщение при подаване:"
-#: sequencer.c:1655
+#: sequencer.c:1662
#, c-format
msgid "could not read commit message of %s"
msgstr "съобщението за подаване към „%s“ не може да бъде прочетено"
-#: sequencer.c:1662
+#: sequencer.c:1669
#, c-format
msgid "This is the commit message #%d:"
msgstr "Това е съобщение при подаване №%d:"
-#: sequencer.c:1668
+#: sequencer.c:1675
#, c-format
msgid "The commit message #%d will be skipped:"
msgstr "Съобщение при подаване №%d ще бъде прескочено:"
-#: sequencer.c:1756
+#: sequencer.c:1763
msgid "your index file is unmerged."
msgstr "индексът не е слят."
-#: sequencer.c:1763
+#: sequencer.c:1770
msgid "cannot fixup root commit"
msgstr "началното подаване не може да се вкара в предходното му"
-#: sequencer.c:1782
+#: sequencer.c:1789
#, c-format
msgid "commit %s is a merge but no -m option was given."
msgstr "подаването „%s“ е сливане, но не е дадена опцията „-m“"
-#: sequencer.c:1790 sequencer.c:1798
+#: sequencer.c:1797 sequencer.c:1805
#, c-format
msgid "commit %s does not have parent %d"
msgstr "подаването „%s“ няма родител %d"
-#: sequencer.c:1804
+#: sequencer.c:1811
#, c-format
msgid "cannot get commit message for %s"
msgstr "неуспешно извличане на съобщението за подаване на „%s“"
#. TRANSLATORS: The first %s will be a "todo" command like
#. "revert" or "pick", the second %s a SHA1.
-#: sequencer.c:1823
+#: sequencer.c:1830
#, c-format
msgid "%s: cannot parse parent commit %s"
msgstr "%s: неразпозната стойност за родителското подаване „%s“"
-#: sequencer.c:1888
+#: sequencer.c:1895
#, c-format
msgid "could not rename '%s' to '%s'"
msgstr "„%s“ не може да се преименува на „%s“"
-#: sequencer.c:1943
+#: sequencer.c:1952
#, c-format
msgid "could not revert %s... %s"
msgstr "подаването „%s“… не може да бъде отменено: „%s“"
-#: sequencer.c:1944
+#: sequencer.c:1953
#, c-format
msgid "could not apply %s... %s"
msgstr "подаването „%s“… не може да бъде приложено: „%s“"
-#: sequencer.c:1961
+#: sequencer.c:1972
#, c-format
msgid "dropping %s %s -- patch contents already upstream\n"
msgstr "прескачане на %s %s — кръпката вече е приложена\n"
-#: sequencer.c:2018
+#: sequencer.c:2030
#, c-format
msgid "git %s: failed to read the index"
msgstr "git %s: неуспешно изчитане на индекса"
-#: sequencer.c:2025
+#: sequencer.c:2037
#, c-format
msgid "git %s: failed to refresh the index"
msgstr "git %s: неуспешно обновяване на индекса"
-#: sequencer.c:2102
+#: sequencer.c:2114
#, c-format
msgid "%s does not accept arguments: '%s'"
msgstr "„%s“ не приема аргументи: „%s“"
-#: sequencer.c:2111
+#: sequencer.c:2123
#, c-format
msgid "missing arguments for %s"
msgstr "„%s“ изисква аргументи"
-#: sequencer.c:2142
+#: sequencer.c:2154
#, c-format
msgid "could not parse '%s'"
msgstr "„%s“ не може да се анализира"
-#: sequencer.c:2203
+#: sequencer.c:2215
#, c-format
msgid "invalid line %d: %.*s"
msgstr "неправилен ред %d: %.*s"
-#: sequencer.c:2214
+#: sequencer.c:2226
#, c-format
msgid "cannot '%s' without a previous commit"
msgstr "Без предишно подаване не може да се изпълни „%s“"
-#: sequencer.c:2298
+#: sequencer.c:2310
msgid "cancelling a cherry picking in progress"
msgstr "преустановяване на извършваното в момента отбиране на подавания"
-#: sequencer.c:2305
+#: sequencer.c:2317
msgid "cancelling a revert in progress"
msgstr "преустановяване на извършваното в момента отмяна на подаване"
-#: sequencer.c:2349
+#: sequencer.c:2361
msgid "please fix this using 'git rebase --edit-todo'."
msgstr "коригирайте това чрез „git rebase --edit-todo“."
-#: sequencer.c:2351
+#: sequencer.c:2363
#, c-format
msgid "unusable instruction sheet: '%s'"
msgstr "неизползваем файл с описание на предстоящите действия: „%s“"
-#: sequencer.c:2356
+#: sequencer.c:2368
msgid "no commits parsed."
msgstr "никое от подаванията не може да се разпознае."
-#: sequencer.c:2367
+#: sequencer.c:2379
msgid "cannot cherry-pick during a revert."
msgstr ""
"по време на отмяна на подаване не може да се извърши отбиране на подаване."
-#: sequencer.c:2369
+#: sequencer.c:2381
msgid "cannot revert during a cherry-pick."
msgstr "по време на отбиране не може да се извърши отмяна на подаване."
-#: sequencer.c:2447
+#: sequencer.c:2459
#, c-format
msgid "invalid value for %s: %s"
msgstr "неправилна стойност за „%s“: „%s“"
-#: sequencer.c:2540
+#: sequencer.c:2556
msgid "unusable squash-onto"
msgstr "подаването, в което другите да се вкарат, не може да се използва"
-#: sequencer.c:2556
+#: sequencer.c:2576
#, c-format
msgid "malformed options sheet: '%s'"
msgstr "неправилен файл с опции: „%s“"
-#: sequencer.c:2644 sequencer.c:4361
+#: sequencer.c:2664 sequencer.c:4469
msgid "empty commit set passed"
msgstr "зададено е празно множество от подавания"
-#: sequencer.c:2660
+#: sequencer.c:2680
msgid "revert is already in progress"
msgstr "в момента вече се извършва отмяна на подавания"
-#: sequencer.c:2662
+#: sequencer.c:2682
#, c-format
msgid "try \"git revert (--continue | %s--abort | --quit)\""
msgstr "използвайте „git cherry-pick (--continue | %s--abort | --quit)“"
-#: sequencer.c:2665
+#: sequencer.c:2685
msgid "cherry-pick is already in progress"
msgstr "в момента вече се извършва отбиране на подавания"
-#: sequencer.c:2667
+#: sequencer.c:2687
#, c-format
msgid "try \"git cherry-pick (--continue | %s--abort | --quit)\""
msgstr "използвайте „git cherry-pick (--continue | %s--abort | --quit)“"
-#: sequencer.c:2681
+#: sequencer.c:2701
#, c-format
msgid "could not create sequencer directory '%s'"
msgstr ""
"директорията за определянето на последователността „%s“ не може да бъде "
"създадена"
-#: sequencer.c:2696
+#: sequencer.c:2716
msgid "could not lock HEAD"
msgstr "указателят „HEAD“ не може да се заключи"
-#: sequencer.c:2756 sequencer.c:4099
+#: sequencer.c:2776 sequencer.c:4206
msgid "no cherry-pick or revert in progress"
msgstr ""
"в момента не се извършва отбиране на подавания или пребазиране на клона"
-#: sequencer.c:2758 sequencer.c:2769
+#: sequencer.c:2778 sequencer.c:2789
msgid "cannot resolve HEAD"
msgstr "Подаването сочено от указателя „HEAD“ не може да бъде открито"
-#: sequencer.c:2760 sequencer.c:2804
+#: sequencer.c:2780 sequencer.c:2824
msgid "cannot abort from a branch yet to be born"
msgstr ""
"действието не може да бъде преустановено, когато сте на клон, който тепърва "
"предстои да бъде създаден"
-#: sequencer.c:2790 builtin/grep.c:724
+#: sequencer.c:2810 builtin/grep.c:744
#, c-format
msgid "cannot open '%s'"
msgstr "„%s“ не може да бъде отворен"
-#: sequencer.c:2792
+#: sequencer.c:2812
#, c-format
msgid "cannot read '%s': %s"
msgstr "„%s“ не може да бъде прочетен: %s"
-#: sequencer.c:2793
+#: sequencer.c:2813
msgid "unexpected end of file"
msgstr "неочакван край на файл"
-#: sequencer.c:2799
+#: sequencer.c:2819
#, c-format
msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
msgstr ""
"запазеният преди започването на отбирането файл за указателя „HEAD“ — „%s“ е "
"повреден"
-#: sequencer.c:2810
+#: sequencer.c:2830
msgid "You seem to have moved HEAD. Not rewinding, check your HEAD!"
msgstr ""
"Изглежда указателят „HEAD“ е променен. Проверете към какво сочи.\n"
"Не се правят промени."
-#: sequencer.c:2851
+#: sequencer.c:2871
msgid "no revert in progress"
msgstr "в момента не тече пребазиране"
-#: sequencer.c:2859
+#: sequencer.c:2879
msgid "no cherry-pick in progress"
msgstr "в момента не се извършва отбиране на подавания"
-#: sequencer.c:2869
+#: sequencer.c:2889
msgid "failed to skip the commit"
msgstr "неуспешно прескачане на подаването"
-#: sequencer.c:2876
+#: sequencer.c:2896
msgid "there is nothing to skip"
msgstr "няма какво да се прескочи"
-#: sequencer.c:2879
+#: sequencer.c:2899
#, c-format
msgid ""
"have you committed already?\n"
@@ -7363,21 +7461,16 @@ msgstr ""
"\n"
" git %s --continue"
-#: sequencer.c:3003 sequencer.c:4011
-#, c-format
-msgid "could not update %s"
-msgstr "„%s“ не може да се обнови"
-
-#: sequencer.c:3042 sequencer.c:3991
+#: sequencer.c:3060 sequencer.c:4098
msgid "cannot read HEAD"
msgstr "указателят „HEAD“ не може да бъде прочетен"
-#: sequencer.c:3059
+#: sequencer.c:3077
#, c-format
msgid "unable to copy '%s' to '%s'"
msgstr "„%s“ не може да се копира като „%s“"
-#: sequencer.c:3067
+#: sequencer.c:3085
#, c-format
msgid ""
"You can amend the commit now, with\n"
@@ -7396,22 +7489,27 @@ msgstr ""
"\n"
" git rebase --continue\n"
-#: sequencer.c:3077
+#: sequencer.c:3095
#, c-format
msgid "Could not apply %s... %.*s"
msgstr "Подаването „%s“… не може да бъде приложено: „%.*s“"
-#: sequencer.c:3084
+#: sequencer.c:3102
#, c-format
msgid "Could not merge %.*s"
msgstr "Невъзможно сливане на „%.*s“"
-#: sequencer.c:3098 sequencer.c:3102 builtin/difftool.c:641
+#: sequencer.c:3116 sequencer.c:3120 builtin/difftool.c:641
#, c-format
msgid "could not copy '%s' to '%s'"
msgstr "„%s“ не може да се копира като „%s“"
-#: sequencer.c:3129
+#: sequencer.c:3132
+#, c-format
+msgid "Executing: %s\n"
+msgstr "В момента се изпълнява: %s\n"
+
+#: sequencer.c:3147
#, c-format
msgid ""
"execution failed: %s\n"
@@ -7426,11 +7524,11 @@ msgstr ""
" git rebase --continue\n"
"\n"
-#: sequencer.c:3135
+#: sequencer.c:3153
msgid "and made changes to the index and/or the working tree\n"
msgstr "и променѝ индекса и/или работното дърво\n"
-#: sequencer.c:3141
+#: sequencer.c:3159
#, c-format
msgid ""
"execution succeeded: %s\n"
@@ -7447,102 +7545,129 @@ msgstr ""
" git rebase --continue\n"
"\n"
-#: sequencer.c:3202
+#: sequencer.c:3220
#, c-format
msgid "illegal label name: '%.*s'"
msgstr "неправилно име на етикет: „%.*s“"
-#: sequencer.c:3256
+#: sequencer.c:3274
msgid "writing fake root commit"
msgstr "запазване на фалшиво начално подаване"
-#: sequencer.c:3261
+#: sequencer.c:3279
msgid "writing squash-onto"
msgstr "запазване на подаването, в което другите да се вкарат"
-#: sequencer.c:3299 builtin/rebase.c:880 builtin/rebase.c:886
-#, c-format
-msgid "failed to find tree of %s"
-msgstr "дървото, сочено от „%s“, не може да бъде открито"
-
-#: sequencer.c:3344
+#: sequencer.c:3363
#, c-format
msgid "could not resolve '%s'"
msgstr "„%s“ не може да бъде открит"
-#: sequencer.c:3375
+#: sequencer.c:3394
msgid "cannot merge without a current revision"
msgstr "без текущо подаване не може да се слива"
-#: sequencer.c:3397
+#: sequencer.c:3416
#, c-format
msgid "unable to parse '%.*s'"
msgstr "„%.*s“ не може да се анализира"
-#: sequencer.c:3406
+#: sequencer.c:3425
#, c-format
msgid "nothing to merge: '%.*s'"
msgstr "няма нищо за сливане: „%.*s“"
-#: sequencer.c:3418
+#: sequencer.c:3437
msgid "octopus merge cannot be executed on top of a [new root]"
msgstr "върху начално подаване не може да се извърши множествено сливане"
-#: sequencer.c:3434
+#: sequencer.c:3453
#, c-format
msgid "could not get commit message of '%s'"
msgstr "съобщението за подаване към „%s“ не може да бъде получено"
-#: sequencer.c:3594
+#: sequencer.c:3613
#, c-format
msgid "could not even attempt to merge '%.*s'"
msgstr "сливането на „%.*s“ не може даже да започне"
-#: sequencer.c:3610
+#: sequencer.c:3629
msgid "merge: Unable to write new index file"
msgstr "сливане: новият индекс не може да бъде запазен"
-#: sequencer.c:3679 builtin/rebase.c:737
+#: sequencer.c:3703
+msgid "Cannot autostash"
+msgstr "Не може да се скатае автоматично"
+
+#: sequencer.c:3706
+#, c-format
+msgid "Unexpected stash response: '%s'"
+msgstr "Неочакван резултат при скатаване: „%s“"
+
+#: sequencer.c:3712
+#, c-format
+msgid "Could not create directory for '%s'"
+msgstr "Директорията за „%s“ не може да бъде създадена"
+
+#: sequencer.c:3715
+#, c-format
+msgid "Created autostash: %s\n"
+msgstr "Автоматично скатано: „%s“\n"
+
+#: sequencer.c:3719
+msgid "could not reset --hard"
+msgstr "неуспешно изпълнение на „git reset --hard“"
+
+#: sequencer.c:3744
#, c-format
msgid "Applied autostash.\n"
msgstr "Автоматично скатаното е приложено.\n"
-#: sequencer.c:3691
+#: sequencer.c:3756
#, c-format
msgid "cannot store %s"
msgstr "„%s“ не може да бъде запазен"
-#: sequencer.c:3694 builtin/rebase.c:753 git-rebase--preserve-merges.sh:113
+#: sequencer.c:3759
#, c-format
msgid ""
-"Applying autostash resulted in conflicts.\n"
+"%s\n"
"Your changes are safe in the stash.\n"
"You can run \"git stash pop\" or \"git stash drop\" at any time.\n"
msgstr ""
-"Прилагането на автоматично скатаното доведе до конфликти. Промените ви са\n"
-"надеждно скатани. Можете да пробвате да ги приложите чрез „git stash pop“\n"
-"или да ги изхвърлите чрез „git stash drop“, когато поискате.\n"
+"%s\n"
+"Промените ви са надеждно скатани. Можете да пробвате да ги приложите чрез\n"
+"„git stash pop“ или да ги изхвърлите чрез „git stash drop“, когато "
+"поискате.\n"
-#: sequencer.c:3755
+#: sequencer.c:3764
+msgid "Applying autostash resulted in conflicts."
+msgstr "Конфликти при прилагането на автоматично скатаното."
+
+#: sequencer.c:3765
+msgid "Autostash exists; creating a new stash entry."
+msgstr "Вече има запис за автоматично скатано, затова се създава нов запис."
+
+#: sequencer.c:3857
#, c-format
msgid "%s: not a valid OID"
msgstr "„%s“ е неправилен идентификатор на обект"
-#: sequencer.c:3760 git-rebase--preserve-merges.sh:779
+#: sequencer.c:3862 git-rebase--preserve-merges.sh:779
msgid "could not detach HEAD"
msgstr "указателят „HEAD“ не може да се отдели"
-#: sequencer.c:3775
+#: sequencer.c:3877
#, c-format
msgid "Stopped at HEAD\n"
msgstr "Бе спряно при „HEAD“\n"
-#: sequencer.c:3777
+#: sequencer.c:3879
#, c-format
msgid "Stopped at %s\n"
msgstr "Бе спряно при „%s“\n"
-#: sequencer.c:3785
+#: sequencer.c:3887
#, c-format
msgid ""
"Could not execute the todo command\n"
@@ -7565,48 +7690,58 @@ msgstr ""
" git rebase --edit-todo\n"
" git rebase --continue\n"
-#: sequencer.c:3869
+#: sequencer.c:3931
+#, c-format
+msgid "Rebasing (%d/%d)%s"
+msgstr "Пребазиране (%d/%d)%s"
+
+#: sequencer.c:3976
#, c-format
msgid "Stopped at %s... %.*s\n"
msgstr "Спиране при „%s“… %.*s\n"
-#: sequencer.c:3940
+#: sequencer.c:4047
#, c-format
msgid "unknown command %d"
msgstr "непозната команда %d"
-#: sequencer.c:3999
+#: sequencer.c:4106
msgid "could not read orig-head"
msgstr "указателят за „orig-head“ не може да се прочете"
-#: sequencer.c:4004
+#: sequencer.c:4111
msgid "could not read 'onto'"
msgstr "указателят за „onto“ не може да се прочете"
-#: sequencer.c:4018
+#: sequencer.c:4125
#, c-format
msgid "could not update HEAD to %s"
msgstr "„HEAD“ не може да бъде обновен до „%s“"
-#: sequencer.c:4111
+#: sequencer.c:4185
+#, c-format
+msgid "Successfully rebased and updated %s.\n"
+msgstr "Успешно пребазиране и обновяване на „%s“.\n"
+
+#: sequencer.c:4218
msgid "cannot rebase: You have unstaged changes."
msgstr "не може да пребазирате, защото има промени, които не са в индекса."
-#: sequencer.c:4120
+#: sequencer.c:4227
msgid "cannot amend non-existing commit"
msgstr "несъществуващо подаване не може да се поправи"
-#: sequencer.c:4122
+#: sequencer.c:4229
#, c-format
msgid "invalid file: '%s'"
msgstr "неправилен файл: „%s“"
-#: sequencer.c:4124
+#: sequencer.c:4231
#, c-format
msgid "invalid contents: '%s'"
msgstr "неправилно съдържание: „%s“"
-#: sequencer.c:4127
+#: sequencer.c:4234
msgid ""
"\n"
"You have uncommitted changes in your working tree. Please, commit them\n"
@@ -7616,59 +7751,59 @@ msgstr ""
"В работното дърво има неподадени промени. Първо ги подайте, а след това\n"
"отново изпълнете „git rebase --continue“."
-#: sequencer.c:4163 sequencer.c:4202
+#: sequencer.c:4270 sequencer.c:4309
#, c-format
msgid "could not write file: '%s'"
msgstr "файлът „%s“ не може да бъде записан"
-#: sequencer.c:4217
+#: sequencer.c:4324
msgid "could not remove CHERRY_PICK_HEAD"
msgstr "указателят „CHERRY_PICK_HEAD“ не може да бъде изтрит"
-#: sequencer.c:4224
+#: sequencer.c:4331
msgid "could not commit staged changes."
msgstr "промените в индекса не могат да бъдат подадени."
-#: sequencer.c:4338
+#: sequencer.c:4446
#, c-format
msgid "%s: can't cherry-pick a %s"
msgstr "%s: не може да се отбере „%s“"
-#: sequencer.c:4342
+#: sequencer.c:4450
#, c-format
msgid "%s: bad revision"
msgstr "%s: неправилна версия"
-#: sequencer.c:4377
+#: sequencer.c:4485
msgid "can't revert as initial commit"
msgstr "първоначалното подаване не може да бъде отменено"
-#: sequencer.c:4846
+#: sequencer.c:4962
msgid "make_script: unhandled options"
msgstr "make_script: неподдържани опции"
-#: sequencer.c:4849
+#: sequencer.c:4965
msgid "make_script: error preparing revisions"
msgstr "make_script: грешка при подготовката на версии"
-#: sequencer.c:5083 sequencer.c:5100
+#: sequencer.c:5206 sequencer.c:5223
msgid "nothing to do"
msgstr "няма какво да се прави"
-#: sequencer.c:5119
+#: sequencer.c:5242
msgid "could not skip unnecessary pick commands"
msgstr "излишните команди за отбиране не бяха прескочени"
-#: sequencer.c:5213
+#: sequencer.c:5336
msgid "the script was already rearranged."
msgstr "скриптът вече е преподреден."
-#: setup.c:124
+#: setup.c:133
#, c-format
msgid "'%s' is outside repository at '%s'"
msgstr "„%s“ е извън хранилището при „%s“"
-#: setup.c:175
+#: setup.c:185
#, c-format
msgid ""
"%s: no such path in the working tree.\n"
@@ -7679,7 +7814,7 @@ msgstr ""
"\n"
" git КОМАНДА -- ПЪТ…"
-#: setup.c:188
+#: setup.c:198
#, c-format
msgid ""
"ambiguous argument '%s': unknown revision or path not in the working tree.\n"
@@ -7692,12 +7827,12 @@ msgstr ""
"\n"
" git КОМАНДА [ВЕРСИЯ…] -- [ФАЙЛ…]"
-#: setup.c:254
+#: setup.c:264
#, c-format
msgid "option '%s' must come before non-option arguments"
msgstr "опцията „%s“ трябва да е преди първия аргумент, който не е опция"
-#: setup.c:273
+#: setup.c:283
#, c-format
msgid ""
"ambiguous argument '%s': both revision and filename\n"
@@ -7709,95 +7844,95 @@ msgstr ""
"\n"
" git КОМАНДА [ВЕРСИЯ…] -- [ФАЙЛ…]"
-#: setup.c:409
+#: setup.c:419
msgid "unable to set up work tree using invalid config"
msgstr ""
"не може да се зададе текуща работна директория при неправилни настройки"
-#: setup.c:413
+#: setup.c:423
msgid "this operation must be run in a work tree"
msgstr "тази команда трябва да се изпълни в работно дърво"
-#: setup.c:559
+#: setup.c:569
#, c-format
msgid "Expected git repo version <= %d, found %d"
msgstr "Очаква се версия на хранилището на git <= %d, а не %d"
-#: setup.c:567
+#: setup.c:577
msgid "unknown repository extensions found:"
msgstr "открити са непознати разширения в хранилището:"
-#: setup.c:586
+#: setup.c:596
#, c-format
msgid "error opening '%s'"
msgstr "„%s“ не може да се отвори"
-#: setup.c:588
+#: setup.c:598
#, c-format
msgid "too large to be a .git file: '%s'"
msgstr "прекалено голям файл „.git“: „%s“"
-#: setup.c:590
+#: setup.c:600
#, c-format
msgid "error reading %s"
msgstr "грешка при прочитане на „%s“"
-#: setup.c:592
+#: setup.c:602
#, c-format
msgid "invalid gitfile format: %s"
msgstr "неправилен формат на gitfile: %s"
-#: setup.c:594
+#: setup.c:604
#, c-format
msgid "no path in gitfile: %s"
msgstr "липсва път в gitfile: „%s“"
-#: setup.c:596
+#: setup.c:606
#, c-format
msgid "not a git repository: %s"
msgstr "не е хранилище на Git: %s"
-#: setup.c:695
+#: setup.c:708
#, c-format
msgid "'$%s' too big"
msgstr "„%s“ е прекалено голям"
-#: setup.c:709
+#: setup.c:722
#, c-format
msgid "not a git repository: '%s'"
msgstr "не е хранилище на git: „%s“"
-#: setup.c:738 setup.c:740 setup.c:771
+#: setup.c:751 setup.c:753 setup.c:784
#, c-format
msgid "cannot chdir to '%s'"
msgstr "не може да се влезе в директорията „%s“"
-#: setup.c:743 setup.c:799 setup.c:809 setup.c:848 setup.c:856
+#: setup.c:756 setup.c:812 setup.c:822 setup.c:861 setup.c:869
msgid "cannot come back to cwd"
msgstr "процесът не може да се върне към предишната работна директория"
-#: setup.c:870
+#: setup.c:883
#, c-format
msgid "failed to stat '%*s%s%s'"
msgstr "не може да бъде получена информация чрез „stat“ за „%*s%s%s“"
-#: setup.c:1108
+#: setup.c:1121
msgid "Unable to read current working directory"
msgstr "Текущата работна директория не може да бъде прочетена"
-#: setup.c:1117 setup.c:1123
+#: setup.c:1130 setup.c:1136
#, c-format
msgid "cannot change to '%s'"
msgstr "не може да се влезе в директорията „%s“"
-#: setup.c:1128
+#: setup.c:1141
#, c-format
msgid "not a git repository (or any of the parent directories): %s"
msgstr ""
"нито тази, нито която и да е от по-горните директории, не е хранилище на "
"git: %s"
-#: setup.c:1134
+#: setup.c:1147
#, c-format
msgid ""
"not a git repository (or any parent up to mount point %s)\n"
@@ -7808,7 +7943,7 @@ msgstr ""
"Git работи в рамките на една файлова система, защото променливата на средата "
"„GIT_DISCOVERY_ACROSS_FILESYSTEM“ не е зададена."
-#: setup.c:1245
+#: setup.c:1258
#, c-format
msgid ""
"problem with core.sharedRepository filemode value (0%.3o).\n"
@@ -7818,277 +7953,277 @@ msgstr ""
"(0%.3o).\n"
"Собственикът на файла трябва да има права за писане и четене."
-#: setup.c:1289
+#: setup.c:1304
msgid "open /dev/null or dup failed"
msgstr "неуспешно изпълнение на „open“ или „dup“ върху „/dev/null“"
-#: setup.c:1304
+#: setup.c:1319
msgid "fork failed"
msgstr "неуспешно създаване на процес чрез „fork“"
-#: setup.c:1309
+#: setup.c:1324
msgid "setsid failed"
msgstr "неуспешно изпълнение на „setsid“"
-#: sha1-file.c:452
+#: sha1-file.c:470
#, c-format
msgid "object directory %s does not exist; check .git/objects/info/alternates"
msgstr ""
"директорията за обекти „%s“ не съществува, проверете „.git/objects/info/"
"alternates“"
-#: sha1-file.c:503
+#: sha1-file.c:521
#, c-format
msgid "unable to normalize alternate object path: %s"
msgstr "алтернативният път към обекти не може да бъде нормализиран: „%s“"
-#: sha1-file.c:575
+#: sha1-file.c:593
#, c-format
msgid "%s: ignoring alternate object stores, nesting too deep"
msgstr ""
"%s: алтернативните хранилища за обекти се пренебрегват поради прекалено "
"дълбоко влагане"
-#: sha1-file.c:582
+#: sha1-file.c:600
#, c-format
msgid "unable to normalize object directory: %s"
msgstr "директорията за обекти „%s“ не може да бъде нормализирана"
-#: sha1-file.c:625
+#: sha1-file.c:643
msgid "unable to fdopen alternates lockfile"
msgstr "заключващият файл за алтернативите не може да се отвори с „fdopen“"
-#: sha1-file.c:643
+#: sha1-file.c:661
msgid "unable to read alternates file"
msgstr "файлът с алтернативите не може да бъде прочетен"
-#: sha1-file.c:650
+#: sha1-file.c:668
msgid "unable to move new alternates file into place"
msgstr "новият файл с алтернативите не може да бъде преместен на мястото му"
-#: sha1-file.c:685
+#: sha1-file.c:703
#, c-format
msgid "path '%s' does not exist"
msgstr "пътят „%s“ не съществува."
-#: sha1-file.c:711
+#: sha1-file.c:724
#, c-format
msgid "reference repository '%s' as a linked checkout is not supported yet."
msgstr "все още не се поддържа еталонно хранилище „%s“ като свързано."
-#: sha1-file.c:717
+#: sha1-file.c:730
#, c-format
msgid "reference repository '%s' is not a local repository."
msgstr "еталонното хранилище „%s“ не е локално"
-#: sha1-file.c:723
+#: sha1-file.c:736
#, c-format
msgid "reference repository '%s' is shallow"
msgstr "еталонното хранилище „%s“ е плитко"
-#: sha1-file.c:731
+#: sha1-file.c:744
#, c-format
msgid "reference repository '%s' is grafted"
msgstr "еталонното хранилище „%s“ е с присаждане"
-#: sha1-file.c:791
+#: sha1-file.c:804
#, c-format
msgid "invalid line while parsing alternate refs: %s"
msgstr "неправилен ред при анализа на алтернативните указатели: „%s“"
-#: sha1-file.c:943
+#: sha1-file.c:954
#, c-format
msgid "attempting to mmap %<PRIuMAX> over limit %<PRIuMAX>"
msgstr ""
"неуспешен опит за „mmap“ %<PRIuMAX>, което е над позволеното %<PRIuMAX>"
-#: sha1-file.c:964
+#: sha1-file.c:975
msgid "mmap failed"
msgstr "неуспешно изпълнение на „mmap“"
-#: sha1-file.c:1128
+#: sha1-file.c:1139
#, c-format
msgid "object file %s is empty"
msgstr "файлът с обектите „%s“ е празен"
-#: sha1-file.c:1263 sha1-file.c:2443
+#: sha1-file.c:1274 sha1-file.c:2454
#, c-format
msgid "corrupt loose object '%s'"
msgstr "непакетираният обект „%s“ е повреден"
-#: sha1-file.c:1265 sha1-file.c:2447
+#: sha1-file.c:1276 sha1-file.c:2458
#, c-format
msgid "garbage at end of loose object '%s'"
msgstr "грешни данни в края на непакетирания обект „%s“"
-#: sha1-file.c:1307
+#: sha1-file.c:1318
msgid "invalid object type"
msgstr "неправилен вид обект"
-#: sha1-file.c:1391
+#: sha1-file.c:1402
#, c-format
msgid "unable to unpack %s header with --allow-unknown-type"
msgstr ""
"заглавната част „%s“ не може да се разпакетира с опцията „--allow-unknown-"
"type“"
-#: sha1-file.c:1394
+#: sha1-file.c:1405
#, c-format
msgid "unable to unpack %s header"
msgstr "заглавната част на „%s“ не може да бъде разпакетирана"
-#: sha1-file.c:1400
+#: sha1-file.c:1411
#, c-format
msgid "unable to parse %s header with --allow-unknown-type"
msgstr ""
"заглавната част „%s“ не може да се анализира с опцията „--allow-unknown-type“"
-#: sha1-file.c:1403
+#: sha1-file.c:1414
#, c-format
msgid "unable to parse %s header"
msgstr "заглавната част на „%s“ не може да бъде анализирана"
-#: sha1-file.c:1629
+#: sha1-file.c:1640
#, c-format
msgid "failed to read object %s"
msgstr "обектът „%s“ не може да бъде прочетен"
-#: sha1-file.c:1633
+#: sha1-file.c:1644
#, c-format
msgid "replacement %s not found for %s"
msgstr "заместителят „%s“ на „%s“ не може да бъде открит"
-#: sha1-file.c:1637
+#: sha1-file.c:1648
#, c-format
msgid "loose object %s (stored in %s) is corrupt"
msgstr "непакетираният обект „%s“ (в „%s“) е повреден"
-#: sha1-file.c:1641
+#: sha1-file.c:1652
#, c-format
msgid "packed object %s (stored in %s) is corrupt"
msgstr "пакетираният обект „%s“ (в „%s“) е повреден"
-#: sha1-file.c:1746
+#: sha1-file.c:1757
#, c-format
msgid "unable to write file %s"
msgstr "файлът „%s“ не може да бъде записан"
-#: sha1-file.c:1753
+#: sha1-file.c:1764
#, c-format
msgid "unable to set permission to '%s'"
msgstr "правата за достъп до „%s“ не могат да бъдат зададени"
-#: sha1-file.c:1760
+#: sha1-file.c:1771
msgid "file write error"
msgstr "грешка при запис на файл"
-#: sha1-file.c:1780
+#: sha1-file.c:1791
msgid "error when closing loose object file"
msgstr "грешка при затварянето на файла с непакетиран обект"
-#: sha1-file.c:1845
+#: sha1-file.c:1856
#, c-format
msgid "insufficient permission for adding an object to repository database %s"
msgstr ""
"няма права за добавяне на обект към базата от данни на хранилището „%s“"
-#: sha1-file.c:1847
+#: sha1-file.c:1858
msgid "unable to create temporary file"
msgstr "не може да бъде създаден временен файл"
-#: sha1-file.c:1871
+#: sha1-file.c:1882
msgid "unable to write loose object file"
msgstr "грешка при записа на файла с непакетиран обект"
-#: sha1-file.c:1877
+#: sha1-file.c:1888
#, c-format
msgid "unable to deflate new object %s (%d)"
msgstr "новият обект „%s“ не може да се компресира с „deflate“: %d"
-#: sha1-file.c:1881
+#: sha1-file.c:1892
#, c-format
msgid "deflateEnd on object %s failed (%d)"
msgstr "неуспешно приключване на „deflate“ върху „%s“: %d"
-#: sha1-file.c:1885
+#: sha1-file.c:1896
#, c-format
msgid "confused by unstable object source data for %s"
msgstr "грешка поради нестабилния източник данни за обектите „%s“"
-#: sha1-file.c:1895 builtin/pack-objects.c:1054
+#: sha1-file.c:1906 builtin/pack-objects.c:1055
#, c-format
msgid "failed utime() on %s"
msgstr "неуспешно задаване на време на достъп/създаване чрез „utime“ на „%s“"
-#: sha1-file.c:1972
+#: sha1-file.c:1983
#, c-format
msgid "cannot read object for %s"
msgstr "обектът за „%s“ не може да се прочете"
-#: sha1-file.c:2011
+#: sha1-file.c:2022
msgid "corrupt commit"
msgstr "повредено подаване"
-#: sha1-file.c:2019
+#: sha1-file.c:2030
msgid "corrupt tag"
msgstr "повреден етикет"
-#: sha1-file.c:2119
+#: sha1-file.c:2130
#, c-format
msgid "read error while indexing %s"
msgstr "грешка при четене по време на индексиране на „%s“"
-#: sha1-file.c:2122
+#: sha1-file.c:2133
#, c-format
msgid "short read while indexing %s"
msgstr "непълно прочитане по време на индексиране на „%s“"
-#: sha1-file.c:2195 sha1-file.c:2205
+#: sha1-file.c:2206 sha1-file.c:2216
#, c-format
msgid "%s: failed to insert into database"
msgstr "„%s“ не може да се вмъкне в базата от данни"
-#: sha1-file.c:2211
+#: sha1-file.c:2222
#, c-format
msgid "%s: unsupported file type"
msgstr "неподдържан вид файл: „%s“"
-#: sha1-file.c:2235
+#: sha1-file.c:2246
#, c-format
msgid "%s is not a valid object"
msgstr "„%s“ е неправилен обект"
-#: sha1-file.c:2237
+#: sha1-file.c:2248
#, c-format
msgid "%s is not a valid '%s' object"
msgstr "„%s“ е неправилен обект от вид „%s“"
-#: sha1-file.c:2264 builtin/index-pack.c:155
+#: sha1-file.c:2275 builtin/index-pack.c:155
#, c-format
msgid "unable to open %s"
msgstr "обектът „%s“ не може да бъде отворен"
-#: sha1-file.c:2454 sha1-file.c:2507
+#: sha1-file.c:2465 sha1-file.c:2518
#, c-format
msgid "hash mismatch for %s (expected %s)"
msgstr "неправилна контролна сума за „%s“ (трябва да е %s)"
-#: sha1-file.c:2478
+#: sha1-file.c:2489
#, c-format
msgid "unable to mmap %s"
msgstr "неуспешно изпълнение на „mmap“ върху „%s“"
-#: sha1-file.c:2483
+#: sha1-file.c:2494
#, c-format
msgid "unable to unpack header of %s"
msgstr "заглавната част на „%s“ не може да бъде разпакетирана"
-#: sha1-file.c:2489
+#: sha1-file.c:2500
#, c-format
msgid "unable to parse header of %s"
msgstr "заглавната част на „%s“ не може да бъде анализирана"
-#: sha1-file.c:2500
+#: sha1-file.c:2511
#, c-format
msgid "unable to unpack contents of %s"
msgstr "съдържанието на „%s“ не може да бъде разпакетирано"
@@ -8193,43 +8328,43 @@ msgid "invalid object name '%.*s'."
msgstr "неправилно име на обект: „%.*s“"
#. TRANSLATORS: IEC 80000-13:2008 gibibyte
-#: strbuf.c:837
+#: strbuf.c:853
#, c-format
msgid "%u.%2.2u GiB"
msgstr "%u.%2.2u GiB"
#. TRANSLATORS: IEC 80000-13:2008 gibibyte/second
-#: strbuf.c:839
+#: strbuf.c:855
#, c-format
msgid "%u.%2.2u GiB/s"
msgstr "%u.%2.2u GiB/s"
#. TRANSLATORS: IEC 80000-13:2008 mebibyte
-#: strbuf.c:847
+#: strbuf.c:863
#, c-format
msgid "%u.%2.2u MiB"
msgstr "%u.%2.2u MiB"
#. TRANSLATORS: IEC 80000-13:2008 mebibyte/second
-#: strbuf.c:849
+#: strbuf.c:865
#, c-format
msgid "%u.%2.2u MiB/s"
msgstr "%u.%2.2u MiB/s"
#. TRANSLATORS: IEC 80000-13:2008 kibibyte
-#: strbuf.c:856
+#: strbuf.c:872
#, c-format
msgid "%u.%2.2u KiB"
msgstr "%u.%2.2u KiB"
#. TRANSLATORS: IEC 80000-13:2008 kibibyte/second
-#: strbuf.c:858
+#: strbuf.c:874
#, c-format
msgid "%u.%2.2u KiB/s"
msgstr "%u.%2.2u KiB/s"
#. TRANSLATORS: IEC 80000-13:2008 byte
-#: strbuf.c:864
+#: strbuf.c:880
#, c-format
msgid "%u byte"
msgid_plural "%u bytes"
@@ -8237,18 +8372,44 @@ msgstr[0] "%u байт"
msgstr[1] "%u байта"
#. TRANSLATORS: IEC 80000-13:2008 byte/second
-#: strbuf.c:866
+#: strbuf.c:882
#, c-format
msgid "%u byte/s"
msgid_plural "%u bytes/s"
msgstr[0] "%u байт/сек."
msgstr[1] "%u байта/сек."
-#: strbuf.c:1164
+#: strbuf.c:1180
#, c-format
msgid "could not edit '%s'"
msgstr "„%s“ не може да се редактира"
+#: submodule-config.c:237
+#, c-format
+msgid "ignoring suspicious submodule name: %s"
+msgstr "игнориране на подозрително име на подмодул: „%s“"
+
+#: submodule-config.c:304
+msgid "negative values not allowed for submodule.fetchjobs"
+msgstr "настройката „submodule.fetchjobs“ не приема отрицателни стойности"
+
+#: submodule-config.c:402
+#, c-format
+msgid "ignoring '%s' which may be interpreted as a command-line option: %s"
+msgstr ""
+"„%s“ се прескача, защото е възможно да се тълкува като опция за командния "
+"ред: %s"
+
+#: submodule-config.c:499
+#, c-format
+msgid "invalid value for %s"
+msgstr "Неправилна стойност за „%s“"
+
+#: submodule-config.c:766
+#, c-format
+msgid "Could not update .gitmodules entry %s"
+msgstr "Записът „%s“ във файла „.gitmodules“ не може да бъде променен"
+
#: submodule.c:114 submodule.c:143
msgid "Cannot change unmerged .gitmodules, resolve merge conflicts first"
msgstr ""
@@ -8312,7 +8473,7 @@ msgstr ""
msgid "process for submodule '%s' failed"
msgstr "процесът за подмодула „%s“ завърши неуспешно"
-#: submodule.c:1147 builtin/branch.c:680 builtin/submodule--helper.c:2045
+#: submodule.c:1147 builtin/branch.c:678 builtin/submodule--helper.c:2045
msgid "Failed to resolve HEAD as a valid ref."
msgstr "Не може да се открие към какво сочи указателят „HEAD“"
@@ -8430,41 +8591,15 @@ msgstr ""
"„%s“ към\n"
"„%s“\n"
-#: submodule.c:2209
+#: submodule.c:2210
msgid "could not start ls-files in .."
msgstr "„ls-stat“ не може да се стартира в „..“"
-#: submodule.c:2248
+#: submodule.c:2250
#, c-format
msgid "ls-tree returned unexpected return code %d"
msgstr "„ls-tree“ завърши с неочакван изходен код: %d"
-#: submodule-config.c:236
-#, c-format
-msgid "ignoring suspicious submodule name: %s"
-msgstr "игнориране на подозрително име на подмодул: „%s“"
-
-#: submodule-config.c:303
-msgid "negative values not allowed for submodule.fetchjobs"
-msgstr "настройката „submodule.fetchjobs“ не приема отрицателни стойности"
-
-#: submodule-config.c:401
-#, c-format
-msgid "ignoring '%s' which may be interpreted as a command-line option: %s"
-msgstr ""
-"„%s“ се прескача, защото е възможно да се тълкува като опция за командния "
-"ред: %s"
-
-#: submodule-config.c:498
-#, c-format
-msgid "invalid value for %s"
-msgstr "Неправилна стойност за „%s“"
-
-#: submodule-config.c:765
-#, c-format
-msgid "Could not update .gitmodules entry %s"
-msgstr "Записът „%s“ във файла „.gitmodules“ не може да бъде променен"
-
#: trailer.c:238
#, c-format
msgid "running trailer command '%s' failed"
@@ -8519,98 +8654,6 @@ msgstr "временният файл не може да се отвори"
msgid "could not rename temporary file to %s"
msgstr "временният файл не може да се преименува на „%s“"
-#: transport.c:116
-#, c-format
-msgid "Would set upstream of '%s' to '%s' of '%s'\n"
-msgstr "Клонът „%s“ ще следи „%s“ от „%s“\n"
-
-#: transport.c:145
-#, c-format
-msgid "could not read bundle '%s'"
-msgstr "пратката на git „%s“ не може да бъде прочетена"
-
-#: transport.c:214
-#, c-format
-msgid "transport: invalid depth option '%s'"
-msgstr "transport: неправилна опция за дълбочина: %s"
-
-#: transport.c:266
-msgid "see protocol.version in 'git help config' for more details"
-msgstr ""
-"За повече информация вижте раздела „protocol.version“ в „git help config“"
-
-#: transport.c:267
-msgid "server options require protocol version 2 or later"
-msgstr "опциите на сървъра изискват поне версия 2 на протокола"
-
-#: transport.c:632
-msgid "could not parse transport.color.* config"
-msgstr "стойността на настройката „transport.color.*“ не може да се разпознае"
-
-#: transport.c:705
-msgid "support for protocol v2 not implemented yet"
-msgstr "протокол версия 2 все още не се поддържа"
-
-#: transport.c:831
-#, c-format
-msgid "unknown value for config '%s': %s"
-msgstr "непозната стойност за настройката „%s“: „%s“"
-
-#: transport.c:897
-#, c-format
-msgid "transport '%s' not allowed"
-msgstr "преносът по „%s“ не е позволен"
-
-#: transport.c:949
-msgid "git-over-rsync is no longer supported"
-msgstr "командата „git-over-rsync“ вече не се поддържа"
-
-#: transport.c:1044
-#, c-format
-msgid ""
-"The following submodule paths contain changes that can\n"
-"not be found on any remote:\n"
-msgstr ""
-"Следните пътища за подмодули съдържат промени,\n"
-"които липсват от всички отдалечени хранилища:\n"
-
-#: transport.c:1048
-#, 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:1056
-msgid "Aborting."
-msgstr "Преустановяване на действието."
-
-#: transport.c:1201
-msgid "failed to push all needed submodules"
-msgstr "неуспешно изтласкване на всички необходими подмодули"
-
-#: transport.c:1345 transport-helper.c:657
-msgid "operation not supported by protocol"
-msgstr "опцията не се поддържа от протокола"
-
#: transport-helper.c:61 transport-helper.c:90
msgid "full write to remote helper failed"
msgstr "неуспешен пълен запис към насрещната помощна програма"
@@ -8659,7 +8702,7 @@ msgstr "неуспешно изпълнение на бързо внасяне"
msgid "error while running fast-import"
msgstr "грешка при изпълнението на бързо внасяне"
-#: transport-helper.c:545 transport-helper.c:1134
+#: transport-helper.c:545 transport-helper.c:1135
#, c-format
msgid "could not read ref %s"
msgstr "указателят „%s“ не може да се прочете"
@@ -8677,6 +8720,10 @@ msgstr "протоколът не поддържа задаването на п
msgid "invalid remote service path"
msgstr "неправилен път на отдалечената услуга"
+#: transport-helper.c:657 transport.c:1339
+msgid "operation not supported by protocol"
+msgstr "опцията не се поддържа от протокола"
+
#: transport-helper.c:660
#, c-format
msgid "can't connect to subservice %s"
@@ -8719,27 +8766,27 @@ msgstr "насрещната помощна програма „%s“ не по
msgid "helper %s does not support 'push-option'"
msgstr "насрещната помощна програма „%s“ не поддържа опции за изтласкване"
-#: transport-helper.c:965
+#: transport-helper.c:966
msgid "remote-helper doesn't support push; refspec needed"
msgstr ""
"насрещната помощна програма не поддържа изтласкване. Необходимо е "
"изброяване на указателите"
-#: transport-helper.c:970
+#: transport-helper.c:971
#, c-format
msgid "helper %s does not support 'force'"
msgstr ""
"насрещната помощна програма не поддържа „%s“ поддържа опцията „--force“"
-#: transport-helper.c:1017
+#: transport-helper.c:1018
msgid "couldn't run fast-export"
msgstr "не може да се извърши бързо изнасяне"
-#: transport-helper.c:1022
+#: transport-helper.c:1023
msgid "error while running fast-export"
msgstr "грешка при изпълнението на командата за бързо изнасяне"
-#: transport-helper.c:1047
+#: transport-helper.c:1048
#, c-format
msgid ""
"No refs in common and none specified; doing nothing.\n"
@@ -8748,50 +8795,138 @@ msgstr ""
"Няма общи указатели, не са указани никакви указатели — нищо няма да бъде\n"
"направено. Пробвайте да укажете клон, напр. “master“.\n"
-#: transport-helper.c:1120
+#: transport-helper.c:1121
#, c-format
msgid "malformed response in ref list: %s"
msgstr "неправилен отговор в списъка с указатели: „%s“"
-#: transport-helper.c:1272
+#: transport-helper.c:1273
#, c-format
msgid "read(%s) failed"
msgstr "неуспешно четене на „%s“"
-#: transport-helper.c:1299
+#: transport-helper.c:1300
#, c-format
msgid "write(%s) failed"
msgstr "неуспешен запис в „%s“"
-#: transport-helper.c:1348
+#: transport-helper.c:1349
#, c-format
msgid "%s thread failed"
msgstr "неуспешно изпълнение на нишката „%s“"
-#: transport-helper.c:1352
+#: transport-helper.c:1353
#, c-format
msgid "%s thread failed to join: %s"
msgstr "завършването на нишката „%s“ не може да се изчака: „%s“"
-#: transport-helper.c:1371 transport-helper.c:1375
+#: transport-helper.c:1372 transport-helper.c:1376
#, c-format
msgid "can't start thread for copying data: %s"
msgstr "неуспешно стартиране на нишка за копиране на данните: „%s“"
-#: transport-helper.c:1412
+#: transport-helper.c:1413
#, c-format
msgid "%s process failed to wait"
msgstr "процесът на „%s“ не успя да изчака чрез „waitpid“"
-#: transport-helper.c:1416
+#: transport-helper.c:1417
#, c-format
msgid "%s process failed"
msgstr "неуспешно изпълнение на „%s“"
-#: transport-helper.c:1434 transport-helper.c:1443
+#: transport-helper.c:1435 transport-helper.c:1444
msgid "can't start thread for copying data"
msgstr "неуспешно стартиране на нишка за копиране на данните"
+#: transport.c:116
+#, c-format
+msgid "Would set upstream of '%s' to '%s' of '%s'\n"
+msgstr "Клонът „%s“ ще следи „%s“ от „%s“\n"
+
+#: transport.c:145
+#, c-format
+msgid "could not read bundle '%s'"
+msgstr "пратката на git „%s“ не може да бъде прочетена"
+
+#: transport.c:214
+#, c-format
+msgid "transport: invalid depth option '%s'"
+msgstr "transport: неправилна опция за дълбочина: %s"
+
+#: transport.c:266
+msgid "see protocol.version in 'git help config' for more details"
+msgstr ""
+"За повече информация вижте раздела „protocol.version“ в „git help config“"
+
+#: transport.c:267
+msgid "server options require protocol version 2 or later"
+msgstr "опциите на сървъра изискват поне версия 2 на протокола"
+
+#: transport.c:632
+msgid "could not parse transport.color.* config"
+msgstr "стойността на настройката „transport.color.*“ не може да се разпознае"
+
+#: transport.c:705
+msgid "support for protocol v2 not implemented yet"
+msgstr "протокол версия 2 все още не се поддържа"
+
+#: transport.c:839
+#, c-format
+msgid "unknown value for config '%s': %s"
+msgstr "непозната стойност за настройката „%s“: „%s“"
+
+#: transport.c:905
+#, c-format
+msgid "transport '%s' not allowed"
+msgstr "преносът по „%s“ не е позволен"
+
+#: transport.c:957
+msgid "git-over-rsync is no longer supported"
+msgstr "командата „git-over-rsync“ вече не се поддържа"
+
+#: transport.c:1052
+#, c-format
+msgid ""
+"The following submodule paths contain changes that can\n"
+"not be found on any remote:\n"
+msgstr ""
+"Следните пътища за подмодули съдържат промени,\n"
+"които липсват от всички отдалечени хранилища:\n"
+
+#: transport.c:1056
+#, 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:1064
+msgid "Aborting."
+msgstr "Преустановяване на действието."
+
+#: transport.c:1209
+msgid "failed to push all needed submodules"
+msgstr "неуспешно изтласкване на всички необходими подмодули"
+
#: tree-walk.c:32
msgid "too-short tree object"
msgstr "прекалено кратък обект-дърво"
@@ -8808,7 +8943,7 @@ msgstr "празно име на файл в запис в дърво"
msgid "too-short tree file"
msgstr "прекалено кратък файл-дърво"
-#: unpack-trees.c:110
+#: unpack-trees.c:113
#, c-format
msgid ""
"Your local changes to the following files would be overwritten by checkout:\n"
@@ -8817,7 +8952,7 @@ msgstr ""
"Изтеглянето ще презапише локалните промени на тези файлове:\n"
"%%sПодайте или скатайте промените, за да преминете към нов клон."
-#: unpack-trees.c:112
+#: unpack-trees.c:115
#, c-format
msgid ""
"Your local changes to the following files would be overwritten by checkout:\n"
@@ -8826,7 +8961,7 @@ msgstr ""
"Изтеглянето ще презапише локалните промени на тези файлове:\n"
"%%s"
-#: unpack-trees.c:115
+#: unpack-trees.c:118
#, c-format
msgid ""
"Your local changes to the following files would be overwritten by merge:\n"
@@ -8835,7 +8970,7 @@ msgstr ""
"Сливането ще презапише локалните промени на тези файлове:\n"
"%%sПодайте или скатайте промените, за да слеете."
-#: unpack-trees.c:117
+#: unpack-trees.c:120
#, c-format
msgid ""
"Your local changes to the following files would be overwritten by merge:\n"
@@ -8844,7 +8979,7 @@ msgstr ""
"Сливането ще презапише локалните промени на тези файлове:\n"
"%%s"
-#: unpack-trees.c:120
+#: unpack-trees.c:123
#, c-format
msgid ""
"Your local changes to the following files would be overwritten by %s:\n"
@@ -8853,7 +8988,7 @@ msgstr ""
"„%s“ ще презапише локалните промени на тези файлове:\n"
"%%sПодайте или скатайте промените, за да извършите „%s“."
-#: unpack-trees.c:122
+#: unpack-trees.c:125
#, c-format
msgid ""
"Your local changes to the following files would be overwritten by %s:\n"
@@ -8862,7 +8997,7 @@ msgstr ""
"„%s“ ще презапише локалните промени на тези файлове:\n"
"%%s"
-#: unpack-trees.c:127
+#: unpack-trees.c:130
#, c-format
msgid ""
"Updating the following directories would lose untracked files in them:\n"
@@ -8871,7 +9006,7 @@ msgstr ""
"Обновяването на следните директории ще изтрие неследените файлове в тях:\n"
"%s"
-#: unpack-trees.c:131
+#: unpack-trees.c:134
#, c-format
msgid ""
"The following untracked working tree files would be removed by checkout:\n"
@@ -8880,7 +9015,7 @@ msgstr ""
"Изтеглянето ще изтрие тези неследени файлове в работното дърво:\n"
"%%sПреместете ги или ги изтрийте, за да преминете на друг клон."
-#: unpack-trees.c:133
+#: unpack-trees.c:136
#, c-format
msgid ""
"The following untracked working tree files would be removed by checkout:\n"
@@ -8889,7 +9024,7 @@ msgstr ""
"Изтеглянето ще изтрие тези неследени файлове в работното дърво:\n"
"%%s"
-#: unpack-trees.c:136
+#: unpack-trees.c:139
#, c-format
msgid ""
"The following untracked working tree files would be removed by merge:\n"
@@ -8898,7 +9033,7 @@ msgstr ""
"Сливането ще изтрие тези неследени файлове в работното дърво:\n"
"%%sПреместете ги или ги изтрийте, за да слеете."
-#: unpack-trees.c:138
+#: unpack-trees.c:141
#, c-format
msgid ""
"The following untracked working tree files would be removed by merge:\n"
@@ -8907,7 +9042,7 @@ msgstr ""
"Сливането ще изтрие тези неследени файлове в работното дърво:\n"
"%%s"
-#: unpack-trees.c:141
+#: unpack-trees.c:144
#, c-format
msgid ""
"The following untracked working tree files would be removed by %s:\n"
@@ -8916,7 +9051,7 @@ msgstr ""
"„%s“ ще изтрие тези неследени файлове в работното дърво:\n"
"%%sПреместете ги или ги изтрийте, за да извършите „%s“."
-#: unpack-trees.c:143
+#: unpack-trees.c:146
#, c-format
msgid ""
"The following untracked working tree files would be removed by %s:\n"
@@ -8925,7 +9060,7 @@ msgstr ""
"„%s“ ще изтрие тези неследени файлове в работното дърво:\n"
"%%s"
-#: unpack-trees.c:149
+#: unpack-trees.c:152
#, c-format
msgid ""
"The following untracked working tree files would be overwritten by "
@@ -8935,7 +9070,7 @@ msgstr ""
"Изтеглянето ще презапише тези неследени файлове в работното дърво:\n"
"%%sПреместете ги или ги изтрийте, за да смените клон."
-#: unpack-trees.c:151
+#: unpack-trees.c:154
#, c-format
msgid ""
"The following untracked working tree files would be overwritten by "
@@ -8945,7 +9080,7 @@ msgstr ""
"Изтеглянето ще презапише тези неследени файлове в работното дърво:\n"
"%%s"
-#: unpack-trees.c:154
+#: unpack-trees.c:157
#, c-format
msgid ""
"The following untracked working tree files would be overwritten by merge:\n"
@@ -8954,7 +9089,7 @@ msgstr ""
"Сливането ще презапише тези неследени файлове в работното дърво:\n"
"%%sПреместете ги или ги изтрийте, за да слеете."
-#: unpack-trees.c:156
+#: unpack-trees.c:159
#, c-format
msgid ""
"The following untracked working tree files would be overwritten by merge:\n"
@@ -8963,7 +9098,7 @@ msgstr ""
"Сливането ще презапише тези неследени файлове в работното дърво:\n"
"%%s"
-#: unpack-trees.c:159
+#: unpack-trees.c:162
#, c-format
msgid ""
"The following untracked working tree files would be overwritten by %s:\n"
@@ -8972,7 +9107,7 @@ msgstr ""
"„%s“ ще презапише тези неследени файлове в работното дърво:\n"
"%%sПреместете ги или ги изтрийте, за да извършите „%s“."
-#: unpack-trees.c:161
+#: unpack-trees.c:164
#, c-format
msgid ""
"The following untracked working tree files would be overwritten by %s:\n"
@@ -8981,62 +9116,73 @@ msgstr ""
"„%s“ ще презапише тези неследени файлове в работното дърво:\n"
"%%s"
-#: unpack-trees.c:169
+#: unpack-trees.c:172
#, c-format
msgid "Entry '%s' overlaps with '%s'. Cannot bind."
msgstr "Записът за „%s“ съвпада с този за „%s“. Не може да се присвои."
-#: unpack-trees.c:172
+#: unpack-trees.c:175
#, c-format
msgid ""
-"Cannot update sparse checkout: the following entries are not up to date:\n"
+"Cannot update submodule:\n"
"%s"
msgstr ""
-"Частичното изтегляне не може да бъде обновено: следните записи не са "
-"актуални:\n"
-"%s"
+"Подмодулът не може да бъде обновен:\n"
+"„%s“"
-#: unpack-trees.c:174
+#: unpack-trees.c:178
#, c-format
msgid ""
-"The following working tree files would be overwritten by sparse checkout "
-"update:\n"
+"The following paths are not up to date and were left despite sparse "
+"patterns:\n"
"%s"
msgstr ""
-"Обновяването на частичното изтегляне ще презапише тези файлове в работното "
-"дърво:\n"
+"Следните пътища не обновени и са оставени въпреки шаблоните за частично "
+"изтегляне:\n"
"%s"
-#: unpack-trees.c:176
+#: unpack-trees.c:180
#, c-format
msgid ""
-"The following working tree files would be removed by sparse checkout "
-"update:\n"
+"The following paths are unmerged and were left despite sparse patterns:\n"
"%s"
msgstr ""
-"Обновяването на частичното изтегляне ще изтрие тези файлове в работното "
-"дърво:\n"
+"Следните пътища не са слети и са оставени въпреки шаблоните за частично "
+"изтегляне:\n"
"%s"
-#: unpack-trees.c:178
+#: unpack-trees.c:182
#, c-format
msgid ""
-"Cannot update submodule:\n"
+"The following paths were already present and thus not updated despite sparse "
+"patterns:\n"
"%s"
msgstr ""
-"Подмодулът не може да бъде обновен:\n"
-"„%s“"
+"Следните пътища вече съществуваха и са оставени въпреки шаблоните за "
+"частично изтегляне:\n"
+"%s"
-#: unpack-trees.c:255
+#: unpack-trees.c:262
#, c-format
msgid "Aborting\n"
msgstr "Преустановяване на действието\n"
-#: unpack-trees.c:317
+#: unpack-trees.c:289
+#, c-format
+msgid ""
+"After fixing the above paths, you may want to run `git sparse-checkout "
+"reapply`.\n"
+msgstr ""
+"След корекцията на грешките в пътищата по-горе, вероятно ще трябва\n"
+"да изпълните командата:\n"
+"\n"
+" git sparse-checkout reapply\n"
+
+#: unpack-trees.c:350
msgid "Updating files"
msgstr "Обновяване на файлове"
-#: unpack-trees.c:349
+#: unpack-trees.c:382
msgid ""
"the following paths have collided (e.g. case-sensitive paths\n"
"on a case-insensitive filesystem) and only one from the same\n"
@@ -9046,10 +9192,14 @@ msgstr ""
"във файлови системи, които не различават главни от малки букви)\n"
"и само един от участниците в конфликта е в работното дърво:\n"
-#: unpack-trees.c:1445
+#: unpack-trees.c:1498
msgid "Updating index flags"
msgstr "Обновяване на флаговете на индекса"
+#: upload-pack.c:1337
+msgid "expected flush after fetch arguments"
+msgstr "след аргументите на „fetch“ се очаква изчистване на буферите"
+
#: urlmatch.c:163
msgid "invalid URL scheme name or missing '://' suffix"
msgstr "неправилна схема за адрес или суфиксът „://“ липсва"
@@ -9083,33 +9233,33 @@ msgstr "неправилна част от пътя „..“"
msgid "Fetching objects"
msgstr "Доставяне на обектите"
-#: worktree.c:259 builtin/am.c:2099
+#: worktree.c:262 builtin/am.c:2098
#, c-format
msgid "failed to read '%s'"
msgstr "„%s“ не може да бъде прочетен"
-#: worktree.c:305
+#: worktree.c:309
#, c-format
msgid "'%s' at main working tree is not the repository directory"
msgstr "„%s“ в основното работно дърво не е директорията на хранилището"
-#: worktree.c:316
+#: worktree.c:320
#, c-format
msgid "'%s' file does not contain absolute path to the working tree location"
msgstr ""
"файлът „%s“ не съдържа абсолютния път към местоположението на работното дърво"
-#: worktree.c:328
+#: worktree.c:332
#, c-format
msgid "'%s' does not exist"
msgstr "„%s“ не съществува."
-#: worktree.c:334
+#: worktree.c:338
#, c-format
msgid "'%s' is not a .git file, error code %d"
msgstr "„%s“ не е файл на .git, код за грешка: %d"
-#: worktree.c:342
+#: worktree.c:347
#, c-format
msgid "'%s' does not point back to '%s'"
msgstr "„%s“ не сочи към обратно към „%s“"
@@ -9165,11 +9315,11 @@ msgid " (use \"git rm <file>...\" to mark resolution)"
msgstr ""
" (използвайте „git rm ФАЙЛ…“, за да укажете разрешаването на конфликта)"
-#: wt-status.c:211 wt-status.c:1074
+#: wt-status.c:211 wt-status.c:1072
msgid "Changes to be committed:"
msgstr "Промени, които ще бъдат подадени:"
-#: wt-status.c:234 wt-status.c:1083
+#: wt-status.c:234 wt-status.c:1081
msgid "Changes not staged for commit:"
msgstr "Промени, които не са в индекса за подаване:"
@@ -9274,22 +9424,22 @@ msgstr "променено съдържание, "
msgid "untracked content, "
msgstr "неследено съдържание, "
-#: wt-status.c:906
+#: wt-status.c:904
#, c-format
msgid "Your stash currently has %d entry"
msgid_plural "Your stash currently has %d entries"
msgstr[0] "Има %d скатаване."
msgstr[1] "Има %d скатавания."
-#: wt-status.c:938
+#: wt-status.c:936
msgid "Submodules changed but not updated:"
msgstr "Подмодулите са променени, но не са обновени:"
-#: wt-status.c:940
+#: wt-status.c:938
msgid "Submodule changes to be committed:"
msgstr "Промени в подмодулите за подаване:"
-#: wt-status.c:1022
+#: wt-status.c:1020
msgid ""
"Do not modify or remove the line above.\n"
"Everything below it will be ignored."
@@ -9297,7 +9447,7 @@ msgstr ""
"Не променяйте и не изтривайте горния ред.\n"
"Всичко отдолу ще бъде изтрито."
-#: wt-status.c:1114
+#: wt-status.c:1112
#, c-format
msgid ""
"\n"
@@ -9308,257 +9458,257 @@ msgstr ""
"Изчисляването на броя различаващи се подавания отне %.2f сек.\n"
"За да избегнете това, ползвайте „--no-ahead-behind“.\n"
-#: wt-status.c:1144
+#: wt-status.c:1142
msgid "You have unmerged paths."
msgstr "Някои пътища не са слети."
-#: wt-status.c:1147
+#: wt-status.c:1145
msgid " (fix conflicts and run \"git commit\")"
msgstr " (коригирайте конфликтите и изпълнете „git commit“)"
-#: wt-status.c:1149
+#: wt-status.c:1147
msgid " (use \"git merge --abort\" to abort the merge)"
msgstr " (използвайте „git merge --abort“, за да преустановите сливането)"
-#: wt-status.c:1153
+#: wt-status.c:1151
msgid "All conflicts fixed but you are still merging."
msgstr "Всички конфликти са решени, но продължавате сливането."
-#: wt-status.c:1156
+#: wt-status.c:1154
msgid " (use \"git commit\" to conclude merge)"
msgstr " (използвайте „git commit“, за да завършите сливането)"
-#: wt-status.c:1165
+#: wt-status.c:1163
msgid "You are in the middle of an am session."
msgstr "В момента прилагате поредица от кръпки чрез „git am“."
-#: wt-status.c:1168
+#: wt-status.c:1166
msgid "The current patch is empty."
msgstr "Текущата кръпка е празна."
-#: wt-status.c:1172
+#: wt-status.c:1170
msgid " (fix conflicts and then run \"git am --continue\")"
msgstr " (коригирайте конфликтите и изпълнете „git am --continue“)"
-#: wt-status.c:1174
+#: wt-status.c:1172
msgid " (use \"git am --skip\" to skip this patch)"
msgstr " (използвайте „git am --skip“, за да пропуснете тази кръпка)"
-#: wt-status.c:1176
+#: wt-status.c:1174
msgid " (use \"git am --abort\" to restore the original branch)"
msgstr ""
" (използвайте „git am --abort“, за да възстановите първоначалния клон)"
-#: wt-status.c:1309
+#: wt-status.c:1307
msgid "git-rebase-todo is missing."
msgstr "„git-rebase-todo“ липсва."
-#: wt-status.c:1311
+#: wt-status.c:1309
msgid "No commands done."
msgstr "Не са изпълнени команди."
-#: wt-status.c:1314
+#: wt-status.c:1312
#, 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:1325
+#: wt-status.c:1323
#, c-format
msgid " (see more in file %s)"
msgstr " (повече информация има във файла „%s“)"
-#: wt-status.c:1330
+#: wt-status.c:1328
msgid "No commands remaining."
msgstr "Не остават повече команди."
-#: wt-status.c:1333
+#: wt-status.c:1331
#, 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:1341
+#: wt-status.c:1339
msgid " (use \"git rebase --edit-todo\" to view and edit)"
msgstr ""
" (използвайте „git rebase --edit-todo“, за да разгледате и редактирате)"
-#: wt-status.c:1353
+#: wt-status.c:1351
#, c-format
msgid "You are currently rebasing branch '%s' on '%s'."
msgstr "В момента пребазирате клона „%s“ върху „%s“."
-#: wt-status.c:1358
+#: wt-status.c:1356
msgid "You are currently rebasing."
msgstr "В момента пребазирате."
-#: wt-status.c:1371
+#: wt-status.c:1369
msgid " (fix conflicts and then run \"git rebase --continue\")"
msgstr " (коригирайте конфликтите и използвайте „git rebase --continue“)"
-#: wt-status.c:1373
+#: wt-status.c:1371
msgid " (use \"git rebase --skip\" to skip this patch)"
msgstr " (използвайте „git rebase --skip“, за да пропуснете тази кръпка)"
-#: wt-status.c:1375
+#: wt-status.c:1373
msgid " (use \"git rebase --abort\" to check out the original branch)"
msgstr ""
" (използвайте „git rebase --abort“, за да възстановите първоначалния клон)"
-#: wt-status.c:1382
+#: wt-status.c:1380
msgid " (all conflicts fixed: run \"git rebase --continue\")"
msgstr " (всички конфликти са коригирани: изпълнете „git rebase --continue“)"
-#: wt-status.c:1386
+#: wt-status.c:1384
#, c-format
msgid ""
"You are currently splitting a commit while rebasing branch '%s' on '%s'."
msgstr "В момента разделяте подаване докато пребазирате клона „%s“ върху „%s“."
-#: wt-status.c:1391
+#: wt-status.c:1389
msgid "You are currently splitting a commit during a rebase."
msgstr "В момента разделяте подаване докато пребазирате."
-#: wt-status.c:1394
+#: wt-status.c:1392
msgid " (Once your working directory is clean, run \"git rebase --continue\")"
msgstr ""
" (След като работното ви дърво стане чисто, използвайте „git rebase --"
"continue“)"
-#: wt-status.c:1398
+#: wt-status.c:1396
#, c-format
msgid "You are currently editing a commit while rebasing branch '%s' on '%s'."
msgstr ""
"В момента редактирате подаване докато пребазирате клона „%s“ върху „%s“."
-#: wt-status.c:1403
+#: wt-status.c:1401
msgid "You are currently editing a commit during a rebase."
msgstr "В момента редактирате подаване докато пребазирате."
-#: wt-status.c:1406
+#: wt-status.c:1404
msgid " (use \"git commit --amend\" to amend the current commit)"
msgstr ""
" (използвайте „git commit --amend“, за да редактирате текущото подаване)"
-#: wt-status.c:1408
+#: wt-status.c:1406
msgid ""
" (use \"git rebase --continue\" once you are satisfied with your changes)"
msgstr ""
" (използвайте „git rebase --continue“, след като завършите промените си)"
-#: wt-status.c:1419
+#: wt-status.c:1417
msgid "Cherry-pick currently in progress."
msgstr "В момента се извършва отбиране на подавания."
-#: wt-status.c:1422
+#: wt-status.c:1420
#, c-format
msgid "You are currently cherry-picking commit %s."
msgstr "В момента отбирате подаването „%s“."
-#: wt-status.c:1429
+#: wt-status.c:1427
msgid " (fix conflicts and run \"git cherry-pick --continue\")"
msgstr " (коригирайте конфликтите и изпълнете „git cherry-pick --continue“)"
-#: wt-status.c:1432
+#: wt-status.c:1430
msgid " (run \"git cherry-pick --continue\" to continue)"
msgstr " (за да продължите, изпълнете „git cherry-pick --continue“)"
-#: wt-status.c:1435
+#: wt-status.c:1433
msgid " (all conflicts fixed: run \"git cherry-pick --continue\")"
msgstr ""
" (всички конфликти са коригирани, изпълнете „git cherry-pick --continue“)"
-#: wt-status.c:1437
+#: wt-status.c:1435
msgid " (use \"git cherry-pick --skip\" to skip this patch)"
msgstr " (използвайте „git cherry-pick --skip“, за да пропуснете тази кръпка)"
-#: wt-status.c:1439
+#: wt-status.c:1437
msgid " (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)"
msgstr ""
" (използвайте „git cherry-pick --abort“, за да отмените всички действия с "
"отбиране)"
-#: wt-status.c:1449
+#: wt-status.c:1447
msgid "Revert currently in progress."
msgstr "В момента тече отмяна на подаване."
-#: wt-status.c:1452
+#: wt-status.c:1450
#, c-format
msgid "You are currently reverting commit %s."
msgstr "В момента отменяте подаване „%s“."
-#: wt-status.c:1458
+#: wt-status.c:1456
msgid " (fix conflicts and run \"git revert --continue\")"
msgstr " (коригирайте конфликтите и изпълнете „git revert --continue“)"
-#: wt-status.c:1461
+#: wt-status.c:1459
msgid " (run \"git revert --continue\" to continue)"
msgstr " (за да продължите, изпълнете „git revert --continue“)"
-#: wt-status.c:1464
+#: wt-status.c:1462
msgid " (all conflicts fixed: run \"git revert --continue\")"
msgstr " (всички конфликти са коригирани, изпълнете „git revert --continue“)"
-#: wt-status.c:1466
+#: wt-status.c:1464
msgid " (use \"git revert --skip\" to skip this patch)"
msgstr " (използвайте „git revert --skip“, за да пропуснете тази кръпка)"
-#: wt-status.c:1468
+#: wt-status.c:1466
msgid " (use \"git revert --abort\" to cancel the revert operation)"
msgstr ""
" (използвайте „git revert --abort“, за да преустановите отмяната на "
"подаване)"
-#: wt-status.c:1478
+#: wt-status.c:1476
#, c-format
msgid "You are currently bisecting, started from branch '%s'."
msgstr "В момента търсите двоично, като сте стартирали от клон „%s“."
-#: wt-status.c:1482
+#: wt-status.c:1480
msgid "You are currently bisecting."
msgstr "В момента търсите двоично."
-#: wt-status.c:1485
+#: wt-status.c:1483
msgid " (use \"git bisect reset\" to get back to the original branch)"
msgstr ""
" (използвайте „git bisect reset“, за да се върнете към първоначалното "
"състояние и клон)"
-#: wt-status.c:1694
+#: wt-status.c:1692
msgid "On branch "
msgstr "На клон "
-#: wt-status.c:1701
+#: wt-status.c:1699
msgid "interactive rebase in progress; onto "
msgstr "извършвате интерактивно пребазиране върху "
-#: wt-status.c:1703
+#: wt-status.c:1701
msgid "rebase in progress; onto "
msgstr "извършвате пребазиране върху "
-#: wt-status.c:1713
+#: wt-status.c:1711
msgid "Not currently on any branch."
msgstr "Извън всички клони."
-#: wt-status.c:1730
+#: wt-status.c:1728
msgid "Initial commit"
msgstr "Първоначално подаване"
-#: wt-status.c:1731
+#: wt-status.c:1729
msgid "No commits yet"
msgstr "Все още липсват подавания"
-#: wt-status.c:1745
+#: wt-status.c:1743
msgid "Untracked files"
msgstr "Неследени файлове"
-#: wt-status.c:1747
+#: wt-status.c:1745
msgid "Ignored files"
msgstr "Игнорирани файлове"
-#: wt-status.c:1751
+#: wt-status.c:1749
#, c-format
msgid ""
"It took %.2f seconds to enumerate untracked files. 'status -uno'\n"
@@ -9570,32 +9720,32 @@ msgstr ""
"изпълнението, но ще трябва да добавяте новите файлове ръчно.\n"
"За повече подробности погледнете „git status help“."
-#: wt-status.c:1757
+#: wt-status.c:1755
#, c-format
msgid "Untracked files not listed%s"
msgstr "Неследените файлове не са изведени%s"
-#: wt-status.c:1759
+#: wt-status.c:1757
msgid " (use -u option to show untracked files)"
msgstr " (използвайте опцията „-u“, за да изведете неследените файлове)"
-#: wt-status.c:1765
+#: wt-status.c:1763
msgid "No changes"
msgstr "Няма промени"
-#: wt-status.c:1770
+#: wt-status.c:1768
#, 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:1773
+#: wt-status.c:1771
#, c-format
msgid "no changes added to commit\n"
msgstr "към индекса за подаване не са добавени промени\n"
-#: wt-status.c:1776
+#: wt-status.c:1774
#, c-format
msgid ""
"nothing added to commit but untracked files present (use \"git add\" to "
@@ -9604,71 +9754,71 @@ msgstr ""
"към индекса за подаване не са добавени промени, но има нови файлове "
"(използвайте „git add“, за да започне тяхното следене)\n"
-#: wt-status.c:1779
+#: wt-status.c:1777
#, c-format
msgid "nothing added to commit but untracked files present\n"
msgstr "към индекса за подаване не са добавени промени, но има нови файлове\n"
-#: wt-status.c:1782
+#: wt-status.c:1780
#, c-format
msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
msgstr ""
"липсват каквито и да е промени (създайте или копирайте файлове и използвайте "
"„git add“, за да започне тяхното следене)\n"
-#: wt-status.c:1785 wt-status.c:1790
+#: wt-status.c:1783 wt-status.c:1788
#, c-format
msgid "nothing to commit\n"
msgstr "липсват каквито и да е промени\n"
-#: wt-status.c:1788
+#: wt-status.c:1786
#, c-format
msgid "nothing to commit (use -u to show untracked files)\n"
msgstr ""
"липсват каквито и да е промени (използвайте опцията „-u“, за да се изведат и "
"неследените файлове)\n"
-#: wt-status.c:1792
+#: wt-status.c:1790
#, c-format
msgid "nothing to commit, working tree clean\n"
msgstr "липсват каквито и да е промени, работното дърво е чисто\n"
-#: wt-status.c:1905
+#: wt-status.c:1903
msgid "No commits yet on "
msgstr "Все още липсват подавания в "
-#: wt-status.c:1909
+#: wt-status.c:1907
msgid "HEAD (no branch)"
msgstr "HEAD (извън клон)"
-#: wt-status.c:1940
+#: wt-status.c:1938
msgid "different"
msgstr "различен"
-#: wt-status.c:1942 wt-status.c:1950
+#: wt-status.c:1940 wt-status.c:1948
msgid "behind "
msgstr "назад с "
-#: wt-status.c:1945 wt-status.c:1948
+#: wt-status.c:1943 wt-status.c:1946
msgid "ahead "
msgstr "напред с "
#. TRANSLATORS: the action is e.g. "pull with rebase"
-#: wt-status.c:2470
+#: wt-status.c:2468
#, c-format
msgid "cannot %s: You have unstaged changes."
msgstr "не може да извършите „%s“, защото има промени, които не са в индекса."
-#: wt-status.c:2476
+#: wt-status.c:2474
msgid "additionally, your index contains uncommitted changes."
msgstr "освен това в индекса има неподадени промени."
-#: wt-status.c:2478
+#: wt-status.c:2476
#, c-format
msgid "cannot %s: Your index contains uncommitted changes."
msgstr "не може да извършите „%s“, защото в индекса има неподадени промени."
-#: compat/precompose_utf8.c:58 builtin/clone.c:455
+#: compat/precompose_utf8.c:58 builtin/clone.c:456
#, c-format
msgid "failed to unlink '%s'"
msgstr "неуспешно изтриване на „%s“"
@@ -9682,7 +9832,7 @@ msgstr "git add [ОПЦИЯ…] [--] ПЪТ…"
msgid "unexpected diff status %c"
msgstr "неочакван изходен код при генериране на разлика: %c"
-#: builtin/add.c:93 builtin/commit.c:288
+#: builtin/add.c:93 builtin/commit.c:285
msgid "updating files failed"
msgstr "неуспешно обновяване на файловете"
@@ -9695,7 +9845,7 @@ msgstr "изтриване на „%s“\n"
msgid "Unstaged changes after refreshing the index:"
msgstr "Промени, които и след обновяването на индекса не са добавени към него:"
-#: builtin/add.c:266 builtin/rev-parse.c:899
+#: builtin/add.c:266 builtin/rev-parse.c:904
msgid "Could not read the index"
msgstr "Индексът не може да бъде прочетен"
@@ -9731,8 +9881,8 @@ msgid "The following paths are ignored by one of your .gitignore files:\n"
msgstr ""
"Следните пътища ще бъдат игнорирани според някой от файловете „.gitignore“:\n"
-#: builtin/add.c:322 builtin/clean.c:910 builtin/fetch.c:163 builtin/mv.c:124
-#: builtin/prune-packed.c:56 builtin/pull.c:203 builtin/push.c:548
+#: builtin/add.c:322 builtin/clean.c:904 builtin/fetch.c:164 builtin/mv.c:124
+#: builtin/prune-packed.c:14 builtin/pull.c:204 builtin/push.c:548
#: builtin/remote.c:1421 builtin/rm.c:242 builtin/send-pack.c:165
msgid "dry run"
msgstr "пробно изпълнение"
@@ -9741,7 +9891,7 @@ msgstr "пробно изпълнение"
msgid "interactive picking"
msgstr "интерактивно отбиране на промени"
-#: builtin/add.c:326 builtin/checkout.c:1511 builtin/reset.c:307
+#: builtin/add.c:326 builtin/checkout.c:1535 builtin/reset.c:308
msgid "select hunks interactively"
msgstr "интерактивен избор на парчета код"
@@ -9853,7 +10003,7 @@ msgstr ""
msgid "adding files failed"
msgstr "неуспешно добавяне на файлове"
-#: builtin/add.c:447 builtin/commit.c:348
+#: builtin/add.c:447 builtin/commit.c:345
msgid "--pathspec-from-file is incompatible with --interactive/--patch"
msgstr ""
"опцията „--pathspec-from-file“ е несъвместима с всяка от опциите „--"
@@ -9876,14 +10026,14 @@ msgstr "Опцията „--ignore-missing“ изисква „--dry-run“"
msgid "--chmod param '%s' must be either -x or +x"
msgstr "параметърът към „--chmod“ — „%s“ може да е или „-x“, или „+x“"
-#: builtin/add.c:501 builtin/checkout.c:1675 builtin/commit.c:354
-#: builtin/reset.c:327 builtin/rm.c:272 builtin/stash.c:1509
+#: builtin/add.c:501 builtin/checkout.c:1703 builtin/commit.c:351
+#: builtin/reset.c:328 builtin/rm.c:272 builtin/stash.c:1506
msgid "--pathspec-from-file is incompatible with pathspec arguments"
msgstr ""
"опцията „--pathspec-from-file“ е несъвместима с аргументи, указващи пътища"
-#: builtin/add.c:508 builtin/checkout.c:1687 builtin/commit.c:360
-#: builtin/reset.c:333 builtin/rm.c:278 builtin/stash.c:1515
+#: builtin/add.c:508 builtin/checkout.c:1715 builtin/commit.c:357
+#: builtin/reset.c:334 builtin/rm.c:278 builtin/stash.c:1512
msgid "--pathspec-file-nul requires --pathspec-from-file"
msgstr "опцията „--pathspec-file-nul“ изисква опция „--pathspec-from-file“"
@@ -10046,38 +10196,38 @@ msgstr ""
"Прилагане? „y“ — да/„n“ — не/„e“ — редактиране/„v“ — преглед/„a“ — приемане "
"на всичко:"
-#: builtin/am.c:1700 builtin/commit.c:398
+#: builtin/am.c:1699 builtin/commit.c:395
msgid "unable to write index file"
msgstr "индексът не може да бъде записан"
-#: builtin/am.c:1704
+#: builtin/am.c:1703
#, c-format
msgid "Dirty index: cannot apply patches (dirty: %s)"
msgstr ""
"Индексът не е чист: кръпките не могат да бъдат приложени (замърсени са: %s)"
-#: builtin/am.c:1744 builtin/am.c:1812
+#: builtin/am.c:1743 builtin/am.c:1811
#, c-format
msgid "Applying: %.*s"
msgstr "Прилагане: %.*s"
-#: builtin/am.c:1761
+#: builtin/am.c:1760
msgid "No changes -- Patch already applied."
msgstr "Без промени — кръпката вече е приложена."
-#: builtin/am.c:1767
+#: builtin/am.c:1766
#, c-format
msgid "Patch failed at %s %.*s"
msgstr "Неуспешно прилагане на кръпка при %s %.*s“"
-#: builtin/am.c:1771
+#: builtin/am.c:1770
msgid "Use 'git am --show-current-patch=diff' to see the failed patch"
msgstr ""
"За да видите неуспешно приложени кръпки, използвайте:\n"
"\n"
" git am --show-current-patch=diff"
-#: builtin/am.c:1815
+#: builtin/am.c:1814
msgid ""
"No changes - did you forget to use 'git add'?\n"
"If there is nothing left to stage, chances are that something else\n"
@@ -10087,7 +10237,7 @@ msgstr ""
"Ако няма друга промяна за включване в индекса, най-вероятно някоя друга\n"
"кръпка е довела до същите промени и в такъв случай просто пропуснете тази."
-#: builtin/am.c:1822
+#: builtin/am.c:1821
msgid ""
"You still have unmerged paths in your index.\n"
"You should 'git add' each file with resolved conflicts to mark them as "
@@ -10098,17 +10248,17 @@ msgstr ""
"След корекция на конфликтите изпълнете „git add“ върху поправените файлове.\n"
"За да приемете „изтрити от тях“, изпълнете „git rm“ върху изтритите файлове."
-#: builtin/am.c:1929 builtin/am.c:1933 builtin/am.c:1945 builtin/reset.c:346
-#: builtin/reset.c:354
+#: builtin/am.c:1928 builtin/am.c:1932 builtin/am.c:1944 builtin/reset.c:347
+#: builtin/reset.c:355
#, c-format
msgid "Could not parse object '%s'."
msgstr "„%s“ не е разпознат като обект."
-#: builtin/am.c:1981
+#: builtin/am.c:1980
msgid "failed to clean index"
msgstr "индексът не може да бъде изчистен"
-#: builtin/am.c:2025
+#: builtin/am.c:2024
msgid ""
"You seem to have moved HEAD since the last 'am' failure.\n"
"Not rewinding to ORIG_HEAD"
@@ -10119,160 +10269,162 @@ msgstr ""
"сочи към\n"
"„ORIG_HEAD“"
-#: builtin/am.c:2132
+#: builtin/am.c:2131
#, c-format
msgid "Invalid value for --patch-format: %s"
msgstr "Неправилна стойност за „--patch-format“: „%s“"
-#: builtin/am.c:2172
+#: builtin/am.c:2171
#, c-format
msgid "Invalid value for --show-current-patch: %s"
msgstr "Неправилна стойност за „--show-current-patch“: „%s“"
-#: builtin/am.c:2176
+#: builtin/am.c:2175
#, c-format
msgid "--show-current-patch=%s is incompatible with --show-current-patch=%s"
msgstr ""
"опциите „--show-current-patch=%s“ и „--show-current-patch=%s“ са несъвместими"
-#: builtin/am.c:2207
+#: builtin/am.c:2206
msgid "git am [<options>] [(<mbox> | <Maildir>)...]"
msgstr "git am [ОПЦИЯ…] [(ФАЙЛ_С_ПОЩА|ДИРЕКТОРИЯ_С_ПОЩА)…]"
-#: builtin/am.c:2208
+#: builtin/am.c:2207
msgid "git am [<options>] (--continue | --skip | --abort)"
msgstr "git am [ОПЦИЯ…] (--continue | --quit | --abort)"
-#: builtin/am.c:2214
+#: builtin/am.c:2213
msgid "run interactively"
msgstr "интерактивна работа"
-#: builtin/am.c:2216
+#: builtin/am.c:2215
msgid "historical option -- no-op"
msgstr "изоставена опция, съществува по исторически причини, нищо не прави"
-#: builtin/am.c:2218
+#: builtin/am.c:2217
msgid "allow fall back on 3way merging if needed"
msgstr "да се преминава към тройно сливане при нужда."
-#: builtin/am.c:2219 builtin/init-db.c:494 builtin/prune-packed.c:58
-#: builtin/repack.c:304 builtin/stash.c:812
+#: builtin/am.c:2218 builtin/init-db.c:541 builtin/prune-packed.c:16
+#: builtin/repack.c:306 builtin/stash.c:816
msgid "be quiet"
msgstr "без извеждане на информация"
-#: builtin/am.c:2221
+#: builtin/am.c:2220
msgid "add a Signed-off-by line to the commit message"
msgstr "добавяне на ред за подпис „Signed-off-by“ в съобщението за подаване"
-#: builtin/am.c:2224
+#: builtin/am.c:2223
msgid "recode into utf8 (default)"
msgstr "прекодиране в UTF-8 (стандартно)"
-#: builtin/am.c:2226
+#: builtin/am.c:2225
msgid "pass -k flag to git-mailinfo"
msgstr "подаване на опцията „-k“ на командата „git-mailinfo“"
-#: builtin/am.c:2228
+#: builtin/am.c:2227
msgid "pass -b flag to git-mailinfo"
msgstr "подаване на опцията „-b“ на командата „git-mailinfo“"
-#: builtin/am.c:2230
+#: builtin/am.c:2229
msgid "pass -m flag to git-mailinfo"
msgstr "подаване на опцията „-m“ на командата „git-mailinfo“"
-#: builtin/am.c:2232
+#: builtin/am.c:2231
msgid "pass --keep-cr flag to git-mailsplit for mbox format"
msgstr ""
"подаване на опцията „--keep-cr“ на командата „git-mailsplit“ за формат „mbox“"
-#: builtin/am.c:2235
+#: builtin/am.c:2234
msgid "do not pass --keep-cr flag to git-mailsplit independent of am.keepcr"
msgstr ""
"без подаване на опцията „--keep-cr“ на командата „git-mailsplit“ независимо "
"от „am.keepcr“"
-#: builtin/am.c:2238
+#: builtin/am.c:2237
msgid "strip everything before a scissors line"
msgstr "пропускане на всичко преди реда за отрязване"
-#: builtin/am.c:2240 builtin/am.c:2243 builtin/am.c:2246 builtin/am.c:2249
-#: builtin/am.c:2252 builtin/am.c:2255 builtin/am.c:2258 builtin/am.c:2261
-#: builtin/am.c:2267
+#: builtin/am.c:2239 builtin/am.c:2242 builtin/am.c:2245 builtin/am.c:2248
+#: builtin/am.c:2251 builtin/am.c:2254 builtin/am.c:2257 builtin/am.c:2260
+#: builtin/am.c:2266
msgid "pass it through git-apply"
msgstr "прекарване през „git-apply“"
-#: builtin/am.c:2257 builtin/commit.c:1391 builtin/fmt-merge-msg.c:670
-#: builtin/fmt-merge-msg.c:673 builtin/grep.c:871 builtin/merge.c:250
-#: builtin/pull.c:140 builtin/pull.c:199 builtin/rebase.c:1505
-#: builtin/repack.c:315 builtin/repack.c:319 builtin/repack.c:321
-#: builtin/show-branch.c:650 builtin/show-ref.c:172 builtin/tag.c:403
-#: parse-options.h:154 parse-options.h:175 parse-options.h:316
+#: builtin/am.c:2256 builtin/commit.c:1397 builtin/fmt-merge-msg.c:17
+#: builtin/fmt-merge-msg.c:20 builtin/grep.c:891 builtin/merge.c:252
+#: builtin/pull.c:141 builtin/pull.c:200 builtin/pull.c:217
+#: builtin/rebase.c:1329 builtin/repack.c:317 builtin/repack.c:321
+#: builtin/repack.c:323 builtin/show-branch.c:650 builtin/show-ref.c:172
+#: builtin/tag.c:404 parse-options.h:154 parse-options.h:175
+#: parse-options.h:316
msgid "n"
msgstr "БРОЙ"
-#: builtin/am.c:2263 builtin/branch.c:661 builtin/for-each-ref.c:38
-#: builtin/replace.c:556 builtin/tag.c:437 builtin/verify-tag.c:38
+#: builtin/am.c:2262 builtin/branch.c:659 builtin/for-each-ref.c:38
+#: builtin/replace.c:556 builtin/tag.c:438 builtin/verify-tag.c:38
+#: bugreport.c:131
msgid "format"
msgstr "ФОРМАТ"
-#: builtin/am.c:2264
+#: builtin/am.c:2263
msgid "format the patch(es) are in"
msgstr "формат на кръпките"
-#: builtin/am.c:2270
+#: builtin/am.c:2269
msgid "override error message when patch failure occurs"
msgstr "избрано от вас съобщение за грешка при прилагане на кръпки"
-#: builtin/am.c:2272
+#: builtin/am.c:2271
msgid "continue applying patches after resolving a conflict"
msgstr "продължаване на прилагането на кръпки след коригирането на конфликт"
-#: builtin/am.c:2275
+#: builtin/am.c:2274
msgid "synonyms for --continue"
msgstr "псевдоними на „--continue“"
-#: builtin/am.c:2278
+#: builtin/am.c:2277
msgid "skip the current patch"
msgstr "прескачане на текущата кръпка"
-#: builtin/am.c:2281
+#: builtin/am.c:2280
msgid "restore the original branch and abort the patching operation."
msgstr ""
"възстановяване на първоначалното състояние на клона и преустановяване на "
"прилагането на кръпката."
-#: builtin/am.c:2284
+#: builtin/am.c:2283
msgid "abort the patching operation but keep HEAD where it is."
msgstr ""
"преустановяване на прилагането на кръпката без промяна към кое сочи „HEAD“."
-#: builtin/am.c:2288
+#: builtin/am.c:2287
msgid "show the patch being applied"
msgstr "показване на прилаганата кръпка"
-#: builtin/am.c:2293
+#: builtin/am.c:2292
msgid "lie about committer date"
msgstr "дата за подаване различна от първоначалната"
-#: builtin/am.c:2295
+#: builtin/am.c:2294
msgid "use current timestamp for author date"
msgstr "използване на текущото време като това за автор"
-#: builtin/am.c:2297 builtin/commit-tree.c:120 builtin/commit.c:1512
-#: builtin/merge.c:287 builtin/pull.c:174 builtin/rebase.c:517
-#: builtin/rebase.c:1556 builtin/revert.c:117 builtin/tag.c:418
+#: builtin/am.c:2296 builtin/commit-tree.c:120 builtin/commit.c:1517
+#: builtin/merge.c:289 builtin/pull.c:175 builtin/rebase.c:524
+#: builtin/rebase.c:1380 builtin/revert.c:117 builtin/tag.c:419
msgid "key-id"
msgstr "ИДЕНТИФИКАТОР_НА_КЛЮЧ"
-#: builtin/am.c:2298 builtin/rebase.c:518 builtin/rebase.c:1557
+#: builtin/am.c:2297 builtin/rebase.c:525 builtin/rebase.c:1381
msgid "GPG-sign commits"
msgstr "подписване на подаванията с GPG"
-#: builtin/am.c:2301
+#: builtin/am.c:2300
msgid "(internal use for git-rebase)"
msgstr "(ползва се вътрешно за „git-rebase“)"
-#: builtin/am.c:2319
+#: builtin/am.c:2318
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."
@@ -10280,18 +10432,18 @@ msgstr ""
"Опциите „-b“/„--binary“ отдавна не правят нищо и\n"
"ще бъдат премахнати в бъдеще. Не ги ползвайте."
-#: builtin/am.c:2326
+#: builtin/am.c:2325
msgid "failed to read the index"
msgstr "неуспешно изчитане на индекса"
-#: builtin/am.c:2341
+#: builtin/am.c:2340
#, c-format
msgid "previous rebase directory %s still exists but mbox given."
msgstr ""
"предишната директория за пребазиране „%s“ все още съществува, а е зададен "
"файл „mbox“."
-#: builtin/am.c:2365
+#: builtin/am.c:2364
#, c-format
msgid ""
"Stray %s directory found.\n"
@@ -10300,11 +10452,11 @@ msgstr ""
"Открита е излишна директория „%s“.\n"
"Можете да я изтриете с командата „git am --abort“."
-#: builtin/am.c:2371
+#: builtin/am.c:2370
msgid "Resolve operation not in progress, we are not resuming."
msgstr "В момента не тече операция по коригиране и няма как да се продължи."
-#: builtin/am.c:2381
+#: builtin/am.c:2380
msgid "interactive mode requires patches on the command line"
msgstr "интерактивният режим изисква кръпки на командния ред"
@@ -10729,7 +10881,7 @@ msgstr ""
msgid "Ignore whitespace differences"
msgstr "Без разлики в знаците за интервали"
-#: builtin/blame.c:860 builtin/log.c:1702
+#: builtin/blame.c:860 builtin/log.c:1721
msgid "rev"
msgstr "ВЕРС"
@@ -10806,14 +10958,14 @@ msgstr ""
msgid "4 years, 11 months ago"
msgstr "преди 4 години и 11 месеца"
-#: builtin/blame.c:1079
+#: builtin/blame.c:1087
#, c-format
msgid "file %s has only %lu line"
msgid_plural "file %s has only %lu lines"
msgstr[0] "има само %2$lu ред във файла „%1$s“"
msgstr[1] "има само %2$lu реда във файла „%1$s“"
-#: builtin/blame.c:1125
+#: builtin/blame.c:1133
msgid "Blaming lines"
msgstr "Редове с авторство"
@@ -11025,7 +11177,7 @@ msgstr "задаване на режима на следене (виж git-pull(
msgid "do not use"
msgstr "да не се ползва"
-#: builtin/branch.c:626 builtin/rebase.c:513
+#: builtin/branch.c:626 builtin/rebase.c:520
msgid "upstream"
msgstr "клон-източник"
@@ -11118,68 +11270,68 @@ msgstr "извеждане само на неслетите клони"
msgid "list branches in columns"
msgstr "извеждане по колони"
-#: builtin/branch.c:657 builtin/for-each-ref.c:42 builtin/notes.c:415
+#: builtin/branch.c:656 builtin/for-each-ref.c:42 builtin/notes.c:415
#: builtin/notes.c:418 builtin/notes.c:581 builtin/notes.c:584
-#: builtin/tag.c:433
+#: builtin/tag.c:434
msgid "object"
msgstr "ОБЕКТ"
-#: builtin/branch.c:658
+#: builtin/branch.c:657
msgid "print only branches of the object"
msgstr "извеждане само на клоните на ОБЕКТА"
-#: builtin/branch.c:660 builtin/for-each-ref.c:48 builtin/tag.c:440
+#: builtin/branch.c:658 builtin/for-each-ref.c:48 builtin/tag.c:441
msgid "sorting and filtering are case insensitive"
msgstr "подредбата и филтрирането третират еднакво малките и главните букви"
-#: builtin/branch.c:661 builtin/for-each-ref.c:38 builtin/tag.c:438
+#: builtin/branch.c:659 builtin/for-each-ref.c:38 builtin/tag.c:439
#: builtin/verify-tag.c:38
msgid "format to use for the output"
msgstr "ФОРМАТ за изхода"
-#: builtin/branch.c:684 builtin/clone.c:785
+#: builtin/branch.c:682 builtin/clone.c:789
msgid "HEAD not found below refs/heads!"
msgstr "В директорията „refs/heads“ липсва файл „HEAD“"
-#: builtin/branch.c:708
+#: builtin/branch.c:706
msgid "--column and --verbose are incompatible"
msgstr "Опциите „--column“ и „--verbose“ са несъвместими"
-#: builtin/branch.c:723 builtin/branch.c:777 builtin/branch.c:786
+#: builtin/branch.c:721 builtin/branch.c:775 builtin/branch.c:784
msgid "branch name required"
msgstr "Необходимо е име на клон"
-#: builtin/branch.c:753
+#: builtin/branch.c:751
msgid "Cannot give description to detached HEAD"
msgstr "Не може да зададете описание на несвързан „HEAD“"
-#: builtin/branch.c:758
+#: builtin/branch.c:756
msgid "cannot edit description of more than one branch"
msgstr "Не може да редактирате описанието на повече от един клон едновременно"
-#: builtin/branch.c:765
+#: builtin/branch.c:763
#, c-format
msgid "No commit on branch '%s' yet."
msgstr "В клона „%s“ все още няма подавания."
-#: builtin/branch.c:768
+#: builtin/branch.c:766
#, c-format
msgid "No branch named '%s'."
msgstr "Липсва клон на име „%s“."
-#: builtin/branch.c:783
+#: builtin/branch.c:781
msgid "too many branches for a copy operation"
msgstr "прекалено много клони за копиране"
-#: builtin/branch.c:792
+#: builtin/branch.c:790
msgid "too many arguments for a rename operation"
msgstr "прекалено много аргументи към командата за преименуване"
-#: builtin/branch.c:797
+#: builtin/branch.c:795
msgid "too many arguments to set new upstream"
msgstr "прекалено много аргументи към командата за следене"
-#: builtin/branch.c:801
+#: builtin/branch.c:799
#, c-format
msgid ""
"could not set upstream of HEAD to %s when it does not point to any branch."
@@ -11187,31 +11339,31 @@ msgstr ""
"Следеното от „HEAD“ не може да се зададе да е „%s“, защото то не сочи към "
"никой клон."
-#: builtin/branch.c:804 builtin/branch.c:827
+#: builtin/branch.c:802 builtin/branch.c:825
#, c-format
msgid "no such branch '%s'"
msgstr "Няма клон на име „%s“."
-#: builtin/branch.c:808
+#: builtin/branch.c:806
#, c-format
msgid "branch '%s' does not exist"
msgstr "Не съществува клон на име „%s“."
-#: builtin/branch.c:821
+#: builtin/branch.c:819
msgid "too many arguments to unset upstream"
msgstr "прекалено много аргументи към командата за спиране на следене"
-#: builtin/branch.c:825
+#: builtin/branch.c:823
msgid "could not unset upstream of HEAD when it does not point to any branch."
msgstr ""
"Следеното от „HEAD“ не може да махне, защото то не сочи към никой клон."
-#: builtin/branch.c:831
+#: builtin/branch.c:829
#, c-format
msgid "Branch '%s' has no upstream information"
msgstr "Няма информация клонът „%s“ да следи някой друг"
-#: builtin/branch.c:841
+#: builtin/branch.c:839
msgid ""
"The -a, and -r, options to 'git branch' do not take a branch name.\n"
"Did you mean to use: -a|-r --list <pattern>?"
@@ -11219,7 +11371,7 @@ msgstr ""
"Опциите „-a“ и „-r“ на „git branch“ са несъвместими с име на клон.\n"
"Пробвайте с: „-a|-r --list ШАБЛОН“"
-#: builtin/branch.c:845
+#: builtin/branch.c:843
msgid ""
"the '--set-upstream' option is no longer supported. Please use '--track' or "
"'--set-upstream-to' instead."
@@ -11243,19 +11395,19 @@ msgstr "git bundle list-heads ФАЙЛ [ИМЕ_НА_УКАЗАТЕЛ…]"
msgid "git bundle unbundle <file> [<refname>...]"
msgstr "git bundle unbundle ФАЙЛ [ИМЕ_НА_УКАЗАТЕЛ…]"
-#: builtin/bundle.c:66 builtin/pack-objects.c:3375
+#: builtin/bundle.c:66 builtin/pack-objects.c:3376
msgid "do not show progress meter"
msgstr "без извеждане на напредъка"
-#: builtin/bundle.c:68 builtin/pack-objects.c:3377
+#: builtin/bundle.c:68 builtin/pack-objects.c:3378
msgid "show progress meter"
msgstr "извеждане на напредъка"
-#: builtin/bundle.c:70 builtin/pack-objects.c:3379
+#: builtin/bundle.c:70 builtin/pack-objects.c:3380
msgid "show progress meter during object writing phase"
msgstr "извеждане на напредъка във фазата на запазване на обектите"
-#: builtin/bundle.c:73 builtin/pack-objects.c:3382
+#: builtin/bundle.c:73 builtin/pack-objects.c:3383
msgid "similar to --all-progress when progress meter is shown"
msgstr ""
"същото действие като опцията „--all-progress“ при извеждането на напредъка"
@@ -11286,7 +11438,7 @@ msgstr "повече подробности. Поставя се пред по
msgid "Unknown subcommand: %s"
msgstr "Непозната подкоманда: %s"
-#: builtin/cat-file.c:595
+#: builtin/cat-file.c:598
msgid ""
"git cat-file (-t [--allow-unknown-type] | -s [--allow-unknown-type] | -e | -"
"p | <type> | --textconv | --filters) [--path=<path>] <object>"
@@ -11294,7 +11446,7 @@ msgstr ""
"git cat-file (-t [--allow-unknown-type] | -s [--allow-unknown-type] | -e | -"
"p | ВИД | --textconv --filters) [--path=ПЪТ] ОБЕКТ"
-#: builtin/cat-file.c:596
+#: builtin/cat-file.c:599
msgid ""
"git cat-file (--batch | --batch-check) [--follow-symlinks] [--textconv | --"
"filters]"
@@ -11302,79 +11454,79 @@ msgstr ""
"git cat-file (--batch | --batch-check) [--follow-symlinks] [--textconv | --"
"filters]"
-#: builtin/cat-file.c:617
+#: builtin/cat-file.c:620
msgid "only one batch option may be specified"
msgstr "може да укажете само една пакетна опция"
-#: builtin/cat-file.c:635
+#: builtin/cat-file.c:638
msgid "<type> can be one of: blob, tree, commit, tag"
msgstr ""
"ВИДът може да е: „blob“ (BLOB), „tree“ (дърво), „commit“ (подаване), "
"„tag“ (етикет)"
-#: builtin/cat-file.c:636
+#: builtin/cat-file.c:639
msgid "show object type"
msgstr "извеждане на вида на обект"
-#: builtin/cat-file.c:637
+#: builtin/cat-file.c:640
msgid "show object size"
msgstr "извеждане на размера на обект"
-#: builtin/cat-file.c:639
+#: builtin/cat-file.c:642
msgid "exit with zero when there's no error"
msgstr "изход с 0, когато няма грешка"
-#: builtin/cat-file.c:640
+#: builtin/cat-file.c:643
msgid "pretty-print object's content"
msgstr "форматирано извеждане на съдържанието на обекта"
-#: builtin/cat-file.c:642
+#: builtin/cat-file.c:645
msgid "for blob objects, run textconv on object's content"
msgstr ""
"да се стартира програмата зададена в настройката „textconv“ за преобразуване "
"на съдържанието на обекта-BLOB"
-#: builtin/cat-file.c:644
+#: builtin/cat-file.c:647
msgid "for blob objects, run filters on object's content"
msgstr ""
"да се стартират програмите за преобразуване на съдържанието на обектите-BLOB"
-#: builtin/cat-file.c:645 git-submodule.sh:1002
+#: builtin/cat-file.c:648 git-submodule.sh:984
msgid "blob"
msgstr "обект-BLOB"
-#: builtin/cat-file.c:646
+#: builtin/cat-file.c:649
msgid "use a specific path for --textconv/--filters"
msgstr "опциите „--textconv“/„--filters“ изискват път"
-#: builtin/cat-file.c:648
+#: builtin/cat-file.c:651
msgid "allow -s and -t to work with broken/corrupt objects"
msgstr "позволяване на опциите „-s“ и „-t“ да работят с повредени обекти"
-#: builtin/cat-file.c:649
+#: builtin/cat-file.c:652
msgid "buffer --batch output"
msgstr "буфериране на изхода от „--batch“"
-#: builtin/cat-file.c:651
+#: builtin/cat-file.c:654
msgid "show info and content of objects fed from the standard input"
msgstr ""
"извеждане на информация и съдържание на обектите подадени на стандартния вход"
-#: builtin/cat-file.c:655
+#: builtin/cat-file.c:658
msgid "show info about objects fed from the standard input"
msgstr "извеждане на информация за обектите подадени на стандартния вход"
-#: builtin/cat-file.c:659
+#: builtin/cat-file.c:662
msgid "follow in-tree symlinks (used with --batch or --batch-check)"
msgstr ""
"следване на символните връзки сочещи в дървото (ползва се с „--batch“ или „--"
"batch-check“)"
-#: builtin/cat-file.c:661
+#: builtin/cat-file.c:664
msgid "show all objects with --batch or --batch-check"
msgstr "извеждане на всички обекти с „--batch“ или „--batch-check“"
-#: builtin/cat-file.c:663
+#: builtin/cat-file.c:666
msgid "do not order --batch-all-objects output"
msgstr "без подреждане на изхода от „--batch-all-objects“"
@@ -11402,8 +11554,8 @@ msgstr "изчитане на имената на файловете от ста
msgid "terminate input and output records by a NUL character"
msgstr "разделяне на входните и изходните записи с нулевия знак „NUL“"
-#: builtin/check-ignore.c:21 builtin/checkout.c:1464 builtin/gc.c:537
-#: builtin/worktree.c:499
+#: builtin/check-ignore.c:21 builtin/checkout.c:1488 builtin/gc.c:537
+#: builtin/worktree.c:502
msgid "suppress progress reporting"
msgstr "без показване на напредъка"
@@ -11495,7 +11647,7 @@ msgstr "записване на съдържанието във временни
#: builtin/checkout-index.c:178 builtin/column.c:31
#: builtin/submodule--helper.c:1400 builtin/submodule--helper.c:1403
#: builtin/submodule--helper.c:1411 builtin/submodule--helper.c:1909
-#: builtin/worktree.c:672
+#: builtin/worktree.c:675
msgid "string"
msgstr "НИЗ"
@@ -11523,99 +11675,99 @@ msgstr "git switch [ОПЦИЯ…] КЛОН"
msgid "git restore [<options>] [--source=<branch>] <file>..."
msgstr "git restore [ОПЦИЯ…] [--source=КЛОН] ФАЙЛ…"
-#: builtin/checkout.c:175 builtin/checkout.c:214
+#: builtin/checkout.c:188 builtin/checkout.c:227
#, c-format
msgid "path '%s' does not have our version"
msgstr "вашата версия липсва в пътя „%s“"
-#: builtin/checkout.c:177 builtin/checkout.c:216
+#: builtin/checkout.c:190 builtin/checkout.c:229
#, c-format
msgid "path '%s' does not have their version"
msgstr "чуждата версия липсва в пътя „%s“"
-#: builtin/checkout.c:193
+#: builtin/checkout.c:206
#, c-format
msgid "path '%s' does not have all necessary versions"
msgstr "някоя от необходимите версии липсва в пътя „%s“"
-#: builtin/checkout.c:243
+#: builtin/checkout.c:256
#, c-format
msgid "path '%s' does not have necessary versions"
msgstr "някоя от необходимите версии липсва в пътя „%s“"
-#: builtin/checkout.c:261
+#: builtin/checkout.c:274
#, c-format
msgid "path '%s': cannot merge"
msgstr "пътят „%s“ не може да бъде слян"
-#: builtin/checkout.c:277
+#: builtin/checkout.c:290
#, c-format
msgid "Unable to add merge result for '%s'"
msgstr "Резултатът за „%s“ не може да бъде слян"
-#: builtin/checkout.c:377
+#: builtin/checkout.c:395
#, c-format
msgid "Recreated %d merge conflict"
msgid_plural "Recreated %d merge conflicts"
msgstr[0] "Пресъздаден е %d конфликт при сливане"
msgstr[1] "Пресъздадени са %d конфликта при сливане"
-#: builtin/checkout.c:382
+#: builtin/checkout.c:400
#, c-format
msgid "Updated %d path from %s"
msgid_plural "Updated %d paths from %s"
msgstr[0] "Обновен е %d път от „%s“"
msgstr[1] "Обновени са %d пътя от „%s“"
-#: builtin/checkout.c:389
+#: builtin/checkout.c:407
#, c-format
msgid "Updated %d path from the index"
msgid_plural "Updated %d paths from the index"
msgstr[0] "Обновен е %d път от индекса"
msgstr[1] "Обновени са %d пътя от индекса"
-#: builtin/checkout.c:412 builtin/checkout.c:415 builtin/checkout.c:418
-#: builtin/checkout.c:422
+#: builtin/checkout.c:430 builtin/checkout.c:433 builtin/checkout.c:436
+#: builtin/checkout.c:440
#, c-format
msgid "'%s' cannot be used with updating paths"
msgstr "опцията „%s“ е несъвместима с обновяването на пътища"
-#: builtin/checkout.c:425 builtin/checkout.c:428
+#: builtin/checkout.c:443 builtin/checkout.c:446
#, c-format
msgid "'%s' cannot be used with %s"
msgstr "опцията „%s“ е несъвместима с „%s“"
-#: builtin/checkout.c:432
+#: builtin/checkout.c:450
#, c-format
msgid "Cannot update paths and switch to branch '%s' at the same time."
msgstr ""
"Невъзможно е едновременно да обновявате пътища и да преминете към клона „%s“."
-#: builtin/checkout.c:436
+#: builtin/checkout.c:454
#, c-format
msgid "neither '%s' or '%s' is specified"
msgstr "не е указано нито „%s“, нито „%s“"
-#: builtin/checkout.c:440
+#: builtin/checkout.c:458
#, c-format
msgid "'%s' must be used when '%s' is not specified"
msgstr "опцията „%s“ е задължителна, когато „%s“ не е зададена"
-#: builtin/checkout.c:445 builtin/checkout.c:450
+#: builtin/checkout.c:463 builtin/checkout.c:468
#, c-format
msgid "'%s' or '%s' cannot be used with %s"
msgstr "опцията „%3$s“ е несъвместима както с „%1$s“, така и с „%2$s“"
-#: builtin/checkout.c:509 builtin/checkout.c:516
+#: builtin/checkout.c:527 builtin/checkout.c:534
#, c-format
msgid "path '%s' is unmerged"
msgstr "пътят „%s“ не е слят"
-#: builtin/checkout.c:684 builtin/sparse-checkout.c:106
+#: builtin/checkout.c:704
msgid "you need to resolve your current index first"
msgstr "първо трябва да коригирате индекса си"
-#: builtin/checkout.c:734
+#: builtin/checkout.c:758
#, c-format
msgid ""
"cannot continue with staged changes in the following files:\n"
@@ -11625,50 +11777,50 @@ msgstr ""
"индекса:\n"
"%s"
-#: builtin/checkout.c:837
+#: builtin/checkout.c:861
#, c-format
msgid "Can not do reflog for '%s': %s\n"
msgstr "Журналът на указателите за „%s“ не може да се проследи: %s\n"
-#: builtin/checkout.c:879
+#: builtin/checkout.c:903
msgid "HEAD is now at"
msgstr "Указателят „HEAD“ в момента сочи към"
-#: builtin/checkout.c:883 builtin/clone.c:717
+#: builtin/checkout.c:907 builtin/clone.c:720
msgid "unable to update HEAD"
msgstr "Указателят „HEAD“ не може да бъде обновен"
-#: builtin/checkout.c:887
+#: builtin/checkout.c:911
#, c-format
msgid "Reset branch '%s'\n"
msgstr "Зануляване на клона „%s“\n"
-#: builtin/checkout.c:890
+#: builtin/checkout.c:914
#, c-format
msgid "Already on '%s'\n"
msgstr "Вече сте на „%s“\n"
-#: builtin/checkout.c:894
+#: builtin/checkout.c:918
#, c-format
msgid "Switched to and reset branch '%s'\n"
msgstr "Преминаване към клона „%s“ и зануляване на промените\n"
-#: builtin/checkout.c:896 builtin/checkout.c:1320
+#: builtin/checkout.c:920 builtin/checkout.c:1344
#, c-format
msgid "Switched to a new branch '%s'\n"
msgstr "Преминахте към новия клон „%s“\n"
-#: builtin/checkout.c:898
+#: builtin/checkout.c:922
#, c-format
msgid "Switched to branch '%s'\n"
msgstr "Преминахте към клона „%s“\n"
-#: builtin/checkout.c:949
+#: builtin/checkout.c:973
#, c-format
msgid " ... and %d more.\n"
msgstr "… и още %d.\n"
-#: builtin/checkout.c:955
+#: builtin/checkout.c:979
#, c-format
msgid ""
"Warning: you are leaving %d commit behind, not connected to\n"
@@ -11690,7 +11842,7 @@ msgstr[1] ""
"\n"
"%s\n"
-#: builtin/checkout.c:974
+#: builtin/checkout.c:998
#, c-format
msgid ""
"If you want to keep it by creating a new branch, this may be a good time\n"
@@ -11717,19 +11869,19 @@ msgstr[1] ""
" git branch ИМЕ_НА_НОВИЯ_КЛОН %s\n"
"\n"
-#: builtin/checkout.c:1009
+#: builtin/checkout.c:1033
msgid "internal error in revision walk"
msgstr "вътрешна грешка при обхождането на версиите"
-#: builtin/checkout.c:1013
+#: builtin/checkout.c:1037
msgid "Previous HEAD position was"
msgstr "Преди това „HEAD“ сочеше към"
-#: builtin/checkout.c:1053 builtin/checkout.c:1315
+#: builtin/checkout.c:1077 builtin/checkout.c:1339
msgid "You are on a branch yet to be born"
msgstr "В момента сте на клон, който все още не е създаден"
-#: builtin/checkout.c:1128
+#: builtin/checkout.c:1152
#, c-format
msgid ""
"'%s' could be both a local file and a tracking branch.\n"
@@ -11738,7 +11890,7 @@ msgstr ""
"„%s“ може да е както локален файл, така и следящ клон. За уточняване\n"
"ползвайте разделителя „--“ (и евентуално опцията „--no-guess“)"
-#: builtin/checkout.c:1135
+#: builtin/checkout.c:1159
msgid ""
"If you meant to check out a remote tracking branch on, e.g. 'origin',\n"
"you can do so by fully qualifying the name with the --track option:\n"
@@ -11760,51 +11912,51 @@ msgstr ""
"\n"
" checkout.defaultRemote=origin"
-#: builtin/checkout.c:1145
+#: builtin/checkout.c:1169
#, c-format
msgid "'%s' matched multiple (%d) remote tracking branches"
msgstr "„%s“ напасва с множество (%d) отдалечени клони"
-#: builtin/checkout.c:1211
+#: builtin/checkout.c:1235
msgid "only one reference expected"
msgstr "очаква се само един указател"
-#: builtin/checkout.c:1228
+#: builtin/checkout.c:1252
#, c-format
msgid "only one reference expected, %d given."
msgstr "очаква се един указател, а сте подали %d."
-#: builtin/checkout.c:1274 builtin/worktree.c:283 builtin/worktree.c:448
+#: builtin/checkout.c:1298 builtin/worktree.c:283 builtin/worktree.c:451
#, c-format
msgid "invalid reference: %s"
msgstr "неправилен указател: %s"
-#: builtin/checkout.c:1287 builtin/checkout.c:1649
+#: builtin/checkout.c:1311 builtin/checkout.c:1677
#, c-format
msgid "reference is not a tree: %s"
msgstr "указателят не сочи към обект-дърво: %s"
-#: builtin/checkout.c:1334
+#: builtin/checkout.c:1358
#, c-format
msgid "a branch is expected, got tag '%s'"
msgstr "очаква се клон, а не етикет — „%s“"
-#: builtin/checkout.c:1336
+#: builtin/checkout.c:1360
#, c-format
msgid "a branch is expected, got remote branch '%s'"
msgstr "очаква се локален, а не отдалечен клон — „%s“"
-#: builtin/checkout.c:1337 builtin/checkout.c:1345
+#: builtin/checkout.c:1361 builtin/checkout.c:1369
#, c-format
msgid "a branch is expected, got '%s'"
msgstr "очаква се клон, а не „%s“"
-#: builtin/checkout.c:1340
+#: builtin/checkout.c:1364
#, c-format
msgid "a branch is expected, got commit '%s'"
msgstr "очаква се клон, а не подаване — „%s“"
-#: builtin/checkout.c:1356
+#: builtin/checkout.c:1380
msgid ""
"cannot switch branch while merging\n"
"Consider \"git merge --quit\" or \"git worktree add\"."
@@ -11812,7 +11964,7 @@ msgstr ""
"по време на сливане не може да преминете към друг клон.\n"
"Пробвайте с „git merge --quit“ или „git worktree add“."
-#: builtin/checkout.c:1360
+#: builtin/checkout.c:1384
msgid ""
"cannot switch branch in the middle of an am session\n"
"Consider \"git am --quit\" or \"git worktree add\"."
@@ -11821,7 +11973,7 @@ msgstr ""
"клон.\n"
"Пробвайте с „git am --quit“ или „git worktree add“."
-#: builtin/checkout.c:1364
+#: builtin/checkout.c:1388
msgid ""
"cannot switch branch while rebasing\n"
"Consider \"git rebase --quit\" or \"git worktree add\"."
@@ -11829,7 +11981,7 @@ msgstr ""
"по време на пребазиране не може да преминете към друг клон.\n"
"Пробвайте с „git rebase --quit“ или „git worktree add“."
-#: builtin/checkout.c:1368
+#: builtin/checkout.c:1392
msgid ""
"cannot switch branch while cherry-picking\n"
"Consider \"git cherry-pick --quit\" or \"git worktree add\"."
@@ -11837,7 +11989,7 @@ msgstr ""
"по време на отбиране на подавания не може да преминете към друг клон.\n"
"Пробвайте с „git cherry-pick --quit“ или „git worktree add“."
-#: builtin/checkout.c:1372
+#: builtin/checkout.c:1396
msgid ""
"cannot switch branch while reverting\n"
"Consider \"git revert --quit\" or \"git worktree add\"."
@@ -11845,144 +11997,146 @@ msgstr ""
"по време на отмяна на подавания не може да преминете към друг клон.\n"
"Пробвайте с „git revert --quit“ или „git worktree add“."
-#: builtin/checkout.c:1376
+#: builtin/checkout.c:1400
msgid "you are switching branch while bisecting"
msgstr "преминаване към друг клон по време на двоично търсене"
-#: builtin/checkout.c:1383
+#: builtin/checkout.c:1407
msgid "paths cannot be used with switching branches"
msgstr "задаването на път е несъвместимо с преминаването от един клон към друг"
-#: builtin/checkout.c:1386 builtin/checkout.c:1390 builtin/checkout.c:1394
+#: builtin/checkout.c:1410 builtin/checkout.c:1414 builtin/checkout.c:1418
#, c-format
msgid "'%s' cannot be used with switching branches"
msgstr "опцията „%s“ е несъвместима с преминаването от един клон към друг"
-#: builtin/checkout.c:1398 builtin/checkout.c:1401 builtin/checkout.c:1404
-#: builtin/checkout.c:1409 builtin/checkout.c:1414
+#: builtin/checkout.c:1422 builtin/checkout.c:1425 builtin/checkout.c:1428
+#: builtin/checkout.c:1433 builtin/checkout.c:1438
#, c-format
msgid "'%s' cannot be used with '%s'"
msgstr "опцията „%s“ е несъвместима с „%s“"
-#: builtin/checkout.c:1411
+#: builtin/checkout.c:1435
#, c-format
msgid "'%s' cannot take <start-point>"
msgstr "опцията „%s“ е несъвместима със задаването на НАЧАЛО"
-#: builtin/checkout.c:1419
+#: builtin/checkout.c:1443
#, c-format
msgid "Cannot switch branch to a non-commit '%s'"
msgstr ""
"За да преминете към клон, подайте указател, който сочи към подаване. „%s“ "
"не е такъв"
-#: builtin/checkout.c:1426
+#: builtin/checkout.c:1450
msgid "missing branch or commit argument"
msgstr "липсва аргумент — клон или подаване"
-#: builtin/checkout.c:1468 builtin/clone.c:91 builtin/commit-graph.c:72
-#: builtin/commit-graph.c:135 builtin/fetch.c:167 builtin/merge.c:286
-#: builtin/multi-pack-index.c:27 builtin/pull.c:118 builtin/push.c:563
-#: builtin/send-pack.c:174
+#: builtin/checkout.c:1492 builtin/clone.c:91 builtin/commit-graph.c:80
+#: builtin/commit-graph.c:164 builtin/fetch.c:168 builtin/merge.c:288
+#: builtin/multi-pack-index.c:27 builtin/pull.c:119 builtin/push.c:561
+#: builtin/send-pack.c:173
msgid "force progress reporting"
msgstr "извеждане на напредъка"
-#: builtin/checkout.c:1469
+#: builtin/checkout.c:1493
msgid "perform a 3-way merge with the new branch"
msgstr "извършване на тройно сливане с новия клон"
-#: builtin/checkout.c:1470 builtin/log.c:1690 parse-options.h:322
+#: builtin/checkout.c:1494 builtin/log.c:1709 parse-options.h:322
msgid "style"
msgstr "СТИЛ"
-#: builtin/checkout.c:1471
+#: builtin/checkout.c:1495
msgid "conflict style (merge or diff3)"
msgstr "действие при конфликт (сливане или тройна разлика)"
-#: builtin/checkout.c:1483 builtin/worktree.c:496
+#: builtin/checkout.c:1507 builtin/worktree.c:499
msgid "detach HEAD at named commit"
msgstr "отделяне на указателя „HEAD“ към указаното подаване"
-#: builtin/checkout.c:1484
+#: builtin/checkout.c:1508
msgid "set upstream info for new branch"
msgstr "задаване на кой клон бива следен при създаването на новия клон"
-#: builtin/checkout.c:1486
+#: builtin/checkout.c:1510
msgid "force checkout (throw away local modifications)"
msgstr "принудително изтегляне (вашите промени ще бъдат занулени)"
-#: builtin/checkout.c:1488
+#: builtin/checkout.c:1512
msgid "new-branch"
msgstr "НОВ_КЛОН"
-#: builtin/checkout.c:1488
+#: builtin/checkout.c:1512
msgid "new unparented branch"
msgstr "нов клон без родител"
-#: builtin/checkout.c:1490 builtin/merge.c:289
+#: builtin/checkout.c:1514 builtin/merge.c:292
msgid "update ignored files (default)"
msgstr "обновяване на игнорираните файлове (стандартно)"
-#: builtin/checkout.c:1493
+#: builtin/checkout.c:1517
msgid "do not check if another worktree is holding the given ref"
msgstr "без проверка дали друго работно дърво държи указателя"
-#: builtin/checkout.c:1506
+#: builtin/checkout.c:1530
msgid "checkout our version for unmerged files"
msgstr "изтегляне на вашата версия на неслетите файлове"
-#: builtin/checkout.c:1509
+#: builtin/checkout.c:1533
msgid "checkout their version for unmerged files"
msgstr "изтегляне на чуждата версия на неслетите файлове"