diff options
307 files changed, 12076 insertions, 5554 deletions
diff --git a/.github/workflows/check-whitespace.yml b/.github/workflows/check-whitespace.yml index ad3466ad16..a58e2dc8ad 100644 --- a/.github/workflows/check-whitespace.yml +++ b/.github/workflows/check-whitespace.yml @@ -9,42 +9,83 @@ on: pull_request: types: [opened, synchronize] +# Avoid unnecessary builds. Unlike the main CI jobs, these are not +# ci-configurable (but could be). +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: check-whitespace: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 with: fetch-depth: 0 - name: git log --check id: check_out run: | - log= + baseSha=${{github.event.pull_request.base.sha}} + problems=() commit= - while read dash etc + commitText= + commitTextmd= + goodparent= + while read dash sha etc do case "${dash}" in "---") - commit="${etc}" + if test -z "${commit}" + then + goodparent=${sha} + fi + commit="${sha}" + commitText="${sha} ${etc}" + commitTextmd="[${sha}](https://github.com/${{ github.repository }}/commit/${sha}) ${etc}" ;; "") ;; *) if test -n "${commit}" then - log="${log}\n${commit}" + problems+=("1) --- ${commitTextmd}") echo "" - echo "--- ${commit}" + echo "--- ${commitText}" + commit= fi - commit= - log="${log}\n${dash} ${etc}" - echo "${dash} ${etc}" + case "${dash}" in + *:[1-9]*:) # contains file and line number information + dashend=${dash#*:} + problems+=("[${dash}](https://github.com/${{ github.repository }}/blob/${{github.event.pull_request.head.ref}}/${dash%%:*}#L${dashend%:}) ${sha} ${etc}") + ;; + *) + problems+=("\`${dash} ${sha} ${etc}\`") + ;; + esac + echo "${dash} ${sha} ${etc}" ;; esac - done <<< $(git log --check --pretty=format:"---% h% s" ${{github.event.pull_request.base.sha}}..) + done <<< $(git log --check --pretty=format:"---% h% s" ${baseSha}..) - if test -n "${log}" + if test ${#problems[*]} -gt 0 then + if test -z "${commit}" + then + goodparent=${baseSha: 0:7} + fi + echo "🛑 Please review the Summary output for further information." + echo "### :x: A whitespace issue was found in one or more of the commits." >$GITHUB_STEP_SUMMARY + echo "" >>$GITHUB_STEP_SUMMARY + echo "Run these commands to correct the problem:" >>$GITHUB_STEP_SUMMARY + echo "1. \`git rebase --whitespace=fix ${goodparent}\`" >>$GITHUB_STEP_SUMMARY + echo "1. \`git push --force\`" >>$GITHUB_STEP_SUMMARY + echo " " >>$GITHUB_STEP_SUMMARY + echo "Errors:" >>$GITHUB_STEP_SUMMARY + for i in "${problems[@]}" + do + echo "${i}" >>$GITHUB_STEP_SUMMARY + done + exit 2 fi diff --git a/.github/workflows/l10n.yml b/.github/workflows/l10n.yml index 27f72f0ff3..6c3849658a 100644 --- a/.github/workflows/l10n.yml +++ b/.github/workflows/l10n.yml @@ -2,6 +2,12 @@ name: git-l10n on: [push, pull_request_target] +# Avoid unnecessary builds. Unlike the main CI jobs, these are not +# ci-configurable (but could be). +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: git-po-helper: if: >- @@ -23,8 +29,8 @@ jobs: base=${{ github.event.before }} head=${{ github.event.after }} fi - echo "::set-output name=base::$base" - echo "::set-output name=head::$head" + echo base=$base >>$GITHUB_OUTPUT + echo head=$head >>$GITHUB_OUTPUT - name: Run partial clone run: | git -c init.defaultBranch=master init --bare . diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index bd6f75b8e0..f2fd6cf9cd 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -11,6 +11,7 @@ jobs: runs-on: ubuntu-latest outputs: enabled: ${{ steps.check-ref.outputs.enabled }}${{ steps.skip-if-redundant.outputs.enabled }} + skip_concurrent: ${{ steps.check-ref.outputs.skip_concurrent }} steps: - name: try to clone ci-config branch run: | @@ -34,17 +35,25 @@ jobs: then enabled=no fi - echo "::set-output name=enabled::$enabled" + + skip_concurrent=yes + if test -x config-repo/ci/config/skip-concurrent && + ! config-repo/ci/config/skip-concurrent '${{ github.ref }}' + then + skip_concurrent=no + fi + echo "enabled=$enabled" >>$GITHUB_OUTPUT + echo "skip_concurrent=$skip_concurrent" >>$GITHUB_OUTPUT - name: skip if the commit or tree was already tested id: skip-if-redundant - uses: actions/github-script@v3 + uses: actions/github-script@v6 if: steps.check-ref.outputs.enabled == 'yes' with: github-token: ${{secrets.GITHUB_TOKEN}} script: | try { // Figure out workflow ID, commit and tree - const { data: run } = await github.actions.getWorkflowRun({ + const { data: run } = await github.rest.actions.getWorkflowRun({ owner: context.repo.owner, repo: context.repo.repo, run_id: context.runId, @@ -54,7 +63,7 @@ jobs: const tree_id = run.head_commit.tree_id; // See whether there is a successful run for that commit or tree - const { data: runs } = await github.actions.listWorkflowRuns({ + const { data: runs } = await github.rest.actions.listWorkflowRuns({ owner: context.repo.owner, repo: context.repo.repo, per_page: 500, @@ -82,8 +91,11 @@ jobs: needs: ci-config if: needs.ci-config.outputs.enabled == 'yes' runs-on: windows-latest + concurrency: + group: windows-build-${{ github.ref }} + cancel-in-progress: ${{ needs.ci-config.outputs.skip_concurrent == 'yes' }} steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - uses: git-for-windows/setup-git-for-windows-sdk@v1 - name: build shell: bash @@ -94,21 +106,24 @@ jobs: - name: zip up tracked files run: git archive -o artifacts/tracked.tar.gz HEAD - name: upload tracked files and build artifacts - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: windows-artifacts path: artifacts windows-test: name: win test runs-on: windows-latest - needs: [windows-build] + needs: [ci-config, windows-build] strategy: fail-fast: false matrix: nr: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] + concurrency: + group: windows-test-${{ matrix.nr }}-${{ github.ref }} + cancel-in-progress: ${{ needs.ci-config.outputs.skip_concurrent == 'yes' }} steps: - name: download tracked files and build artifacts - uses: actions/download-artifact@v2 + uses: actions/download-artifact@v3 with: name: windows-artifacts path: ${{github.workspace}} @@ -125,23 +140,26 @@ jobs: run: ci/print-test-failures.sh - name: Upload failed tests' directories if: failure() && env.FAILED_TEST_ARTIFACTS != '' - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: failed-tests-windows path: ${{env.FAILED_TEST_ARTIFACTS}} vs-build: name: win+VS build needs: ci-config - if: needs.ci-config.outputs.enabled == 'yes' + if: github.event.repository.owner.login == 'git-for-windows' && needs.ci-config.outputs.enabled == 'yes' env: NO_PERL: 1 GIT_CONFIG_PARAMETERS: "'user.name=CI' 'user.email=ci@git'" runs-on: windows-latest + concurrency: + group: vs-build-${{ github.ref }} + cancel-in-progress: ${{ needs.ci-config.outputs.skip_concurrent == 'yes' }} steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - uses: git-for-windows/setup-git-for-windows-sdk@v1 - name: initialize vcpkg - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: repository: 'microsoft/vcpkg' path: 'compat/vcbuild/vcpkg' @@ -177,22 +195,25 @@ jobs: - name: zip up tracked files run: git archive -o artifacts/tracked.tar.gz HEAD - name: upload tracked files and build artifacts - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: vs-artifacts path: artifacts vs-test: name: win+VS test runs-on: windows-latest - needs: vs-build + needs: [ci-config, vs-build] strategy: fail-fast: false matrix: nr: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] + concurrency: + group: vs-test-${{ matrix.nr }}-${{ github.ref }} + cancel-in-progress: ${{ needs.ci-config.outputs.skip_concurrent == 'yes' }} steps: - uses: git-for-windows/setup-git-for-windows-sdk@v1 - name: download tracked files and build artifacts - uses: actions/download-artifact@v2 + uses: actions/download-artifact@v3 with: name: vs-artifacts path: ${{github.workspace}} @@ -210,7 +231,7 @@ jobs: run: ci/print-test-failures.sh - name: Upload failed tests' directories if: failure() && env.FAILED_TEST_ARTIFACTS != '' - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: failed-tests-windows path: ${{env.FAILED_TEST_ARTIFACTS}} @@ -218,6 +239,9 @@ jobs: name: ${{matrix.vector.jobname}} (${{matrix.vector.pool}}) needs: ci-config if: needs.ci-config.outputs.enabled == 'yes' + concurrency: + group: ${{ matrix.vector.jobname }}-${{ matrix.vector.pool }}-${{ github.ref }} + cancel-in-progress: ${{ needs.ci-config.outputs.skip_concurrent == 'yes' }} strategy: fail-fast: false matrix: @@ -227,24 +251,22 @@ jobs: pool: ubuntu-latest - jobname: linux-sha256 cc: clang - os: ubuntu pool: ubuntu-latest - jobname: linux-gcc cc: gcc cc_package: gcc-8 - pool: ubuntu-latest + pool: ubuntu-20.04 - jobname: linux-TEST-vars cc: gcc - os: ubuntu cc_package: gcc-8 - pool: ubuntu-latest + pool: ubuntu-20.04 - jobname: osx-clang cc: clang - pool: macos-latest + pool: macos-12 - jobname: osx-gcc cc: gcc cc_package: gcc-9 - pool: macos-latest + pool: macos-12 - jobname: linux-gcc-default cc: gcc pool: ubuntu-latest @@ -264,16 +286,14 @@ jobs: runs_on_pool: ${{matrix.vector.pool}} runs-on: ${{matrix.vector.pool}} steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - run: ci/install-dependencies.sh - run: ci/run-build-and-tests.sh - - name: print test failures + - run: ci/print-test-failures.sh if: failure() && env.FAILED_TEST_ARTIFACTS != '' - shell: bash - run: ci/print-test-failures.sh - name: Upload failed tests' directories if: failure() && env.FAILED_TEST_ARTIFACTS != '' - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: failed-tests-${{matrix.vector.jobname}} path: ${{env.FAILED_TEST_ARTIFACTS}} @@ -281,6 +301,9 @@ jobs: name: ${{matrix.vector.jobname}} (${{matrix.vector.image}}) needs: ci-config if: needs.ci-config.outputs.enabled == 'yes' + concurrency: + group: dockerized-${{ matrix.vector.jobname }}-${{ matrix.vector.image }}-${{ github.ref }} + cancel-in-progress: ${{ needs.ci-config.outputs.skip_concurrent == 'yes' }} strategy: fail-fast: false matrix: @@ -288,7 +311,6 @@ jobs: - jobname: linux-musl image: alpine - jobname: linux32 - os: ubuntu32 image: daald/ubuntu32:xenial - jobname: pedantic image: fedora @@ -297,15 +319,22 @@ jobs: runs-on: ubuntu-latest container: ${{matrix.vector.image}} steps: + - uses: actions/checkout@v3 + if: matrix.vector.jobname != 'linux32' - uses: actions/checkout@v1 + if: matrix.vector.jobname == 'linux32' - run: ci/install-docker-dependencies.sh - run: ci/run-build-and-tests.sh - - name: print test failures + - run: ci/print-test-failures.sh if: failure() && env.FAILED_TEST_ARTIFACTS != '' - shell: bash - run: ci/print-test-failures.sh - name: Upload failed tests' directories - if: failure() && env.FAILED_TEST_ARTIFACTS != '' + if: failure() && env.FAILED_TEST_ARTIFACTS != '' && matrix.vector.jobname != 'linux32' + uses: actions/upload-artifact@v3 + with: + name: failed-tests-${{matrix.vector.jobname}} + path: ${{env.FAILED_TEST_ARTIFACTS}} + - name: Upload failed tests' directories + if: failure() && env.FAILED_TEST_ARTIFACTS != '' && matrix.vector.jobname == 'linux32' uses: actions/upload-artifact@v1 with: name: failed-tests-${{matrix.vector.jobname}} @@ -316,8 +345,11 @@ jobs: env: jobname: StaticAnalysis runs-on: ubuntu-22.04 + concurrency: + group: static-analysis-${{ github.ref }} + cancel-in-progress: ${{ needs.ci-config.outputs.skip_concurrent == 'yes' }} steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - run: ci/install-dependencies.sh - run: ci/run-static-analysis.sh - run: ci/check-directional-formatting.bash @@ -327,6 +359,9 @@ jobs: env: jobname: sparse runs-on: ubuntu-20.04 + concurrency: + group: sparse-${{ github.ref }} + cancel-in-progress: ${{ needs.ci-config.outputs.skip_concurrent == 'yes' }} steps: - name: Download a current `sparse` package # Ubuntu's `sparse` version is too old for us @@ -337,7 +372,7 @@ jobs: artifact: sparse-20.04 - name: Install the current `sparse` package run: sudo dpkg -i sparse-20.04/sparse_*.deb - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Install other dependencies run: ci/install-dependencies.sh - run: make sparse @@ -345,10 +380,13 @@ jobs: name: documentation needs: ci-config if: needs.ci-config.outputs.enabled == 'yes' + concurrency: + group: documentation-${{ github.ref }} + cancel-in-progress: ${{ needs.ci-config.outputs.skip_concurrent == 'yes' }} env: jobname: Documentation runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - run: ci/install-dependencies.sh - run: ci/test-documentation.sh diff --git a/.gitignore b/.gitignore index cb0231fb40..0832f1da77 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,7 @@ /GIT-PERL-HEADER /GIT-PYTHON-VARS /GIT-SCRIPT-DEFINES +/GIT-SPATCH-DEFINES /GIT-USER-AGENT /GIT-VERSION-FILE /bin-wrappers/ @@ -165,6 +165,7 @@ Mark Rada <marada@uwaterloo.ca> Martin Langhoff <martin@laptop.org> <martin@catalyst.net.nz> Martin von Zweigbergk <martinvonz@gmail.com> <martin.von.zweigbergk@gmail.com> Masaya Suzuki <masayasuzuki@google.com> <draftcode@gmail.com> +Matheus Tavares <matheus.tavb@gmail.com> <matheus.bernardino@usp.br> Matt Draisey <matt@draisey.ca> <mattdraisey@sympatico.ca> Matt Kraai <kraai@ftbfs.org> <matt.kraai@amo.abbott.com> Matt McCutchen <matt@mattmccutchen.net> <hashproduct@gmail.com> diff --git a/Documentation/Makefile b/Documentation/Makefile index 5e1a7f655c..9c67c3a1c5 100644 --- a/Documentation/Makefile +++ b/Documentation/Makefile @@ -351,8 +351,16 @@ $(OBSOLETE_HTML): %.html : %.txto $(ASCIIDOC_DEPS) manpage-base-url.xsl: manpage-base-url.xsl.in $(QUIET_GEN)sed "s|@@MAN_BASE_URL@@|$(MAN_BASE_URL)|" $< > $@ -%.1 %.5 %.7 : %.xml manpage-base-url.xsl $(wildcard manpage*.xsl) - $(QUIET_XMLTO)$(XMLTO) -m $(MANPAGE_XSL) $(XMLTO_EXTRA) man $< + +manpage-prereqs := manpage-base-url.xsl $(wildcard manpage*.xsl) +manpage-cmd = $(QUIET_XMLTO)$(XMLTO) -m $(MANPAGE_XSL) $(XMLTO_EXTRA) man $< + +%.1 : %.xml $(manpage-prereqs) + $(manpage-cmd) +%.5 : %.xml $(manpage-prereqs) + $(manpage-cmd) +%.7 : %.xml $(manpage-prereqs) + $(manpage-cmd) %.xml : %.txt $(ASCIIDOC_DEPS) $(QUIET_ASCIIDOC)$(TXT_TO_XML) -d manpage -o $@ $< diff --git a/Documentation/MyFirstContribution.txt b/Documentation/MyFirstContribution.txt index 1a4be8ee0a..ccfd0cb5f3 100644 --- a/Documentation/MyFirstContribution.txt +++ b/Documentation/MyFirstContribution.txt @@ -736,7 +736,7 @@ the {lore}[Git mailing list archive]: 2022-02-21 1:43 ` John Cai 2022-02-21 1:50 ` Taylor Blau 2022-02-23 19:50 ` John Cai -2022-02-18 20:00 ` // other replies ellided +2022-02-18 20:00 ` // other replies elided 2022-02-18 18:40 ` [PATCH 2/3] reflog: call reflog_delete from reflog.c John Cai via GitGitGadget 2022-02-18 19:15 ` Ævar Arnfjörð Bjarmason 2022-02-18 20:26 ` Junio C Hamano diff --git a/Documentation/RelNotes/2.30.7.txt b/Documentation/RelNotes/2.30.7.txt new file mode 100644 index 0000000000..285beed232 --- /dev/null +++ b/Documentation/RelNotes/2.30.7.txt @@ -0,0 +1,86 @@ +Git v2.30.7 Release Notes +========================= + +This release addresses the security issues CVE-2022-41903 and +CVE-2022-23521. + + +Fixes since v2.30.6 +------------------- + + * CVE-2022-41903: + + git log has the ability to display commits using an arbitrary + format with its --format specifiers. This functionality is also + exposed to git archive via the export-subst gitattribute. + + When processing the padding operators (e.g., %<(, %<|(, %>(, + %>>(, or %><( ), an integer overflow can occur in + pretty.c::format_and_pad_commit() where a size_t is improperly + stored as an int, and then added as an offset to a subsequent + memcpy() call. + + This overflow can be triggered directly by a user running a + command which invokes the commit formatting machinery (e.g., git + log --format=...). It may also be triggered indirectly through + git archive via the export-subst mechanism, which expands format + specifiers inside of files within the repository during a git + archive. + + This integer overflow can result in arbitrary heap writes, which + may result in remote code execution. + +* CVE-2022-23521: + + gitattributes are a mechanism to allow defining attributes for + paths. These attributes can be defined by adding a `.gitattributes` + file to the repository, which contains a set of file patterns and + the attributes that should be set for paths matching this pattern. + + When parsing gitattributes, multiple integer overflows can occur + when there is a huge number of path patterns, a huge number of + attributes for a single pattern, or when the declared attribute + names are huge. + + These overflows can be triggered via a crafted `.gitattributes` file + that may be part of the commit history. Git silently splits lines + longer than 2KB when parsing gitattributes from a file, but not when + parsing them from the index. Consequentially, the failure mode + depends on whether the file exists in the working tree, the index or + both. + + This integer overflow can result in arbitrary heap reads and writes, + which may result in remote code execution. + +Credit for finding CVE-2022-41903 goes to Joern Schneeweisz of GitLab. +An initial fix was authored by Markus Vervier of X41 D-Sec. Credit for +finding CVE-2022-23521 goes to Markus Vervier and Eric Sesterhenn of X41 +D-Sec. This work was sponsored by OSTIF. + +The proposed fixes have been polished and extended to cover additional +findings by Patrick Steinhardt of GitLab, with help from others on the +Git security mailing list. + +Patrick Steinhardt (21): + attr: fix overflow when upserting attribute with overly long name + attr: fix out-of-bounds read with huge attribute names + attr: fix integer overflow when parsing huge attribute names + attr: fix out-of-bounds write when parsing huge number of attributes + attr: fix out-of-bounds read with unreasonable amount of patterns + attr: fix integer overflow with more than INT_MAX macros + attr: harden allocation against integer overflows + attr: fix silently splitting up lines longer than 2048 bytes + attr: ignore attribute lines exceeding 2048 bytes + attr: ignore overly large gitattributes files + pretty: fix out-of-bounds write caused by integer overflow + pretty: fix out-of-bounds read when left-flushing with stealing + pretty: fix out-of-bounds read when parsing invalid padding format + pretty: fix adding linefeed when placeholder is not expanded + pretty: fix integer overflow in wrapping format + utf8: fix truncated string lengths in `utf8_strnwidth()` + utf8: fix returning negative string width + utf8: fix overflow when returning string width + utf8: fix checking for glyph width in `strbuf_utf8_replace()` + utf8: refactor `strbuf_utf8_replace` to not rely on preallocated buffer + pretty: restrict input lengths for padding and wrapping formats + diff --git a/Documentation/RelNotes/2.30.8.txt b/Documentation/RelNotes/2.30.8.txt new file mode 100644 index 0000000000..38c23e0345 --- /dev/null +++ b/Documentation/RelNotes/2.30.8.txt @@ -0,0 +1,52 @@ +Git v2.30.8 Release Notes +========================= + +This release addresses the security issues CVE-2023-22490 and +CVE-2023-23946. + + +Fixes since v2.30.7 +------------------- + + * CVE-2023-22490: + + Using a specially-crafted repository, Git can be tricked into using + its local clone optimization even when using a non-local transport. + Though Git will abort local clones whose source $GIT_DIR/objects + directory contains symbolic links (c.f., CVE-2022-39253), the objects + directory itself may still be a symbolic link. + + These two may be combined to include arbitrary files based on known + paths on the victim's filesystem within the malicious repository's + working copy, allowing for data exfiltration in a similar manner as + CVE-2022-39253. + + * CVE-2023-23946: + + By feeding a crafted input to "git apply", a path outside the + working tree can be overwritten as the user who is running "git + apply". + + * A mismatched type in `attr.c::read_attr_from_index()` which could + cause Git to errantly reject attributes on Windows and 32-bit Linux + has been corrected. + +Credit for finding CVE-2023-22490 goes to yvvdwf, and the fix was +developed by Taylor Blau, with additional help from others on the +Git security mailing list. + +Credit for finding CVE-2023-23946 goes to Joern Schneeweisz, and the +fix was developed by Patrick Steinhardt. + + +Johannes Schindelin (1): + attr: adjust a mismatched data type + +Patrick Steinhardt (1): + apply: fix writing behind newly created symbolic links + +Taylor Blau (3): + t5619: demonstrate clone_local() with ambiguous transport + clone: delay picking a transport until after get_repo_path() + dir-iterator: prevent top-level symlinks without FOLLOW_SYMLINKS + diff --git a/Documentation/RelNotes/2.30.9.txt b/Documentation/RelNotes/2.30.9.txt new file mode 100644 index 0000000000..708d626ce6 --- /dev/null +++ b/Documentation/RelNotes/2.30.9.txt @@ -0,0 +1,43 @@ +Git v2.30.9 Release Notes +========================= + +This release addresses the security issues CVE-2023-25652, +CVE-2023-25815, and CVE-2023-29007. + + +Fixes since v2.30.8 +------------------- + + * CVE-2023-25652: + + By feeding specially crafted input to `git apply --reject`, a + path outside the working tree can be overwritten with partially + controlled contents (corresponding to the rejected hunk(s) from + the given patch). + + * CVE-2023-25815: + + When Git is compiled with runtime prefix support and runs without + translated messages, it still used the gettext machinery to + display messages, which subsequently potentially looked for + translated messages in unexpected places. This allowed for + malicious placement of crafted messages. + + * CVE-2023-29007: + + When renaming or deleting a section from a configuration file, + certain malicious configuration values may be misinterpreted as + the beginning of a new configuration section, leading to arbitrary + configuration injection. + +Credit for finding CVE-2023-25652 goes to Ry0taK, and the fix was +developed by Taylor Blau, Junio C Hamano and Johannes Schindelin, +with the help of Linus Torvalds. + +Credit for finding CVE-2023-25815 goes to Maxime Escourbiac and +Yassine BENGANA of Michelin, and the fix was developed by Johannes +Schindelin. + +Credit for finding CVE-2023-29007 goes to André Baptista and VÃtor Pinho +of Ethiack, and the fix was developed by Taylor Blau, and Johannes +Schindelin, with help from Jeff King, and Patrick Steinhardt. diff --git a/Documentation/RelNotes/2.31.6.txt b/Documentation/RelNotes/2.31.6.txt new file mode 100644 index 0000000000..425a51875a --- /dev/null +++ b/Documentation/RelNotes/2.31.6.txt @@ -0,0 +1,5 @@ +Git v2.31.6 Release Notes +========================= + +This release merges the security fix that appears in v2.30.7; see +the release notes for that version for details. diff --git a/Documentation/RelNotes/2.31.7.txt b/Documentation/RelNotes/2.31.7.txt new file mode 100644 index 0000000000..dd44d5bc62 --- /dev/null +++ b/Documentation/RelNotes/2.31.7.txt @@ -0,0 +1,6 @@ +Git v2.31.7 Release Notes +========================= + +This release merges up the fixes that appear in v2.30.8 to +address the security issues CVE-2023-22490 and CVE-2023-23946; +see the release notes for that version for details. diff --git a/Documentation/RelNotes/2.31.8.txt b/Documentation/RelNotes/2.31.8.txt new file mode 100644 index 0000000000..0aa3080780 --- /dev/null +++ b/Documentation/RelNotes/2.31.8.txt @@ -0,0 +1,6 @@ +Git v2.31.8 Release Notes +========================= + +This release merges the fixes that appear in v2.30.9 to address the +security issues CVE-2023-25652, CVE-2023-25815, and CVE-2023-29007; +see the release notes for that version for details. diff --git a/Documentation/RelNotes/2.32.5.txt b/Documentation/RelNotes/2.32.5.txt new file mode 100644 index 0000000000..a8cad1a05b --- /dev/null +++ b/Documentation/RelNotes/2.32.5.txt @@ -0,0 +1,8 @@ +Git v2.32.5 Release Notes +========================= + +This release merges the security fix that appears in v2.30.7; see +the release notes for that version for details. + +In addition, included are additional code for "git fsck" to check +for questionable .gitattributes files. diff --git a/Documentation/RelNotes/2.32.6.txt b/Documentation/RelNotes/2.32.6.txt new file mode 100644 index 0000000000..fd659612e3 --- /dev/null +++ b/Documentation/RelNotes/2.32.6.txt @@ -0,0 +1,6 @@ +Git v2.32.6 Release Notes +========================= + +This release merges up the fixes that appear in v2.30.8 and v2.31.7 +to address the security issues CVE-2023-22490 and CVE-2023-23946; +see the release notes for these versions for details. diff --git a/Documentation/RelNotes/2.32.7.txt b/Documentation/RelNotes/2.32.7.txt new file mode 100644 index 0000000000..7bb35388b5 --- /dev/null +++ b/Documentation/RelNotes/2.32.7.txt @@ -0,0 +1,7 @@ +Git v2.32.7 Release Notes +========================= + +This release merges the fixes that appear in v2.30.9 and v2.31.8 to +address the security issues CVE-2023-25652, CVE-2023-25815, and +CVE-2023-29007; see the release notes for these versions for +details. diff --git a/Documentation/RelNotes/2.33.6.txt b/Documentation/RelNotes/2.33.6.txt new file mode 100644 index 0000000000..b63e4e6256 --- /dev/null +++ b/Documentation/RelNotes/2.33.6.txt @@ -0,0 +1,5 @@ +Git v2.33.6 Release Notes +========================= + +This release merges the security fix that appears in v2.30.7; see +the release notes for that version for details. diff --git a/Documentation/RelNotes/2.33.7.txt b/Documentation/RelNotes/2.33.7.txt new file mode 100644 index 0000000000..078a837cb4 --- /dev/null +++ b/Documentation/RelNotes/2.33.7.txt @@ -0,0 +1,7 @@ +Git v2.33.7 Release Notes +========================= + +This release merges up the fixes that appear in v2.30.8, v2.31.7 +and v2.32.6 to address the security issues CVE-2023-22490 and +CVE-2023-23946; see the release notes for these versions for +details. diff --git a/Documentation/RelNotes/2.33.8.txt b/Documentation/RelNotes/2.33.8.txt new file mode 100644 index 0000000000..d8cf4c7f3a --- /dev/null +++ b/Documentation/RelNotes/2.33.8.txt @@ -0,0 +1,7 @@ +Git v2.33.8 Release Notes +========================= + +This release merges the fixes that appear in v2.30.9, v2.31.8 and +v2.32.7 to address the security issues CVE-2023-25652, +CVE-2023-25815, and CVE-2023-29007; see the release notes for these +versions for details. diff --git a/Documentation/RelNotes/2.34.6.txt b/Documentation/RelNotes/2.34.6.txt new file mode 100644 index 0000000000..b32080dba8 --- /dev/null +++ b/Documentation/RelNotes/2.34.6.txt @@ -0,0 +1,5 @@ +Git v2.34.6 Release Notes +========================= + +This release merges the security fix that appears in v2.30.7; see +the release notes for that version for details. diff --git a/Documentation/RelNotes/2.34.7.txt b/Documentation/RelNotes/2.34.7.txt new file mode 100644 index 0000000000..88898adacc --- /dev/null +++ b/Documentation/RelNotes/2.34.7.txt @@ -0,0 +1,7 @@ +Git v2.34.7 Release Notes +========================= + +This release merges up the fixes that appear in v2.30.8, v2.31.7, +v2.32.6 and v2.33.7 to address the security issues CVE-2023-22490 +and CVE-2023-23946; see the release notes for these versions +for details. diff --git a/Documentation/RelNotes/2.34.8.txt b/Documentation/RelNotes/2.34.8.txt new file mode 100644 index 0000000000..2b5bd7d9a3 --- /dev/null +++ b/Documentation/RelNotes/2.34.8.txt @@ -0,0 +1,7 @@ +Git v2.34.8 Release Notes +========================= + +This release merges the fixes that appear in v2.30.9, v2.31.8, +v2.32.7 and v2.33.8 to address the security issues CVE-2023-25652, +CVE-2023-25815, and CVE-2023-29007; see the release notes for these +versions for details. diff --git a/Documentation/RelNotes/2.35.6.txt b/Documentation/RelNotes/2.35.6.txt new file mode 100644 index 0000000000..e7ca57bb41 --- /dev/null +++ b/Documentation/RelNotes/2.35.6.txt @@ -0,0 +1,5 @@ +Git v2.35.6 Release Notes +========================= + +This release merges the security fix that appears in v2.30.7; see +the release notes for that version for details. diff --git a/Documentation/RelNotes/2.35.7.txt b/Documentation/RelNotes/2.35.7.txt new file mode 100644 index 0000000000..42baabfc3b --- /dev/null +++ b/Documentation/RelNotes/2.35.7.txt @@ -0,0 +1,7 @@ +Git v2.35.7 Release Notes +========================= + +This release merges up the fixes that appear in v2.30.8, v2.31.7, +v2.32.6, v2.33.7 and v2.34.7 to address the security issues +CVE-2023-22490 and CVE-2023-23946; see the release notes for +these versions for details. diff --git a/Documentation/RelNotes/2.35.8.txt b/Documentation/RelNotes/2.35.8.txt new file mode 100644 index 0000000000..3c9c094c2b --- /dev/null +++ b/Documentation/RelNotes/2.35.8.txt @@ -0,0 +1,7 @@ +Git v2.35.8 Release Notes +========================= + +This release merges the fixes that appear in v2.30.9, v2.31.8, +v2.32.7, v2.33.8 and v2.34.8 to address the security issues +CVE-2023-25652, CVE-2023-25815, and CVE-2023-29007; see the release +notes for these versions for details. diff --git a/Documentation/RelNotes/2.36.4.txt b/Documentation/RelNotes/2.36.4.txt new file mode 100644 index 0000000000..58fb93a35f --- /dev/null +++ b/Documentation/RelNotes/2.36.4.txt @@ -0,0 +1,5 @@ +Git v2.36.4 Release Notes +========================= + +This release merges the security fix that appears in v2.30.7; see +the release notes for that version for details. diff --git a/Documentation/RelNotes/2.36.5.txt b/Documentation/RelNotes/2.36.5.txt new file mode 100644 index 0000000000..8a098c7916 --- /dev/null +++ b/Documentation/RelNotes/2.36.5.txt @@ -0,0 +1,7 @@ +Git v2.36.5 Release Notes +========================= + +This release merges up the fixes that appear in v2.30.8, v2.31.7, +v2.32.6, v2.33.7, v2.34.7 and v2.35.7 to address the security +issues CVE-2023-22490 and CVE-2023-23946; see the release notes +for these versions for details. diff --git a/Documentation/RelNotes/2.36.6.txt b/Documentation/RelNotes/2.36.6.txt new file mode 100644 index 0000000000..e1edebcc43 --- /dev/null +++ b/Documentation/RelNotes/2.36.6.txt @@ -0,0 +1,7 @@ +Git v2.36.6 Release Notes +========================= + +This release merges the fixes that appear in v2.30.9, v2.31.8, +v2.32.7, v2.33.8, v2.34.8 and v2.35.8 to address the security issues +CVE-2023-25652, CVS-2023-25815, and CVE-2023-29007; see the release +notes for these versions for details. diff --git a/Documentation/RelNotes/2.37.5.txt b/Documentation/RelNotes/2.37.5.txt new file mode 100644 index 0000000000..faa1447292 --- /dev/null +++ b/Documentation/RelNotes/2.37.5.txt @@ -0,0 +1,5 @@ +Git v2.37.5 Release Notes +========================= + +This release merges the security fix that appears in v2.30.7; see +the release notes for that version for details. diff --git a/Documentation/RelNotes/2.37.6.txt b/Documentation/RelNotes/2.37.6.txt new file mode 100644 index 0000000000..51dc149711 --- /dev/null +++ b/Documentation/RelNotes/2.37.6.txt @@ -0,0 +1,7 @@ +Git v2.37.6 Release Notes +========================= + +This release merges up the fixes that appear in v2.30.8, v2.31.7, +v2.32.6, v2.33.7, v2.34.7, v2.35.7 and v2.36.5 to address the +security issues CVE-2023-22490 and CVE-2023-23946; see the release +notes for these versions for details. diff --git a/Documentation/RelNotes/2.37.7.txt b/Documentation/RelNotes/2.37.7.txt new file mode 100644 index 0000000000..4b8165f4b5 --- /dev/null +++ b/Documentation/RelNotes/2.37.7.txt @@ -0,0 +1,7 @@ +Git v2.37.7 Release Notes +========================= + +This release merges up the fix that appears in v2.30.9, v2.31.8, +v2.32.7, v2.33.8, v2.34.8, v2.35.8 and v2.36.6 to address the +security issues CVE-2023-25652, CVE-2023-25815, and CVE-2023-29007; +see the release notes for these versions for details. diff --git a/Documentation/RelNotes/2.38.2.txt b/Documentation/RelNotes/2.38.2.txt index 086b900f6c..92acb62bbb 100644 --- a/Documentation/RelNotes/2.38.2.txt +++ b/Documentation/RelNotes/2.38.2.txt @@ -57,4 +57,11 @@ Fixes since v2.38.1 * "git branch --edit-description" on an unborh branch misleadingly said that no such branch exists, which has been corrected. + * GitHub CI settings have been adjusted to recent reality, merging + and cherry-picking necessary topics that have been prepared for Git + 2.39. + + * `git rebase --update-refs` would delete references when all `update-ref` + commands in the sequencer were removed, which has been corrected. + Also contains various documentation updates and code clean-ups. diff --git a/Documentation/RelNotes/2.38.3.txt b/Documentation/RelNotes/2.38.3.txt new file mode 100644 index 0000000000..4a46bb4300 --- /dev/null +++ b/Documentation/RelNotes/2.38.3.txt @@ -0,0 +1,5 @@ +Git v2.38.3 Release Notes +========================= + +This release merges the security fix that appears in v2.30.7; see +the release notes for that version for details. diff --git a/Documentation/RelNotes/2.38.4.txt b/Documentation/RelNotes/2.38.4.txt new file mode 100644 index 0000000000..fdfde22022 --- /dev/null +++ b/Documentation/RelNotes/2.38.4.txt @@ -0,0 +1,7 @@ +Git v2.38.4 Release Notes +========================= + +This release merges up the fixes that appear in v2.30.8, v2.31.7, +v2.32.6, v2.33.7, v2.34.7, v2.35.7, v2.36.5 and v2.37.6 to +address the security issues CVE-2023-22490 and CVE-2023-23946; +see the release notes for these versions for details. diff --git a/Documentation/RelNotes/2.38.5.txt b/Documentation/RelNotes/2.38.5.txt new file mode 100644 index 0000000000..2d1f3b1249 --- /dev/null +++ b/Documentation/RelNotes/2.38.5.txt @@ -0,0 +1,8 @@ +Git v2.38.5 Release Notes +========================= + +This release merges up the fix that appears in v2.30.9, v2.31.8, +v2.32.7, v2.33.8, v2.34.8, v2.35.8, v2.36.6 and v2.37.7 to address +the security issues CVE-2023-25652, CVE-2023-25815, and +CVE-2023-29007; see the release notes for these versions for +details. diff --git a/Documentation/RelNotes/2.39.0.txt b/Documentation/RelNotes/2.39.0.txt index f21f949475..9bf00ece53 100644 --- a/Documentation/RelNotes/2.39.0.txt +++ b/Documentation/RelNotes/2.39.0.txt @@ -32,6 +32,32 @@ UI, Workflows & Features * Enable gc.cruftpacks by default for those who opt into feature.experimental setting. + * "git repack" learns to send cruft objects out of the way into + packfiles outside the repository. + + * 'scalar reconfigure -a' is taught to automatically remove + scalar.repo entires which no longer exist. + + * Redact headers from cURL's h2h3 module in GIT_CURL_VERBOSE and + others. + + * 'git maintenance register' is taught to write configuration to an + arbitrary path, and 'git for-each-repo' is taught to expand tilde + characters in paths. + + * When creating new notes, the template used to get a stray empty + newline, which has been removed. + + * "git receive-pack" used to use all the local refs as the boundary for + checking connectivity of the data "git push" sent, but now it uses + only the refs that it advertised to the pusher. In a repository with + the .hideRefs configuration, this reduces the resources needed to + perform the check. + + * With '--recurse-submodules=on-demand', all submodules are + recursively pushed. + + Performance, Internal Implementation, Development Support etc. -------------------------------------------------------------- @@ -98,6 +124,43 @@ Performance, Internal Implementation, Development Support etc. * Simplify the run-command API. + * Update the actions/github-script dependency in CI to avoid a + deprecation warning. + + * Progress on being able to initialize a rev_info struct with a + macro. + + * Add trace2 counters to the region to clear skip worktree bits in a + sparse checkout. + + * Modernize test script to avoid "test -f" and friends. + + * Avoid calling 'cache_tree_update()' when doing so would be + redundant. + + * Update the credential-cache documentation to provide a more + realistic example. + + * Makefile comments updates and reordering to clarify knobs used to + choose SHA implementations. + + * A design document for sparse-checkout's future directions has been + added. + + * Teach chainlint.pl to annotate the original test definition instead + of the token stream. + + * "make coccicheck" is time consuming. It has been made to run more + incrementally. + + * `parse_object()` has been hardened to check for the existence of a + suspected blob object. + + * The build procedure has been adjusted to GNUmake version 4.4, which + made some changes to how pattern rule with multiple targets are + handled. + + Fixes since v2.38 ----------------- @@ -151,7 +214,7 @@ Fixes since v2.38 * Clarify that "the sentence after <area>: prefix does not begin with a capital letter" rule applies only to the commit title. - * "git branch --edit-description" on an unborh branch misleadingly + * "git branch --edit-description" on an unborn branch misleadingly said that no such branch exists, which has been corrected. * Work around older clang that warns against C99 zero initialization @@ -226,7 +289,7 @@ Fixes since v2.38 option now implies --reapply-cherry-picks and --no-fork-point options. - * The way "git repack" creared temporary files when it received a + * The way "git repack" created temporary files when it received a signal was prone to deadlocking, which has been corrected. * Various tests exercising the transfer.credentialsInUrl @@ -239,6 +302,45 @@ Fixes since v2.38 * "git archive" mistakenly complained twice about a missing executable, which has been corrected. + * Fix a bug where `git branch -d` did not work on an orphaned HEAD. + + * `git rebase --update-refs` would delete references when all + `update-ref` commands in the sequencer were removed, which has been + corrected. + + * Fix a regression in the bisect-helper which mistakenly treats + arguments to the command given to 'git bisect run' as arguments to + the helper. + + * Correct an error where `git rebase` would mistakenly use a branch or + tag named "refs/rewritten/xyz" when missing a rebase label. + + * Assorted fixes of parsing end-user input as integers. + (merge 14770cf0de pw/config-int-parse-fixes later to maint). + + * "git prune" may try to iterate over .git/objects/pack for trash + files to remove in it, and loudly fail when the directory is + missing, which is not necessary. The command has been taught to + ignore such a failure. + (merge 6974765352 ew/prune-with-missing-objects-pack later to maint). + + * Add one more candidate directory that may house httpd modules while + running tests. + (merge 1c7dc23d41 es/locate-httpd-module-location-in-test later to maint). + + * A handful of leaks in the line-log machinery have been plugged. + + * The format of a line in /proc/cpuinfo that describes a CPU on s390x + looked different from everybody else, and the code in chainlint.pl + failed to parse it. + (merge 1f51b77f4f ah/chainlint-cpuinfo-parse-fix later to maint). + + * Adjust the GitHub CI to newer ubuntu release. + (merge 0d3507f3e7 jx/ci-ubuntu-fix later to maint). + * Other code cleanup, docfix, build fix, etc. (merge 413bc6d20a ds/cmd-main-reorder later to maint). (merge 8d2863e4ed nw/t1002-cleanup later to maint). + (merge 7c2dc122f9 rs/list-objects-filter-leakfix later to maint). + (merge 288fcb1c94 zk/push-use-bitmaps later to maint). + (merge 42db324c0f km/merge-recursive-typofix later to maint). diff --git a/Documentation/RelNotes/2.39.1.txt b/Documentation/RelNotes/2.39.1.txt new file mode 100644 index 0000000000..60c86f4122 --- /dev/null +++ b/Documentation/RelNotes/2.39.1.txt @@ -0,0 +1,5 @@ +Git v2.39.1 Release Notes +========================= + +This release merges the security fix that appears in v2.30.7; see +the release notes for that version for details. diff --git a/Documentation/RelNotes/2.39.2.txt b/Documentation/RelNotes/2.39.2.txt new file mode 100644 index 0000000000..ebb9900bc5 --- /dev/null +++ b/Documentation/RelNotes/2.39.2.txt @@ -0,0 +1,7 @@ +Git v2.39.2 Release Notes +========================= + +This release merges up the fixes that appear in v2.30.8, v2.31.7, +v2.32.6, v2.33.7, v2.34.7, v2.35.7, v2.36.5, v2.37.6 and v2.38.4 +to address the security issues CVE-2023-22490 and CVE-2023-23946; +see the release notes for these versions for details. diff --git a/Documentation/RelNotes/2.39.3.txt b/Documentation/RelNotes/2.39.3.txt new file mode 100644 index 0000000000..66351b65c2 --- /dev/null +++ b/Documentation/RelNotes/2.39.3.txt @@ -0,0 +1,64 @@ +Git v2.39.3 Release Notes +========================= + +This release merges up the fix that appears in v2.30.9, v2.31.8, +v2.32.7, v2.33.8, v2.34.8, v2.35.8, v2.36.6, v2.37.7 and v2.38.5 to +address the security issues CVE-2023-25652, CVE-2023-25815, and +CVE-2023-29007; see the release notes for these versions for +details. + +This release also merges fixes that have accumulated on the 'master' +front to prepare for the 2.40 release that are still relevant to +2.39.x maintenance track. + +Fixes since v2.39.2 +------------------- + + * Stop running win+VS build by default. + + * CI updates. We probably want a clean-up to move the long shell + script embedded in yaml file into a separate file, but that can + come later. + + * Avoid unnecessary builds in CI, with settings configured in + ci-config. + + * Redefining system functions for a few functions did not follow our + usual "implement git_foo() and #define foo(args) git_foo(args)" + pattern, which has broken build for some folks. + + * Deal with a few deprecation warning from cURL library. + + * Newer regex library macOS stopped enabling GNU-like enhanced BRE, + where '\(A\|B\)' works as alternation, unless explicitly asked with + the REG_ENHANCED flag. "git grep" now can be compiled to do so, to + retain the old behaviour. + + * When given a pattern that matches an empty string at the end of a + line, the code to parse the "git diff" line-ranges fell into an + infinite loop, which has been corrected. + + * Fix the sequence to fsync $GIT_DIR/packed-refs file that forgot to + flush its output to the disk.. + + * "git diff --relative" did not mix well with "git diff --ext-diff", + which has been corrected. + + * The logic to see if we are using the "cone" mode by checking the + sparsity patterns has been tightened to avoid mistaking a pattern + that names a single file as specifying a cone. + + * Doc update for environment variables set when hooks are invoked. + + * Document ORIG_HEAD a bit more. + + * "git ls-tree --format='%(path) %(path)' $tree $path" showed the + path three times, which has been corrected. + + * Document that "branch -f <branch>" disables only the safety to + avoid recreating an existing branch. + + * Clarify how "checkout -b/-B" and "git branch [-f]" are similar but + different in the documentation. + +Also contains minor documentation updates and code clean-ups. diff --git a/Documentation/config/push.txt b/Documentation/config/push.txt index 7386fea225..43338b65e8 100644 --- a/Documentation/config/push.txt +++ b/Documentation/config/push.txt @@ -110,18 +110,8 @@ This will result in only b (a and c are cleared). ---- push.recurseSubmodules:: - Make sure all submodule commits used by the revisions to be pushed - are available on a remote-tracking branch. If the value is 'check' - then Git will verify that all submodule commits that changed in the - revisions to be pushed are available on at least one remote of the - submodule. If any commits are missing, the push will be aborted and - exit with non-zero status. If the value is 'on-demand' then all - submodules that changed in the revisions to be pushed will be - pushed. If on-demand was not able to push all necessary revisions - it will also be aborted and exit with non-zero status. If the value - is 'no' then default behavior of ignoring submodules when pushing - is retained. You may override this configuration at time of push by - specifying '--recurse-submodules=check|on-demand|no'. + May be "check", "on-demand", "only", or "no", with the same behavior + as that of "push --recurse-submodules". If not set, 'no' is used by default, unless 'submodule.recurse' is set (in which case a 'true' value means 'on-demand'). diff --git a/Documentation/fsck-msgids.txt b/Documentation/fsck-msgids.txt index 7af76ff99a..12eae8a222 100644 --- a/Documentation/fsck-msgids.txt +++ b/Documentation/fsck-msgids.txt @@ -46,6 +46,18 @@ `fullPathname`:: (WARN) A path contains the full path starting with "/". +`gitattributesBlob`:: + (ERROR) A non-blob found at `.gitattributes`. + +`gitattributesLarge`:: + (ERROR) The `.gitattributes` blob is too large. + +`gitattributesLineLength`:: + (ERROR) The `.gitattributes` blob contains too long lines. + +`gitattributesMissing`:: + (ERROR) Unable to read `.gitattributes` blob. + `gitattributesSymlink`:: (INFO) `.gitattributes` is a symlink. diff --git a/Documentation/git-branch.txt b/Documentation/git-branch.txt index 12c5f84e3b..2aaf13b45d 100644 --- a/Documentation/git-branch.txt +++ b/Documentation/git-branch.txt @@ -123,6 +123,10 @@ OPTIONS points to a valid commit. In combination with `-m` (or `--move`), allow renaming the branch even if the new branch name already exists, the same applies for `-c` (or `--copy`). ++ +Note that 'git branch -f <branchname> [<start-point>]', even with '-f', +refuses to change an existing branch `<branchname>` that is checked out +in another worktree linked to the same repository. -m:: --move:: diff --git a/Documentation/git-checkout.txt b/Documentation/git-checkout.txt index 4cb9d555b4..dcff44196d 100644 --- a/Documentation/git-checkout.txt +++ b/Documentation/git-checkout.txt @@ -146,14 +146,16 @@ on your side branch as `theirs` (i.e. "one contributor's work on top of it"). -b <new-branch>:: - Create a new branch named `<new-branch>` and start it at - `<start-point>`; see linkgit:git-branch[1] for details. + Create a new branch named `<new-branch>`, start it at + `<start-point>`, and check the resulting branch out; + see linkgit:git-branch[1] for details. -B <new-branch>:: - Creates the branch `<new-branch>` and start it at `<start-point>`; - if it already exists, then reset it to `<start-point>`. This is - equivalent to running "git branch" with "-f"; see - linkgit:git-branch[1] for details. + Creates the branch `<new-branch>`, start it at `<start-point>`; + if it already exists, then reset it to `<start-point>`. And then + check the resulting branch out. This is equivalent to running + "git branch" with "-f" followed by "git checkout" of that branch; + see linkgit:git-branch[1] for details. -t:: --track[=(direct|inherit)]:: diff --git a/Documentation/git-cherry-pick.txt b/Documentation/git-cherry-pick.txt index 1e8ac9df60..fdcad3d200 100644 --- a/Documentation/git-cherry-pick.txt +++ b/Documentation/git-cherry-pick.txt @@ -219,7 +219,7 @@ again, this time exercising more care about matching up context lines. ------------ $ git cherry-pick topic^ <1> $ git diff <2> -$ git reset --merge ORIG_HEAD <3> +$ git cherry-pick --abort <3> $ git cherry-pick -Xpatience topic^ <4> ------------ <1> apply the change that would be shown by `git show topic^`. diff --git a/Documentation/git-credential-cache.txt b/Documentation/git-credential-cache.txt index 0216c18ef8..432e159d95 100644 --- a/Documentation/git-credential-cache.txt +++ b/Documentation/git-credential-cache.txt @@ -69,10 +69,10 @@ $ git push http://example.com/repo.git ------------------------------------ You can provide options via the credential.helper configuration -variable (this example drops the cache time to 5 minutes): +variable (this example increases the cache time to 1 hour): ------------------------------------------------------- -$ git config credential.helper 'cache --timeout=300' +$ git config credential.helper 'cache --timeout=3600' ------------------------------------------------------- GIT diff --git a/Documentation/git-credential.txt b/Documentation/git-credential.txt index f18673017f..ac2818b9f6 100644 --- a/Documentation/git-credential.txt +++ b/Documentation/git-credential.txt @@ -160,6 +160,8 @@ empty string. Components which are missing from the URL (e.g., there is no username in the example above) will be left unset. +Unrecognised attributes are silently discarded. + GIT --- Part of the linkgit:git[1] suite diff --git a/Documentation/git-maintenance.txt b/Documentation/git-maintenance.txt index bb888690e4..805e5a2e3a 100644 --- a/Documentation/git-maintenance.txt +++ b/Documentation/git-maintenance.txt @@ -50,13 +50,13 @@ stop:: the background maintenance is restarted later. register:: - Initialize Git config values so any scheduled maintenance will - start running on this repository. This adds the repository to the - `maintenance.repo` config variable in the current user's global - config and enables some recommended configuration values for - `maintenance.<task>.schedule`. The tasks that are enabled are safe - for running in the background without disrupting foreground - processes. + Initialize Git config values so any scheduled maintenance will start + running on this repository. This adds the repository to the + `maintenance.repo` config variable in the current user's global config, + or the config specified by --config-file option, and enables some + recommended configuration values for `maintenance.<task>.schedule`. The + tasks that are enabled are safe for running in the background without + disrupting foreground processes. + The `register` subcommand will also set the `maintenance.strategy` config value to `incremental`, if this value is not previously set. The diff --git a/Documentation/git-merge.txt b/Documentation/git-merge.txt index 2d6a1391c8..0aeff572a5 100644 --- a/Documentation/git-merge.txt +++ b/Documentation/git-merge.txt @@ -37,7 +37,8 @@ Then "`git merge topic`" will replay the changes made on the `topic` branch since it diverged from `master` (i.e., `E`) until its current commit (`C`) on top of `master`, and record the result in a new commit along with the names of the two parent commits and -a log message from the user describing the changes. +a log message from the user describing the changes. Before the operation, +`ORIG_HEAD` is set to the tip of the current branch (`C`). ------------ A---B---C topic diff --git a/Documentation/git-push.txt b/Documentation/git-push.txt index def7657ef9..5bb1d5aae2 100644 --- a/Documentation/git-push.txt +++ b/Documentation/git-push.txt @@ -409,10 +409,14 @@ Specifying `--no-force-if-includes` disables this behavior. all submodules that changed in the revisions to be pushed will be pushed. If on-demand was not able to push all necessary revisions it will also be aborted and exit with non-zero status. If 'only' is used all - submodules will be recursively pushed while the superproject is left + submodules will be pushed while the superproject is left unpushed. A value of 'no' or using `--no-recurse-submodules` can be used to override the push.recurseSubmodules configuration variable when no submodule recursion is required. ++ +When using 'on-demand' or 'only', if a submodule has a +"push.recurseSubmodules={on-demand,only}" or "submodule.recurse" configuration, +further recursion will occur. In this case, "only" is treated as "on-demand". --[no-]verify:: Toggle the pre-push hook (see linkgit:githooks[5]). The diff --git a/Documentation/git-rebase.txt b/Documentation/git-rebase.txt index f9675bd24e..d811c1cf44 100644 --- a/Documentation/git-rebase.txt +++ b/Documentation/git-rebase.txt @@ -38,6 +38,13 @@ The current branch is reset to `<upstream>` or `<newbase>` if the `git reset --hard <upstream>` (or `<newbase>`). `ORIG_HEAD` is set to point at the tip of the branch before the reset. +[NOTE] +`ORIG_HEAD` is not guaranteed to still point to the previous branch tip +at the end of the rebase if other commands that write that pseudo-ref +(e.g. `git reset`) are used during the rebase. The previous branch tip, +however, is accessible using the reflog of the current branch +(i.e. `@{1}`, see linkgit:gitrevisions[7]). + The commits that were previously saved into the temporary area are then reapplied to the current branch, one by one, in order. Note that any commits in `HEAD` which introduce the same textual changes as a commit diff --git a/Documentation/git-repack.txt b/Documentation/git-repack.txt index 0bf13893d8..4017157949 100644 --- a/Documentation/git-repack.txt +++ b/Documentation/git-repack.txt @@ -74,6 +74,12 @@ to the new separate pack will be written. immediately instead of waiting for the next `git gc` invocation. Only useful with `--cruft -d`. +--expire-to=<dir>:: + Write a cruft pack containing pruned objects (if any) to the + directory `<dir>`. This option is useful for keeping a copy of + any pruned objects in a separate directory as a backup. Only + useful with `--cruft -d`. + -l:: Pass the `--local` option to 'git pack-objects'. See linkgit:git-pack-objects[1]. diff --git a/Documentation/git-reset.txt b/Documentation/git-reset.txt index 01cb4c9b9c..79ad5643ee 100644 --- a/Documentation/git-reset.txt +++ b/Documentation/git-reset.txt @@ -49,7 +49,8 @@ section of linkgit:git-add[1] to learn how to operate the `--patch` mode. 'git reset' [<mode>] [<commit>]:: This form resets the current branch head to `<commit>` and possibly updates the index (resetting it to the tree of `<commit>`) and - the working tree depending on `<mode>`. If `<mode>` is omitted, + the working tree depending on `<mode>`. Before the operation, `ORIG_HEAD` + is set to the tip of the current branch. If `<mode>` is omitted, defaults to `--mixed`. The `<mode>` must be one of the following: + -- diff --git a/Documentation/git-rev-parse.txt b/Documentation/git-rev-parse.txt index 6b8ca085aa..bcd8069287 100644 --- a/Documentation/git-rev-parse.txt +++ b/Documentation/git-rev-parse.txt @@ -197,6 +197,13 @@ respectively, and they must begin with `refs/` when applied to `--glob` or `--all`. If a trailing '/{asterisk}' is intended, it must be given explicitly. +--exclude-hidden=[receive|uploadpack]:: + Do not include refs that would be hidden by `git-receive-pack` or + `git-upload-pack` by consulting the appropriate `receive.hideRefs` or + `uploadpack.hideRefs` configuration along with `transfer.hideRefs` (see + linkgit:git-config[1]). This option affects the next pseudo-ref option + `--all` or `--glob` and is cleared after processing them. + --disambiguate=<prefix>:: Show every object whose name begins with the given prefix. The <prefix> must be at least 4 hexadecimal digits long to diff --git a/Documentation/git-revert.txt b/Documentation/git-revert.txt index 5016755efb..d2e10d3dce 100644 --- a/Documentation/git-revert.txt +++ b/Documentation/git-revert.txt @@ -8,7 +8,7 @@ git-revert - Revert some existing commits SYNOPSIS -------- [verse] -'git revert' [--[no-]edit] [-n] [-m parent-number] [-s] [-S[<keyid>]] <commit>... +'git revert' [--[no-]edit] [-n] [-m <parent-number>] [-s] [-S[<keyid>]] <commit>... 'git revert' (--continue | --skip | --abort | --quit) DESCRIPTION diff --git a/Documentation/gitcredentials.txt b/Documentation/gitcredentials.txt index 80517b4eb2..4522471c33 100644 --- a/Documentation/gitcredentials.txt +++ b/Documentation/gitcredentials.txt @@ -17,9 +17,10 @@ DESCRIPTION Git will sometimes need credentials from the user in order to perform operations; for example, it may need to ask for a username and password -in order to access a remote repository over HTTP. This manual describes -the mechanisms Git uses to request these credentials, as well as some -features to avoid inputting these credentials repeatedly. +in order to access a remote repository over HTTP. Some remotes accept +a personal access token or OAuth access token as a password. This +manual describes the mechanisms Git uses to request these credentials, +as well as some features to avoid inputting these credentials repeatedly. REQUESTING CREDENTIALS ---------------------- @@ -61,7 +62,9 @@ for a password. It is generally configured by adding this to your config: Credential helpers, on the other hand, are external programs from which Git can request both usernames and passwords; they typically interface with secure -storage provided by the OS or other programs. +storage provided by the OS or other programs. Alternatively, a +credential-generating helper might generate credentials for certain servers via +some API. To use a helper, you must first select one to use. Git currently includes the following helpers: @@ -269,6 +272,7 @@ 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's credential subsystem. +Unrecognised attributes are silently discarded. While it is possible to override all attributes, well behaving helpers should refrain from doing so for any attribute other than username and @@ -286,8 +290,8 @@ For a `store` or `erase` operation, the helper's output is ignored. 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 it does not support the requested operation (e.g., a read-only store +or generator), 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/githooks.txt b/Documentation/githooks.txt index a16e62bc8c..62908602e7 100644 --- a/Documentation/githooks.txt +++ b/Documentation/githooks.txt @@ -27,6 +27,18 @@ repository. An exception are hooks triggered during a push ('pre-receive', 'update', 'post-receive', 'post-update', 'push-to-checkout') which are always executed in $GIT_DIR. +Environment variables, such as `GIT_DIR`, `GIT_WORK_TREE`, etc., are exported +so that Git commands run by the hook can correctly locate the repository. If +your hook needs to invoke Git commands in a foreign repository or in a +different working tree of the same repository, then it should clear these +environment variables so they do not interfere with Git operations at the +foreign location. For example: + +------------ +local_desc=$(git describe) +foreign_desc=$(unset $(git rev-parse --local-env-vars); git -C ../foreign-repo describe) +------------ + Hooks can get their arguments via the environment, command-line arguments, and stdin. See the documentation for each hook below for details. diff --git a/Documentation/howto/maintain-git.txt b/Documentation/howto/maintain-git.txt index 215e2edb0f..d07c6d44e5 100644 --- a/Documentation/howto/maintain-git.txt +++ b/Documentation/howto/maintain-git.txt @@ -231,7 +231,7 @@ by doing the following: - Prepare 'jch' branch, which is used to represent somewhere between 'master' and 'seen' and often is slightly ahead of 'next'. - $ Meta/Reintegrate master..seen >Meta/redo-jch.sh + $ Meta/Reintegrate master..jch >Meta/redo-jch.sh The result is a script that lists topics to be merged in order to rebuild 'seen' as the input to Meta/Reintegrate script. Remove @@ -283,6 +283,11 @@ by doing the following: $ git diff jch next + Then build the rest of 'jch': + + $ git checkout jch + $ sh Meta/redo-jch.sh + When all is well, clean up the redo-jch.sh script with $ sh Meta/redo-jch.sh -u @@ -293,7 +298,7 @@ by doing the following: - Rebuild 'seen'. - $ Meta/Reintegrate master..seen >Meta/redo-seen.sh + $ Meta/Reintegrate jch..seen >Meta/redo-seen.sh Edit the result by adding new topics that are not still in 'seen' in the script. Then diff --git a/Documentation/rev-list-options.txt b/Documentation/rev-list-options.txt index 1837509566..ff68e48406 100644 --- a/Documentation/rev-list-options.txt +++ b/Documentation/rev-list-options.txt @@ -195,6 +195,13 @@ respectively, and they must begin with `refs/` when applied to `--glob` or `--all`. If a trailing '/{asterisk}' is intended, it must be given explicitly. +--exclude-hidden=[receive|uploadpack]:: + Do not include refs that would be hidden by `git-receive-pack` or + `git-upload-pack` by consulting the appropriate `receive.hideRefs` or + `uploadpack.hideRefs` configuration along with `transfer.hideRefs` (see + linkgit:git-config[1]). This option affects the next pseudo-ref option + `--all` or `--glob` and is cleared after processing them. + --reflog:: Pretend as if all objects mentioned by reflogs are listed on the command line as `<commit>`. diff --git a/Documentation/revisions.txt b/Documentation/revisions.txt index 0d2e55d781..9aa58052bc 100644 --- a/Documentation/revisions.txt +++ b/Documentation/revisions.txt @@ -49,7 +49,8 @@ characters and to avoid word splitting. `FETCH_HEAD` records the branch which you fetched from a remote repository with your last `git fetch` invocation. `ORIG_HEAD` is created by commands that move your `HEAD` in a drastic -way, to record the position of the `HEAD` before their operation, so that +way (`git am`, `git merge`, `git rebase`, `git reset`), +to record the position of the `HEAD` before their operation, so that you can easily change the tip of the branch back to the state before you ran them. `MERGE_HEAD` records the commit(s) which you are merging into your branch diff --git a/Documentation/technical/repository-version.txt b/Documentation/technical/repository-version.txt index 7844ef30ff..8ef664b0b9 100644 --- a/Documentation/technical/repository-version.txt +++ b/Documentation/technical/repository-version.txt @@ -82,9 +82,9 @@ When the config key `extensions.preciousObjects` is set to `true`, objects in the repository MUST NOT be deleted (e.g., by `git-prune` or `git repack -d`). -==== `partialclone` +==== `partialClone` -When the config key `extensions.partialclone` is set, it indicates +When the config key `extensions.partialClone` is set, it indicates that the repo was created with a partial clone (or later performed a partial fetch) and that the remote may have omitted sending certain unwanted objects. Such a remote is called a "promisor remote" diff --git a/Documentation/technical/sparse-checkout.txt b/Documentation/technical/sparse-checkout.txt new file mode 100644 index 0000000000..fa0d01cbda --- /dev/null +++ b/Documentation/technical/sparse-checkout.txt @@ -0,0 +1,1103 @@ +Table of contents: + + * Terminology + * Purpose of sparse-checkouts + * Usecases of primary concern + * Oversimplified mental models ("Cliff Notes" for this document!) + * Desired behavior + * Behavior classes + * Subcommand-dependent defaults + * Sparse specification vs. sparsity patterns + * Implementation Questions + * Implementation Goals/Plans + * Known bugs + * Reference Emails + + +=== Terminology === + +cone mode: one of two modes for specifying the desired subset of files + in a sparse-checkout. In cone-mode, the user specifies + directories (getting both everything under that directory as + well as everything in leading directories), while in non-cone + mode, the user specifies gitignore-style patterns. Controlled + by the --[no-]cone option to sparse-checkout init|set. + +SKIP_WORKTREE: When tracked files do not match the sparse specification and + are removed from the working tree, the file in the index is marked + with a SKIP_WORKTREE bit. Note that if a tracked file has the + SKIP_WORKTREE bit set but the file is later written by the user to + the working tree anyway, the SKIP_WORKTREE bit will be cleared at + the beginning of any subsequent Git operation. + + Most sparse checkout users are unaware of this implementation + detail, and the term should generally be avoided in user-facing + descriptions and command flags. Unfortunately, prior to the + `sparse-checkout` subcommand this low-level detail was exposed, + and as of time of writing, is still exposed in various places. + +sparse-checkout: a subcommand in git used to reduce the files present in + the working tree to a subset of all tracked files. Also, the + name of the file in the $GIT_DIR/info directory used to track + the sparsity patterns corresponding to the user's desired + subset. + +sparse cone: see cone mode + +sparse directory: An entry in the index corresponding to a directory, which + appears in the index instead of all the files under that directory + that would normally appear. See also sparse-index. Something that + can cause confusion is that the "sparse directory" does NOT match + the sparse specification, i.e. the directory is NOT present in the + working tree. May be renamed in the future (e.g. to "skipped + directory"). + +sparse index: A special mode for sparse-checkout that also makes the + index sparse by recording a directory entry in lieu of all the + files underneath that directory (thus making that a "skipped + directory" which unfortunately has also been called a "sparse + directory"), and does this for potentially multiple + directories. Controlled by the --[no-]sparse-index option to + init|set|reapply. + +sparsity patterns: patterns from $GIT_DIR/info/sparse-checkout used to + define the set of files of interest. A warning: It is easy to + over-use this term (or the shortened "patterns" term), for two + reasons: (1) users in cone mode specify directories rather than + patterns (their directories are transformed into patterns, but + users may think you are talking about non-cone mode if you use the + word "patterns"), and (b) the sparse specification might + transiently differ in the working tree or index from the sparsity + patterns (see "Sparse specification vs. sparsity patterns"). + +sparse specification: The set of paths in the user's area of focus. This + is typically just the tracked files that match the sparsity + patterns, but the sparse specification can temporarily differ and + include additional files. (See also "Sparse specification + vs. sparsity patterns") + + * When working with history, the sparse specification is exactly + the set of files matching the sparsity patterns. + * When interacting with the working tree, the sparse specification + is the set of tracked files with a clear SKIP_WORKTREE bit or + tracked files present in the working copy. + * When modifying or showing results from the index, the sparse + specification is the set of files with a clear SKIP_WORKTREE bit + or that differ in the index from HEAD. + * If working with the index and the working copy, the sparse + specification is the union of the paths from above. + +vivifying: When a command restores a tracked file to the working tree (and + hopefully also clears the SKIP_WORKTREE bit in the index for that + file), this is referred to as "vivifying" the file. + + +=== Purpose of sparse-checkouts === + +sparse-checkouts exist to allow users to work with a subset of their +files. + +You can think of sparse-checkouts as subdividing "tracked" files into two +categories -- a sparse subset, and all the rest. Implementationally, we +mark "all the rest" in the index with a SKIP_WORKTREE bit and leave them +out of the working tree. The SKIP_WORKTREE files are still tracked, just +not present in the working tree. + +In the past, sparse-checkouts were defined by "SKIP_WORKTREE means the file +is missing from the working tree but pretend the file contents match HEAD". +That was not only bogus (it actually meant the file missing from the +working tree matched the index rather than HEAD), but it was also a +low-level detail which only provided decent behavior for a few commands. +There were a surprising number of ways in which that guiding principle gave +command results that violated user expectations, and as such was a bad +mental model. However, it persisted for many years and may still be found +in some corners of the code base. + +Anyway, the idea of "working with a subset of files" is simple enough, but +there are multiple different high-level usecases which affect how some Git +subcommands should behave. Further, even if we only considered one of +those usecases, sparse-checkouts can modify different subcommands in over a +half dozen different ways. Let's start by considering the high level +usecases: + + A) Users are _only_ interested in the sparse portion of the repo + + A*) Users are _only_ interested in the sparse portion of the repo + that they have downloaded so far + + B) Users want a sparse working tree, but are working in a larger whole + + C) sparse-checkout is a behind-the-scenes implementation detail allowing + Git to work with a specially crafted in-house virtual file system; + users are actually working with a "full" working tree that is + lazily populated, and sparse-checkout helps with the lazy population + piece. + +It may be worth explaining each of these in a bit more detail: + + + (Behavior A) Users are _only_ interested in the sparse portion of the repo + +These folks might know there are other things in the repository, but +don't care. They are uninterested in other parts of the repository, and +only want to know about changes within their area of interest. Showing +them other files from history (e.g. from diff/log/grep/etc.) is a +usability annoyance, potentially a huge one since other changes in +history may dwarf the changes they are interested in. + +Some of these users also arrive at this usecase from wanting to use partial +clones together with sparse checkouts (in a way where they have downloaded +blobs within the sparse specification) and do disconnected development. +Not only do these users generally not care about other parts of the +repository, but consider it a blocker for Git commands to try to operate on +those. If commands attempt to access paths in history outside the sparsity +specification, then the partial clone will attempt to download additional +blobs on demand, fail, and then fail the user's command. (This may be +unavoidable in some cases, e.g. when `git merge` has non-trivial changes to +reconcile outside the sparse specification, but we should limit how often +users are forced to connect to the network.) + +Also, even for users using partial clones that do not mind being +always connected to the network, the need to download blobs as +side-effects of various other commands (such as the printed diffstat +after a merge or pull) can lead to worries about local repository size +growing unnecessarily[10]. + + (Behavior A*) Users are _only_ interested in the sparse portion of the repo + that they have downloaded so far (a variant on the first usecase) + +This variant is driven by folks who using partial clones together with +sparse checkouts and do disconnected development (so far sounding like a +subset of behavior A users) and doing so on very large repositories. The +reason for yet another variant is that downloading even just the blobs +through history within their sparse specification may be too much, so they +only download some. They would still like operations to succeed without +network connectivity, though, so things like `git log -S${SEARCH_TERM} -p` +or `git grep ${SEARCH_TERM} OLDREV ` would need to be prepared to provide +partial results that depend on what happens to have been downloaded. + +This variant could be viewed as Behavior A with the sparse specification +for history querying operations modified from "sparsity patterns" to +"sparsity patterns limited to the blobs we have already downloaded". + + (Behavior B) Users want a sparse working tree, but are working in a + larger whole + +Stolee described this usecase this way[11]: + +"I'm also focused on users that know that they are a part of a larger +whole. They know they are operating on a large repository but focus on +what they need to contribute their part. I expect multiple "roles" to +use very different, almost disjoint parts of the codebase. Some other +"architect" users operate across the entire tree or hop between different +sections of the codebase as necessary. In this situation, I'm wary of +scoping too many features to the sparse-checkout definition, especially +"git log," as it can be too confusing to have their view of the codebase +depend on your "point of view." + +People might also end up wanting behavior B due to complex inter-project +dependencies. The initial attempts to use sparse-checkouts usually involve +the directories you are directly interested in plus what those directories +depend upon within your repository. But there's a monkey wrench here: if +you have integration tests, they invert the hierarchy: to run integration +tests, you need not only what you are interested in and its in-tree +dependencies, you also need everything that depends upon what you are +interested in or that depends upon one of your dependencies...AND you need +all the in-tree dependencies of that expanded group. That can easily +change your sparse-checkout into a nearly dense one. + +Naturally, that tends to kill the benefits of sparse-checkouts. There are +a couple solutions to this conundrum: either avoid grabbing in-repo +dependencies (maybe have built versions of your in-repo dependencies pulled +from a CI cache somewhere), or say that users shouldn't run integration +tests directly and instead do it on the CI server when they submit a code +review. Or do both. Regardless of whether you stub out your in-repo +dependencies or stub out the things that depend upon you, there is +certainly a reason to want to query and be aware of those other stubbed-out +parts of the repository, particularly when the dependencies are complex or +change relatively frequently. Thus, for such uses, sparse-checkouts can be +used to limit what you directly build and modify, but these users do not +necessarily want their sparse checkout paths to limit their queries of +versions in history. + +Some people may also be interested in behavior B over behavior A simply as +a performance workaround: if they are using non-cone mode, then they have +to deal with its inherent quadratic performance problems. In that mode, +every operation that checks whether paths match the sparsity specification +can be expensive. As such, these users may only be willing to pay for +those expensive checks when interacting with the working copy, and may +prefer getting "unrelated" results from their history queries over having +slow commands. + + (Behavior C) sparse-checkout is an implementational detail supporting a + special VFS. + +This usecase goes slightly against the traditional definition of +sparse-checkout in that it actually tries to present a full or dense +checkout to the user. However, this usecase utilizes the same underlying +technical underpinnings in a new way which does provide some performance +advantages to users. The basic idea is that a company can have an in-house +Git-aware Virtual File System which pretends all files are present in the +working tree, by intercepting all file system accesses and using those to +fetch and write accessed files on demand via partial clones. The VFS uses +sparse-checkout to prevent Git from writing or paying attention to many +files, and manually updates the sparse checkout patterns itself based on +user access and modification of files in the working tree. See commit +ecc7c8841d ("repo_read_index: add config to expect files outside sparse +patterns", 2022-02-25) and the link at [17] for a more detailed description +of such a VFS. + +The biggest difference here is that users are completely unaware that the +sparse-checkout machinery is even in use. The sparse patterns are not +specified by the user but rather are under the complete control of the VFS +(and the patterns are updated frequently and dynamically by it). The user +will perceive the checkout as dense, and commands should thus behave as if +all files are present. + + +=== Usecases of primary concern === + +Most of the rest of this document will focus on Behavior A and Behavior +B. Some notes about the other two cases and why we are not focusing on +them: + + (Behavior A*) + +Supporting this usecase is estimated to be difficult and a lot of work. +There are no plans to implement it currently, but it may be a potential +future alternative. Knowing about the existence of additional alternatives +may affect our choice of command line flags (e.g. if we need tri-state or +quad-state flags rather than just binary flags), so it was still important +to at least note. + +Further, I believe the descriptions below for Behavior A are probably still +valid for this usecase, with the only exception being that it redefines the +sparse specification to restrict it to already-downloaded blobs. The hard +part is in making commands capable of respecting that modified definition. + + (Behavior C) + +This usecase violates some of the early sparse-checkout documented +assumptions (since files marked as SKIP_WORKTREE will be displayed to users +as present in the working tree). That violation may mean various +sparse-checkout related behaviors are not well suited to this usecase and +we may need tweaks -- to both documentation and code -- to handle it. +However, this usecase is also perhaps the simplest model to support in that +everything behaves like a dense checkout with a few exceptions (e.g. branch +checkouts and switches write fewer things, knowing the VFS will lazily +write the rest on an as-needed basis). + +Since there is no publically available VFS-related code for folks to try, +the number of folks who can test such a usecase is limited. + +The primary reason to note the Behavior C usecase is that as we fix things +to better support Behaviors A and B, there may be additional places where +we need to make tweaks allowing folks in this usecase to get the original +non-sparse treatment. For an example, see ecc7c8841d ("repo_read_index: +add config to expect files outside sparse patterns", 2022-02-25). The +secondary reason to note Behavior C, is so that folks taking advantage of +Behavior C do not assume they are part of the Behavior B camp and propose +patches that break things for the real Behavior B folks. + + +=== Oversimplified mental models === + +An oversimplification of the differences in the above behaviors is: + + Behavior A: Restrict worktree and history operations to sparse specification + Behavior B: Restrict worktree operations to sparse specification; have any + history operations work across all files + Behavior C: Do not restrict either worktree or history operations to the + sparse specification...with the exception of branch checkouts or + switches which avoid writing files that will match the index so + they can later lazily be populated instead. + + +=== Desired behavior === + +As noted previously, despite the simple idea of just working with a subset +of files, there are a range of different behavioral changes that need to be +made to different subcommands to work well with such a feature. See +[1,2,3,4,5,6,7,8,9,10] for various examples. In particular, at [2], we saw +that mere composition of other commands that individually worked correctly +in a sparse-checkout context did not imply that the higher level command +would work correctly; it sometimes requires further tweaks. So, +understanding these differences can be beneficial. + +* Commands behaving the same regardless of high-level use-case + + * commands that only look at files within the sparsity specification + + * diff (without --cached or REVISION arguments) + * grep (without --cached or REVISION arguments) + * diff-files + + * commands that restore files to the working tree that match sparsity + patterns, and remove unmodified files that don't match those + patterns: + + * switch + * checkout (the switch-like half) + * read-tree + * reset --hard + + * commands that write conflicted files to the working tree, but otherwise + will omit writing files to the working tree that do not match the + sparsity patterns: + + * merge + * rebase + * cherry-pick + * revert + + * `am` and `apply --cached` should probably be in this section but + are buggy (see the "Known bugs" section below) + + The behavior for these commands somewhat depends upon the merge + strategy being used: + * `ort` behaves as described above + * `recursive` tries to not vivify files unnecessarily, but does sometimes + vivify files without conflicts. + * `octopus` and `resolve` will always vivify any file changed in the merge + relative to the first parent, which is rather suboptimal. + + It is also important to note that these commands WILL update the index + outside the sparse specification relative to when the operation began, + BUT these commands often make a commit just before or after such that + by the end of the operation there is no change to the index outside the + sparse specification. Of course, if the operation hits conflicts or + does not make a commit, then these operations clearly can modify the + index outside the sparse specification. + + Finally, it is important to note that at least the first four of these + commands also try to remove differences between the sparse + specification and the sparsity patterns (much like the commands in the + previous section). + + * commands that always ignore sparsity since commits must be full-tree + + * archive + * bundle + * commit + * format-patch + * fast-export + * fast-import + * commit-tree + + * commands that write any modified file to the working tree (conflicted + or not, and whether those paths match sparsity patterns or not): + + * stash + * apply (without `--index` or `--cached`) + +* Commands that may slightly differ for behavior A vs. behavior B: + + Commands in this category behave mostly the same between the two + behaviors, but may differ in verbosity and types of warning and error + messages. + + * commands that make modifications to which files are tracked: + * add + * rm + * mv + * update-index + + The fact that files can move between the 'tracked' and 'untracked' + categories means some commands will have to treat untracked files + differently. But if we have to treat untracked files differently, + then additional commands may also need changes: + + * status + * clean + + In particular, `status` may need to report any untracked files outside + the sparsity specification as an erroneous condition (especially to + avoid the user trying to `git add` them, forcing `git add` to display + an error). + + It's not clear to me exactly how (or even if) `clean` would change, + but it's the other command that also affects untracked files. + + `update-index` may be slightly special. Its --[no-]skip-worktree flag + may need to ignore the sparse specification by its nature. Also, its + current --[no-]ignore-skip-worktree-entries default is totally bogus. + + * commands for manually tweaking paths in both the index and the working tree + * `restore` + * the restore-like half of `checkout` + + These commands should be similar to add/rm/mv in that they should + only operate on the sparse specification by default, and require a + special flag to operate on all files. + + Also, note that these commands currently have a number of issues (see + the "Known bugs" section below) + +* Commands that significantly differ for behavior A vs. behavior B: + + * commands that query history + * diff (with --cached or REVISION arguments) + * grep (with --cached or REVISION arguments) + * show (when given commit arguments) + * blame (only matters when one or more -C flags are passed) + * and annotate + * log + * whatchanged + * ls-files + * diff-index + * diff-tree + * ls-tree + + Note: for log and whatchanged, revision walking logic is unaffected + but displaying of patches is affected by scoping the command to the + sparse-checkout. (The fact that revision walking is unaffected is + why rev-list, shortlog, show-branch, and bisect are not in this + list.) + + ls-files may be slightly special in that e.g. `git ls-files -t` is + often used to see what is sparse and what is not. Perhaps -t should + always work on the full tree? + +* Commands I don't know how to classify + + * range-diff + + Is this like `log` or `format-patch`? + + * cherry + + See range-diff + +* Commands unaffected by sparse-checkouts + + * shortlog + * show-branch + * rev-list + * bisect + + * branch + * describe + * fetch + * gc + * init + * maintenance + * notes + * pull (merge & rebase have the necessary changes) + * push + * submodule + * tag + + * config + * filter-branch (works in separate checkout without sparse-checkout setup) + * pack-refs + * prune + * remote + * repack + * replace + + * bugreport + * count-objects + * fsck + * gitweb + * help + * instaweb + * merge-tree (doesn't touch worktree or index, and merges always compute full-tree) + * rerere + * verify-commit + * verify-tag + + * commit-graph + * hash-object + * index-pack + * mktag + * mktree + * multi-pack-index + * pack-objects + * prune-packed + * symbolic-ref + * unpack-objects + * update-ref + * write-tree (operates on index, possibly optimized to use sparse dir entries) + + * for-each-ref + * get-tar-commit-id + * ls-remote + * merge-base (merges are computed full tree, so merge base should be too) + * name-rev + * pack-redundant + * rev-parse + * show-index + * show-ref + * unpack-file + * var + * verify-pack + + * <Everything under 'Interacting with Others' in 'git help --all'> + * <Everything under 'Low-level...Syncing' in 'git help --all'> + * <Everything under 'Low-level...Internal Helpers' in 'git help --all'> + * <Everything under 'External commands' in 'git help --all'> + +* Commands that might be affected, but who cares? + + * merge-file + * merge-index + * gitk? + + +=== Behavior classes === + +From the above there are a few classes of behavior: + + * "restrict" + + Commands in this class only read or write files in the working tree + within the sparse specification. + + When moving to a new commit (e.g. switch, reset --hard), these commands + may update index files outside the sparse specification as of the start + of the operation, but by the end of the operation those index files + will match HEAD again and thus those files will again be outside the + sparse specification. + + When paths are explicitly specified, these paths are intersected with + the sparse specification and will only operate on such paths. + (e.g. `git restore [--staged] -- '*.png'`, `git reset -p -- '*.md'`) + + Some of these commands may also attempt, at the end of their operation, + to cull transient differences between the sparse specification and the + sparsity patterns (see "Sparse specification vs. sparsity patterns" for + details, but this basically means either removing unmodified files not + matching the sparsity patterns and marking those files as + SKIP_WORKTREE, or vivifying files that match the sparsity patterns and + marking those files as !SKIP_WORKTREE). + + * "restrict modulo conflicts" + + Commands in this class generally behave like the "restrict" class, + except that: + (1) they will ignore the sparse specification and write files with + conflicts to the working tree (thus temporarily expanding the + sparse specification to include such files.) + (2) they are grouped with commands which move to a new commit, since + they often create a commit and then move to it, even though we + know there are many exceptions to moving to the new commit. (For + example, the user may rebase a commit that becomes empty, or have + a cherry-pick which conflicts, or a user could run `merge + --no-commit`, and we also view `apply --index` kind of like `am + --no-commit`.) As such, these commands can make changes to index + files outside the sparse specification, though they'll mark such + files with SKIP_WORKTREE. + + * "restrict also specially applied to untracked files" + + Commands in this class generally behave like the "restrict" class, + except that they have to handle untracked files differently too, often + because these commands are dealing with files changing state between + 'tracked' and 'untracked'. Often, this may mean printing an error + message if the command had nothing to do, but the arguments may have + referred to files whose tracked-ness state could have changed were it + not for the sparsity patterns excluding them. + + * "no restrict" + + Commands in this class ignore the sparse specification entirely. + + * "restrict or no restrict dependent upon behavior A vs. behavior B" + + Commands in this class behave like "no restrict" for folks in the + behavior B camp, and like "restrict" for folks in the behavior A camp. + However, when behaving like "restrict" a warning of some sort might be + provided that history queries have been limited by the sparse-checkout + specification. + + +=== Subcommand-dependent defaults === + +Note that we have different defaults depending on the command for the +desired behavior : + + * Commands defaulting to "restrict": + * diff-files + * diff (without --cached or REVISION arguments) + * grep (without --cached or REVISION arguments) + * switch + * checkout (the switch-like half) + * reset (<commit>) + + * restore + * checkout (the restore-like half) + * checkout-index + * reset (with pathspec) + + This behavior makes sense; these interact with the working tree. + + * Commands defaulting to "restrict modulo conflicts": + * merge + * rebase + * cherry-pick + * revert + + * am + * apply --index (which is kind of like an `am --no-commit`) + + * read-tree (especially with -m or -u; is kind of like a --no-commit merge) + * reset (<tree-ish>, due to similarity to read-tree) + + These also interact with the working tree, but require slightly + different behavior either so that (a) conflicts can be resolved or (b) + because they are kind of like a merge-without-commit operation. + + (See also the "Known bugs" section below regarding `am` and `apply`) + + * Commands defaulting to "no restrict": + * archive + * bundle + * commit + * format-patch + * fast-export + * fast-import + * commit-tree + + * stash + * apply (without `--index`) + + These have completely different defaults and perhaps deserve the most + detailed explanation: + + In the case of commands in the first group (format-patch, + fast-export, bundle, archive, etc.), these are commands for + communicating history, which will be broken if they restrict to a + subset of the repository. As such, they operate on full paths and + have no `--restrict` option for overriding. Some of these commands may + take paths for manually restricting what is exported, but it needs to + be very explicit. + + In the case of stash, it needs to vivify files to avoid losing the + user's changes. + + In the case of apply without `--index`, that command needs to update + the working tree without the index (or the index without the working + tree if `--cached` is passed), and if we restrict those updates to the + sparse specification then we'll lose changes from the user. + + * Commands defaulting to "restrict also specially applied to untracked files": + * add + * rm + * mv + * update-index + * status + * clean (?) + + Our original implementation for the first three of these commands was + "no restrict", but it had some severe usability issues: + * `git add <somefile>` if honored and outside the sparse + specification, can result in the file randomly disappearing later + when some subsequent command is run (since various commands + automatically clean up unmodified files outside the sparse + specification). + * `git rm '*.jpg'` could very negatively surprise users if it deletes + files outside the range of the user's interest. + * `git mv` has similar surprises when moving into or out of the cone, + so best to restrict by default + + So, we switched `add` and `rm` to default to "restrict", which made + usability problems much less severe and less frequent, but we still got + complaints because commands like: + git add <file-outside-sparse-specification> + git rm <file-outside-sparse-specification> + would silently do nothing. We should instead print an error in those + cases to get usability right. + + update-index needs to be updated to match, and status and maybe clean + also need to be updated to specially handle untracked paths. + + There may be a difference in here between behavior A and behavior B in + terms of verboseness of errors or additional warnings. + + * Commands falling under "restrict or no restrict dependent upon behavior + A vs. behavior B" + + * diff (with --cached or REVISION arguments) + * grep (with --cached or REVISION arguments) + * show (when given commit arguments) + * blame (only matters when one or more -C flags passed) + * and annotate + * log + * and variants: shortlog, gitk, show-branch, whatchanged, rev-list + * ls-files + * diff-index + * diff-tree + * ls-tree + + For now, we default to behavior B for these, which want a default of + "no restrict". + + Note that two of these commands -- diff and grep -- also appeared in a + different list with a default of "restrict", but only when limited to + searching the working tree. The working tree vs. history distinction + is fundamental in how behavior B operates, so this is expected. Note, + though, that for diff and grep with --cached, when doing "restrict" + behavior, the difference between sparse specification and sparsity + patterns is important to handle. + + "restrict" may make more sense as the long term default for these[12]. + Also, supporting "restrict" for these commands might be a fair amount + of work to implement, meaning it might be implemented over multiple + releases. If that behavior were the default in the commands that + supported it, that would force behavior B users to need to learn to + slowly add additional flags to their commands, depending on git + version, to get the behavior they want. That gradual switchover would + be painful, so we should avoid it at least until it's fully + implemented. + + +=== Sparse specification vs. sparsity patterns === + +In a well-behaved situation, the sparse specification is given directly +by the $GIT_DIR/info/sparse-checkout file. However, it can transiently +diverge for a few reasons: + + * needing to resolve conflicts (merging will vivify conflicted files) + * running Git commands that implicitly vivify files (e.g. "git stash apply") + * running Git commands that explicitly vivify files (e.g. "git checkout + --ignore-skip-worktree-bits FILENAME") + * other commands that write to these files (perhaps a user copies it + from elsewhere) + +For the last item, note that we do automatically clear the SKIP_WORKTREE +bit for files that are present in the working tree. This has been true +since 82386b4496 ("Merge branch 'en/present-despite-skipped'", +2022-03-09) + +However, such a situation is transient because: + + * Such transient differences can and will be automatically removed as + a side-effect of commands which call unpack_trees() (checkout, + merge, reset, etc.). + * Users can also request such transient differences be corrected via + running `git sparse-checkout reapply`. Various places recommend + running that command. + * Additional commands are also welcome to implicitly fix these + differences; we may add more in the future. + +While we avoid dropping unstaged changes or files which have conflicts, +we otherwise aggressively try to fix these transient differences. If +users want these differences to persist, they should run the `set` or +`add` subcommands of `git sparse-checkout` to reflect their intended +sparse specification. + +However, when we need to do a query on history restricted to the +"relevant subset of files" such a transiently expanded sparse +specification is ignored. There are a couple reasons for this: + + * The behavior wanted when doing something like + git grep expression REVISION + is roughly what the users would expect from + git checkout REVISION && git grep expression + (modulo a "REVISION:" prefix), which has a couple ramifications: + + * REVISION may have paths not in the current index, so there is no + path we can consult for a SKIP_WORKTREE setting for those paths. + + * Since `checkout` is one of those commands that tries to remove + transient differences in the sparse specification, it makes sense + to use the corrected sparse specification + (i.e. $GIT_DIR/info/sparse-checkout) rather than attempting to + consult SKIP_WORKTREE anyway. + +So, a transiently expanded (or restricted) sparse specification applies to +the working tree, but not to history queries where we always use the +sparsity patterns. (See [16] for an early discussion of this.) + +Similar to a transiently expanded sparse specification of the working tree +based on additional files being present in the working tree, we also need +to consider additional files being modified in the index. In particular, +if the user has staged changes to files (relative to HEAD) that do not +match the sparsity patterns, and the file is not present in the working +tree, we still want to consider the file part of the sparse specification +if we are specifically performing a query related to the index (e.g. git +diff --cached [REVISION], git diff-index [REVISION], git restore --staged +--source=REVISION -- PATHS, etc.) Note that a transiently expanded sparse +specification for the index usually only matters under behavior A, since +under behavior B index operations are lumped with history and tend to +operate full-tree. + + +=== Implementation Questions === + + * Do the options --scope={sparse,all} sound good to others? Are there better + options? + * Names in use, or appearing in patches, or previously suggested: + * --sparse/--dense + * --ignore-skip-worktree-bits + * --ignore-skip-worktree-entries + * --ignore-sparsity + * --[no-]restrict-to-sparse-paths + * --full-tree/--sparse-tree + * --[no-]restrict + * --scope={sparse,all} + * --focus/--unfocus + * --limit/--unlimited + * Rationale making me lean slightly towards --scope={sparse,all}: + * We want a name that works for many commands, so we need a name that + does not conflict + * We know that we have more than two possible usecases, so it is best + to avoid a flag that appears to be binary. + * --scope={sparse,all} isn't overly long and seems relatively + explanatory + * `--sparse`, as used in add/rm/mv, is totally backwards for + grep/log/etc. Changing the meaning of `--sparse` for these + commands would fix the backwardness, but possibly break existing + scripts. Using a new name pairing would allow us to treat + `--sparse` in these commands as a deprecated alias. + * There is a different `--sparse`/`--dense` pair for commands using + revision machinery, so using that naming might cause confusion + * There is also a `--sparse` in both pack-objects and show-branch, which + don't conflict but do suggest that `--sparse` is overloaded + * The name --ignore-skip-worktree-bits is a double negative, is + quite a mouthful, refers to an implementation detail that many + users may not be familiar with, and we'd need a negation for it + which would probably be even more ridiculously long. (But we + can make --ignore-skip-worktree-bits a deprecated alias for + --no-restrict.) + + * If a config option is added (sparse.scope?) what should the values and + description be? "sparse" (behavior A), "worktree-sparse-history-dense" + (behavior B), "dense" (behavior C)? There's a risk of confusion, + because even for Behaviors A and B we want some commands to be + full-tree and others to operate sparsely, so the wording may need to be + more tied to the usecases and somehow explain that. Also, right now, + the primary difference we are focusing is just the history-querying + commands (log/diff/grep). Previous config suggestion here: [13] + + * Is `--no-expand` a good alias for ls-files's `--sparse` option? + (`--sparse` does not map to either `--scope=sparse` or `--scope=all`, + because in non-cone mode it does nothing and in cone-mode it shows the + sparse directory entries which are technically outside the sparse + specification) + + * Under Behavior A: + * Does ls-files' `--no-expand` override the default `--scope=all`, or + does it need an extra flag? + * Does ls-files' `-t` option imply `--scope=all`? + * Does update-index's `--[no-]skip-worktree` option imply `--scope=all`? + + * sparse-checkout: once behavior A is fully implemented, should we take + an interim measure to ease people into switching the default? Namely, + if folks are not already in a sparse checkout, then require + `sparse-checkout init/set` to take a + `--set-scope=(sparse|worktree-sparse-history-dense|dense)` flag (which + would set sparse.scope according to the setting given), and throw an + error if the flag is not provided? That error would be a great place + to warn folks that the default may change in the future, and get them + used to specifying what they want so that the eventual default switch + is seamless for them. + + +=== Implementation Goals/Plans === + + * Get buy-in on this document in general. + + * Figure out answers to the 'Implementation Questions' sections (above) + + * Fix bugs in the 'Known bugs' section (below) + + * Provide some kind of method for backfilling the blobs within the sparse + specification in a partial clone + + [Below here is kind of spitballing since the first two haven't been resolved] + + * update-index: flip the default to --no-ignore-skip-worktree-entries, + nuke this stupid "Oh, there's a bug? Let me add a flag to let users + request that they not trigger this bug." flag + + * Flags & Config + * Make `--sparse` in add/rm/mv a deprecated alias for `--scope=all` + * Make `--ignore-skip-worktree-bits` in checkout-index/checkout/restore + a deprecated aliases for `--scope=all` + * Create config option (sparse.scope?), tie it to the "Cliff notes" + overview + + * Add --scope=sparse (and --scope=all) flag to each of the history querying + commands. IMPORTANT: make sure diff machinery changes don't mess with + format-patch, fast-export, etc. + +=== Known bugs === + +This list used to be a lot longer (see e.g. [1,2,3,4,5,6,7,8,9]), but we've +been working on it. + +0. Behavior A is not well supported in Git. (Behavior B didn't used to + be either, but was the easier of the two to implement.) + +1. am and apply: + + apply, without `--index` or `--cached`, relies on files being present + in the working copy, and also writes to them unconditionally. As + such, it should first check for the files' presence, and if found to + be SKIP_WORKTREE, then clear the bit and vivify the paths, then do + its work. Currently, it just throws an error. + + apply, with either `--cached` or `--index`, will not preserve the + SKIP_WORKTREE bit. This is fine if the file has conflicts, but + otherwise SKIP_WORKTREE bits should be preserved for --cached and + probably also for --index. + + am, if there are no conflicts, will vivify files and fail to preserve + the SKIP_WORKTREE bit. If there are conflicts and `-3` is not + specified, it will vivify files and then complain the patch doesn't + apply. If there are conflicts and `-3` is specified, it will vivify + files and then complain that those vivified files would be + overwritten by merge. + +2. reset --hard: + + reset --hard provides confusing error message (works correctly, but + misleads the user into believing it didn't): + + $ touch addme + $ git add addme + $ git ls-files -t + H addme + H tracked + S tracked-but-maybe-skipped + $ git reset --hard # usually works great + error: Path 'addme' not uptodate; will not remove from working tree. + HEAD is now at bdbbb6f third + $ git ls-files -t + H tracked + S tracked-but-maybe-skipped + $ ls -1 + tracked + + `git reset --hard` DID remove addme from the index and the working tree, contrary + to the error message, but in line with how reset --hard should behave. + +3. read-tree + + `read-tree` doesn't apply the 'SKIP_WORKTREE' bit to *any* of the + entries it reads into the index, resulting in all your files suddenly + appearing to be "deleted". + +4. Checkout, restore: + + These command do not handle path & revision arguments appropriately: + + $ ls + tracked + $ git ls-files -t + H tracked + S tracked-but-maybe-skipped + $ git status --porcelain + $ git checkout -- '*skipped' + error: pathspec '*skipped' did not match any file(s) known to git + $ git ls-files -- '*skipped' + tracked-but-maybe-skipped + $ git checkout HEAD -- '*skipped' + error: pathspec '*skipped' did not match any file(s) known to git + $ git ls-tree HEAD | grep skipped + 100644 blob 276f5a64354b791b13840f02047738c77ad0584f tracked-but-maybe-skipped + $ git status --porcelain + $ git checkout HEAD~1 -- '*skipped' + $ git ls-files -t + H tracked + H tracked-but-maybe-skipped + $ git status --porcelain + M tracked-but-maybe-skipped + $ git checkout HEAD -- '*skipped' + $ git status --porcelain + $ + + Note that checkout without a revision (or restore --staged) fails to + find a file to restore from the index, even though ls-files shows + such a file certainly exists. + + Similar issues occur with HEAD (--source=HEAD in restore's case), + but suddenly works when HEAD~1 is specified. And then after that it + will work with HEAD specified, even though it didn't before. + + Directories are also an issue: + + $ git sparse-checkout set nomatches + $ git status + On branch main + You are in a sparse checkout with 0% of tracked files present. + + nothing to commit, working tree clean + $ git checkout . + error: pathspec '.' did not match any file(s) known to git + $ git checkout HEAD~1 . + Updated 1 path from 58916d9 + $ git ls-files -t + S tracked + H tracked-but-maybe-skipped + +5. checkout and restore --staged, continued: + + These commands do not correctly scope operations to the sparse + specification, and make it worse by not setting important SKIP_WORKTREE + bits: + + $ git restore --source OLDREV --staged outside-sparse-cone/ + $ git status --porcelain + MD outside-sparse-cone/file1 + MD outside-sparse-cone/file2 + MD outside-sparse-cone/file3 + + We can add a --scope=all mode to `git restore` to let it operate outside + the sparse specification, but then it will be important to set the + SKIP_WORKTREE bits appropriately. + +6. Performance issues; see: + https://lore.kernel.org/git/CABPp-BEkJQoKZsQGCYioyga_uoDQ6iBeW+FKr8JhyuuTMK1RDw@mail.gmail.com/ + + +=== Reference Emails === + +Emails that detail various bugs we've had in sparse-checkout: + +[1] (Original descriptions of behavior A & behavior B) + https://lore.kernel.org/git/CABPp-BGJ_Nvi5TmgriD9Bh6eNXE2EDq2f8e8QKXAeYG3BxZafA@mail.gmail.com/ +[2] (Fix stash applications in sparse checkouts; bugs from behavioral differences) + https://lore.kernel.org/git/ccfedc7140dbf63ba26a15f93bd3885180b26517.1606861519.git.gitgitgadget@gmail.com/ +[3] (Present-despite-skipped entries) + https://lore.kernel.org/git/11d46a399d26c913787b704d2b7169cafc28d639.1642175983.git.gitgitgadget@gmail.com/ +[4] (Clone --no-checkout interaction) + https://lore.kernel.org/git/pull.801.v2.git.git.1591324899170.gitgitgadget@gmail.com/ (clone --no-checkout) +[5] (The need for update_sparsity() and avoiding `read-tree -mu HEAD`) + https://lore.kernel.org/git/3a1f084641eb47515b5a41ed4409a36128913309.1585270142.git.gitgitgadget@gmail.com/ +[6] (SKIP_WORKTREE is advisory, not mandatory) + https://lore.kernel.org/git/844306c3e86ef67591cc086decb2b760e7d710a3.1585270142.git.gitgitgadget@gmail.com/ +[7] (`worktree add` should copy sparsity settings from current worktree) + https://lore.kernel.org/git/c51cb3714e7b1d2f8c9370fe87eca9984ff4859f.1644269584.git.gitgitgadget@gmail.com/ +[8] (Avoid negative surprises in add, rm, and mv) + https://lore.kernel.org/git/cover.1617914011.git.matheus.bernardino@usp.br/ + https://lore.kernel.org/git/pull.1018.v4.git.1632497954.gitgitgadget@gmail.com/ +[9] (Move from out-of-cone to in-cone) + https://lore.kernel.org/git/20220630023737.473690-6-shaoxuan.yuan02@gmail.com/ + https://lore.kernel.org/git/20220630023737.473690-4-shaoxuan.yuan02@gmail.com/ +[10] (Unnecessarily downloading objects outside sparse specification) + https://lore.kernel.org/git/CAOLTT8QfwOi9yx_qZZgyGa8iL8kHWutEED7ok_jxwTcYT_hf9Q@mail.gmail.com/ + +[11] (Stolee's comments on high-level usecases) + https://lore.kernel.org/git/1a1e33f6-3514-9afc-0a28-5a6b85bd8014@gmail.com/ + +[12] Others commenting on eventually switching default to behavior A: + * https://lore.kernel.org/git/xmqqh719pcoo.fsf@gitster.g/ + * https://lore.kernel.org/git/xmqqzgeqw0sy.fsf@gitster.g/ + * https://lore.kernel.org/git/a86af661-cf58-a4e5-0214-a67d3a794d7e@github.com/ + +[13] Previous config name suggestion and description + * https://lore.kernel.org/git/CABPp-BE6zW0nJSStcVU=_DoDBnPgLqOR8pkTXK3dW11=T01OhA@mail.gmail.com/ + +[14] Tangential issue: switch to cone mode as default sparse specification mechanism: + https://lore.kernel.org/git/a1b68fd6126eb341ef3637bb93fedad4309b36d0.1650594746.git.gitgitgadget@gmail.com/ + +[15] Lengthy email on grep behavior, covering what should be searched: + * https://lore.kernel.org/git/CABPp-BGVO3QdbfE84uF_3QDF0-y2iHHh6G5FAFzNRfeRitkuHw@mail.gmail.com/ + +[16] Email explaining sparsity patterns vs. SKIP_WORKTREE and history operations, + search for the parenthetical comment starting "We do not check". + https://lore.kernel.org/git/CABPp-BFsCPPNOZ92JQRJeGyNd0e-TCW-LcLyr0i_+VSQJP+GCg@mail.gmail.com/ + +[17] https://lore.kernel.org/git/20220207190320.2960362-1-jonathantanmy@google.com/ diff --git a/GIT-VERSION-GEN b/GIT-VERSION-GEN index e3eaeb4926..eec953731c 100755 --- a/GIT-VERSION-GEN +++ b/GIT-VERSION-GEN @@ -1,7 +1,7 @@ #!/bin/sh GVF=GIT-VERSION-FILE -DEF_VER=v2.38.GIT +DEF_VER=v2.39.3 LF=' ' @@ -133,17 +133,13 @@ Issues of note: you are using libcurl older than 7.34.0. Otherwise you can use NO_OPENSSL without losing git-imap-send. - By default, git uses OpenSSL for SHA1 but it will use its own - library (inspired by Mozilla's) with either NO_OPENSSL or - BLK_SHA1. - - "libcurl" library is used for fetching and pushing repositories over http:// or https://, as well as by git-imap-send if the curl version is >= 7.34.0. If you do not need that functionality, use NO_CURL to build without it. - Git requires version "7.19.4" or later of "libcurl" to build + Git requires version "7.19.5" or later of "libcurl" to build without NO_CURL. This version requirement may be bumped in the future. @@ -4,8 +4,20 @@ all:: # Import tree-wide shared Makefile behavior and libraries include shared.mak +# == Makefile defines == +# +# These defines change the behavior of the Makefile itself, but have +# no impact on what it builds: +# # Define V=1 to have a more verbose compile. # +# == Portability and optional library defines == +# +# These defines indicate what Git can expect from the OS, what +# libraries are available etc. Much of this is auto-detected in +# config.mak.uname, or in configure.ac when using the optional "make +# configure && ./configure" (see INSTALL). +# # Define SHELL_PATH to a POSIX shell if your /bin/sh is broken. # # Define SANE_TOOL_PATH to a colon-separated list of paths to prepend @@ -30,68 +42,8 @@ include shared.mak # # Define NO_OPENSSL environment variable if you do not have OpenSSL. # -# Define USE_LIBPCRE if you have and want to use libpcre. Various -# commands such as log and grep offer runtime options to use -# Perl-compatible regular expressions instead of standard or extended -# POSIX regular expressions. -# -# Only libpcre version 2 is supported. USE_LIBPCRE2 is a synonym for -# USE_LIBPCRE, support for the old USE_LIBPCRE1 has been removed. -# -# Define LIBPCREDIR=/foo/bar if your PCRE header and library files are -# in /foo/bar/include and /foo/bar/lib directories. -# # Define HAVE_ALLOCA_H if you have working alloca(3) defined in that header. # -# Define NO_CURL if you do not have libcurl installed. git-http-fetch and -# git-http-push are not built, and you cannot use http:// and https:// -# transports (neither smart nor dumb). -# -# Define CURLDIR=/foo/bar if your curl header and library files are in -# /foo/bar/include and /foo/bar/lib directories. -# -# Define CURL_CONFIG to curl's configuration program that prints information -# about the library (e.g., its version number). The default is 'curl-config'. -# -# Define CURL_LDFLAGS to specify flags that you need to link when using libcurl, -# if you do not want to rely on the libraries provided by CURL_CONFIG. The -# default value is a result of `curl-config --libs`. An example value for -# CURL_LDFLAGS is as follows: -# -# CURL_LDFLAGS=-lcurl -# -# Define NO_EXPAT if you do not have expat installed. git-http-push is -# not built, and you cannot push using http:// and https:// transports (dumb). -# -# Define EXPATDIR=/foo/bar if your expat header and library files are in -# /foo/bar/include and /foo/bar/lib directories. -# -# Define EXPAT_NEEDS_XMLPARSE_H if you have an old version of expat (e.g., -# 1.1 or 1.2) that provides xmlparse.h instead of expat.h. -# -# Define NO_GETTEXT if you don't want Git output to be translated. -# A translated Git requires GNU libintl or another gettext implementation, -# plus libintl-perl at runtime. -# -# Define USE_GETTEXT_SCHEME and set it to 'fallthrough', if you don't trust -# the installed gettext translation of the shell scripts output. -# -# Define HAVE_LIBCHARSET_H if you haven't set NO_GETTEXT and you can't -# trust the langinfo.h's nl_langinfo(CODESET) function to return the -# current character set. GNU and Solaris have a nl_langinfo(CODESET), -# FreeBSD can use either, but MinGW and some others need to use -# libcharset.h's locale_charset() instead. -# -# Define CHARSET_LIB to the library you need to link with in order to -# use locale_charset() function. On some platforms this needs to set to -# -lcharset, on others to -liconv . -# -# Define LIBC_CONTAINS_LIBINTL if your gettext implementation doesn't -# need -lintl when linking. -# -# Define NO_MSGFMT_EXTENDED_OPTIONS if your implementation of msgfmt -# doesn't support GNU extensions like --check and --statistics -# # Define HAVE_PATHS_H if you have paths.h and want to use the default PATH # it specifies. # @@ -152,39 +104,6 @@ include shared.mak # and do not want to use Apple's CommonCrypto library. This allows you # to provide your own OpenSSL library, for example from MacPorts. # -# Define BLK_SHA1 environment variable to make use of the bundled -# optimized C SHA1 routine. -# -# Define DC_SHA1 to unconditionally enable the collision-detecting sha1 -# algorithm. This is slower, but may detect attempted collision attacks. -# Takes priority over other *_SHA1 knobs. -# -# Define DC_SHA1_EXTERNAL in addition to DC_SHA1 if you want to build / link -# git with the external SHA1 collision-detect library. -# Without this option, i.e. the default behavior is to build git with its -# own built-in code (or submodule). -# -# Define DC_SHA1_SUBMODULE in addition to DC_SHA1 to use the -# sha1collisiondetection shipped as a submodule instead of the -# non-submodule copy in sha1dc/. This is an experimental option used -# by the git project to migrate to using sha1collisiondetection as a -# submodule. -# -# Define OPENSSL_SHA1 environment variable when running make to link -# with the SHA1 routine from openssl library. -# -# Define SHA1_MAX_BLOCK_SIZE to limit the amount of data that will be hashed -# in one call to the platform's SHA1_Update(). e.g. APPLE_COMMON_CRYPTO -# wants 'SHA1_MAX_BLOCK_SIZE=1024L*1024L*1024L' defined. -# -# Define BLK_SHA256 to use the built-in SHA-256 routines. -# -# Define NETTLE_SHA256 to use the SHA-256 routines in libnettle. -# -# Define GCRYPT_SHA256 to use the SHA-256 routines in libgcrypt. -# -# Define OPENSSL_SHA256 to use the SHA-256 routines in OpenSSL. -# # Define NEEDS_CRYPTO_WITH_SSL if you need -lcrypto when using -lssl (Darwin). # # Define NEEDS_SSL_WITH_CRYPTO if you need -lssl when using -lcrypto (Darwin). @@ -370,6 +289,10 @@ include shared.mak # Define NO_REGEX if your C library lacks regex support with REG_STARTEND # feature. # +# Define USE_ENHANCED_BASIC_REGULAR_EXPRESSIONS if your C library provides +# the flag REG_ENHANCED and you'd like to use it to enable enhanced basic +# regular expressions. +# # Define HAVE_DEV_TTY if your system can open /dev/tty to interact with the # user. # @@ -490,6 +413,151 @@ include shared.mak # to the "<name>" of the corresponding `compat/fsmonitor/fsm-settings-<name>.c` # that implements the `fsm_os_settings__*()` routines. # +# === Optional library: libintl === +# +# Define NO_GETTEXT if you don't want Git output to be translated. +# A translated Git requires GNU libintl or another gettext implementation, +# plus libintl-perl at runtime. +# +# Define USE_GETTEXT_SCHEME and set it to 'fallthrough', if you don't trust +# the installed gettext translation of the shell scripts output. +# +# Define HAVE_LIBCHARSET_H if you haven't set NO_GETTEXT and you can't +# trust the langinfo.h's nl_langinfo(CODESET) function to return the +# current character set. GNU and Solaris have a nl_langinfo(CODESET), +# FreeBSD can use either, but MinGW and some others need to use +# libcharset.h's locale_charset() instead. +# +# Define CHARSET_LIB to the library you need to link with in order to +# use locale_charset() function. On some platforms this needs to set to +# -lcharset, on others to -liconv . +# +# Define LIBC_CONTAINS_LIBINTL if your gettext implementation doesn't +# need -lintl when linking. +# +# Define NO_MSGFMT_EXTENDED_OPTIONS if your implementation of msgfmt +# doesn't support GNU extensions like --check and --statistics +# +# === Optional library: libexpat === +# +# Define NO_EXPAT if you do not have expat installed. git-http-push is +# not built, and you cannot push using http:// and https:// transports (dumb). +# +# Define EXPATDIR=/foo/bar if your expat header and library files are in +# /foo/bar/include and /foo/bar/lib directories. +# +# Define EXPAT_NEEDS_XMLPARSE_H if you have an old version of expat (e.g., +# 1.1 or 1.2) that provides xmlparse.h instead of expat.h. + +# === Optional library: libcurl === +# +# Define NO_CURL if you do not have libcurl installed. git-http-fetch and +# git-http-push are not built, and you cannot use http:// and https:// +# transports (neither smart nor dumb). +# +# Define CURLDIR=/foo/bar if your curl header and library files are in +# /foo/bar/include and /foo/bar/lib directories. +# +# Define CURL_CONFIG to curl's configuration program that prints information +# about the library (e.g., its version number). The default is 'curl-config'. +# +# Define CURL_LDFLAGS to specify flags that you need to link when using libcurl, +# if you do not want to rely on the libraries provided by CURL_CONFIG. The +# default value is a result of `curl-config --libs`. An example value for +# CURL_LDFLAGS is as follows: +# +# CURL_LDFLAGS=-lcurl +# +# === Optional library: libpcre2 === +# +# Define USE_LIBPCRE if you have and want to use libpcre. Various +# commands such as log and grep offer runtime options to use +# Perl-compatible regular expressions instead of standard or extended +# POSIX regular expressions. +# +# Only libpcre version 2 is supported. USE_LIBPCRE2 is a synonym for +# USE_LIBPCRE, support for the old USE_LIBPCRE1 has been removed. +# +# Define LIBPCREDIR=/foo/bar if your PCRE header and library files are +# in /foo/bar/include and /foo/bar/lib directories. +# +# == SHA-1 and SHA-256 defines == +# +# === SHA-1 backend === +# +# ==== Security ==== +# +# Due to the SHAttered (https://shattered.io) attack vector on SHA-1 +# it's strongly recommended to use the sha1collisiondetection +# counter-cryptanalysis library for SHA-1 hashing. +# +# If you know that you can trust the repository contents, or where +# potential SHA-1 attacks are otherwise mitigated the other backends +# listed in "SHA-1 implementations" are faster than +# sha1collisiondetection. +# +# ==== Default SHA-1 backend ==== +# +# If no *_SHA1 backend is picked, the first supported one listed in +# "SHA-1 implementations" will be picked. +# +# ==== Options common to all SHA-1 implementations ==== +# +# Define SHA1_MAX_BLOCK_SIZE to limit the amount of data that will be hashed +# in one call to the platform's SHA1_Update(). e.g. APPLE_COMMON_CRYPTO +# wants 'SHA1_MAX_BLOCK_SIZE=1024L*1024L*1024L' defined. +# +# ==== SHA-1 implementations ==== +# +# Define OPENSSL_SHA1 to link to the SHA-1 routines from the OpenSSL +# library. +# +# Define BLK_SHA1 to make use of optimized C SHA-1 routines bundled +# with git (in the block-sha1/ directory). +# +# Define NO_APPLE_COMMON_CRYPTO on OSX to opt-out of using the +# "APPLE_COMMON_CRYPTO" backend for SHA-1, which is currently the +# default on that OS. On macOS 01.4 (Tiger) or older, +# NO_APPLE_COMMON_CRYPTO is defined by default. +# +# If don't enable any of the *_SHA1 settings in this section, Git will +# default to its built-in sha1collisiondetection library, which is a +# collision-detecting sha1 This is slower, but may detect attempted +# collision attacks. +# +# ==== Options for the sha1collisiondetection library ==== +# +# Define DC_SHA1_EXTERNAL if you want to build / link +# git with the external SHA1 collision-detect library. +# Without this option, i.e. the default behavior is to build git with its +# own built-in code (or submodule). +# +# Define DC_SHA1_SUBMODULE to use the +# sha1collisiondetection shipped as a submodule instead of the +# non-submodule copy in sha1dc/. This is an experimental option used +# by the git project to migrate to using sha1collisiondetection as a +# submodule. +# +# === SHA-256 backend === +# +# ==== Security ==== +# +# Unlike SHA-1 the SHA-256 algorithm does not suffer from any known +# vulnerabilities, so any implementation will do. +# +# ==== SHA-256 implementations ==== +# +# Define OPENSSL_SHA256 to use the SHA-256 routines in OpenSSL. +# +# Define NETTLE_SHA256 to use the SHA-256 routines in libnettle. +# +# Define GCRYPT_SHA256 to use the SHA-256 routines in libgcrypt. +# +# If don't enable any of the *_SHA256 settings in this section, Git +# will default to its built-in sha256 implementation. +# +# == DEVELOPER defines == +# # Define DEVELOPER to enable more compiler warnings. Compiler version # and family are auto detected, but could be overridden by defining # COMPILER_FEATURES (see config.mak.dev). You can still set @@ -723,6 +791,7 @@ TEST_BUILTINS_OBJS += test-advise.o TEST_BUILTINS_OBJS += test-bitmap.o TEST_BUILTINS_OBJS += test-bloom.o TEST_BUILTINS_OBJS += test-bundle-uri.o +TEST_BUILTINS_OBJS += test-cache-tree.o TEST_BUILTINS_OBJS += test-chmtime.o TEST_BUILTINS_OBJS += test-config.o TEST_BUILTINS_OBJS += test-crontab.o @@ -1302,11 +1371,53 @@ SP_EXTRA_FLAGS = -Wno-universal-initializer SANITIZE_LEAK = SANITIZE_ADDRESS = -# For the 'coccicheck' target; setting SPATCH_BATCH_SIZE higher will -# usually result in less CPU usage at the cost of higher peak memory. -# Setting it to 0 will feed all files in a single spatch invocation. -SPATCH_FLAGS = --all-includes -SPATCH_BATCH_SIZE = 1 +# For the 'coccicheck' target +SPATCH_INCLUDE_FLAGS = --all-includes +SPATCH_FLAGS = +SPATCH_TEST_FLAGS = + +# If *.o files are present, have "coccicheck" depend on them, with +# COMPUTE_HEADER_DEPENDENCIES this will speed up the common-case of +# only needing to re-generate coccicheck results for the users of a +# given API if it's changed, and not all files in the project. If +# COMPUTE_HEADER_DEPENDENCIES=no this will be unset too. +SPATCH_USE_O_DEPENDENCIES = YesPlease + +# Set SPATCH_CONCAT_COCCI to concatenate the contrib/cocci/*.cocci +# files into a single contrib/cocci/ALL.cocci before running +# "coccicheck". +# +# Pros: +# +# - Speeds up a one-shot run of "make coccicheck", as we won't have to +# parse *.[ch] files N times for the N *.cocci rules +# +# Cons: +# +# - Will make incremental development of *.cocci slower, as +# e.g. changing strbuf.cocci will re-run all *.cocci. +# +# - Makes error and performance analysis harder, as rules will be +# applied from a monolithic ALL.cocci, rather than +# e.g. strbuf.cocci. To work around this either undefine this, or +# generate a specific patch, e.g. this will always use strbuf.cocci, +# not ALL.cocci: +# +# make contrib/coccinelle/strbuf.cocci.patch +SPATCH_CONCAT_COCCI = YesPlease + +# Rebuild 'coccicheck' if $(SPATCH), its flags etc. change +TRACK_SPATCH_DEFINES = +TRACK_SPATCH_DEFINES += $(SPATCH) +TRACK_SPATCH_DEFINES += $(SPATCH_INCLUDE_FLAGS) +TRACK_SPATCH_DEFINES += $(SPATCH_FLAGS) +TRACK_SPATCH_DEFINES += $(SPATCH_TEST_FLAGS) +GIT-SPATCH-DEFINES: FORCE + @FLAGS='$(TRACK_SPATCH_DEFINES)'; \ + if test x"$$FLAGS" != x"`cat GIT-SPATCH-DEFINES 2>/dev/null`" ; then \ + echo >&2 " * new spatch flags"; \ + echo "$$FLAGS" >GIT-SPATCH-DEFINES; \ + fi include config.mak.uname -include config.mak.autogen @@ -1826,7 +1937,6 @@ ifdef APPLE_COMMON_CRYPTO COMPAT_CFLAGS += -DCOMMON_DIGEST_FOR_OPENSSL BASIC_CFLAGS += -DSHA1_APPLE else - DC_SHA1 := YesPlease BASIC_CFLAGS += -DSHA1_DC LIB_OBJS += sha1dc_git.o ifdef DC_SHA1_EXTERNAL @@ -1934,6 +2044,11 @@ endif ifdef NO_REGEX COMPAT_CFLAGS += -Icompat/regex COMPAT_OBJS += compat/regex/regex.o +else +ifdef USE_ENHANCED_BASIC_REGULAR_EXPRESSIONS + COMPAT_CFLAGS += -DUSE_ENHANCED_BASIC_REGULAR_EXPRESSIONS + COMPAT_OBJS += compat/regcomp_enhanced.o +endif endif ifdef NATIVE_CRLF BASIC_CFLAGS += -DNATIVE_CRLF @@ -2989,7 +3104,6 @@ GIT-BUILD-OPTIONS: FORCE @echo NO_REGEX=\''$(subst ','\'',$(subst ','\'',$(NO_REGEX)))'\' >>$@+ @echo NO_UNIX_SOCKETS=\''$(subst ','\'',$(subst ','\'',$(NO_UNIX_SOCKETS)))'\' >>$@+ @echo PAGER_ENV=\''$(subst ','\'',$(subst ','\'',$(PAGER_ENV)))'\' >>$@+ - @echo DC_SHA1=\''$(subst ','\'',$(subst ','\'',$(DC_SHA1)))'\' >>$@+ @echo SANITIZE_LEAK=\''$(subst ','\'',$(subst ','\'',$(SANITIZE_LEAK)))'\' >>$@+ @echo SANITIZE_ADDRESS=\''$(subst ','\'',$(subst ','\'',$(SANITIZE_ADDRESS)))'\' >>$@+ @echo X=\'$(X)\' >>$@+ @@ -3144,35 +3258,113 @@ check: $(GENERATED_H) exit 1; \ fi +COCCI_GEN_ALL = .build/contrib/coccinelle/ALL.cocci +COCCI_GLOB = $(wildcard contrib/coccinelle/*.cocci) +COCCI_RULES_TRACKED = $(COCCI_GLOB:%=.build/%) +COCCI_RULES_TRACKED_NO_PENDING = $(filter-out %.pending.cocci,$(COCCI_RULES_TRACKED)) +COCCI_RULES = +COCCI_RULES += $(COCCI_GEN_ALL) +COCCI_RULES += $(COCCI_RULES_TRACKED) +COCCI_NAMES = +COCCI_NAMES += $(COCCI_RULES:.build/contrib/coccinelle/%.cocci=%) + +COCCICHECK_PENDING = $(filter %.pending.cocci,$(COCCI_RULES)) +COCCICHECK = $(filter-out $(COCCICHECK_PENDING),$(COCCI_RULES)) + +COCCICHECK_PATCHES = $(COCCICHECK:%=%.patch) +COCCICHECK_PATCHES_PENDING = $(COCCICHECK_PENDING:%=%.patch) + +COCCICHECK_PATCHES_INTREE = $(COCCICHECK_PATCHES:.build/%=%) +COCCICHECK_PATCHES_PENDING_INTREE = $(COCCICHECK_PATCHES_PENDING:.build/%=%) + +# It's expensive to compute the many=many rules below, only eval them +# on $(MAKECMDGOALS) that match these $(COCCI_RULES) +COCCI_RULES_GLOB = +COCCI_RULES_GLOB += cocci% +COCCI_RULES_GLOB += .build/contrib/coccinelle/% +COCCI_RULES_GLOB += $(COCCICHECK_PATCHES) +COCCI_RULES_GLOB += $(COCCICHEC_PATCHES_PENDING) +COCCI_RULES_GLOB += $(COCCICHECK_PATCHES_INTREE) +COCCI_RULES_GLOB += $(COCCICHECK_PATCHES_PENDING_INTREE) +COCCI_GOALS = $(filter $(COCCI_RULES_GLOB),$(MAKECMDGOALS)) + COCCI_TEST_RES = $(wildcard contrib/coccinelle/tests/*.res) -%.cocci.patch: %.cocci $(COCCI_SOURCES) - $(QUIET_SPATCH) \ - if test $(SPATCH_BATCH_SIZE) = 0; then \ - limit=; \ - else \ - limit='-n $(SPATCH_BATCH_SIZE)'; \ - fi; \ - if ! echo $(COCCI_SOURCES) | xargs $$limit \ - $(SPATCH) $(SPATCH_FLAGS) \ - --sp-file $< --patch . \ - >$@+ 2>$@.log; \ +$(COCCI_RULES_TRACKED): .build/% : % + $(call mkdir_p_parent_template) + $(QUIET_CP)cp $< $@ + +.build/contrib/coccinelle/FOUND_H_SOURCES: $(FOUND_H_SOURCES) + $(call mkdir_p_parent_template) + $(QUIET_GEN) >$@ + +$(COCCI_GEN_ALL): $(COCCI_RULES_TRACKED_NO_PENDING) + $(call mkdir_p_parent_template) + $(QUIET_SPATCH_CAT)cat $^ >$@ + +ifeq ($(COMPUTE_HEADER_DEPENDENCIES),no) +SPATCH_USE_O_DEPENDENCIES = +endif +define cocci-rule + +## Rule for .build/$(1).patch/$(2); Params: +# $(1) = e.g. ".build/contrib/coccinelle/free.cocci" +# $(2) = e.g. "grep.c" +# $(3) = e.g. "grep.o" +COCCI_$(1:.build/contrib/coccinelle/%.cocci=%) += $(1).d/$(2).patch +$(1).d/$(2).patch: GIT-SPATCH-DEFINES +$(1).d/$(2).patch: $(if $(and $(SPATCH_USE_O_DEPENDENCIES),$(wildcard $(3))),$(3),.build/contrib/coccinelle/FOUND_H_SOURCES) +$(1).d/$(2).patch: $(1) +$(1).d/$(2).patch: $(1).d/%.patch : % + $$(call mkdir_p_parent_template) + $$(QUIET_SPATCH)if ! $$(SPATCH) $$(SPATCH_FLAGS) \ + $$(SPATCH_INCLUDE_FLAGS) \ + --sp-file $(1) --patch . $$< \ + >$$@ 2>$$@.log; \ then \ - cat $@.log; \ + echo "ERROR when applying '$(1)' to '$$<'; '$$@.log' follows:"; \ + cat $$@.log; \ exit 1; \ - fi; \ - mv $@+ $@; \ - if test -s $@; \ + fi +endef + +define cocci-matrix + +$(foreach s,$(COCCI_SOURCES),$(call cocci-rule,$(c),$(s),$(s:%.c=%.o))) +endef + +ifdef COCCI_GOALS +$(eval $(foreach c,$(COCCI_RULES),$(call cocci-matrix,$(c)))) +endif + +define spatch-rule + +.build/contrib/coccinelle/$(1).cocci.patch: $$(COCCI_$(1)) + $$(QUIET_SPATCH_CAT)cat $$^ >$$@ && \ + if test -s $$@; \ then \ - echo ' ' SPATCH result: $@; \ + echo ' ' SPATCH result: $$@; \ fi +contrib/coccinelle/$(1).cocci.patch: .build/contrib/coccinelle/$(1).cocci.patch + $$(QUIET_CP)cp $$< $$@ + +endef + +ifdef COCCI_GOALS +$(eval $(foreach n,$(COCCI_NAMES),$(call spatch-rule,$(n)))) +endif COCCI_TEST_RES_GEN = $(addprefix .build/,$(COCCI_TEST_RES)) +$(COCCI_TEST_RES_GEN): GIT-SPATCH-DEFINES $(COCCI_TEST_RES_GEN): .build/%.res : %.c $(COCCI_TEST_RES_GEN): .build/%.res : %.res +ifdef SPATCH_CONCAT_COCCI +$(COCCI_TEST_RES_GEN): .build/contrib/coccinelle/tests/%.res : $(COCCI_GEN_ALL) +else $(COCCI_TEST_RES_GEN): .build/contrib/coccinelle/tests/%.res : contrib/coccinelle/%.cocci +endif $(call mkdir_p_parent_template) - $(QUIET_SPATCH_T)$(SPATCH) $(SPATCH_FLAGS) \ + $(QUIET_SPATCH_TEST)$(SPATCH) $(SPATCH_TEST_FLAGS) \ --very-quiet --no-show-diff \ --sp-file $< -o $@ \ $(@:.build/%.res=%.c) && \ @@ -3183,11 +3375,15 @@ $(COCCI_TEST_RES_GEN): .build/contrib/coccinelle/tests/%.res : contrib/coccinell coccicheck-test: $(COCCI_TEST_RES_GEN) coccicheck: coccicheck-test -coccicheck: $(addsuffix .patch,$(filter-out %.pending.cocci,$(wildcard contrib/coccinelle/*.cocci))) +ifdef SPATCH_CONCAT_COCCI +coccicheck: contrib/coccinelle/ALL.cocci.patch +else +coccicheck: $(COCCICHECK_PATCHES_INTREE) +endif # See contrib/coccinelle/README coccicheck-pending: coccicheck-test -coccicheck-pending: $(addsuffix .patch,$(wildcard contrib/coccinelle/*.pending.cocci)) +coccicheck-pending: $(COCCICHECK_PATCHES_PENDING_INTREE) .PHONY: coccicheck coccicheck-pending @@ -3454,8 +3650,9 @@ profile-clean: $(RM) $(addsuffix *.gcno,$(addprefix $(PROFILE_DIR)/, $(object_dirs))) cocciclean: + $(RM) GIT-SPATCH-DEFINES $(RM) -r .build/contrib/coccinelle - $(RM) contrib/coccinelle/*.cocci.patch* + $(RM) contrib/coccinelle/*.cocci.patch clean: profile-clean coverage-clean cocciclean $(RM) -r .build @@ -1 +1 @@ -Documentation/RelNotes/2.39.0.txt
\ No newline at end of file +Documentation/RelNotes/2.39.3.txt
\ No newline at end of file diff --git a/add-interactive.c b/add-interactive.c index ecc5ae1b24..00a0f6f96f 100644 --- a/add-interactive.c +++ b/add-interactive.c @@ -530,8 +530,8 @@ static int get_modified_files(struct repository *r, struct collection_status s = { 0 }; int i; - if (discard_index(r->index) < 0 || - repo_read_index_preload(r, ps, 0) < 0) + discard_index(r->index); + if (repo_read_index_preload(r, ps, 0) < 0) return error(_("could not read index")); prefix_item_list_clear(files); @@ -724,7 +724,7 @@ static int run_update(struct add_i_state *s, const struct pathspec *ps, } static void revert_from_diff(struct diff_queue_struct *q, - struct diff_options *opt, void *data) + struct diff_options *opt, void *data UNUSED) { int i, add_flags = ADD_CACHE_OK_TO_ADD | ADD_CACHE_OK_TO_REPLACE; @@ -1156,8 +1156,8 @@ int run_add_i(struct repository *r, const struct pathspec *ps) _("staged"), _("unstaged"), _("path")); opts.list_opts.header = header.buf; - if (discard_index(r->index) < 0 || - repo_read_index(r) < 0 || + discard_index(r->index); + if (repo_read_index(r) < 0 || repo_refresh_and_write_index(r, REFRESH_QUIET, 0, 1, NULL, NULL, NULL) < 0) warning(_("could not refresh index")); diff --git a/add-patch.c b/add-patch.c index 33ecd8398a..a86a92e164 100644 --- a/add-patch.c +++ b/add-patch.c @@ -1750,7 +1750,8 @@ int run_add_p(struct repository *r, enum add_p_mode mode, s.mode = &patch_mode_add; s.revision = revision; - if (discard_index(r->index) < 0 || repo_read_index(r) < 0 || + discard_index(r->index); + if (repo_read_index(r) < 0 || (!s.mode->index_only && repo_refresh_and_write_index(r, REFRESH_QUIET, 0, 1, NULL, NULL, NULL) < 0) || @@ -2913,7 +2913,7 @@ static int apply_one_fragment(struct apply_state *state, break; case ' ': if (plen && (ws_rule & WS_BLANK_AT_EOF) && - ws_blank_line(patch + 1, plen, ws_rule)) + ws_blank_line(patch + 1, plen)) is_blank_context = 1; /* fallthrough */ case '-': @@ -2942,7 +2942,7 @@ static int apply_one_fragment(struct apply_state *state, (first == '+' ? 0 : LINE_COMMON)); if (first == '+' && (ws_rule & WS_BLANK_AT_EOF) && - ws_blank_line(patch + 1, plen, ws_rule)) + ws_blank_line(patch + 1, plen)) added_blank_line = 1; break; case '@': case '\\': @@ -4418,6 +4418,33 @@ static int create_one_file(struct apply_state *state, if (state->cached) return 0; + /* + * We already try to detect whether files are beyond a symlink in our + * up-front checks. But in the case where symlinks are created by any + * of the intermediate hunks it can happen that our up-front checks + * didn't yet see the symlink, but at the point of arriving here there + * in fact is one. We thus repeat the check for symlinks here. + * + * Note that this does not make the up-front check obsolete as the + * failure mode is different: + * + * - The up-front checks cause us to abort before we have written + * anything into the working directory. So when we exit this way the + * working directory remains clean. + * + * - The checks here happen in the middle of the action where we have + * already started to apply the patch. The end result will be a dirty + * working directory. + * + * Ideally, we should update the up-front checks to catch what would + * happen when we apply the patch before we damage the working tree. + * We have all the information necessary to do so. But for now, as a + * part of embargoed security work, having this check would serve as a + * reasonable first step. + */ + if (path_is_beyond_symlink(state, path)) + return error(_("affected file '%s' is beyond a symbolic link"), path); + res = try_create_file(state, path, mode, buf, size); if (res < 0) return -1; @@ -4549,7 +4576,7 @@ static int write_out_one_reject(struct apply_state *state, struct patch *patch) FILE *rej; char namebuf[PATH_MAX]; struct fragment *frag; - int cnt = 0; + int fd, cnt = 0; struct strbuf sb = STRBUF_INIT; for (cnt = 0, frag = patch->fragments; frag; frag = frag->next) { @@ -4589,7 +4616,17 @@ static int write_out_one_reject(struct apply_state *state, struct patch *patch) memcpy(namebuf, patch->new_name, cnt); memcpy(namebuf + cnt, ".rej", 5); - rej = fopen(namebuf, "w"); + fd = open(namebuf, O_CREAT | O_EXCL | O_WRONLY, 0666); + if (fd < 0) { + if (errno != EEXIST) + return error_errno(_("cannot open %s"), namebuf); + if (unlink(namebuf)) + return error_errno(_("cannot unlink '%s'"), namebuf); + fd = open(namebuf, O_CREAT | O_EXCL | O_WRONLY, 0666); + if (fd < 0) + return error_errno(_("cannot open %s"), namebuf); + } + rej = fdopen(fd, "w"); if (!rej) return error_errno(_("cannot open %s"), namebuf); @@ -24,7 +24,7 @@ static const char git_attr__unknown[] = "(builtin)unknown"; #define ATTR__UNKNOWN git_attr__unknown struct git_attr { - int attr_nr; /* unique attribute number */ + unsigned int attr_nr; /* unique attribute number */ char name[FLEX_ARRAY]; /* attribute name */ }; @@ -206,7 +206,7 @@ static void report_invalid_attr(const char *name, size_t len, * dictionary. If no entry is found, create a new attribute and store it in * the dictionary. */ -static const struct git_attr *git_attr_internal(const char *name, int namelen) +static const struct git_attr *git_attr_internal(const char *name, size_t namelen) { struct git_attr *a; @@ -222,8 +222,8 @@ static const struct git_attr *git_attr_internal(const char *name, int namelen) a->attr_nr = hashmap_get_size(&g_attr_hashmap.map); attr_hashmap_add(&g_attr_hashmap, a->name, namelen, a); - assert(a->attr_nr == - (hashmap_get_size(&g_attr_hashmap.map) - 1)); + if (a->attr_nr != hashmap_get_size(&g_attr_hashmap.map) - 1) + die(_("unable to add additional attribute")); } hashmap_unlock(&g_attr_hashmap); @@ -268,7 +268,7 @@ struct match_attr { const struct git_attr *attr; } u; char is_macro; - unsigned num_attr; + size_t num_attr; struct attr_state state[FLEX_ARRAY]; }; @@ -289,7 +289,7 @@ static const char *parse_attr(const char *src, int lineno, const char *cp, struct attr_state *e) { const char *ep, *equals; - int len; + size_t len; ep = cp + strcspn(cp, blank); equals = strchr(cp, '='); @@ -333,8 +333,7 @@ static const char *parse_attr(const char *src, int lineno, const char *cp, static struct match_attr *parse_attr_line(const char *line, const char *src, int lineno, unsigned flags) { - int namelen; - int num_attr, i; + size_t namelen, num_attr, i; const char *cp, *name, *states; struct match_attr *res = NULL; int is_macro; @@ -345,6 +344,11 @@ static struct match_attr *parse_attr_line(const char *line, const char *src, return NULL; name = cp; + if (strlen(line) >= ATTR_MAX_LINE_LENGTH) { + warning(_("ignoring overly long attributes line %d"), lineno); + return NULL; + } + if (*cp == '"' && !unquote_c_style(&pattern, name, &states)) { name = pattern.buf; namelen = pattern.len; @@ -381,10 +385,9 @@ static struct match_attr *parse_attr_line(const char *line, const char *src, goto fail_return; } - res = xcalloc(1, - sizeof(*res) + - sizeof(struct attr_state) * num_attr + - (is_macro ? 0 : namelen + 1)); + res = xcalloc(1, st_add3(sizeof(*res), + st_mult(sizeof(struct attr_state), num_attr), + is_macro ? 0 : namelen + 1)); if (is_macro) { res->u.attr = git_attr_internal(name, namelen); } else { @@ -447,11 +450,12 @@ struct attr_stack { static void attr_stack_free(struct attr_stack *e) { - int i; + unsigned i; free(e->origin); for (i = 0; i < e->num_matches; i++) { struct match_attr *a = e->attrs[i]; - int j; + size_t j; + for (j = 0; j < a->num_attr; j++) { const char *setto = a->state[j].setto; if (setto == ATTR__TRUE || @@ -660,8 +664,8 @@ static void handle_attr_line(struct attr_stack *res, a = parse_attr_line(line, src, lineno, flags); if (!a) return; - ALLOC_GROW(res->attrs, res->num_matches + 1, res->alloc); - res->attrs[res->num_matches++] = a; + ALLOC_GROW_BY(res->attrs, res->num_matches, 1, res->alloc); + res->attrs[res->num_matches - 1] = a; } static struct attr_stack *read_attr_from_array(const char **list) @@ -701,11 +705,12 @@ void git_attr_set_direction(enum git_attr_direction new_direction) static struct attr_stack *read_attr_from_file(const char *path, unsigned flags) { + struct strbuf buf = STRBUF_INIT; int fd; FILE *fp; struct attr_stack *res; - char buf[2048]; int lineno = 0; + struct stat st; if (flags & READ_ATTR_NOFOLLOW) fd = open_nofollow(path, O_RDONLY); @@ -717,15 +722,26 @@ static struct attr_stack *read_attr_from_file(const char *path, unsigned flags) return NULL; } fp = xfdopen(fd, "r"); + if (fstat(fd, &st)) { + warning_errno(_("cannot fstat gitattributes file '%s'"), path); + fclose(fp); + return NULL; + } + if (st.st_size >= ATTR_MAX_FILE_SIZE) { + warning(_("ignoring overly large gitattributes file '%s'"), path); + fclose(fp); + return NULL; + } CALLOC_ARRAY(res, 1); - while (fgets(buf, sizeof(buf), fp)) { - char *bufp = buf; - if (!lineno) - skip_utf8_bom(&bufp, strlen(bufp)); - handle_attr_line(res, bufp, path, ++lineno, flags); + while (strbuf_getline(&buf, fp) != EOF) { + if (!lineno && starts_with(buf.buf, utf8_bom)) + strbuf_remove(&buf, 0, strlen(utf8_bom)); + handle_attr_line(res, buf.buf, path, ++lineno, flags); } + fclose(fp); + strbuf_release(&buf); return res; } @@ -736,6 +752,7 @@ static struct attr_stack *read_attr_from_index(struct index_state *istate, struct attr_stack *res; char *buf, *sp; int lineno = 0; + unsigned long size; if (!istate) return NULL; @@ -754,9 +771,13 @@ static struct attr_stack *read_attr_from_index(struct index_state *istate, if (!path_in_cone_mode_sparse_checkout(path, istate)) return NULL; - buf = read_blob_data_from_index(istate, path, NULL); + buf = read_blob_data_from_index(istate, path, &size); if (!buf) return NULL; + if (size >= ATTR_MAX_FILE_SIZE) { + warning(_("ignoring overly large gitattributes blob '%s'"), path); + return NULL; + } CALLOC_ARRAY(res, 1); for (sp = buf; *sp; ) { @@ -999,12 +1020,12 @@ static int macroexpand_one(struct all_attrs_item *all_attrs, int nr, int rem); static int fill_one(struct all_attrs_item *all_attrs, const struct match_attr *a, int rem) { - int i; + size_t i; - for (i = a->num_attr - 1; rem > 0 && i >= 0; i--) { - const struct git_attr *attr = a->state[i].attr; + for (i = a->num_attr; rem > 0 && i > 0; i--) { + const struct git_attr *attr = a->state[i - 1].attr; const char **n = &(all_attrs[attr->attr_nr].value); - const char *v = a->state[i].setto; + const char *v = a->state[i - 1].setto; if (*n == ATTR__UNKNOWN) { *n = v; @@ -1020,11 +1041,11 @@ static int fill(const char *path, int pathlen, int basename_offset, struct all_attrs_item *all_attrs, int rem) { for (; rem > 0 && stack; stack = stack->prev) { - int i; + unsigned i; const char *base = stack->origin ? stack->origin : ""; - for (i = stack->num_matches - 1; 0 < rem && 0 <= i; i--) { - const struct match_attr *a = stack->attrs[i]; + for (i = stack->num_matches; 0 < rem && 0 < i; i--) { + const struct match_attr *a = stack->attrs[i - 1]; if (a->is_macro) continue; if (path_matches(path, pathlen, basename_offset, @@ -1055,11 +1076,11 @@ static void determine_macros(struct all_attrs_item *all_attrs, const struct attr_stack *stack) { for (; stack; stack = stack->prev) { - int i; - for (i = stack->num_matches - 1; i >= 0; i--) { - const struct match_attr *ma = stack->attrs[i]; + unsigned i; + for (i = stack->num_matches; i > 0; i--) { + const struct match_attr *ma = stack->attrs[i - 1]; if (ma->is_macro) { - int n = ma->u.attr->attr_nr; + unsigned int n = ma->u.attr->attr_nr; if (!all_attrs[n].macro) { all_attrs[n].macro = ma; } @@ -1111,7 +1132,7 @@ void git_check_attr(struct index_state *istate, collect_some_attrs(istate, path, check); for (i = 0; i < check->nr; i++) { - size_t n = check->items[i].attr->attr_nr; + unsigned int n = check->items[i].attr->attr_nr; const char *value = check->all_attrs[n].value; if (value == ATTR__UNKNOWN) value = ATTR__UNSET; @@ -107,6 +107,18 @@ * - Free the `attr_check` struct by calling `attr_check_free()`. */ +/** + * The maximum line length for a gitattributes file. If the line exceeds this + * length we will ignore it. + */ +#define ATTR_MAX_LINE_LENGTH 2048 + + /** + * The maximum size of the giattributes file. If the file exceeds this size we + * will ignore it. + */ +#define ATTR_MAX_FILE_SIZE (100 * 1024 * 1024) + struct index_state; /** @@ -13,8 +13,7 @@ struct blob *lookup_blob(struct repository *r, const struct object_id *oid) return object_as_type(obj, OBJ_BLOB, 0); } -int parse_blob_buffer(struct blob *item, void *buffer, unsigned long size) +void parse_blob_buffer(struct blob *item) { item->object.parsed = 1; - return 0; } @@ -11,8 +11,6 @@ struct blob { struct blob *lookup_blob(struct repository *r, const struct object_id *oid); -int parse_blob_buffer(struct blob *item, void *buffer, unsigned long size); - /** * Blobs do not contain references to other objects and do not have * structured data that needs parsing. However, code may use the @@ -21,5 +19,6 @@ int parse_blob_buffer(struct blob *item, void *buffer, unsigned long size); * parse_blob_buffer() is used (by object.c) to flag that the object * has been read successfully from the database. **/ +void parse_blob_buffer(struct blob *item); #endif /* BLOB_H */ diff --git a/builtin/add.c b/builtin/add.c index 626c71ec6a..190d1a692a 100644 --- a/builtin/add.c +++ b/builtin/add.c @@ -3,7 +3,7 @@ * * Copyright (C) 2006 Linus Torvalds */ -#define USE_THE_INDEX_COMPATIBILITY_MACROS +#define USE_THE_INDEX_VARIABLE #include "cache.h" #include "config.h" #include "builtin.h" @@ -42,8 +42,8 @@ static int chmod_pathspec(struct pathspec *pathspec, char flip, int show_only) { int i, ret = 0; - for (i = 0; i < active_nr; i++) { - struct cache_entry *ce = active_cache[i]; + for (i = 0; i < the_index.cache_nr; i++) { + struct cache_entry *ce = the_index.cache[i]; int err; if (!include_sparse && @@ -55,7 +55,7 @@ static int chmod_pathspec(struct pathspec *pathspec, char flip, int show_only) continue; if (!show_only) - err = chmod_cache_entry(ce, flip); + err = chmod_index_entry(&the_index, ce, flip); else err = S_ISREG(ce->ce_mode) ? 0 : -1; @@ -88,7 +88,7 @@ static int fix_unmerged_status(struct diff_filepair *p, } static void update_callback(struct diff_queue_struct *q, - struct diff_options *opt, void *cbdata) + struct diff_options *opt UNUSED, void *cbdata) { int i; struct update_callback_data *data = cbdata; @@ -159,8 +159,8 @@ static int renormalize_tracked_files(const struct pathspec *pathspec, int flags) { int i, retval = 0; - for (i = 0; i < active_nr; i++) { - struct cache_entry *ce = active_cache[i]; + for (i = 0; i < the_index.cache_nr; i++) { + struct cache_entry *ce = the_index.cache[i]; if (!include_sparse && (ce_skip_worktree(ce) || @@ -172,7 +172,8 @@ static int renormalize_tracked_files(const struct pathspec *pathspec, int flags) continue; /* do not touch non blobs */ if (pathspec && !ce_path_match(&the_index, ce, pathspec, NULL)) continue; - retval |= add_file_to_cache(ce->name, flags | ADD_CACHE_RENORMALIZE); + retval |= add_file_to_index(&the_index, ce->name, + flags | ADD_CACHE_RENORMALIZE); } return retval; @@ -311,7 +312,7 @@ static int edit_patch(int argc, const char **argv, const char *prefix) git_config(git_diff_basic_config, NULL); /* no "diff" UI options */ - if (read_cache() < 0) + if (repo_read_index(the_repository) < 0) die(_("Could not read the index")); repo_init_revisions(the_repository, &rev, prefix); @@ -543,7 +544,7 @@ int cmd_add(int argc, const char **argv, const char *prefix) prepare_repo_settings(the_repository); the_repository->settings.command_requires_full_index = 0; - hold_locked_index(&lock_file, LOCK_DIE_ON_ERROR); + repo_hold_locked_index(the_repository, &lock_file, LOCK_DIE_ON_ERROR); /* * Check the "pathspec '%s' did not match any files" block @@ -586,7 +587,7 @@ int cmd_add(int argc, const char **argv, const char *prefix) (!(addremove || take_worktree_changes) ? ADD_CACHE_IGNORE_REMOVAL : 0)); - if (read_cache_preload(&pathspec) < 0) + if (repo_read_index_preload(the_repository, &pathspec, 0) < 0) die(_("index file corrupt")); die_in_unpopulated_submodule(&the_index, prefix); diff --git a/builtin/am.c b/builtin/am.c index 20aea0d248..dddf1b9af0 100644 --- a/builtin/am.c +++ b/builtin/am.c @@ -1476,6 +1476,7 @@ static int run_apply(const struct am_state *state, const char *index_file) int res, opts_left; int force_apply = 0; int options = 0; + const char **apply_argv; if (init_apply_state(&apply_state, the_repository, NULL)) BUG("init_apply_state() failed"); @@ -1483,7 +1484,15 @@ static int run_apply(const struct am_state *state, const char *index_file) strvec_push(&apply_opts, "apply"); strvec_pushv(&apply_opts, state->git_apply_opts.v); - opts_left = apply_parse_options(apply_opts.nr, apply_opts.v, + /* + * Build a copy that apply_parse_options() can rearrange. + * apply_opts.v keeps referencing the allocated strings for + * strvec_clear() to release. + */ + ALLOC_ARRAY(apply_argv, apply_opts.nr); + COPY_ARRAY(apply_argv, apply_opts.v, apply_opts.nr); + + opts_left = apply_parse_options(apply_opts.nr, apply_argv, &apply_state, &force_apply, &options, NULL); @@ -1513,14 +1522,15 @@ static int run_apply(const struct am_state *state, const char *index_file) strvec_clear(&apply_paths); strvec_clear(&apply_opts); clear_apply_state(&apply_state); + free(apply_argv); if (res) return res; if (index_file) { /* Reload index as apply_all_patches() will have modified it. */ - discard_cache(); - read_cache_from(index_file); + discard_index(&the_index); + read_index_from(&the_index, index_file, get_git_dir()); } return 0; @@ -1562,8 +1572,8 @@ static int fall_back_threeway(const struct am_state *state, const char *index_pa if (build_fake_ancestor(state, index_path)) return error("could not build fake ancestor"); - discard_cache(); - read_cache_from(index_path); + discard_index(&the_index); + read_index_from(&the_index, index_path, get_git_dir()); if (write_index_as_tree(&orig_tree, &the_index, index_path, 0, NULL)) return error(_("Repository lacks necessary blobs to fall back on 3-way merge.")); @@ -1596,8 +1606,8 @@ static int fall_back_threeway(const struct am_state *state, const char *index_pa say(state, stdout, _("Falling back to patching base and 3-way merge...")); - discard_cache(); - read_cache(); + discard_index(&the_index); + repo_read_index(the_repository); /* * This is not so wrong. Depending on which base we picked, orig_tree @@ -1781,7 +1791,8 @@ static void am_run(struct am_state *state, int resume) unlink(am_path(state, "dirtyindex")); - if (refresh_and_write_cache(REFRESH_QUIET, 0, 0) < 0) + if (repo_refresh_and_write_index(the_repository, REFRESH_QUIET, 0, 0, + NULL, NULL, NULL) < 0) die(_("unable to write index file")); if (repo_index_has_changes(the_repository, NULL, &sb)) { @@ -1930,7 +1941,7 @@ static void am_resolve(struct am_state *state, int allow_empty) } } - if (unmerged_cache()) { + if (unmerged_index(&the_index)) { printf_ln(_("You still have unmerged paths in your index.\n" "You should 'git add' each file with resolved conflicts to mark them as such.\n" "You might run `git rm` on a file to accept \"deleted by them\" for it.")); @@ -1967,9 +1978,9 @@ static int fast_forward_to(struct tree *head, struct tree *remote, int reset) if (parse_tree(head) || parse_tree(remote)) return -1; - hold_locked_index(&lock_file, LOCK_DIE_ON_ERROR); + repo_hold_locked_index(the_repository, &lock_file, LOCK_DIE_ON_ERROR); - refresh_cache(REFRESH_QUIET); + refresh_index(&the_index, REFRESH_QUIET, NULL, NULL, NULL); memset(&opts, 0, sizeof(opts)); opts.head_idx = 1; @@ -2007,7 +2018,7 @@ static int merge_tree(struct tree *tree) if (parse_tree(tree)) return -1; - hold_locked_index(&lock_file, LOCK_DIE_ON_ERROR); + repo_hold_locked_index(the_repository, &lock_file, LOCK_DIE_ON_ERROR); memset(&opts, 0, sizeof(opts)); opts.head_idx = 1; @@ -2045,7 +2056,7 @@ static int clean_index(const struct object_id *head, const struct object_id *rem if (!remote_tree) return error(_("Could not parse object '%s'."), oid_to_hex(remote)); - read_cache_unmerged(); + repo_read_index_unmerged(the_repository); if (fast_forward_to(head_tree, head_tree, 1)) return -1; diff --git a/builtin/bisect--helper.c b/builtin/bisect--helper.c index 1d2ce8a0e1..6e41cbdb2d 100644 --- a/builtin/bisect--helper.c +++ b/builtin/bisect--helper.c @@ -1279,115 +1279,144 @@ static int bisect_run(struct bisect_terms *terms, const char **argv, int argc) return res; } +static int cmd_bisect__reset(int argc, const char **argv, const char *prefix UNUSED) +{ + if (argc > 1) + return error(_("--bisect-reset requires either no argument or a commit")); + return bisect_reset(argc ? argv[0] : NULL); +} + +static int cmd_bisect__terms(int argc, const char **argv, const char *prefix UNUSED) +{ + int res; + struct bisect_terms terms = { 0 }; + + if (argc > 1) + return error(_("--bisect-terms requires 0 or 1 argument")); + res = bisect_terms(&terms, argc == 1 ? argv[0] : NULL); + free_terms(&terms); + return res; +} + +static int cmd_bisect__start(int argc, const char **argv, const char *prefix UNUSED) +{ + int res; + struct bisect_terms terms = { 0 }; + + set_terms(&terms, "bad", "good"); + res = bisect_start(&terms, argv, argc); + free_terms(&terms); + return res; +} + +static int cmd_bisect__next(int argc, const char **argv UNUSED, const char *prefix) +{ + int res; + struct bisect_terms terms = { 0 }; + + if (argc) + return error(_("--bisect-next requires 0 arguments")); + get_terms(&terms); + res = bisect_next(&terms, prefix); + free_terms(&terms); + return res; +} + +static int cmd_bisect__state(int argc, const char **argv, const char *prefix UNUSED) +{ + int res; + struct bisect_terms terms = { 0 }; + + set_terms(&terms, "bad", "good"); + get_terms(&terms); + res = bisect_state(&terms, argv, argc); + free_terms(&terms); + return res; +} + +static int cmd_bisect__log(int argc, const char **argv UNUSED, const char *prefix UNUSED) +{ + if (argc) + return error(_("--bisect-log requires 0 arguments")); + return bisect_log(); +} + +static int cmd_bisect__replay(int argc, const char **argv, const char *prefix UNUSED) +{ + int res; + struct bisect_terms terms = { 0 }; + + if (argc != 1) + return error(_("no logfile given")); + set_terms(&terms, "bad", "good"); + res = bisect_replay(&terms, argv[0]); + free_terms(&terms); + return res; +} + +static int cmd_bisect__skip(int argc, const char **argv, const char *prefix UNUSED) +{ + int res; + struct bisect_terms terms = { 0 }; + + set_terms(&terms, "bad", "good"); + get_terms(&terms); + res = bisect_skip(&terms, argv, argc); + free_terms(&terms); + return res; +} + +static int cmd_bisect__visualize(int argc, const char **argv, const char *prefix UNUSED) +{ + int res; + struct bisect_terms terms = { 0 }; + + get_terms(&terms); + res = bisect_visualize(&terms, argv, argc); + free_terms(&terms); + return res; +} + +static int cmd_bisect__run(int argc, const char **argv, const char *prefix UNUSED) +{ + int res; + struct bisect_terms terms = { 0 }; + + if (!argc) + return error(_("bisect run failed: no command provided.")); + get_terms(&terms); + res = bisect_run(&terms, argv, argc); + free_terms(&terms); + return res; +} + int cmd_bisect__helper(int argc, const char **argv, const char *prefix) { - enum { - BISECT_RESET = 1, - BISECT_NEXT_CHECK, - BISECT_TERMS, - BISECT_START, - BISECT_AUTOSTART, - BISECT_NEXT, - BISECT_STATE, - BISECT_LOG, - BISECT_REPLAY, - BISECT_SKIP, - BISECT_VISUALIZE, - BISECT_RUN, - } cmdmode = 0; - int res = 0, nolog = 0; + int res = 0; + parse_opt_subcommand_fn *fn = NULL; struct option options[] = { - OPT_CMDMODE(0, "bisect-reset", &cmdmode, - N_("reset the bisection state"), BISECT_RESET), - OPT_CMDMODE(0, "bisect-next-check", &cmdmode, - N_("check whether bad or good terms exist"), BISECT_NEXT_CHECK), - OPT_CMDMODE(0, "bisect-terms", &cmdmode, - N_("print out the bisect terms"), BISECT_TERMS), - OPT_CMDMODE(0, "bisect-start", &cmdmode, - N_("start the bisect session"), BISECT_START), - OPT_CMDMODE(0, "bisect-next", &cmdmode, - N_("find the next bisection commit"), BISECT_NEXT), - OPT_CMDMODE(0, "bisect-state", &cmdmode, - N_("mark the state of ref (or refs)"), BISECT_STATE), - OPT_CMDMODE(0, "bisect-log", &cmdmode, - N_("list the bisection steps so far"), BISECT_LOG), - OPT_CMDMODE(0, "bisect-replay", &cmdmode, - N_("replay the bisection process from the given file"), BISECT_REPLAY), - OPT_CMDMODE(0, "bisect-skip", &cmdmode, - N_("skip some commits for checkout"), BISECT_SKIP), - OPT_CMDMODE(0, "bisect-visualize", &cmdmode, - N_("visualize the bisection"), BISECT_VISUALIZE), - OPT_CMDMODE(0, "bisect-run", &cmdmode, - N_("use <cmd>... to automatically bisect"), BISECT_RUN), - OPT_BOOL(0, "no-log", &nolog, - N_("no log for BISECT_WRITE")), + OPT_SUBCOMMAND("reset", &fn, cmd_bisect__reset), + OPT_SUBCOMMAND("terms", &fn, cmd_bisect__terms), + OPT_SUBCOMMAND("start", &fn, cmd_bisect__start), + OPT_SUBCOMMAND("next", &fn, cmd_bisect__next), + OPT_SUBCOMMAND("state", &fn, cmd_bisect__state), + OPT_SUBCOMMAND("log", &fn, cmd_bisect__log), + OPT_SUBCOMMAND("replay", &fn, cmd_bisect__replay), + OPT_SUBCOMMAND("skip", &fn, cmd_bisect__skip), + OPT_SUBCOMMAND("visualize", &fn, cmd_bisect__visualize), + OPT_SUBCOMMAND("view", &fn, cmd_bisect__visualize), + OPT_SUBCOMMAND("run", &fn, cmd_bisect__run), OPT_END() }; - struct bisect_terms terms = { .term_good = NULL, .term_bad = NULL }; - argc = parse_options(argc, argv, prefix, options, - git_bisect_helper_usage, - PARSE_OPT_KEEP_DASHDASH | PARSE_OPT_KEEP_UNKNOWN_OPT); + git_bisect_helper_usage, 0); - if (!cmdmode) + if (!fn) usage_with_options(git_bisect_helper_usage, options); + argc--; + argv++; - switch (cmdmode) { - case BISECT_RESET: - if (argc > 1) - return error(_("--bisect-reset requires either no argument or a commit")); - res = bisect_reset(argc ? argv[0] : NULL); - break; - case BISECT_TERMS: - if (argc > 1) - return error(_("--bisect-terms requires 0 or 1 argument")); - res = bisect_terms(&terms, argc == 1 ? argv[0] : NULL); - break; - case BISECT_START: - set_terms(&terms, "bad", "good"); - res = bisect_start(&terms, argv, argc); - break; - case BISECT_NEXT: - if (argc) - return error(_("--bisect-next requires 0 arguments")); - get_terms(&terms); - res = bisect_next(&terms, prefix); - break; - case BISECT_STATE: - set_terms(&terms, "bad", "good"); - get_terms(&terms); - res = bisect_state(&terms, argv, argc); - break; - case BISECT_LOG: - if (argc) - return error(_("--bisect-log requires 0 arguments")); - res = bisect_log(); - break; - case BISECT_REPLAY: - if (argc != 1) - return error(_("no logfile given")); - set_terms(&terms, "bad", "good"); - res = bisect_replay(&terms, argv[0]); - break; - case BISECT_SKIP: - set_terms(&terms, "bad", "good"); - get_terms(&terms); - res = bisect_skip(&terms, argv, argc); - break; - case BISECT_VISUALIZE: - get_terms(&terms); - res = bisect_visualize(&terms, argv, argc); - break; - case BISECT_RUN: - if (!argc) - return error(_("bisect run failed: no command provided.")); - get_terms(&terms); - res = bisect_run(&terms, argv, argc); - break; - default: - BUG("unknown subcommand %d", cmdmode); - } - free_terms(&terms); + res = fn(argc, argv, prefix); /* * Handle early success diff --git a/builtin/branch.c b/builtin/branch.c index 15be0c03ef..f63fd45edb 100644 --- a/builtin/branch.c +++ b/builtin/branch.c @@ -150,7 +150,7 @@ static int branch_merged(int kind, const char *name, if (!reference_rev) reference_rev = head_rev; - merged = in_merge_bases(rev, reference_rev); + merged = reference_rev ? in_merge_bases(rev, reference_rev) : 0; /* * After the safety valve is fully redefined to "check with @@ -160,7 +160,7 @@ static int branch_merged(int kind, const char *name, * a gentle reminder is in order. */ if ((head_rev != reference_rev) && - in_merge_bases(rev, head_rev) != merged) { + (head_rev ? in_merge_bases(rev, head_rev) : 0) != merged) { if (merged) warning(_("deleting branch '%s' that has been merged to\n" " '%s', but not yet merged to HEAD."), @@ -235,11 +235,8 @@ static int delete_branches(int argc, const char **argv, int force, int kinds, } branch_name_pos = strcspn(fmt, "%"); - if (!force) { + if (!force) head_rev = lookup_commit_reference(the_repository, &head_oid); - if (!head_rev) - die(_("Couldn't look up commit object for HEAD")); - } for (i = 0; i < argc; i++, strbuf_reset(&bname)) { char *target = NULL; @@ -584,13 +581,13 @@ static void copy_or_rename_branch(const char *oldname, const char *newname, int strbuf_release(&logmsg); strbuf_addf(&oldsection, "branch.%s", interpreted_oldname); - strbuf_release(&oldref); strbuf_addf(&newsection, "branch.%s", interpreted_newname); - strbuf_release(&newref); if (!copy && git_config_rename_section(oldsection.buf, newsection.buf) < 0) die(_("Branch is renamed, but update of config-file failed")); - if (copy && strcmp(oldname, newname) && git_config_copy_section(oldsection.buf, newsection.buf) < 0) + if (copy && strcmp(interpreted_oldname, interpreted_newname) && git_config_copy_section(oldsection.buf, newsection.buf) < 0) die(_("Branch is copied, but update of config-file failed")); + strbuf_release(&oldref); + strbuf_release(&newref); strbuf_release(&oldsection); strbuf_release(&newsection); } diff --git a/builtin/bundle.c b/builtin/bundle.c index c12c09f854..acceef6200 100644 --- a/builtin/bundle.c +++ b/builtin/bundle.c @@ -55,13 +55,12 @@ static int parse_options_cmd_bundle(int argc, const char * const usagestr[], const struct option options[], char **bundle_file) { - int newargc; - newargc = parse_options(argc, argv, NULL, options, usagestr, + argc = parse_options(argc, argv, NULL, options, usagestr, PARSE_OPT_STOP_AT_NON_OPTION); - if (argc < 1) - usage_with_options(usagestr, options); + if (!argc) + usage_msg_opt(_("need a <file> argument"), usagestr, options); *bundle_file = prefix_filename(prefix, argv[0]); - return newargc; + return argc; } static int cmd_bundle_create(int argc, const char **argv, const char *prefix) { diff --git a/builtin/cat-file.c b/builtin/cat-file.c index fa7bd89169..b3be58b1fb 100644 --- a/builtin/cat-file.c +++ b/builtin/cat-file.c @@ -3,7 +3,7 @@ * * Copyright (C) Linus Torvalds, 2005 */ -#define USE_THE_INDEX_COMPATIBILITY_MACROS +#define USE_THE_INDEX_VARIABLE #include "cache.h" #include "config.h" #include "builtin.h" diff --git a/builtin/check-attr.c b/builtin/check-attr.c index dd83397786..0fef10eb6b 100644 --- a/builtin/check-attr.c +++ b/builtin/check-attr.c @@ -1,4 +1,4 @@ -#define USE_THE_INDEX_COMPATIBILITY_MACROS +#define USE_THE_INDEX_VARIABLE #include "builtin.h" #include "cache.h" #include "config.h" @@ -115,7 +115,7 @@ int cmd_check_attr(int argc, const char **argv, const char *prefix) argc = parse_options(argc, argv, prefix, check_attr_options, check_attr_usage, PARSE_OPT_KEEP_DASHDASH); - if (read_cache() < 0) { + if (repo_read_index(the_repository) < 0) { die("invalid cache"); } diff --git a/builtin/check-ignore.c b/builtin/check-ignore.c index 2191256965..ab776061c7 100644 --- a/builtin/check-ignore.c +++ b/builtin/check-ignore.c @@ -1,4 +1,4 @@ -#define USE_THE_INDEX_COMPATIBILITY_MACROS +#define USE_THE_INDEX_VARIABLE #include "builtin.h" #include "cache.h" #include "config.h" @@ -179,7 +179,7 @@ int cmd_check_ignore(int argc, const char **argv, const char *prefix) die(_("--non-matching is only valid with --verbose")); /* read_cache() is only necessary so we can watch out for submodules. */ - if (!no_index && read_cache() < 0) + if (!no_index && repo_read_index(the_repository) < 0) die(_("index file corrupt")); setup_standard_excludes(&dir); diff --git a/builtin/checkout-index.c b/builtin/checkout-index.c index 97e06e8c52..cf6fba97ba 100644 --- a/builtin/checkout-index.c +++ b/builtin/checkout-index.c @@ -4,7 +4,7 @@ * Copyright (C) 2005 Linus Torvalds * */ -#define USE_THE_INDEX_COMPATIBILITY_MACROS +#define USE_THE_INDEX_VARIABLE #include "builtin.h" #include "config.h" #include "dir.h" @@ -65,7 +65,7 @@ static void write_tempfile_record(const char *name, const char *prefix) static int checkout_file(const char *name, const char *prefix) { int namelen = strlen(name); - int pos = cache_name_pos(name, namelen); + int pos = index_name_pos(&the_index, name, namelen); int has_same_name = 0; int is_file = 0; int is_skipped = 1; @@ -75,8 +75,8 @@ static int checkout_file(const char *name, const char *prefix) if (pos < 0) pos = -pos - 1; - while (pos < active_nr) { - struct cache_entry *ce = active_cache[pos]; + while (pos < the_index.cache_nr) { + struct cache_entry *ce = the_index.cache[pos]; if (ce_namelen(ce) != namelen || memcmp(ce->name, name, namelen)) break; @@ -136,8 +136,8 @@ static int checkout_all(const char *prefix, int prefix_length) int i, errs = 0; struct cache_entry *last_ce = NULL; - for (i = 0; i < active_nr ; i++) { - struct cache_entry *ce = active_cache[i]; + for (i = 0; i < the_index.cache_nr ; i++) { + struct cache_entry *ce = the_index.cache[i]; if (S_ISSPARSEDIR(ce->ce_mode)) { if (!ce_skip_worktree(ce)) @@ -151,7 +151,7 @@ static int checkout_all(const char *prefix, int prefix_length) */ if (ignore_skip_worktree) { ensure_full_index(&the_index); - ce = active_cache[i]; + ce = the_index.cache[i]; } } @@ -249,7 +249,7 @@ int cmd_checkout_index(int argc, const char **argv, const char *prefix) prepare_repo_settings(the_repository); the_repository->settings.command_requires_full_index = 0; - if (read_cache() < 0) { + if (repo_read_index(the_repository) < 0) { die("invalid cache"); } @@ -270,7 +270,8 @@ int cmd_checkout_index(int argc, const char **argv, const char *prefix) if (index_opt && !state.base_dir_len && !to_tempfile) { state.refresh_cache = 1; state.istate = &the_index; - hold_locked_index(&lock_file, LOCK_DIE_ON_ERROR); + repo_hold_locked_index(the_repository, &lock_file, + LOCK_DIE_ON_ERROR); } get_parallel_checkout_configs(&pc_workers, &pc_threshold); diff --git a/builtin/checkout.c b/builtin/checkout.c index 2a132392fb..3fa29a08ee 100644 --- a/builtin/checkout.c +++ b/builtin/checkout.c @@ -1,4 +1,4 @@ -#define USE_THE_INDEX_COMPATIBILITY_MACROS +#define USE_THE_INDEX_VARIABLE #include "builtin.h" #include "advice.h" #include "blob.h" @@ -148,9 +148,9 @@ static int update_some(const struct object_id *oid, struct strbuf *base, * entry in place. Whether it is UPTODATE or not, checkout_entry will * do the right thing. */ - pos = cache_name_pos(ce->name, ce->ce_namelen); + pos = index_name_pos(&the_index, ce->name, ce->ce_namelen); if (pos >= 0) { - struct cache_entry *old = active_cache[pos]; + struct cache_entry *old = the_index.cache[pos]; if (ce->ce_mode == old->ce_mode && !ce_intent_to_add(old) && oideq(&ce->oid, &old->oid)) { @@ -160,7 +160,8 @@ static int update_some(const struct object_id *oid, struct strbuf *base, } } - add_cache_entry(ce, ADD_CACHE_OK_TO_ADD | ADD_CACHE_OK_TO_REPLACE); + add_index_entry(&the_index, ce, + ADD_CACHE_OK_TO_ADD | ADD_CACHE_OK_TO_REPLACE); return 0; } @@ -178,8 +179,8 @@ static int read_tree_some(struct tree *tree, const struct pathspec *pathspec) static int skip_same_name(const struct cache_entry *ce, int pos) { - while (++pos < active_nr && - !strcmp(active_cache[pos]->name, ce->name)) + while (++pos < the_index.cache_nr && + !strcmp(the_index.cache[pos]->name, ce->name)) ; /* skip */ return pos; } @@ -187,9 +188,9 @@ static int skip_same_name(const struct cache_entry *ce, int pos) static int check_stage(int stage, const struct cache_entry *ce, int pos, int overlay_mode) { - while (pos < active_nr && - !strcmp(active_cache[pos]->name, ce->name)) { - if (ce_stage(active_cache[pos]) == stage) + while (pos < the_index.cache_nr && + !strcmp(the_index.cache[pos]->name, ce->name)) { + if (ce_stage(the_index.cache[pos]) == stage) return 0; pos++; } @@ -206,8 +207,8 @@ static int check_stages(unsigned stages, const struct cache_entry *ce, int pos) unsigned seen = 0; const char *name = ce->name; - while (pos < active_nr) { - ce = active_cache[pos]; + while (pos < the_index.cache_nr) { + ce = the_index.cache[pos]; if (strcmp(name, ce->name)) break; seen |= (1 << ce_stage(ce)); @@ -223,10 +224,10 @@ static int checkout_stage(int stage, const struct cache_entry *ce, int pos, const struct checkout *state, int *nr_checkouts, int overlay_mode) { - while (pos < active_nr && - !strcmp(active_cache[pos]->name, ce->name)) { - if (ce_stage(active_cache[pos]) == stage) - return checkout_entry(active_cache[pos], state, + while (pos < the_index.cache_nr && + !strcmp(the_index.cache[pos]->name, ce->name)) { + if (ce_stage(the_index.cache[pos]) == stage) + return checkout_entry(the_index.cache[pos], state, NULL, nr_checkouts); pos++; } @@ -243,7 +244,7 @@ static int checkout_stage(int stage, const struct cache_entry *ce, int pos, static int checkout_merged(int pos, const struct checkout *state, int *nr_checkouts, struct mem_pool *ce_mem_pool) { - struct cache_entry *ce = active_cache[pos]; + struct cache_entry *ce = the_index.cache[pos]; const char *path = ce->name; mmfile_t ancestor, ours, theirs; enum ll_merge_result merge_status; @@ -256,7 +257,7 @@ static int checkout_merged(int pos, const struct checkout *state, int renormalize = 0; memset(threeway, 0, sizeof(threeway)); - while (pos < active_nr) { + while (pos < the_index.cache_nr) { int stage; stage = ce_stage(ce); if (!stage || strcmp(path, ce->name)) @@ -265,7 +266,7 @@ static int checkout_merged(int pos, const struct checkout *state, if (stage == 2) mode = create_ce_mode(ce->ce_mode); pos++; - ce = active_cache[pos]; + ce = the_index.cache[pos]; } if (is_null_oid(&threeway[1]) || is_null_oid(&threeway[2])) return error(_("path '%s' does not have necessary versions"), path); @@ -391,8 +392,8 @@ static int checkout_worktree(const struct checkout_opts *opts, if (pc_workers > 1) init_parallel_checkout(); - for (pos = 0; pos < active_nr; pos++) { - struct cache_entry *ce = active_cache[pos]; + for (pos = 0; pos < the_index.cache_nr; pos++) { + struct cache_entry *ce = the_index.cache[pos]; if (ce->ce_flags & CE_MATCHED) { if (!ce_stage(ce)) { errs |= checkout_entry(ce, &state, @@ -528,7 +529,7 @@ static int checkout_paths(const struct checkout_opts *opts, } repo_hold_locked_index(the_repository, &lock_file, LOCK_DIE_ON_ERROR); - if (read_cache_preload(&opts->pathspec) < 0) + if (repo_read_index_preload(the_repository, &opts->pathspec, 0) < 0) return error(_("index file corrupt")); if (opts->source_tree) @@ -540,13 +541,13 @@ static int checkout_paths(const struct checkout_opts *opts, * Make sure all pathspecs participated in locating the paths * to be checked out. */ - for (pos = 0; pos < active_nr; pos++) + for (pos = 0; pos < the_index.cache_nr; pos++) if (opts->overlay_mode) - mark_ce_for_checkout_overlay(active_cache[pos], + mark_ce_for_checkout_overlay(the_index.cache[pos], ps_matched, opts); else - mark_ce_for_checkout_no_overlay(active_cache[pos], + mark_ce_for_checkout_no_overlay(the_index.cache[pos], ps_matched, opts); @@ -561,8 +562,8 @@ static int checkout_paths(const struct checkout_opts *opts, unmerge_marked_index(&the_index); /* Any unmerged paths? */ - for (pos = 0; pos < active_nr; pos++) { - const struct cache_entry *ce = active_cache[pos]; + for (pos = 0; pos < the_index.cache_nr; pos++) { + const struct cache_entry *ce = the_index.cache[pos]; if (ce->ce_flags & CE_MATCHED) { if (!ce_stage(ce)) continue; @@ -722,7 +723,7 @@ static void init_topts(struct unpack_trees_options *topts, int merge, setup_unpack_trees_porcelain(topts, "checkout"); - topts->initial_checkout = is_cache_unborn(); + topts->initial_checkout = is_index_unborn(&the_index); topts->update = 1; topts->merge = 1; topts->quiet = merge && old_commit; @@ -740,11 +741,11 @@ static int merge_working_tree(const struct checkout_opts *opts, struct lock_file lock_file = LOCK_INIT; struct tree *new_tree; - hold_locked_index(&lock_file, LOCK_DIE_ON_ERROR); - if (read_cache_preload(NULL) < 0) + repo_hold_locked_index(the_repository, &lock_file, LOCK_DIE_ON_ERROR); + if (repo_read_index_preload(the_repository, NULL, 0) < 0) return error(_("index file corrupt")); - resolve_undo_clear(); + resolve_undo_clear_index(&the_index); if (opts->new_orphan_branch && opts->orphan_from_empty_tree) { if (new_branch_info->commit) BUG("'switch --orphan' should never accept a commit as starting point"); @@ -761,9 +762,9 @@ static int merge_working_tree(const struct checkout_opts *opts, struct unpack_trees_options topts; const struct object_id *old_commit_oid; - refresh_cache(REFRESH_QUIET); + refresh_index(&the_index, REFRESH_QUIET, NULL, NULL, NULL); - if (unmerged_cache()) { + if (unmerged_index(&the_index)) { error(_("you need to resolve your current index first")); return 1; } @@ -867,7 +868,7 @@ static int merge_working_tree(const struct checkout_opts *opts, } } - if (!cache_tree_fully_valid(active_cache_tree)) + if (!cache_tree_fully_valid(the_index.cache_tree)) cache_tree_update(&the_index, WRITE_TREE_SILENT | WRITE_TREE_REPAIR); if (write_locked_index(&the_index, &lock_file, COMMIT_LOCK)) diff --git a/builtin/clean.c b/builtin/clean.c index 40ff2c578d..b2701a2815 100644 --- a/builtin/clean.c +++ b/builtin/clean.c @@ -6,7 +6,7 @@ * Based on git-clean.sh by Pavel Roskin */ -#define USE_THE_INDEX_COMPATIBILITY_MACROS +#define USE_THE_INDEX_VARIABLE #include "builtin.h" #include "cache.h" #include "config.h" @@ -1012,7 +1012,7 @@ int cmd_clean(int argc, const char **argv, const char *prefix) prepare_repo_settings(the_repository); the_repository->settings.command_requires_full_index = 0; - if (read_cache() < 0) + if (repo_read_index(the_repository) < 0) die(_("index file corrupt")); pl = add_pattern_list(&dir, EXC_CMDL, "--exclude option"); @@ -1031,7 +1031,7 @@ int cmd_clean(int argc, const char **argv, const char *prefix) struct stat st; const char *rel; - if (!cache_name_is_other(ent->name, ent->len)) + if (!index_name_is_other(&the_index, ent->name, ent->len)) continue; if (lstat(ent->name, &st)) diff --git a/builtin/clone.c b/builtin/clone.c index 0e4348686b..3c2ae31a55 100644 --- a/builtin/clone.c +++ b/builtin/clone.c @@ -8,7 +8,7 @@ * Clone a repository into a different directory that does not yet exist. */ -#define USE_THE_INDEX_COMPATIBILITY_MACROS +#define USE_THE_INDEX_VARIABLE #include "builtin.h" #include "config.h" #include "lockfile.h" @@ -703,7 +703,7 @@ static int checkout(int submodule_progress, int filter_submodules) /* We need to be in the new work tree for the checkout */ setup_work_tree(); - hold_locked_index(&lock_file, LOCK_DIE_ON_ERROR); + repo_hold_locked_index(the_repository, &lock_file, LOCK_DIE_ON_ERROR); memset(&opts, 0, sizeof opts); opts.update = 1; @@ -1170,10 +1170,6 @@ int cmd_clone(int argc, const char **argv, const char *prefix) refspec_appendf(&remote->fetch, "+%s*:%s*", src_ref_prefix, branch_top.buf); - transport = transport_get(remote, remote->url[0]); - transport_set_verbosity(transport, option_verbosity, option_progress); - transport->family = family; - path = get_repo_path(remote->url[0], &is_bundle); is_local = option_local != 0 && path && !is_bundle; if (is_local) { @@ -1195,6 +1191,10 @@ int cmd_clone(int argc, const char **argv, const char *prefix) } if (option_local > 0 && !is_local) warning(_("--local is ignored")); + + transport = transport_get(remote, path ? path : remote->url[0]); + transport_set_verbosity(transport, option_verbosity, option_progress); + transport->family = family; transport->cloning = 1; if (is_bundle) { diff --git a/builtin/commit.c b/builtin/commit.c index e22bdf23f5..06b1330346 100644 --- a/builtin/commit.c +++ b/builtin/commit.c @@ -272,8 +272,8 @@ static int list_paths(struct string_list *list, const char *with_tree, /* TODO: audit for interaction with sparse-index. */ ensure_full_index(&the_index); - for (i = 0; i < active_nr; i++) { - const struct cache_entry *ce = active_cache[i]; + for (i = 0; i < the_index.cache_nr; i++) { + const struct cache_entry *ce = the_index.cache[i]; struct string_list_item *item; if (ce->ce_flags & CE_UPDATE) @@ -302,10 +302,10 @@ static void add_remove_files(struct string_list *list) continue; if (!lstat(p->string, &st)) { - if (add_to_cache(p->string, &st, 0)) + if (add_to_index(&the_index, p->string, &st, 0)) die(_("updating files failed")); } else - remove_file_from_cache(p->string); + remove_file_from_index(&the_index, p->string); } } @@ -316,7 +316,7 @@ static void create_base_index(const struct commit *current_head) struct tree_desc t; if (!current_head) { - discard_cache(); + discard_index(&the_index); return; } @@ -343,7 +343,7 @@ static void refresh_cache_or_die(int refresh_flags) * refresh_flags contains REFRESH_QUIET, so the only errors * are for unmerged entries. */ - if (refresh_cache(refresh_flags | REFRESH_IN_PORCELAIN)) + if (refresh_index(&the_index, refresh_flags | REFRESH_IN_PORCELAIN, NULL, NULL, NULL)) die_resolve_conflict("commit"); } @@ -382,12 +382,13 @@ static const char *prepare_index(const char **argv, const char *prefix, (!amend || (fixup_message && strcmp(fixup_prefix, "amend")))))) die(_("No paths with --include/--only does not make sense.")); - if (read_cache_preload(&pathspec) < 0) + if (repo_read_index_preload(the_repository, &pathspec, 0) < 0) die(_("index file corrupt")); if (interactive) { char *old_index_env = NULL, *old_repo_index_file; - hold_locked_index(&index_lock, LOCK_DIE_ON_ERROR); + repo_hold_locked_index(the_repository, &index_lock, + LOCK_DIE_ON_ERROR); refresh_cache_or_die(refresh_flags); @@ -410,8 +411,9 @@ static const char *prepare_index(const char **argv, const char *prefix, unsetenv(INDEX_ENVIRONMENT); FREE_AND_NULL(old_index_env); - discard_cache(); - read_cache_from(get_lock_file_path(&index_lock)); + discard_index(&the_index); + read_index_from(&the_index, get_lock_file_path(&index_lock), + get_git_dir()); if (update_main_cache_tree(WRITE_TREE_SILENT) == 0) { if (reopen_lock_file(&index_lock) < 0) die(_("unable to write index file")); @@ -438,7 +440,8 @@ static const char *prepare_index(const char **argv, const char *prefix, * (B) on failure, rollback the real index. */ if (all || (also && pathspec.nr)) { - hold_locked_index(&index_lock, LOCK_DIE_ON_ERROR); + repo_hold_locked_index(the_repository, &index_lock, + LOCK_DIE_ON_ERROR); add_files_to_cache(also ? prefix : NULL, &pathspec, 0); refresh_cache_or_die(refresh_flags); update_main_cache_tree(WRITE_TREE_SILENT); @@ -459,10 +462,11 @@ static const char *prepare_index(const char **argv, const char *prefix, * We still need to refresh the index here. */ if (!only && !pathspec.nr) { - hold_locked_index(&index_lock, LOCK_DIE_ON_ERROR); + repo_hold_locked_index(the_repository, &index_lock, + LOCK_DIE_ON_ERROR); refresh_cache_or_die(refresh_flags); - if (active_cache_changed - || !cache_tree_fully_valid(active_cache_tree)) + if (the_index.cache_changed + || !cache_tree_fully_valid(the_index.cache_tree)) update_main_cache_tree(WRITE_TREE_SILENT); if (write_locked_index(&the_index, &index_lock, COMMIT_LOCK | SKIP_IF_UNCHANGED)) @@ -505,13 +509,13 @@ static const char *prepare_index(const char **argv, const char *prefix, if (list_paths(&partial, !current_head ? NULL : "HEAD", &pathspec)) exit(1); - discard_cache(); - if (read_cache() < 0) + discard_index(&the_index); + if (repo_read_index(the_repository) < 0) die(_("cannot read the index")); - hold_locked_index(&index_lock, LOCK_DIE_ON_ERROR); + repo_hold_locked_index(the_repository, &index_lock, LOCK_DIE_ON_ERROR); add_remove_files(&partial); - refresh_cache(REFRESH_QUIET); + refresh_index(&the_index, REFRESH_QUIET, NULL, NULL, NULL); update_main_cache_tree(WRITE_TREE_SILENT); if (write_locked_index(&the_index, &index_lock, 0)) die(_("unable to write new_index file")); @@ -523,14 +527,14 @@ static const char *prepare_index(const char **argv, const char *prefix, create_base_index(current_head); add_remove_files(&partial); - refresh_cache(REFRESH_QUIET); + refresh_index(&the_index, REFRESH_QUIET, NULL, NULL, NULL); if (write_locked_index(&the_index, &false_lock, 0)) die(_("unable to write temporary index file")); - discard_cache(); + discard_index(&the_index); ret = get_lock_file_path(&false_lock); - read_cache_from(ret); + read_index_from(&the_index, ret, get_git_dir()); out: string_list_clear(&partial, 0); clear_pathspec(&pathspec); @@ -998,10 +1002,10 @@ static int prepare_to_commit(const char *index_file, const char *prefix, /* TODO: audit for interaction with sparse-index. */ ensure_full_index(&the_index); - for (i = 0; i < active_nr; i++) - if (ce_intent_to_add(active_cache[i])) + for (i = 0; i < the_index.cache_nr; i++) + if (ce_intent_to_add(the_index.cache[i])) ita_nr++; - committable = active_nr - ita_nr > 0; + committable = the_index.cache_nr - ita_nr > 0; } else { /* * Unless the user did explicitly request a submodule @@ -1068,9 +1072,9 @@ static int prepare_to_commit(const char *index_file, const char *prefix, * and could have updated it. We must do this before we invoke * the editor and after we invoke run_status above. */ - discard_cache(); + discard_index(&the_index); } - read_cache_from(index_file); + read_index_from(&the_index, index_file, get_git_dir()); if (update_main_cache_tree(0)) { error(_("Error building trees")); @@ -1556,7 +1560,7 @@ int cmd_status(int argc, const char **argv, const char *prefix) &s.pathspec, NULL, NULL); if (use_optional_locks()) - fd = hold_locked_index(&index_lock, 0); + fd = repo_hold_locked_index(the_repository, &index_lock, 0); else fd = -1; @@ -1823,7 +1827,7 @@ int cmd_commit(int argc, const char **argv, const char *prefix) append_merge_tag_headers(parents, &tail); } - if (commit_tree_extended(sb.buf, sb.len, &active_cache_tree->oid, + if (commit_tree_extended(sb.buf, sb.len, &the_index.cache_tree->oid, parents, &oid, author_ident.buf, NULL, sign_commit, extra)) { rollback_index_files(); diff --git a/builtin/describe.c b/builtin/describe.c index 23e3f05fb1..eea1e330c0 100644 --- a/builtin/describe.c +++ b/builtin/describe.c @@ -1,4 +1,4 @@ -#define USE_THE_INDEX_COMPATIBILITY_MACROS +#define USE_THE_INDEX_VARIABLE #include "cache.h" #include "config.h" #include "lockfile.h" @@ -653,10 +653,11 @@ int cmd_describe(int argc, const char **argv, const char *prefix) int fd, result; setup_work_tree(); - read_cache(); + repo_read_index(the_repository); refresh_index(&the_index, REFRESH_QUIET|REFRESH_UNMERGED, NULL, NULL, NULL); - fd = hold_locked_index(&index_lock, 0); + fd = repo_hold_locked_index(the_repository, + &index_lock, 0); if (0 <= fd) repo_update_index_if_able(the_repository, &index_lock); diff --git a/builtin/diff-files.c b/builtin/diff-files.c index 096ea2fedb..dc991f753b 100644 --- a/builtin/diff-files.c +++ b/builtin/diff-files.c @@ -3,7 +3,6 @@ * * Copyright (C) Linus Torvalds, 2005 */ -#define USE_THE_INDEX_COMPATIBILITY_MACROS #include "cache.h" #include "config.h" #include "diff.h" @@ -76,8 +75,8 @@ int cmd_diff_files(int argc, const char **argv, const char *prefix) (rev.diffopt.output_format & DIFF_FORMAT_PATCH)) diff_merges_set_dense_combined_if_unset(&rev); - if (read_cache_preload(&rev.diffopt.pathspec) < 0) { - perror("read_cache_preload"); + if (repo_read_index_preload(the_repository, &rev.diffopt.pathspec, 0) < 0) { + perror("repo_read_index_preload"); result = -1; goto cleanup; } diff --git a/builtin/diff-index.c b/builtin/diff-index.c index aea139b9d8..35dc9b23ee 100644 --- a/builtin/diff-index.c +++ b/builtin/diff-index.c @@ -1,4 +1,3 @@ -#define USE_THE_INDEX_COMPATIBILITY_MACROS #include "cache.h" #include "config.h" #include "diff.h" @@ -62,12 +61,12 @@ int cmd_diff_index(int argc, const char **argv, const char *prefix) usage(diff_cache_usage); if (!(option & DIFF_INDEX_CACHED)) { setup_work_tree(); - if (read_cache_preload(&rev.diffopt.pathspec) < 0) { - perror("read_cache_preload"); + if (repo_read_index_preload(the_repository, &rev.diffopt.pathspec, 0) < 0) { + perror("repo_read_index_preload"); return -1; } - } else if (read_cache() < 0) { - perror("read_cache"); + } else if (repo_read_index(the_repository) < 0) { + perror("repo_read_index"); return -1; } result = run_diff_index(&rev, option); diff --git a/builtin/diff-tree.c b/builtin/diff-tree.c index 85e8c81e59..25b853b85c 100644 --- a/builtin/diff-tree.c +++ b/builtin/diff-tree.c @@ -1,4 +1,4 @@ -#define USE_THE_INDEX_COMPATIBILITY_MACROS +#define USE_THE_INDEX_VARIABLE #include "cache.h" #include "config.h" #include "diff.h" @@ -120,7 +120,7 @@ int cmd_diff_tree(int argc, const char **argv, const char *prefix) git_config(git_diff_basic_config, NULL); /* no "diff" UI options */ repo_init_revisions(the_repository, opt, prefix); - if (read_cache() < 0) + if (repo_read_index(the_repository) < 0) die(_("index file corrupt")); opt->abbrev = 0; opt->diff = 1; diff --git a/builtin/diff.c b/builtin/diff.c index 854d2c5a5c..163f2c6a87 100644 --- a/builtin/diff.c +++ b/builtin/diff.c @@ -3,7 +3,7 @@ * * Copyright (c) 2006 Junio C Hamano */ -#define USE_THE_INDEX_COMPATIBILITY_MACROS +#define USE_THE_INDEX_VARIABLE #include "cache.h" #include "config.h" #include "ewah/ewok.h" @@ -157,12 +157,13 @@ static int builtin_diff_index(struct rev_info *revs, usage(builtin_diff_usage); if (!(option & DIFF_INDEX_CACHED)) { setup_work_tree(); - if (read_cache_preload(&revs->diffopt.pathspec) < 0) { - perror("read_cache_preload"); + if (repo_read_index_preload(the_repository, + &revs->diffopt.pathspec, 0) < 0) { + perror("repo_read_index_preload"); return -1; } - } else if (read_cache() < 0) { - perror("read_cache"); + } else if (repo_read_index(the_repository) < 0) { + perror("repo_read_cache"); return -1; } return run_diff_index(revs, option); @@ -239,12 +240,13 @@ static void refresh_index_quietly(void) struct lock_file lock_file = LOCK_INIT; int fd; - fd = hold_locked_index(&lock_file, 0); + fd = repo_hold_locked_index(the_repository, &lock_file, 0); if (fd < 0) return; - discard_cache(); - read_cache(); - refresh_cache(REFRESH_QUIET|REFRESH_UNMERGED); + discard_index(&the_index); + repo_read_index(the_repository); + refresh_index(&the_index, REFRESH_QUIET|REFRESH_UNMERGED, NULL, NULL, + NULL); repo_update_index_if_able(the_repository, &lock_file); } @@ -279,8 +281,9 @@ static int builtin_diff_files(struct rev_info *revs, int argc, const char **argv diff_merges_set_dense_combined_if_unset(revs); setup_work_tree(); - if (read_cache_preload(&revs->diffopt.pathspec) < 0) { - perror("read_cache_preload"); + if (repo_read_index_preload(the_repository, &revs->diffopt.pathspec, + 0) < 0) { + perror("repo_read_index_preload"); return -1; } return run_diff_files(revs, options); diff --git a/builtin/difftool.c b/builtin/difftool.c index d7f08c8a7f..d9b76226f6 100644 --- a/builtin/difftool.c +++ b/builtin/difftool.c @@ -11,7 +11,7 @@ * * Copyright (C) 2016 Johannes Schindelin */ -#define USE_THE_INDEX_COMPATIBILITY_MACROS +#define USE_THE_INDEX_VARIABLE #include "cache.h" #include "config.h" #include "builtin.h" diff --git a/builtin/fast-export.c b/builtin/fast-export.c index 3b3314e7b2..39a890fc00 100644 --- a/builtin/fast-export.c +++ b/builtin/fast-export.c @@ -409,7 +409,7 @@ static const char *anonymize_oid(const char *oid_hex) } static void show_filemodify(struct diff_queue_struct *q, - struct diff_options *options, void *data) + struct diff_options *options UNUSED, void *data) { int i; struct string_list *changed = data; diff --git a/builtin/for-each-repo.c b/builtin/for-each-repo.c index d45d873f57..6aeac37148 100644 --- a/builtin/for-each-repo.c +++ b/builtin/for-each-repo.c @@ -14,13 +14,16 @@ static int run_command_on_repo(const char *path, int argc, const char ** argv) { int i; struct child_process child = CHILD_PROCESS_INIT; + char *abspath = interpolate_path(path, 0); child.git_cmd = 1; - strvec_pushl(&child.args, "-C", path, NULL); + strvec_pushl(&child.args, "-C", abspath, NULL); for (i = 0; i < argc; i++) strvec_push(&child.args, argv[i]); + free(abspath); + return run_command(&child); } diff --git a/builtin/fsck.c b/builtin/fsck.c index 7436e1a68e..d207bd909b 100644 --- a/builtin/fsck.c +++ b/builtin/fsck.c @@ -1,4 +1,4 @@ -#define USE_THE_INDEX_COMPATIBILITY_MACROS +#define USE_THE_INDEX_VARIABLE #include "builtin.h" #include "cache.h" #include "repository.h" @@ -958,29 +958,29 @@ int cmd_fsck(int argc, const char **argv, const char *prefix) if (keep_cache_objects) { verify_index_checksum = 1; verify_ce_order = 1; - read_cache(); + repo_read_index(the_repository); /* TODO: audit for interaction with sparse-index. */ ensure_full_index(&the_index); - for (i = 0; i < active_nr; i++) { + for (i = 0; i < the_index.cache_nr; i++) { unsigned int mode; struct blob *blob; struct object *obj; - mode = active_cache[i]->ce_mode; + mode = the_index.cache[i]->ce_mode; if (S_ISGITLINK(mode)) continue; blob = lookup_blob(the_repository, - &active_cache[i]->oid); + &the_index.cache[i]->oid); if (!blob) continue; obj = &blob->object; obj->flags |= USED; fsck_put_object_name(&fsck_walk_options, &obj->oid, - ":%s", active_cache[i]->name); + ":%s", the_index.cache[i]->name); mark_object_reachable(obj); } - if (active_cache_tree) - fsck_cache_tree(active_cache_tree); + if (the_index.cache_tree) + fsck_cache_tree(the_index.cache_tree); fsck_resolve_undo(&the_index); } diff --git a/builtin/gc.c b/builtin/gc.c index 6b08dcf3c5..02455fdcd7 100644 --- a/builtin/gc.c +++ b/builtin/gc.c @@ -1480,13 +1480,15 @@ static char *get_maintpath(void) } static char const * const builtin_maintenance_register_usage[] = { - "git maintenance register", + "git maintenance register [--config-file <path>]", NULL }; static int maintenance_register(int argc, const char **argv, const char *prefix) { + char *config_file = NULL; struct option options[] = { + OPT_STRING(0, "config-file", &config_file, N_("file"), N_("use given config file")), OPT_END(), }; int found = 0; @@ -1523,12 +1525,16 @@ static int maintenance_register(int argc, const char **argv, const char *prefix) if (!found) { int rc; - char *user_config, *xdg_config; - git_global_config(&user_config, &xdg_config); - if (!user_config) - die(_("$HOME not set")); + char *user_config = NULL, *xdg_config = NULL; + + if (!config_file) { + git_global_config(&user_config, &xdg_config); + config_file = user_config; + if (!user_config) + die(_("$HOME not set")); + } rc = git_config_set_multivar_in_file_gently( - user_config, "maintenance.repo", maintpath, + config_file, "maintenance.repo", maintpath, CONFIG_REGEX_NONE, 0); free(user_config); free(xdg_config); @@ -1543,14 +1549,16 @@ static int maintenance_register(int argc, const char **argv, const char *prefix) } static char const * const builtin_maintenance_unregister_usage[] = { - "git maintenance unregister [--force]", + "git maintenance unregister [--config-file <path>] [--force]", NULL }; static int maintenance_unregister(int argc, const char **argv, const char *prefix) { int force = 0; + char *config_file = NULL; struct option options[] = { + OPT_STRING(0, "config-file", &config_file, N_("file"), N_("use given config file")), OPT__FORCE(&force, N_("return success even if repository was not registered"), PARSE_OPT_NOCOMPLETE), @@ -1561,6 +1569,7 @@ static int maintenance_unregister(int argc, const char **argv, const char *prefi int found = 0; struct string_list_item *item; const struct string_list *list; + struct config_set cs = { { 0 } }; argc = parse_options(argc, argv, prefix, options, builtin_maintenance_unregister_usage, 0); @@ -1568,7 +1577,13 @@ static int maintenance_unregister(int argc, const char **argv, const char *prefi usage_with_options(builtin_maintenance_unregister_usage, options); - list = git_config_get_value_multi(key); + if (config_file) { + git_configset_init(&cs); + git_configset_add_file(&cs, config_file); + list = git_configset_get_value_multi(&cs, key); + } else { + list = git_config_get_value_multi(key); + } if (list) { for_each_string_list_item(item, list) { if (!strcmp(maintpath, item->string)) { @@ -1580,12 +1595,15 @@ static int maintenance_unregister(int argc, const char **argv, const char *prefi if (found) { int rc; - char *user_config, *xdg_config; - git_global_config(&user_config, &xdg_config); - if (!user_config) - die(_("$HOME not set")); + char *user_config = NULL, *xdg_config = NULL; + if (!config_file) { + git_global_config(&user_config, &xdg_config); + config_file = user_config; + if (!user_config) + die(_("$HOME not set")); + } rc = git_config_set_multivar_in_file_gently( - user_config, key, NULL, maintpath, + config_file, key, NULL, maintpath, CONFIG_FLAGS_MULTI_REPLACE | CONFIG_FLAGS_FIXED_VALUE); free(user_config); free(xdg_config); @@ -1598,6 +1616,7 @@ static int maintenance_unregister(int argc, const char **argv, const char *prefi die(_("repository '%s' is not registered"), maintpath); } + git_configset_clear(&cs); free(maintpath); return 0; } diff --git a/builtin/grep.c b/builtin/grep.c index 5fa927d4e2..f7821c5fbb 100644 --- a/builtin/grep.c +++ b/builtin/grep.c @@ -3,7 +3,6 @@ * * Copyright (c) 2006 Junio C Hamano */ -#define USE_THE_INDEX_COMPATIBILITY_MACROS #include "cache.h" #include "repository.h" #include "config.h" diff --git a/builtin/log.c b/builtin/log.c index 5eafcf26b4..89447a5083 100644 --- a/builtin/log.c +++ b/builtin/log.c @@ -4,7 +4,6 @@ * (C) Copyright 2006 Linus Torvalds * 2006 Junio Hamano */ -#define USE_THE_INDEX_COMPATIBILITY_MACROS #include "cache.h" #include "config.h" #include "refs.h" diff --git a/builtin/ls-tree.c b/builtin/ls-tree.c index c3ea09281a..b1f69fbe92 100644 --- a/builtin/ls-tree.c +++ b/builtin/ls-tree.c @@ -94,16 +94,16 @@ static size_t expand_show_tree(struct strbuf *sb, const char *start, } else if (skip_prefix(start, "(objectname)", &p)) { strbuf_add_unique_abbrev(sb, data->oid, abbrev); } else if (skip_prefix(start, "(path)", &p)) { - const char *name = data->base->buf; + const char *name; const char *prefix = chomp_prefix ? ls_tree_prefix : NULL; - struct strbuf quoted = STRBUF_INIT; struct strbuf sbuf = STRBUF_INIT; + size_t baselen = data->base->len; + strbuf_addstr(data->base, data->pathname); name = relative_path(data->base->buf, prefix, &sbuf); - quote_c_style(name, "ed, NULL, 0); - strbuf_addbuf(sb, "ed); + quote_c_style(name, sb, NULL, 0); + strbuf_setlen(data->base, baselen); strbuf_release(&sbuf); - strbuf_release("ed); } else { errlen = (unsigned long)len; die(_("bad ls-tree format: %%%.*s"), errlen, start); @@ -144,7 +144,6 @@ static int show_recursive(const char *base, size_t baselen, const char *pathname static int show_tree_fmt(const struct object_id *oid, struct strbuf *base, const char *pathname, unsigned mode, void *context UNUSED) { - size_t baselen; int recurse = 0; struct strbuf sb = STRBUF_INIT; enum object_type type = object_type(mode); @@ -164,12 +163,10 @@ static int show_tree_fmt(const struct object_id *oid, struct strbuf *base, if (type == OBJ_BLOB && (ls_options & LS_TREE_ONLY)) return 0; - baselen = base->len; strbuf_expand(&sb, format, expand_show_tree, &data); strbuf_addch(&sb, line_termination); fwrite(sb.buf, sb.len, 1, stdout); strbuf_release(&sb); - strbuf_setlen(base, baselen); return recurse; } diff --git a/builtin/merge-index.c b/builtin/merge-index.c index 012f52bd00..452f833ac4 100644 --- a/builtin/merge-index.c +++ b/builtin/merge-index.c @@ -1,4 +1,4 @@ -#define USE_THE_INDEX_COMPATIBILITY_MACROS +#define USE_THE_INDEX_VARIABLE #include "builtin.h" #include "run-command.h" @@ -14,11 +14,11 @@ static int merge_entry(int pos, const char *path) char ownbuf[4][60]; struct child_process cmd = CHILD_PROCESS_INIT; - if (pos >= active_nr) + if (pos >= the_index.cache_nr) die("git merge-index: %s not in the cache", path); found = 0; do { - const struct cache_entry *ce = active_cache[pos]; + const struct cache_entry *ce = the_index.cache[pos]; int stage = ce_stage(ce); if (strcmp(ce->name, path)) @@ -28,7 +28,7 @@ static int merge_entry(int pos, const char *path) xsnprintf(ownbuf[stage], sizeof(ownbuf[stage]), "%o", ce->ce_mode); arguments[stage] = hexbuf[stage]; arguments[stage + 4] = ownbuf[stage]; - } while (++pos < active_nr); + } while (++pos < the_index.cache_nr); if (!found) die("git merge-index: %s not in the cache", path); @@ -47,7 +47,7 @@ static int merge_entry(int pos, const char *path) static void merge_one_path(const char *path) { - int pos = cache_name_pos(path, strlen(path)); + int pos = index_name_pos(&the_index, path, strlen(path)); /* * If it already exists in the cache as stage0, it's @@ -62,8 +62,8 @@ static void merge_all(void) int i; /* TODO: audit for interaction with sparse-index. */ ensure_full_index(&the_index); - for (i = 0; i < active_nr; i++) { - const struct cache_entry *ce = active_cache[i]; + for (i = 0; i < the_index.cache_nr; i++) { + const struct cache_entry *ce = the_index.cache[i]; if (!ce_stage(ce)) continue; i += merge_entry(i, ce->name)-1; @@ -82,7 +82,7 @@ int cmd_merge_index(int argc, const char **argv, const char *prefix) if (argc < 3) usage("git merge-index [-o] [-q] <merge-program> (-a | [--] [<filename>...])"); - read_cache(); + repo_read_index(the_repository); /* TODO: audit for interaction with sparse-index. */ ensure_full_index(&the_index); diff --git a/builtin/merge-ours.c b/builtin/merge-ours.c index 3583cff71c..284eb48609 100644 --- a/builtin/merge-ours.c +++ b/builtin/merge-ours.c @@ -7,7 +7,6 @@ * * Pretend we resolved the heads, but declare our tree trumps everybody else. */ -#define USE_THE_INDEX_COMPATIBILITY_MACROS #include "git-compat-util.h" #include "builtin.h" #include "diff.h" @@ -25,7 +24,7 @@ int cmd_merge_ours(int argc, const char **argv, const char *prefix) * commit. The index must match HEAD, or this merge cannot go * through. */ - if (read_cache() < 0) + if (repo_read_index(the_repository) < 0) die_errno("read_cache failed"); if (index_differs_from(the_repository, "HEAD", NULL, 0)) return 2; diff --git a/builtin/merge-tree.c b/builtin/merge-tree.c index fe853aa8f9..ae2c011681 100644 --- a/builtin/merge-tree.c +++ b/builtin/merge-tree.c @@ -1,4 +1,4 @@ -#define USE_THE_INDEX_COMPATIBILITY_MACROS +#define USE_THE_INDEX_VARIABLE #include "builtin.h" #include "tree-walk.h" #include "xdiff-interface.h" @@ -98,7 +98,7 @@ static void *origin(struct merge_list *entry, unsigned long *size) return NULL; } -static int show_outf(void *priv_, mmbuffer_t *mb, int nbuf) +static int show_outf(void *priv UNUSED, mmbuffer_t *mb, int nbuf) { int i; for (i = 0; i < nbuf; i++) diff --git a/builtin/merge.c b/builtin/merge.c index b3f75f55c8..17b41fbe38 100644 --- a/builtin/merge.c +++ b/builtin/merge.c @@ -318,7 +318,7 @@ static int save_state(struct object_id *stash) int rc = -1; fd = repo_hold_locked_index(the_repository, &lock_file, 0); - refresh_cache(REFRESH_QUIET); + refresh_index(&the_index, REFRESH_QUIET, NULL, NULL, NULL); if (0 <= fd) repo_update_index_if_able(the_repository, &lock_file); rollback_lock_file(&lock_file); @@ -390,7 +390,8 @@ static void restore_state(const struct object_id *head, run_command(&cmd); refresh_cache: - if (discard_cache() < 0 || read_cache() < 0) + discard_cache(); + if (read_cache() < 0) die(_("could not read index")); } @@ -693,7 +694,7 @@ static int read_tree_trivial(struct object_id *common, struct object_id *head, if (!trees[nr_trees++]) return -1; opts.fn = threeway_merge; - cache_tree_free(&active_cache_tree); + cache_tree_free(&the_index.cache_tree); for (i = 0; i < nr_trees; i++) { parse_tree(trees[i]); init_tree_desc(t+i, trees[i]->buffer, trees[i]->size); @@ -715,7 +716,9 @@ static int try_merge_strategy(const char *strategy, struct commit_list *common, { const char *head_arg = "HEAD"; - if (refresh_and_write_cache(REFRESH_QUIET, SKIP_IF_UNCHANGED, 0) < 0) + if (repo_refresh_and_write_index(the_repository, REFRESH_QUIET, + SKIP_IF_UNCHANGED, 0, NULL, NULL, + NULL) < 0) return error(_("Unable to write index.")); if (!strcmp(strategy, "recursive") || !strcmp(strategy, "subtree") || @@ -749,7 +752,8 @@ static int try_merge_strategy(const char *strategy, struct commit_list *common, for (j = common; j; j = j->next) commit_list_insert(j->item, &reversed); - hold_locked_index(&lock, LOCK_DIE_ON_ERROR); + repo_hold_locked_index(the_repository, &lock, + LOCK_DIE_ON_ERROR); if (!strcmp(strategy, "ort")) clean = merge_ort_recursive(&o, head, remoteheads->item, reversed, &result); @@ -772,7 +776,7 @@ static int try_merge_strategy(const char *strategy, struct commit_list *common, } static void count_diff_files(struct diff_queue_struct *q, - struct diff_options *opt, void *data) + struct diff_options *opt UNUSED, void *data) { int *count = data; @@ -783,8 +787,8 @@ static int count_unmerged_entries(void) { int i, ret = 0; - for (i = 0; i < active_nr; i++) - if (ce_stage(active_cache[i])) + for (i = 0; i < the_index.cache_nr; i++) + if (ce_stage(the_index.cache[i])) ret++; return ret; @@ -858,9 +862,9 @@ static void prepare_to_commit(struct commit_list *remoteheads) * the editor and after we invoke run_status above. */ if (invoked_hook) - discard_cache(); + discard_index(&the_index); } - read_cache_from(index_file); + read_index_from(&the_index, index_file, get_git_dir()); strbuf_addbuf(&msg, &merge_msg); if (squash) BUG("the control must not reach here under --squash"); @@ -909,7 +913,9 @@ static int merge_trivial(struct commit *head, struct commit_list *remoteheads) struct object_id result_tree, result_commit; struct commit_list *parents, **pptr = &parents; - if (refresh_and_write_cache(REFRESH_QUIET, SKIP_IF_UNCHANGED, 0) < 0) + if (repo_refresh_and_write_index(the_repository, REFRESH_QUIET, + SKIP_IF_UNCHANGED, 0, NULL, NULL, + NULL) < 0) return error(_("Unable to write index.")); write_tree_trivial(&result_tree); @@ -1375,7 +1381,7 @@ int cmd_merge(int argc, const char **argv, const char *prefix) goto done; } - if (read_cache_unmerged()) + if (repo_read_index_unmerged(the_repository)) die_resolve_conflict("merge"); if (file_exists(git_path_merge_head(the_repository))) { @@ -1396,7 +1402,7 @@ int cmd_merge(int argc, const char **argv, const char *prefix) else die(_("You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).")); } - resolve_undo_clear(); + resolve_undo_clear_index(&the_index); if (option_edit < 0) option_edit = default_edit_option(); @@ -1601,7 +1607,7 @@ int cmd_merge(int argc, const char **argv, const char *prefix) * We are not doing octopus, not fast-forward, and have * only one common. */ - refresh_cache(REFRESH_QUIET); + refresh_index(&the_index, REFRESH_QUIET, NULL, NULL, NULL); if (allow_trivial && fast_forward != FF_ONLY) { /* * Must first ensure that index matches HEAD before diff --git a/builtin/mv.c b/builtin/mv.c index 3413ad1c9b..19790ce38f 100644 --- a/builtin/mv.c +++ b/builtin/mv.c @@ -87,7 +87,7 @@ static void prepare_move_submodule(const char *src, int first, const char **submodule_gitfile) { struct strbuf submodule_dotgit = STRBUF_INIT; - if (!S_ISGITLINK(active_cache[first]->ce_mode)) + if (!S_ISGITLINK(the_index.cache[first]->ce_mode)) die(_("Directory %s is in index and no submodule?"), src); if (!is_staging_gitmodules_ok(&the_index)) die(_("Please stage your changes to .gitmodules or stash them to proceed")); @@ -106,13 +106,13 @@ static int index_range_of_same_dir(const char *src, int length, const char *src_w_slash = add_slash(src); int first, last, len_w_slash = length + 1; - first = cache_name_pos(src_w_slash, len_w_slash); + first = index_name_pos(&the_index, src_w_slash, len_w_slash); if (first >= 0) die(_("%.*s is in index"), len_w_slash, src_w_slash); first = -1 - first; - for (last = first; last < active_nr; last++) { - const char *path = active_cache[last]->name; + for (last = first; last < the_index.cache_nr; last++) { + const char *path = the_index.cache[last]->name; if (strncmp(path, src_w_slash, len_w_slash)) break; } @@ -136,14 +136,14 @@ static int empty_dir_has_sparse_contents(const char *name) const char *with_slash = add_slash(name); int length = strlen(with_slash); - int pos = cache_name_pos(with_slash, length); + int pos = index_name_pos(&the_index, with_slash, length); const struct cache_entry *ce; if (pos < 0) { pos = -pos - 1; if (pos >= the_index.cache_nr) goto free_return; - ce = active_cache[pos]; + ce = the_index.cache[pos]; if (strncmp(with_slash, ce->name, length)) goto free_return; if (ce_skip_worktree(ce)) @@ -189,8 +189,8 @@ int cmd_mv(int argc, const char **argv, const char *prefix) if (--argc < 1) usage_with_options(builtin_mv_usage, builtin_mv_options); - hold_locked_index(&lock_file, LOCK_DIE_ON_ERROR); - if (read_cache() < 0) + repo_hold_locked_index(the_repository, &lock_file, LOCK_DIE_ON_ERROR); + if (repo_read_index(the_repository) < 0) die(_("index file corrupt")); source = internal_prefix_pathspec(prefix, argv, argc, 0); @@ -255,7 +255,7 @@ int cmd_mv(int argc, const char **argv, const char *prefix) int pos; const struct cache_entry *ce; - pos = cache_name_pos(src, length); + pos = index_name_pos(&the_index, src, length); if (pos < 0) { const char *src_w_slash = add_slash(src); if (!path_in_sparse_checkout(src_w_slash, &the_index) && @@ -268,7 +268,7 @@ int cmd_mv(int argc, const char **argv, const char *prefix) bad = _("bad source"); goto act_on_entry; } - ce = active_cache[pos]; + ce = the_index.cache[pos]; if (!ce_skip_worktree(ce)) { bad = _("bad source"); goto act_on_entry; @@ -278,7 +278,7 @@ int cmd_mv(int argc, const char **argv, const char *prefix) goto act_on_entry; } /* Check if dst exists in index */ - if (cache_name_pos(dst, strlen(dst)) < 0) { + if (index_name_pos(&the_index, dst, strlen(dst)) < 0) { modes[i] |= SPARSE; goto act_on_entry; } @@ -303,7 +303,7 @@ int cmd_mv(int argc, const char **argv, const char *prefix) dir_check: if (S_ISDIR(st.st_mode)) { int j, dst_len, n; - int first = cache_name_pos(src, length), last; + int first = index_name_pos(&the_index, src, length), last; if (first >= 0) { prepare_move_submodule(src, first, @@ -331,7 +331,7 @@ dir_check: dst_len = strlen(dst); for (j = 0; j < last - first; j++) { - const struct cache_entry *ce = active_cache[first + j]; + const struct cache_entry *ce = the_index.cache[first + j]; const char *path = ce->name; source[argc + j] = path; destination[argc + j] = @@ -343,7 +343,7 @@ dir_check: argc += last - first; goto act_on_entry; } - if (!(ce = cache_file_exists(src, length, 0))) { + if (!(ce = index_file_exists(&the_index, src, length, 0))) { bad = _("not under version control"); goto act_on_entry; } @@ -468,11 +468,14 @@ remove_entry: if (mode & (WORKING_DIRECTORY | SKIP_WORKTREE_DIR)) continue; - pos = cache_name_pos(src, strlen(src)); + pos = index_name_pos(&the_index, src, strlen(src)); assert(pos >= 0); if (!(mode & SPARSE) && !lstat(src, &st)) - sparse_and_dirty = ce_modified(active_cache[pos], &st, 0); - rename_cache_entry_at(pos, dst); + sparse_and_dirty = ie_modified(&the_index, + the_index.cache[pos], + &st, + 0); + rename_index_entry_at(&the_index, pos, dst); if (ignore_sparse && core_apply_sparse_checkout && @@ -487,7 +490,7 @@ remove_entry: path_in_sparse_checkout(dst, &the_index)) { /* from out-of-cone to in-cone */ int dst_pos = cache_name_pos(dst, strlen(dst)); - struct cache_entry *dst_ce = active_cache[dst_pos]; + struct cache_entry *dst_ce = the_index.cache[dst_pos]; dst_ce->ce_flags &= ~CE_SKIP_WORKTREE; @@ -498,7 +501,7 @@ remove_entry: !path_in_sparse_checkout(dst, &the_index)) { /* from in-cone to out-of-cone */ int dst_pos = cache_name_pos(dst, strlen(dst)); - struct cache_entry *dst_ce = active_cache[dst_pos]; + struct cache_entry *dst_ce = the_index.cache[dst_pos]; /* * if src is clean, it will suffice to remove it diff --git a/builtin/notes.c b/builtin/notes.c index be51f69225..80d9dfd25c 100644 --- a/builtin/notes.c +++ b/builtin/notes.c @@ -181,7 +181,7 @@ static void prepare_note_data(const struct object_id *object, struct note_data * strbuf_addch(&buf, '\n'); strbuf_add_commented_lines(&buf, "\n", strlen("\n")); strbuf_add_commented_lines(&buf, _(note_template), strlen(_(note_template))); - strbuf_addch(&buf, '\n'); + strbuf_add_commented_lines(&buf, "\n", strlen("\n")); write_or_die(fd, buf.buf, buf.len); write_commented_object(fd, object); diff --git a/builtin/prune.c b/builtin/prune.c index df376b2ed1..2719220108 100644 --- a/builtin/prune.c +++ b/builtin/prune.c @@ -127,7 +127,9 @@ static void remove_temporary_files(const char *path) dir = opendir(path); if (!dir) { - fprintf(stderr, "Unable to open directory %s\n", path); + if (errno != ENOENT) + fprintf(stderr, "Unable to open directory %s: %s\n", + path, strerror(errno)); return; } while ((de = readdir(dir)) != NULL) diff --git a/builtin/pull.c b/builtin/pull.c index b21edd767a..1ab4de0005 100644 --- a/builtin/pull.c +++ b/builtin/pull.c @@ -5,7 +5,7 @@ * * Fetch one or more remote refs and merge it/them into the current HEAD. */ -#define USE_THE_INDEX_COMPATIBILITY_MACROS +#define USE_THE_INDEX_VARIABLE #include "cache.h" #include "config.h" #include "builtin.h" @@ -1030,7 +1030,7 @@ int cmd_pull(int argc, const char **argv, const char *prefix) if (opt_rebase < 0) opt_rebase = config_get_rebase(&rebase_unspecified); - if (read_cache_unmerged()) + if (repo_read_index_unmerged(the_repository)) die_resolve_conflict("pull"); if (file_exists(git_path_merge_head(the_repository))) @@ -1043,7 +1043,7 @@ int cmd_pull(int argc, const char **argv, const char *prefix) if (opt_autostash == -1) opt_autostash = config_autostash; - if (is_null_oid(&orig_head) && !is_cache_unborn()) + if (is_null_oid(&orig_head) && !is_index_unborn(&the_index)) die(_("Updating an unborn branch with changes added to the index.")); if (!opt_autostash) diff --git a/builtin/push.c b/builtin/push.c index f0329c62a2..60ac8017e5 100644 --- a/builtin/push.c +++ b/builtin/push.c @@ -466,8 +466,16 @@ static int option_parse_recurse_submodules(const struct option *opt, if (unset) *recurse_submodules = RECURSE_SUBMODULES_OFF; - else - *recurse_submodules = parse_push_recurse_submodules_arg(opt->long_name, arg); + else { + if (!strcmp(arg, "only-is-on-demand")) { + if (*recurse_submodules == RECURSE_SUBMODULES_ONLY) { + warning(_("recursing into submodule with push.recurseSubmodules=only; using on-demand instead")); + *recurse_submodules = RECURSE_SUBMODULES_ON_DEMAND; + } + } else { + *recurse_submodules = parse_push_recurse_submodules_arg(opt->long_name, arg); + } + } return 0; } diff --git a/builtin/read-tree.c b/builtin/read-tree.c index f4cbe460b9..f702f9d47b 100644 --- a/builtin/read-tree.c +++ b/builtin/read-tree.c @@ -4,7 +4,7 @@ * Copyright (C) Linus Torvalds, 2005 */ -#define USE_THE_INDEX_COMPATIBILITY_MACROS +#define USE_THE_INDEX_VARIABLE #include "cache.h" #include "config.h" #include "lockfile.h" @@ -176,7 +176,7 @@ int cmd_read_tree(int argc, const char **argv, const char *cmd_prefix) prepare_repo_settings(the_repository); the_repository->settings.command_requires_full_index = 0; - hold_locked_index(&lock_file, LOCK_DIE_ON_ERROR); + repo_hold_locked_index(the_repository, &lock_file, LOCK_DIE_ON_ERROR); /* * NEEDSWORK @@ -188,11 +188,11 @@ int cmd_read_tree(int argc, const char **argv, const char *cmd_prefix) */ if (opts.reset || opts.merge || opts.prefix) { - if (read_cache_unmerged() && (opts.prefix || opts.merge)) + if (repo_read_index_unmerged(the_repository) && (opts.prefix || opts.merge)) die(_("You need to resolve your current index first")); stage = opts.merge = 1; } - resolve_undo_clear(); + resolve_undo_clear_index(&the_index); for (i = 0; i < argc; i++) { const char *arg = argv[i]; @@ -232,7 +232,7 @@ int cmd_read_tree(int argc, const char **argv, const char *cmd_prefix) break; case 2: opts.fn = twoway_merge; - opts.initial_checkout = is_cache_unborn(); + opts.initial_checkout = is_index_unborn(&the_index); break; case 3: default: @@ -249,7 +249,11 @@ int cmd_read_tree(int argc, const char **argv, const char *cmd_prefix) if (opts.debug_unpack) opts.fn = debug_merge; - cache_tree_free(&active_cache_tree); + /* If we're going to prime_cache_tree later, skip cache tree update */ + if (nr_trees == 1 && !opts.prefix) + opts.skip_cache_tree_update = 1; + + cache_tree_free(&the_index.cache_tree); for (i = 0; i < nr_trees; i++) { struct tree *tree = trees[i]; parse_tree(tree); diff --git a/builtin/rebase.c b/builtin/rebase.c index 5d855fd8f5..b22768ca5b 100644 --- a/builtin/rebase.c +++ b/builtin/rebase.c @@ -4,7 +4,7 @@ * Copyright (c) 2018 Pratik Karki */ -#define USE_THE_INDEX_COMPATIBILITY_MACROS +#define USE_THE_INDEX_VARIABLE #include "builtin.h" #include "run-command.h" #include "exec-cmd.h" @@ -30,8 +30,6 @@ #include "reset.h" #include "hook.h" -#define DEFAULT_REFLOG_ACTION "rebase" - static char const * const builtin_rebase_usage[] = { N_("git rebase [-i] [options] [--exec <cmd>] " "[--onto <newbase> | --keep-base] [<upstream> [<branch>]]"), @@ -106,6 +104,7 @@ struct rebase_options { } flags; struct strvec git_am_opts; enum action action; + char *reflog_action; int signoff; int allow_rerere_autoupdate; int keep_empty; @@ -159,6 +158,7 @@ static struct replay_opts get_replay_opts(const struct rebase_options *opts) opts->committer_date_is_author_date; replay.ignore_date = opts->ignore_date; replay.gpg_sign = xstrdup_or_null(opts->gpg_sign_opt); + replay.reflog_action = xstrdup(opts->reflog_action); if (opts->strategy) replay.strategy = xstrdup_or_null(opts->strategy); else if (!replay.strategy && replay.default_strategy) { @@ -292,7 +292,7 @@ static int do_interactive_rebase(struct rebase_options *opts, unsigned flags) if (ret) error(_("could not generate todo list")); else { - discard_cache(); + discard_index(&the_index); if (todo_list_parse_insn_buffer(the_repository, todo_list.buf.buf, &todo_list)) BUG("unusable todo list"); @@ -585,10 +585,10 @@ static int move_to_original_branch(struct rebase_options *opts) BUG("move_to_original_branch without onto"); strbuf_addf(&branch_reflog, "%s (finish): %s onto %s", - getenv(GIT_REFLOG_ACTION_ENVIRONMENT), + opts->reflog_action, opts->head_name, oid_to_hex(&opts->onto->object.oid)); strbuf_addf(&head_reflog, "%s (finish): returning to %s", - getenv(GIT_REFLOG_ACTION_ENVIRONMENT), opts->head_name); + opts->reflog_action, opts->head_name); ropts.branch = opts->head_name; ropts.flags = RESET_HEAD_REFS_ONLY; ropts.branch_msg = branch_reflog.buf; @@ -618,7 +618,7 @@ static int run_am(struct rebase_options *opts) am.git_cmd = 1; strvec_push(&am.args, "am"); strvec_pushf(&am.env, GIT_REFLOG_ACTION_ENVIRONMENT "=%s (pick)", - getenv(GIT_REFLOG_ACTION_ENVIRONMENT)); + opts->reflog_action); if (opts->action == ACTION_CONTINUE) { strvec_push(&am.args, "--resolved"); strvec_pushf(&am.args, "--resolvemsg=%s", resolvemsg); @@ -685,7 +685,7 @@ static int run_am(struct rebase_options *opts) ropts.oid = &opts->orig_head->object.oid; ropts.branch = opts->head_name; - ropts.default_reflog_action = DEFAULT_REFLOG_ACTION; + ropts.default_reflog_action = opts->reflog_action; reset_head(the_repository, &ropts); error(_("\ngit encountered an error while preparing the " "patches to replay\n" @@ -834,8 +834,7 @@ static int checkout_up_to_date(struct rebase_options *options) int ret = 0; strbuf_addf(&buf, "%s: checkout %s", - getenv(GIT_REFLOG_ACTION_ENVIRONMENT), - options->switch_to); + options->reflog_action, options->switch_to); ropts.oid = &options->orig_head->object.oid; ropts.branch = options->head_name; ropts.flags = RESET_HEAD_RUN_POST_CHECKOUT_HOOK; @@ -1243,7 +1242,6 @@ int cmd_rebase(int argc, const char **argv, const char *prefix) if (options.action != ACTION_NONE && !in_progress) die(_("No rebase in progress?")); - setenv(GIT_REFLOG_ACTION_ENVIRONMENT, "rebase", 0); if (options.action == ACTION_EDIT_TODO && !is_merge(&options)) die(_("The --edit-todo action can only be used during " @@ -1258,6 +1256,10 @@ int cmd_rebase(int argc, const char **argv, const char *prefix) trace2_cmd_mode(action_names[options.action]); } + options.reflog_action = getenv(GIT_REFLOG_ACTION_ENVIRONMENT); + options.reflog_action = + xstrdup(options.reflog_action ? options.reflog_action : "rebase"); + switch (options.action) { case ACTION_CONTINUE: { struct object_id head; @@ -1268,7 +1270,7 @@ int cmd_rebase(int argc, const char **argv, const char *prefix) if (get_oid("HEAD", &head)) die(_("Cannot read HEAD")); - fd = hold_locked_index(&lock_file, 0); + fd = repo_hold_locked_index(the_repository, &lock_file, 0); if (repo_read_index(the_repository) < 0) die(_("could not read index")); refresh_index(the_repository->index, REFRESH_QUIET, NULL, NULL, @@ -1310,7 +1312,7 @@ int cmd_rebase(int argc, const char **argv, const char *prefix) exit(1); strbuf_addf(&head_msg, "%s (abort): returning to %s", - getenv(GIT_REFLOG_ACTION_ENVIRONMENT), + options.reflog_action, options.head_name ? options.head_name : oid_to_hex(&options.orig_head->object.oid)); ropts.oid = &options.orig_head->object.oid; @@ -1786,13 +1788,13 @@ int cmd_rebase(int argc, const char **argv, const char *prefix) "it...\n")); strbuf_addf(&msg, "%s (start): checkout %s", - getenv(GIT_REFLOG_ACTION_ENVIRONMENT), options.onto_name); + options.reflog_action, options.onto_name); ropts.oid = &options.onto->object.oid; ropts.orig_head = &options.orig_head->object.oid, ropts.flags = RESET_HEAD_DETACH | RESET_ORIG_HEAD | RESET_HEAD_RUN_POST_CHECKOUT_HOOK; ropts.head_msg = msg.buf; - ropts.default_reflog_action = DEFAULT_REFLOG_ACTION; + ropts.default_reflog_action = options.reflog_action; if (reset_head(the_repository, &ropts)) die(_("Could not detach HEAD")); strbuf_release(&msg); @@ -1824,6 +1826,7 @@ run_rebase: cleanup: strbuf_release(&buf); strbuf_release(&revisions); + free(options.reflog_action); free(options.head_name); free(options.gpg_sign_opt); free(options.cmd); diff --git a/builtin/receive-pack.c b/builtin/receive-pack.c index 44bcea3a5b..a90af30363 100644 --- a/builtin/receive-pack.c +++ b/builtin/receive-pack.c @@ -80,6 +80,7 @@ static struct object_id push_cert_oid; static struct signature_check sigcheck; static const char *push_cert_nonce; static const char *cert_nonce_seed; +static struct string_list hidden_refs = STRING_LIST_INIT_DUP; static const char *NONCE_UNSOLICITED = "UNSOLICITED"; static const char *NONCE_BAD = "BAD"; @@ -130,7 +131,7 @@ static enum deny_action parse_deny_action(const char *var, const char *value) static int receive_pack_config(const char *var, const char *value, void *cb) { - int status = parse_hide_refs_config(var, value, "receive"); + int status = parse_hide_refs_config(var, value, "receive", &hidden_refs); if (status) return status; @@ -296,7 +297,7 @@ static int show_ref_cb(const char *path_full, const struct object_id *oid, struct oidset *seen = data; const char *path = strip_namespace(path_full); - if (ref_is_hidden(path, path_full)) + if (ref_is_hidden(path, path_full, &hidden_refs)) return 0; /* @@ -1794,7 +1795,7 @@ static void reject_updates_to_hidden(struct command *commands) strbuf_setlen(&refname_full, prefix_len); strbuf_addstr(&refname_full, cmd->ref_name); - if (!ref_is_hidden(cmd->ref_name, refname_full.buf)) + if (!ref_is_hidden(cmd->ref_name, refname_full.buf, &hidden_refs)) continue; if (is_null_oid(&cmd->new_oid)) cmd->error_string = "deny deleting a hidden ref"; @@ -1928,6 +1929,8 @@ static void execute_commands(struct command *commands, opt.err_fd = err_fd; opt.progress = err_fd && !quiet; opt.env = tmp_objdir_env(tmp_objdir); + opt.exclude_hidden_refs_section = "receive"; + if (check_connected(iterate_receive_command_list, &data, &opt)) set_connectivity_errors(commands, si); @@ -2591,6 +2594,7 @@ int cmd_receive_pack(int argc, const char **argv, const char *prefix) packet_flush(1); oid_array_clear(&shallow); oid_array_clear(&ref); + string_list_clear(&hidden_refs, 0); free((void *)push_cert_nonce); return 0; } diff --git a/builtin/repack.c b/builtin/repack.c index 10e23f9ee1..65eb1b8bd2 100644 --- a/builtin/repack.c +++ b/builtin/repack.c @@ -32,7 +32,6 @@ static int write_bitmaps = -1; static int use_delta_islands; static int run_update_server_info = 1; static char *packdir, *packtmp_name, *packtmp; -static char *cruft_expiration; static const char *const git_repack_usage[] = { N_("git repack [<options>]"), @@ -150,7 +149,8 @@ static void remove_redundant_pack(const char *dir_name, const char *base_name) } static void prepare_pack_objects(struct child_process *cmd, - const struct pack_objects_args *args) + const struct pack_objects_args *args, + const char *out) { strvec_push(&cmd->args, "pack-objects"); if (args->window) @@ -173,7 +173,7 @@ static void prepare_pack_objects(struct child_process *cmd, strvec_push(&cmd->args, "--quiet"); if (delta_base_offset) strvec_push(&cmd->args, "--delta-base-offset"); - strvec_push(&cmd->args, packtmp); + strvec_push(&cmd->args, out); cmd->git_cmd = 1; cmd->out = -1; } @@ -241,7 +241,7 @@ static void repack_promisor_objects(const struct pack_objects_args *args, FILE *out; struct strbuf line = STRBUF_INIT; - prepare_pack_objects(&cmd, args); + prepare_pack_objects(&cmd, args, packtmp); cmd.in = -1; /* @@ -657,7 +657,9 @@ static void remove_redundant_bitmaps(struct string_list *include, } static int write_cruft_pack(const struct pack_objects_args *args, + const char *destination, const char *pack_prefix, + const char *cruft_expiration, struct string_list *names, struct string_list *existing_packs, struct string_list *existing_kept_packs) @@ -667,8 +669,10 @@ static int write_cruft_pack(const struct pack_objects_args *args, struct string_list_item *item; FILE *in, *out; int ret; + const char *scratch; + int local = skip_prefix(destination, packdir, &scratch); - prepare_pack_objects(&cmd, args); + prepare_pack_objects(&cmd, args, destination); strvec_push(&cmd.args, "--cruft"); if (cruft_expiration) @@ -693,6 +697,10 @@ static int write_cruft_pack(const struct pack_objects_args *args, * By the time it is read here, it contains only the pack(s) * that were just written, which is exactly the set of packs we * want to consider kept. + * + * If `--expire-to` is given, the double-use served by `names` + * ensures that the pack written to `--expire-to` excludes any + * objects contained in the cruft pack. */ in = xfdopen(cmd.in, "w"); for_each_string_list_item(item, names) @@ -710,9 +718,14 @@ static int write_cruft_pack(const struct pack_objects_args *args, if (line.len != the_hash_algo->hexsz) die(_("repack: Expecting full hex object ID lines only " "from pack-objects.")); - - item = string_list_append(names, line.buf); - item->util = populate_pack_exts(line.buf); + /* + * avoid putting packs written outside of the repository in the + * list of names + */ + if (local) { + item = string_list_append(names, line.buf); + item->util = populate_pack_exts(line.buf); + } } fclose(out); @@ -744,6 +757,8 @@ int cmd_repack(int argc, const char **argv, const char *prefix) struct pack_objects_args cruft_po_args = {NULL}; int geometric_factor = 0; int write_midx = 0; + const char *cruft_expiration = NULL; + const char *expire_to = NULL; struct option builtin_repack_options[] = { OPT_BIT('a', NULL, &pack_everything, @@ -793,6 +808,8 @@ int cmd_repack(int argc, const char **argv, const char *prefix) N_("find a geometric progression with factor <N>")), OPT_BOOL('m', "write-midx", &write_midx, N_("write a multi-pack index of the resulting packs")), + OPT_STRING(0, "expire-to", &expire_to, N_("dir"), + N_("pack prefix to store a pack containing pruned objects")), OPT_END() }; @@ -858,7 +875,7 @@ int cmd_repack(int argc, const char **argv, const char *prefix) split_pack_geometry(geometry, geometric_factor); } - prepare_pack_objects(&cmd, &po_args); + prepare_pack_objects(&cmd, &po_args, packtmp); show_progress = !po_args.quiet && isatty(2); @@ -984,11 +1001,45 @@ int cmd_repack(int argc, const char **argv, const char *prefix) cruft_po_args.local = po_args.local; cruft_po_args.quiet = po_args.quiet; - ret = write_cruft_pack(&cruft_po_args, pack_prefix, &names, + ret = write_cruft_pack(&cruft_po_args, packtmp, pack_prefix, + cruft_expiration, &names, &existing_nonkept_packs, &existing_kept_packs); if (ret) return ret; + + if (delete_redundant && expire_to) { + /* + * If `--expire-to` is given with `-d`, it's possible + * that we're about to prune some objects. With cruft + * packs, pruning is implicit: any objects from existing + * packs that weren't picked up by new packs are removed + * when their packs are deleted. + * + * Generate an additional cruft pack, with one twist: + * `names` now includes the name of the cruft pack + * written in the previous step. So the contents of + * _this_ cruft pack exclude everything contained in the + * existing cruft pack (that is, all of the unreachable + * objects which are no older than + * `--cruft-expiration`). + * + * To make this work, cruft_expiration must become NULL + * so that this cruft pack doesn't actually prune any + * objects. If it were non-NULL, this call would always + * generate an empty pack (since every object not in the + * cruft pack generated above will have an mtime older + * than the expiration). + */ + ret = write_cruft_pack(&cruft_po_args, expire_to, + pack_prefix, + NULL, + &names, + &existing_nonkept_packs, + &existing_kept_packs); + if (ret) + return ret; + } } string_list_sort(&names); diff --git a/builtin/rerere.c b/builtin/rerere.c index 8b7392d5b4..94ffb8c21a 100644 --- a/builtin/rerere.c +++ b/builtin/rerere.c @@ -14,7 +14,7 @@ static const char * const rerere_usage[] = { NULL, }; -static int outf(void *dummy, mmbuffer_t *ptr, int nbuf) +static int outf(void *dummy UNUSED, mmbuffer_t *ptr, int nbuf) { int i; for (i = 0; i < nbuf; i++) diff --git a/builtin/reset.c b/builtin/reset.c index fdce6f8c85..d2e0185e55 100644 --- a/builtin/reset.c +++ b/builtin/reset.c @@ -7,7 +7,7 @@ * * Copyright (c) 2005, 2006 Linus Torvalds and Junio C Hamano */ -#define USE_THE_INDEX_COMPATIBILITY_MACROS +#define USE_THE_INDEX_VARIABLE #include "builtin.h" #include "config.h" #include "lockfile.h" @@ -73,16 +73,18 @@ static int reset_index(const char *ref, const struct object_id *oid, int reset_t case HARD: opts.update = 1; opts.reset = UNPACK_RESET_OVERWRITE_UNTRACKED; + opts.skip_cache_tree_update = 1; break; case MIXED: opts.reset = UNPACK_RESET_PROTECT_UNTRACKED; + opts.skip_cache_tree_update = 1; /* but opts.update=0, so working tree not updated */ break; default: BUG("invalid reset_type passed to reset_index"); } - read_cache_unmerged(); + repo_read_index_unmerged(the_repository); if (reset_type == KEEP) { struct object_id head_oid; @@ -131,7 +133,8 @@ static void print_new_head_line(struct commit *commit) } static void update_index_from_diff(struct diff_queue_struct *q, - struct diff_options *opt, void *data) + struct diff_options *opt UNUSED, + void *data) { int i; int intent_to_add = *(int *)data; @@ -143,7 +146,7 @@ static void update_index_from_diff(struct diff_queue_struct *q, struct cache_entry *ce; if (!is_in_reset_tree && !intent_to_add) { - remove_file_from_cache(one->path); + remove_file_from_index(&the_index, one->path); continue; } @@ -158,8 +161,8 @@ static void update_index_from_diff(struct diff_queue_struct *q, * if this entry is outside the sparse cone - this is necessary * to properly construct the reset sparse directory. */ - pos = cache_name_pos(one->path, strlen(one->path)); - if ((pos >= 0 && ce_skip_worktree(active_cache[pos])) || + pos = index_name_pos(&the_index, one->path, strlen(one->path)); + if ((pos >= 0 && ce_skip_worktree(the_index.cache[pos])) || (pos < 0 && !path_in_sparse_checkout(one->path, &the_index))) ce->ce_flags |= CE_SKIP_WORKTREE; @@ -170,7 +173,8 @@ static void update_index_from_diff(struct diff_queue_struct *q, ce->ce_flags |= CE_INTENT_TO_ADD; set_object_name_for_intent_to_add_entry(ce); } - add_cache_entry(ce, ADD_CACHE_OK_TO_ADD | ADD_CACHE_OK_TO_REPLACE); + add_index_entry(&the_index, ce, + ADD_CACHE_OK_TO_ADD | ADD_CACHE_OK_TO_REPLACE); } } @@ -218,7 +222,7 @@ static void set_reflog_message(struct strbuf *sb, const char *action, static void die_if_unmerged_cache(int reset_type) { - if (is_merge() || unmerged_cache()) + if (is_merge() || unmerged_index(&the_index)) die(_("Cannot do a %s reset in the middle of a merge."), _(reset_type_names[reset_type])); @@ -420,7 +424,7 @@ int cmd_reset(int argc, const char **argv, const char *prefix) prepare_repo_settings(the_repository); the_repository->settings.command_requires_full_index = 0; - if (read_cache() < 0) + if (repo_read_index(the_repository) < 0) die(_("index file corrupt")); /* Soft reset does not touch the index file nor the working tree @@ -431,7 +435,8 @@ int cmd_reset(int argc, const char **argv, const char *prefix) if (reset_type != SOFT) { struct lock_file lock = LOCK_INIT; - hold_locked_index(&lock, LOCK_DIE_ON_ERROR); + repo_hold_locked_index(the_repository, &lock, + LOCK_DIE_ON_ERROR); if (reset_type == MIXED) { int flags = quiet ? REFRESH_QUIET : REFRESH_IN_PORCELAIN; if (read_from_tree(&pathspec, &oid, intent_to_add)) diff --git a/builtin/rev-list.c b/builtin/rev-list.c index 3acd93f71e..d42db0b0cc 100644 --- a/builtin/rev-list.c +++ b/builtin/rev-list.c @@ -38,6 +38,7 @@ static const char rev_list_usage[] = " --tags\n" " --remotes\n" " --stdin\n" +" --exclude-hidden=[receive|uploadpack]\n" " --quiet\n" " ordering output:\n" " --topo-order\n" diff --git a/builtin/rev-parse.c b/builtin/rev-parse.c index 8f61050bde..1c344d74a7 100644 --- a/builtin/rev-parse.c +++ b/builtin/rev-parse.c @@ -3,7 +3,7 @@ * * Copyright (C) Linus Torvalds, 2005 */ -#define USE_THE_INDEX_COMPATIBILITY_MACROS +#define USE_THE_INDEX_VARIABLE #include "cache.h" #include "config.h" #include "commit.h" @@ -39,7 +39,7 @@ static int abbrev_ref_strict; static int output_sq; static int stuck_long; -static struct string_list *ref_excludes; +static struct ref_exclusions ref_excludes = REF_EXCLUSIONS_INIT; /* * Some arguments are relevant "revision" arguments, @@ -198,7 +198,7 @@ static int show_default(void) static int show_reference(const char *refname, const struct object_id *oid, int flag UNUSED, void *cb_data UNUSED) { - if (ref_excluded(ref_excludes, refname)) + if (ref_excluded(&ref_excludes, refname)) return 0; show_rev(NORMAL, oid, refname); return 0; @@ -585,7 +585,7 @@ static void handle_ref_opt(const char *pattern, const char *prefix) for_each_glob_ref_in(show_reference, pattern, prefix, NULL); else for_each_ref_in(prefix, show_reference, NULL); - clear_ref_exclusion(&ref_excludes); + clear_ref_exclusions(&ref_excludes); } enum format_type { @@ -863,7 +863,7 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix) } if (!strcmp(arg, "--all")) { for_each_ref(show_reference, NULL); - clear_ref_exclusion(&ref_excludes); + clear_ref_exclusions(&ref_excludes); continue; } if (skip_prefix(arg, "--disambiguate=", &arg)) { @@ -876,10 +876,14 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix) continue; } if (opt_with_value(arg, "--branches", &arg)) { + if (ref_excludes.hidden_refs_configured) + return error(_("--exclude-hidden cannot be used together with --branches")); handle_ref_opt(arg, "refs/heads/"); continue; } if (opt_with_value(arg, "--tags", &arg)) { + if (ref_excludes.hidden_refs_configured) + return error(_("--exclude-hidden cannot be used together with --tags")); handle_ref_opt(arg, "refs/tags/"); continue; } @@ -888,6 +892,8 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix) continue; } if (opt_with_value(arg, "--remotes", &arg)) { + if (ref_excludes.hidden_refs_configured) + return error(_("--exclude-hidden cannot be used together with --remotes")); handle_ref_opt(arg, "refs/remotes/"); continue; } @@ -895,6 +901,10 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix) add_ref_exclusion(&ref_excludes, arg); continue; } + if (skip_prefix(arg, "--exclude-hidden=", &arg)) { + exclude_hidden_refs(&ref_excludes, arg); + continue; + } if (!strcmp(arg, "--show-toplevel")) { const char *work_tree = get_git_work_tree(); if (work_tree) @@ -997,7 +1007,7 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix) continue; } if (!strcmp(arg, "--shared-index-path")) { - if (read_cache() < 0) + if (repo_read_index(the_repository) < 0) die(_("Could not read the index")); if (the_index.split_index) { const struct object_id *oid = &the_index.split_index->base_oid; diff --git a/builtin/revert.c b/builtin/revert.c index ee32c714a7..6a9b550a61 100644 --- a/builtin/revert.c +++ b/builtin/revert.c @@ -21,7 +21,7 @@ */ static const char * const revert_usage[] = { - N_("git revert [--[no-]edit] [-n] [-m parent-number] [-s] [-S[<keyid>]] <commit>..."), + N_("git revert [--[no-]edit] [-n] [-m <parent-number>] [-s] [-S[<keyid>]] <commit>..."), N_("git revert (--continue | --skip | --abort | --quit)"), NULL }; diff --git a/builtin/rm.c b/builtin/rm.c index f0d025a4e2..d4989d4d86 100644 --- a/builtin/rm.c +++ b/builtin/rm.c @@ -35,8 +35,8 @@ static int get_ours_cache_pos(const char *path, int pos) { int i = -pos - 1; - while ((i < active_nr) && !strcmp(active_cache[i]->name, path)) { - if (ce_stage(active_cache[i]) == 2) + while ((i < the_index.cache_nr) && !strcmp(the_index.cache[i]->name, path)) { + if (ce_stage(the_index.cache[i]) == 2) return i; i++; } @@ -72,13 +72,13 @@ static void submodules_absorb_gitdir_if_needed(void) int pos; const struct cache_entry *ce; - pos = cache_name_pos(name, strlen(name)); + pos = index_name_pos(&the_index, name, strlen(name)); if (pos < 0) { pos = get_ours_cache_pos(name, pos); if (pos < 0) continue; } - ce = active_cache[pos]; + ce = the_index.cache[pos]; if (!S_ISGITLINK(ce->ce_mode) || !file_exists(ce->name) || @@ -86,8 +86,7 @@ static void submodules_absorb_gitdir_if_needed(void) continue; if (!submodule_uses_gitfile(name)) - absorb_git_dir_into_superproject(name, - ABSORB_GITDIR_RECURSE_SUBMODULES); + absorb_git_dir_into_superproject(name); } } @@ -117,7 +116,7 @@ static int check_local_mod(struct object_id *head, int index_only) int local_changes = 0; int staged_changes = 0; - pos = cache_name_pos(name, strlen(name)); + pos = index_name_pos(&the_index, name, strlen(name)); if (pos < 0) { /* * Skip unmerged entries except for populated submodules @@ -127,11 +126,11 @@ static int check_local_mod(struct object_id *head, int index_only) if (pos < 0) continue; - if (!S_ISGITLINK(active_cache[pos]->ce_mode) || + if (!S_ISGITLINK(the_index.cache[pos]->ce_mode) || is_empty_dir(name)) continue; } - ce = active_cache[pos]; + ce = the_index.cache[pos]; if (lstat(ce->name, &st) < 0) { if (!is_missing_file_error(errno)) @@ -168,7 +167,7 @@ static int check_local_mod(struct object_id *head, int index_only) * Is the index different from the file in the work tree? * If it's a submodule, is its work tree modified? */ - if (ce_match_stat(ce, &st, 0) || + if (ie_match_stat(&the_index, ce, &st, 0) || (S_ISGITLINK(ce->ce_mode) && bad_to_remove_submodule(ce->name, SUBMODULE_REMOVAL_DIE_ON_ERROR | @@ -291,9 +290,9 @@ int cmd_rm(int argc, const char **argv, const char *prefix) prepare_repo_settings(the_repository); the_repository->settings.command_requires_full_index = 0; - hold_locked_index(&lock_file, LOCK_DIE_ON_ERROR); + repo_hold_locked_index(the_repository, &lock_file, LOCK_DIE_ON_ERROR); - if (read_cache() < 0) + if (repo_read_index(the_repository) < 0) die(_("index file corrupt")); refresh_index(&the_index, REFRESH_QUIET|REFRESH_UNMERGED, &pathspec, NULL, NULL); @@ -303,8 +302,8 @@ int cmd_rm(int argc, const char **argv, const char *prefix) if (pathspec_needs_expanded_index(&the_index, &pathspec)) ensure_full_index(&the_index); - for (i = 0; i < active_nr; i++) { - const struct cache_entry *ce = active_cache[i]; + for (i = 0; i < the_index.cache_nr; i++) { + const struct cache_entry *ce = the_index.cache[i]; if (!include_sparse && (ce_skip_worktree(ce) || @@ -386,7 +385,7 @@ int cmd_rm(int argc, const char **argv, const char *prefix) if (!quiet) printf("rm '%s'\n", path); - if (remove_file_from_cache(path)) + if (remove_file_from_index(&the_index, path)) die(_("git rm: unable to remove %s"), path); } diff --git a/builtin/stash.c b/builtin/stash.c index bb5485b409..62e36718d3 100644 --- a/builtin/stash.c +++ b/builtin/stash.c @@ -261,11 +261,11 @@ static int reset_tree(struct object_id *i_tree, int update, int reset) struct tree *tree; struct lock_file lock_file = LOCK_INIT; - read_cache_preload(NULL); - if (refresh_cache(REFRESH_QUIET)) + repo_read_index_preload(the_repository, NULL, 0); + if (refresh_index(&the_index, REFRESH_QUIET, NULL, NULL, NULL)) return -1; - hold_locked_index(&lock_file, LOCK_DIE_ON_ERROR); + repo_hold_locked_index(the_repository, &lock_file, LOCK_DIE_ON_ERROR); memset(&opts, 0, sizeof(opts)); @@ -454,10 +454,10 @@ static void unstage_changes_unless_new(struct object_id *orig_tree) * path, but left it out of the working tree, then clear the * SKIP_WORKTREE bit and write it to the working tree. */ - if (pos >= 0 && ce_skip_worktree(active_cache[pos])) { + if (pos >= 0 && ce_skip_worktree(the_index.cache[pos])) { struct stat st; - ce = active_cache[pos]; + ce = the_index.cache[pos]; if (!lstat(ce->name, &st)) { /* Conflicting path present; relocate it */ struct strbuf new_path = STRBUF_INIT; @@ -523,8 +523,9 @@ static int do_apply_stash(const char *prefix, struct stash_info *info, struct tree *head, *merge, *merge_base; struct lock_file lock = LOCK_INIT; - read_cache_preload(NULL); - if (refresh_and_write_cache(REFRESH_QUIET, 0, 0)) + repo_read_index_preload(the_repository, NULL, 0); + if (repo_refresh_and_write_index(the_repository, REFRESH_QUIET, 0, 0, + NULL, NULL, NULL)) return -1; if (write_cache_as_tree(&c_tree, 0, NULL)) @@ -549,14 +550,14 @@ static int do_apply_stash(const char *prefix, struct stash_info *info, return error(_("conflicts in index. " "Try without --index.")); - discard_cache(); - read_cache(); + discard_index(&the_index); + repo_read_index(the_repository); if (write_cache_as_tree(&index_tree, 0, NULL)) return error(_("could not save index tree")); reset_head(); - discard_cache(); - read_cache(); + discard_index(&the_index); + repo_read_index(the_repository); } } @@ -1082,7 +1083,7 @@ static int check_changes_tracked_files(const struct pathspec *ps) if (get_oid("HEAD", &dummy)) return -1; - if (read_cache() < 0) + if (repo_read_index(the_repository) < 0) return -1; init_revisions(&rev, NULL); @@ -1286,7 +1287,7 @@ static int stash_working_tree(struct stash_info *info, const struct pathspec *ps rev.diffopt.format_callback = add_diff_to_buf; rev.diffopt.format_callback_data = &diff_output; - if (read_cache_preload(&rev.diffopt.pathspec) < 0) { + if (repo_read_index_preload(the_repository, &rev.diffopt.pathspec, 0) < 0) { ret = -1; goto done; } @@ -1344,8 +1345,9 @@ static int do_create_stash(const struct pathspec *ps, struct strbuf *stash_msg_b prepare_fallback_ident("git stash", "git@stash"); - read_cache_preload(NULL); - if (refresh_and_write_cache(REFRESH_QUIET, 0, 0) < 0) { + repo_read_index_preload(the_repository, NULL, 0); + if (repo_refresh_and_write_index(the_repository, REFRESH_QUIET, 0, 0, + NULL, NULL, NULL) < 0) { ret = -1; goto done; } @@ -1513,15 +1515,15 @@ static int do_push_stash(const struct pathspec *ps, const char *stash_msg, int q goto done; } - read_cache_preload(NULL); + repo_read_index_preload(the_repository, NULL, 0); if (!include_untracked && ps->nr) { int i; char *ps_matched = xcalloc(ps->nr, 1); /* TODO: audit for interaction with sparse-index. */ ensure_full_index(&the_index); - for (i = 0; i < active_nr; i++) - ce_path_match(&the_index, active_cache[i], ps, + for (i = 0; i < the_index.cache_nr; i++) + ce_path_match(&the_index, the_index.cache[i], ps, ps_matched); if (report_path_error(ps_matched, ps)) { @@ -1533,7 +1535,8 @@ static int do_push_stash(const struct pathspec *ps, const char *stash_msg, int q free(ps_matched); } - if (refresh_and_write_cache(REFRESH_QUIET, 0, 0)) { + if (repo_refresh_and_write_index(the_repository, REFRESH_QUIET, 0, 0, + NULL, NULL, NULL)) { ret = -1; goto done; } @@ -1590,7 +1593,7 @@ static int do_push_stash(const struct pathspec *ps, const char *stash_msg, int q goto done; } } - discard_cache(); + discard_index(&the_index); if (ps->nr) { struct child_process cp_add = CHILD_PROCESS_INIT; struct child_process cp_diff = CHILD_PROCESS_INIT; diff --git a/builtin/submodule--helper.c b/builtin/submodule--helper.c index a7683d3529..6743fb27bd 100644 --- a/builtin/submodule--helper.c +++ b/builtin/submodule--helper.c @@ -1,4 +1,4 @@ -#define USE_THE_INDEX_COMPATIBILITY_MACROS +#define USE_THE_INDEX_VARIABLE #include "builtin.h" #include "repository.h" #include "cache.h" @@ -196,11 +196,11 @@ static int module_list_compute(const char **argv, if (pathspec->nr) ps_matched = xcalloc(pathspec->nr, 1); - if (read_cache() < 0) + if (repo_read_index(the_repository) < 0) die(_("index file corrupt")); - for (i = 0; i < active_nr; i++) { - const struct cache_entry *ce = active_cache[i]; + for (i = 0; i < the_index.cache_nr; i++) { + const struct cache_entry *ce = the_index.cache[i]; if (!match_pathspec(&the_index, pathspec, ce->name, ce_namelen(ce), 0, ps_matched, 1) || @@ -209,8 +209,8 @@ static int module_list_compute(const char **argv, ALLOC_GROW(list->entries, list->nr + 1, list->alloc); list->entries[list->nr++] = ce; - while (i + 1 < active_nr && - !strcmp(ce->name, active_cache[i + 1]->name)) + while (i + 1 < the_index.cache_nr && + !strcmp(ce->name, the_index.cache[i + 1]->name)) /* * Skip entries with the same name in different stages * to make sure an entry is returned only once. @@ -616,6 +616,9 @@ static void status_submodule(const char *path, const struct object_id *ce_oid, int diff_files_result; struct strbuf buf = STRBUF_INIT; const char *git_dir; + struct setup_revision_opt opt = { + .free_removed_argv_elements = 1, + }; if (!submodule_from_path(the_repository, null_oid(), path)) die(_("no submodule mapping found in .gitmodules for path '%s'"), @@ -649,9 +652,7 @@ static void status_submodule(const char *path, const struct object_id *ce_oid, repo_init_revisions(the_repository, &rev, NULL); rev.abbrev = 0; - diff_files_args.nr = setup_revisions(diff_files_args.nr, - diff_files_args.v, - &rev, NULL); + setup_revisions(diff_files_args.nr, diff_files_args.v, &rev, &opt); diff_files_result = run_diff_files(&rev, 0); if (!diff_result_code(&rev.diffopt, diff_files_result)) { @@ -1042,7 +1043,7 @@ static void prepare_submodule_summary(struct summary_cb *info, } static void submodule_summary_callback(struct diff_queue_struct *q, - struct diff_options *options, + struct diff_options *options UNUSED, void *data) { int i; @@ -1109,13 +1110,13 @@ static int compute_summary_module_list(struct object_id *head_oid, if (!info->cached) { if (diff_cmd == DIFF_INDEX) setup_work_tree(); - if (read_cache_preload(&rev.diffopt.pathspec) < 0) { - perror("read_cache_preload"); + if (repo_read_index_preload(the_repository, &rev.diffopt.pathspec, 0) < 0) { + perror("repo_read_index_preload"); ret = -1; goto cleanup; } - } else if (read_cache() < 0) { - perror("read_cache"); + } else if (repo_read_index(the_repository) < 0) { + perror("repo_read_cache"); ret = -1; goto cleanup; } @@ -1378,8 +1379,7 @@ static void deinit_submodule(const char *path, const char *prefix, ".git file by using absorbgitdirs."), displaypath); - absorb_git_dir_into_superproject(path, - ABSORB_GITDIR_RECURSE_SUBMODULES); + absorb_git_dir_into_superproject(path); } @@ -2643,9 +2643,6 @@ static int module_update(int argc, const char **argv, const char *prefix) N_("traverse submodules recursively")), OPT_BOOL('N', "no-fetch", &opt.nofetch, N_("don't fetch new objects from the remote site")), - OPT_STRING(0, "prefix", &opt.prefix, - N_("path"), - N_("path into the working tree")), OPT_SET_INT(0, "checkout", &opt.update_default, N_("use the 'checkout' update strategy (default)"), SM_UPDATE_CHECKOUT), @@ -2701,6 +2698,7 @@ static int module_update(int argc, const char **argv, const char *prefix) } opt.filter_options = &filter_options; + opt.prefix = prefix; if (opt.update_default) opt.update_strategy.type = opt.update_default; @@ -2830,13 +2828,7 @@ static int absorb_git_dirs(int argc, const char **argv, const char *prefix) int i; struct pathspec pathspec = { 0 }; struct module_list list = MODULE_LIST_INIT; - unsigned flags = ABSORB_GITDIR_RECURSE_SUBMODULES; struct option embed_gitdir_options[] = { - OPT_STRING(0, "prefix", &prefix, - N_("path"), - N_("path into the working tree")), - OPT_BIT(0, "--recursive", &flags, N_("recurse into submodules"), - ABSORB_GITDIR_RECURSE_SUBMODULES), OPT_END() }; const char *const git_submodule_helper_usage[] = { @@ -2852,7 +2844,7 @@ static int absorb_git_dirs(int argc, const char **argv, const char *prefix) goto cleanup; for (i = 0; i < list.nr; i++) - absorb_git_dir_into_superproject(list.entries[i]->name, flags); + absorb_git_dir_into_superproject(list.entries[i]->name); ret = 0; cleanup: @@ -2861,51 +2853,6 @@ cleanup: return ret; } -static int module_config(int argc, const char **argv, const char *prefix) -{ - enum { - CHECK_WRITEABLE = 1, - DO_UNSET = 2 - } command = 0; - struct option module_config_options[] = { - OPT_CMDMODE(0, "check-writeable", &command, - N_("check if it is safe to write to the .gitmodules file"), - CHECK_WRITEABLE), - OPT_CMDMODE(0, "unset", &command, - N_("unset the config in the .gitmodules file"), - DO_UNSET), - OPT_END() - }; - const char *const git_submodule_helper_usage[] = { - N_("git submodule--helper config <name> [<value>]"), - N_("git submodule--helper config --unset <name>"), - "git submodule--helper config --check-writeable", - NULL - }; - - argc = parse_options(argc, argv, prefix, module_config_options, - git_submodule_helper_usage, PARSE_OPT_KEEP_ARGV0); - - if (argc == 1 && command == CHECK_WRITEABLE) - return is_writing_gitmodules_ok() ? 0 : -1; - - /* Equivalent to ACTION_GET in builtin/config.c */ - if (argc == 2 && command != DO_UNSET) - return print_config_from_gitmodules(the_repository, argv[1]); - - /* Equivalent to ACTION_SET in builtin/config.c */ - if (argc == 3 || (argc == 2 && command == DO_UNSET)) { - const char *value = (argc == 3) ? argv[2] : NULL; - - if (!is_writing_gitmodules_ok()) - die(_("please make sure that the .gitmodules file is in the working tree")); - - return config_set_in_gitmodules_file_gently(argv[1], value); - } - - 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; @@ -3240,7 +3187,7 @@ static void die_on_index_match(const char *path, int force) const char *args[] = { path, NULL }; parse_pathspec(&ps, 0, PATHSPEC_PREFER_CWD, NULL, args); - if (read_cache_preload(NULL) < 0) + if (repo_read_index_preload(the_repository, NULL, 0) < 0) die(_("index file corrupt")); if (ps.nr) { @@ -3255,15 +3202,15 @@ static void die_on_index_match(const char *path, int force) * need to check ps_matched[0] to know if a cache * entry matched. */ - for (i = 0; i < active_nr; i++) { - ce_path_match(&the_index, active_cache[i], &ps, + for (i = 0; i < the_index.cache_nr; i++) { + ce_path_match(&the_index, the_index.cache[i], &ps, ps_matched); if (ps_matched[0]) { if (!force) die(_("'%s' already exists in the index"), path); - if (!S_ISGITLINK(active_cache[i]->ce_mode)) + if (!S_ISGITLINK(the_index.cache[i]->ce_mode)) die(_("'%s' already exists in the index " "and is not a submodule"), path); break; @@ -3404,48 +3351,45 @@ cleanup: return ret; } -#define SUPPORT_SUPER_PREFIX (1<<0) - -struct cmd_struct { - const char *cmd; - int (*fn)(int, const char **, const char *); - unsigned option; -}; - -static struct cmd_struct commands[] = { - {"clone", module_clone, SUPPORT_SUPER_PREFIX}, - {"add", module_add, 0}, - {"update", module_update, SUPPORT_SUPER_PREFIX}, - {"foreach", module_foreach, SUPPORT_SUPER_PREFIX}, - {"init", module_init, 0}, - {"status", module_status, SUPPORT_SUPER_PREFIX}, - {"sync", module_sync, SUPPORT_SUPER_PREFIX}, - {"deinit", module_deinit, 0}, - {"summary", module_summary, 0}, - {"push-check", push_check, 0}, - {"absorbgitdirs", absorb_git_dirs, SUPPORT_SUPER_PREFIX}, - {"config", module_config, 0}, - {"set-url", module_set_url, 0}, - {"set-branch", module_set_branch, 0}, - {"create-branch", module_create_branch, 0}, -}; - int cmd_submodule__helper(int argc, const char **argv, const char *prefix) { - int i; - if (argc < 2 || !strcmp(argv[1], "-h")) - usage("git submodule--helper <command>"); - - for (i = 0; i < ARRAY_SIZE(commands); i++) { - if (!strcmp(argv[1], commands[i].cmd)) { - if (get_super_prefix() && - !(commands[i].option & SUPPORT_SUPER_PREFIX)) - die(_("%s doesn't support --super-prefix"), - commands[i].cmd); - return commands[i].fn(argc - 1, argv + 1, prefix); - } - } + const char *cmd = argv[0]; + const char *subcmd; + parse_opt_subcommand_fn *fn = NULL; + const char *const usage[] = { + N_("git submodule--helper <command>"), + NULL + }; + struct option options[] = { + OPT_SUBCOMMAND("clone", &fn, module_clone), + OPT_SUBCOMMAND("add", &fn, module_add), + OPT_SUBCOMMAND("update", &fn, module_update), + OPT_SUBCOMMAND("foreach", &fn, module_foreach), + OPT_SUBCOMMAND("init", &fn, module_init), + OPT_SUBCOMMAND("status", &fn, module_status), + OPT_SUBCOMMAND("sync", &fn, module_sync), + OPT_SUBCOMMAND("deinit", &fn, module_deinit), + OPT_SUBCOMMAND("summary", &fn, module_summary), + OPT_SUBCOMMAND("push-check", &fn, push_check), + OPT_SUBCOMMAND("absorbgitdirs", &fn, absorb_git_dirs), + OPT_SUBCOMMAND("set-url", &fn, module_set_url), + OPT_SUBCOMMAND("set-branch", &fn, module_set_branch), + OPT_SUBCOMMAND("create-branch", &fn, module_create_branch), + OPT_END() + }; + argc = parse_options(argc, argv, prefix, options, usage, 0); + subcmd = argv[0]; + + if (strcmp(subcmd, "clone") && strcmp(subcmd, "update") && + strcmp(subcmd, "foreach") && strcmp(subcmd, "status") && + strcmp(subcmd, "sync") && strcmp(subcmd, "absorbgitdirs") && + get_super_prefix()) + /* + * xstrfmt() rather than "%s %s" to keep the translated + * string identical to git.c's. + */ + die(_("%s doesn't support --super-prefix"), + xstrfmt("'%s %s'", cmd, subcmd)); - die(_("'%s' is not a valid submodule--helper " - "subcommand"), argv[1]); + return fn(argc, argv, prefix); } diff --git a/builtin/update-index.c b/builtin/update-index.c index 7b0c924d7d..82d5902cc8 100644 --- a/builtin/update-index.c +++ b/builtin/update-index.c @@ -237,16 +237,16 @@ done: static int mark_ce_flags(const char *path, int flag, int mark) { int namelen = strlen(path); - int pos = cache_name_pos(path, namelen); + int pos = index_name_pos(&the_index, path, namelen); if (0 <= pos) { - mark_fsmonitor_invalid(&the_index, active_cache[pos]); + mark_fsmonitor_invalid(&the_index, the_index.cache[pos]); if (mark) - active_cache[pos]->ce_flags |= flag; + the_index.cache[pos]->ce_flags |= flag; else - active_cache[pos]->ce_flags &= ~flag; - active_cache[pos]->ce_flags |= CE_UPDATE_IN_BASE; + the_index.cache[pos]->ce_flags &= ~flag; + the_index.cache[pos]->ce_flags |= CE_UPDATE_IN_BASE; cache_tree_invalidate_path(&the_index, path); - active_cache_changed |= CE_ENTRY_CHANGED; + the_index.cache_changed |= CE_ENTRY_CHANGED; return 0; } return -1; @@ -256,7 +256,7 @@ static int remove_one_path(const char *path) { if (!allow_remove) return error("%s: does not exist and --remove not passed", path); - if (remove_file_from_cache(path)) + if (remove_file_from_index(&the_index, path)) return error("%s: cannot remove from the index", path); return 0; } @@ -281,7 +281,7 @@ static int add_one_path(const struct cache_entry *old, const char *path, int len struct cache_entry *ce; /* Was the old index entry already up-to-date? */ - if (old && !ce_stage(old) && !ce_match_stat(old, st, 0)) + if (old && !ce_stage(old) && !ie_match_stat(&the_index, old, st, 0)) return 0; ce = make_empty_cache_entry(&the_index, len); @@ -298,7 +298,7 @@ static int add_one_path(const struct cache_entry *old, const char *path, int len } option = allow_add ? ADD_CACHE_OK_TO_ADD : 0; option |= allow_replace ? ADD_CACHE_OK_TO_REPLACE : 0; - if (add_cache_entry(ce, option)) { + if (add_index_entry(&the_index, ce, option)) { discard_cache_entry(ce); return error("%s: cannot add to the index - missing --add option?", path); } @@ -331,11 +331,11 @@ static int add_one_path(const struct cache_entry *old, const char *path, int len static int process_directory(const char *path, int len, struct stat *st) { struct object_id oid; - int pos = cache_name_pos(path, len); + int pos = index_name_pos(&the_index, path, len); /* Exact match: file or existing gitlink */ if (pos >= 0) { - const struct cache_entry *ce = active_cache[pos]; + const struct cache_entry *ce = the_index.cache[pos]; if (S_ISGITLINK(ce->ce_mode)) { /* Do nothing to the index if there is no HEAD! */ @@ -350,8 +350,8 @@ static int process_directory(const char *path, int len, struct stat *st) /* Inexact match: is there perhaps a subdirectory match? */ pos = -pos-1; - while (pos < active_nr) { - const struct cache_entry *ce = active_cache[pos++]; + while (pos < the_index.cache_nr) { + const struct cache_entry *ce = the_index.cache[pos++]; if (strncmp(ce->name, path, len)) break; @@ -382,7 +382,7 @@ static int process_path(const char *path, struct stat *st, int stat_errno) return error("'%s' is beyond a symbolic link", path); pos = cache_name_pos(path, len); - ce = pos < 0 ? NULL : active_cache[pos]; + ce = pos < 0 ? NULL : the_index.cache[pos]; if (ce && ce_skip_worktree(ce)) { /* * working directory version is assumed "good" @@ -390,7 +390,7 @@ static int process_path(const char *path, struct stat *st, int stat_errno) * On the other hand, removing it from index should work */ if (!ignore_skip_worktree_entries && allow_remove && - remove_file_from_cache(path)) + remove_file_from_index(&the_index, path)) return error("%s: cannot remove from the index", path); return 0; } @@ -429,7 +429,7 @@ static int add_cacheinfo(unsigned int mode, const struct object_id *oid, ce->ce_flags |= CE_VALID; option = allow_add ? ADD_CACHE_OK_TO_ADD : 0; option |= allow_replace ? ADD_CACHE_OK_TO_REPLACE : 0; - if (add_cache_entry(ce, option)) + if (add_index_entry(&the_index, ce, option)) return error("%s: cannot add to the index - missing --add option?", path); report("add '%s'", path); @@ -441,11 +441,11 @@ static void chmod_path(char flip, const char *path) int pos; struct cache_entry *ce; - pos = cache_name_pos(path, strlen(path)); + pos = index_name_pos(&the_index, path, strlen(path)); if (pos < 0) goto fail; - ce = active_cache[pos]; - if (chmod_cache_entry(ce, flip) < 0) + ce = the_index.cache[pos]; + if (chmod_index_entry(&the_index, ce, flip) < 0) goto fail; report("chmod %cx '%s'", flip, path); @@ -488,7 +488,7 @@ static void update_one(const char *path) } if (force_remove) { - if (remove_file_from_cache(path)) + if (remove_file_from_index(&the_index, path)) die("git update-index: unable to remove %s", path); report("remove '%s'", path); return; @@ -571,7 +571,7 @@ static void read_index_info(int nul_term_line) if (!mode) { /* mode == 0 means there is no such path -- remove */ - if (remove_file_from_cache(path_name)) + if (remove_file_from_index(&the_index, path_name)) die("git update-index: unable to remove %s", ptr); } @@ -638,12 +638,12 @@ static int unresolve_one(const char *path) struct cache_entry *ce_2 = NULL, *ce_3 = NULL; /* See if there is such entry in the index. */ - pos = cache_name_pos(path, namelen); + pos = index_name_pos(&the_index, path, namelen); if (0 <= pos) { /* already merged */ - pos = unmerge_cache_entry_at(pos); - if (pos < active_nr) { - const struct cache_entry *ce = active_cache[pos]; + pos = unmerge_index_entry_at(&the_index, pos); + if (pos < the_index.cache_nr) { + const struct cache_entry *ce = the_index.cache[pos]; if (ce_stage(ce) && ce_namelen(ce) == namelen && !memcmp(ce->name, path, namelen)) @@ -656,8 +656,8 @@ static int unresolve_one(const char *path) * want to do anything in the former case. */ pos = -pos-1; - if (pos < active_nr) { - const struct cache_entry *ce = active_cache[pos]; + if (pos < the_index.cache_nr) { + const struct cache_entry *ce = the_index.cache[pos]; if (ce_namelen(ce) == namelen && !memcmp(ce->name, path, namelen)) { fprintf(stderr, @@ -686,13 +686,13 @@ static int unresolve_one(const char *path) goto free_return; } - remove_file_from_cache(path); - if (add_cache_entry(ce_2, ADD_CACHE_OK_TO_ADD)) { + remove_file_from_index(&the_index, path); + if (add_index_entry(&the_index, ce_2, ADD_CACHE_OK_TO_ADD)) { error("%s: cannot add our version to the index.", path); ret = -1; goto free_return; } - if (!add_cache_entry(ce_3, ADD_CACHE_OK_TO_ADD)) + if (!add_index_entry(&the_index, ce_3, ADD_CACHE_OK_TO_ADD)) return 0; error("%s: cannot add their version to the index.", path); ret = -1; @@ -752,8 +752,8 @@ static int do_reupdate(const char **paths, */ has_head = 0; redo: - for (pos = 0; pos < active_nr; pos++) { - const struct cache_entry *ce = active_cache[pos]; + for (pos = 0; pos < the_index.cache_nr; pos++) { + const struct cache_entry *ce = the_index.cache[pos]; struct cache_entry *old = NULL; int save_nr; char *path; @@ -782,12 +782,12 @@ static int do_reupdate(const char **paths, * path anymore, in which case, under 'allow_remove', * or worse yet 'allow_replace', active_nr may decrease. */ - save_nr = active_nr; + save_nr = the_index.cache_nr; path = xstrdup(ce->name); update_one(path); free(path); discard_cache_entry(old); - if (save_nr != active_nr) + if (save_nr != the_index.cache_nr) goto redo; } clear_pathspec(&pathspec); @@ -802,18 +802,19 @@ struct refresh_params { static int refresh(struct refresh_params *o, unsigned int flag) { setup_work_tree(); - read_cache(); - *o->has_errors |= refresh_cache(o->flags | flag); + repo_read_index(the_repository); + *o->has_errors |= refresh_index(&the_index, o->flags | flag, NULL, + NULL, NULL); if (has_racy_timestamp(&the_index)) { /* * Even if nothing else has changed, updating the file * increases the chance that racy timestamps become * non-racy, helping future run-time performance. * We do that even in case of "errors" returned by - * refresh_cache() as these are no actual errors. + * refresh_index() as these are no actual errors. * cmd_status() does the same. */ - active_cache_changed |= SOMETHING_CHANGED; + the_index.cache_changed |= SOMETHING_CHANGED; } return 0; } @@ -850,7 +851,7 @@ static int resolve_undo_clear_callback(const struct option *opt, { BUG_ON_OPT_NEG(unset); BUG_ON_OPT_ARG(arg); - resolve_undo_clear(); + resolve_undo_clear_index(&the_index); return 0; } @@ -951,7 +952,7 @@ static enum parse_opt_result unresolve_callback( *has_errors = do_unresolve(ctx->argc, ctx->argv, prefix, prefix ? strlen(prefix) : 0); if (*has_errors) - active_cache_changed = 0; + the_index.cache_changed = 0; ctx->argv += ctx->argc - 1; ctx->argc = 1; @@ -972,7 +973,7 @@ static enum parse_opt_result reupdate_callback( setup_work_tree(); *has_errors = do_reupdate(ctx->argv + 1, prefix); if (*has_errors) - active_cache_changed = 0; + the_index.cache_changed = 0; ctx->argv += ctx->argc - 1; ctx->argc = 1; @@ -1109,11 +1110,11 @@ int cmd_update_index(int argc, const char **argv, const char *prefix) the_repository->settings.command_requires_full_index = 0; /* we will diagnose later if it turns out that we need to update it */ - newfd = hold_locked_index(&lock_file, 0); + newfd = repo_hold_locked_index(the_repository, &lock_file, 0); if (newfd < 0) lock_error = errno; - entries = read_cache(); + entries = repo_read_index(the_repository); if (entries < 0) die("cache corrupted"); @@ -1178,7 +1179,7 @@ int cmd_update_index(int argc, const char **argv, const char *prefix) INDEX_FORMAT_LB, INDEX_FORMAT_UB); if (the_index.version != preferred_index_format) - active_cache_changed |= SOMETHING_CHANGED; + the_index.cache_changed |= SOMETHING_CHANGED; the_index.version = preferred_index_format; } @@ -1290,7 +1291,7 @@ int cmd_update_index(int argc, const char **argv, const char *prefix) report(_("fsmonitor disabled")); } - if (active_cache_changed || force_write) { + if (the_index.cache_changed || force_write) { if (newfd < 0) { if (refresh_args.flags & REFRESH_QUIET) exit(128); @@ -433,42 +433,18 @@ typedef int (*must_prefetch_predicate)(const struct cache_entry *); void prefetch_cache_entries(const struct index_state *istate, must_prefetch_predicate must_prefetch); -#ifdef USE_THE_INDEX_COMPATIBILITY_MACROS +#if defined(USE_THE_INDEX_COMPATIBILITY_MACROS) || defined(USE_THE_INDEX_VARIABLE) extern struct index_state the_index; -#define active_cache (the_index.cache) +#ifndef USE_THE_INDEX_VARIABLE +#ifdef USE_THE_INDEX_COMPATIBILITY_MACROS #define active_nr (the_index.cache_nr) -#define active_alloc (the_index.cache_alloc) -#define active_cache_changed (the_index.cache_changed) -#define active_cache_tree (the_index.cache_tree) #define read_cache() repo_read_index(the_repository) -#define read_cache_from(path) read_index_from(&the_index, (path), (get_git_dir())) -#define read_cache_preload(pathspec) repo_read_index_preload(the_repository, (pathspec), 0) -#define is_cache_unborn() is_index_unborn(&the_index) -#define read_cache_unmerged() repo_read_index_unmerged(the_repository) #define discard_cache() discard_index(&the_index) -#define unmerged_cache() unmerged_index(&the_index) #define cache_name_pos(name, namelen) index_name_pos(&the_index,(name),(namelen)) -#define add_cache_entry(ce, option) add_index_entry(&the_index, (ce), (option)) -#define rename_cache_entry_at(pos, new_name) rename_index_entry_at(&the_index, (pos), (new_name)) -#define remove_cache_entry_at(pos) remove_index_entry_at(&the_index, (pos)) -#define remove_file_from_cache(path) remove_file_from_index(&the_index, (path)) -#define add_to_cache(path, st, flags) add_to_index(&the_index, (path), (st), (flags)) -#define add_file_to_cache(path, flags) add_file_to_index(&the_index, (path), (flags)) -#define chmod_cache_entry(ce, flip) chmod_index_entry(&the_index, (ce), (flip)) -#define refresh_cache(flags) refresh_index(&the_index, (flags), NULL, NULL, NULL) -#define refresh_and_write_cache(refresh_flags, write_flags, gentle) repo_refresh_and_write_index(the_repository, (refresh_flags), (write_flags), (gentle), NULL, NULL, NULL) -#define ce_match_stat(ce, st, options) ie_match_stat(&the_index, (ce), (st), (options)) -#define ce_modified(ce, st, options) ie_modified(&the_index, (ce), (st), (options)) -#define cache_dir_exists(name, namelen) index_dir_exists(&the_index, (name), (namelen)) -#define cache_file_exists(name, namelen, igncase) index_file_exists(&the_index, (name), (namelen), (igncase)) -#define cache_name_is_other(name, namelen) index_name_is_other(&the_index, (name), (namelen)) -#define resolve_undo_clear() resolve_undo_clear_index(&the_index) -#define unmerge_cache_entry_at(at) unmerge_index_entry_at(&the_index, at) -#define unmerge_cache(pathspec) unmerge_index(&the_index, pathspec) -#define read_blob_data_from_cache(path, sz) read_blob_data_from_index(&the_index, (path), (sz)) -#define hold_locked_index(lock_file, flags) repo_hold_locked_index(the_repository, (lock_file), (flags)) +#endif +#endif #endif #define TYPE_BITS 3 @@ -789,7 +765,7 @@ void ensure_full_index(struct index_state *istate); */ int write_locked_index(struct index_state *, struct lock_file *lock, unsigned flags); -int discard_index(struct index_state *); +void discard_index(struct index_state *); void move_index_extensions(struct index_state *dst, struct index_state *src); int unmerged_index(const struct index_state *); @@ -1889,7 +1865,7 @@ unsigned ws_check(const char *line, int len, unsigned ws_rule); void ws_check_emit(const char *line, int len, unsigned ws_rule, FILE *stream, const char *set, const char *reset, const char *ws); char *whitespace_error_string(unsigned ws); void ws_fix_copy(struct strbuf *, const char *, int, unsigned, int *); -int ws_blank_line(const char *line, int len, unsigned ws_rule); +int ws_blank_line(const char *line, int len); #define ws_tab_width(rule) ((rule) & WS_TAB_WIDTH_MASK) /* ls-files */ diff --git a/ci/install-dependencies.sh b/ci/install-dependencies.sh index 107757a1fe..4f407530d3 100755 --- a/ci/install-dependencies.sh +++ b/ci/install-dependencies.sh @@ -5,17 +5,17 @@ . ${0%/*}/lib.sh -P4WHENCE=https://cdist2.perforce.com/perforce/r$LINUX_P4_VERSION +P4WHENCE=https://cdist2.perforce.com/perforce/r21.2 LFSWHENCE=https://github.com/github/git-lfs/releases/download/v$LINUX_GIT_LFS_VERSION UBUNTU_COMMON_PKGS="make libssl-dev libcurl4-openssl-dev libexpat-dev tcl tk gettext zlib1g-dev perl-modules liberror-perl libauthen-sasl-perl libemail-valid-perl libio-socket-ssl-perl libnet-smtp-ssl-perl" case "$runs_on_pool" in -ubuntu-latest) +ubuntu-*) sudo apt-get -q update sudo apt-get -q -y install language-pack-is libsvn-perl apache2 \ - $UBUNTU_COMMON_PKGS $CC_PACKAGE + $UBUNTU_COMMON_PKGS $CC_PACKAGE $PYTHON_PACKAGE mkdir --parents "$P4_PATH" pushd "$P4_PATH" wget --quiet "$P4WHENCE/bin.linux26x86_64/p4d" @@ -30,7 +30,7 @@ ubuntu-latest) cp git-lfs-$LINUX_GIT_LFS_VERSION/git-lfs . popd ;; -macos-latest) +macos-*) export HOMEBREW_NO_AUTO_UPDATE=1 HOMEBREW_NO_INSTALL_CLEANUP=1 # Uncomment this if you want to run perf tests: # brew install gnu-time @@ -40,7 +40,7 @@ macos-latest) mkdir -p $HOME/bin ( cd $HOME/bin - wget -q "https://cdist2.perforce.com/perforce/r21.2/bin.macosx1015x86_64/helix-core-server.tgz" && + wget -q "$P4WHENCE/bin.macosx1015x86_64/helix-core-server.tgz" && tar -xf helix-core-server.tgz && sudo xattr -d com.apple.quarantine p4 p4d 2>/dev/null || true ) @@ -83,9 +83,9 @@ esac if type p4d >/dev/null 2>&1 && type p4 >/dev/null 2>&1 then echo "$(tput setaf 6)Perforce Server Version$(tput sgr0)" - p4d -V | grep Rev. + p4d -V echo "$(tput setaf 6)Perforce Client Version$(tput sgr0)" - p4 -V | grep Rev. + p4 -V else echo >&2 "WARNING: perforce wasn't installed, see above for clues why" fi @@ -226,18 +226,18 @@ export GIT_TEST_CLONE_2GB=true export SKIP_DASHED_BUILT_INS=YesPlease case "$runs_on_pool" in -ubuntu-latest) +ubuntu-*) if test "$jobname" = "linux-gcc-default" then break fi - if [ "$jobname" = linux-gcc ] + PYTHON_PACKAGE=python2 + if test "$jobname" = linux-gcc then - MAKEFLAGS="$MAKEFLAGS PYTHON_PATH=/usr/bin/python3" - else - MAKEFLAGS="$MAKEFLAGS PYTHON_PATH=/usr/bin/python2" + PYTHON_PACKAGE=python3 fi + MAKEFLAGS="$MAKEFLAGS PYTHON_PATH=/usr/bin/$PYTHON_PACKAGE" export GIT_TEST_HTTPD=true @@ -246,21 +246,20 @@ ubuntu-latest) # were recorded in the Homebrew database upon creating the OS X # image. # Keep that in mind when you encounter a broken OS X build! - export LINUX_P4_VERSION="16.2" export LINUX_GIT_LFS_VERSION="1.5.2" P4_PATH="$HOME/custom/p4" GIT_LFS_PATH="$HOME/custom/git-lfs" export PATH="$GIT_LFS_PATH:$P4_PATH:$PATH" ;; -macos-latest) +macos-*) if [ "$jobname" = osx-gcc ] then MAKEFLAGS="$MAKEFLAGS PYTHON_PATH=$(which python3)" else MAKEFLAGS="$MAKEFLAGS PYTHON_PATH=$(which python2)" MAKEFLAGS="$MAKEFLAGS NO_APPLE_COMMON_CRYPTO=NoThanks" - MAKEFLAGS="$MAKEFLAGS DC_SHA1=YesPlease NO_OPENSSL=NoThanks" + MAKEFLAGS="$MAKEFLAGS NO_OPENSSL=NoThanks" fi ;; esac @@ -23,7 +23,7 @@ struct column_data { /* return length of 's' in letters, ANSI escapes stripped */ static int item_length(const char *s) { - return utf8_strnwidth(s, -1, 1); + return utf8_strnwidth(s, strlen(s), 1); } /* diff --git a/combine-diff.c b/combine-diff.c index b0ece95480..1a39b5dde0 100644 --- a/combine-diff.c +++ b/combine-diff.c @@ -372,7 +372,7 @@ struct combine_diff_state { static void consume_hunk(void *state_, long ob, long on, long nb, long nn, - const char *funcline, long funclen) + const char *func UNUSED, long funclen UNUSED) { struct combine_diff_state *state = state_; @@ -701,8 +701,10 @@ static void clear_commit_marks_1(struct commit_list **plist, if (!parents) return; - while ((parents = parents->next)) - commit_list_insert(parents->item, plist); + while ((parents = parents->next)) { + if (parents->item->object.flags & mark) + commit_list_insert(parents->item, plist); + } commit = commit->parents->item; } diff --git a/compat/fsmonitor/fsm-listen-darwin.c b/compat/fsmonitor/fsm-listen-darwin.c index daeee4e465..cc9af1e3cb 100644 --- a/compat/fsmonitor/fsm-listen-darwin.c +++ b/compat/fsmonitor/fsm-listen-darwin.c @@ -336,7 +336,7 @@ static void fsevent_callback(ConstFSEventStreamRef streamRef, * know how much to invalidate/refresh. */ - if (event_flags[k] & kFSEventStreamEventFlagItemIsFile) { + if (event_flags[k] & (kFSEventStreamEventFlagItemIsFile | kFSEventStreamEventFlagItemIsSymlink)) { const char *rel = path_k + state->path_worktree_watch.len + 1; diff --git a/compat/regcomp_enhanced.c b/compat/regcomp_enhanced.c new file mode 100644 index 0000000000..84193ce53b --- /dev/null +++ b/compat/regcomp_enhanced.c @@ -0,0 +1,9 @@ +#include "../git-compat-util.h" +#undef regcomp + +int git_regcomp(regex_t *preg, const char *pattern, int cflags) +{ + if (!(cflags & REG_EXTENDED)) + cflags |= REG_ENHANCED; + return regcomp(preg, pattern, cflags); +} @@ -1160,21 +1160,26 @@ static int git_parse_signed(const char *value, intmax_t *ret, intmax_t max) if (value && *value) { char *end; intmax_t val; - uintmax_t uval; - uintmax_t factor; + intmax_t factor; + + if (max < 0) + BUG("max must be a positive integer"); errno = 0; val = strtoimax(value, &end, 0); if (errno == ERANGE) return 0; + if (end == value) { + errno = EINVAL; + return 0; + } factor = get_unit_factor(end); if (!factor) { errno = EINVAL; return 0; } - uval = val < 0 ? -val : val; - if (unsigned_mult_overflows(factor, uval) || - factor * uval > max) { + if ((val < 0 && -max / factor > val) || + (val > 0 && max / factor < val)) { errno = ERANGE; return 0; } @@ -1193,10 +1198,19 @@ static int git_parse_unsigned(const char *value, uintmax_t *ret, uintmax_t max) uintmax_t val; uintmax_t factor; + /* negative values would be accepted by strtoumax */ + if (strchr(value, '-')) { + errno = EINVAL; + return 0; + } errno = 0; val = strtoumax(value, &end, 0); if (errno == ERANGE) return 0; + if (end == value) { + errno = EINVAL; + return 0; + } factor = get_unit_factor(end); if (!factor) { errno = EINVAL; @@ -3473,9 +3487,10 @@ void git_config_set_multivar(const char *key, const char *value, flags); } -static int section_name_match (const char *buf, const char *name) +static size_t section_name_match (const char *buf, const char *name) { - int i = 0, j = 0, dot = 0; + size_t i = 0, j = 0; + int dot = 0; if (buf[i] != '[') return 0; for (i = 1; buf[i] && buf[i] != ']'; i++) { @@ -3528,6 +3543,8 @@ static int section_name_is_ok(const char *name) return 1; } +#define GIT_CONFIG_MAX_LINE_LEN (512 * 1024) + /* if new_name == NULL, the section is removed instead */ static int git_config_copy_or_rename_section_in_file(const char *config_filename, const char *old_name, @@ -3537,11 +3554,12 @@ static int git_config_copy_or_rename_section_in_file(const char *config_filename char *filename_buf = NULL; struct lock_file lock = LOCK_INIT; int out_fd; - char buf[1024]; + struct strbuf buf = STRBUF_INIT; FILE *config_file = NULL; struct stat st; struct strbuf copystr = STRBUF_INIT; struct config_store_data store; + uint32_t line_nr = 0; memset(&store, 0, sizeof(store)); @@ -3578,16 +3596,25 @@ static int git_config_copy_or_rename_section_in_file(const char *config_filename goto out; } - while (fgets(buf, sizeof(buf), config_file)) { - unsigned i; - int length; + while (!strbuf_getwholeline(&buf, config_file, '\n')) { + size_t i, length; int is_section = 0; - char *output = buf; - for (i = 0; buf[i] && isspace(buf[i]); i++) + char *output = buf.buf; + + line_nr++; + + if (buf.len >= GIT_CONFIG_MAX_LINE_LEN) { + ret = error(_("refusing to work with overly long line " + "in '%s' on line %"PRIuMAX), + config_filename, (uintmax_t)line_nr); + goto out; + } + + for (i = 0; buf.buf[i] && isspace(buf.buf[i]); i++) ; /* do nothing */ - if (buf[i] == '[') { + if (buf.buf[i] == '[') { /* it's a section */ - int offset; + size_t offset; is_section = 1; /* @@ -3604,7 +3631,7 @@ static int git_config_copy_or_rename_section_in_file(const char *config_filename strbuf_reset(©str); } - offset = section_name_match(&buf[i], old_name); + offset = section_name_match(&buf.buf[i], old_name); if (offset > 0) { ret++; if (!new_name) { @@ -3679,6 +3706,7 @@ out: out_no_rollback: free(filename_buf); config_store_data_clear(&store); + strbuf_release(&buf); return ret; } diff --git a/config.mak.uname b/config.mak.uname index d63629fe80..7d25995265 100644 --- a/config.mak.uname +++ b/config.mak.uname @@ -147,6 +147,7 @@ ifeq ($(uname_S),Darwin) FREAD_READS_DIRECTORIES = UnfortunatelyYes HAVE_NS_GET_EXECUTABLE_PATH = YesPlease CSPRNG_METHOD = arc4random + USE_ENHANCED_BASIC_REGULAR_EXPRESSIONS = YesPlease # Workaround for `gettext` being keg-only and not even being linked via # `brew link --force gettext`, should be obsolete as of @@ -66,7 +66,7 @@ static NORETURN void die_initial_contact(int unexpected) } /* Checks if the server supports the capability 'c' */ -int server_supports_v2(const char *c, int die_on_error) +int server_supports_v2(const char *c) { int i; @@ -76,11 +76,13 @@ int server_supports_v2(const char *c, int die_on_error) (!*out || *out == '=')) return 1; } + return 0; +} - if (die_on_error) +void ensure_server_supports_v2(const char *c) +{ + if (!server_supports_v2(c)) die(_("server doesn't support '%s'"), c); - - return 0; } int server_feature_v2(const char *c, const char **v) @@ -477,7 +479,7 @@ static void send_capabilities(int fd_out, struct packet_reader *reader) { const char *hash_name; - if (server_supports_v2("agent", 0)) + if (server_supports_v2("agent")) packet_write_fmt(fd_out, "agent=%s", git_user_agent_sanitized()); if (server_feature_v2("object-format", &hash_name)) { @@ -504,17 +506,18 @@ struct ref **get_remote_refs(int fd_out, struct packet_reader *reader, &transport_options->unborn_head_target : NULL; *list = NULL; - if (server_supports_v2("ls-refs", 1)) - packet_write_fmt(fd_out, "command=ls-refs\n"); + ensure_server_supports_v2("ls-refs"); + packet_write_fmt(fd_out, "command=ls-refs\n"); /* Send capabilities */ send_capabilities(fd_out, reader); - if (server_options && server_options->nr && - server_supports_v2("server-option", 1)) + if (server_options && server_options->nr) { + ensure_server_supports_v2("server-option"); for (i = 0; i < server_options->nr; i++) packet_write_fmt(fd_out, "server-option=%s", server_options->items[i].string); + } packet_delim(fd_out); /* When pushing we don't want to request the peeled tags */ @@ -20,7 +20,8 @@ enum protocol_version discover_version(struct packet_reader *reader); int server_supports_hash(const char *desired, int *feature_supported); const char *parse_feature_value(const char *feature_list, const char *feature, int *lenp, int *offset); -int server_supports_v2(const char *c, int die_on_error); +int server_supports_v2(const char *c); +void ensure_server_supports_v2(const char *c); int server_feature_v2(const char *c, const char **v); int server_supports_feature(const char *c, const char *feature, int die_on_error); diff --git a/connected.c b/connected.c index 74a20cb32e..4f6388eed7 100644 --- a/connected.c +++ b/connected.c @@ -100,6 +100,9 @@ no_promisor_pack_found: strvec_push(&rev_list.args, "--exclude-promisor-objects"); if (!opt->is_deepening_fetch) { strvec_push(&rev_list.args, "--not"); + if (opt->exclude_hidden_refs_section) + strvec_pushf(&rev_list.args, "--exclude-hidden=%s", + opt->exclude_hidden_refs_section); strvec_push(&rev_list.args, "--all"); } strvec_push(&rev_list.args, "--quiet"); diff --git a/connected.h b/connected.h index 6e59c92aa3..16b2c84f2e 100644 --- a/connected.h +++ b/connected.h @@ -46,6 +46,13 @@ struct check_connected_options { * during a fetch. */ unsigned is_deepening_fetch : 1; + + /* + * If not NULL, use `--exclude-hidden=$section` to exclude all refs + * hidden via the `$section.hideRefs` config from the set of + * already-reachable refs. + */ + const char *exclude_hidden_refs_section; }; #define CHECK_CONNECTED_INIT { 0 } diff --git a/contrib/buildsystems/CMakeLists.txt b/contrib/buildsystems/CMakeLists.txt index 3957e4cf8c..2f6e0197ff 100644 --- a/contrib/buildsystems/CMakeLists.txt +++ b/contrib/buildsystems/CMakeLists.txt @@ -1025,7 +1025,6 @@ set(NO_PERL ) set(NO_PTHREADS ) set(NO_PYTHON ) set(PAGER_ENV "LESS=FRX LV=-c") -set(DC_SHA1 YesPlease) set(RUNTIME_PREFIX true) set(NO_GETTEXT ) @@ -1061,7 +1060,6 @@ file(APPEND ${CMAKE_BINARY_DIR}/GIT-BUILD-OPTIONS "NO_PERL='${NO_PERL}'\n") file(APPEND ${CMAKE_BINARY_DIR}/GIT-BUILD-OPTIONS "NO_PTHREADS='${NO_PTHREADS}'\n") file(APPEND ${CMAKE_BINARY_DIR}/GIT-BUILD-OPTIONS "NO_UNIX_SOCKETS='${NO_UNIX_SOCKETS}'\n") file(APPEND ${CMAKE_BINARY_DIR}/GIT-BUILD-OPTIONS "PAGER_ENV='${PAGER_ENV}'\n") -file(APPEND ${CMAKE_BINARY_DIR}/GIT-BUILD-OPTIONS "DC_SHA1='${DC_SHA1}'\n") file(APPEND ${CMAKE_BINARY_DIR}/GIT-BUILD-OPTIONS "X='${EXE_EXTENSION}'\n") file(APPEND ${CMAKE_BINARY_DIR}/GIT-BUILD-OPTIONS "NO_GETTEXT='${NO_GETTEXT}'\n") file(APPEND ${CMAKE_BINARY_DIR}/GIT-BUILD-OPTIONS "RUNTIME_PREFIX='${RUNTIME_PREFIX}'\n") diff --git a/contrib/coccinelle/.gitignore b/contrib/coccinelle/.gitignore index d3f29646dc..1d45c0a40c 100644 --- a/contrib/coccinelle/.gitignore +++ b/contrib/coccinelle/.gitignore @@ -1 +1 @@ -*.patch* +*.patch diff --git a/contrib/coccinelle/README b/contrib/coccinelle/README index f0e80bd7f0..d1daa1f626 100644 --- a/contrib/coccinelle/README +++ b/contrib/coccinelle/README @@ -41,3 +41,52 @@ There are two types of semantic patches: This allows to expose plans of pending large scale refactorings without impacting the bad pattern checks. + +Git-specific tips & things to know about how we run "spatch": + + * The "make coccicheck" will piggy-back on + "COMPUTE_HEADER_DEPENDENCIES". If you've built a given object file + the "coccicheck" target will consider its depednency to decide if + it needs to re-run on the corresponding source file. + + This means that a "make coccicheck" will re-compile object files + before running. This might be unexpected, but speeds up the run in + the common case, as e.g. a change to "column.h" won't require all + coccinelle rules to be re-run against "grep.c" (or another file + that happens not to use "column.h"). + + To disable this behavior use the "SPATCH_USE_O_DEPENDENCIES=NoThanks" + flag. + + * To speed up our rules the "make coccicheck" target will by default + concatenate all of the *.cocci files here into an "ALL.cocci", and + apply it to each source file. + + This makes the run faster, as we don't need to run each rule + against each source file. See the Makefile for further discussion, + this behavior can be disabled with "SPATCH_CONCAT_COCCI=". + + But since they're concatenated any <id> in the <rulname> (e.g. "@ + my_name", v.s. anonymous "@@") needs to be unique across all our + *.cocci files. You should only need to name rules if other rules + depend on them (currently only one rule is named). + + * To speed up incremental runs even more use the "spatchcache" tool + in this directory as your "SPATCH". It aimns to be a "ccache" for + coccinelle, and piggy-backs on "COMPUTE_HEADER_DEPENDENCIES". + + It caches in Redis by default, see it source for a how-to. + + In one setup with a primed cache "make coccicheck" followed by a + "make clean && make" takes around 10s to run, but 2m30s with the + default of "SPATCH_CONCAT_COCCI=Y". + + With "SPATCH_CONCAT_COCCI=" the total runtime is around ~6m, sped + up to ~1m with "spatchcache". + + Most of the 10s (or ~1m) being spent on re-running "spatch" on + files we couldn't cache, as we didn't compile them (in contrib/* + and compat/* mostly). + + The absolute times will differ for you, but the relative speedup + from caching should be on that order. diff --git a/contrib/coccinelle/hashmap.cocci b/contrib/coccinelle/hashmap.cocci index d69e120ccf..c5dbb4557b 100644 --- a/contrib/coccinelle/hashmap.cocci +++ b/contrib/coccinelle/hashmap.cocci @@ -1,4 +1,4 @@ -@ hashmap_entry_init_usage @ +@@ expression E; struct hashmap_entry HME; @@ diff --git a/contrib/coccinelle/index-compatibility.cocci b/contrib/coccinelle/index-compatibility.cocci new file mode 100644 index 0000000000..8520f03128 --- /dev/null +++ b/contrib/coccinelle/index-compatibility.cocci @@ -0,0 +1,139 @@ +// the_index.* variables +@@ +identifier AC = active_cache; +identifier ACC = active_cache_changed; +identifier ACT = active_cache_tree; +@@ +( +- AC ++ the_index.cache +| +- ACC ++ the_index.cache_changed +| +- ACT ++ the_index.cache_tree +) + +@@ +identifier AN = active_nr; +identifier f != prepare_to_commit; +@@ + f(...) {<... +- AN ++ the_index.cache_nr + ...>} + +// "the_repository" simple cases +@@ +@@ +( +- read_cache_unmerged ++ repo_read_index_unmerged +| +- hold_locked_index ++ repo_hold_locked_index +) + ( ++ the_repository, + ...) + +// "the_repository" special-cases +@@ +@@ +( +- read_cache_preload ++ repo_read_index_preload +) + ( ++ the_repository, + ... ++ , 0 + ) + +// "the_index" simple cases +@@ +@@ +( +- is_cache_unborn ++ is_index_unborn +| +- unmerged_cache ++ unmerged_index +| +- rename_cache_entry_at ++ rename_index_entry_at +| +- chmod_cache_entry ++ chmod_index_entry +| +- cache_file_exists ++ index_file_exists +| +- cache_name_is_other ++ index_name_is_other +| +- unmerge_cache_entry_at ++ unmerge_index_entry_at +| +- add_to_cache ++ add_to_index +| +- add_file_to_cache ++ add_file_to_index +| +- add_cache_entry ++ add_index_entry +| +- remove_file_from_cache ++ remove_file_from_index +| +- ce_match_stat ++ ie_match_stat +| +- ce_modified ++ ie_modified +| +- resolve_undo_clear ++ resolve_undo_clear_index +) + ( ++ &the_index, + ...) + +@@ +@@ +( +- refresh_and_write_cache ++ repo_refresh_and_write_index +) + ( ++ the_repository, + ... ++ , NULL, NULL, NULL + ) + +// "the_index" special-cases +@@ +@@ +( +- read_cache_from ++ read_index_from +) + ( ++ &the_index, + ... ++ , get_git_dir() + ) + +@@ +@@ +( +- refresh_cache ++ refresh_index +) + ( ++ &the_index, + ... ++ , NULL, NULL, NULL + ) diff --git a/contrib/coccinelle/index-compatibility.pending.cocci b/contrib/coccinelle/index-compatibility.pending.cocci new file mode 100644 index 0000000000..01f875d006 --- /dev/null +++ b/contrib/coccinelle/index-compatibility.pending.cocci @@ -0,0 +1,24 @@ +// "the_repository" simple cases +@@ +@@ +( +- read_cache ++ repo_read_index +) + ( ++ the_repository, + ...) + +// "the_index" simple cases +@@ +@@ +( +- discard_cache ++ discard_index +| +- cache_name_pos ++ index_name_pos +) + ( ++ &the_index, + ...) diff --git a/contrib/coccinelle/preincr.cocci b/contrib/coccinelle/preincr.cocci index 7fe1e8d2d9..ae42cb0730 100644 --- a/contrib/coccinelle/preincr.cocci +++ b/contrib/coccinelle/preincr.cocci @@ -1,4 +1,4 @@ -@ preincrement @ +@@ identifier i; @@ - ++i > 1 diff --git a/contrib/coccinelle/spatchcache b/contrib/coccinelle/spatchcache new file mode 100755 index 0000000000..29e9352d8a --- /dev/null +++ b/contrib/coccinelle/spatchcache @@ -0,0 +1,304 @@ +#!/bin/sh +# +# spatchcache: a poor-man's "ccache"-alike for "spatch" in git.git +# +# This caching command relies on the peculiarities of the Makefile +# driving "spatch" in git.git, in particular if we invoke: +# +# make +# # See "spatchCache.cacheWhenStderr" for why "--very-quiet" is +# # used +# make coccicheck SPATCH_FLAGS=--very-quiet +# +# We can with COMPUTE_HEADER_DEPENDENCIES (auto-detected as true with +# "gcc" and "clang") write e.g. a .depend/grep.o.d for grep.c, when we +# compile grep.o. +# +# The .depend/grep.o.d will have the full header dependency tree of +# grep.c, and we can thus cache the output of "spatch" by: +# +# 1. Hashing all of those files +# 2. Hashing our source file, and the *.cocci rule we're +# applying +# 3. Running spatch, if suggests no changes (by far the common +# case) we invoke "spatchCache.getCmd" and +# "spatchCache.setCmd" with a hash SHA-256 to ask "does this +# ID have no changes" or "say that ID had no changes> +# 4. If no "spatchCache.{set,get}Cmd" is specified we'll use +# "redis-cli" and maintain a SET called "spatch-cache". Set +# appropriate redis memory policies to keep it from growing +# out of control. +# +# This along with the general incremental "make" support for +# "contrib/coccinelle" makes it viable to (re-)run coccicheck +# e.g. when merging integration branches. +# +# Note that the "--very-quiet" flag is currently critical. The cache +# will refuse to cache anything that has output on STDERR (which might +# be errors from spatch), but see spatchCache.cacheWhenStderr below. +# +# The STDERR (and exit code) could in principle be cached (as with +# ccache), but then the simple structure in the Redis cache would need +# to change, so just supply "--very-quiet" for now. +# +# To use this, simply set SPATCH to +# contrib/coccinelle/spatchcache. Then optionally set: +# +# [spatchCache] +# # Optional: path to a custom spatch +# spatch = ~/g/coccicheck/spatch.opt +# +# As well as this trace config (debug implies trace): +# +# cacheWhenStderr = true +# trace = false +# debug = false +# +# The ".depend/grep.o.d" can also be customized, as a string that will +# be eval'd, it has access to a "$dirname" and "$basename": +# +# [spatchCache] +# dependFormat = "$dirname/.depend/${basename%.c}.o.d" +# +# Setting "trace" to "true" allows for seeing when we have a cache HIT +# or MISS. To debug whether the cache is working do that, and run e.g.: +# +# redis-cli FLUSHALL +# <make && make coccicheck, as above> +# grep -hore HIT -e MISS -e SET -e NOCACHE -e CANTCACHE .build/contrib/coccinelle | sort | uniq -c +# 600 CANTCACHE +# 7365 MISS +# 7365 SET +# +# A subsequent "make cocciclean && make coccicheck" should then have +# all "HIT"'s and "CANTCACHE"'s. +# +# The "spatchCache.cacheWhenStderr" option is critical when using +# spatchCache.{trace,debug} to debug whether something is set in the +# cache, as we'll write to the spatch logs in .build/* we'd otherwise +# always emit a NOCACHE. +# +# Reading the config can make the command much slower, to work around +# this the config can be set in the environment, with environment +# variable name corresponding to the config key. "default" can be used +# to use whatever's the script default, e.g. setting +# spatchCache.cacheWhenStderr=true and deferring to the defaults for +# the rest is: +# +# export GIT_CONTRIB_SPATCHCACHE_DEBUG=default +# export GIT_CONTRIB_SPATCHCACHE_TRACE=default +# export GIT_CONTRIB_SPATCHCACHE_CACHEWHENSTDERR=true +# export GIT_CONTRIB_SPATCHCACHE_SPATCH=default +# export GIT_CONTRIB_SPATCHCACHE_DEPENDFORMAT=default +# export GIT_CONTRIB_SPATCHCACHE_SETCMD=default +# export GIT_CONTRIB_SPATCHCACHE_GETCMD=default + +set -e + +env_or_config () { + env="$1" + shift + if test "$env" = "default" + then + # Avoid expensive "git config" invocation + return + elif test -n "$env" + then + echo "$env" + else + git config $@ || : + fi +} + +## Our own configuration & options +debug=$(env_or_config "$GIT_CONTRIB_SPATCHCACHE_DEBUG" --bool "spatchCache.debug") +if test "$debug" != "true" +then + debug= +fi +if test -n "$debug" +then + set -x +fi + +trace=$(env_or_config "$GIT_CONTRIB_SPATCHCACHE_TRACE" --bool "spatchCache.trace") +if test "$trace" != "true" +then + trace= +fi +if test -n "$debug" +then + # debug implies trace + trace=true +fi + +cacheWhenStderr=$(env_or_config "$GIT_CONTRIB_SPATCHCACHE_CACHEWHENSTDERR" --bool "spatchCache.cacheWhenStderr") +if test "$cacheWhenStderr" != "true" +then + cacheWhenStderr= +fi + +trace_it () { + if test -z "$trace" + then + return + fi + echo "$@" >&2 +} + +spatch=$(env_or_config "$GIT_CONTRIB_SPATCHCACHE_SPATCH" --path "spatchCache.spatch") +if test -n "$spatch" +then + if test -n "$debug" + then + trace_it "custom spatchCache.spatch='$spatch'" + fi +else + spatch=spatch +fi + +dependFormat='$dirname/.depend/${basename%.c}.o.d' +dependFormatCfg=$(env_or_config "$GIT_CONTRIB_SPATCHCACHE_DEPENDFORMAT" "spatchCache.dependFormat") +if test -n "$dependFormatCfg" +then + dependFormat="$dependFormatCfg" +fi + +set=$(env_or_config "$GIT_CONTRIB_SPATCHCACHE_SETCMD" "spatchCache.setCmd") +get=$(env_or_config "$GIT_CONTRIB_SPATCHCACHE_GETCMD" "spatchCache.getCmd") + +## Parse spatch()-like command-line for caching info +arg_sp= +arg_file= +args="$@" +spatch_opts() { + while test $# != 0 + do + arg_file="$1" + case "$1" in + --sp-file) + arg_sp="$2" + ;; + esac + shift + done +} +spatch_opts "$@" +if ! test -f "$arg_file" +then + arg_file= +fi + +hash_for_cache() { + # Parameters that should affect the cache + echo "args=$args" + echo "config spatchCache.spatch=$spatch" + echo "config spatchCache.debug=$debug" + echo "config spatchCache.trace=$trace" + echo "config spatchCache.cacheWhenStderr=$cacheWhenStderr" + echo + + # Our target file and its dependencies + git hash-object "$1" "$2" $(grep -E -o '^[^:]+:$' "$3" | tr -d ':') +} + +# Sanity checks +if ! test -f "$arg_sp" && ! test -f "$arg_file" +then + echo $0: no idea how to cache "$@" >&2 + exit 128 +fi + +# Main logic +dirname=$(dirname "$arg_file") +basename=$(basename "$arg_file") +eval "dep=$dependFormat" + +if ! test -f "$dep" +then + trace_it "$0: CANTCACHE have no '$dep' for '$arg_file'!" + exec "$spatch" "$@" +fi + +if test -n "$debug" +then + trace_it "$0: The full cache input for '$arg_sp' '$arg_file' '$dep'" + hash_for_cache "$arg_sp" "$arg_file" "$dep" >&2 +fi +sum=$(hash_for_cache "$arg_sp" "$arg_file" "$dep" | git hash-object --stdin) + +trace_it "$0: processing '$arg_file' with '$arg_sp' rule, and got hash '$sum' for it + '$dep'" + +getret= +if test -z "$get" +then + if test $(redis-cli SISMEMBER spatch-cache "$sum") = 1 + then + getret=0 + else + getret=1 + fi +else + $set "$sum" + getret=$? +fi + +if test "$getret" = 0 +then + trace_it "$0: HIT for '$arg_file' with '$arg_sp'" + exit 0 +else + trace_it "$0: MISS: for '$arg_file' with '$arg_sp'" +fi + +out="$(mktemp)" +err="$(mktemp)" + +set +e +"$spatch" "$@" >"$out" 2>>"$err" +ret=$? +cat "$out" +cat "$err" >&2 +set -e + +nocache= +if test $ret != 0 +then + nocache="exited non-zero: $ret" +elif test -s "$out" +then + nocache="had patch output" +elif test -z "$cacheWhenStderr" && test -s "$err" +then + nocache="had stderr (use --very-quiet or spatchCache.cacheWhenStderr=true?)" +fi + +if test -n "$nocache" +then + trace_it "$0: NOCACHE ($nocache): for '$arg_file' with '$arg_sp'" + exit "$ret" +fi + +trace_it "$0: SET: for '$arg_file' with '$arg_sp'" + +setret= +if test -z "$set" +then + if test $(redis-cli SADD spatch-cache "$sum") = 1 + then + setret=0 + else + setret=1 + fi +else + "$set" "$sum" + setret=$? +fi + +if test "$setret" != 0 +then + echo "FAILED to set '$sum' in cache!" >&2 + exit 128 +fi + +exit "$ret" diff --git a/contrib/coccinelle/strbuf.cocci b/contrib/coccinelle/strbuf.cocci index 0970d98ad7..5f06105df6 100644 --- a/contrib/coccinelle/strbuf.cocci +++ b/contrib/coccinelle/strbuf.cocci @@ -1,4 +1,4 @@ -@ strbuf_addf_with_format_only @ +@@ expression E; constant fmt !~ "%"; @@ diff --git a/contrib/coccinelle/swap.cocci b/contrib/coccinelle/swap.cocci index a0934d1fda..522177afb6 100644 --- a/contrib/coccinelle/swap.cocci +++ b/contrib/coccinelle/swap.cocci @@ -1,4 +1,4 @@ -@ swap_with_declaration @ +@@ type T; identifier tmp; T a, b; diff --git a/contrib/coccinelle/the_repository.pending.cocci b/contrib/coccinelle/the_repository.pending.cocci index 072ea0d922..747d382ff5 100644 --- a/contrib/coccinelle/the_repository.pending.cocci +++ b/contrib/coccinelle/the_repository.pending.cocci @@ -20,7 +20,6 @@ expression E; @@ expression E; -expression F; @@ - has_object_file_with_flags( + repo_has_object_file_with_flags(the_repository, diff --git a/delta-islands.c b/delta-islands.c index 26f9e99e1a..90c0d6958f 100644 --- a/delta-islands.c +++ b/delta-islands.c @@ -26,8 +26,6 @@ static kh_oid_map_t *island_marks; static unsigned island_counter; static unsigned island_counter_core; -static kh_str_t *remote_islands; - struct remote_island { uint64_t hash; struct oid_array oids; @@ -312,29 +310,55 @@ void resolve_tree_islands(struct repository *r, free(todo); } -static regex_t *island_regexes; -static unsigned int island_regexes_alloc, island_regexes_nr; +struct island_load_data { + kh_str_t *remote_islands; + regex_t *rx; + size_t nr; + size_t alloc; +}; static const char *core_island_name; -static int island_config_callback(const char *k, const char *v, void *cb UNUSED) +static void free_config_regexes(struct island_load_data *ild) { + for (size_t i = 0; i < ild->nr; i++) + regfree(&ild->rx[i]); + free(ild->rx); +} + +static void free_remote_islands(kh_str_t *remote_islands) +{ + const char *island_name; + struct remote_island *rl; + + kh_foreach(remote_islands, island_name, rl, { + free((void *)island_name); + oid_array_clear(&rl->oids); + free(rl); + }); + kh_destroy_str(remote_islands); +} + +static int island_config_callback(const char *k, const char *v, void *cb) +{ + struct island_load_data *ild = cb; + if (!strcmp(k, "pack.island")) { struct strbuf re = STRBUF_INIT; if (!v) return config_error_nonbool(k); - ALLOC_GROW(island_regexes, island_regexes_nr + 1, island_regexes_alloc); + ALLOC_GROW(ild->rx, ild->nr + 1, ild->alloc); if (*v != '^') strbuf_addch(&re, '^'); strbuf_addstr(&re, v); - if (regcomp(&island_regexes[island_regexes_nr], re.buf, REG_EXTENDED)) + if (regcomp(&ild->rx[ild->nr], re.buf, REG_EXTENDED)) die(_("failed to load island regex for '%s': %s"), k, re.buf); strbuf_release(&re); - island_regexes_nr++; + ild->nr++; return 0; } @@ -344,7 +368,8 @@ static int island_config_callback(const char *k, const char *v, void *cb UNUSED) return 0; } -static void add_ref_to_island(const char *island_name, const struct object_id *oid) +static void add_ref_to_island(kh_str_t *remote_islands, const char *island_name, + const struct object_id *oid) { uint64_t sha_core; struct remote_island *rl = NULL; @@ -365,8 +390,10 @@ static void add_ref_to_island(const char *island_name, const struct object_id *o } static int find_island_for_ref(const char *refname, const struct object_id *oid, - int flags UNUSED, void *data UNUSED) + int flags UNUSED, void *cb) { + struct island_load_data *ild = cb; + /* * We should advertise 'ARRAY_SIZE(matches) - 2' as the max, * so we can diagnose below a config with more capture groups @@ -377,8 +404,8 @@ static int find_island_for_ref(const char *refname, const struct object_id *oid, struct strbuf island_name = STRBUF_INIT; /* walk backwards to get last-one-wins ordering */ - for (i = island_regexes_nr - 1; i >= 0; i--) { - if (!regexec(&island_regexes[i], refname, + for (i = ild->nr - 1; i >= 0; i--) { + if (!regexec(&ild->rx[i], refname, ARRAY_SIZE(matches), matches, 0)) break; } @@ -403,12 +430,12 @@ static int find_island_for_ref(const char *refname, const struct object_id *oid, strbuf_add(&island_name, refname + match->rm_so, match->rm_eo - match->rm_so); } - add_ref_to_island(island_name.buf, oid); + add_ref_to_island(ild->remote_islands, island_name.buf, oid); strbuf_release(&island_name); return 0; } -static struct remote_island *get_core_island(void) +static struct remote_island *get_core_island(kh_str_t *remote_islands) { if (core_island_name) { khiter_t pos = kh_get_str(remote_islands, core_island_name); @@ -419,7 +446,7 @@ static struct remote_island *get_core_island(void) return NULL; } -static void deduplicate_islands(struct repository *r) +static void deduplicate_islands(kh_str_t *remote_islands, struct repository *r) { struct remote_island *island, *core = NULL, **list; unsigned int island_count, dst, src, ref, i = 0; @@ -445,7 +472,7 @@ static void deduplicate_islands(struct repository *r) } island_bitmap_size = (island_count / 32) + 1; - core = get_core_island(); + core = get_core_island(remote_islands); for (i = 0; i < island_count; ++i) { mark_remote_island_1(r, list[i], core && list[i]->hash == core->hash); @@ -456,12 +483,16 @@ static void deduplicate_islands(struct repository *r) void load_delta_islands(struct repository *r, int progress) { + struct island_load_data ild = { 0 }; + island_marks = kh_init_oid_map(); - remote_islands = kh_init_str(); - git_config(island_config_callback, NULL); - for_each_ref(find_island_for_ref, NULL); - deduplicate_islands(r); + git_config(island_config_callback, &ild); + ild.remote_islands = kh_init_str(); + for_each_ref(find_island_for_ref, &ild); + free_config_regexes(&ild); + deduplicate_islands(ild.remote_islands, r); + free_remote_islands(ild.remote_islands); if (progress) fprintf(stderr, _("Marked %d islands, done.\n"), island_counter); diff --git a/diff-lib.c b/diff-lib.c index 2edea41a23..dec040c366 100644 --- a/diff-lib.c +++ b/diff-lib.c @@ -673,7 +673,7 @@ int index_differs_from(struct repository *r, return (has_changes != 0); } -static struct strbuf *idiff_prefix_cb(struct diff_options *opt, void *data) +static struct strbuf *idiff_prefix_cb(struct diff_options *opt UNUSED, void *data) { return data; } @@ -604,7 +604,7 @@ static unsigned long diff_filespec_size(struct repository *r, return one->size; } -static int count_trailing_blank(mmfile_t *mf, unsigned ws_rule) +static int count_trailing_blank(mmfile_t *mf) { char *ptr = mf->ptr; long size = mf->size; @@ -622,7 +622,7 @@ static int count_trailing_blank(mmfile_t *mf, unsigned ws_rule) for (prev_eol = ptr; mf->ptr <= prev_eol; prev_eol--) if (*prev_eol == '\n') break; - if (!ws_blank_line(prev_eol + 1, ptr - prev_eol, ws_rule)) + if (!ws_blank_line(prev_eol + 1, ptr - prev_eol)) break; cnt++; ptr = prev_eol - 1; @@ -634,9 +634,8 @@ static void check_blank_at_eof(mmfile_t *mf1, mmfile_t *mf2, struct emit_callback *ecbdata) { int l1, l2, at; - unsigned ws_rule = ecbdata->ws_rule; - l1 = count_trailing_blank(mf1, ws_rule); - l2 = count_trailing_blank(mf2, ws_rule); + l1 = count_trailing_blank(mf1); + l2 = count_trailing_blank(mf2); if (l2 <= l1) { ecbdata->blank_at_eof_in_preimage = 0; ecbdata->blank_at_eof_in_postimage = 0; @@ -1583,7 +1582,7 @@ static int new_blank_line_at_eof(struct emit_callback *ecbdata, const char *line ecbdata->blank_at_eof_in_preimage <= ecbdata->lno_in_preimage && ecbdata->blank_at_eof_in_postimage <= ecbdata->lno_in_postimage)) return 0; - return ws_blank_line(line, len, ecbdata->ws_rule); + return ws_blank_line(line, len); } static void emit_add_line(struct emit_callback *ecbdata, @@ -1955,7 +1954,7 @@ static int color_words_output_graph_prefix(struct diff_words_data *diff_words) static void fn_out_diff_words_aux(void *priv, long minus_first, long minus_len, long plus_first, long plus_len, - const char *func, long funclen) + const char *func UNUSED, long funclen UNUSED) { struct diff_words_data *diff_words = priv; struct diff_words_style *style = diff_words->style; @@ -3185,8 +3184,9 @@ static int is_conflict_marker(const char *line, int marker_size, unsigned long l } static void checkdiff_consume_hunk(void *priv, - long ob, long on, long nb, long nn, - const char *func, long funclen) + long ob UNUSED, long on UNUSED, + long nb, long nn UNUSED, + const char *func UNUSED, long funclen UNUSED) { struct checkdiff_t *data = priv; @@ -4213,7 +4213,6 @@ static void prep_temp_blob(struct index_state *istate, } static struct diff_tempfile *prepare_temp_file(struct repository *r, - const char *name, struct diff_filespec *one) { struct diff_tempfile *temp = claim_diff_tempfile(); @@ -4231,18 +4230,18 @@ static struct diff_tempfile *prepare_temp_file(struct repository *r, if (!S_ISGITLINK(one->mode) && (!one->oid_valid || - reuse_worktree_file(r->index, name, &one->oid, 1))) { + reuse_worktree_file(r->index, one->path, &one->oid, 1))) { struct stat st; - if (lstat(name, &st) < 0) { + if (lstat(one->path, &st) < 0) { if (errno == ENOENT) goto not_a_valid_file; - die_errno("stat(%s)", name); + die_errno("stat(%s)", one->path); } if (S_ISLNK(st.st_mode)) { struct strbuf sb = STRBUF_INIT; - if (strbuf_readlink(&sb, name, st.st_size) < 0) - die_errno("readlink(%s)", name); - prep_temp_blob(r->index, name, temp, sb.buf, sb.len, + if (strbuf_readlink(&sb, one->path, st.st_size) < 0) + die_errno("readlink(%s)", one->path); + prep_temp_blob(r->index, one->path, temp, sb.buf, sb.len, (one->oid_valid ? &one->oid : null_oid()), (one->oid_valid ? @@ -4251,7 +4250,7 @@ static struct diff_tempfile *prepare_temp_file(struct repository *r, } else { /* we can borrow from the file in the work tree */ - temp->name = name; + temp->name = one->path; if (!one->oid_valid) oid_to_hex_r(temp->hex, null_oid()); else @@ -4269,7 +4268,7 @@ static struct diff_tempfile *prepare_temp_file(struct repository *r, else { if (diff_populate_filespec(r, one, NULL)) die("cannot read data blob for %s", one->path); - prep_temp_blob(r->index, name, temp, + prep_temp_blob(r->index, one->path, temp, one->data, one->size, &one->oid, one->mode); } @@ -4278,10 +4277,9 @@ static struct diff_tempfile *prepare_temp_file(struct repository *r, static void add_external_diff_name(struct repository *r, struct strvec *argv, - const char *name, struct diff_filespec *df) { - struct diff_tempfile *temp = prepare_temp_file(r, name, df); + struct diff_tempfile *temp = prepare_temp_file(r, df); strvec_push(argv, temp->name); strvec_push(argv, temp->hex); strvec_push(argv, temp->mode); @@ -4308,11 +4306,9 @@ static void run_external_diff(const char *pgm, strvec_push(&cmd.args, name); if (one && two) { - add_external_diff_name(o->repo, &cmd.args, name, one); - if (!other) - add_external_diff_name(o->repo, &cmd.args, name, two); - else { - add_external_diff_name(o->repo, &cmd.args, other, two); + add_external_diff_name(o->repo, &cmd.args, one); + add_external_diff_name(o->repo, &cmd.args, two); + if (other) { strvec_push(&cmd.args, other); strvec_push(&cmd.args, xfrm_msg); } @@ -5772,6 +5768,13 @@ void diff_free_filepair(struct diff_filepair *p) free(p); } +void diff_free_queue(struct diff_queue_struct *q) +{ + for (int i = 0; i < q->nr; i++) + diff_free_filepair(q->queue[i]); + free(q->queue); +} + const char *diff_aligned_abbrev(const struct object_id *oid, int len) { int abblen; @@ -6329,13 +6332,9 @@ static int diff_get_patch_id(struct diff_options *options, struct object_id *oid int diff_flush_patch_id(struct diff_options *options, struct object_id *oid, int diff_header_only) { struct diff_queue_struct *q = &diff_queued_diff; - int i; int result = diff_get_patch_id(options, oid, diff_header_only); - for (i = 0; i < q->nr; i++) - diff_free_filepair(q->queue[i]); - - free(q->queue); + diff_free_queue(q); DIFF_QUEUE_CLEAR(q); return result; @@ -6604,10 +6603,8 @@ void diff_flush(struct diff_options *options) if (output_format & DIFF_FORMAT_CALLBACK) options->format_callback(q, options, options->format_callback_data); - for (i = 0; i < q->nr; i++) - diff_free_filepair(q->queue[i]); free_queue: - free(q->queue); + diff_free_queue(q); DIFF_QUEUE_CLEAR(q); diff_free(options); @@ -7036,7 +7033,7 @@ static char *run_textconv(struct repository *r, struct strbuf buf = STRBUF_INIT; int err = 0; - temp = prepare_temp_file(r, spec->path, spec); + temp = prepare_temp_file(r, spec); strvec_push(&child.args, pgm); strvec_push(&child.args, temp->name); diff --git a/diffcore.h b/diffcore.h index badc2261c2..9b588a1ee1 100644 --- a/diffcore.h +++ b/diffcore.h @@ -162,6 +162,7 @@ struct diff_filepair *diff_queue(struct diff_queue_struct *, struct diff_filespec *, struct diff_filespec *); void diff_q(struct diff_queue_struct *, struct diff_filepair *); +void diff_free_queue(struct diff_queue_struct *q); /* dir_rename_relevance: the reason we want rename information for a dir */ enum dir_rename_relevance { diff --git a/dir-iterator.c b/dir-iterator.c index b17e9f970a..3764dd81a1 100644 --- a/dir-iterator.c +++ b/dir-iterator.c @@ -203,7 +203,7 @@ struct dir_iterator *dir_iterator_begin(const char *path, unsigned int flags) { struct dir_iterator_int *iter = xcalloc(1, sizeof(*iter)); struct dir_iterator *dir_iterator = &iter->base; - int saved_errno; + int saved_errno, err; strbuf_init(&iter->base.path, PATH_MAX); strbuf_addstr(&iter->base.path, path); @@ -213,10 +213,15 @@ struct dir_iterator *dir_iterator_begin(const char *path, unsigned int flags) iter->flags = flags; /* - * Note: stat already checks for NULL or empty strings and - * inexistent paths. + * Note: stat/lstat already checks for NULL or empty strings and + * nonexistent paths. */ - if (stat(iter->base.path.buf, &iter->base.st) < 0) { + if (iter->flags & DIR_ITERATOR_FOLLOW_SYMLINKS) + err = stat(iter->base.path.buf, &iter->base.st); + else + err = lstat(iter->base.path.buf, &iter->base.st); + + if (err < 0) { saved_errno = errno; goto error_out; } diff --git a/dir-iterator.h b/dir-iterator.h index 08229157c6..e3b6ff2800 100644 --- a/dir-iterator.h +++ b/dir-iterator.h @@ -61,6 +61,11 @@ * not the symlinks themselves, which is the default behavior. Broken * symlinks are ignored. * + * Note: setting DIR_ITERATOR_FOLLOW_SYMLINKS affects resolving the + * starting path as well (e.g., attempting to iterate starting at a + * symbolic link pointing to a directory without FOLLOW_SYMLINKS will + * result in an error). + * * Warning: circular symlinks are also followed when * DIR_ITERATOR_FOLLOW_SYMLINKS is set. The iteration may end up with * an ELOOP if they happen and DIR_ITERATOR_PEDANTIC is set. @@ -732,6 +732,13 @@ static void add_pattern_to_hashsets(struct pattern_list *pl, struct path_pattern goto clear_hashmaps; } + if (!(given->flags & PATTERN_FLAG_MUSTBEDIR) && + strcmp(given->pattern, "/*")) { + /* Not a cone pattern. */ + warning(_("unrecognized pattern: '%s'"), given->pattern); + goto clear_hashmaps; + } + prev = given->pattern; cur = given->pattern + 1; next = given->pattern + 2; diff --git a/fetch-pack.c b/fetch-pack.c index 998fc2fa1e..04016d1e32 100644 --- a/fetch-pack.c +++ b/fetch-pack.c @@ -1317,15 +1317,15 @@ static void write_fetch_command_and_capabilities(struct strbuf *req_buf, { const char *hash_name; - if (server_supports_v2("fetch", 1)) - packet_buf_write(req_buf, "command=fetch"); - if (server_supports_v2("agent", 0)) + ensure_server_supports_v2("fetch"); + packet_buf_write(req_buf, "command=fetch"); + if (server_supports_v2("agent")) packet_buf_write(req_buf, "agent=%s", git_user_agent_sanitized()); - if (advertise_sid && server_supports_v2("session-id", 0)) + if (advertise_sid && server_supports_v2("session-id")) packet_buf_write(req_buf, "session-id=%s", trace2_session_id()); - if (server_options && server_options->nr && - server_supports_v2("server-option", 1)) { + if (server_options && server_options->nr) { int i; + ensure_server_supports_v2("server-option"); for (i = 0; i < server_options->nr; i++) packet_buf_write(req_buf, "server-option=%s", server_options->items[i].string); @@ -2,6 +2,7 @@ #include "object-store.h" #include "repository.h" #include "object.h" +#include "attr.h" #include "blob.h" #include "tree.h" #include "tree-walk.h" @@ -614,17 +615,22 @@ static int fsck_tree(const struct object_id *tree_oid, ".gitmodules is a symbolic link"); } + if (is_hfs_dotgitattributes(name) || is_ntfs_dotgitattributes(name)) { + if (!S_ISLNK(mode)) + oidset_insert(&options->gitattributes_found, + entry_oid); + else + retval += report(options, tree_oid, OBJ_TREE, + FSCK_MSG_GITATTRIBUTES_SYMLINK, + ".gitattributes is a symlink"); + } + if (S_ISLNK(mode)) { if (is_hfs_dotgitignore(name) || is_ntfs_dotgitignore(name)) retval += report(options, tree_oid, OBJ_TREE, FSCK_MSG_GITIGNORE_SYMLINK, ".gitignore is a symlink"); - if (is_hfs_dotgitattributes(name) || - is_ntfs_dotgitattributes(name)) - retval += report(options, tree_oid, OBJ_TREE, - FSCK_MSG_GITATTRIBUTES_SYMLINK, - ".gitattributes is a symlink"); if (is_hfs_dotmailmap(name) || is_ntfs_dotmailmap(name)) retval += report(options, tree_oid, OBJ_TREE, @@ -1159,38 +1165,70 @@ static int fsck_gitmodules_fn(const char *var, const char *value, void *vdata) static int fsck_blob(const struct object_id *oid, const char *buf, unsigned long size, struct fsck_options *options) { - struct fsck_gitmodules_data data; - struct config_options config_opts = { 0 }; - - if (!oidset_contains(&options->gitmodules_found, oid)) - return 0; - oidset_insert(&options->gitmodules_done, oid); + int ret = 0; if (object_on_skiplist(options, oid)) return 0; - if (!buf) { - /* - * A missing buffer here is a sign that the caller found the - * blob too gigantic to load into memory. Let's just consider - * that an error. - */ - return report(options, oid, OBJ_BLOB, - FSCK_MSG_GITMODULES_LARGE, - ".gitmodules too large to parse"); + if (oidset_contains(&options->gitmodules_found, oid)) { + struct config_options config_opts = { 0 }; + struct fsck_gitmodules_data data; + + oidset_insert(&options->gitmodules_done, oid); + + if (!buf) { + /* + * A missing buffer here is a sign that the caller found the + * blob too gigantic to load into memory. Let's just consider + * that an error. + */ + return report(options, oid, OBJ_BLOB, + FSCK_MSG_GITMODULES_LARGE, + ".gitmodules too large to parse"); + } + + data.oid = oid; + data.options = options; + data.ret = 0; + config_opts.error_action = CONFIG_ERROR_SILENT; + if (git_config_from_mem(fsck_gitmodules_fn, CONFIG_ORIGIN_BLOB, + ".gitmodules", buf, size, &data, &config_opts)) + data.ret |= report(options, oid, OBJ_BLOB, + FSCK_MSG_GITMODULES_PARSE, + "could not parse gitmodules blob"); + ret |= data.ret; } - data.oid = oid; - data.options = options; - data.ret = 0; - config_opts.error_action = CONFIG_ERROR_SILENT; - if (git_config_from_mem(fsck_gitmodules_fn, CONFIG_ORIGIN_BLOB, - ".gitmodules", buf, size, &data, &config_opts)) - data.ret |= report(options, oid, OBJ_BLOB, - FSCK_MSG_GITMODULES_PARSE, - "could not parse gitmodules blob"); - - return data.ret; + if (oidset_contains(&options->gitattributes_found, oid)) { + const char *ptr; + + oidset_insert(&options->gitattributes_done, oid); + + if (!buf || size > ATTR_MAX_FILE_SIZE) { + /* + * A missing buffer here is a sign that the caller found the + * blob too gigantic to load into memory. Let's just consider + * that an error. + */ + return report(options, oid, OBJ_BLOB, + FSCK_MSG_GITATTRIBUTES_LARGE, + ".gitattributes too large to parse"); + } + + for (ptr = buf; *ptr; ) { + const char *eol = strchrnul(ptr, '\n'); + if (eol - ptr >= ATTR_MAX_LINE_LENGTH) { + ret |= report(options, oid, OBJ_BLOB, + FSCK_MSG_GITATTRIBUTES_LINE_LENGTH, + ".gitattributes has too long lines to parse"); + break; + } + + ptr = *eol ? eol + 1 : eol; + } + } + + return ret; } int fsck_object(struct object *obj, void *data, unsigned long size, @@ -1229,19 +1267,21 @@ int fsck_error_function(struct fsck_options *o, return 1; } -int fsck_finish(struct fsck_options *options) +static int fsck_blobs(struct oidset *blobs_found, struct oidset *blobs_done, + enum fsck_msg_id msg_missing, enum fsck_msg_id msg_type, + struct fsck_options *options, const char *blob_type) { int ret = 0; struct oidset_iter iter; const struct object_id *oid; - oidset_iter_init(&options->gitmodules_found, &iter); + oidset_iter_init(blobs_found, &iter); while ((oid = oidset_iter_next(&iter))) { enum object_type type; unsigned long size; char *buf; - if (oidset_contains(&options->gitmodules_done, oid)) + if (oidset_contains(blobs_done, oid)) continue; buf = read_object_file(oid, &type, &size); @@ -1249,25 +1289,36 @@ int fsck_finish(struct fsck_options *options) if (is_promisor_object(oid)) continue; ret |= report(options, - oid, OBJ_BLOB, - FSCK_MSG_GITMODULES_MISSING, - "unable to read .gitmodules blob"); + oid, OBJ_BLOB, msg_missing, + "unable to read %s blob", blob_type); continue; } if (type == OBJ_BLOB) ret |= fsck_blob(oid, buf, size, options); else - ret |= report(options, - oid, type, - FSCK_MSG_GITMODULES_BLOB, - "non-blob found at .gitmodules"); + ret |= report(options, oid, type, msg_type, + "non-blob found at %s", blob_type); free(buf); } + oidset_clear(blobs_found); + oidset_clear(blobs_done); + + return ret; +} + +int fsck_finish(struct fsck_options *options) +{ + int ret = 0; + + ret |= fsck_blobs(&options->gitmodules_found, &options->gitmodules_done, + FSCK_MSG_GITMODULES_MISSING, FSCK_MSG_GITMODULES_BLOB, + options, ".gitmodules"); + ret |= fsck_blobs(&options->gitattributes_found, &options->gitattributes_done, + FSCK_MSG_GITATTRIBUTES_MISSING, FSCK_MSG_GITATTRIBUTES_BLOB, + options, ".gitattributes"); - oidset_clear(&options->gitmodules_found); - oidset_clear(&options->gitmodules_done); return ret; } @@ -59,6 +59,10 @@ enum fsck_msg_type { FUNC(GITMODULES_URL, ERROR) \ FUNC(GITMODULES_PATH, ERROR) \ FUNC(GITMODULES_UPDATE, ERROR) \ + FUNC(GITATTRIBUTES_MISSING, ERROR) \ + FUNC(GITATTRIBUTES_LARGE, ERROR) \ + FUNC(GITATTRIBUTES_LINE_LENGTH, ERROR) \ + FUNC(GITATTRIBUTES_BLOB, ERROR) \ /* warnings */ \ FUNC(EMPTY_NAME, WARN) \ FUNC(FULL_PATHNAME, WARN) \ @@ -133,6 +137,8 @@ struct fsck_options { struct oidset skiplist; struct oidset gitmodules_found; struct oidset gitmodules_done; + struct oidset gitattributes_found; + struct oidset gitattributes_done; kh_oid_map_t *object_names; }; @@ -140,18 +146,24 @@ struct fsck_options { .skiplist = OIDSET_INIT, \ .gitmodules_found = OIDSET_INIT, \ .gitmodules_done = OIDSET_INIT, \ + .gitattributes_found = OIDSET_INIT, \ + .gitattributes_done = OIDSET_INIT, \ .error_func = fsck_error_function \ } #define FSCK_OPTIONS_STRICT { \ .strict = 1, \ .gitmodules_found = OIDSET_INIT, \ .gitmodules_done = OIDSET_INIT, \ + .gitattributes_found = OIDSET_INIT, \ + .gitattributes_done = OIDSET_INIT, \ .error_func = fsck_error_function, \ } #define FSCK_OPTIONS_MISSING_GITMODULES { \ .strict = 1, \ .gitmodules_found = OIDSET_INIT, \ .gitmodules_done = OIDSET_INIT, \ + .gitattributes_found = OIDSET_INIT, \ + .gitattributes_done = OIDSET_INIT, \ .error_func = fsck_error_cb_print_missing_gitmodules, \ } @@ -100,6 +100,8 @@ static void init_gettext_charset(const char *domain) setlocale(LC_CTYPE, "C"); } +int git_gettext_enabled = 0; + void git_setup_gettext(void) { const char *podir = getenv(GIT_TEXT_DOMAIN_DIR_ENVIRONMENT); @@ -119,6 +121,8 @@ void git_setup_gettext(void) init_gettext_charset("git"); textdomain("git"); + git_gettext_enabled = 1; + free(p); } @@ -29,9 +29,11 @@ #define FORMAT_PRESERVING(n) __attribute__((format_arg(n))) #ifndef NO_GETTEXT +extern int git_gettext_enabled; void git_setup_gettext(void); int gettext_width(const char *s); #else +#define git_gettext_enabled (0) static inline void git_setup_gettext(void) { } @@ -45,12 +47,16 @@ static inline FORMAT_PRESERVING(1) const char *_(const char *msgid) { if (!*msgid) return ""; + if (!git_gettext_enabled) + return msgid; return gettext(msgid); } static inline FORMAT_PRESERVING(1) FORMAT_PRESERVING(2) const char *Q_(const char *msgid, const char *plu, unsigned long n) { + if (!git_gettext_enabled) + return n == 1 ? msgid : plu; return ngettext(msgid, plu, n); } diff --git a/git-bisect.sh b/git-bisect.sh index 405cf76f2a..dfce4b4f44 100755 --- a/git-bisect.sh +++ b/git-bisect.sh @@ -57,28 +57,11 @@ case "$#" in case "$cmd" in help) git bisect -h ;; - start) - git bisect--helper --bisect-start "$@" ;; bad|good|new|old|"$TERM_BAD"|"$TERM_GOOD") - git bisect--helper --bisect-state "$cmd" "$@" ;; - skip) - git bisect--helper --bisect-skip "$@" || exit;; - next) - # Not sure we want "next" at the UI level anymore. - git bisect--helper --bisect-next "$@" || exit ;; - visualize|view) - git bisect--helper --bisect-visualize "$@" || exit;; - reset) - git bisect--helper --bisect-reset "$@" ;; - replay) - git bisect--helper --bisect-replay "$@" || exit;; + git bisect--helper state "$cmd" "$@" ;; log) - git bisect--helper --bisect-log || exit ;; - run) - git bisect--helper --bisect-run "$@" || exit;; - terms) - git bisect--helper --bisect-terms "$@" || exit;; + git bisect--helper log || exit ;; *) - usage ;; + git bisect--helper "$cmd" "$@" ;; esac esac diff --git a/git-compat-util.h b/git-compat-util.h index a76d0526f7..de57f435e2 100644 --- a/git-compat-util.h +++ b/git-compat-util.h @@ -341,11 +341,13 @@ struct itimerval { #endif #ifdef NO_SETITIMER -static inline int setitimer(int which UNUSED, - const struct itimerval *value UNUSED, - struct itimerval *newvalue UNUSED) { +static inline int git_setitimer(int which UNUSED, + const struct itimerval *value UNUSED, + struct itimerval *newvalue UNUSED) { return 0; /* pretend success */ } +#undef setitimer +#define setitimer(which,value,ovalue) git_setitimer(which,value,ovalue) #endif #ifndef NO_LIBGEN_H @@ -1020,6 +1022,14 @@ static inline unsigned long cast_size_t_to_ulong(size_t a) return (unsigned long)a; } +static inline int cast_size_t_to_int(size_t a) +{ + if (a > INT_MAX) + die("number too large to represent as int on this platform: %"PRIuMAX, + (uintmax_t)a); + return (int)a; +} + /* * Limit size of IO chunks, because huge chunks only cause pain. OS X * 64-bit is buggy, returning EINVAL if len >= INT_MAX; and even in @@ -1336,6 +1346,11 @@ static inline int regexec_buf(const regex_t *preg, const char *buf, size_t size, return regexec(preg, buf, nmatch, pmatch, eflags | REG_STARTEND); } +#ifdef USE_ENHANCED_BASIC_REGULAR_EXPRESSIONS +int git_regcomp(regex_t *preg, const char *pattern, int cflags); +#define regcomp git_regcomp +#endif + #ifndef DIR_HAS_BSD_GROUP_SEMANTICS # define FORCE_DIR_SET_GID S_ISGID #else @@ -1471,14 +1486,19 @@ int open_nofollow(const char *path, int flags); #endif #ifndef _POSIX_THREAD_SAFE_FUNCTIONS -static inline void flockfile(FILE *fh UNUSED) +static inline void git_flockfile(FILE *fh UNUSED) { ; /* nothing */ } -static inline void funlockfile(FILE *fh UNUSED) +static inline void git_funlockfile(FILE *fh UNUSED) { ; /* nothing */ } +#undef flockfile +#undef funlockfile +#undef getc_unlocked +#define flockfile(fh) git_flockfile(fh) +#define funlockfile(fh) git_funlockfile(fh) #define getc_unlocked(fh) getc(fh) #endif diff --git a/git-curl-compat.h b/git-curl-compat.h index 56a83b6bbd..fd96b3cdff 100644 --- a/git-curl-compat.h +++ b/git-curl-compat.h @@ -126,4 +126,12 @@ #define GIT_CURL_HAVE_CURLSSLSET_NO_BACKENDS #endif +/** + * CURLOPT_PROTOCOLS_STR and CURLOPT_REDIR_PROTOCOLS_STR were added in 7.85.0, + * released in August 2022. + */ +#if LIBCURL_VERSION_NUM >= 0x075500 +#define GIT_CURL_HAVE_CURLOPT_PROTOCOLS_STR 1 +#endif + #endif diff --git a/git-gui/Makefile b/git-gui/Makefile index 56c85a85c1..a0d5a4b28e 100644 --- a/git-gui/Makefile +++ b/git-gui/Makefile @@ -116,7 +116,7 @@ ifeq ($(uname_S),Darwin) TKEXECUTABLE = $(shell basename "$(TKFRAMEWORK)" .app) endif -ifeq ($(findstring $(MAKEFLAGS),s),s) +ifeq ($(findstring $(firstword -$(MAKEFLAGS)),s),s) QUIET_GEN = endif diff --git a/git-submodule.sh b/git-submodule.sh index 5e5d21c010..9a50f2e912 100755 --- a/git-submodule.sh +++ b/git-submodule.sh @@ -343,7 +343,6 @@ cmd_update() ${recursive:+--recursive} \ ${init:+--init} \ ${nofetch:+--no-fetch} \ - ${wt_prefix:+--prefix "$wt_prefix"} \ ${rebase:+--rebase} \ ${merge:+--merge} \ ${checkout:+--checkout} \ @@ -557,7 +556,7 @@ cmd_sync() cmd_absorbgitdirs() { - git submodule--helper absorbgitdirs --prefix "$wt_prefix" "$@" + git ${wt_prefix:+-C "$wt_prefix"} submodule--helper absorbgitdirs "$@" } # This loop parses the command line arguments to find the @@ -610,7 +610,7 @@ static struct cmd_struct commands[] = { { "stash", cmd_stash, RUN_SETUP | NEED_WORK_TREE }, { "status", cmd_status, RUN_SETUP | NEED_WORK_TREE }, { "stripspace", cmd_stripspace }, - { "submodule--helper", cmd_submodule__helper, RUN_SETUP | SUPPORT_SUPER_PREFIX | NO_PARSEOPT }, + { "submodule--helper", cmd_submodule__helper, RUN_SETUP | SUPPORT_SUPER_PREFIX }, { "switch", cmd_switch, RUN_SETUP | NEED_WORK_TREE }, { "symbolic-ref", cmd_symbolic_ref, RUN_SETUP }, { "tag", cmd_tag, RUN_SETUP | DELAY_PAGER_CONFIG }, diff --git a/http-push.c b/http-push.c index 5f4340a36e..7f71316456 100644 --- a/http-push.c +++ b/http-push.c @@ -198,13 +198,13 @@ static void curl_setup_http(CURL *curl, const char *url, const char *custom_req, struct buffer *buffer, curl_write_callback write_fn) { - curl_easy_setopt(curl, CURLOPT_PUT, 1); + curl_easy_setopt(curl, CURLOPT_UPLOAD, 1); curl_easy_setopt(curl, CURLOPT_URL, url); curl_easy_setopt(curl, CURLOPT_INFILE, buffer); curl_easy_setopt(curl, CURLOPT_INFILESIZE, buffer->buf.len); curl_easy_setopt(curl, CURLOPT_READFUNCTION, fread_buffer); - curl_easy_setopt(curl, CURLOPT_IOCTLFUNCTION, ioctl_buffer); - curl_easy_setopt(curl, CURLOPT_IOCTLDATA, buffer); + curl_easy_setopt(curl, CURLOPT_SEEKFUNCTION, seek_buffer); + curl_easy_setopt(curl, CURLOPT_SEEKDATA, buffer); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_fn); curl_easy_setopt(curl, CURLOPT_NOBODY, 0); curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, custom_req); @@ -157,21 +157,19 @@ size_t fread_buffer(char *ptr, size_t eltsize, size_t nmemb, void *buffer_) return size / eltsize; } -curlioerr ioctl_buffer(CURL *handle, int cmd, void *clientp) +int seek_buffer(void *clientp, curl_off_t offset, int origin) { struct buffer *buffer = clientp; - switch (cmd) { - case CURLIOCMD_NOP: - return CURLIOE_OK; - - case CURLIOCMD_RESTARTREAD: - buffer->posn = 0; - return CURLIOE_OK; - - default: - return CURLIOE_UNKNOWNCMD; + if (origin != SEEK_SET) + BUG("seek_buffer only handles SEEK_SET"); + if (offset < 0 || offset >= buffer->buf.len) { + error("curl seek would be outside of buffer"); + return CURL_SEEKFUNC_FAIL; } + + buffer->posn = offset; + return CURL_SEEKFUNC_OK; } size_t fwrite_buffer(char *ptr, size_t eltsize, size_t nmemb, void *buffer_) @@ -792,20 +790,37 @@ void setup_curl_trace(CURL *handle) curl_easy_setopt(handle, CURLOPT_DEBUGDATA, NULL); } -static long get_curl_allowed_protocols(int from_user) +static void proto_list_append(struct strbuf *list, const char *proto) { - long allowed_protocols = 0; + if (!list) + return; + if (list->len) + strbuf_addch(list, ','); + strbuf_addstr(list, proto); +} - if (is_transport_allowed("http", from_user)) - allowed_protocols |= CURLPROTO_HTTP; - if (is_transport_allowed("https", from_user)) - allowed_protocols |= CURLPROTO_HTTPS; - if (is_transport_allowed("ftp", from_user)) - allowed_protocols |= CURLPROTO_FTP; - if (is_transport_allowed("ftps", from_user)) - allowed_protocols |= CURLPROTO_FTPS; +static long get_curl_allowed_protocols(int from_user, struct strbuf *list) +{ + long bits = 0; - return allowed_protocols; + if (is_transport_allowed("http", from_user)) { + bits |= CURLPROTO_HTTP; + proto_list_append(list, "http"); + } + if (is_transport_allowed("https", from_user)) { + bits |= CURLPROTO_HTTPS; + proto_list_append(list, "https"); + } + if (is_transport_allowed("ftp", from_user)) { + bits |= CURLPROTO_FTP; + proto_list_append(list, "ftp"); + } + if (is_transport_allowed("ftps", from_user)) { + bits |= CURLPROTO_FTPS; + proto_list_append(list, "ftps"); + } + + return bits; } #ifdef GIT_CURL_HAVE_CURL_HTTP_VERSION_2 @@ -949,10 +964,26 @@ static CURL *get_curl_handle(void) curl_easy_setopt(result, CURLOPT_MAXREDIRS, 20); curl_easy_setopt(result, CURLOPT_POSTREDIR, CURL_REDIR_POST_ALL); + +#ifdef GIT_CURL_HAVE_CURLOPT_PROTOCOLS_STR + { + struct strbuf buf = STRBUF_INIT; + + get_curl_allowed_protocols(0, &buf); + curl_easy_setopt(result, CURLOPT_REDIR_PROTOCOLS_STR, buf.buf); + strbuf_reset(&buf); + + get_curl_allowed_protocols(-1, &buf); + curl_easy_setopt(result, CURLOPT_PROTOCOLS_STR, buf.buf); + strbuf_release(&buf); + } +#else curl_easy_setopt(result, CURLOPT_REDIR_PROTOCOLS, - get_curl_allowed_protocols(0)); + get_curl_allowed_protocols(0, NULL)); curl_easy_setopt(result, CURLOPT_PROTOCOLS, - get_curl_allowed_protocols(-1)); + get_curl_allowed_protocols(-1, NULL)); +#endif + if (getenv("GIT_CURL_VERBOSE")) http_trace_curl_no_data(); setup_curl_trace(result); @@ -40,7 +40,7 @@ struct buffer { size_t fread_buffer(char *ptr, size_t eltsize, size_t nmemb, void *strbuf); size_t fwrite_buffer(char *ptr, size_t eltsize, size_t nmemb, void *strbuf); size_t fwrite_null(char *ptr, size_t eltsize, size_t nmemb, void *strbuf); -curlioerr ioctl_buffer(CURL *handle, int cmd, void *clientp); +int seek_buffer(void *clientp, curl_off_t offset, int origin); /* Slot lifecycle functions */ struct active_request_slot *get_active_slot(void); diff --git a/line-log.c b/line-log.c index 51d93310a4..a7f3e7f6ce 100644 --- a/line-log.c +++ b/line-log.c @@ -1089,10 +1089,8 @@ static struct diff_filepair *diff_filepair_dup(struct diff_filepair *pair) static void free_diffqueues(int n, struct diff_queue_struct *dq) { - int i, j; - for (i = 0; i < n; i++) - for (j = 0; j < dq[i].nr; j++) - diff_free_filepair(dq[i].queue[j]); + for (int i = 0; i < n; i++) + diff_free_queue(&dq[i]); free(dq); } @@ -1195,6 +1193,7 @@ static int process_ranges_ordinary_commit(struct rev_info *rev, struct commit *c if (parent) add_line_range(rev, parent, parent_range); free_line_log_data(parent_range); + diff_free_queue(&queue); return changed; } diff --git a/line-range.c b/line-range.c index 955a8a9535..47bf0d6f1a 100644 --- a/line-range.c +++ b/line-range.c @@ -135,7 +135,7 @@ static const char *find_funcname_matching_regexp(xdemitconf_t *xecfg, const char { int reg_error; regmatch_t match[1]; - while (1) { + while (*start) { const char *bol, *eol; reg_error = regexec(regexp, start, 1, match, 0); if (reg_error == REG_NOMATCH) @@ -148,8 +148,8 @@ static const char *find_funcname_matching_regexp(xdemitconf_t *xecfg, const char /* determine extent of line matched */ bol = start+match[0].rm_so; eol = start+match[0].rm_eo; - while (bol > start && *bol != '\n') - bol--; + while (bol > start && *--bol != '\n') + ; /* nothing */ if (*bol == '\n') bol++; while (*eol && *eol != '\n') @@ -161,6 +161,7 @@ static const char *find_funcname_matching_regexp(xdemitconf_t *xecfg, const char return bol; start = eol; } + return NULL; } static const char *parse_range_funcname( diff --git a/list-objects-filter.c b/list-objects-filter.c index 1c1ee3d1bb..7ed21cb299 100644 --- a/list-objects-filter.c +++ b/list-objects-filter.c @@ -70,13 +70,13 @@ struct filter { }; static enum list_objects_filter_result filter_blobs_none( - struct repository *r, + struct repository *r UNUSED, enum list_objects_filter_situation filter_situation, struct object *obj, - const char *pathname, - const char *filename, + const char *pathname UNUSED, + const char *filename UNUSED, struct oidset *omits, - void *filter_data_) + void *filter_data_ UNUSED) { switch (filter_situation) { default: @@ -112,7 +112,7 @@ static enum list_objects_filter_result filter_blobs_none( } static void filter_blobs_none__init( - struct list_objects_filter_options *filter_options, + struct list_objects_filter_options *filter_options UNUSED, struct filter *filter) { filter->filter_object_fn = filter_blobs_none; @@ -159,11 +159,11 @@ static int filter_trees_update_omits( } static enum list_objects_filter_result filter_trees_depth( - struct repository *r, + struct repository *r UNUSED, enum list_objects_filter_situation filter_situation, struct object *obj, - const char *pathname, - const char *filename, + const char *pathname UNUSED, + const char *filename UNUSED, struct oidset *omits, void *filter_data_) { @@ -274,8 +274,8 @@ static enum list_objects_filter_result filter_blobs_limit( struct repository *r, enum list_objects_filter_situation filter_situation, struct object *obj, - const char *pathname, - const char *filename, + const char *pathname UNUSED, + const char *filename UNUSED, struct oidset *omits, void *filter_data_) { @@ -514,6 +514,7 @@ static enum list_objects_filter_result filter_sparse( static void filter_sparse_free(void *filter_data) { struct filter_sparse_data *d = filter_data; + clear_pattern_list(&d->pl); free(d->array_frame); free(d); } @@ -554,12 +555,12 @@ struct filter_object_type_data { }; static enum list_objects_filter_result filter_object_type( - struct repository *r, + struct repository *r UNUSED, enum list_objects_filter_situation filter_situation, struct object *obj, - const char *pathname, - const char *filename, - struct oidset *omits, + const char *pathname UNUSED, + const char *filename UNUSED, + struct oidset *omits UNUSED, void *filter_data_) { struct filter_object_type_data *filter_data = filter_data_; @@ -675,7 +676,7 @@ static enum list_objects_filter_result filter_combine( struct object *obj, const char *pathname, const char *filename, - struct oidset *omits, + struct oidset *omits UNUSED, void *filter_data) { struct combine_filter_data *d = filter_data; @@ -709,6 +710,7 @@ static void filter_combine__free(void *filter_data) BUG("expected oidset to be cleared already"); } free(d->sub); + free(d); } static void add_all(struct oidset *dest, struct oidset *src) { diff --git a/list-objects.c b/list-objects.c index 250d9de41c..7528fe1db2 100644 --- a/list-objects.c +++ b/list-objects.c @@ -81,36 +81,6 @@ static void process_blob(struct traversal_context *ctx, strbuf_setlen(path, pathlen); } -/* - * Processing a gitlink entry currently does nothing, since - * we do not recurse into the subproject. - * - * We *could* eventually add a flag that actually does that, - * which would involve: - * - is the subproject actually checked out? - * - if so, see if the subproject has already been added - * to the alternates list, and add it if not. - * - process the commit (or tag) the gitlink points to - * recursively. - * - * However, it's unclear whether there is really ever any - * reason to see superprojects and subprojects as such a - * "unified" object pool (potentially resulting in a totally - * humongous pack - avoiding which was the whole point of - * having gitlinks in the first place!). - * - * So for now, there is just a note that we *could* follow - * the link, and how to do it. Whether it necessarily makes - * any sense what-so-ever to ever do that is another issue. - */ -static void process_gitlink(struct traversal_context *ctx, - const unsigned char *sha1, - struct strbuf *path, - const char *name) -{ - /* Nothing to do */ -} - static void process_tree(struct traversal_context *ctx, struct tree *tree, struct strbuf *base, @@ -149,8 +119,7 @@ static void process_tree_contents(struct traversal_context *ctx, process_tree(ctx, t, base, entry.path); } else if (S_ISGITLINK(entry.mode)) - process_gitlink(ctx, entry.oid.hash, - base, entry.path); + ; /* ignore gitlink */ else { struct blob *b = lookup_blob(ctx->revs->repo, &entry.oid); if (!b) { @@ -6,6 +6,7 @@ #include "ls-refs.h" #include "pkt-line.h" #include "config.h" +#include "string-list.h" static int config_read; static int advertise_unborn; @@ -73,6 +74,7 @@ struct ls_refs_data { unsigned symrefs; struct strvec prefixes; struct strbuf buf; + struct string_list hidden_refs; unsigned unborn : 1; }; @@ -84,7 +86,7 @@ static int send_ref(const char *refname, const struct object_id *oid, strbuf_reset(&data->buf); - if (ref_is_hidden(refname_nons, refname)) + if (ref_is_hidden(refname_nons, refname, &data->hidden_refs)) return 0; if (!ref_match(&data->prefixes, refname_nons)) @@ -137,14 +139,15 @@ static void send_possibly_unborn_head(struct ls_refs_data *data) } static int ls_refs_config(const char *var, const char *value, - void *data UNUSED) + void *cb_data) { + struct ls_refs_data *data = cb_data; /* * We only serve fetches over v2 for now, so respect only "uploadpack" * config. This may need to eventually be expanded to "receive", but we * don't yet know how that information will be passed to ls-refs. */ - return parse_hide_refs_config(var, value, "uploadpack"); + return parse_hide_refs_config(var, value, "uploadpack", &data->hidden_refs); } int ls_refs(struct repository *r, struct packet_reader *request) @@ -154,9 +157,10 @@ int ls_refs(struct repository *r, struct packet_reader *request) memset(&data, 0, sizeof(data)); strvec_init(&data.prefixes); strbuf_init(&data.buf, 0); + string_list_init_dup(&data.hidden_refs); ensure_config_read(); - git_config(ls_refs_config, NULL); + git_config(ls_refs_config, &data); while (packet_reader_read(request) == PACKET_READ_NORMAL) { const char *arg = request->line; @@ -190,11 +194,13 @@ int ls_refs(struct repository *r, struct packet_reader *request) send_possibly_unborn_head(&data); if (!data.prefixes.nr) strvec_push(&data.prefixes, ""); - for_each_fullref_in_prefixes(get_git_namespace(), data.prefixes.v, - send_ref, &data); + refs_for_each_fullref_in_prefixes(get_main_ref_store(r), + get_git_namespace(), data.prefixes.v, + send_ref, &data); packet_fflush(stdout); strvec_clear(&data.prefixes); strbuf_release(&data.buf); + string_list_clear(&data.hidden_refs, 0); return 0; } diff --git a/merge-recursive.c b/merge-recursive.c index 4ddd3adea0..2fd0aa9687 100644 --- a/merge-recursive.c +++ b/merge-recursive.c @@ -2100,7 +2100,7 @@ static char *handle_path_level_conflicts(struct merge_options *opt, if (!new_path) { /* This should only happen when entry->non_unique_new_dir set */ if (!entry->non_unique_new_dir) - BUG("entry->non_unqiue_dir not set and !new_path"); + BUG("entry->non_unique_new_dir not set and !new_path"); output(opt, 1, _("CONFLICT (directory rename split): " "Unclear where to place %s because directory " "%s was renamed to multiple other directories, " diff --git a/object-file.c b/object-file.c index 957790098f..c1b71c2834 100644 --- a/object-file.c +++ b/object-file.c @@ -508,7 +508,9 @@ static int link_alt_odb_entry(struct repository *r, const struct strbuf *entry, { struct object_directory *ent; struct strbuf pathbuf = STRBUF_INIT; + struct strbuf tmp = STRBUF_INIT; khiter_t pos; + int ret = -1; if (!is_absolute_path(entry->buf) && relative_base) { strbuf_realpath(&pathbuf, relative_base, 1); @@ -516,12 +518,12 @@ static int link_alt_odb_entry(struct repository *r, const struct strbuf *entry, } strbuf_addbuf(&pathbuf, entry); - if (strbuf_normalize_path(&pathbuf) < 0 && relative_base) { + if (!strbuf_realpath(&tmp, pathbuf.buf, 0)) { error(_("unable to normalize alternate object path: %s"), pathbuf.buf); - strbuf_release(&pathbuf); - return -1; + goto error; } + strbuf_swap(&pathbuf, &tmp); /* * The trailing slash after the directory name is given by @@ -530,10 +532,8 @@ static int link_alt_odb_entry(struct repository *r, const struct strbuf *entry, while (pathbuf.len && pathbuf.buf[pathbuf.len - 1] == '/') strbuf_setlen(&pathbuf, pathbuf.len - 1); - if (!alt_odb_usable(r->objects, &pathbuf, normalized_objdir, &pos)) { - strbuf_release(&pathbuf); - return -1; - } + if (!alt_odb_usable(r->objects, &pathbuf, normalized_objdir, &pos)) + goto error; CALLOC_ARRAY(ent, 1); /* pathbuf.buf is already in r->objects->odb_by_path */ @@ -548,8 +548,11 @@ static int link_alt_odb_entry(struct repository *r, const struct strbuf *entry, /* recursively add alternates */ read_info_alternates(r, ent->path, depth + 1); - - return 0; + ret = 0; + error: + strbuf_release(&tmp); + strbuf_release(&pathbuf); + return ret; } static const char *parse_alt_odb_entry(const char *string, @@ -596,10 +599,7 @@ static void link_alt_odb_entries(struct repository *r, const char *alt, return; } - strbuf_add_absolute_path(&objdirbuf, r->objects->odb->path); - if (strbuf_normalize_path(&objdirbuf) < 0) - die(_("unable to normalize object directory: %s"), - objdirbuf.buf); + strbuf_realpath(&objdirbuf, r->objects->odb->path, 1); while (*alt) { alt = parse_alt_odb_entry(alt, sep, &entry); @@ -1864,13 +1864,6 @@ out: return 0; } -static int write_buffer(int fd, const void *buf, size_t len) -{ - if (write_in_full(fd, buf, len) < 0) - return error_errno(_("file write error")); - return 0; -} - static void hash_object_file_literally(const struct git_hash_algo *algo, const void *buf, unsigned long len, const char *type, struct object_id *oid) @@ -2015,8 +2008,8 @@ static int write_loose_object_common(git_hash_ctx *c, ret = git_deflate(stream, flush ? Z_FINISH : 0); the_hash_algo->update_fn(c, in0, stream->next_in - in0); - if (write_buffer(fd, compressed, stream->next_out - compressed) < 0) - die(_("unable to write loose object file")); + if (write_in_full(fd, compressed, stream->next_out - compressed) < 0) + die_errno(_("unable to write loose object file")); stream->next_out = compressed; stream->avail_out = compressed_len; @@ -212,8 +212,7 @@ struct object *parse_object_buffer(struct repository *r, const struct object_id if (type == OBJ_BLOB) { struct blob *blob = lookup_blob(r, oid); if (blob) { - if (parse_blob_buffer(blob, buffer, size)) - return NULL; + parse_blob_buffer(blob); obj = &blob->object; } } else if (type == OBJ_TREE) { @@ -286,14 +285,13 @@ struct object *parse_object_with_flags(struct repository *r, return &commit->object; } - if ((obj && obj->type == OBJ_BLOB && repo_has_object_file(r, oid)) || - (!obj && repo_has_object_file(r, oid) && - oid_object_info(r, oid, NULL) == OBJ_BLOB)) { + if ((!obj || obj->type == OBJ_BLOB) && + oid_object_info(r, oid, NULL) == OBJ_BLOB) { if (!skip_hash && stream_object_signature(r, repl) < 0) { error(_("hash mismatch %s"), oid_to_hex(oid)); return NULL; } - parse_blob_buffer(lookup_blob(r, oid), NULL, 0); + parse_blob_buffer(lookup_blob(r, oid)); return lookup_object(r, oid); } diff --git a/pack-write.c b/pack-write.c index 00787e306d..3363729748 100644 --- a/pack-write.c +++ b/pack-write.c @@ -5,7 +5,6 @@ #include "chunk-format.h" #include "pack-mtimes.h" #include "oidmap.h" -#include "chunk-format.h" #include "pack-objects.h" void reset_pack_idx_option(struct pack_idx_option *opts) @@ -193,6 +193,9 @@ # out of range извън диапазона # checksum Ñума за проверка # superproject обхващащ проект +# scalar repo Ñкаларно хранилище +# unclean завършвам работа/задача Ñ Ð³Ñ€ÐµÑˆÐºÐ° +# cache tree кеш за обекти-дървета # ------------------------ # „$var“ - може да не Ñработва за shell има gettext и eval_gettext - проверка - намират Ñе леÑно по „$ # ------------------------ @@ -209,10 +212,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.38\n" +"Project-Id-Version: git 2.39\n" "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n" -"POT-Creation-Date: 2022-09-28 10:59+0200\n" -"PO-Revision-Date: 2022-09-28 10:59+0200\n" +"POT-Creation-Date: 2022-12-06 15:52+0100\n" +"PO-Revision-Date: 2022-12-06 16:55+0200\n" "Last-Translator: Alexander Shopov <ash@kambanaria.org>\n" "Language-Team: Bulgarian <dict@fsa-bg.org>\n" "Language: bg\n" @@ -376,7 +379,7 @@ msgstr "Изход.\n" #, c-format, perl-format msgid "Stage mode change [y,n,q,a,d%s,?]? " -msgstr "ДобавÑне на промÑната на правата за доÑтъп [y,n,q,a,d%s,?]? " +msgstr "ДобавÑне на промÑната на права̀та за доÑтъп [y,n,q,a,d%s,?]? " #, c-format, perl-format msgid "Stage deletion [y,n,q,a,d%s,?]? " @@ -412,7 +415,7 @@ msgstr "" #, c-format, perl-format msgid "Stash mode change [y,n,q,a,d%s,?]? " -msgstr "Скатаване на промÑната на правата за доÑтъп [y,n,q,a,d%s,?]? " +msgstr "Скатаване на промÑната на права̀та за доÑтъп [y,n,q,a,d%s,?]? " #, c-format, perl-format msgid "Stash deletion [y,n,q,a,d%s,?]? " @@ -448,7 +451,7 @@ msgstr "" #, c-format, perl-format msgid "Unstage mode change [y,n,q,a,d%s,?]? " -msgstr "Изваждане на промÑната на правата за доÑтъп [y,n,q,a,d%s,?]? " +msgstr "Изваждане на промÑната на права̀та за доÑтъп [y,n,q,a,d%s,?]? " #, c-format, perl-format msgid "Unstage deletion [y,n,q,a,d%s,?]? " @@ -485,7 +488,7 @@ msgstr "" #, c-format, perl-format msgid "Apply mode change to index [y,n,q,a,d%s,?]? " msgstr "" -"Прилагане на промÑната на правата за доÑтъп към индекÑа [y,n,q,a,d%s,?]? " +"Прилагане на промÑната на права̀та за доÑтъп към индекÑа [y,n,q,a,d%s,?]? " #, c-format, perl-format msgid "Apply deletion to index [y,n,q,a,d%s,?]? " @@ -522,8 +525,8 @@ msgstr "" #, c-format, perl-format msgid "Discard mode change from worktree [y,n,q,a,d%s,?]? " msgstr "" -"Премахване на промÑната в правата за доÑтъп от работното дърво [y,n,q,a,d" -"%s,?]? " +"Премахване на промÑната в права̀та за доÑтъп от работното дърво [y,n,q,a," +"d%s,?]? " #, c-format, perl-format msgid "Discard deletion from worktree [y,n,q,a,d%s,?]? " @@ -563,7 +566,7 @@ msgstr "" #, c-format, perl-format msgid "Discard mode change from index and worktree [y,n,q,a,d%s,?]? " msgstr "" -"Премахване на промÑната в правата за доÑтъп от индекÑа и работното дърво [y," +"Премахване на промÑната в права̀та за доÑтъп от индекÑа и работното дърво [y," "n,q,a,d%s,?]? " #, c-format, perl-format @@ -599,7 +602,7 @@ msgstr "" #, c-format, perl-format msgid "Apply mode change to index and worktree [y,n,q,a,d%s,?]? " msgstr "" -"Прилагане на промÑната в правата за доÑтъп от индекÑа и работното дърво [y,n," +"Прилагане на промÑната в права̀та за доÑтъп от индекÑа и работното дърво [y,n," "q,a,d%s,?]? " #, c-format, perl-format @@ -634,8 +637,8 @@ msgstr "" #, c-format, perl-format msgid "Apply mode change to worktree [y,n,q,a,d%s,?]? " msgstr "" -"Прилагане на промÑната в правата за доÑтъп към работното дърво [y,n,q,a,d" -"%s,?]? " +"Прилагане на промÑната в права̀та за доÑтъп към работното дърво [y,n,q,a," +"d%s,?]? " #, c-format, perl-format msgid "Apply deletion to worktree [y,n,q,a,d%s,?]? " @@ -985,6 +988,9 @@ msgstr "командниÑÑ‚ ред завършва Ñ â€ž/“" msgid "unclosed quote" msgstr "кавичка без еш" +msgid "too many arguments" +msgstr "прекалено много аргументи" + #, c-format msgid "unrecognized whitespace option '%s'" msgstr "непозната Ð¾Ð¿Ñ†Ð¸Ñ Ð·Ð° знаците за интервали „%s“" @@ -1258,12 +1264,12 @@ msgstr "„%s“: вече ÑъщеÑтвува в работното дърво #, c-format msgid "new mode (%o) of %s does not match old mode (%o)" -msgstr "новите права за доÑтъп (%o) на „%s“ не Ñъвпадат ÑÑŠÑ Ñтарите (%o)" +msgstr "новите права̀ за доÑтъп (%o) на „%s“ не Ñъвпадат ÑÑŠÑ Ñтарите (%o)" #, c-format msgid "new mode (%o) of %s does not match old mode (%o) of %s" msgstr "" -"новите права за доÑтъп (%o) на „%s“ не Ñъвпадат ÑÑŠÑ Ñтарите (%o) на „%s“" +"новите права̀ за доÑтъп (%o) на „%s“ не Ñъвпадат ÑÑŠÑ Ñтарите (%o) на „%s“" #, c-format msgid "affected file '%s' is beyond a symbolic link" @@ -1501,7 +1507,7 @@ msgstr "обектът-BLOB „%s“ не може да бъде обработР#, c-format msgid "unsupported file mode: 0%o (SHA1: %s)" -msgstr "неподдържани права за доÑтъп до файл: 0%o (SHA1: %s)" +msgstr "неподдържани права̀ за доÑтъп до файл: 0%o (SHA1: %s)" #, c-format msgid "deflate error (%d)" @@ -1969,7 +1975,7 @@ msgstr "git add [ОПЦИЯ…] [--] ПЪТ…" #, c-format msgid "cannot chmod %cx '%s'" -msgstr "правата на „%2$s“ не може да Ñе зададат да Ñа %1$cx" +msgstr "права̀та на „%2$s“ не може да Ñе зададат да Ñа %1$cx" #, c-format msgid "unexpected diff status %c" @@ -2385,7 +2391,7 @@ msgid "options '%s=%s' and '%s=%s' cannot be used together" msgstr "опциите „%s=%s“ и „%s=%s“ Ñа неÑъвмеÑтими" msgid "git am [<options>] [(<mbox> | <Maildir>)...]" -msgstr "git am [ОПЦИЯ…] [(ФÐЙЛ_С_ПОЩÐ|ДИРЕКТОРИЯ_С_ПОЩÐ)…]" +msgstr "git am [ОПЦИЯ…] [(ФÐЙЛ_С_ПОЩР| ДИРЕКТОРИЯ_С_ПОЩÐ)…]" msgid "git am [<options>] (--continue | --skip | --abort)" msgstr "git am [ОПЦИЯ…] (--continue | --skip | --abort)" @@ -2811,42 +2817,6 @@ msgstr "" "неуÑпешно двоично търÑене: „git bisect--helper --bisect-state %s“ завърши Ñ " "код за грешка: %d" -msgid "reset the bisection state" -msgstr "изчиÑтване на ÑÑŠÑтоÑнието на двоичното търÑене" - -msgid "check whether bad or good terms exist" -msgstr "проверка дали ÑъщеÑтвуват одобрÑващи/отхвърлÑщи управлÑващи думи" - -msgid "print out the bisect terms" -msgstr "извеждане на управлÑващите думи" - -msgid "start the bisect session" -msgstr "начало на двоично търÑене" - -msgid "find the next bisection commit" -msgstr "откриване на Ñледващото подаване при двоично търÑене" - -msgid "mark the state of ref (or refs)" -msgstr "задаване на ÑÑŠÑтоÑнието на указателÑ/ите" - -msgid "list the bisection steps so far" -msgstr "извеждане на Ñтъпките на двоичното търÑене доÑега" - -msgid "replay the bisection process from the given file" -msgstr "наново изпълнение на двоичното търÑене чрез Ð´Ð°Ð´ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»" - -msgid "skip some commits for checkout" -msgstr "преÑкачане на нÑкои Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ð¸Ñ Ð¿Ñ€Ð¸ изтеглÑне" - -msgid "visualize the bisection" -msgstr "визуализиране на двоичното търÑене" - -msgid "use <cmd>... to automatically bisect" -msgstr "за автоматично двоично търÑене да Ñе ползва тази КОМÐÐДÐ…" - -msgid "no log for BISECT_WRITE" -msgstr "липÑва Ð·Ð°Ð¿Ð¸Ñ Ð·Ð° „BISECT_WRITE“" - msgid "--bisect-reset requires either no argument or a commit" msgstr "опциÑта „--bisect-reset“ изиÑква или 0 аргументи, или 1 — подаване" @@ -2865,6 +2835,9 @@ msgstr "не е зададен журнален файл" msgid "git blame [<options>] [<rev-opts>] [<rev>] [--] <file>" msgstr "git blame [ОПЦИЯ…] [ОПЦИЯ_ЗÐ_ВЕРСИЯТÐ…] [ВЕРСИЯ] [--] ФÐЙЛ" +msgid "git annotate [<options>] [<rev-opts>] [<rev>] [--] <file>" +msgstr "git annotate [ОПЦИЯ…] [ОПЦИЯ_ЗÐ_ВЕРСИЯТÐ…] [ВЕРСИЯ] [--] ФÐЙЛ" + msgid "<rev-opts> are documented in git-rev-list(1)" msgstr "ОПЦИИте_ЗÐ_ВЕРСИЯТРÑа документирани в ръководÑтвото git-rev-list(1)" @@ -3071,9 +3044,6 @@ msgstr "ÐеуÑпешно обновÑване на конфигурационРmsgid "cannot use -a with -d" msgstr "опциите „-a“ и „-d“ Ñа неÑъвмеÑтими" -msgid "Couldn't look up commit object for HEAD" -msgstr "Обектът-подаване, Ñочен от ÑƒÐºÐ°Ð·Ð°Ñ‚ÐµÐ»Ñ â€žHEAD“, не може да бъде открит" - #, c-format msgid "Cannot delete branch '%s' checked out at '%s'" msgstr "Ðе може да изтриете клона „%s“, който е изтеглен в Ð¿ÑŠÑ‚Ñ â€ž%s“" @@ -3112,17 +3082,18 @@ msgstr "Клонът „%s“ Ñе пребазира върху „%s“" msgid "Branch %s is being bisected at %s" msgstr "ТърÑи Ñе двоично в клона „%s“ при „%s“" -msgid "cannot copy the current branch while not on any." -msgstr "не може да копирате Ñ‚ÐµÐºÑƒÑ‰Ð¸Ñ ÐºÐ»Ð¾Ð½, защото Ñте извън който и да е клон" - -msgid "cannot rename the current branch while not on any." -msgstr "" -"не може да преименувате Ñ‚ÐµÐºÑƒÑ‰Ð¸Ñ ÐºÐ»Ð¾Ð½, защото Ñте извън който и да е клон" - #, c-format msgid "Invalid branch name: '%s'" msgstr "Ðеправилно име на клон: „%s“" +#, c-format +msgid "No commit on branch '%s' yet." +msgstr "Ð’ клона „%s“ вÑе още нÑма подаваниÑ." + +#, c-format +msgid "No branch named '%s'." +msgstr "ЛипÑва клон на име „%s“." + msgid "Branch rename failed" msgstr "ÐеуÑпешно преименуване на клон" @@ -3285,13 +3256,12 @@ msgstr "Ðе може да зададете опиÑание на неÑвърз msgid "cannot edit description of more than one branch" msgstr "Ðе може да редактирате опиÑанието на повече от един клон едновременно" -#, c-format -msgid "No commit on branch '%s' yet." -msgstr "Ð’ клона „%s“ вÑе още нÑма подаваниÑ." +msgid "cannot copy the current branch while not on any." +msgstr "не може да копирате Ñ‚ÐµÐºÑƒÑ‰Ð¸Ñ ÐºÐ»Ð¾Ð½, защото Ñте извън който и да е клон" -#, c-format -msgid "No branch named '%s'." -msgstr "ЛипÑва клон на име „%s“." +msgid "cannot rename the current branch while not on any." +msgstr "" +"не може да преименувате Ñ‚ÐµÐºÑƒÑ‰Ð¸Ñ ÐºÐ»Ð¾Ð½, защото Ñте извън който и да е клон" msgid "too many branches for a copy operation" msgstr "прекалено много клони за копиране" @@ -3358,13 +3328,12 @@ msgstr "библиотека на C: " msgid "not run from a git repository - no hooks to show\n" msgstr "командата е Ñтартирана извън хранилище на Git, затова нÑма куки\n" -# FIXME msgid "" -"git bugreport [-o|--output-directory <file>] [-s|--suffix <format>] [--" -"diagnose[=<mode>]" +"git bugreport [(-o | --output-directory) <path>] [(-s | --suffix) <format>]\n" +" [--diagnose[=<mode>]]" msgstr "" -"git bugreport [-o|--output-directory ФÐЙЛ] [-s|--suffix ФОРМÐТ] [--" -"diagnose[=РЕЖИМ]]" +"git bugreport [(-o | --output-directory) ПЪТ] [(-s | --suffix) ФОРМÐТ]\n" +" [--diagnose[=РЕЖИМ]]" msgid "" "Thank you for filling out a Git bug report!\n" @@ -3438,17 +3407,23 @@ msgstr "в „%s“ не може да Ñе пише" msgid "Created new report at '%s'.\n" msgstr "ÐовиÑÑ‚ доклад е Ñъздаден в „%s“.\n" -msgid "git bundle create [<options>] <file> <git-rev-list args>" -msgstr "git bundle create [ОПЦИЯ…] ФÐЙЛ ÐРГУМЕÐТ_ЗÐ_git_rev-list…" +msgid "" +"git bundle create [-q | --quiet | --progress | --all-progress] [--all-" +"progress-implied]\n" +" [--version=<version>] <file> <git-rev-list-args>" +msgstr "" +"git bundle create [-q | --quiet | --progress | --all-progress] [--all-" +"progress-implied]\n" +" [--version=ВЕРСИЯ] ФÐЙЛ ОПЦИЯ_ЗÐ_git-rev-list…" -msgid "git bundle verify [<options>] <file>" -msgstr "git bundle verify [ОПЦИЯ…] ФÐЙЛ…" +msgid "git bundle verify [-q | --quiet] <file>" +msgstr "git bundle verify [-q | --quiet] ФÐЙЛ" msgid "git bundle list-heads <file> [<refname>...]" msgstr "git bundle list-heads ФÐЙЛ [ИМЕ_ÐÐ_УКÐЗÐТЕЛ…]" -msgid "git bundle unbundle <file> [<refname>...]" -msgstr "git bundle unbundle ФÐЙЛ [ИМЕ_ÐÐ_УКÐЗÐТЕЛ…]" +msgid "git bundle unbundle [--progress] <file> [<refname>...]" +msgstr "git bundle unbundle [--progress] ФÐЙЛ [ИМЕ_ÐÐ_УКÐЗÐТЕЛ…]" msgid "do not show progress meter" msgstr "без извеждане на напредъка" @@ -3524,12 +3499,12 @@ msgid "" "git cat-file (--batch | --batch-check | --batch-command) [--batch-all-" "objects]\n" " [--buffer] [--follow-symlinks] [--unordered]\n" -" [--textconv | --filters]" +" [--textconv | --filters] [-z]" msgstr "" "git cat-file (--batch | --batch-check | --batch-command) [--batch-all-" "objects]\n" " [--buffer] [--follow-symlinks] [--unordered]\n" -" [--textconv | --filters]" +" [--textconv | --filters] [-z]" msgid "" "git cat-file (--textconv | --filters)\n" @@ -3646,9 +3621,6 @@ msgstr "опциÑта „%s“ изиÑква верÑиÑ" msgid "<object> required with '-%c'" msgstr "опциÑта „-%c“ изиÑква обект" -msgid "too many arguments" -msgstr "прекалено много аргументи" - #, c-format msgid "only two arguments allowed in <type> <object> mode, not %d" msgstr "в режим Ñ Ð¿Ð¾Ñочен ВИД ОБЕКТ Ñе изиÑкват точно два аргумента, а не %d" @@ -4193,8 +4165,9 @@ msgid "use overlay mode" msgstr "използване на припокриващ режим" msgid "" -"git clean [-d] [-f] [-i] [-n] [-q] [-e <pattern>] [-x | -X] [--] <paths>..." -msgstr "git clean [-d] [-f] [-i] [-n] [-q] [-e ШÐБЛОÐ] [-x | -X] [--] ПЪТ…" +"git clean [-d] [-f] [-i] [-n] [-q] [-e <pattern>] [-x | -X] [--] " +"[<pathspec>...]" +msgstr "git clean [-d] [-f] [-i] [-n] [-q] [-e ШÐБЛОÐ] [-x | -X] [--] [ПЪТ…]" #, c-format msgid "Removing %s\n" @@ -4493,6 +4466,11 @@ msgid "failed to start iterator over '%s'" msgstr "неуÑпешно итериране по „%s“" #, c-format +msgid "symlink '%s' exists, refusing to clone with --local" +msgstr "" +"Ñимволната връзка „%s“ ÑъщеÑтвува, не може да Ñе клонира Ñ Ð¾Ð¿Ñ†Ð¸Ñта „--local“" + +#, c-format msgid "failed to unlink '%s'" msgstr "неуÑпешно изтриване на „%s“" @@ -4563,10 +4541,6 @@ msgstr "Прекалено много аргументи." msgid "You must specify a repository to clone." msgstr "ТрÑбва да укажете кое хранилище иÑкате да клонирате." -#, c-format -msgid "options '%s' and '%s %s' cannot be used together" -msgstr "опциите „%s“ и „%s %s“ Ñа неÑъвмеÑтими" - msgid "" "--bundle-uri is incompatible with --depth, --shallow-since, and --shallow-" "exclude" @@ -4696,19 +4670,25 @@ msgid "--command must be the first argument" msgstr "опциÑта „--command“ трÑбва да е първиÑÑ‚ аргумент" msgid "" -"git commit-graph verify [--object-dir <objdir>] [--shallow] [--[no-]progress]" +"git commit-graph verify [--object-dir <dir>] [--shallow] [--[no-]progress]" msgstr "" -"git commit-graph verify [--object-dir ДИР_ОБЕКТИ] [--shallow] [--" +"git commit-graph verify [--object-dir ДИРЕКТОРИЯ] [--shallow] [--" "[no-]progress]" msgid "" -"git commit-graph write [--object-dir <objdir>] [--append] [--" -"split[=<strategy>]] [--reachable|--stdin-packs|--stdin-commits] [--changed-" -"paths] [--[no-]max-new-filters <n>] [--[no-]progress] <split options>" +"git commit-graph write [--object-dir <dir>] [--append]\n" +" [--split[=<strategy>]] [--reachable | --stdin-packs | " +"--stdin-commits]\n" +" [--changed-paths] [--[no-]max-new-filters <n>] [--" +"[no-]progress]\n" +" <split options>" msgstr "" -"git commit-graph write [--object-dir ДИР_ОБЕКТИ] [--append] [--" -"split[=СТРÐТЕГИЯ]] [--reachable|--stdin-packs|--stdin-commits] [--changed-" -"paths] [--[no-]max-new-filters <n>] [--[no-]progress] ОПЦИИ_ЗÐ_Ð ÐЗДЕЛЯÐЕ" +"git commit-graph write [--object-dir ДИРЕКТОРИЯ] [--append]\n" +" [--split[=СТРÐТЕГИЯ]] [--reachable | --stdin-packs | " +"--stdin-commits]\n" +" [--changed-paths] [--[no-]max-new-filters БРОЙ] [--" +"[no-]progress]\n" +" ОПЦИИ_ЗÐ_Ð ÐЗДЕЛЯÐЕ" msgid "dir" msgstr "директориÑ" @@ -4781,12 +4761,16 @@ msgstr "" msgid "Collecting commits from input" msgstr "Получаване на подаваниÑта от входа" +msgid "git commit-tree <tree> [(-p <parent>)...]" +msgstr "git commit-tree ДЪРВО [(-p РОДИТЕЛ)…]" + msgid "" -"git commit-tree [(-p <parent>)...] [-S[<keyid>]] [(-m <message>)...] [(-F " -"<file>)...] <tree>" +"git commit-tree [(-p <parent>)...] [-S[<keyid>]] [(-m <message>)...]\n" +" [(-F <file>)...] <tree>" msgstr "" -"git commit-tree [(-p РОДИТЕЛ)…] [-S[ИДЕÐТИФИКÐТОР]] [(-m СЪОБЩЕÐИЕ)…] [(-F " -"ФÐЙЛ)…] ДЪРВО" +"git commit-tree [(-p РОДИТЕЛ)…] [-S[ИДЕÐТИФИКÐТОР_ÐÐ_КЛЮЧ]] [(-m " +"СЪОБЩЕÐИЕ)…]\n" +" [(-F ФÐЙЛ)…] ДЪРВО" #, c-format msgid "duplicate parent %s ignored" @@ -4828,11 +4812,30 @@ msgstr "трÑбва да е точно едно дърво" msgid "git commit-tree: failed to read" msgstr "git commit-tree: не може да Ñе прочете" -msgid "git commit [<options>] [--] <pathspec>..." -msgstr "git commit [ОПЦИЯ…] [--] ПЪТ…" +msgid "" +"git commit [-a | --interactive | --patch] [-s] [-v] [-u<mode>] [--amend]\n" +" [--dry-run] [(-c | -C | --squash) <commit> | --fixup [(amend|" +"reword):]<commit>)]\n" +" [-F <file> | -m <msg>] [--reset-author] [--allow-empty]\n" +" [--allow-empty-message] [--no-verify] [-e] [--author=<author>]\n" +" [--date=<date>] [--cleanup=<mode>] [--[no-]status]\n" +" [-i | -o] [--pathspec-from-file=<file> [--pathspec-file-nul]]\n" +" [(--trailer <token>[(=|:)<value>])...] [-S[<keyid>]]\n" +" [--] [<pathspec>...]" +msgstr "" +"git commit [-a | --interactive | --patch] [-s] [-v] [-u РЕЖИМ] [--amend]\n" +" [--dry-run] [(-c | -C | --squash) ПОДÐÐ’ÐÐЕ | --fixup [(amend|" +"reword):]ПОДÐÐ’ÐÐЕ)]\n" +" [-F ФÐЙЛ | -m СЪОБЩЕÐИЕ] [--reset-author] [--allow-empty]\n" +" [--allow-empty-message] [--no-verify] [-e] [--author=ÐВТОР]\n" +" [--date=ДÐТÐ] [--cleanup=РЕЖИМ] [--[no-]status]\n" +" [-i | -o] [--pathspec-from-file=ФÐЙЛ> [--pathspec-file-nul]]\n" +" [(--trailer ЛЕКСЕМÐ[(=|:)СТОЙÐОСТ])…] [-" +"S[ИДЕÐТИФИКÐТОР_ÐÐ_КЛЮЧ]]\n" +" [--] [ПЪТ…]" -msgid "git status [<options>] [--] <pathspec>..." -msgstr "git status [ОПЦИЯ…] [--] ПЪТ…" +msgid "git status [<options>] [--] [<pathspec>...]" +msgstr "git status [ОПЦИЯ…] [--] [ПЪТ…]" msgid "" "You asked to amend the most recent commit, but doing so would make\n" @@ -4908,7 +4911,7 @@ msgid "unable to update temporary index" msgstr "временниÑÑ‚ Ð¸Ð½Ð´ÐµÐºÑ Ð½Ðµ може да бъде обновен" msgid "Failed to update main cache tree" -msgstr "Дървото на оÑÐ½Ð¾Ð²Ð½Ð¸Ñ ÐºÐµÑˆ не може да бъде обновено" +msgstr "Кешът за обектите-дървета не може да бъде обновен" msgid "unable to write new_index file" msgstr "новиÑÑ‚ Ð¸Ð½Ð´ÐµÐºÑ (new_index) не може да бъде запиÑан" @@ -5613,7 +5616,7 @@ msgid "" "\n" "\tchmod 0700 %s" msgstr "" -"Правата за доÑтъп до директориÑта за програмните гнезда Ñа прекалено " +"Права̀та за доÑтъп до директориÑта за програмните гнезда Ñа прекалено " "Ñвободни —\n" "другите потребители може да получат доÑтъп до кешираните ви пароли. За да\n" "коригирате това, изпълнете:\n" @@ -5638,11 +5641,19 @@ msgstr "" "ключалката на хранилището на идентификациите не бе получена в рамките на %d " "ms" -msgid "git describe [<options>] [<commit-ish>...]" -msgstr "git describe [ОПЦИЯ…] [УКÐЗÐТЕЛ_КЪМ_ПОДÐÐ’ÐÐЕ…]" +msgid "" +"git describe [--all] [--tags] [--contains] [--abbrev=<n>] [<commit-ish>...]" +msgstr "" +"git describe [--all] [--tags] [--contains] [--abbrev=БРОЙ] " +"[УКÐЗÐТЕЛ_КЪМ_ПОДÐÐ’ÐÐЕ…]" + +msgid "" +"git describe [--all] [--tags] [--contains] [--abbrev=<n>] --dirty[=<mark>]" +msgstr "" +"git describe [--all] [--tags] [--contains] [--abbrev=БРОЙ] --dirty[=МÐРКЕР]" -msgid "git describe [<options>] --dirty" -msgstr "git describe [ОПЦИЯ…] --dirty" +msgid "git describe <blob>" +msgstr "git describe обект-BLOB" msgid "head" msgstr "оÑновно" @@ -5766,11 +5777,11 @@ msgid "option '%s' and commit-ishes cannot be used together" msgstr "опциите „%s“ и указателите към обекти Ñа неÑъвмеÑтими" msgid "" -"git diagnose [-o|--output-directory <path>] [-s|--suffix <format>] [--" -"mode=<mode>]" +"git diagnose [(-o | --output-directory) <path>] [(-s | --suffix) <format>]\n" +" [--mode=<mode>]" msgstr "" -"git diagnose [-o|--output-directory ФÐЙЛ] [-s|--suffix ФОРМÐТ] [--" -"diagnose[=РЕЖИМ]]" +"git diagnose [(-o | --output-directory) ПЪТ] [(-s | --suffix) ФОРМÐТ]\n" +" [--diagnose[=РЕЖИМ]]" msgid "specify a destination for the diagnostics archive" msgstr "укажете меÑтоположение на архива Ñ Ð´Ð¸Ð°Ð³Ð½Ð¾Ñтичната информациÑ" @@ -5788,6 +5799,9 @@ msgstr "опциÑта „--merge-base“ изиÑква точно две поРmsgid "'%s': not a regular file or symlink" msgstr "„%s“: не е нито обикновен файл, нито Ñимволна връзка" +msgid "no merge given, only parents." +msgstr "липÑва Ñливане, зададени Ñа Ñамо родителÑки подаваниÑ." + #, c-format msgid "invalid option: %s" msgstr "неправилна опциÑ: %s" @@ -5921,8 +5935,8 @@ msgstr "" #, c-format msgid "" -"option `--default' expects an unsigned long value with `--type=ulong`, not `" -"%s`" +"option `--default' expects an unsigned long value with `--type=ulong`, not " +"`%s`" msgstr "" "опциÑта „--default“ изиÑква целочиÑлена ÑтойноÑÑ‚ без знак при „--" "type=ulong“, а не „%s“" @@ -6438,8 +6452,8 @@ msgstr "извеждане Ñамо на указателите, които ÑÑŠ msgid "print only refs which don't contain the commit" msgstr "извеждане Ñамо на указателите, които не Ñъдържат това ПОДÐÐ’ÐÐЕ" -msgid "git for-each-repo --config=<config> <command-args>" -msgstr "git for-each-repo --config=ÐÐСТРОЙКРÐРГУМЕÐТ…" +msgid "git for-each-repo --config=<config> [--] <arguments>" +msgstr "git for-each-repo --config=ÐÐСТРОЙКР[--] ÐРГУМЕÐТ…" msgid "config" msgstr "наÑтройка" @@ -6597,21 +6611,29 @@ msgid "notice: %s points to an unborn branch (%s)" msgstr "предупреждение: „%s“ Ñочи към вÑе още неÑъщеÑтвуващ клон (%s)" msgid "Checking cache tree" -msgstr "Проверка на дървото на кеша" +msgstr "Проверка на кеша на обектите-дървета" #, c-format msgid "%s: invalid sha1 pointer in cache-tree" -msgstr "„%s“: неправилен указател за SHA1 в дървото на кеша" +msgstr "„%s“: неправилен указател за SHA1 в кеша на обектите-дървета" msgid "non-tree in cache-tree" -msgstr "в дървото на кеша има нещо, което не е дърво" +msgstr "в кеша на обектите-дървета има нещо, което не е дърво" #, c-format msgid "%s: invalid sha1 pointer in resolve-undo" msgstr "„%s“: неправилен указател за отмÑна на разрешените подаваниÑ" -msgid "git fsck [<options>] [<object>...]" -msgstr "git fsck [ОПЦИЯ…] [ОБЕКТ…]" +msgid "" +"git fsck [--tags] [--root] [--unreachable] [--cache] [--no-reflogs]\n" +" [--[no-]full] [--strict] [--verbose] [--lost-found]\n" +" [--[no-]dangling] [--[no-]progress] [--connectivity-only]\n" +" [--[no-]name-objects] [<object>...]" +msgstr "" +"git fsck [--tags] [--root] [--unreachable] [--cache] [--no-reflogs]\n" +" [--[no-]full] [--strict] [--verbose] [--lost-found]\n" +" [--[no-]dangling] [--[no-]progress] [--connectivity-only]\n" +" [--[no-]name-objects] [ОБЕКТ…]" msgid "show unreachable objects" msgstr "показване на недоÑтижимите обекти" @@ -6666,12 +6688,6 @@ msgstr "git fsmonitor--daemon start [ОПЦИЯ…]" msgid "git fsmonitor--daemon run [<options>]" msgstr "git fsmonitor--daemon run [ОПЦИЯ…]" -msgid "git fsmonitor--daemon stop" -msgstr "git fsmonitor--daemon stop" - -msgid "git fsmonitor--daemon status" -msgstr "git fsmonitor--daemon status" - #, c-format msgid "value of '%s' out of range: %d" msgstr "дължината на „%s“ e извън диапазона: %d" @@ -6923,8 +6939,20 @@ msgstr "изпълнение на определена задача" msgid "use at most one of --auto and --schedule=<frequency>" msgstr "опциите „--auto“ и „--schedule=ЧЕСТОТГ Ñа неÑъвмеÑтими" -msgid "failed to run 'git config'" -msgstr "неуÑпешно изпълнение на „git config“" +#, c-format +msgid "unable to add '%s' value of '%s'" +msgstr "неуÑпешно добавÑне на ÑтойноÑÑ‚ на „%s“ за „%s“" + +msgid "return success even if repository was not registered" +msgstr "уÑпешно завършване, дори ако хранилището не бъде региÑтрирано" + +#, c-format +msgid "unable to unset '%s' value of '%s'" +msgstr "неуÑпешно изчиÑтване на ÑтойноÑÑ‚ на „%s“ за „%s“" + +#, c-format +msgid "repository '%s' is not registered" +msgstr "хранилището „%s“ не е региÑтрирано" #, c-format msgid "failed to expand path '%s'" @@ -7227,11 +7255,14 @@ msgid "both --cached and trees are given" msgstr "опциÑта „--cached“ е неÑъвмеÑтима ÑÑŠÑ Ð·Ð°Ð´Ð°Ð²Ð°Ð½Ðµ на дърво" msgid "" -"git hash-object [-t <type>] [-w] [--path=<file> | --no-filters] [--stdin] " -"[--] <file>..." +"git hash-object [-t <type>] [-w] [--path=<file> | --no-filters]\n" +" [--stdin [--literally]] [--] <file>..." msgstr "" -"git hash-object [-t ВИД] [-w] [--path=ФÐЙЛ | --no-filters] [--stdin] [--] " -"ФÐЙЛ…" +"git hash-object [-t ВИД] [-w] [--path=ФÐЙЛ | --no-filters]\n" +" [--stdin [--literally]] [--] ФÐЙЛ…" + +msgid "git hash-object [-t <type>] [-w] --stdin-paths [--no-filters]" +msgstr "git hash-object [-t ВИД] [-w] --stdin-paths [--no-filters]" msgid "object type" msgstr "ВИД на обекта" @@ -7662,14 +7693,18 @@ msgid "Initialized empty Git repository in %s%s\n" msgstr "Инициализиране на празно хранилище на Git в „%s%s“\n" msgid "" -"git init [-q | --quiet] [--bare] [--template=<template-directory>] [--" -"shared[=<permissions>]] [<directory>]" +"git init [-q | --quiet] [--bare] [--template=<template-directory>]\n" +" [--separate-git-dir <git-dir>] [--object-format=<format>]\n" +" [-b <branch-name> | --initial-branch=<branch-name>]\n" +" [--shared[=<permissions>]] [<directory>]" msgstr "" -"git init [-q | --quiet] [--bare] [--template=ДИРЕКТОРИЯ_С_ШÐБЛОÐИ] [--" -"shared[=ПРÐÐ’Ð]] [ДИРЕКТОРИЯ]" +"git init [-q | --quiet] [--bare] [--template=ДИРЕКТОРИЯ_С_ШÐБЛОÐИ]\n" +" [--separate-git-dir ДИРЕКТОРИЯ_ÐÐ_GIT] [--object-format=ФОРМÐТ]\n" +" [-b КЛОР| --initial-branch=КЛОÐ]\n" +" [--shared[=ПРÐÐ’ÐÌ€]] [ДИРЕКТОРИЯ]" msgid "permissions" -msgstr "права" +msgstr "права̀" msgid "specify that the git repository is to be shared amongst several users" msgstr "" @@ -7709,11 +7744,13 @@ msgid "--separate-git-dir incompatible with bare repository" msgstr "опциÑта „--separate-git-dir“ е неÑъвмеÑтима Ñ Ð³Ð¾Ð»Ð¾ хранилище" msgid "" -"git interpret-trailers [--in-place] [--trim-empty] [(--trailer " -"<token>[(=|:)<value>])...] [<file>...]" +"git interpret-trailers [--in-place] [--trim-empty]\n" +" [(--trailer <token>[(=|:)<value>])...]\n" +" [--parse] [<file>...]" msgstr "" -"git interpret-trailers [--in-place] [--trim-empty] [(--trailer " -"ЛЕКСЕМÐ[(=|:)СТОЙÐОСТ])…] [ФÐЙЛ…]" +"git interpret-trailers [--in-place] [--trim-empty]\n" +" [(--trailer ЛЕКСЕМÐ[(=|:)СТОЙÐОСТ])…]\n" +" [--parse] [ФÐЙЛ…]" msgid "edit files in place" msgstr "директно редактиране на файловете" @@ -8213,11 +8250,11 @@ msgstr "" msgid "" "git ls-remote [--heads] [--tags] [--refs] [--upload-pack=<exec>]\n" -" [-q | --quiet] [--exit-code] [--get-url]\n" +" [-q | --quiet] [--exit-code] [--get-url] [--sort=<key>]\n" " [--symref] [<repository> [<refs>...]]" msgstr "" -"git ls-remote [--heads] [--tags] [--refs] [--upload-pack=<exec>]\n" -" [-q | --quiet] [--exit-code] [--get-url]\n" +"git ls-remote [--heads] [--tags] [--refs] [--upload-pack=КОМÐÐДÐ]\n" +" [-q | --quiet] [--exit-code] [--get-url] [--sort=КЛЮЧ]\n" " [--symref] [ХРÐÐИЛИЩЕ [УКÐЗÐТЕЛ…]]" msgid "do not print remote URL" @@ -8352,12 +8389,12 @@ msgstr "git merge-base [-a | --all] ПОДÐÐ’ÐÐЕ ПОДÐÐ’ÐÐЕ…" msgid "git merge-base [-a | --all] --octopus <commit>..." msgstr "git merge-base [-a | --all] --octopus ПОДÐÐ’ÐÐЕ…" -msgid "git merge-base --independent <commit>..." -msgstr "git merge-base --independent ПОДÐÐ’ÐÐЕ…" - msgid "git merge-base --is-ancestor <commit> <commit>" msgstr "git merge-base --is-ancestor ПОДÐÐ’ÐÐЕ_1 ПОДÐÐ’ÐÐЕ_2" +msgid "git merge-base --independent <commit>..." +msgstr "git merge-base --independent ПОДÐÐ’ÐÐЕ…" + msgid "git merge-base --fork-point <ref> [<commit>]" msgstr "git merge-base --fork-point УКÐЗÐТЕЛ [ПОДÐÐ’ÐÐЕ]" @@ -8467,9 +8504,20 @@ msgstr "" msgid "allow merging unrelated histories" msgstr "позволÑване на Ñливане на незавиÑими иÑтории" +msgid "perform multiple merges, one per line of input" +msgstr "извършване на множеÑтво ÑливаниÑ, по едно на ред" + msgid "--trivial-merge is incompatible with all other options" msgstr "„--trivial-merge“ е неÑъвмеÑтима Ñ Ð´Ñ€ÑƒÐ³Ð¸Ñ‚Ðµ опции" +#, c-format +msgid "malformed input line: '%s'." +msgstr "входен ред Ñ Ð½ÐµÐ¿Ñ€Ð°Ð²Ð¸Ð»ÐµÐ½ формат: „%s“." + +#, c-format +msgid "merging cannot continue; got unclean result of %d" +msgstr "Ñливането не може да продължи — %d-тото завърши Ñ Ð³Ñ€ÐµÑˆÐºÐ°" + msgid "git merge [<options>] [<commit>...]" msgstr "git merge [ОПЦИЯ…] [ПОДÐÐ’ÐÐЕ…]" @@ -9105,10 +9153,6 @@ msgstr "" "Ñъдържанието на бележка не може да Ñе вземе от обект, който не е BLOB: „%s“." #, c-format -msgid "malformed input line: '%s'." -msgstr "входен ред Ñ Ð½ÐµÐ¿Ñ€Ð°Ð²Ð¸Ð»ÐµÐ½ формат: „%s“." - -#, c-format msgid "failed to copy notes from '%s' to '%s'" msgstr "бележката не може да Ñе копира от „%s“ към „%s“" @@ -9305,13 +9349,12 @@ msgstr "да Ñе използва бележката Ñочена от този msgid "unknown subcommand: `%s'" msgstr "непозната подкоманда: „%s“" -msgid "" -"git pack-objects --stdout [<options>...] [< <ref-list> | < <object-list>]" +msgid "git pack-objects --stdout [<options>] [< <ref-list> | < <object-list>]" msgstr "" "git pack-objects --stdout [ОПЦИЯ…] [< СПИСЪК_С_УКÐЗÐТЕЛИ | < СПИСЪК_С_ОБЕКТИ]" msgid "" -"git pack-objects [<options>...] <base-name> [< <ref-list> | < <object-list>]" +"git pack-objects [<options>] <base-name> [< <ref-list> | < <object-list>]" msgstr "" "git pack-objects [ОПЦИЯ…] ПРЕФИКС_ÐÐ_ИМЕТО [< СПИСЪК_С_УКÐЗÐТЕЛИ | < " "СПИСЪК_С_ОБЕКТИ]" @@ -9712,8 +9755,8 @@ msgstr "" "ни извеÑтите Ñ Ðµ-пиÑмо до пощенÑÐºÐ¸Ñ ÑпиÑък:\n" "<git@vger.kernel.org>.\n" -msgid "git pack-refs [<options>]" -msgstr "git pack-refs [ОПЦИЯ…]" +msgid "git pack-refs [--all] [--no-prune]" +msgstr "git pack-refs [--all] [--no-prune]" msgid "pack everything" msgstr "пакетиране на вÑичко" @@ -9721,6 +9764,18 @@ msgstr "пакетиране на вÑичко" msgid "prune loose refs (default)" msgstr "окаÑтрÑне на недоÑтижимите указатели (Ñтандартно)" +msgid "git patch-id [--stable | --unstable | --verbatim]" +msgstr "git patch-id [--stable | --unstable | --verbatim]" + +msgid "use the unstable patch-id algorithm" +msgstr "използване на неÑтабилен алгоритъм за идентифициране на кръпка" + +msgid "use the stable patch-id algorithm" +msgstr "използване на Ñтабилен алгоритъм за идентифициране на кръпка" + +msgid "don't strip whitespace from the patch" +msgstr "без махане на празните знаци в кръпката" + msgid "git prune [-n] [-v] [--progress] [--expire <time>] [--] [<head>...]" msgstr "git prune [-n] [-v] [--progress] [--expire ВРЕМЕ] [--] [ВРЪХ…]" @@ -9938,14 +9993,13 @@ msgstr "" msgid "" "\n" -"To avoid automatically configuring upstream branches when their name\n" -"doesn't match the local branch, see option 'simple' of branch." -"autoSetupMerge\n" +"To avoid automatically configuring an upstream branch when its name\n" +"won't match the local branch, see option 'simple' of branch.autoSetupMerge\n" "in 'git help config'.\n" msgstr "" "\n" -"За да избегнете автоматичното задаване на Ñледени клони, когато името им не " -"Ñъвпада Ñ Ñ‚Ð¾Ð²Ð° на Ð»Ð¾ÐºÐ°Ð»Ð½Ð¸Ñ ÐºÐ»Ð¾Ð½, погледнете документациÑта за ÑтойноÑтта " +"За да избегнете автоматичното задаване на Ñледени клони, когато името им\n" +"не Ñъвпада Ñ Ñ‚Ð¾Ð²Ð° на Ð»Ð¾ÐºÐ°Ð»Ð½Ð¸Ñ ÐºÐ»Ð¾Ð½, погледнете документациÑта за ÑтойноÑтта\n" "„simple“ на наÑтройката „branch.autoSetupMerge“ в „git help config“.\n" #, c-format @@ -10109,6 +10163,13 @@ msgstr "ИзтлаÑкване към „%s“\n" msgid "failed to push some refs to '%s'" msgstr "чаÑÑ‚ от указателите не бÑха изтлаÑкани към „%s“" +msgid "" +"recursing into submodule with push.recurseSubmodules=only; using on-demand " +"instead" +msgstr "" +"рекурÑивно обхождане на подмодулите чрез „push.recurseSubmodules=only“. " +"ВмеÑто това Ñе ползва ПРИ ÐУЖДÐ" + #, c-format msgid "invalid value for '%s'" msgstr "Ðеправилна ÑтойноÑÑ‚ за „%s“" @@ -10247,13 +10308,15 @@ msgid "need two commit ranges" msgstr "необходими Ñа два диапазона Ñ Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ð¸Ñ" msgid "" -"git read-tree [(-m [--trivial] [--aggressive] | --reset | --prefix=<prefix>) " -"[-u | -i]] [--no-sparse-checkout] [--index-output=<file>] (--empty | <tree-" -"ish1> [<tree-ish2> [<tree-ish3>]])" +"git read-tree [(-m [--trivial] [--aggressive] | --reset | --" +"prefix=<prefix>)\n" +" [-u | -i]] [--index-output=<file>] [--no-sparse-checkout]\n" +" (--empty | <tree-ish1> [<tree-ish2> [<tree-ish3>]])" msgstr "" -"git read-tree [(-m [--trivial] [--aggressive] | --reset | --prefix=ПРЕФИКС) " -"[-u | -i]] [--no-sparse-checkout] [--index-output=ФÐЙЛ] (--empty | " -"УКÐЗÐТЕЛ_КЪМ_ДЪРВО_1 [УКÐЗÐТЕЛ_КЪМ_ДЪРВО_2 [УКÐЗÐТЕЛ_КЪМ_ДЪРВО_3]])" +"git read-tree [(-m [--trivial] [--aggressive] | --reset | --prefix=ПРЕФИКС)\n" +" [-u | -i]] [--index-output=ФÐЙЛ] [--no-sparse-checkout]\n" +" (--empty | УКÐЗÐТЕЛ_КЪМ_ДЪРВО_1 [УКÐЗÐТЕЛ_КЪМ_ДЪРВО_2 " +"[УКÐЗÐТЕЛ_КЪМ_ДЪРВО_3]])" msgid "write resulting index to <file>" msgstr "запазване на индекÑа в този ФÐЙЛ" @@ -10343,8 +10406,8 @@ msgid "%s requires the merge backend" msgstr "„%s“ изиÑква пребазиране" #, c-format -msgid "could not get 'onto': '%s'" -msgstr "не може да Ñе премине към новата база, зададена Ñ â€žonto“: „%s“" +msgid "invalid onto: '%s'" +msgstr "неправилен указател върху какво да Ñе пребазира: „%s“" #, c-format msgid "invalid orig-head: '%s'" @@ -10394,8 +10457,8 @@ msgstr "не може да Ñе премине към „%s“" #, c-format msgid "" -"unrecognized empty type '%s'; valid values are \"drop\", \"keep\", and \"ask" -"\"." +"unrecognized empty type '%s'; valid values are \"drop\", \"keep\", and " +"\"ask\"." msgstr "" "неправилна ÑтойноÑÑ‚ „%s“: вариантите Ñа „drop“ (преÑкачане), " "„keep“ (запазване) и „ask“ (питане)" @@ -10664,7 +10727,7 @@ msgstr "не ÑъщеÑтвува клон/подаване „%s“" msgid "No such ref: %s" msgstr "Такъв указател нÑма: %s" -msgid "Could not resolve HEAD to a revision" +msgid "Could not resolve HEAD to a commit" msgstr "Подаването, Ñочено от ÑƒÐºÐ°Ð·Ð°Ñ‚ÐµÐ»Ñ â€žHEAD“, не може да бъде открито" #, c-format @@ -11346,6 +11409,10 @@ msgstr "временниÑÑ‚ файл „%s“ не може да бъде отРmsgid "could not close refs snapshot tempfile" msgstr "временниÑÑ‚ файл ÑÑŠÑ Ñнимка на указателите не може да Ñе затвори" +#, c-format +msgid "could not remove stale bitmap: %s" +msgstr "изтриването на оÑтарÑлата битова маÑка „%s“ е невъзможно" + msgid "pack everything in a single pack" msgstr "пакетиране на вÑичко в пакет" @@ -11430,6 +11497,9 @@ msgstr "откриване на геометрична прогреÑÐ¸Ñ Ñ Ñ‡Ð msgid "write a multi-pack index of the resulting packs" msgstr "запазване на многопакетен Ð¸Ð½Ð´ÐµÐºÑ Ð·Ð° Ñъздадените пакети" +msgid "pack prefix to store a pack containing pruned objects" +msgstr "Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ Ð½Ð° името на Ð¿Ð°ÐºÐµÑ‚Ð½Ð¸Ñ Ð·Ð° пакети за окаÑтрени обекти" + msgid "cannot delete packs in a precious-objects repo" msgstr "пакетите в хранилище Ñ Ð²Ð°Ð¶Ð½Ð¸ обекти не може да Ñе триÑÑ‚" @@ -11441,8 +11511,12 @@ msgid "pack prefix %s does not begin with objdir %s" msgstr "името на Ð¿Ð°ÐºÐµÑ‚Ð½Ð¸Ñ Ñ„Ð°Ð¹Ð» „%s“ не започва Ñ Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñта за обекти Ñ â€ž%s“" #, c-format -msgid "missing required file: %s" -msgstr "липÑва Ð·Ð°Ð´ÑŠÐ»Ð¶Ð¸Ñ‚ÐµÐ»Ð½Ð¸Ñ Ñ„Ð°Ð¹Ð» „%s“" +msgid "renaming pack to '%s' failed" +msgstr "неуÑпешно преименуване на Ð¿Ð°ÐºÐµÑ‚Ð½Ð¸Ñ Ñ„Ð°Ð¹Ð» на „%s“" + +#, c-format +msgid "pack-objects did not write a '%s' file for pack %s-%s" +msgstr "Командата „git pack-objects“ не запиÑа файл „%s“ за пакета „%s-%s“" #, c-format msgid "could not unlink: %s" @@ -11636,8 +11710,9 @@ msgstr "опциÑта „--convert-graft-file“ не приема аргуме msgid "only one pattern can be given with -l" msgstr "опциÑта „-l“ приема точно един шаблон" -msgid "git rerere [clear | forget <path>... | status | remaining | diff | gc]" -msgstr "git rerere [clear | forget ПЪТ… | status | remaining | diff | gc]" +msgid "" +"git rerere [clear | forget <pathspec>... | diff | status | remaining | gc]" +msgstr "git rerere [clear | forget ПЪТ… | diff | status | remaining | gc]" msgid "register clean resolutions in index" msgstr "региÑтриране на чиÑти корекции на конфликти в индекÑа" @@ -11843,6 +11918,15 @@ msgstr "опциÑта „--prefix“ изиÑква аргумент" msgid "unknown mode for --abbrev-ref: %s" msgstr "непознат режим за „--abbrev-ref“: „%s“" +msgid "--exclude-hidden cannot be used together with --branches" +msgstr "опциите „--exclude-hidden“ и „--branches“ Ñа неÑъвмеÑтими" + +msgid "--exclude-hidden cannot be used together with --tags" +msgstr "опциите „--exclude-hidden“ и „--tags“ Ñа неÑъвмеÑтими" + +msgid "--exclude-hidden cannot be used together with --remotes" +msgstr "опциите „--exclude-hidden“ и „--remotes“ Ñа неÑъвмеÑтими" + msgid "this operation must be run in a work tree" msgstr "тази команда трÑбва да Ñе изпълни в работно дърво" @@ -11850,17 +11934,25 @@ msgstr "тази команда трÑбва да Ñе изпълни в рабРmsgid "unknown mode for --show-object-format: %s" msgstr "непознат режим за „--show-object-format“: „%s“" -msgid "git revert [<options>] <commit-ish>..." -msgstr "git revert [ОПЦИЯ…] УКÐЗÐТЕЛ_КЪМ_ПОДÐÐ’ÐÐЕ…" +msgid "" +"git revert [--[no-]edit] [-n] [-m <parent-number>] [-s] [-S[<keyid>]] " +"<commit>..." +msgstr "" +"git revert [--[no-]edit] [-n] [-m ÐОМЕР_ÐÐ_РОДИТЕЛ] [-s]\n" +" [-S[ИДЕÐТИФИКÐТОР_ÐÐ_КЛЮЧ]] ПОДÐÐ’ÐÐЕ…" -msgid "git revert <subcommand>" -msgstr "git revert ПОДКОМÐÐДÐ" +msgid "git revert (--continue | --skip | --abort | --quit)" +msgstr "git revert (--continue | --skip | --abort | --quit)" -msgid "git cherry-pick [<options>] <commit-ish>..." -msgstr "git cherry-pick [ОПЦИЯ…] УКÐЗÐТЕЛ_КЪМ_ПОДÐÐ’ÐÐЕ…" +msgid "" +"git cherry-pick [--edit] [-n] [-m <parent-number>] [-s] [-x] [--ff]\n" +" [-S[<keyid>]] <commit>..." +msgstr "" +"git cherry-pick [--edit] [-n] [-m ÐОМЕР_ÐÐ_РОДИТЕЛ] [-s] [-x] [--ff]\n" +" [-S[ИДЕÐТИФИКÐТОР_ÐÐ_КЛЮЧ]] ПОДÐÐ’ÐÐЕ…" -msgid "git cherry-pick <subcommand>" -msgstr "git cherry-pick ПОДКОМÐÐДÐ" +msgid "git cherry-pick (--continue | --skip | --abort | --quit)" +msgstr "git cherry-pick (--continue | --skip | --abort | --quit)" #, c-format msgid "option `%s' expects a number greater than zero" @@ -11889,7 +11981,7 @@ msgid "edit the commit message" msgstr "редактиране на Ñъобщението при подаване" msgid "parent-number" -msgstr "номер на родителÑ" +msgstr "номер на родител" msgid "select mainline parent" msgstr "избор на оÑÐ½Ð¾Ð²Ð½Ð¸Ñ Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»" @@ -11921,8 +12013,14 @@ msgstr "неуÑпешна отмÑна" msgid "cherry-pick failed" msgstr "неуÑпешно отбиране" -msgid "git rm [<options>] [--] <file>..." -msgstr "git rm [ОПЦИЯ…] [--] ФÐЙЛ…" +msgid "" +"git rm [-f | --force] [-n] [-r] [--cached] [--ignore-unmatch]\n" +" [--quiet] [--pathspec-from-file=<file> [--pathspec-file-nul]]\n" +" [--] [<pathspec>...]" +msgstr "" +"git rm [-f | --force] [-n] [-r] [--cached] [--ignore-unmatch]\n" +" [--quiet] [--pathspec-from-file=ФÐЙЛ [--pathspec-file-nul]]\n" +" [--] [ПЪТ…]" msgid "" "the following file has staged content different from both the\n" @@ -12001,12 +12099,14 @@ msgid "" "git send-pack [--mirror] [--dry-run] [--force]\n" " [--receive-pack=<git-receive-pack>]\n" " [--verbose] [--thin] [--atomic]\n" +" [--[no-]signed | --signed=(true|false|if-asked)]\n" " [<host>:]<directory> (--all | <ref>...)" msgstr "" "git send-pack [--mirror] [--dry-run] [--force]\n" " [--receive-pack=ПÐКЕТ]\n" " [--verbose] [--thin] [--atomic]\n" -" [ХОСТ:]ДИРЕКТОРИЯ (--all | УКÐЗÐТЕЛ…])" +" [--[no-]signed | --signed=(true|false|if-asked)]\n" +" [ХОСТ:]ДИРЕКТОРИЯ (--all | УКÐЗÐТЕЛ…)" msgid "remote name" msgstr "име на отдалечено хранилище" @@ -12029,8 +12129,9 @@ msgstr "git log --pretty=short | git shortlog [ОПЦИЯ…]" msgid "using multiple --group options with stdin is not supported" msgstr "повече от една опции „--group“ Ñа неÑъвмеÑтими ÑÑŠÑ ÑÑ‚Ð°Ð½Ð´Ð°Ñ€Ñ‚Ð½Ð¸Ñ Ð²Ñ…Ð¾Ð´" -msgid "using --group=trailer with stdin is not supported" -msgstr "опциÑта „--group=trailer“ е неÑъвмеÑтима ÑÑŠÑ ÑÑ‚Ð°Ð½Ð´Ð°Ñ€Ñ‚Ð½Ð¸Ñ Ð²Ñ…Ð¾Ð´" +#, c-format +msgid "using %s with stdin is not supported" +msgstr "„%s“ не поддържа ÑÑ‚Ð°Ð½Ð´Ð°Ñ€Ñ‚Ð½Ð¸Ñ Ð²Ñ…Ð¾Ð´" #, c-format msgid "unknown group type: %s" @@ -12067,12 +12168,14 @@ msgid "" "git show-branch [-a | --all] [-r | --remotes] [--topo-order | --date-order]\n" " [--current] [--color[=<when>] | --no-color] [--sparse]\n" " [--more=<n> | --list | --independent | --merge-base]\n" -" [--no-name | --sha1-name] [--topics] [(<rev> | <glob>)...]" +" [--no-name | --sha1-name] [--topics]\n" +" [(<rev> | <glob>)...]" msgstr "" "git show-branch [-a | --all] [-r | --remotes] [--topo-order | --date-order]\n" " [--current] [--color[=КОГÐ] | --no-color] [--sparse]\n" -" [--more=БРОЙ | --list | --independent | --merge-base]\n" -" [--no-name | --sha1-name] [--topics] [(РЕВИЗИЯ | УКÐЗÐТЕЛ)…]" +" [--more=<n> | --list | --independent | --merge-base]\n" +" [--no-name | --sha1-name] [--topics]\n" +" [(РЕВИЗИЯ | УКÐЗÐТЕЛ)…]" msgid "git show-branch (-g | --reflog)[=<n>[,<base>]] [--list] [<ref>]" msgstr "git show-branch (-g | --reflog)[=БРОЙ[,БÐЗÐ]] [--list] [УКÐЗÐТЕЛ]" @@ -12174,11 +12277,13 @@ msgid "Unknown hash algorithm" msgstr "Ðепознат алгоритъм за контролни Ñуми" msgid "" -"git show-ref [-q | --quiet] [--verify] [--head] [-d | --dereference] [-s | --" -"hash[=<n>]] [--abbrev[=<n>]] [--tags] [--heads] [--] [<pattern>...]" +"git show-ref [-q | --quiet] [--verify] [--head] [-d | --dereference]\n" +" [-s | --hash[=<n>]] [--abbrev[=<n>]] [--tags]\n" +" [--heads] [--] [<pattern>...]" msgstr "" -"git show-ref [-q | --quiet] [--verify] [--head] [-d | --dereference] [-s | --" -"hash[=ЧИСЛО]] [--abbrev[=ЧИСЛО]] [--tags] [--heads] [--] [ШÐБЛОÐ…]" +"git show-ref [-q | --quiet] [--verify] [--head] [-d | --dereference]\n" +" [-s | --hash[=БРОЙ]] [--abbrev[=БРОЙ]] [--tags]\n" +" [--heads] [--] [ШÐБЛОÐ…]" msgid "git show-ref --exclude-existing[=<pattern>]" msgstr "git show-ref --exclude-existing[=ШÐБЛОÐ]" @@ -12211,8 +12316,10 @@ msgstr "" "извеждане на указателите приети от ÑÑ‚Ð°Ð½Ð´Ð°Ñ€Ñ‚Ð½Ð¸Ñ Ð²Ñ…Ð¾Ð´, които липÑват в " "локалното хранилище" -msgid "git sparse-checkout (init|list|set|add|reapply|disable) <options>" -msgstr "git sparse-checkout (init|list|set|add|reapply|disable) ОПЦИЯ…" +msgid "" +"git sparse-checkout (init | list | set | add | reapply | disable) [<options>]" +msgstr "" +"git sparse-checkout (init | list | set | add | reapply | disable) ОПЦИЯ…" msgid "this worktree is not sparse" msgstr "това работно дърво не е чаÑтично" @@ -12338,67 +12445,57 @@ msgstr "" msgid "error while refreshing working directory" msgstr "грешка при обновÑване на работната директориÑ" -msgid "git stash list [<options>]" -msgstr "git stash list [ОПЦИЯ…]" +msgid "git stash list [<log-options>]" +msgstr "git stash list [ОПЦИЯ_ЗÐ_ЖУРÐÐЛ…]" + +msgid "" +"git stash show [-u | --include-untracked | --only-untracked] [<diff-" +"options>] [<stash>]" +msgstr "" +"git stash show [-u | --include-untracked | --only-untracked] " +"[ОПЦИЯ_ЗÐ_Ð ÐЗЛИКÐ…] [СКÐТÐÐО]" -msgid "git stash show [<options>] [<stash>]" -msgstr "git stash show [ОПЦИЯ…] [СКÐТÐÐО]" +msgid "git stash drop [-q | --quiet] [<stash>]" +msgstr "git stash drop [-q | --quiet] [СКÐТÐÐО]" -msgid "git stash drop [-q|--quiet] [<stash>]" -msgstr "git stash drop [-q|--quiet] [СКÐТÐÐО]" +msgid "git stash pop [--index] [-q | --quiet] [<stash>]" +msgstr "git stash pop [--index] [-q | --quiet] [СКÐТÐÐО]" -msgid "git stash ( pop | apply ) [--index] [-q|--quiet] [<stash>]" -msgstr "git stash ( pop | apply ) [--index] [-q|--quiet] [СКÐТÐÐО]" +msgid "git stash apply [--index] [-q | --quiet] [<stash>]" +msgstr "git stash apply [--index] [-q | --quiet] [СКÐТÐÐО]" msgid "git stash branch <branchname> [<stash>]" msgstr "git stash branch КЛОР[СКÐТÐÐО]" +msgid "git stash store [(-m | --message) <message>] [-q | --quiet] <commit>" +msgstr "git stash store [-m | --message СЪОБЩЕÐИЕ] [-q | --quiet] ПОДÐÐ’ÐÐЕ" + msgid "" -"git stash [push [-p|--patch] [-S|--staged] [-k|--[no-]keep-index] [-q|--" -"quiet]\n" -" [-u|--include-untracked] [-a|--all] [-m|--message <message>]\n" +"git stash [push [-p | --patch] [-S | --staged] [-k | --[no-]keep-index] [-q " +"| --quiet]\n" +" [-u | --include-untracked] [-a | --all] [(-m | --message) " +"<message>]\n" " [--pathspec-from-file=<file> [--pathspec-file-nul]]\n" " [--] [<pathspec>...]]" msgstr "" -"git stash [push [-p|--patch] [-S|--staged] [-k|--[no-]keep-index] [-q|--" -"quiet]\n" -" [-u|--include-untracked] [-a|--all] [-m|--message СЪОБЩЕÐИЕ]\n" +"git stash [push [-p | --patch] [-S | --staged] [-k | --[no-]keep-index] [-q " +"| --quiet]\n" +" [-u | --include-untracked] [-a | --all] [(-m | --message) " +"СЪОБЩЕÐИЕ]\n" " [--pathspec-from-file=ФÐЙЛ [--pathspec-file-nul]]\n" " [--] [ПЪТ…]]" msgid "" -"git stash save [-p|--patch] [-S|--staged] [-k|--[no-]keep-index] [-q|--" -"quiet]\n" -" [-u|--include-untracked] [-a|--all] [<message>]" -msgstr "" -"git stash save [-p|--patch] [-S|--staged] [-k|--[no-]keep-index] [-q|--" -"quiet]\n" -" [-u|--include-untracked] [-a|--all] [СЪОБЩЕÐИЕ]" - -msgid "git stash pop [--index] [-q|--quiet] [<stash>]" -msgstr "git stash pop [--index] [-q|--quiet] [СКÐТÐÐО]" - -msgid "git stash apply [--index] [-q|--quiet] [<stash>]" -msgstr "git stash apply [--index] [-q|--quiet] [СКÐТÐÐО]" - -msgid "git stash store [-m|--message <message>] [-q|--quiet] <commit>" -msgstr "git stash store [-m|--message СЪОБЩЕÐИЕ] [-q|--quiet] ПОДÐÐ’ÐÐЕ" - -msgid "" -"git stash [push [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]\n" -" [-u|--include-untracked] [-a|--all] [-m|--message <message>]\n" -" [--] [<pathspec>...]]" +"git stash save [-p | --patch] [-S | --staged] [-k | --[no-]keep-index] [-q | " +"--quiet]\n" +" [-u | --include-untracked] [-a | --all] [<message>]" msgstr "" -"git stash [push [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]\n" -" [-u|--include-untracked] [-a|--all] [-m|--message СЪОБЩЕÐИЕ]\n" -" [--] [ПЪТ…]]" +"git stash save [-p | --patch] [-S | --staged] [-k | --[no-]keep-index] [-q | " +"--quiet]\n" +" [-u | --include-untracked] [-a | --all] [СЪОБЩЕÐИЕ]" -msgid "" -"git stash save [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]\n" -" [-u|--include-untracked] [-a|--all] [<message>]" -msgstr "" -"git stash save [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]\n" -" [-u|--include-untracked] [-a|--all] [СЪОБЩЕÐИЕ]]" +msgid "git stash create [<message>]" +msgstr "git stash create [СЪОБЩЕÐИЕ]" #, c-format msgid "'%s' is not a stash-like commit" @@ -12973,9 +13070,6 @@ msgstr "рекурÑивно обхождане на подмодулите" msgid "don't fetch new objects from the remote site" msgstr "без доÑтавÑне на новите обекти от отдалеченото хранилище" -msgid "path into the working tree" -msgstr "път към работното дърво" - msgid "use the 'checkout' update strategy (default)" msgstr "" "използване на ÑтратегиÑта за обновÑване „checkout“ (изтеглÑне — Ñтандартно)" @@ -13012,27 +13106,9 @@ msgstr "" "shallow] [--reference <repository>] [--recursive] [--[no-]single-branch] " "[--] [ПЪТ…]" -msgid "recurse into submodules" -msgstr "рекурÑивно обхождане подмодулите" - msgid "git submodule absorbgitdirs [<options>] [<path>...]" msgstr "git submodule absorbgitdirs [ОПЦИЯ…] [ПЪТ…]" -msgid "check if it is safe to write to the .gitmodules file" -msgstr "проверка дали пиÑането във файла „.gitmodules“ е безопаÑно" - -msgid "unset the config in the .gitmodules file" -msgstr "изтриване на наÑтройка във файла „.gitmodules“" - -msgid "git submodule--helper config <name> [<value>]" -msgstr "git submodule--helper config ИМЕ [СТОЙÐОСТ]" - -msgid "git submodule--helper config --unset <name>" -msgstr "git submodule--helper config --unset ИМЕ" - -msgid "please make sure that the .gitmodules file is in the working tree" -msgstr "файлът „.gitmodules“ трÑбва да е в работното дърво" - msgid "suppress output for setting url of a submodule" msgstr "без извеждане на Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¿Ñ€Ð¸ задаването на адреÑа на подмодул" @@ -13112,6 +13188,9 @@ msgstr "Ðктивиране на локалното хранилище за пРmsgid "unable to checkout submodule '%s'" msgstr "Подмодулът „%s“ не може да бъде изтеглен" +msgid "please make sure that the .gitmodules file is in the working tree" +msgstr "файлът „.gitmodules“ трÑбва да е в работното дърво" + #, c-format msgid "Failed to add submodule '%s'" msgstr "ÐеуÑпешно добавÑне на подмодула „%s“" @@ -13165,19 +13244,21 @@ msgstr "" msgid "'%s' is not a valid submodule name" msgstr "„%s“ е неправилно име за подмодул" +msgid "git submodule--helper <command>" +msgstr "git submodule--helper КОМÐÐДÐ" + #, c-format msgid "%s doesn't support --super-prefix" msgstr "„%s“ не поддържа опциÑта „--super-prefix“" -#, c-format -msgid "'%s' is not a valid submodule--helper subcommand" -msgstr "„%s“ не е подкоманда на „submodule--helper“" +msgid "git symbolic-ref [-m <reason>] <name> <ref>" +msgstr "git symbolic-ref [-m ПРИЧИÐÐ] ИМЕ УКÐЗÐТЕЛ" -msgid "git symbolic-ref [<options>] <name> [<ref>]" -msgstr "git symbolic-ref [ОПЦИЯ…] ИМЕ [УКÐЗÐТЕЛ]" +msgid "git symbolic-ref [-q] [--short] [--no-recurse] <name>" +msgstr "git symbolic-ref [-q] [--short] [--no-recurse] ИМЕ" -msgid "git symbolic-ref -d [-q] <name>" -msgstr "git symbolic-ref -d [-q] ИМЕ" +msgid "git symbolic-ref --delete [-q] <name>" +msgstr "git symbolic-ref --delete [-q] ИМЕ" msgid "suppress error message for non-symbolic (detached) refs" msgstr "без извеждане на грешка за неÑвързани (неÑимволни) указатели" @@ -13188,6 +13269,9 @@ msgstr "изтриване на Ñимволен указател" msgid "shorten ref output" msgstr "кратка Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° указателÑ" +msgid "recursively dereference (default)" +msgstr "рекурÑивно извеждане на идентификатори (Ñтандартно)" + msgid "reason" msgstr "причина" @@ -13195,24 +13279,26 @@ msgid "reason of the update" msgstr "причина за обновÑването" msgid "" -"git tag [-a | -s | -u <key-id>] [-f] [-m <msg> | -F <file>]\n" -" <tagname> [<head>]" +"git tag [-a | -s | -u <key-id>] [-f] [-m <msg> | -F <file>] [-e]\n" +" <tagname> [<commit> | <object>]" msgstr "" -"git tag [-a | -s | -u ИДЕÐТИФИКÐТОР_ÐÐ_КЛЮЧ] [-f] [-m СЪОБЩЕÐИЕ | -F ФÐЙЛ]\n" -" ЕТИКЕТ [ВРЪХ]" +"git tag [-a | -s | -u ИДЕÐТИФИКÐТОР_ÐÐ_КЛЮЧ] [-f] [-m СЪОБЩЕÐИЕ | -F ФÐЙЛ] [-" +"e]\n" +" ЕТИКЕТ [ПОДÐÐ’ÐÐЕ | ОБЕКТ]" msgid "git tag -d <tagname>..." msgstr "git tag -d ЕТИКЕТ…" msgid "" -"git tag -l [-n[<num>]] [--contains <commit>] [--no-contains <commit>] [--" -"points-at <object>]\n" -" [--format=<format>] [--merged <commit>] [--no-merged <commit>] " -"[<pattern>...]" +"git tag [-n[<num>]] -l [--contains <commit>] [--no-contains <commit>]\n" +" [--points-at <object>] [--column[=<options>] | --no-column]\n" +" [--create-reflog] [--sort=<key>] [--format=<format>]\n" +" [--merged <commit>] [--no-merged <commit>] [<pattern>...]" msgstr "" -"git tag -l [-n[БРОЙ]] [--contains ПОДÐÐ’ÐÐЕ] [--no-contains ПОДÐÐ’ÐÐЕ]\n" -" [--points-at ОБЕКТ] [--format=ФОРМÐТ] [--merged ПОДÐÐ’ÐÐЕ]\n" -" [--no-merged ПОДÐÐ’ÐÐЕ] [ШÐБЛОÐ…]" +"git tag [-n[БРОЙ]] -l [--contains ПОДÐÐ’ÐÐЕ] [--no-contains ПОДÐÐ’ÐÐЕ]\n" +" [--points-at ОБЕКТ] [--column[=ОПЦИЯ…] | --no-column]\n" +" [--create-reflog] [--sort=<key>] [--format=ФОРМÐТ]\n" +" [--merged ПОДÐÐ’ÐÐЕ] [--no-merged ПОДÐÐ’ÐÐЕ] [ШÐБЛОÐ…]" msgid "git tag -v [--format=<format>] <tagname>..." msgstr "git tag -v [--format=ФОРМÐТ] ЕТИКЕТ…" @@ -13614,8 +13700,12 @@ msgstr "изчитане на указателите от ÑÑ‚Ð°Ð½Ð´Ð°Ñ€Ñ‚Ð½Ð¸Ñ msgid "update the info files from scratch" msgstr "обновÑване на информационните файлове от нулата" -msgid "git upload-pack [<options>] <dir>" -msgstr "git upload-pack [ОПЦИЯ…] ДИРЕКТОРИЯ" +msgid "" +"git-upload-pack [--[no-]strict] [--timeout=<n>] [--stateless-rpc]\n" +" [--advertise-refs] <directory>" +msgstr "" +"git-upload-pack [--[no-]strict] [--timeout=БРОЙ] [--stateless-rpc]\n" +" [--advertise-refs] ДИРЕКТОРИЯ" msgid "quit after a single request/response exchange" msgstr "изход Ñлед първоначалната размÑна на заÑвка и отговор" @@ -13630,8 +13720,8 @@ msgstr "" msgid "interrupt transfer after <n> seconds of inactivity" msgstr "транÑферът да Ñе преуÑтанови Ñлед този БРОЙ Ñекунди" -msgid "git verify-commit [-v | --verbose] <commit>..." -msgstr "git verify-commit [-v | --verbose] ПОДÐÐ’ÐÐЕ…" +msgid "git verify-commit [-v | --verbose] [--raw] <commit>..." +msgstr "git verify-commit [-v | --verbose] [--raw] ПОДÐÐ’ÐÐЕ…" msgid "print commit contents" msgstr "извеждане на Ñъдържанието на подаването" @@ -13639,8 +13729,8 @@ msgstr "извеждане на Ñъдържанието на подаванет msgid "print raw gpg status output" msgstr "извеждане на Ð½ÐµÐ¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐµÐ½Ð¸Ñ Ð¸Ð·Ñ…Ð¾Ð´ от ÑÑŠÑтоÑнието на „gpg“" -msgid "git verify-pack [-v | --verbose] [-s | --stat-only] <pack>..." -msgstr "git verify-pack [-v | --verbose] [-s | --stat-only] ПÐКЕТ…" +msgid "git verify-pack [-v | --verbose] [-s | --stat-only] [--] <pack>.idx..." +msgstr "git verify-pack [-v | --verbose] [-s | --stat-only] [--] ПÐКЕТ.idx…" msgid "verbose" msgstr "извеждане на подробна информациÑ" @@ -13648,35 +13738,39 @@ msgstr "извеждане на подробна информациÑ" msgid "show statistics only" msgstr "извеждане Ñамо на ÑтатиÑтиката" -msgid "git verify-tag [-v | --verbose] [--format=<format>] <tag>..." -msgstr "git verify-tag [-v | --verbose] [--format=ФОРМÐТ] ЕТИКЕТ…" +msgid "git verify-tag [-v | --verbose] [--format=<format>] [--raw] <tag>..." +msgstr "git verify-tag [-v | --verbose] [--format=ФОРМÐТ] [--raw] ЕТИКЕТ…" msgid "print tag contents" msgstr "извеждане на Ñъдържанието на ЕТИКЕТи" -msgid "git worktree add [<options>] <path> [<commit-ish>]" -msgstr "git worktree add [ОПЦИЯ…] ПЪТ [УКÐЗÐТЕЛ_КЪМ_ПОДÐÐ’ÐÐЕ]" +msgid "" +"git worktree add [-f] [--detach] [--checkout] [--lock [--reason <string>]]\n" +" [-b <new-branch>] <path> [<commit-ish>]" +msgstr "" +"git worktree add [-f] [--detach] [--checkout] [--lock [--reason ÐИЗ]]\n" +" [-b ÐОВ_КЛОÐ] ПЪТ [УКÐЗÐТЕЛ_КЪМ_ПОДÐÐ’ÐÐЕ]" -msgid "git worktree list [<options>]" -msgstr "git worktree list [ОПЦИЯ…]" +msgid "git worktree list [-v | --porcelain [-z]]" +msgstr "git worktree list [-v | --porcelain [-z]]" -msgid "git worktree lock [<options>] <path>" -msgstr "git worktree lock [ОПЦИЯ…] [ПЪТ]" +msgid "git worktree lock [--reason <string>] <worktree>" +msgstr "git worktree lock [--reason ПРИЧИÐÐ] ФОРМÐТ" msgid "git worktree move <worktree> <new-path>" msgstr "git worktree move [ДЪРВО] [ÐОВ_ПЪТ]" -msgid "git worktree prune [<options>]" -msgstr "git worktree prune [ОПЦИЯ…]" +msgid "git worktree prune [-n] [-v] [--expire <expire>]" +msgstr "git worktree prune [-n] [-v] [--expire ВРЕМЕ]" -msgid "git worktree remove [<options>] <worktree>" -msgstr "git worktree remove [ОПЦИЯ…] [ДЪРВО]" +msgid "git worktree remove [-f] <worktree>" +msgstr "git worktree remove [-f] ДЪРВО" msgid "git worktree repair [<path>...]" msgstr "git worktree repair [ПЪТ…]" -msgid "git worktree unlock <path>" -msgstr "git worktree unlock [ПЪТ]" +msgid "git worktree unlock <worktree>" +msgstr "git worktree unlock ДЪРВО" #, c-format msgid "Removing %s/%s: %s" @@ -13918,6 +14012,10 @@ msgstr "Ñамо за изчиÑтване на грешки" msgid "core.fsyncMethod = batch is unsupported on this platform" msgstr "„core.fsyncMethod = batch“ не Ñе поддържа на тази платформа" +#, c-format +msgid "bundle list at '%s' has no mode" +msgstr "липÑва режим в ÑпиÑъка от пратки „%s“" + msgid "failed to create temporary file" msgstr "не може да Ñе Ñъздаде временен файл" @@ -13925,16 +14023,30 @@ msgid "insufficient capabilities" msgstr "недоÑтатъчно възможноÑти" #, c-format +msgid "unrecognized bundle mode from URI '%s'" +msgstr "непознат режим на пратки от Ð°Ð´Ñ€ÐµÑ â€ž%s“" + +#, c-format +msgid "exceeded bundle URI recursion limit (%d)" +msgstr "" +"преминато е ограничениeто за рекурÑивно обхождане на адреÑи на пратки (%d)" + +#, c-format msgid "failed to download bundle from URI '%s'" msgstr "неуÑпешно изтеглÑне на пратка от адреÑ: „%s“" #, c-format -msgid "file at URI '%s' is not a bundle" -msgstr "файлът на Ð°Ð´Ñ€ÐµÑ â€ž%s“ не е пратка" +msgid "file at URI '%s' is not a bundle or bundle list" +msgstr "файлът на Ð°Ð´Ñ€ÐµÑ â€ž%s“ не е нито пратка, нито ÑпиÑък Ñ Ð¿Ñ€Ð°Ñ‚ÐºÐ¸" -#, c-format -msgid "failed to unbundle bundle from URI '%s'" -msgstr "неуÑпешно разпакетиране на пратка от Ð°Ð´Ñ€ÐµÑ â€ž%s“" +msgid "bundle-uri: got an empty line" +msgstr "bundle-uri: получен е празен ред" + +msgid "bundle-uri: line is not of the form 'key=value'" +msgstr "bundle-uri: редът не е във формат „КЛЮЧ=СТОЙÐОСТ“" + +msgid "bundle-uri: line has empty key or value" +msgstr "bundle-uri: редът Ñъдържа празен ключ или ÑтойноÑÑ‚" #, c-format msgid "unrecognized bundle hash algorithm: %s" @@ -14163,7 +14275,7 @@ msgstr "СравнÑване на обекти-дърво Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ð½Ð¾Ñ‚Ð¾ msgid "Compares the content and mode of blobs found via two tree objects" msgstr "" -"СравнÑване на Ñъдържанието и правата за доÑтъп на обектите-BLOB чрез два " +"СравнÑване на Ñъдържанието и права̀та за доÑтъп на обектите-BLOB чрез два " "обекта-дърво" msgid "Show changes using common diff tools" @@ -14521,7 +14633,7 @@ msgstr "Формат на пратките" msgid "Chunk-based file formats" msgstr "Формати на откъÑите" -msgid "Git commit graph format" +msgid "Git commit-graph format" msgstr "Формат на гра̀фа Ñ Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ð¸Ñта" msgid "Git index format" @@ -14691,7 +14803,7 @@ msgstr "не може да бъде Ñъздаден временен Ñлой Ð #, c-format msgid "unable to adjust shared permissions for '%s'" -msgstr "правата за Ñподелен доÑтъп до „%s“ не може да бъдат зададени" +msgstr "права̀та за Ñподелен доÑтъп до „%s“ не може да бъдат зададени" #, c-format msgid "Writing out commit graph in %d pass" @@ -14888,8 +15000,12 @@ msgstr "необработен Ñлучай в „has_worktree_moved“: %d" #, c-format msgid "health thread wait failed [GLE %ld]" msgstr "" -"грешка в нишката за Ñледене на ÑÑŠÑтоÑнието [поÑледна грешка в нишката: GLE=" -"%1$ld]" +"грешка в нишката за Ñледене на ÑÑŠÑтоÑнието [поÑледна грешка в нишката: " +"GLE=%1$ld]" + +#, c-format +msgid "Invalid path: %s" +msgstr "Ðеправилен път: „%s“" msgid "Unable to create FSEventStream." msgstr "ÐеуÑпешно Ñъздаване на „FSEventStream“." @@ -14911,8 +15027,8 @@ msgstr "„%2$s“ не може да Ñе наблюдава [поÑледна #, c-format msgid "[GLE %ld] could not get longname of '%s'" msgstr "" -"дългото име на „%2$s“ те може да Ñе получи [поÑледна грешка в нишката: GLE=" -"%1$ld]" +"дългото име на „%2$s“ те може да Ñе получи [поÑледна грешка в нишката: " +"GLE=%1$ld]" #, c-format msgid "ReadDirectoryChangedW failed on '%s' [GLE %ld]" @@ -14933,6 +15049,22 @@ msgstr "" "нишката: GLE=%ld]" #, c-format +msgid "opendir('%s') failed" +msgstr "неуÑпешно изпълнение на opendir(„%s“)" + +#, c-format +msgid "lstat('%s') failed" +msgstr "неуÑпешно изпълнение на lstat(„%s“)" + +#, c-format +msgid "strbuf_readlink('%s') failed" +msgstr "неуÑпешно изпълнение на strbuf_readlink(„%s“)" + +#, c-format +msgid "closedir('%s') failed" +msgstr "неуÑпешно изпълнение на closedir(„%s“)" + +#, c-format msgid "[GLE %ld] unable to open for read '%ls'" msgstr "" "файлът „%2$ls“ не може да бъде отворен за четене [поÑледна грешка в нишката: " @@ -15324,7 +15456,7 @@ msgstr "неуÑпешно изпълнение на „mmap“ върху „%s #, c-format msgid "chmod on %s failed" -msgstr "неуÑпешна ÑмÑна на права Ñ â€žchmod“ върху „%s“" +msgstr "неуÑпешна ÑмÑна на права̀ Ñ â€žchmod“ върху „%s“" #, c-format msgid "could not write config file %s" @@ -15353,7 +15485,7 @@ msgid "" msgstr "" "Ðе може да Ñе чете от отдалеченото хранилище.\n" "\n" -"Проверете дали то ÑъщеÑтвува и дали имате права\n" +"Проверете дали то ÑъщеÑтвува и дали имате права̀\n" "за доÑтъп." #, c-format @@ -16576,9 +16708,11 @@ msgstr "виртуалното хранилище „%s“ е неÑъвмеÑÑ‚ #, c-format msgid "" -"repository '%s' is incompatible with fsmonitor due to lack of Unix sockets" +"socket directory '%s' is incompatible with fsmonitor due to lack of Unix " +"sockets support" msgstr "" -"хранилището „%s“ е неÑъвмеÑтимо Ñ fsmonitor заради липÑата на гнезда на unix" +"директориÑта за гнезда „%s“ е неÑъвмеÑтима Ñ fsmonitor заради липÑата на " +"гнезда на Unix" msgid "" "git [-v | --version] [-h | --help] [-C <path>] [-c <name>=<value>]\n" @@ -16915,8 +17049,8 @@ msgstr[1] "" "\n" "Ðай-близките команди Ñа" -msgid "git version [<options>]" -msgstr "git version [ОПЦИЯ…]" +msgid "git version [--build-options]" +msgstr "git version [--build-options]" #, c-format msgid "%s: %s - %s" @@ -16940,7 +17074,7 @@ msgid "" "The '%s' hook was ignored because it's not set as executable.\n" "You can disable this warning with `git config advice.ignoredHook false`." msgstr "" -"Куката „%s“ Ñе преÑкача, защото липÑват права за изпълнение.\n" +"Куката „%s“ Ñе преÑкача, защото липÑват права̀ за изпълнение.\n" "За да изключите това предупреждение, изпълнете:\n" " git config advice.ignoredHook false" @@ -17420,7 +17554,7 @@ msgstr "неуÑпешно Ñъздаване на Ñимволната връз #, c-format msgid "do not know what to do with %06o %s '%s'" msgstr "" -"не е ÑÑно какво да Ñе прави Ñ Ð¾Ð±ÐµÐºÑ‚Ð° „%2$s“ (%3$s) Ñ Ð¿Ñ€Ð°Ð²Ð° за доÑтъп „%1$06o“" +"не е ÑÑно какво да Ñе прави Ñ Ð¾Ð±ÐµÐºÑ‚Ð° „%2$s“ (%3$s) Ñ Ð¿Ñ€Ð°Ð²Ð°Ì€ за доÑтъп „%1$06o“" #, c-format msgid "Fast-forwarding submodule %s to the following commit:" @@ -17533,8 +17667,8 @@ msgstr "" #, c-format msgid "" -"CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s" -"\"->\"%s\" in \"%s\"%s" +"CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename " +"\"%s\"->\"%s\" in \"%s\"%s" msgstr "" "КОÐФЛИКТ (преименуване/преименуване): „%s“ е преименуван на „%s“ в клон " "„%s“, а „%s“ е преименуван на „%s“ в „%s“/%s." @@ -17877,10 +18011,6 @@ msgstr "" "%s: алтернативните хранилища за обекти Ñе пренебрегват поради прекалено " "дълбоко влагане" -#, c-format -msgid "unable to normalize object directory: %s" -msgstr "директориÑта за обекти „%s“ не може да бъде нормализирана" - msgid "unable to fdopen alternates lockfile" msgstr "заключващиÑÑ‚ файл за алтернативите не може да Ñе отвори Ñ â€žfdopen“" @@ -17976,7 +18106,7 @@ msgstr "файлът „%s“ не може да бъде запиÑан" #, c-format msgid "unable to set permission to '%s'" -msgstr "правата за доÑтъп до „%s“ не може да бъдат зададени" +msgstr "права̀та за доÑтъп до „%s“ не може да бъдат зададени" msgid "file write error" msgstr "грешка при Ð·Ð°Ð¿Ð¸Ñ Ð½Ð° файл" @@ -17987,7 +18117,7 @@ msgstr "грешка при затварÑнето на файла Ñ Ð½ÐµÐ¿Ð°Ðº #, c-format msgid "insufficient permission for adding an object to repository database %s" msgstr "" -"нÑма права за добавÑне на обект към базата от данни на хранилището „%s“" +"нÑма права̀ за добавÑне на обект към базата от данни на хранилището „%s“" msgid "unable to create temporary file" msgstr "не може да бъде Ñъздаден временен файл" @@ -18436,7 +18566,7 @@ msgstr "не може да Ñе получи Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ñ‡Ñ€ÐµÐ· „st #, c-format msgid "failed to make %s readable" -msgstr "не може да Ñе дадат права за четене на „%s“" +msgstr "не може да Ñе дадат права̀ за четене на „%s“" #, c-format msgid "could not write '%s' promisor file" @@ -18605,7 +18735,7 @@ msgstr "" #, c-format msgid "Could not make %s writable by group" -msgstr "Ðе може да Ñе дадат права за Ð·Ð°Ð¿Ð¸Ñ Ð² директориÑта „%s“ на групата" +msgstr "Ðе може да Ñе дадат права̀ за Ð·Ð°Ð¿Ð¸Ñ Ð² директориÑта „%s“ на групата" msgid "Escape character '\\' not allowed as last character in attr value" msgstr "" @@ -18741,6 +18871,10 @@ msgid "promisor remote name cannot begin with '/': %s" msgstr "" "името отдалеченото хранилище-гарант не може за започва ÑÑŠÑ Ð·Ð½Ð°ÐºÐ° „/“: %s" +#, c-format +msgid "could not fetch %s from promisor remote" +msgstr "„%s“ не може да Ñе доÑтави от гарантиращото хранилище" + msgid "object-info: expected flush after arguments" msgstr "object-info: Ñлед аргументите Ñе очаква изчиÑтване на буферите" @@ -18934,7 +19068,7 @@ msgstr "неуÑпешно изтриване на „%s“" #, c-format msgid "cannot fix permission bits on '%s'" -msgstr "правата за доÑтъп до „%s“ не може да бъдат поправени" +msgstr "права̀та за доÑтъп до „%s“ не може да бъдат поправени" #, c-format msgid "%s: cannot drop to stage #0" @@ -19838,6 +19972,13 @@ msgid "failed to find tree of %s" msgstr "дървото, Ñочено от „%s“, не може да бъде открито" #, c-format +msgid "unsupported section for hidden refs: %s" +msgstr "неподдържан раздел за Ñкрити указатели: „%s“" + +msgid "--exclude-hidden= passed more than once" +msgstr "опциÑта „--exclude-hidden=“ не може да Ñе подава повече от веднъж" + +#, c-format msgid "resolve-undo records `%s` which is missing" msgstr "" "в информациÑта за отмÑна на разрешените Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ð¸Ñ Ð¿Ñ€Ð¸ÑÑŠÑтва „%s“, който " @@ -19986,6 +20127,14 @@ msgid "--all or <enlistment>, but not both" msgstr "опциÑта „--all“ и указването на зачиÑлена Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ð½Ðµ Ñа ÑъвмеÑтими" #, c-format +msgid "could not remove stale scalar.repo '%s'" +msgstr "оÑтарÑлото Ñкаларно хранилище (scalar.repo) „%s“ не може да Ñе изтрие" + +#, c-format +msgid "removing stale scalar.repo '%s'" +msgstr "изтриване на оÑтарÑлото Ñкаларно хранилище (scalar.repo) „%s“" + +#, c-format msgid "git repository gone in '%s'" msgstr "вече нÑма хранилище на git в „%s“" @@ -20194,7 +20343,7 @@ msgid "%s: Unable to write new index file" msgstr "%s: новиÑÑ‚ Ð¸Ð½Ð´ÐµÐºÑ Ð½Ðµ може да бъде запазен" msgid "unable to update cache tree" -msgstr "дървото на кеша не може да бъде обновено" +msgstr "кешът на обектите-дървета не може да бъде обновен" msgid "could not resolve HEAD commit" msgstr "подаването, Ñочено от ÑƒÐºÐ°Ð·Ð°Ñ‚ÐµÐ»Ñ â€žHEAD“, не може да бъде открито" @@ -20652,16 +20801,16 @@ msgstr "" msgid "illegal label name: '%.*s'" msgstr "неправилно име на етикет: „%.*s“" +#, c-format +msgid "could not resolve '%s'" +msgstr "„%s“ не може да бъде открит" + msgid "writing fake root commit" msgstr "запазване на фалшиво начално подаване" msgid "writing squash-onto" msgstr "запазване на подаването, в което другите да Ñе вкарат" -#, c-format -msgid "could not resolve '%s'" -msgstr "„%s“ не може да бъде открит" - msgid "cannot merge without a current revision" msgstr "без текущо подаване не може да Ñе Ñлива" @@ -21032,7 +21181,7 @@ msgid "" msgstr "" "зададениÑÑ‚ в „core.sharedRepository“ режим за доÑтъп до файлове е неправилен " "(0%.3o).\n" -"СобÑтвеникът на файла трÑбва да има права за пиÑане и четене." +"СобÑтвеникът на файла трÑбва да има права̀ за пиÑане и четене." msgid "fork failed" msgstr "неуÑпешно Ñъздаване на Ð¿Ñ€Ð¾Ñ†ÐµÑ Ñ‡Ñ€ÐµÐ· „fork“" @@ -21277,6 +21426,17 @@ msgstr "„ls-tree“ завърши Ñ Ð½ÐµÐ¾Ñ‡Ð°ÐºÐ²Ð°Ð½ изходен код msgid "failed to lstat '%s'" msgstr "не може да бъде получена Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ñ‡Ñ€ÐµÐ· „lstat“ за „%s“" +msgid "test-tool cache-tree <options> (control|prime|update)" +msgstr "test-tool cache-tree ОПЦИЯ… (control|prime|update)" + +msgid "clear the cache tree before each iteration" +msgstr "изчиÑтване на кеша на обектите-дървета преди вÑÑка итерациÑ" + +msgid "number of entries in the cache tree to invalidate (default 0)" +msgstr "" +"какъв брой запиÑи в кеша на обектите-дървета да Ñе отбележат като невалидни " +"(Ñтандартно е 0)" + msgid "unhandled options" msgstr "неподдържани опции" @@ -21377,7 +21537,7 @@ msgstr "„%s“ не е обикновен файл" #, c-format msgid "file %s is not writable by user" -msgstr "„%s“: нÑма права за запиÑване на файла" +msgstr "„%s“: нÑма права̀ за запиÑване на файла" msgid "could not open temporary file" msgstr "временниÑÑ‚ файл не може да Ñе отвори" @@ -21629,7 +21789,7 @@ msgid "too-short tree object" msgstr "прекалено кратък обект-дърво" msgid "malformed mode in tree entry" -msgstr "неправилни права за доÑтъп в Ð·Ð°Ð¿Ð¸Ñ Ð² дърво" +msgstr "неправилни права̀ за доÑтъп в Ð·Ð°Ð¿Ð¸Ñ Ð² дърво" msgid "empty filename in tree entry" msgstr "празно име на файл в Ð·Ð°Ð¿Ð¸Ñ Ð² дърво" @@ -68,8 +68,8 @@ msgid "" msgstr "" "Project-Id-Version: Git\n" "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n" -"POT-Creation-Date: 2022-09-28 18:55+0200\n" -"PO-Revision-Date: 2022-09-28 19:00-0600\n" +"POT-Creation-Date: 2022-12-07 07:33+0100\n" +"PO-Revision-Date: 2022-12-07 19:00-0600\n" "Last-Translator: Jordi Mas i Hernà ndez <jmas@softcatala.org>\n" "Language-Team: Catalan\n" "Language: ca\n" @@ -818,7 +818,10 @@ msgid "cmdline ends with \\" msgstr "la lÃnia d'ordres acaba amb \\" msgid "unclosed quote" -msgstr "commetes no tancades" +msgstr "cometes no tancades" + +msgid "too many arguments" +msgstr "hi ha massa arguments" #, c-format msgid "unrecognized whitespace option '%s'" @@ -1878,7 +1881,7 @@ msgstr "" "comprova si els fitxers, fins i tot els absents, s'ignoren en fer una prova" msgid "allow updating entries outside of the sparse-checkout cone" -msgstr "permet actualitzar entrada fora del con del «sparse-checkout»" +msgstr "permet actualitzar les entrades fora del con del «sparse-checkout»" msgid "override the executable bit of the listed files" msgstr "sobreescriu el bit executable dels fitxers llistats" @@ -2408,7 +2411,7 @@ msgid "" "could not check out original HEAD '%s'. Try 'git bisect reset <commit>'." msgstr "" "no s'ha pogut agafar la HEAD original «%s». Proveu «git bisect reset " -"<commit>»." +"<comissió>»." #, c-format msgid "Bad bisect_write argument: %s" @@ -2606,42 +2609,6 @@ msgstr "" "l'execució de la bisecció ha fallat: «git bisect--helper --bisect-state %s» " "ha sortit amb el codi d'error %d" -msgid "reset the bisection state" -msgstr "restableix l'estat de la bisecció" - -msgid "check whether bad or good terms exist" -msgstr "comprova si existeixen termes correctes o incorrectes" - -msgid "print out the bisect terms" -msgstr "imprimeix els termes de la bisecció" - -msgid "start the bisect session" -msgstr "inicia la sessió bisecció" - -msgid "find the next bisection commit" -msgstr "troba la comissió de bisecció següent" - -msgid "mark the state of ref (or refs)" -msgstr "marca l'estat de la referència o referències" - -msgid "list the bisection steps so far" -msgstr "mostra les passes de la bisecció fins ara" - -msgid "replay the bisection process from the given file" -msgstr "torna a reproduir el procés de bisecció des del fitxer donat" - -msgid "skip some commits for checkout" -msgstr "omet algunes comissions en agafar" - -msgid "visualize the bisection" -msgstr "visualitza la bisecció" - -msgid "use <cmd>... to automatically bisect" -msgstr "useu <cmd>... per a fer una bisecció automà ticament" - -msgid "no log for BISECT_WRITE" -msgstr "no hi ha registre per a BISECT_WRITE" - msgid "--bisect-reset requires either no argument or a commit" msgstr "--bisect-reset no requereix cap argument ni comissió" @@ -2660,6 +2627,9 @@ msgstr "no s'ha donat cap fitxer de registre" msgid "git blame [<options>] [<rev-opts>] [<rev>] [--] <file>" msgstr "git blame [<opcions>] [<opcions-de-revisió>] [<revisió>] [--] fitxer" +msgid "git annotate [<options>] [<rev-opts>] [<rev>] [--] <file>" +msgstr "git annotate [<opcions>] [<rev-opts>] [<rev>] [--] <fitxer>" + msgid "<rev-opts> are documented in git-rev-list(1)" msgstr "es documenten les <opcions-de-revisió> en git-rev-list(1)" @@ -2799,11 +2769,11 @@ msgid "" "git branch [<options>] [-f] [--recurse-submodules] <branch-name> [<start-" "point>]" msgstr "" -"git branch [<options>] [-f] [--recurse-submodules] <branch-name> [<start-" +"git branch [<opcions>] [-f] [--recurse-submodules] <branch-name> [<start-" "point>]" msgid "git branch [<options>] [-l] [<pattern>...]" -msgstr "git branch [<options>] [-l] [<pattern>...]" +msgstr "git branch [<opcions>] [-l] [<patró>...]" msgid "git branch [<options>] [-r] (-d | -D) <branch-name>..." msgstr "git branch [<opcions>] [-r] (-d | -D) <nom-de-branca>..." @@ -2856,9 +2826,6 @@ msgstr "L'actualització del fitxer de configuració ha fallat" msgid "cannot use -a with -d" msgstr "no es pot usar -a amb -d" -msgid "Couldn't look up commit object for HEAD" -msgstr "No s'ha pogut trobar l'objecte de comissió de HEAD" - #, c-format msgid "Cannot delete branch '%s' checked out at '%s'" msgstr "No es pot suprimir la branca «%s» agafada a «%s»" @@ -2897,16 +2864,18 @@ msgstr "S'està fent «rebase» en la branca %s a %s" msgid "Branch %s is being bisected at %s" msgstr "La branca %s s'està bisecant a %s" -msgid "cannot copy the current branch while not on any." -msgstr "no es pot copiar branca actual mentre no s'és a cap." - -msgid "cannot rename the current branch while not on any." -msgstr "no es pot canviar el nom de la branca actual mentre no s'és a cap." - #, c-format msgid "Invalid branch name: '%s'" msgstr "Nom de branca no và lid: «%s»" +#, c-format +msgid "No commit on branch '%s' yet." +msgstr "Encara no hi ha cap comissió en la branca «%s»." + +#, c-format +msgid "No branch named '%s'." +msgstr "No hi ha cap branca amb nom «%s»." + msgid "Branch rename failed" msgstr "El canvi de nom de branca ha fallat" @@ -3039,7 +3008,7 @@ msgid "sorting and filtering are case insensitive" msgstr "ordenació i filtratge distingeixen entre majúscules i minúscules" msgid "recurse through submodules" -msgstr "inclou recursivament als submòduls" +msgstr "inclou recursivament els submòduls" msgid "format to use for the output" msgstr "format a usar en la sortida" @@ -3069,13 +3038,11 @@ msgstr "No es pot donar descripció a una HEAD separada" msgid "cannot edit description of more than one branch" msgstr "no es pot editar la descripció de més d'una branca" -#, c-format -msgid "No commit on branch '%s' yet." -msgstr "Encara no hi ha cap comissió en la branca «%s»." +msgid "cannot copy the current branch while not on any." +msgstr "no es pot copiar branca actual mentre no s'és a cap." -#, c-format -msgid "No branch named '%s'." -msgstr "No hi ha cap branca amb nom «%s»." +msgid "cannot rename the current branch while not on any." +msgstr "no es pot canviar el nom de la branca actual mentre no s'és a cap." msgid "too many branches for a copy operation" msgstr "hi ha massa branques per a una operació de còpia" @@ -3116,7 +3083,7 @@ msgid "" "Did you mean to use: -a|-r --list <pattern>?" msgstr "" "Les opcions -a i -r a «git branch» no prenen un nom de branca.\n" -"VolÃeu usar -a|-r --list <pattern>?" +"VolÃeu usar -a|-r --list <patró>?" msgid "" "the '--set-upstream' option is no longer supported. Please use '--track' or " @@ -3143,11 +3110,11 @@ msgstr "" "no s'està executant en un repositori de git - no hi ha lligams a mostrar\n" msgid "" -"git bugreport [-o|--output-directory <file>] [-s|--suffix <format>] [--" -"diagnose[=<mode>]" +"git bugreport [(-o | --output-directory) <path>] [(-s | --suffix) <format>]\n" +" [--diagnose[=<mode>]]" msgstr "" -"git bugreport [-o|--output-directory <file>] [-s|--suffix <format>] [--" -"diagnose[=<mode>]" +"git bugreport [(-o | --output-directory) <camÃ>] [(-s | --suffix) <format>]\n" +" [--diagnose[=<mode>]]" msgid "" "Thank you for filling out a Git bug report!\n" @@ -3218,17 +3185,23 @@ msgstr "no s'ha pogut escriure a %s" msgid "Created new report at '%s'.\n" msgstr "S'ha creat un nou informe a «%s».\n" -msgid "git bundle create [<options>] <file> <git-rev-list args>" -msgstr "git bundle create [<opcions>] <fitxer> <git-rev-list args>" +msgid "" +"git bundle create [-q | --quiet | --progress | --all-progress] [--all-" +"progress-implied]\n" +" [--version=<version>] <file> <git-rev-list-args>" +msgstr "" +"git bundle create [-q | --quiet | --progress | --all-progress] [--all-" +"progress-implied]\n" +" [--version=<versió>] <fitxer> <git-rev-list-args>" -msgid "git bundle verify [<options>] <file>" -msgstr "git bundle verify [<opcions>] <fitxer>" +msgid "git bundle verify [-q | --quiet] <file>" +msgstr "git bundle verify [-q | --quiet] <fitxer>" msgid "git bundle list-heads <file> [<refname>...]" msgstr "git bundle list-heads <fitxer> [<refname>...]" -msgid "git bundle unbundle <file> [<refname>...]" -msgstr "git bundle unbundle <fitxer> [<refname>...]" +msgid "git bundle unbundle [--progress] <file> [<refname>...]" +msgstr "git bundle unbundle [--progress] <fitxer> [<refname>...]" msgid "do not show progress meter" msgstr "no mostris l'indicador de progrés" @@ -3291,24 +3264,24 @@ msgid "only one batch option may be specified" msgstr "només es pot especificar una opció per lots" msgid "git cat-file <type> <object>" -msgstr "git cat-file <type> <object>" +msgstr "git cat-file <tipus> <objecte>" msgid "git cat-file (-e | -p) <object>" -msgstr "git cat-file (-e | -p) <object>" +msgstr "git cat-file (-e | -p) <objecte>" msgid "git cat-file (-t | -s) [--allow-unknown-type] <object>" -msgstr "git cat-file (-t | -s) [--allow-unknown-type] <object>" +msgstr "git cat-file (-t | -s) [--allow-unknown-type] <objecte>" msgid "" "git cat-file (--batch | --batch-check | --batch-command) [--batch-all-" "objects]\n" " [--buffer] [--follow-symlinks] [--unordered]\n" -" [--textconv | --filters]" +" [--textconv | --filters] [-z]" msgstr "" "git cat-file (--batch | --batch-check | --batch-command) [--batch-all-" "objects]\n" " [--buffer] [--follow-symlinks] [--unordered]\n" -" [--textconv | --filters]" +" [--textconv | --filters] [-z]" msgid "" "git cat-file (--textconv | --filters)\n" @@ -3321,7 +3294,7 @@ msgid "Check object existence or emit object contents" msgstr "Comprova l'existència de l'objecte o emet el contingut de l'objecte" msgid "check if <object> exists" -msgstr "comprova si <object> existeix" +msgstr "comprova si <objecte> existeix" msgid "pretty-print <object> content" msgstr "impressió embellida del contingut de l'<objecte>" @@ -3390,7 +3363,7 @@ msgid "blob|tree" msgstr "blob|tree" msgid "use a <path> for (--textconv | --filters); Not with 'batch'" -msgstr "useu un <path> per a (--textconv | --filters); no amb «batch»" +msgstr "useu un <camÃ> per a (--textconv | --filters); no amb «batch»" #, c-format msgid "'%s=<%s>' needs '%s' or '%s'" @@ -3416,14 +3389,11 @@ msgstr "<rev> requerida amb «%s»" #, c-format msgid "<object> required with '-%c'" -msgstr "<object> requerit amb «-%c»" - -msgid "too many arguments" -msgstr "hi ha massa arguments" +msgstr "<objecte> requerit amb «-%c»" #, c-format msgid "only two arguments allowed in <type> <object> mode, not %d" -msgstr "només es permeten dos arguments en el mode <type> <object>, no %d" +msgstr "només es permeten dos arguments en el mode <tipus> <objecte>, no %d" msgid "git check-attr [-a | --all | <attr>...] [--] <pathname>..." msgstr "git check-attr [-a | --all | <atribut>...] [--] <nom-de-camÃ>..." @@ -3533,7 +3503,7 @@ msgid "git checkout [<options>] [<branch>] -- <file>..." msgstr "git checkout [<opcions>] [<branca>] -- <fitxer>..." msgid "git switch [<options>] [<branch>]" -msgstr "git switch [<options>] [<branch>]" +msgstr "git switch [<opcions>] [<branca>]" msgid "git restore [<options>] [--source=<branch>] <file>..." msgstr "git restore [<opcions>] [--source=<branca>] <fitxer>..." @@ -3955,9 +3925,11 @@ msgid "use overlay mode" msgstr "utilitza el mode de superposició" msgid "" -"git clean [-d] [-f] [-i] [-n] [-q] [-e <pattern>] [-x | -X] [--] <paths>..." +"git clean [-d] [-f] [-i] [-n] [-q] [-e <pattern>] [-x | -X] [--] " +"[<pathspec>...]" msgstr "" -"git clean [-d] [-f] [-i] [-n] [-q] [-e <patró>] [-x | -X] [--] <camins>..." +"git clean [-d] [-f] [-i] [-n] [-q] [-e <patró>] [-x | -X] [--] " +"[<pathspec>...]" #, c-format msgid "Removing %s\n" @@ -4250,6 +4222,10 @@ msgid "failed to start iterator over '%s'" msgstr "no s'ha pogut iniciar l'iterador sobre «%s»" #, c-format +msgid "symlink '%s' exists, refusing to clone with --local" +msgstr "l'enllaç simbòlic «%s» existeix, es nega a clonar amb --local" + +#, c-format msgid "failed to unlink '%s'" msgstr "s'ha produït un error en desenllaçar «%s»" @@ -4315,10 +4291,6 @@ msgstr "Hi ha massa arguments." msgid "You must specify a repository to clone." msgstr "Heu d'especificar un repositori per a clonar." -#, c-format -msgid "options '%s' and '%s %s' cannot be used together" -msgstr "les opcions «%s» i «%s %s» no es poden usar juntes" - msgid "" "--bundle-uri is incompatible with --depth, --shallow-since, and --shallow-" "exclude" @@ -4440,18 +4412,24 @@ msgid "--command must be the first argument" msgstr "--command ha de ser el primer argument" msgid "" -"git commit-graph verify [--object-dir <objdir>] [--shallow] [--[no-]progress]" +"git commit-graph verify [--object-dir <dir>] [--shallow] [--[no-]progress]" msgstr "" -"git commit-graph verify [--object-dir <objdir>] [--shallow] [--[no-]progress]" +"git commit-graph verify [--object-dir <dir>] [--shallow] [--[no-]progress]" msgid "" -"git commit-graph write [--object-dir <objdir>] [--append] [--" -"split[=<strategy>]] [--reachable|--stdin-packs|--stdin-commits] [--changed-" -"paths] [--[no-]max-new-filters <n>] [--[no-]progress] <split options>" +"git commit-graph write [--object-dir <dir>] [--append]\n" +" [--split[=<strategy>]] [--reachable | --stdin-packs | " +"--stdin-commits]\n" +" [--changed-paths] [--[no-]max-new-filters <n>] [--" +"[no-]progress]\n" +" <split options>" msgstr "" -"git commit-graph write [--object-dir <objdir>] [--append] [--" -"split[=<strategy>]] [--reachable|--stdin-packs|--stdin-commits] [--changed-" -"paths] [--[no-]max-new-filters <n>] [--[no-]progress] <split options>" +"git commit-graph write [--object-dir <dir>] [--append]\n" +" [--split[=<strategy>]] [--reachable | --stdin-packs | " +"--stdin-commits]\n" +" [--changed-paths] [--[no-]max-new-filters <n>] [--" +"[no-]progress]\n" +" <split options>" msgid "dir" msgstr "directori" @@ -4520,12 +4498,15 @@ msgstr "usa com a mà xim un --reachable, --stdin-commits, o --stdin-packs" msgid "Collecting commits from input" msgstr "S'estan recollint les comissions de l'entrada" +msgid "git commit-tree <tree> [(-p <parent>)...]" +msgstr "git commit-tree <tree> [(-p <pare>)...]" + msgid "" -"git commit-tree [(-p <parent>)...] [-S[<keyid>]] [(-m <message>)...] [(-F " -"<file>)...] <tree>" +"git commit-tree [(-p <parent>)...] [-S[<keyid>]] [(-m <message>)...]\n" +" [(-F <file>)...] <tree>" msgstr "" -"git commit-tree [(-p <parent>)...] [-S[<keyid>]] [(-m <message>)...] [(-F " -"<file>)...] <tree>" +"git commit-tree [(-p <pare>)...] [-S[<keyid>]] [(-m <missatge>)...]\n" +" [(-F <fitxer>)...] <tree>" #, c-format msgid "duplicate parent %s ignored" @@ -4567,11 +4548,29 @@ msgstr "ha de donar exactament un arbre" msgid "git commit-tree: failed to read" msgstr "git commit-tree: ha fallat en llegir" -msgid "git commit [<options>] [--] <pathspec>..." -msgstr "git commit [<opcions>] [--] <especificació-de-camÃ>..." +msgid "" +"git commit [-a | --interactive | --patch] [-s] [-v] [-u<mode>] [--amend]\n" +" [--dry-run] [(-c | -C | --squash) <commit> | --fixup [(amend|" +"reword):]<commit>)]\n" +" [-F <file> | -m <msg>] [--reset-author] [--allow-empty]\n" +" [--allow-empty-message] [--no-verify] [-e] [--author=<author>]\n" +" [--date=<date>] [--cleanup=<mode>] [--[no-]status]\n" +" [-i | -o] [--pathspec-from-file=<file> [--pathspec-file-nul]]\n" +" [(--trailer <token>[(=|:)<value>])...] [-S[<keyid>]]\n" +" [--] [<pathspec>...]" +msgstr "" +"git commit [-a | --interactive | --patch] [-s] [-v] [-u<mode>] [--amend]\n" +" [--dry-run] [(-c | -C | --squash) <comissió> | --fixup [(amend|" +"reword):]<comissió>)]\n" +" [-F <fitxer> | -m <msg>] [--reset-author] [--allow-empty]\n" +" [--allow-empty-message] [--no-verify] [-e] [--author=<author>]\n" +" [--date=<date>] [--cleanup=<mode>] [--[no-]status]\n" +" [-i | -o] [--pathspec-from-file=<fitxer> [--pathspec-file-nul]]\n" +" [(--trailer <token>[(=|:)<value>])...] [-S[<keyid>]]\n" +" [--] [<pathspec>...]" -msgid "git status [<options>] [--] <pathspec>..." -msgstr "git status [<opcions>] [--] <especificació-de-camÃ>..." +msgid "git status [<options>] [--] [<pathspec>...]" +msgstr "git status [<opcions>] [--] [<pathspec>...]" msgid "" "You asked to amend the most recent commit, but doing so would make\n" @@ -5352,11 +5351,18 @@ msgid "unable to get credential storage lock in %d ms" msgstr "" "no s'ha pogut obtenir el bloqueig de l'emmagatzematge de credencials en %d ms" -msgid "git describe [<options>] [<commit-ish>...]" -msgstr "git describe [<opcions>] [<comissió>...]" +msgid "" +"git describe [--all] [--tags] [--contains] [--abbrev=<n>] [<commit-ish>...]" +msgstr "" +"git describe [--all] [--tags] [--contains] [--abbrev=<n>] [<commit-ish>...]" -msgid "git describe [<options>] --dirty" -msgstr "git describe [<opcions>] --dirty" +msgid "" +"git describe [--all] [--tags] [--contains] [--abbrev=<n>] --dirty[=<mark>]" +msgstr "" +"git describe [--all] [--tags] [--contains] [--abbrev=<n>] --dirty[=<mark>]" + +msgid "git describe <blob>" +msgstr "git describe <blob>" msgid "head" msgstr "davant per" @@ -5479,11 +5485,11 @@ msgid "option '%s' and commit-ishes cannot be used together" msgstr "les opcions «%s» i de comissió no es poden usar juntes" msgid "" -"git diagnose [-o|--output-directory <path>] [-s|--suffix <format>] [--" -"mode=<mode>]" +"git diagnose [(-o | --output-directory) <path>] [(-s | --suffix) <format>]\n" +" [--mode=<mode>]" msgstr "" -"git diagnose [-o|--output-directory <path>] [-s|--suffix <format>] [--" -"mode=<mode>]" +"git diagnose [(-o | --output-directory) <camÃ>] [(-s | --suffix) <format>]\n" +" [--mode=<mode>]" msgid "specify a destination for the diagnostics archive" msgstr "especifiqueu una destinació per a l'arxiu de diagnòstic" @@ -5501,6 +5507,9 @@ msgstr "--merge-base només funciona amb dues comissions" msgid "'%s': not a regular file or symlink" msgstr "«%s»: no és ni fitxer regular ni enllaç simbòlic" +msgid "no merge given, only parents." +msgstr "no s'ha donat cap fusió, només els pares." + #, c-format msgid "invalid option: %s" msgstr "opció no và lida: %s" @@ -5529,7 +5538,7 @@ msgid "%s...%s: multiple merge bases, using %s" msgstr "%s...%s: múltiples bases de fusió, utilitzant %s" msgid "git difftool [<options>] [<commit> [<commit>]] [--] [<path>...]" -msgstr "git difftool [<opcions>] [<commit> [<commit>]] [--] [<camÃ>...]" +msgstr "git difftool [<opcions>] [<comissió> [<comissió>]] [--] [<camÃ>...]" #, c-format msgid "could not read symlink %s" @@ -6108,7 +6117,7 @@ msgid "git for-each-ref [--points-at <object>]" msgstr "git for-each-ref [--points-at <objecte>]" msgid "git for-each-ref [--merged [<commit>]] [--no-merged [<commit>]]" -msgstr "git for-each-ref [--merged [<commit>]] [--no-merged [<commit>]]" +msgstr "git for-each-ref [--merged [<comissió>]] [--no-merged [<comissió>]]" msgid "git for-each-ref [--contains [<commit>]] [--no-contains [<commit>]]" msgstr "" @@ -6149,8 +6158,8 @@ msgstr "imprimeix només les referències que continguin la comissió" msgid "print only refs which don't contain the commit" msgstr "imprimeix només les referències que no continguin la comissió" -msgid "git for-each-repo --config=<config> <command-args>" -msgstr "git for-each-repo --config=<config> <command-args>" +msgid "git for-each-repo --config=<config> [--] <arguments>" +msgstr "git for-each-repo --config=<config> [--] <arguments>" msgid "config" msgstr "config" @@ -6321,8 +6330,16 @@ msgstr "un no arbre en l'arbre de la memòria cau" msgid "%s: invalid sha1 pointer in resolve-undo" msgstr "%s: el punter sha1 no és và lid a «resolve-undo»" -msgid "git fsck [<options>] [<object>...]" -msgstr "git fsck [<opcions>] [<objecte>...]" +msgid "" +"git fsck [--tags] [--root] [--unreachable] [--cache] [--no-reflogs]\n" +" [--[no-]full] [--strict] [--verbose] [--lost-found]\n" +" [--[no-]dangling] [--[no-]progress] [--connectivity-only]\n" +" [--[no-]name-objects] [<object>...]" +msgstr "" +"git fsck [--tags] [--root] [--unreachable] [--cache] [--no-reflogs]\n" +" [--[no-]full] [--strict] [--verbose] [--lost-found]\n" +" [--[no-]dangling] [--[no-]progress] [--connectivity-only]\n" +" [--[no-]name-objects] [<objecte>...]" msgid "show unreachable objects" msgstr "mostra els objectes inabastables" @@ -6372,16 +6389,10 @@ msgid "invalid parameter: expected sha1, got '%s'" msgstr "parà metre no và lid: s'esperava sha1, s'ha obtingut «%s»" msgid "git fsmonitor--daemon start [<options>]" -msgstr "git fsmonitor--daemon start [<options>]" +msgstr "git fsmonitor--daemon start [<opcions>]" msgid "git fsmonitor--daemon run [<options>]" -msgstr "git fsmonitor--daemon run [<options>]" - -msgid "git fsmonitor--daemon stop" -msgstr "git fsmonitor--daemon stop" - -msgid "git fsmonitor--daemon status" -msgstr "git fsmonitor--daemon status" +msgstr "git fsmonitor--daemon run [<opcions>]" #, c-format msgid "value of '%s' out of range: %d" @@ -6576,7 +6587,7 @@ msgid "failed to finish 'git pack-objects' process" msgstr "no s'ha pogut finalitzar el procés «git pack-objects»" msgid "failed to write multi-pack-index" -msgstr "no s'han pogut escriu l'Ãndex del multipaquet" +msgstr "no s'ha pogut escriure l'Ãndex del multipaquet" msgid "'git multi-pack-index expire' failed" msgstr "ha fallat el venciment de «git multi-pack-index expire»" @@ -6627,8 +6638,20 @@ msgstr "executa una tasca especÃfica" msgid "use at most one of --auto and --schedule=<frequency>" msgstr "usa com a mà xim un entre --auto i --schedule=<frequency>" -msgid "failed to run 'git config'" -msgstr "no s'ha pogut executar «git config»" +#, c-format +msgid "unable to add '%s' value of '%s'" +msgstr "no es pot afegir el valor «%s» de «%s»" + +msgid "return success even if repository was not registered" +msgstr "retorna èxit encara que el repositori no estigui registrat" + +#, c-format +msgid "unable to unset '%s' value of '%s'" +msgstr "no es pot desassignar el valor «%s» de «%s»" + +#, c-format +msgid "repository '%s' is not registered" +msgstr "el repositori «%s» no està registrat" #, c-format msgid "failed to expand path '%s'" @@ -6710,7 +6733,7 @@ msgid "failed to add repo to global config" msgstr "no s'ha pogut afegir un repositori a la configuració global" msgid "git maintenance <subcommand> [<options>]" -msgstr "git maintenance <subcommand> [<options>]" +msgstr "git maintenance <subcommand> [<opcions>]" msgid "git grep [<options>] [-e] <pattern> [<rev>...] [[--] <path>...]" msgstr "git grep [<opcions>] [-e] <patró> [<revisió>...] [[--] <camÃ>...]" @@ -6922,11 +6945,14 @@ msgid "both --cached and trees are given" msgstr "ambdós --cached i arbres venen donats" msgid "" -"git hash-object [-t <type>] [-w] [--path=<file> | --no-filters] [--stdin] " -"[--] <file>..." +"git hash-object [-t <type>] [-w] [--path=<file> | --no-filters]\n" +" [--stdin [--literally]] [--] <file>..." msgstr "" -"git hash-object [-t <tipus>] [-w] [--path=<fitxer> | --no-filters] [--stdin] " -"[--] <fitxer>..." +"git hash-object [-t <tipus>] [-w] [--path=<fitxer> | --no-filters]\n" +" [--stdin [--literally]] [--] <fitxer>..." + +msgid "git hash-object [-t <type>] [-w] --stdin-paths [--no-filters]" +msgstr "git hash-object [-t <tipus>] [-w] --stdin-paths [--no-filters]" msgid "object type" msgstr "tipus d'objecte" @@ -7357,11 +7383,15 @@ msgid "Initialized empty Git repository in %s%s\n" msgstr "S'ha inicialitzat un repositori buit del Git en %s%s\n" msgid "" -"git init [-q | --quiet] [--bare] [--template=<template-directory>] [--" -"shared[=<permissions>]] [<directory>]" +"git init [-q | --quiet] [--bare] [--template=<template-directory>]\n" +" [--separate-git-dir <git-dir>] [--object-format=<format>]\n" +" [-b <branch-name> | --initial-branch=<branch-name>]\n" +" [--shared[=<permissions>]] [<directory>]" msgstr "" -"git init [-q | --quiet] [--bare] [--template=<directori-de-plantilla>] [--" -"shared[=<permisos>]] [<directori>]" +"git init [-q | --quiet] [--bare] [--template=<template-directory>]\n" +" [--separate-git-dir <git-dir>] [--object-format=<format>]\n" +" [-b <branch-name> | --initial-branch=<branch-name>]\n" +" [--shared[=<permissions>]] [<directory>]" msgid "permissions" msgstr "permisos" @@ -7403,11 +7433,13 @@ msgid "--separate-git-dir incompatible with bare repository" msgstr "--separate-git-dir és incompatible amb un repositori nu" msgid "" -"git interpret-trailers [--in-place] [--trim-empty] [(--trailer " -"<token>[(=|:)<value>])...] [<file>...]" +"git interpret-trailers [--in-place] [--trim-empty]\n" +" [(--trailer <token>[(=|:)<value>])...]\n" +" [--parse] [<file>...]" msgstr "" -"git interpret-trailers [--in-place] [--trim-empty] [(--trailer " -"<testimoni>[(=|:)<valor>])...] [<fitxer>...]" +"git interpret-trailers [--in-place] [--trim-empty]\n" +" [(--trailer <token>[(=|:)<value>])...]\n" +" [--parse] [<fitxer>...]" msgid "edit files in place" msgstr "edita els fitxers in situ" @@ -7481,14 +7513,14 @@ msgid "" "<file>" msgstr "" "traça l'evolució del rang de lÃnia <start>,<end> o funcions :<funcname> a " -"<file>" +"<fitxer>" #, c-format msgid "unrecognized argument: %s" msgstr "argument no reconegut: %s" msgid "-L<range>:<file> cannot be used with pathspec" -msgstr "-L<range>:<file> no es pot usar amb una especificació de camÃ" +msgstr "-L<range>:<fitxer> no es pot usar amb una especificació de camÃ" #, c-format msgid "Final output: %d %s\n" @@ -7857,7 +7889,7 @@ msgid "skip files matching pattern" msgstr "omet els fitxers coincidents amb el patró" msgid "read exclude patterns from <file>" -msgstr "llegeix els patrons des de <file>" +msgstr "llegeix els patrons des de <fitxer>" msgid "read additional per-directory exclude patterns in <file>" msgstr "llegeix els patrons addicionals d'exclusió per directori en <fitxer>" @@ -7896,11 +7928,11 @@ msgstr "" msgid "" "git ls-remote [--heads] [--tags] [--refs] [--upload-pack=<exec>]\n" -" [-q | --quiet] [--exit-code] [--get-url]\n" +" [-q | --quiet] [--exit-code] [--get-url] [--sort=<key>]\n" " [--symref] [<repository> [<refs>...]]" msgstr "" "git ls-remote [--heads] [--tags] [--refs] [--upload-pack=<exec>]\n" -" [-q | --quiet] [--exit-code] [--get-url]\n" +" [-q | --quiet] [--exit-code] [--get-url] [--sort=<key>]\n" " [--symref] [<repository> [<refs>...]]" msgid "do not print remote URL" @@ -7982,7 +8014,7 @@ msgstr "--format no es pot combinar amb altres opcions d'alteració de format" #. TRANSLATORS: keep <> in "<" mail ">" info. msgid "git mailinfo [<options>] <msg> <patch> < mail >info" -msgstr "git mailinfo [<options>] <msg> <patch> < mail >info" +msgstr "git mailinfo [<opcions>] <msg> <pedaç> < mail >info" msgid "keep subject" msgstr "mantén l'assumpte" @@ -8030,12 +8062,12 @@ msgstr "git merge-base [-a | --all] <comissió> <comissió>..." msgid "git merge-base [-a | --all] --octopus <commit>..." msgstr "git merge-base [-a | --all] --octopus <comissió>..." -msgid "git merge-base --independent <commit>..." -msgstr "git merge-base --independent <comissió>..." - msgid "git merge-base --is-ancestor <commit> <commit>" msgstr "git merge-base --is-ancestor <comissió> <comissió>" +msgid "git merge-base --independent <commit>..." +msgstr "git merge-base --independent <comissió>..." + msgid "git merge-base --fork-point <ref> [<commit>]" msgstr "git merge-base --fork-point <referència> [<comissió>]" @@ -8124,7 +8156,7 @@ msgid "failure to merge" msgstr "s'ha produït un error en fusionar" msgid "git merge-tree [--write-tree] [<options>] <branch1> <branch2>" -msgstr "git merge-tree [--write-tree] [<options>] <branch1> <branch2>" +msgstr "git merge-tree [--write-tree] [<opcions>] <branch1> <branch2>" msgid "git merge-tree [--trivial-merge] <base-tree> <branch1> <branch2>" msgstr "git merge-tree [--trivial-merge] <base-tree> <branch1> <branch2>" @@ -8144,9 +8176,20 @@ msgstr "llista els noms de fitxer sense modes/oids/stages" msgid "allow merging unrelated histories" msgstr "permet fusionar històries no relacionades" +msgid "perform multiple merges, one per line of input" +msgstr "realitza múltiples fusions, una per lÃnia d'entrada" + msgid "--trivial-merge is incompatible with all other options" msgstr "--trivial-merge és incompatible amb totes les altres opcions" +#, c-format +msgid "malformed input line: '%s'." +msgstr "lÃnia d'entrada mal formada: «%s»." + +#, c-format +msgid "merging cannot continue; got unclean result of %d" +msgstr "la fusió no pot continuar; s'ha obtingut un resultat no net de %d" + msgid "git merge [<options>] [<commit>...]" msgstr "git merge [<opcions>] [<comissió>...]" @@ -8492,8 +8535,8 @@ msgid "" "git multi-pack-index [<options>] write [--preferred-pack=<pack>][--refs-" "snapshot=<path>]" msgstr "" -"git multi-pack-index [<options>] write [--preferred-pack=<pack>][--refs-" -"snapshot=<path>]" +"git multi-pack-index [<opcions>] write [--preferred-pack=<pack>][--refs-" +"snapshot=<camÃ>]" msgid "git multi-pack-index [<options>] verify" msgstr "git multi-pack-index [<opcions>] verify" @@ -8622,7 +8665,7 @@ msgid "git name-rev [<options>] --all" msgstr "git name-rev [<opcions>] --all" msgid "git name-rev [<options>] --annotate-stdin" -msgstr "git name-rev [<options>] --annotate-stdin" +msgstr "git name-rev [<opcions>] --annotate-stdin" msgid "print only ref-based names (no object names)" msgstr "imprimeix només els noms basats en referències (no els noms d'objecte)" @@ -8772,10 +8815,6 @@ msgid "cannot read note data from non-blob object '%s'." msgstr "no es poden llegir les dades de node de l'objecte no de blob «%s»." #, c-format -msgid "malformed input line: '%s'." -msgstr "lÃnia d'entrada mal formada: «%s»." - -#, c-format msgid "failed to copy notes from '%s' to '%s'" msgstr "s'ha produït un error en copiar les notes de «%s» a «%s»" @@ -8968,17 +9007,13 @@ msgstr "usa les notes de <referència-de-notes>" msgid "unknown subcommand: `%s'" msgstr "subordre desconeguda: «%s»" -msgid "" -"git pack-objects --stdout [<options>...] [< <ref-list> | < <object-list>]" -msgstr "" -"git pack-objects --stdout [<opcions>...] [< <llista-de-referències> | < " -"<llista-de-objectes>]" +msgid "git pack-objects --stdout [<options>] [< <ref-list> | < <object-list>]" +msgstr "git pack-objects --stdout [<opcions>] [< <ref-list> | < <object-list>]" msgid "" -"git pack-objects [<options>...] <base-name> [< <ref-list> | < <object-list>]" +"git pack-objects [<options>] <base-name> [< <ref-list> | < <object-list>]" msgstr "" -"git pack-objects [<opcions>...] <nom-base> [< <llista-de-referències> | < " -"<llista-de-objectes>]" +"git pack-objects [<opcions>] <base-name> [< <ref-list> | < <object-list>]" #, c-format msgid "" @@ -9369,8 +9404,8 @@ msgstr "" "i feu-nos saber que encara l'useu enviant un correu electrònic\n" "a <git@vger.kernel.org>. Grà cies.\n" -msgid "git pack-refs [<options>]" -msgstr "git pack-refs [<opcions>]" +msgid "git pack-refs [--all] [--no-prune]" +msgstr "git pack-refs [--all] [--no-prune]" msgid "pack everything" msgstr "empaqueta-ho tot" @@ -9378,6 +9413,18 @@ msgstr "empaqueta-ho tot" msgid "prune loose refs (default)" msgstr "poda les referències soltes (per defecte)" +msgid "git patch-id [--stable | --unstable | --verbatim]" +msgstr "git patch-id [--stable | --unstable | --verbatim]" + +msgid "use the unstable patch-id algorithm" +msgstr "utilitza l'algorisme inestable de patch-id" + +msgid "use the stable patch-id algorithm" +msgstr "utilitza l'algorisme estable de patch-id" + +msgid "don't strip whitespace from the patch" +msgstr "no eliminis els espais en blanc del pedaç" + msgid "git prune [-n] [-v] [--progress] [--expire <time>] [--] [<head>...]" msgstr "git prune [-n] [-v] [--progress] [--expire <data>] [--] [<head>...]" @@ -9597,16 +9644,14 @@ msgstr "" msgid "" "\n" -"To avoid automatically configuring upstream branches when their name\n" -"doesn't match the local branch, see option 'simple' of branch." -"autoSetupMerge\n" +"To avoid automatically configuring an upstream branch when its name\n" +"won't match the local branch, see option 'simple' of branch.autoSetupMerge\n" "in 'git help config'.\n" msgstr "" "\n" "Per a evitar configurar automà ticament les branques font quan el seu nom\n" -"no coincideix amb el de la branca local, vegeu l'opció «simple» de «branch." -"autoSetupMerge»\n" -"a «git help config».\n" +"no coincideix amb el de la branca local, vegeu l'opció «simple» de\n" +"«branch.autoSetupMerge» a «git help config».\n" #, c-format msgid "" @@ -9764,6 +9809,13 @@ msgstr "S'està pujant a %s\n" msgid "failed to push some refs to '%s'" msgstr "s'ha produït un error en pujar algunes referències a «%s»" +msgid "" +"recursing into submodule with push.recurseSubmodules=only; using on-demand " +"instead" +msgstr "" +"cerca recursivament en el submòdul amb push.recurseSubmodules=only; " +"utilitzant «on-demand» en el seu lloc" + #, c-format msgid "invalid value for '%s'" msgstr "valor no và lid per a «%s»" @@ -9899,13 +9951,15 @@ msgid "need two commit ranges" msgstr "calen dos rangs de comissió" msgid "" -"git read-tree [(-m [--trivial] [--aggressive] | --reset | --prefix=<prefix>) " -"[-u | -i]] [--no-sparse-checkout] [--index-output=<file>] (--empty | <tree-" -"ish1> [<tree-ish2> [<tree-ish3>]])" +"git read-tree [(-m [--trivial] [--aggressive] | --reset | --" +"prefix=<prefix>)\n" +" [-u | -i]] [--index-output=<file>] [--no-sparse-checkout]\n" +" (--empty | <tree-ish1> [<tree-ish2> [<tree-ish3>]])" msgstr "" -"git read-tree [(-m [--trivial] [--aggressive] | --reset | --prefix=<prefix>) " -"[-u | -i]] [--no-sparse-checkout] [--index-output=<file>] (--empty | <tree-" -"ish1> [<tree-ish2> [<tree-ish3>]])" +"git read-tree [(-m [--trivial] [--aggressive] | --reset | --" +"prefix=<prefix>)\n" +" [-u | -i]] [--index-output=<fitxer>] [--no-sparse-checkout]\n" +" (--empty | <tree-ish1> [<tree-ish2> [<tree-ish3>]])" msgid "write resulting index to <file>" msgstr "escriu l'Ãndex resultant al <fitxer>" @@ -9965,13 +10019,14 @@ msgid "" "git rebase [-i] [options] [--exec <cmd>] [--onto <newbase> | --keep-base] " "[<upstream> [<branch>]]" msgstr "" -"git rebase [-i] [options] [--exec <cmd>] [--onto <newbase> | --keep-base] " -"[<upstream> [<branch>]]" +"git rebase [-i] [options] [--exec <ordre>] [--onto <newbase> | --keep-base] " +"[<upstream> [<branca>]]" msgid "" "git rebase [-i] [options] [--exec <cmd>] [--onto <newbase>] --root [<branch>]" msgstr "" -"git rebase [-i] [options] [--exec <cmd>] [--onto <newbase>] --root [<branch>]" +"git rebase [-i] [options] [--exec <ordre>] [--onto <newbase>] --root " +"[<branca>]" #, c-format msgid "could not read '%s'." @@ -9995,8 +10050,8 @@ msgid "%s requires the merge backend" msgstr "%s requereix un rerefons de fusió" #, c-format -msgid "could not get 'onto': '%s'" -msgstr "no s'ha pogut obtenir «onto»: «%s»" +msgid "invalid onto: '%s'" +msgstr "no và lid a: «%s»" #, c-format msgid "invalid orig-head: '%s'" @@ -10300,8 +10355,8 @@ msgstr "no existeix aquesta branca o comissió «%s»" msgid "No such ref: %s" msgstr "No hi ha tal referència: %s" -msgid "Could not resolve HEAD to a revision" -msgstr "No s'ha pogut resoldre HEAD a una revisió" +msgid "Could not resolve HEAD to a commit" +msgstr "No s'ha pogut resoldre HEAD com a una comissió" #, c-format msgid "'%s': need exactly one merge base with branch" @@ -10498,7 +10553,7 @@ msgid "" "git remote add [-t <branch>] [-m <master>] [-f] [--tags | --no-tags] [--" "mirror=<fetch|push>] <name> <url>" msgstr "" -"git remote add [-t <branca>] [-m <mestra>] [-f] [--tags | --no-tags] [--" +"git remote add [-t <branca>] [-m <master>] [-f] [--tags | --no-tags] [--" "mirror=<fetch|push>] <nom> <url>" msgid "git remote rename [--[no-]progress] <old> <new>" @@ -10973,6 +11028,10 @@ msgid "could not close refs snapshot tempfile" msgstr "" "no s'ha pogut tancar el fitxer temporal amb la instantà nia de referències" +#, c-format +msgid "could not remove stale bitmap: %s" +msgstr "no s'ha pogut eliminar el mapa de bits estancat: %s" + msgid "pack everything in a single pack" msgstr "empaqueta-ho tot en un únic paquet" @@ -11049,6 +11108,10 @@ msgstr "troba una progressió geomètrica amb el factor <N>" msgid "write a multi-pack index of the resulting packs" msgstr "escriu un Ãndex multipaquet dels paquets resultants" +msgid "pack prefix to store a pack containing pruned objects" +msgstr "" +"prefix del paquet per a emmagatzemar un paquet que contingui objectes podats" + msgid "cannot delete packs in a precious-objects repo" msgstr "no es poden suprimir paquets en un repositori d'objectes preciosos" @@ -11060,8 +11123,13 @@ msgid "pack prefix %s does not begin with objdir %s" msgstr "el prefix de paquet %s no comença amb objdir %s" #, c-format -msgid "missing required file: %s" -msgstr "falta el fitxer requerit: %s" +msgid "renaming pack to '%s' failed" +msgstr "el canvi del nom a «%s» ha fallat" + +#, c-format +msgid "pack-objects did not write a '%s' file for pack %s-%s" +msgstr "" +"els objectes de paquet no han escrit a un fitxer «%s» per al paquet %s-%s" #, c-format msgid "could not unlink: %s" @@ -11074,7 +11142,7 @@ msgid "git replace [-f] --edit <object>" msgstr "git replace [-f] --edit <objecte>" msgid "git replace [-f] --graft <commit> [<parent>...]" -msgstr "git replace [-f] --graft <comissió> [<parent>...]" +msgstr "git replace [-f] --graft <comissió> [<pare>...]" msgid "git replace -d <object>..." msgstr "git replace -d <objecte>..." @@ -11255,8 +11323,10 @@ msgstr "--convert-graft-file arguments" msgid "only one pattern can be given with -l" msgstr "només es pot especificar un patró amb -l" -msgid "git rerere [clear | forget <path>... | status | remaining | diff | gc]" -msgstr "git rerere [clear | forget <camÃ>... | status | remaining | diff | gc]" +msgid "" +"git rerere [clear | forget <pathspec>... | diff | status | remaining | gc]" +msgstr "" +"git rerere [clear | forget <pathspec>... | diff | status | remaining | gc]" msgid "register clean resolutions in index" msgstr "registra les resolucions netes en l'Ãndex" @@ -11424,9 +11494,9 @@ msgid "" "\n" "Run \"git rev-parse --parseopt -h\" for more information on the first usage." msgstr "" -"git rev-parse --parseopt [<options>] -- [<args>...]\n" +"git rev-parse --parseopt [<opcions>] -- [<args>...]\n" " o bé: git rev-parse --sq-quote [<arg>...]\n" -" o bé: git rev-parse [<options>] [<arg>...]\n" +" o bé: git rev-parse [<opcions>] [<arg>...]\n" "\n" "Executeu «git rev-parse --parseopt -h» per a més informació sobre el primer " "ús." @@ -11461,6 +11531,15 @@ msgstr "--prefix requereix un argument" msgid "unknown mode for --abbrev-ref: %s" msgstr "mode desconegut per a --abbrev-ref: %s" +msgid "--exclude-hidden cannot be used together with --branches" +msgstr "--exclude-hidden no es pot utilitzar juntament amb --branches" + +msgid "--exclude-hidden cannot be used together with --tags" +msgstr "--exclude-hidden no es pot utilitzar juntament amb --tags" + +msgid "--exclude-hidden cannot be used together with --remotes" +msgstr "--exclude-hidden no es pot utilitzar juntament amb --remotes" + msgid "this operation must be run in a work tree" msgstr "aquesta operació s'ha d'executar en un arbre de treball" @@ -11468,17 +11547,25 @@ msgstr "aquesta operació s'ha d'executar en un arbre de treball" msgid "unknown mode for --show-object-format: %s" msgstr "mode desconegut per a --show-object-format: %s" -msgid "git revert [<options>] <commit-ish>..." -msgstr "git revert [<opcions>] <comissió>..." +msgid "" +"git revert [--[no-]edit] [-n] [-m <parent-number>] [-s] [-S[<keyid>]] " +"<commit>..." +msgstr "" +"git revert [--[no-]edit] [-n] [-m <parent-number>] [-s] [-S[<keyid>]] " +"<comissió>..." -msgid "git revert <subcommand>" -msgstr "git revert <subordre>" +msgid "git revert (--continue | --skip | --abort | --quit)" +msgstr "git revert (--continue | --skip | --abort | --quit)" -msgid "git cherry-pick [<options>] <commit-ish>..." -msgstr "git cherry-pick [<opcions>] <comissió>..." +msgid "" +"git cherry-pick [--edit] [-n] [-m <parent-number>] [-s] [-x] [--ff]\n" +" [-S[<keyid>]] <commit>..." +msgstr "" +"git cherry-pick [--edit] [-n] [-m <parent-number>] [-s] [-x] [--ff]\n" +" [-S[<keyid>]] <comissió>..." -msgid "git cherry-pick <subcommand>" -msgstr "git cherry-pick <subordre>" +msgid "git cherry-pick (--continue | --skip | --abort | --quit)" +msgstr "git cherry-pick (--continue | --skip | --abort | --quit)" #, c-format msgid "option `%s' expects a number greater than zero" @@ -11539,8 +11626,14 @@ msgstr "la reversió ha fallat" msgid "cherry-pick failed" msgstr "el «cherry pick» ha fallat" -msgid "git rm [<options>] [--] <file>..." -msgstr "git rm [<opcions>] [--] <fitxer>..." +msgid "" +"git rm [-f | --force] [-n] [-r] [--cached] [--ignore-unmatch]\n" +" [--quiet] [--pathspec-from-file=<file> [--pathspec-file-nul]]\n" +" [--] [<pathspec>...]" +msgstr "" +"git rm [-f | --force] [-n] [-r] [--cached] [--ignore-unmatch]\n" +" [--quiet] [--pathspec-from-file=<fitxer> [--pathspec-file-nul]]\n" +" [--] [<pathspec>...]" msgid "" "the following file has staged content different from both the\n" @@ -11614,11 +11707,13 @@ msgid "" "git send-pack [--mirror] [--dry-run] [--force]\n" " [--receive-pack=<git-receive-pack>]\n" " [--verbose] [--thin] [--atomic]\n" +" [--[no-]signed | --signed=(true|false|if-asked)]\n" " [<host>:]<directory> (--all | <ref>...)" msgstr "" "git send-pack [--mirror] [--dry-run] [--force]\n" " [--receive-pack=<git-receive-pack>]\n" " [--verbose] [--thin] [--atomic]\n" +" [--[no-]signed | --signed=(true|false|if-asked)]\n" " [<host>:]<directory> (--all | <ref>...)" msgid "remote name" @@ -11642,8 +11737,9 @@ msgstr "git log --pretty=short | git shortlog [<opcions>]" msgid "using multiple --group options with stdin is not supported" msgstr "no s'admet l'ús de múltiples opcions --group amb stdin" -msgid "using --group=trailer with stdin is not supported" -msgstr "no s'admet l'ús de --group=trailer amb stdin" +#, c-format +msgid "using %s with stdin is not supported" +msgstr "no s'admet l'ús de %s amb stdin" #, c-format msgid "unknown group type: %s" @@ -11682,12 +11778,14 @@ msgid "" "git show-branch [-a | --all] [-r | --remotes] [--topo-order | --date-order]\n" " [--current] [--color[=<when>] | --no-color] [--sparse]\n" " [--more=<n> | --list | --independent | --merge-base]\n" -" [--no-name | --sha1-name] [--topics] [(<rev> | <glob>)...]" +" [--no-name | --sha1-name] [--topics]\n" +" [(<rev> | <glob>)...]" msgstr "" "git show-branch [-a | --all] [-r | --remotes] [--topo-order | --date-order]\n" " [--current] [--color[=<when>] | --no-color] [--sparse]\n" " [--more=<n> | --list | --independent | --merge-base]\n" -" [--no-name | --sha1-name] [--topics] [(<rev> | <glob>)...]" +" [--no-name | --sha1-name] [--topics]\n" +" [(<rev> | <glob>)...]" msgid "git show-branch (-g | --reflog)[=<n>[,<base>]] [--list] [<ref>]" msgstr "git show-branch (-g | --reflog)[=<n>[,<base>]] [--list] [<referència>]" @@ -11787,11 +11885,13 @@ msgid "Unknown hash algorithm" msgstr "Algorisme de resum desconegut" msgid "" -"git show-ref [-q | --quiet] [--verify] [--head] [-d | --dereference] [-s | --" -"hash[=<n>]] [--abbrev[=<n>]] [--tags] [--heads] [--] [<pattern>...]" +"git show-ref [-q | --quiet] [--verify] [--head] [-d | --dereference]\n" +" [-s | --hash[=<n>]] [--abbrev[=<n>]] [--tags]\n" +" [--heads] [--] [<pattern>...]" msgstr "" -"git show-ref [-q | --quiet] [--verify] [--head] [-d | --dereference] [-s | --" -"hash[=<n>]] [--abbrev[=<n>]] [--tags] [--heads] [--] [<patró>...]" +"git show-ref [-q | --quiet] [--verify] [--head] [-d | --dereference]\n" +" [-s | --hash[=<n>]] [--abbrev[=<n>]] [--tags]\n" +" [--heads] [--] [<patró>...]" msgid "git show-ref --exclude-existing[=<pattern>]" msgstr "git show-ref --exclude-existing[=<patró>]" @@ -11822,8 +11922,10 @@ msgstr "no imprimeixis els resultats a stdout (útil amb --verify)" msgid "show refs from stdin that aren't in local repository" msgstr "mostra les referències de stdin que no siguin en el repositori local" -msgid "git sparse-checkout (init|list|set|add|reapply|disable) <options>" -msgstr "git sparse-checkout (init|list|set|add|reapply|disable) <opcions>" +msgid "" +"git sparse-checkout (init | list | set | add | reapply | disable) [<options>]" +msgstr "" +"git sparse-checkout (init | list | set | add | reapply | disable) [<opcions>]" msgid "this worktree is not sparse" msgstr "aquest arbre de treball no és dispers" @@ -11947,67 +12049,58 @@ msgstr "" msgid "error while refreshing working directory" msgstr "s'ha produït un error en actualitzar el directori de treball" -msgid "git stash list [<options>]" -msgstr "git stash list [<opcions>]" +msgid "git stash list [<log-options>]" +msgstr "git stash list [<log-options>]" -msgid "git stash show [<options>] [<stash>]" -msgstr "git stash show [<opcions>] [<stash>]" +msgid "" +"git stash show [-u | --include-untracked | --only-untracked] [<diff-" +"options>] [<stash>]" +msgstr "" +"git stash show [-u | --include-untracked | --only-untracked] [<diff-" +"options>] [<stash>]" -msgid "git stash drop [-q|--quiet] [<stash>]" -msgstr "git stash drop [-q|--quiet] [<stash>]" +msgid "git stash drop [-q | --quiet] [<stash>]" +msgstr "git stash drop [-q | --quiet] [<stash>]" -msgid "git stash ( pop | apply ) [--index] [-q|--quiet] [<stash>]" -msgstr "git stash ( pop | apply ) [--index] [-q|--quiet] [<stash>]" +msgid "git stash pop [--index] [-q | --quiet] [<stash>]" +msgstr "git stash pop [--index] [-q | --quiet] [<stash>]" + +msgid "git stash apply [--index] [-q | --quiet] [<stash>]" +msgstr "git stash apply [--index] [-q | --quiet] [<stash>]" msgid "git stash branch <branchname> [<stash>]" msgstr "git stash branch <nom-de-branca> [<stash>]" +msgid "git stash store [(-m | --message) <message>] [-q | --quiet] <commit>" +msgstr "" +"git stash store [(-m | --message) <missatge>] [-q | --quiet] <comissió>" + msgid "" -"git stash [push [-p|--patch] [-S|--staged] [-k|--[no-]keep-index] [-q|--" -"quiet]\n" -" [-u|--include-untracked] [-a|--all] [-m|--message <message>]\n" +"git stash [push [-p | --patch] [-S | --staged] [-k | --[no-]keep-index] [-q " +"| --quiet]\n" +" [-u | --include-untracked] [-a | --all] [(-m | --message) " +"<message>]\n" " [--pathspec-from-file=<file> [--pathspec-file-nul]]\n" " [--] [<pathspec>...]]" msgstr "" -"git stash [push [-p|--patch] [-S|--staged] [-k|--[no-]keep-index] [-q|--" -"quiet]\n" -" [-u|--include-untracked] [-a|--all] [-m|--message <missatge>]\n" +"git stash [push [-p | --patch] [-S | --staged] [-k | --[no-]keep-index] [-q " +"| --quiet]\n" +" [-u | --include-untracked] [-a | --all] [(-m | --message) " +"<missatge>]\n" " [--pathspec-from-file=<fitxer> [--pathspec-file-nul]]\n" " [--] [<pathspec>...]]" msgid "" -"git stash save [-p|--patch] [-S|--staged] [-k|--[no-]keep-index] [-q|--" -"quiet]\n" -" [-u|--include-untracked] [-a|--all] [<message>]" -msgstr "" -"git stash save [-p|--patch] [-S|--staged] [-k|--[no-]keep-index] [-q|--" -"quiet]\n" -" [-u|--include-untracked] [-a|--all] [<missatge>]" - -msgid "git stash pop [--index] [-q|--quiet] [<stash>]" -msgstr "git stash pop [--index] [-q|--quiet] [<stash>]" - -msgid "git stash apply [--index] [-q|--quiet] [<stash>]" -msgstr "git stash apply [--index] [-q|--quiet] [<stash>]" - -msgid "git stash store [-m|--message <message>] [-q|--quiet] <commit>" -msgstr "git stash store [-m|--message <missatge>] [-q|--quiet] <commit>" - -msgid "" -"git stash [push [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]\n" -" [-u|--include-untracked] [-a|--all] [-m|--message <message>]\n" -" [--] [<pathspec>...]]" +"git stash save [-p | --patch] [-S | --staged] [-k | --[no-]keep-index] [-q | " +"--quiet]\n" +" [-u | --include-untracked] [-a | --all] [<message>]" msgstr "" -"git stash [push [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]\n" -" [-u|--include-untracked] [-a|--all] [-m|--message <missatge>]\n" -" [--] [<pathspec>...]]" +"git stash save [-p | --patch] [-S | --staged] [-k | --[no-]keep-index] [-q | " +"--quiet]\n" +" [-u | --include-untracked] [-a | --all] [<missatge>]" -msgid "" -"git stash save [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]\n" -" [-u|--include-untracked] [-a|--all] [<message>]" -msgstr "" -"git stash save [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]\n" -" [-u|--include-untracked] [-a|--all] [<missatge>]" +msgid "git stash create [<message>]" +msgstr "git stash create [<missatge>]" #, c-format msgid "'%s' is not a stash-like commit" @@ -12223,7 +12316,7 @@ msgid "suppress output of entering each submodule command" msgstr "omet la sortida en entrar a cada ordre del submòdul" msgid "recurse into nested submodules" -msgstr "inclou recursivament els submòduls imbricats" +msgstr "cerca recursivament als submòduls imbricats" msgid "git submodule foreach [--quiet] [--recursive] [--] <command>" msgstr "git submodule foreach [--quiet] [--recursive] [--] <ordre>" @@ -12316,7 +12409,7 @@ msgid "limit the summary size" msgstr "limita la mida del resum" msgid "git submodule summary [<options>] [<commit>] [--] [<path>]" -msgstr "git submodule summary [<options>] [<commit>] [--] [<path>]" +msgstr "git submodule summary [<opcions>] [<comissió>] [--] [<camÃ>]" msgid "could not fetch a revision for HEAD" msgstr "no s'ha pogut obtenir una revisió per a HEAD" @@ -12337,7 +12430,7 @@ msgid "suppress output of synchronizing submodule url" msgstr "omet la sortida de la sincronització de l'URL del submòdul" msgid "git submodule sync [--quiet] [--recursive] [<path>]" -msgstr "git submodule sync [--quiet] [--recursive] [<path>]" +msgstr "git submodule sync [--quiet] [--recursive] [<camÃ>]" #, c-format msgid "" @@ -12457,9 +12550,9 @@ msgid "" "<repository>] [--name <name>] [--depth <depth>] [--single-branch] [--filter " "<filter-spec>] --url <url> --path <path>" msgstr "" -"git submodule--helper clone [--prefix=<path>] [--quiet] [--reference " +"git submodule--helper clone [--prefix=<camÃ>] [--quiet] [--reference " "<repository>] [--name <name>] [--depth <depth>] [--single-branch] [--filter " -"<filter-spec>] --url <url> --path <path>" +"<filter-spec>] --url <url> --path <camÃ>" #, c-format msgid "Invalid update mode '%s' configured for submodule path '%s'" @@ -12579,9 +12672,6 @@ msgstr "recorre els submòduls recursivament" msgid "don't fetch new objects from the remote site" msgstr "no obtinguis els objectes nous del lloc remot" -msgid "path into the working tree" -msgstr "camà a l'arbre de treball" - msgid "use the 'checkout' update strategy (default)" msgstr "utilitza l'estratègia d'actualització «checkout» (predeterminada)" @@ -12615,34 +12705,16 @@ msgstr "" "git submodule [--quiet] update [--init [--filter=<filter-spec>]] [--remote] " "[-N|--no-fetch] [-f|--force] [--checkout|--merge|--rebase] [--[no-]recommend-" "shallow] [--reference <repository>] [--recursive] [--[no-]single-branch] " -"[--] [<path>...]" - -msgid "recurse into submodules" -msgstr "inclou recursivament als submòduls" +"[--] [<camÃ>...]" msgid "git submodule absorbgitdirs [<options>] [<path>...]" -msgstr "git submodule absorbgitdirs [<options>] [<path>...]" - -msgid "check if it is safe to write to the .gitmodules file" -msgstr "comprova si és segur escriure al fitxer .gitmodules" - -msgid "unset the config in the .gitmodules file" -msgstr "desconfigura l'opció de configuració al fitxer .gitmodules" - -msgid "git submodule--helper config <name> [<value>]" -msgstr "git submodule--helper config <nom> [<valor>]" - -msgid "git submodule--helper config --unset <name>" -msgstr "git submodule--helper config --unset <nom>" - -msgid "please make sure that the .gitmodules file is in the working tree" -msgstr "assegureu-vos que el fitxer .gitmodules és a l'arbre de treball" +msgstr "git submodule absorbgitdirs [<opcions>] [<camÃ>...]" msgid "suppress output for setting url of a submodule" msgstr "omet la sortida en configurar un URL d'un submòdul" msgid "git submodule set-url [--quiet] <path> <newurl>" -msgstr "git submodule set-url [--quiet] <path> <newurl>" +msgstr "git submodule set-url [--quiet] <camÃ> <newurl>" msgid "set the default tracking branch to master" msgstr "estableix la branca de seguiment per defecte a «master»" @@ -12651,10 +12723,10 @@ msgid "set the default tracking branch" msgstr "estableix la branca de seguiment per defecte" msgid "git submodule set-branch [-q|--quiet] (-d|--default) <path>" -msgstr "git submodule set-branch [-q|--quiet] (-d|--default) <path>" +msgstr "git submodule set-branch [-q|--quiet] (-d|--default) <camÃ>" msgid "git submodule set-branch [-q|--quiet] (-b|--branch) <branch> <path>" -msgstr "git submodule set-branch [-q|--quiet] (-b|--branch) <branch> <path>" +msgstr "git submodule set-branch [-q|--quiet] (-b|--branch) <branca> <camÃ>" msgid "--branch or --default required" msgstr "cal --branch o --default" @@ -12716,6 +12788,9 @@ msgstr "S'està reactivant el directori de git local per al submòdul «%s»\n" msgid "unable to checkout submodule '%s'" msgstr "no s'ha pogut agafar el submòdul «%s»" +msgid "please make sure that the .gitmodules file is in the working tree" +msgstr "assegureu-vos que el fitxer .gitmodules és a l'arbre de treball" + #, c-format msgid "Failed to add submodule '%s'" msgstr "S'ha produït un error en afegir el submòdul «%s»" @@ -12753,7 +12828,7 @@ msgstr "" "seu camÃ" msgid "git submodule add [<options>] [--] <repository> [<path>]" -msgstr "git submodule add [<options>] [--] <repository> [<path>]" +msgstr "git submodule add [<opcions>] [--] <repository> [<camÃ>]" msgid "Relative path can only be used from the toplevel of the working tree" msgstr "" @@ -12768,19 +12843,21 @@ msgstr "URL de repositori: «%s» ha de ser absolut o començar amb ./|../" msgid "'%s' is not a valid submodule name" msgstr "«%s» no és un nom de submòdul và lid" +msgid "git submodule--helper <command>" +msgstr "git submodule--helper <command>" + #, c-format msgid "%s doesn't support --super-prefix" msgstr "%s no admet --super-prefix" -#, c-format -msgid "'%s' is not a valid submodule--helper subcommand" -msgstr "«%s» no és una subordre và lida de submodule--helper" +msgid "git symbolic-ref [-m <reason>] <name> <ref>" +msgstr "git symbolic-ref [-m <reason>] <name> <ref>" -msgid "git symbolic-ref [<options>] <name> [<ref>]" -msgstr "git symbolic-ref [<opcions>] <nom> [<referència>]" +msgid "git symbolic-ref [-q] [--short] [--no-recurse] <name>" +msgstr "git symbolic-ref [-q] [--short] [--no-recurse] <name>" -msgid "git symbolic-ref -d [-q] <name>" -msgstr "git symbolic-ref -d [-q] <nom>" +msgid "git symbolic-ref --delete [-q] <name>" +msgstr "git symbolic-ref --delete [-q] <name>" msgid "suppress error message for non-symbolic (detached) refs" msgstr "omet el missatge d'error de referències no simbòliques (separades)" @@ -12791,6 +12868,9 @@ msgstr "suprimeix la referència simbòlica" msgid "shorten ref output" msgstr "escurça la sortida de referències" +msgid "recursively dereference (default)" +msgstr "desreferencia recursivament (per defecte)" + msgid "reason" msgstr "raó" @@ -12798,25 +12878,25 @@ msgid "reason of the update" msgstr "raó de l'actualització" msgid "" -"git tag [-a | -s | -u <key-id>] [-f] [-m <msg> | -F <file>]\n" -" <tagname> [<head>]" +"git tag [-a | -s | -u <key-id>] [-f] [-m <msg> | -F <file>] [-e]\n" +" <tagname> [<commit> | <object>]" msgstr "" -"git tag [-a | -s | -u <key-id>] [-f] [-m <msg> | -F <fitxer>]\n" -" <tagname> [<head>]" +"git tag [-a | -s | -u <key-id>] [-f] [-m <msg> | -F <fitxer>] [-e]\n" +" <tagname> [<comissió> | <objecte>]" msgid "git tag -d <tagname>..." msgstr "git tag -d <nom-d'etiqueta>..." msgid "" -"git tag -l [-n[<num>]] [--contains <commit>] [--no-contains <commit>] [--" -"points-at <object>]\n" -" [--format=<format>] [--merged <commit>] [--no-merged <commit>] " -"[<pattern>...]" +"git tag [-n[<num>]] -l [--contains <commit>] [--no-contains <commit>]\n" +" [--points-at <object>] [--column[=<options>] | --no-column]\n" +" [--create-reflog] [--sort=<key>] [--format=<format>]\n" +" [--merged <commit>] [--no-merged <commit>] [<pattern>...]" msgstr "" -"git tag -l [-n[<num>]] [--contains <commit>] [--no-contains <commit>] [--" -"points-at <object>]\n" -" [--format=<format>] [--merged <comissió>] [--no-merged <comissió>] " -"[<patró>...]" +"git tag [-n[<num>]] -l [--contains <comissió>] [--no-contains <comissió>]\n" +" [--points-at <objecte>] [--column[=<opcions>] | --no-column]\n" +" [--create-reflog] [--sort=<key>] [--format=<format>]\n" +" [--merged <comissió>] [--no-merged <comissió>] [<patró>...]" msgid "git tag -v [--format=<format>] <tagname>..." msgstr "git tag -v [--format=<format>] <nom-d'etiqueta>..." @@ -13206,8 +13286,12 @@ msgstr "llegeix les actualitzacions des de stdin" msgid "update the info files from scratch" msgstr "actualitza els fitxers d'informació des de zero" -msgid "git upload-pack [<options>] <dir>" -msgstr "git upload-pack [<opcions>] <directori>" +msgid "" +"git-upload-pack [--[no-]strict] [--timeout=<n>] [--stateless-rpc]\n" +" [--advertise-refs] <directory>" +msgstr "" +"git-upload-pack [--[no-]strict] [--timeout=<n>] [--stateless-rpc]\n" +" [--advertise-refs] <directory>" msgid "quit after a single request/response exchange" msgstr "surt després d'un sol intercanvi de sol·licitud/resposta" @@ -13222,8 +13306,8 @@ msgstr "" msgid "interrupt transfer after <n> seconds of inactivity" msgstr "interromp la transferència després de <n> segons d'inactivitat" -msgid "git verify-commit [-v | --verbose] <commit>..." -msgstr "git verify-commit [-v | --verbose] <comissió>..." +msgid "git verify-commit [-v | --verbose] [--raw] <commit>..." +msgstr "git verify-commit [-v | --verbose] [--raw] <comissió>..." msgid "print commit contents" msgstr "imprimeix els continguts de la comissió" @@ -13231,8 +13315,8 @@ msgstr "imprimeix els continguts de la comissió" msgid "print raw gpg status output" msgstr "imprimeix la sortida crua de l'estat gpg" -msgid "git verify-pack [-v | --verbose] [-s | --stat-only] <pack>..." -msgstr "git verify-pack [-v | --verbose] [-s | --stat-only] <paquet>..." +msgid "git verify-pack [-v | --verbose] [-s | --stat-only] [--] <pack>.idx..." +msgstr "git verify-pack [-v | --verbose] [-s | --stat-only] [--] <pack>.idx..." msgid "verbose" msgstr "detallat" @@ -13240,35 +13324,39 @@ msgstr "detallat" msgid "show statistics only" msgstr "mostra només estadÃstiques" -msgid "git verify-tag [-v | --verbose] [--format=<format>] <tag>..." -msgstr "git verify-tag [-v | --verbose] [--format=<format>] <etiqueta>..." +msgid "git verify-tag [-v | --verbose] [--format=<format>] [--raw] <tag>..." +msgstr "git verify-tag [-v | --verbose] [--format=<format>] [--raw] <tag>..." msgid "print tag contents" msgstr "imprimeix els continguts de l'etiqueta" -msgid "git worktree add [<options>] <path> [<commit-ish>]" -msgstr "git worktree add [<opcions>] <camÃ> [<commit-ish>]" +msgid "" +"git worktree add [-f] [--detach] [--checkout] [--lock [--reason <string>]]\n" +" [-b <new-branch>] <path> [<commit-ish>]" +msgstr "" +"git worktree add [-f] [--detach] [--checkout] [--lock [--reason <string>]]\n" +" [-b <new-branch>] <camÃ> [<commit-ish>]" -msgid "git worktree list [<options>]" -msgstr "git worktree list [<opcions>]" +msgid "git worktree list [-v | --porcelain [-z]]" +msgstr "git worktree list [-v | --porcelain [-z]]" -msgid "git worktree lock [<options>] <path>" -msgstr "git worktree lock [<opcions>] <camÃ>" +msgid "git worktree lock [--reason <string>] <worktree>" +msgstr "git worktree lock [--reason <string>] <worktree>" msgid "git worktree move <worktree> <new-path>" msgstr "git worktree move <arbre de treball> <camÃ-nou>" -msgid "git worktree prune [<options>]" -msgstr "git worktree prune [<opcions>]" +msgid "git worktree prune [-n] [-v] [--expire <expire>]" +msgstr "git worktree prune [-n] [-v] [--expire <expire>]" -msgid "git worktree remove [<options>] <worktree>" -msgstr "git worktree remove [<opcions>] <arbre de treball>" +msgid "git worktree remove [-f] <worktree>" +msgstr "git worktree remove [-f] <worktree>" msgid "git worktree repair [<path>...]" -msgstr "git worktree repair [<path>...]" +msgstr "git worktree repair [<camÃ>...]" -msgid "git worktree unlock <path>" -msgstr "git worktree unlock <camÃ>" +msgid "git worktree unlock <worktree>" +msgstr "git worktree unlock <worktree>" #, c-format msgid "Removing %s/%s: %s" @@ -13508,6 +13596,10 @@ msgstr "només útil per a la depuració" msgid "core.fsyncMethod = batch is unsupported on this platform" msgstr "core.fsyncMethod = batch no és compatible amb aquesta plataforma" +#, c-format +msgid "bundle list at '%s' has no mode" +msgstr "la llista de farcells a «%s» no té mode" + msgid "failed to create temporary file" msgstr "no s'ha pogut crear un fitxer temporal" @@ -13515,16 +13607,29 @@ msgid "insufficient capabilities" msgstr "capacitats insuficients" #, c-format +msgid "unrecognized bundle mode from URI '%s'" +msgstr "no s'ha reconegut el model del farcell de l'URI «%s»" + +#, c-format +msgid "exceeded bundle URI recursion limit (%d)" +msgstr "s'ha excedit el lÃmit de recursió URI del paquet (%d)" + +#, c-format msgid "failed to download bundle from URI '%s'" msgstr "no s'ha pogut baixar el paquet de l'URI «%s»" #, c-format -msgid "file at URI '%s' is not a bundle" -msgstr "el fitxer a l'URI «%s» no és farcell" +msgid "file at URI '%s' is not a bundle or bundle list" +msgstr "el fitxer a l'URI «%s» no és farcell o una llista de farcells" -#, c-format -msgid "failed to unbundle bundle from URI '%s'" -msgstr "s'ha produït un error en desempaquetar el farcell de l'URI «%s»" +msgid "bundle-uri: got an empty line" +msgstr "bundle-uri: té una lÃnia buida" + +msgid "bundle-uri: line is not of the form 'key=value'" +msgstr "bundle-uri: la lÃnia no és de la forma «key=value»" + +msgid "bundle-uri: line has empty key or value" +msgstr "bundle-uri: la lÃnia té una clau o un valor buit" #, c-format msgid "unrecognized bundle hash algorithm: %s" @@ -14112,7 +14217,7 @@ msgstr "El format del fitxer de farcell" msgid "Chunk-based file formats" msgstr "Formats de fitxer basats en blocs" -msgid "Git commit graph format" +msgid "Git commit-graph format" msgstr "Format de graf de comissions del Git" msgid "Git index format" @@ -14485,6 +14590,10 @@ msgstr "cas no gestionat a «has_worktree_moved»: %d" msgid "health thread wait failed [GLE %ld]" msgstr "ha fallat l'espera del fil de salut [GLE %ld]" +#, c-format +msgid "Invalid path: %s" +msgstr "Camà no và lid: «%s»" + msgid "Unable to create FSEventStream." msgstr "No s'ha pogut crear el FSEventStream." @@ -14516,6 +14625,22 @@ msgid "could not read directory changes [GLE %ld]" msgstr "no s'han pogut llegir els canvis de directori [GLE %ld]" #, c-format +msgid "opendir('%s') failed" +msgstr "ha fallat opendir(«%s»)" + +#, c-format +msgid "lstat('%s') failed" +msgstr "ha fallat lstat(«%s»)" + +#, c-format +msgid "strbuf_readlink('%s') failed" +msgstr "ha fallat strbuf_readlink(«%s»)" + +#, c-format +msgid "closedir('%s') failed" +msgstr "ha fallat closedir(«%s»)" + +#, c-format msgid "[GLE %ld] unable to open for read '%ls'" msgstr "[GLE %ld] no s'ha pogut obrir per a llegir «%ls»" @@ -16147,10 +16272,11 @@ msgstr "el repositori virtual «%s» és incompatible amb fsmonitor" #, c-format msgid "" -"repository '%s' is incompatible with fsmonitor due to lack of Unix sockets" +"socket directory '%s' is incompatible with fsmonitor due to lack of Unix " +"sockets support" msgstr "" -"el repositori «%s» és incompatible amb fsmonitor a causa de la manca de " -"sòcols Unix" +"el directori del sòcol «%s» és incompatible amb fsmonitor a causa de la " +"manca de compatibilitat amb els sòcols Unix" msgid "" "git [-v | --version] [-h | --help] [-C <path>] [-c <name>=<value>]\n" @@ -16161,12 +16287,12 @@ msgid "" " [--super-prefix=<path>] [--config-env=<name>=<envvar>]\n" " <command> [<args>]" msgstr "" -"git [-v | --version] [-h | --help] [-C <path>] [-c <name>=<value>]\n" -" [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]\n" +"git [-v | --version] [-h | --help] [-C <camÃ>] [-c <name>=<value>]\n" +" [--exec-path[=<camÃ>]] [--html-path] [--man-path] [--info-path]\n" " [-p | --paginate | -P | --no-pager] [--no-replace-objects] [--" "bare]\n" -" [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]\n" -" [--super-prefix=<path>] [--config-env=<name>=<envvar>]\n" +" [--git-dir=<camÃ>] [--work-tree=<camÃ>] [--namespace=<name>]\n" +" [--super-prefix=<camÃ>] [--config-env=<name>=<envvar>]\n" " <command> [<args>]" msgid "" @@ -16471,8 +16597,8 @@ msgstr[1] "" "\n" "Les ordres més similars són" -msgid "git version [<options>]" -msgstr "git version [<opcions>]" +msgid "git version [--build-options]" +msgstr "git version [--build-options]" #, c-format msgid "%s: %s - %s" @@ -16608,7 +16734,7 @@ msgstr "sparse: s'ha eliminat la implementació de filtres de camà sparse" #, c-format msgid "'%s' for 'object:type=<type>' is not a valid object type" -msgstr "«%s» per a «object:type=<type>» no és un tipus d'objecte và lid" +msgstr "«%s» per a «object:type=<tipus>» no és un tipus d'objecte và lid" #, c-format msgid "invalid filter-spec '%s'" @@ -17419,10 +17545,6 @@ msgstr "" "%s: s'estan ignorant els emmagatzematges alternatius d'objectes, imbricació " "massa profunda" -#, c-format -msgid "unable to normalize object directory: %s" -msgstr "no s'ha pogut normalitzar el directori de l'objecte: %s" - msgid "unable to fdopen alternates lockfile" msgstr "no s'ha pogut fer «fdopen» al fitxer de bloqueig alternatiu" @@ -17770,7 +17892,7 @@ msgstr "" #, c-format msgid "<object>:<path> required, only <object> '%s' given" -msgstr "<object>:<path> requerit, només s'ha donat <object> «%s»" +msgstr "<objecte>:<camÃ> requerit, només s'ha donat <objecte> «%s»" #, c-format msgid "invalid object name '%.*s'." @@ -18269,6 +18391,10 @@ msgstr "promisor-remote: no s'ha pogut tancar stdin al subprocés d'obtenció" msgid "promisor remote name cannot begin with '/': %s" msgstr "el nom remot «promisor» no pot començar amb «/»: %s" +#, c-format +msgid "could not fetch %s from promisor remote" +msgstr "no s'ha pogut obtenir «%s» del «promisor» remot" + msgid "object-info: expected flush after arguments" msgstr "object-info: s'esperava una neteja després dels arguments" @@ -19005,7 +19131,7 @@ msgstr "El transport http no admet %s" msgid "protocol error: expected '<url> <path>', missing space" msgstr "" -"s'ha produït un error de protocol: s'esperava «<url> <path>», falta espai" +"s'ha produït un error de protocol: s'esperava «<url> <camÃ>», falta espai" #, c-format msgid "failed to download file at URL '%s'" @@ -19355,6 +19481,13 @@ msgid "failed to find tree of %s" msgstr "s'ha produït un error en cercar l'arbre de %s" #, c-format +msgid "unsupported section for hidden refs: %s" +msgstr "secció d'Ãndex no compatible per a les referències ocultes: %s" + +msgid "--exclude-hidden= passed more than once" +msgstr "--exclude-hidden= passat més d'una vegada" + +#, c-format msgid "resolve-undo records `%s` which is missing" msgstr "resolve-undo indica «%s» que manquen" @@ -19452,7 +19585,7 @@ msgid "only download metadata for the branch that will be checked out" msgstr "només baixa les metadades per a la branca que s'agafarà " msgid "scalar clone [<options>] [--] <repo> [<dir>]" -msgstr "scalar clone [<opcions>] [--] <repo> [<dir>]" +msgstr "scalar clone [<opcions>] [--] <repositori> [<dir>]" #, c-format msgid "cannot deduce worktree name from '%s'" @@ -19499,6 +19632,14 @@ msgid "--all or <enlistment>, but not both" msgstr "--all o <enlistment>, però no ambdós" #, c-format +msgid "could not remove stale scalar.repo '%s'" +msgstr "no s'ha pogut suprimir el scalar.repo «%s» estancat" + +#, c-format +msgid "removing stale scalar.repo '%s'" +msgstr "s'està eliminant el scalar.repo «%s» estancat" + +#, c-format msgid "git repository gone in '%s'" msgstr "no existeix un repositori de git a: «%s»" @@ -19546,7 +19687,7 @@ msgid "" "\n" "Commands:\n" msgstr "" -"scalar [-C <directory>] [-c <key>=<value>] <command> [<options>]\n" +"scalar [-C <directory>] [-c <key>=<value>] <command> [<opcions>]\n" "\n" "Ordres:\n" @@ -19853,7 +19994,7 @@ msgid "unknown command: %d" msgstr "ordre desconeguda: %d" msgid "This is the 1st commit message:" -msgstr "Aquest és el missatge de la 1ra comissió:" +msgstr "Aquest és el missatge de la 1a comissió:" #, c-format msgid "This is the commit message #%d:" @@ -20124,16 +20265,16 @@ msgstr "" msgid "illegal label name: '%.*s'" msgstr "nom d'etiqueta no permès: «%.*s»" +#, c-format +msgid "could not resolve '%s'" +msgstr "no s'ha pogut resoldre «%s»" + msgid "writing fake root commit" msgstr "s'està escrivint una comissió arrel falsa" msgid "writing squash-onto" msgstr "s'està escrivint «squash-onto»" -#, c-format -msgid "could not resolve '%s'" -msgstr "no s'ha pogut resoldre «%s»" - msgid "cannot merge without a current revision" msgstr "no es pot fusionar sense una revisió actual" @@ -20741,6 +20882,16 @@ msgstr "ls-tree ha retornat un codi de retorn %d no esperat" msgid "failed to lstat '%s'" msgstr "s'ha produït un error en fer lstat a «%s»" +msgid "test-tool cache-tree <options> (control|prime|update)" +msgstr "test-tool cache-tree <opcions> (control|prime|update)" + +msgid "clear the cache tree before each iteration" +msgstr "neteja l'arbre de la memòria cau abans de cada iteració" + +msgid "number of entries in the cache tree to invalidate (default 0)" +msgstr "" +"nombre d'entrades a l'arbre de la memòria cau a invalidar (per defecte 0)" + msgid "unhandled options" msgstr "opcions no gestionades" @@ -21520,7 +21671,7 @@ msgstr " (useu «git add/rm <fitxer>...» per a actualitzar què es cometrà )" msgid "" " (use \"git restore <file>...\" to discard changes in working directory)" msgstr "" -" (useu «git restore <file>...» per a descartar canvis en el directori de " +" (useu «git restore <fitxer>...» per a descartar canvis en el directori de " "treball)" msgid " (commit or discard the untracked or modified content in submodules)" @@ -22577,83 +22728,6 @@ msgstr "S'està ometent %s amb el sufix de còpia de seguretat «%s».\n" msgid "Do you really want to send %s? [y|N]: " msgstr "Esteu segur que voleu enviar %s? [y|N]: " -#~ msgid "(stats|all)" -#~ msgstr "(stats|all)" - -#~ msgid "git maintenance register" -#~ msgstr "git maintenance register" - -#~ msgid "git maintenance unregister" -#~ msgstr "git maintenance unregister" - -#~ msgid "git maintenance stop" -#~ msgstr "git maintenance stop" - -#, c-format -#~ msgid "could not parse colored hunk header '%.*s'" -#~ msgstr "no s'ha pogut analitzar la capçalera del tros acolorida «%.*s»" - -#, c-format -#~ msgid "Unknown subcommand: %s" -#~ msgstr "Subordre desconeguda: %s" - -#~ msgid "checked out in another worktree" -#~ msgstr "s'ha agafat en un altre arbre de treball" - -#~ msgid "failed to open stdin of 'crontab'" -#~ msgstr "s'ha produït un error en obrir stdin de «crontab»" - -#, c-format -#~ msgid "invalid subcommand: %s" -#~ msgstr "subordre no và lida: %s" - -#~ msgid "single arg format must be symmetric range" -#~ msgstr "el format de l'argument únic ha de ser de rang simètric" - -#~ msgid "git submodule--helper list [--prefix=<path>] [<path>...]" -#~ msgstr "git submodule--helper list [--prefix=<camÃ>] [<camÃ>...]" - -#~ msgid "git submodule--helper name <path>" -#~ msgstr "git submodule--helper name <camÃ>" - -#, c-format -#~ msgid "failed to get the default remote for submodule '%s'" -#~ msgstr "" -#~ "s'ha produït un error en obtenir el remot per defecte pel submòdul «%s»" - -#, c-format -#~ msgid "Invalid update mode '%s' for submodule path '%s'" -#~ msgstr "Mode d'actualització «%s» no và lid per al camà de submòdul «%s»" - -#~ msgid "path into the working tree, across nested submodule boundaries" -#~ msgstr "camà a l'arbre de treball, a través de fronteres de submòduls niats" - -#~ msgid "rebase, merge, checkout or none" -#~ msgstr "rebase, merge, checkout o none" - -#~ msgid "bad value for update parameter" -#~ msgstr "valor incorrecte per al parà metre update" - -#~ msgid "Show three-way merge without touching index" -#~ msgstr "Mostra la fusió de tres vies sense tocar l'Ãndex" - -# c-format -#, c-format -#~ msgid "could not create directory for '%s'" -#~ msgstr "no s'ha pogut crear el directori per a «%s»" - -#, c-format -#~ msgid "Couldn't start hook '%s'\n" -#~ msgstr "No s'ha pogut iniciar el lligam «%s»'\n" - -#, c-format -#~ msgid "" -#~ "Note: %s not up to date and in way of checking out conflicted version; " -#~ "old copy renamed to %s" -#~ msgstr "" -#~ "Nota: %s no està actualitzat i en forma de comprovar la versió en " -#~ "conflicte; còpia antiga reanomenada a %s" - #, c-format -#~ msgid "%s: fast-forward" -#~ msgstr "%s: avanç rà pid" +#~ msgid "unable to normalize object directory: %s" +#~ msgstr "no s'ha pogut normalitzar el directori de l'objecte: %s" @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: Git\n" "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n" -"POT-Creation-Date: 2022-09-28 17:09+0200\n" -"PO-Revision-Date: 2022-09-28 17:10+0200\n" +"POT-Creation-Date: 2022-12-02 17:16+0100\n" +"PO-Revision-Date: 2022-12-02 17:19+0100\n" "Last-Translator: Ralf Thielow <ralf.thielow@gmail.com>\n" "Language-Team: German\n" "Language: de\n" @@ -17,7 +17,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n!=1);\n" -"X-Generator: Poedit 3.1.1\n" +"X-Generator: Poedit 3.2\n" #, c-format msgid "Huh (%s)?" @@ -379,8 +379,8 @@ msgstr "Ergänzung im Index und Arbeitsverzeichnis verwerfen [y,n,q,a,d%s,?]? " #, c-format, perl-format msgid "Discard this hunk from index and worktree [y,n,q,a,d%s,?]? " msgstr "" -"Diesen Patch-Block vom Index und Arbeitsverzeichnis verwerfen [y,n,q,a,d" -"%s,?]? " +"Diesen Patch-Block vom Index und Arbeitsverzeichnis verwerfen [y,n,q,a," +"d%s,?]? " msgid "" "y - discard this hunk from index and worktree\n" @@ -411,8 +411,8 @@ msgstr "Ergänzung auf Index und Arbeitsverzeichnis anwenden [y,n,q,a,d%s,?]? " #, c-format, perl-format msgid "Apply this hunk to index and worktree [y,n,q,a,d%s,?]? " msgstr "" -"Diesen Patch-Block auf Index und Arbeitsverzeichnis anwenden [y,n,q,a,d" -"%s,?]? " +"Diesen Patch-Block auf Index und Arbeitsverzeichnis anwenden [y,n,q,a," +"d%s,?]? " msgid "" "y - apply this hunk to index and worktree\n" @@ -786,6 +786,9 @@ msgstr "Befehlszeile endet mit \\" msgid "unclosed quote" msgstr "nicht geschlossene Anführungszeichen" +msgid "too many arguments" +msgstr "zu viele Argumente" + #, c-format msgid "unrecognized whitespace option '%s'" msgstr "Nicht erkannte Whitespace-Option: '%s'" @@ -2018,8 +2021,8 @@ msgstr "" #, c-format msgid "If you prefer to skip this patch, run \"%s --skip\" instead." msgstr "" -"Falls Sie diesen Patch auslassen möchten, führen Sie stattdessen \"%s --skip" -"\" aus." +"Falls Sie diesen Patch auslassen möchten, führen Sie stattdessen \"%s --" +"skip\" aus." #, c-format msgid "To record the empty patch as an empty commit, run \"%s --allow-empty\"." @@ -2593,42 +2596,6 @@ msgstr "" "'bisect run' fehlgeschlagen: 'git bisect--helper --bisect-state %s' mit " "Fehlercode %d beendet" -msgid "reset the bisection state" -msgstr "den Zustand der binären Suche zurücksetzen" - -msgid "check whether bad or good terms exist" -msgstr "prüfen, ob Begriffe für gute und schlechte Commits existieren" - -msgid "print out the bisect terms" -msgstr "die Begriffe für die binäre Suche ausgeben" - -msgid "start the bisect session" -msgstr "Sitzung für binäre Suche starten" - -msgid "find the next bisection commit" -msgstr "nächsten Commit für die binäre Suche finden" - -msgid "mark the state of ref (or refs)" -msgstr "den Status der Referenz(en) markieren" - -msgid "list the bisection steps so far" -msgstr "die bisherigen Schritte der binären Suche auflisten" - -msgid "replay the bisection process from the given file" -msgstr "binäre Suche aus der angegebenen Datei wiederholen" - -msgid "skip some commits for checkout" -msgstr "einige Commits für das Auschecken überspringen" - -msgid "visualize the bisection" -msgstr "binäre Suche visualisieren" - -msgid "use <cmd>... to automatically bisect" -msgstr "verwende <Programm>... für die automatische binäre Suche" - -msgid "no log for BISECT_WRITE" -msgstr "kein Log für BISECT_WRITE" - msgid "--bisect-reset requires either no argument or a commit" msgstr "--bisect-reset benötigt entweder kein Argument oder ein Commit" @@ -2647,6 +2614,9 @@ msgstr "keine Log-Datei angegeben" msgid "git blame [<options>] [<rev-opts>] [<rev>] [--] <file>" msgstr "git blame [<Optionen>] [<rev-opts>] [<Commit>] [--] <Datei>" +msgid "git annotate [<options>] [<rev-opts>] [<rev>] [--] <file>" +msgstr "git annotate [<Optionen>] [<rev-opts>] [<Commit>] [--] <Datei>" + msgid "<rev-opts> are documented in git-rev-list(1)" msgstr "<rev-opts> sind dokumentiert in git-rev-list(1)" @@ -2842,9 +2812,6 @@ msgstr "Aktualisierung der Konfigurationsdatei fehlgeschlagen." msgid "cannot use -a with -d" msgstr "kann -a nicht mit -d benutzen" -msgid "Couldn't look up commit object for HEAD" -msgstr "Konnte Commit-Objekt für HEAD nicht nachschlagen." - #, c-format msgid "Cannot delete branch '%s' checked out at '%s'" msgstr "Kann Branch '%s' nicht entfernen, ausgecheckt in '%s'." @@ -2883,19 +2850,18 @@ msgstr "Branch %s wird auf %s umgesetzt" msgid "Branch %s is being bisected at %s" msgstr "Binäre Suche von Branch %s zu %s im Gange" -msgid "cannot copy the current branch while not on any." -msgstr "" -"Kann den aktuellen Branch nicht kopieren, solange Sie sich auf keinem " -"befinden." - -msgid "cannot rename the current branch while not on any." -msgstr "" -"Kann aktuellen Branch nicht umbenennen, solange Sie sich auf keinem befinden." - #, c-format msgid "Invalid branch name: '%s'" msgstr "Ungültiger Branchname: '%s'" +#, c-format +msgid "No commit on branch '%s' yet." +msgstr "Noch kein Commit in Branch '%s'." + +#, c-format +msgid "No branch named '%s'." +msgstr "Branch '%s' nicht vorhanden." + msgid "Branch rename failed" msgstr "Umbenennung des Branches fehlgeschlagen" @@ -3059,13 +3025,14 @@ msgstr "zu losgelöstem HEAD kann keine Beschreibung hinterlegt werden" msgid "cannot edit description of more than one branch" msgstr "Beschreibung von mehr als einem Branch kann nicht bearbeitet werden" -#, c-format -msgid "No commit on branch '%s' yet." -msgstr "Noch kein Commit in Branch '%s'." +msgid "cannot copy the current branch while not on any." +msgstr "" +"Kann den aktuellen Branch nicht kopieren, solange Sie sich auf keinem " +"befinden." -#, c-format -msgid "No branch named '%s'." -msgstr "Branch '%s' nicht vorhanden." +msgid "cannot rename the current branch while not on any." +msgstr "" +"Kann aktuellen Branch nicht umbenennen, solange Sie sich auf keinem befinden." msgid "too many branches for a copy operation" msgstr "zu viele Branches für eine Kopieroperation angegeben" @@ -3137,11 +3104,11 @@ msgid "not run from a git repository - no hooks to show\n" msgstr "nicht in einem Git-Repository ausgeführt - keine Hooks zum Anzeigen\n" msgid "" -"git bugreport [-o|--output-directory <file>] [-s|--suffix <format>] [--" -"diagnose[=<mode>]" +"git bugreport [(-o | --output-directory) <path>] [(-s | --suffix) <format>]\n" +" [--diagnose[=<mode>]]" msgstr "" -"git bugreport [-o|--output-directory <Datei>] [-s|--suffix <Format>] [--" -"diagnose[=<Modus>]" +"git bugreport [(-o | --output-directory) <Pfad>] [(-s | --suffix) <Format>]\n" +" [--diagnose[=<Modus>]]" msgid "" "Thank you for filling out a Git bug report!\n" @@ -3216,17 +3183,23 @@ msgstr "konnte nicht nach %s schreiben" msgid "Created new report at '%s'.\n" msgstr "Neuer Bericht unter '%s' erstellt.\n" -msgid "git bundle create [<options>] <file> <git-rev-list args>" -msgstr "git bundle create [<Optionen>] <Datei> <git-rev-list Argumente>" +msgid "" +"git bundle create [-q | --quiet | --progress | --all-progress] [--all-" +"progress-implied]\n" +" [--version=<version>] <file> <git-rev-list-args>" +msgstr "" +"git bundle create [-q | --quiet | --progress | --all-progress] [--all-" +"progress-implied]\n" +" [--version=<Version>] <Datei> <git-rev-list-Argumente>" -msgid "git bundle verify [<options>] <file>" -msgstr "git bundle verify [<Optionen>] <Datei>" +msgid "git bundle verify [-q | --quiet] <file>" +msgstr "git bundle verify [-q | --quiet] <Datei>" msgid "git bundle list-heads <file> [<refname>...]" msgstr "git bundle list-heads <Datei> [<Referenzname>...]" -msgid "git bundle unbundle <file> [<refname>...]" -msgstr "git bundle unbundle <Datei> [<Referenzname>...]" +msgid "git bundle unbundle [--progress] <file> [<refname>...]" +msgstr "git bundle unbundle [--progress] <Datei> [<Referenzname>...]" msgid "do not show progress meter" msgstr "keine Fortschrittsanzeige anzeigen" @@ -3301,12 +3274,12 @@ msgid "" "git cat-file (--batch | --batch-check | --batch-command) [--batch-all-" "objects]\n" " [--buffer] [--follow-symlinks] [--unordered]\n" -" [--textconv | --filters]" +" [--textconv | --filters] [-z]" msgstr "" "git cat-file (--batch | --batch-check | --batch-command) [--batch-all-" "objects]\n" " [--buffer] [--follow-symlinks] [--unordered]\n" -" [--textconv | --filters]" +" [--textconv | --filters] [-z]" msgid "" "git cat-file (--textconv | --filters)\n" @@ -3419,9 +3392,6 @@ msgstr "<Commit> benötigt mit '%s'" msgid "<object> required with '-%c'" msgstr "<Objekt> benötigt mit '-%c'" -msgid "too many arguments" -msgstr "zu viele Argumente" - #, c-format msgid "only two arguments allowed in <type> <object> mode, not %d" msgstr "nur zwei Argumente im <Typ> <Objekt> Modus erlaubt, nicht %d" @@ -3968,9 +3938,11 @@ msgid "use overlay mode" msgstr "benutze Overlay-Modus" msgid "" -"git clean [-d] [-f] [-i] [-n] [-q] [-e <pattern>] [-x | -X] [--] <paths>..." +"git clean [-d] [-f] [-i] [-n] [-q] [-e <pattern>] [-x | -X] [--] " +"[<pathspec>...]" msgstr "" -"git clean [-d] [-f] [-i] [-n] [-q] [-e <Muster>] [-x | -X] [--] <Pfade>..." +"git clean [-d] [-f] [-i] [-n] [-q] [-e <Muster>] [-x | -X] [--] " +"[<Pfadspezifikation>...]" #, c-format msgid "Removing %s\n" @@ -4270,6 +4242,11 @@ msgid "failed to start iterator over '%s'" msgstr "Fehler beim Starten der Iteration über '%s'" #, c-format +msgid "symlink '%s' exists, refusing to clone with --local" +msgstr "" +"symbolische Verknüpfung '%s' existiert, verweigere das Klonen mit --local" + +#, c-format msgid "failed to unlink '%s'" msgstr "Konnte '%s' nicht entfernen." @@ -4335,10 +4312,6 @@ msgstr "Zu viele Argumente." msgid "You must specify a repository to clone." msgstr "Sie müssen ein Repository zum Klonen angeben." -#, c-format -msgid "options '%s' and '%s %s' cannot be used together" -msgstr "die Optionen '%s' und '%s %s' können nicht gemeinsam verwendet werden" - msgid "" "--bundle-uri is incompatible with --depth, --shallow-since, and --shallow-" "exclude" @@ -4472,19 +4445,25 @@ msgid "--command must be the first argument" msgstr "--command muss an erster Stelle stehen" msgid "" -"git commit-graph verify [--object-dir <objdir>] [--shallow] [--[no-]progress]" +"git commit-graph verify [--object-dir <dir>] [--shallow] [--[no-]progress]" msgstr "" -"git commit-graph verify [--object-dir <Objektverzeichnis>] [--shallow] [--" +"git commit-graph verify [--object-dir <Verzeichnis>] [--shallow] [--" "[no-]progress]" msgid "" -"git commit-graph write [--object-dir <objdir>] [--append] [--" -"split[=<strategy>]] [--reachable|--stdin-packs|--stdin-commits] [--changed-" -"paths] [--[no-]max-new-filters <n>] [--[no-]progress] <split options>" +"git commit-graph write [--object-dir <dir>] [--append]\n" +" [--split[=<strategy>]] [--reachable | --stdin-packs | " +"--stdin-commits]\n" +" [--changed-paths] [--[no-]max-new-filters <n>] [--" +"[no-]progress]\n" +" <split options>" msgstr "" -"git commit-graph write [--object-dir <Objektverzeichnis>] [--append] [--" -"split[=<Strategie>]] [--reachable|--stdin-packs|--stdin-commits] [--changed-" -"paths] [--[no-]max-new-filters <Anzahl>] [--[no-]progress] <Split-Optionen>" +"git commit-graph write [--object-dir <Verzeichnis>] [--append]\n" +" [--split[=<Strategie>]] [--reachable | --stdin-packs " +"| --stdin-commits]\n" +" [--changed-paths] [--[no-]max-new-filters <n>] [--" +"[no-]progress]\n" +" <Split-Optionen>" msgid "dir" msgstr "Verzeichnis" @@ -4558,12 +4537,15 @@ msgstr "" msgid "Collecting commits from input" msgstr "Sammle Commits von der Standard-Eingabe" +msgid "git commit-tree <tree> [(-p <parent>)...]" +msgstr "git commit-tree <Tree-Objekt> [(-p <Elternteil>)...]" + msgid "" -"git commit-tree [(-p <parent>)...] [-S[<keyid>]] [(-m <message>)...] [(-F " -"<file>)...] <tree>" +"git commit-tree [(-p <parent>)...] [-S[<keyid>]] [(-m <message>)...]\n" +" [(-F <file>)...] <tree>" msgstr "" -"git commit-tree [(-p <Eltern-Commit>)...] [-S[<Key-ID>]] [(-m " -"<Nachricht>)...] [(-F <Datei>)...] <Tree-Objekt>" +"git commit-tree [(-p <Elternteil>)...] [-S[<Key-ID>]] [(-m <Nachricht>)...]\n" +" [(-F <Datei>)...] <Tree-Objekt>" #, c-format msgid "duplicate parent %s ignored" @@ -4605,11 +4587,29 @@ msgstr "Brauche genau ein Tree-Objekt." msgid "git commit-tree: failed to read" msgstr "git commit-tree: Fehler beim Lesen" -msgid "git commit [<options>] [--] <pathspec>..." -msgstr "git commit [<Optionen>] [--] <Pfadspezifikation>..." +msgid "" +"git commit [-a | --interactive | --patch] [-s] [-v] [-u<mode>] [--amend]\n" +" [--dry-run] [(-c | -C | --squash) <commit> | --fixup [(amend|" +"reword):]<commit>)]\n" +" [-F <file> | -m <msg>] [--reset-author] [--allow-empty]\n" +" [--allow-empty-message] [--no-verify] [-e] [--author=<author>]\n" +" [--date=<date>] [--cleanup=<mode>] [--[no-]status]\n" +" [-i | -o] [--pathspec-from-file=<file> [--pathspec-file-nul]]\n" +" [(--trailer <token>[(=|:)<value>])...] [-S[<keyid>]]\n" +" [--] [<pathspec>...]" +msgstr "" +"git commit [-a | --interactive | --patch] [-s] [-v] [-u<Modus>] [--amend]\n" +" [--dry-run] [(-c | -C | --squash) <Commit> | --fixup [(amend|" +"reword):]<Commit>)]\n" +" [-F <Datei> | -m <Nachricht>] [--reset-author] [--allow-empty]\n" +" [--allow-empty-message] [--no-verify] [-e] [--author=<Autor>]\n" +" [--date=<Datum>] [--cleanup=<Modus>] [--[no-]status]\n" +" [-i | -o] [--pathspec-from-file=<Datei> [--pathspec-file-nul]]\n" +" [(--trailer <Token>[(=|:)<Wert>])...] [-S[<Key-Id>]]\n" +" [--] [<Pfadspezifikation>...]" -msgid "git status [<options>] [--] <pathspec>..." -msgstr "git status [<Optionen>] [--] <Pfadspezifikation>..." +msgid "git status [<options>] [--] [<pathspec>...]" +msgstr "git status [<Optionen>] [--] [<Pfadspezifikation>...]" msgid "" "You asked to amend the most recent commit, but doing so would make\n" @@ -5396,11 +5396,20 @@ msgstr "credential-cache nicht verfügbar; Unix-Socket wird nicht unterstützt" msgid "unable to get credential storage lock in %d ms" msgstr "konnte Sperre für Zugangsdatenspeicher nicht in %d ms bekommen" -msgid "git describe [<options>] [<commit-ish>...]" -msgstr "git describe [<Optionen>] [<Commit-Angabe>...]" +msgid "" +"git describe [--all] [--tags] [--contains] [--abbrev=<n>] [<commit-ish>...]" +msgstr "" +"git describe [--all] [--tags] [--contains] [--abbrev=<n>] [<Commit-" +"Angabe>...]" + +msgid "" +"git describe [--all] [--tags] [--contains] [--abbrev=<n>] --dirty[=<mark>]" +msgstr "" +"git describe [--all] [--tags] [--contains] [--abbrev=<n>] --" +"dirty[=<Markierung>]" -msgid "git describe [<options>] --dirty" -msgstr "git describe [<Optionen>] --dirty" +msgid "git describe <blob>" +msgstr "git describe <Blob>" msgid "head" msgstr "Branch" @@ -5511,8 +5520,8 @@ msgstr "Markierung" msgid "append <mark> on dirty working tree (default: \"-dirty\")" msgstr "" -"<Markierung> bei geändertem Arbeitsverzeichnis anhängen (Standard: \"-dirty" -"\")" +"<Markierung> bei geändertem Arbeitsverzeichnis anhängen (Standard: \"-" +"dirty\")" msgid "append <mark> on broken working tree (default: \"-broken\")" msgstr "" @@ -5526,11 +5535,11 @@ msgid "option '%s' and commit-ishes cannot be used together" msgstr "Option '%s' und Commit-Angaben können nicht gemeinsam verwendet werden" msgid "" -"git diagnose [-o|--output-directory <path>] [-s|--suffix <format>] [--" -"mode=<mode>]" +"git diagnose [(-o | --output-directory) <path>] [(-s | --suffix) <format>]\n" +" [--mode=<mode>]" msgstr "" -"git diagnose [-o|--output-directory <Pfad>] [-s|--suffix <Format>] [--" -"mode=<Modus>]" +"git diagnose [(-o | --output-directory) <Pfad>] [(-s | --suffix) <Format>]\n" +" [--mode=<Modus>]" msgid "specify a destination for the diagnostics archive" msgstr "einen Zielort für das Diagnosearchiv angeben" @@ -5548,6 +5557,9 @@ msgstr "--merge-base funktioniert nur mit zwei Commits" msgid "'%s': not a regular file or symlink" msgstr "'%s': keine reguläre Datei oder symbolische Verknüpfung" +msgid "no merge given, only parents." +msgstr "kein Merge gegeben, nur Eltern." + #, c-format msgid "invalid option: %s" msgstr "Ungültige Option: %s" @@ -5675,13 +5687,13 @@ msgstr "Ausgaben unterdrücken; nur git_env_*() Werte als Exit-Code verwenden" #, c-format msgid "option `--default' expects a boolean value with `--type=bool`, not `%s`" msgstr "" -"Option `--default' erwartet einen booleschen Wert bei `--type=bool`, nicht `" -"%s`" +"Option `--default' erwartet einen booleschen Wert bei `--type=bool`, nicht " +"`%s`" #, c-format msgid "" -"option `--default' expects an unsigned long value with `--type=ulong`, not `" -"%s`" +"option `--default' expects an unsigned long value with `--type=ulong`, not " +"`%s`" msgstr "" "Option `--default' erwartet einen vorzeichenlosen Long-Wert bei `--" "type=ulong`, nicht `%s`" @@ -6206,8 +6218,8 @@ msgstr "nur Referenzen ausgeben, die diesen Commit enthalten" msgid "print only refs which don't contain the commit" msgstr "nur Referenzen ausgeben, die diesen Commit nicht enthalten" -msgid "git for-each-repo --config=<config> <command-args>" -msgstr "git for-each-repo --config=<Konfiguration> <Befehlsargumente>" +msgid "git for-each-repo --config=<config> [--] <arguments>" +msgstr "git for-each-repo --config=<Konfiguration> [--] <Argumente>" msgid "config" msgstr "Konfiguration" @@ -6378,8 +6390,16 @@ msgstr "non-tree in Cache-Verzeichnis" msgid "%s: invalid sha1 pointer in resolve-undo" msgstr "%s: Ungültiger sha1-Zeiger in resolve-undo" -msgid "git fsck [<options>] [<object>...]" -msgstr "git fsck [<Optionen>] [<Objekt>...]" +msgid "" +"git fsck [--tags] [--root] [--unreachable] [--cache] [--no-reflogs]\n" +" [--[no-]full] [--strict] [--verbose] [--lost-found]\n" +" [--[no-]dangling] [--[no-]progress] [--connectivity-only]\n" +" [--[no-]name-objects] [<object>...]" +msgstr "" +"git fsck [--tags] [--root] [--unreachable] [--cache] [--no-reflogs]\n" +" [--[no-]full] [--strict] [--verbose] [--lost-found]\n" +" [--[no-]dangling] [--[no-]progress] [--connectivity-only]\n" +" [--[no-]name-objects] [<Objekt>...]" msgid "show unreachable objects" msgstr "unerreichbare Objekte anzeigen" @@ -6434,12 +6454,6 @@ msgstr "git fsmonitor--daemon start [<Optionen>]" msgid "git fsmonitor--daemon run [<options>]" msgstr "git fsmonitor--daemon run [<Optionen>]" -msgid "git fsmonitor--daemon stop" -msgstr "git fsmonitor--daemon stop" - -msgid "git fsmonitor--daemon status" -msgstr "git fsmonitor--daemon status" - #, c-format msgid "value of '%s' out of range: %d" msgstr "Wert von '%s' außerhalb des Bereichs: %d" @@ -6689,8 +6703,20 @@ msgid "use at most one of --auto and --schedule=<frequency>" msgstr "" "nutzen Sie höchstens eine der Optionen --auto oder --schedule=<Häufigkeit>" -msgid "failed to run 'git config'" -msgstr "Fehler beim Ausführen von 'git config'" +#, c-format +msgid "unable to add '%s' value of '%s'" +msgstr "Wert '%s' von '%s' kann nicht hinzugefügt werden" + +msgid "return success even if repository was not registered" +msgstr "Erfolg zurückgeben, auch wenn das Repository nicht registriert wurde" + +#, c-format +msgid "unable to unset '%s' value of '%s'" +msgstr "Wert '%s' von '%s' kann nicht zurückgesetzt werden" + +#, c-format +msgid "repository '%s' is not registered" +msgstr "Repository '%s' ist nicht registriert" #, c-format msgid "failed to expand path '%s'" @@ -6988,11 +7014,14 @@ msgid "both --cached and trees are given" msgstr "--cached und \"Tree\"-Objekte angegeben" msgid "" -"git hash-object [-t <type>] [-w] [--path=<file> | --no-filters] [--stdin] " -"[--] <file>..." +"git hash-object [-t <type>] [-w] [--path=<file> | --no-filters]\n" +" [--stdin [--literally]] [--] <file>..." msgstr "" -"git hash-object [-t <Art>] [-w] [--path=<Datei> | --no-filters] [--stdin] " -"[--] <Datei>..." +"git hash-object [-t <Art>] [-w] [--path=<Datei> | --no-filters]\n" +" [--stdin [--literally]] [--] <Datei>..." + +msgid "git hash-object [-t <type>] [-w] --stdin-paths [--no-filters]" +msgstr "git hash-object [-t <Art>] [-w] --stdin-paths [--no-filters]" msgid "object type" msgstr "Art des Objektes" @@ -7422,11 +7451,15 @@ msgid "Initialized empty Git repository in %s%s\n" msgstr "Leeres Git-Repository in %s%s initialisiert\n" msgid "" -"git init [-q | --quiet] [--bare] [--template=<template-directory>] [--" -"shared[=<permissions>]] [<directory>]" +"git init [-q | --quiet] [--bare] [--template=<template-directory>]\n" +" [--separate-git-dir <git-dir>] [--object-format=<format>]\n" +" [-b <branch-name> | --initial-branch=<branch-name>]\n" +" [--shared[=<permissions>]] [<directory>]" msgstr "" -"git init [-q | --quiet] [--bare] [--template=<Vorlagenverzeichnis>] [--" -"shared[=<Berechtigungen>]] [<Verzeichnis>]" +"git init [-q | --quiet] [--bare] [--template=<Vorlagenverzeichnis>]\n" +" [--separate-git-dir <Git-Verzeichnis>] [--object-format=<Format>]\n" +" [-b <Branchname> | --initial-branch=<Branchname>]\n" +" [--shared[=<Berechtigungen>]] [<Verzeichnis>]" msgid "permissions" msgstr "Berechtigungen" @@ -7467,11 +7500,13 @@ msgid "--separate-git-dir incompatible with bare repository" msgstr "--separate-git-dir nicht kompatibel mit Bare-Repository" msgid "" -"git interpret-trailers [--in-place] [--trim-empty] [(--trailer " -"<token>[(=|:)<value>])...] [<file>...]" +"git interpret-trailers [--in-place] [--trim-empty]\n" +" [(--trailer <token>[(=|:)<value>])...]\n" +" [--parse] [<file>...]" msgstr "" -"git interpret-trailers [--in-place] [--trim-empty] [(--trailer " -"<Token>[(=|:)<Wert>])...] [<Datei>...]" +"git interpret-trailers [--in-place] [--trim-empty]\n" +" [(--trailer <Token>[(=|:)<Wert>])...]\n" +" [--parse] [<Datei>...]" msgid "edit files in place" msgstr "vorhandene Dateien direkt bearbeiten" @@ -7963,11 +7998,11 @@ msgstr "" msgid "" "git ls-remote [--heads] [--tags] [--refs] [--upload-pack=<exec>]\n" -" [-q | --quiet] [--exit-code] [--get-url]\n" +" [-q | --quiet] [--exit-code] [--get-url] [--sort=<key>]\n" " [--symref] [<repository> [<refs>...]]" msgstr "" "git ls-remote [--heads] [--tags] [--refs] [--upload-pack=<Programm>]\n" -" [-q | --quiet] [--exit-code] [--get-url]\n" +" [-q | --quiet] [--exit-code] [--get-url] [--sort=<Schlüssel>]\n" " [--symref] [<Repository> [<Referenzen>...]]" msgid "do not print remote URL" @@ -8101,12 +8136,12 @@ msgstr "git merge-base [-a | --all] <Commit> <Commit>..." msgid "git merge-base [-a | --all] --octopus <commit>..." msgstr "git merge-base [-a | --all] --octopus <Commit>..." -msgid "git merge-base --independent <commit>..." -msgstr "git merge-base --independent <Commit>..." - msgid "git merge-base --is-ancestor <commit> <commit>" msgstr "git merge-base --is-ancestor <Commit> <Commit>" +msgid "git merge-base --independent <commit>..." +msgstr "git merge-base --independent <Commit>..." + msgid "git merge-base --fork-point <ref> [<commit>]" msgstr "git merge-base --fork-point <Referenz> [<Commit>]" @@ -8215,9 +8250,21 @@ msgstr "Dateinamen ohne Modi/Oids/Stufen auflisten" msgid "allow merging unrelated histories" msgstr "erlaube das Zusammenführen von nicht zusammenhängenden Historien" +msgid "perform multiple merges, one per line of input" +msgstr "mehrere Merges durchführen, eine pro Eingabezeile" + msgid "--trivial-merge is incompatible with all other options" msgstr "--trivial-merge ist mit allen anderen Optionen inkompatibel" +#, c-format +msgid "malformed input line: '%s'." +msgstr "Fehlerhafte Eingabezeile: '%s'." + +#, c-format +msgid "merging cannot continue; got unclean result of %d" +msgstr "" +"Merge kann nicht fortgesetzt werden; unsauberes Ergebnis von %d erhalten" + msgid "git merge [<options>] [<commit>...]" msgstr "git merge [<Optionen>] [<Commit>...]" @@ -8849,10 +8896,6 @@ msgid "cannot read note data from non-blob object '%s'." msgstr "Kann Notiz-Daten nicht von Nicht-Blob Objekt '%s' lesen." #, c-format -msgid "malformed input line: '%s'." -msgstr "Fehlerhafte Eingabezeile: '%s'." - -#, c-format msgid "failed to copy notes from '%s' to '%s'" msgstr "Fehler beim Kopieren der Notizen von '%s' nach '%s'" @@ -9049,16 +9092,14 @@ msgstr "Notizen von <Notiz-Referenz> verwenden" msgid "unknown subcommand: `%s'" msgstr "unbekannter Unterbefehl: `%s'" -msgid "" -"git pack-objects --stdout [<options>...] [< <ref-list> | < <object-list>]" +msgid "git pack-objects --stdout [<options>] [< <ref-list> | < <object-list>]" msgstr "" -"git pack-objects --stdout [<Optionen>...] [< <Referenzliste> | < " -"<Objektliste>]" +"git pack-objects --stdout [<Optionen>] [< <Referenzliste> | < <Objektliste>]" msgid "" -"git pack-objects [<options>...] <base-name> [< <ref-list> | < <object-list>]" +"git pack-objects [<options>] <base-name> [< <ref-list> | < <object-list>]" msgstr "" -"git pack-objects [<Optionen>...] <Basis-Name> [< <Referenzliste> | < " +"git pack-objects [<Optionen>] <Basis-Name> [< <Referenzliste> | < " "<Objektliste>]" #, c-format @@ -9454,8 +9495,8 @@ msgstr "" "Sie es immer noch verwenden, indem Sie eine E-Mail an\n" "<git@vger.kernel.org> senden. Danke.\n" -msgid "git pack-refs [<options>]" -msgstr "git pack-refs [<Optionen>]" +msgid "git pack-refs [--all] [--no-prune]" +msgstr "git pack-refs [--all] [--no-prune]" msgid "pack everything" msgstr "alles packen" @@ -9463,6 +9504,18 @@ msgstr "alles packen" msgid "prune loose refs (default)" msgstr "lose Referenzen entfernen (Standard)" +msgid "git patch-id [--stable | --unstable | --verbatim]" +msgstr "git patch-id [--stable | --unstable | --verbatim]" + +msgid "use the unstable patch-id algorithm" +msgstr "den instabilen Patch-ID-Algorithmus verwenden" + +msgid "use the stable patch-id algorithm" +msgstr "den stabilen Patch-ID-Algorithmus verwenden" + +msgid "don't strip whitespace from the patch" +msgstr "keine Leerzeichen aus dem Patch entfernen" + msgid "git prune [-n] [-v] [--progress] [--expire <time>] [--] [<head>...]" msgstr "git prune [-n] [-v] [--progress] [--expire <Zeit>] [--] [<Branch>...]" @@ -9690,13 +9743,12 @@ msgstr "" msgid "" "\n" -"To avoid automatically configuring upstream branches when their name\n" -"doesn't match the local branch, see option 'simple' of branch." -"autoSetupMerge\n" +"To avoid automatically configuring an upstream branch when its name\n" +"won't match the local branch, see option 'simple' of branch.autoSetupMerge\n" "in 'git help config'.\n" msgstr "" "\n" -"Um das automatische Konfigurieren von Upstream-Branches zu verhindern,\n" +"Um das automatische Konfigurieren eines Upstream-Branches zu verhindern,\n" "wenn deren Namen nicht mit dem lokalen Branch übereinstimmen, siehe\n" "Option 'simple' bei branch.autoSetupMerge in 'git help config'.\n" @@ -9861,6 +9913,13 @@ msgstr "Push nach %s\n" msgid "failed to push some refs to '%s'" msgstr "Fehler beim Versenden einiger Referenzen nach '%s'" +msgid "" +"recursing into submodule with push.recurseSubmodules=only; using on-demand " +"instead" +msgstr "" +"Rekursion in Submodule mit push.recurseSubmodules=only; stattdessen " +"Verwendung von on-demand" + #, c-format msgid "invalid value for '%s'" msgstr "ungültiger Wert für '%s'" @@ -9998,13 +10057,16 @@ msgid "need two commit ranges" msgstr "Benötige zwei Commit-Bereiche." msgid "" -"git read-tree [(-m [--trivial] [--aggressive] | --reset | --prefix=<prefix>) " -"[-u | -i]] [--no-sparse-checkout] [--index-output=<file>] (--empty | <tree-" -"ish1> [<tree-ish2> [<tree-ish3>]])" +"git read-tree [(-m [--trivial] [--aggressive] | --reset | --" +"prefix=<prefix>)\n" +" [-u | -i]] [--index-output=<file>] [--no-sparse-checkout]\n" +" (--empty | <tree-ish1> [<tree-ish2> [<tree-ish3>]])" msgstr "" -"git read-tree [(-m [--trivial] [--aggressive] | --reset | --prefix=<Präfix>) " -"[-u | -i]] [--no-sparse-checkout] [--index-output=<Datei>] (--empty | " -"<Commit-Referenz1> [<Commit-Referenz2> [<Commit-Referenz3>]])" +"git read-tree [(-m [--trivial] [--aggressive] | --reset | --" +"prefix=<Präfix>)\n" +" [-u | -i]] [--index-output=<Datei>] [--no-sparse-checkout]\n" +" (--empty | <Commit-Referenz1> [<Commit-Referenz2> [<Commit-" +"Referenz3>]])" msgid "write resulting index to <file>" msgstr "resultierenden Index nach <Datei> schreiben" @@ -10095,8 +10157,8 @@ msgid "%s requires the merge backend" msgstr "%s erfordert das Merge-Backend" #, c-format -msgid "could not get 'onto': '%s'" -msgstr "Konnte 'onto' nicht bestimmen: '%s'" +msgid "invalid onto: '%s'" +msgstr "ungültig auf: '%s'" #, c-format msgid "invalid orig-head: '%s'" @@ -10150,8 +10212,8 @@ msgstr "Konnte nicht zu %s wechseln." #, c-format msgid "" -"unrecognized empty type '%s'; valid values are \"drop\", \"keep\", and \"ask" -"\"." +"unrecognized empty type '%s'; valid values are \"drop\", \"keep\", and " +"\"ask\"." msgstr "" "nicht erkannter leerer Typ '%s'; gültige Werte sind \"drop\", \"keep\", und " "\"ask\"." @@ -10415,8 +10477,8 @@ msgstr "Branch/Commit '%s' nicht gefunden" msgid "No such ref: %s" msgstr "Referenz nicht gefunden: %s" -msgid "Could not resolve HEAD to a revision" -msgstr "Konnte HEAD zu keinem Commit auflösen." +msgid "Could not resolve HEAD to a commit" +msgstr "HEAD konnte nicht in einen Commit aufgelöst werden" #, c-format msgid "'%s': need exactly one merge base with branch" @@ -11094,6 +11156,10 @@ msgstr "konnte temporäre Datei '%s' nicht zum Schreiben öffnen" msgid "could not close refs snapshot tempfile" msgstr "konnte temporäre Referenzen-Snapshot-Datei nicht schließen" +#, c-format +msgid "could not remove stale bitmap: %s" +msgstr "konnte veraltete Bitmap nicht entfernen: %s" + msgid "pack everything in a single pack" msgstr "alles in eine einzige Pack-Datei packen" @@ -11169,6 +11235,9 @@ msgstr "eine geometrische Progression mit Faktor <N> finden" msgid "write a multi-pack index of the resulting packs" msgstr "ein Multi-Pack-Index des resultierenden Pakets schreiben" +msgid "pack prefix to store a pack containing pruned objects" +msgstr "pack-Präfix zum Speichern eines Pakets mit gelöschten Objekten" + msgid "cannot delete packs in a precious-objects repo" msgstr "kann Pack-Dateien in precious-objects Repository nicht löschen" @@ -11180,8 +11249,12 @@ msgid "pack prefix %s does not begin with objdir %s" msgstr "Pack-Präfix %s fängt nicht mit objdir %s an" #, c-format -msgid "missing required file: %s" -msgstr "benötigte Datei fehlt: %s" +msgid "renaming pack to '%s' failed" +msgstr "Umbenennung des Pakets in '%s' fehlgeschlagen" + +#, c-format +msgid "pack-objects did not write a '%s' file for pack %s-%s" +msgstr "pack-objects hat keine '%s' Datei für Paket %s-%s geschrieben" #, c-format msgid "could not unlink: %s" @@ -11376,8 +11449,11 @@ msgstr "--convert-graft-file erwartet keine Argumente" msgid "only one pattern can be given with -l" msgstr "Mit -l kann nur ein Muster angegeben werden" -msgid "git rerere [clear | forget <path>... | status | remaining | diff | gc]" -msgstr "git rerere [clean | forget <Pfad>... | status | remaining | diff | gc]" +msgid "" +"git rerere [clear | forget <pathspec>... | diff | status | remaining | gc]" +msgstr "" +"git rerere [clear | forget <Pfadspezifikation>... | diff | status | " +"remaining | gc]" msgid "register clean resolutions in index" msgstr "saubere Auflösungen im Index registrieren" @@ -11584,6 +11660,15 @@ msgstr "--prefix benötigt ein Argument" msgid "unknown mode for --abbrev-ref: %s" msgstr "unbekannter Modus für --abbrev-ref: %s" +msgid "--exclude-hidden cannot be used together with --branches" +msgstr "--exclude-hidden kann nicht zusammen mit --branches verwendet werden" + +msgid "--exclude-hidden cannot be used together with --tags" +msgstr "--exclude-hidden kann nicht zusammen mit --tags verwendet werden" + +msgid "--exclude-hidden cannot be used together with --remotes" +msgstr "--exclude-hidden kann nicht zusammen mit --remotes verwendet werden" + msgid "this operation must be run in a work tree" msgstr "Diese Operation muss in einem Arbeitsverzeichnis ausgeführt werden." @@ -11591,17 +11676,26 @@ msgstr "Diese Operation muss in einem Arbeitsverzeichnis ausgeführt werden." msgid "unknown mode for --show-object-format: %s" msgstr "unbekannter Modus für --show-object-format: %s" -msgid "git revert [<options>] <commit-ish>..." -msgstr "git revert [<Optionen>] <Commit-Angabe>..." +msgid "" +"git revert [--[no-]edit] [-n] [-m <parent-number>] [-s] [-S[<keyid>]] " +"<commit>..." +msgstr "" +"git revert [--[no-]edit] [-n] [-m <Nummer des Elterncommits>] [-s] [-S[<Key-" +"ID>]] <Commit>…" -msgid "git revert <subcommand>" -msgstr "git revert <Unterbefehl>" +msgid "git revert (--continue | --skip | --abort | --quit)" +msgstr "git revert (--continue | --skip | --abort | --quit)" -msgid "git cherry-pick [<options>] <commit-ish>..." -msgstr "git cherry-pick [<Optionen>] <Commit-Angabe>..." +msgid "" +"git cherry-pick [--edit] [-n] [-m <parent-number>] [-s] [-x] [--ff]\n" +" [-S[<keyid>]] <commit>..." +msgstr "" +"git cherry-pick [--edit] [-n] [-m <Nummer des Elterncommits>] [-s] [-x] [--" +"ff]\n" +" [-S[<Key-ID>]] <Commit>…" -msgid "git cherry-pick <subcommand>" -msgstr "git cherry-pick <Unterbefehl>" +msgid "git cherry-pick (--continue | --skip | --abort | --quit)" +msgstr "git cherry-pick (--continue | --skip | --abort | --quit)" #, c-format msgid "option `%s' expects a number greater than zero" @@ -11662,8 +11756,14 @@ msgstr "\"revert\" fehlgeschlagen" msgid "cherry-pick failed" msgstr "\"cherry-pick\" fehlgeschlagen" -msgid "git rm [<options>] [--] <file>..." -msgstr "git rm [<Optionen>] [--] <Datei>..." +msgid "" +"git rm [-f | --force] [-n] [-r] [--cached] [--ignore-unmatch]\n" +" [--quiet] [--pathspec-from-file=<file> [--pathspec-file-nul]]\n" +" [--] [<pathspec>...]" +msgstr "" +"git rm [-f | --force] [-n] [-r] [--cached] [--ignore-unmatch]\n" +" [--quiet] [--pathspec-from-file=<Datei> [--pathspec-file-nul]]\n" +" [--] [<Pfadspezifikation>...]" msgid "" "the following file has staged content different from both the\n" @@ -11741,11 +11841,13 @@ msgid "" "git send-pack [--mirror] [--dry-run] [--force]\n" " [--receive-pack=<git-receive-pack>]\n" " [--verbose] [--thin] [--atomic]\n" +" [--[no-]signed | --signed=(true|false|if-asked)]\n" " [<host>:]<directory> (--all | <ref>...)" msgstr "" "git send-pack [--mirror] [--dry-run] [--force]\n" " [--receive-pack=<git-receive-pack>]\n" " [--verbose] [--thin] [--atomic]\n" +" [--[no-]signed | --signed=(true|false|if-asked)]\n" " [<Host>:]<Verzeichnis> (--all | <Referenz>...)" msgid "remote name" @@ -11769,9 +11871,9 @@ msgstr "git log --pretty=short | git shortlog [<Optionen>]" msgid "using multiple --group options with stdin is not supported" msgstr "mehrere Optionen --group mit Standard-Eingabe wird nicht unterstützt" -msgid "using --group=trailer with stdin is not supported" -msgstr "" -"Nutzung von --group=trailer mit Standard-Eingabe wird nicht unterstützt" +#, c-format +msgid "using %s with stdin is not supported" +msgstr "die Verwendung von %s mit stdin wird nicht unterstützt" #, c-format msgid "unknown group type: %s" @@ -11808,12 +11910,14 @@ msgid "" "git show-branch [-a | --all] [-r | --remotes] [--topo-order | --date-order]\n" " [--current] [--color[=<when>] | --no-color] [--sparse]\n" " [--more=<n> | --list | --independent | --merge-base]\n" -" [--no-name | --sha1-name] [--topics] [(<rev> | <glob>)...]" +" [--no-name | --sha1-name] [--topics]\n" +" [(<rev> | <glob>)...]" msgstr "" "git show-branch [-a | --all] [-r | --remotes] [--topo-order | --date-order]\n" -" [--current] [--color[=<Wann>] | --no-color] [--sparse]\n" +" [--current] [--color[=<wann>] | --no-color] [--sparse]\n" " [--more=<n> | --list | --independent | --merge-base]\n" -" [--no-name | --sha1-name] [--topics] [(<Commit> | <glob>)...]" +" [--no-name | --sha1-name] [--topics]\n" +" [(<Commit> | <Glob>)...]" msgid "git show-branch (-g | --reflog)[=<n>[,<base>]] [--list] [<ref>]" msgstr "git show-branch (-g | --reflog)[=<n>[,<Basis>]] [--list] [<Referenz>]" @@ -11914,11 +12018,13 @@ msgid "Unknown hash algorithm" msgstr "Unbekannter Hash-Algorithmus" msgid "" -"git show-ref [-q | --quiet] [--verify] [--head] [-d | --dereference] [-s | --" -"hash[=<n>]] [--abbrev[=<n>]] [--tags] [--heads] [--] [<pattern>...]" +"git show-ref [-q | --quiet] [--verify] [--head] [-d | --dereference]\n" +" [-s | --hash[=<n>]] [--abbrev[=<n>]] [--tags]\n" +" [--heads] [--] [<pattern>...]" msgstr "" -"git show-ref [-q | --quiet] [--verify] [--head] [-d | --dereference] [-s | --" -"hash[=<n>]] [--abbrev[=<n>]] [--tags] [--heads] [--] [<Muster>...] " +"git show-ref [-q | --quiet] [--verify] [--head] [-d | --dereference]\n" +" [-s | --hash[=<n>]] [--abbrev[=<n>]] [--tags]\n" +" [--heads] [--] [<Muster>...]" msgid "git show-ref --exclude-existing[=<pattern>]" msgstr "git show-ref --exclude-existing[=<Muster>]" @@ -11951,8 +12057,11 @@ msgstr "" "Referenzen von der Standard-Eingabe anzeigen, die sich nicht im lokalen " "Repository befinden" -msgid "git sparse-checkout (init|list|set|add|reapply|disable) <options>" -msgstr "git sparse-checkout (init|list|set|add|reapply|disable) <Optionen>" +msgid "" +"git sparse-checkout (init | list | set | add | reapply | disable) [<options>]" +msgstr "" +"git sparse-checkout (init | list | set | add | reapply | disable) " +"[<Optionen>]" msgid "this worktree is not sparse" msgstr "dieses Arbeitsverzeichnis ist nicht partiell" @@ -12083,67 +12192,58 @@ msgstr "" msgid "error while refreshing working directory" msgstr "Fehler während der Aktualisierung des Arbeitsverzeichnisses." -msgid "git stash list [<options>]" -msgstr "git stash list [<Optionen>]" +msgid "git stash list [<log-options>]" +msgstr "git stash list [<log-Optionen>]" + +msgid "" +"git stash show [-u | --include-untracked | --only-untracked] [<diff-" +"options>] [<stash>]" +msgstr "" +"git stash show [-u | --include-untracked | --only-untracked] [<Diff-" +"Optionen>] [<Stash>]" -msgid "git stash show [<options>] [<stash>]" -msgstr "git stash show [<Optionen>] [<Stash>]" +msgid "git stash drop [-q | --quiet] [<stash>]" +msgstr "git stash drop [-q | --quiet] [<Stash>]" -msgid "git stash drop [-q|--quiet] [<stash>]" -msgstr "git stash drop [-q|--quiet] [<Stash>]" +msgid "git stash pop [--index] [-q | --quiet] [<stash>]" +msgstr "git stash pop [--index] [-q | --quiet] [<Stash>]" -msgid "git stash ( pop | apply ) [--index] [-q|--quiet] [<stash>]" -msgstr "git stash ( pop | apply ) [--index] [-q|--quiet] [<Stash>]" +msgid "git stash apply [--index] [-q | --quiet] [<stash>]" +msgstr "git stash apply [--index] [-q | --quiet] [<Stash>]" msgid "git stash branch <branchname> [<stash>]" msgstr "git stash branch <Branch> [<Stash>]" +msgid "git stash store [(-m | --message) <message>] [-q | --quiet] <commit>" +msgstr "" +"git stash store [(-m | --message) <Beschreibung>] [-q | --quiet] <Commit>" + msgid "" -"git stash [push [-p|--patch] [-S|--staged] [-k|--[no-]keep-index] [-q|--" -"quiet]\n" -" [-u|--include-untracked] [-a|--all] [-m|--message <message>]\n" +"git stash [push [-p | --patch] [-S | --staged] [-k | --[no-]keep-index] [-q " +"| --quiet]\n" +" [-u | --include-untracked] [-a | --all] [(-m | --message) " +"<message>]\n" " [--pathspec-from-file=<file> [--pathspec-file-nul]]\n" " [--] [<pathspec>...]]" msgstr "" -"git stash [push [-p|--patch] [-S|--staged] [-k|--[no-]keep-index] [-q|--" -"quiet]\n" -" [-u|--include-untracked] [-a|--all] [-m|--message <Nachricht>]\n" +"git stash [push [-p | --patch] [-S | --staged] [-k | --[no-]keep-index] [-q " +"| --quiet]\n" +" [-u | --include-untracked] [-a | --all] [(-m | --message) " +"<Nachricht>]\n" " [--pathspec-from-file=<Datei> [--pathspec-file-nul]]\n" " [--] [<Pfadspezifikation>...]]" msgid "" -"git stash save [-p|--patch] [-S|--staged] [-k|--[no-]keep-index] [-q|--" -"quiet]\n" -" [-u|--include-untracked] [-a|--all] [<message>]" +"git stash save [-p | --patch] [-S | --staged] [-k | --[no-]keep-index] [-q | " +"--quiet]\n" +" [-u | --include-untracked] [-a | --all] [<message>]" msgstr "" -"git stash save [-p|--patch] [-S|--staged] [-k|--[no-]keep-index] [-q|--" -"quiet]\n" -" [-u|--include-untracked] [-a|--all] [<Nachricht>]" - -msgid "git stash pop [--index] [-q|--quiet] [<stash>]" -msgstr "git stash pop [--index] [-q|--quiet] [<Stash>]" +"git stash save [-p | --patch] [-S | --staged] [-k | --[no-]keep-index] [-q | " +"--quiet]\n" +" [-u | --include-untracked] [-a | --all] [<Beschreibung>]" -msgid "git stash apply [--index] [-q|--quiet] [<stash>]" -msgstr "git stash apply [--index] [-q|--quiet] [<Stash>]" - -msgid "git stash store [-m|--message <message>] [-q|--quiet] <commit>" -msgstr "git stash store [-m|--message <Nachricht>] [-q|--quiet] <Commit>" - -msgid "" -"git stash [push [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]\n" -" [-u|--include-untracked] [-a|--all] [-m|--message <message>]\n" -" [--] [<pathspec>...]]" -msgstr "" -"git stash [push [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]\n" -" [-u|--include-untracked] [-a|--all] [-m|--message <Nachricht>]\n" -" [--] [<Pfadspezifikation>...]]" - -msgid "" -"git stash save [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]\n" -" [-u|--include-untracked] [-a|--all] [<message>]" -msgstr "" -"git stash save [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]\n" -" [-u|--include-untracked] [-a|--all] [<Nachricht>]" +msgid "git stash create [<message>]" +msgstr "git stash create [<Beschreibung>]" #, c-format msgid "'%s' is not a stash-like commit" @@ -12721,9 +12821,6 @@ msgstr "Submodule rekursiv durchlaufen" msgid "don't fetch new objects from the remote site" msgstr "keine neuen Objekte von Remote abrufen" -msgid "path into the working tree" -msgstr "Pfad zum Arbeitsverzeichnis" - msgid "use the 'checkout' update strategy (default)" msgstr "die Aktualisierungsstrategie \"checkout\" verwenden (Standard)" @@ -12764,29 +12861,9 @@ msgstr "" "shallow] [--reference <Repository>] [--recursive] [--[no-]single-branch] " "[--] [<Pfad>...]" -msgid "recurse into submodules" -msgstr "Rekursion in Submodule durchführen" - msgid "git submodule absorbgitdirs [<options>] [<path>...]" msgstr "git submodule absorbgitdirs [<Optionen>] [<Pfad>...]" -msgid "check if it is safe to write to the .gitmodules file" -msgstr "prüfen, ob es sicher ist, in die Datei .gitmodules zu schreiben" - -msgid "unset the config in the .gitmodules file" -msgstr "Konfiguration in der .gitmodules-Datei entfernen" - -msgid "git submodule--helper config <name> [<value>]" -msgstr "git submodule--helper config <name> [<Wert>]" - -msgid "git submodule--helper config --unset <name>" -msgstr "git submodule--helper config --unset <Name>" - -msgid "please make sure that the .gitmodules file is in the working tree" -msgstr "" -"Bitte stellen Sie sicher, dass sich die Datei .gitmodules im " -"Arbeitsverzeichnis befindet." - msgid "suppress output for setting url of a submodule" msgstr "Ausgaben beim Setzen der URL eines Submoduls unterdrücken" @@ -12867,6 +12944,11 @@ msgstr "Reaktiviere lokales Git-Verzeichnis für Submodul '%s'\n" msgid "unable to checkout submodule '%s'" msgstr "kann Submodul '%s' nicht auschecken" +msgid "please make sure that the .gitmodules file is in the working tree" +msgstr "" +"Bitte stellen Sie sicher, dass sich die Datei .gitmodules im " +"Arbeitsverzeichnis befindet." + #, c-format msgid "Failed to add submodule '%s'" msgstr "Hinzufügen von Submodul '%s' fehlgeschlagen" @@ -12919,19 +13001,21 @@ msgstr "repo URL: '%s' muss absolut sein oder mit ./|../ beginnen" msgid "'%s' is not a valid submodule name" msgstr "'%s' ist kein gültiger Submodul-Name" +msgid "git submodule--helper <command>" +msgstr "git submodule--helper <Befehl>" + #, c-format msgid "%s doesn't support --super-prefix" msgstr "%s unterstützt kein --super-prefix" -#, c-format -msgid "'%s' is not a valid submodule--helper subcommand" -msgstr "'%s' ist kein gültiger Unterbefehl von submodule--helper" +msgid "git symbolic-ref [-m <reason>] <name> <ref>" +msgstr "git symbolic-ref [-m <Grund>] <Name> <Referenz>" -msgid "git symbolic-ref [<options>] <name> [<ref>]" -msgstr "git symbolic-ref [<Optionen>] <Name> [<Referenz>]" +msgid "git symbolic-ref [-q] [--short] [--no-recurse] <name>" +msgstr "git symbolic-ref [-q] [--short] [--no-recurse] <Name>" -msgid "git symbolic-ref -d [-q] <name>" -msgstr "git symbolic-ref -d [-q] <Name>" +msgid "git symbolic-ref --delete [-q] <name>" +msgstr "git symbolic-ref --delete [-q] <Name>" msgid "suppress error message for non-symbolic (detached) refs" msgstr "" @@ -12943,6 +13027,9 @@ msgstr "symbolische Referenzen löschen" msgid "shorten ref output" msgstr "verkürzte Ausgabe der Referenzen" +msgid "recursively dereference (default)" +msgstr "rekursives Dereferenzieren (Standard)" + msgid "reason" msgstr "Grund" @@ -12950,25 +13037,25 @@ msgid "reason of the update" msgstr "Grund für die Aktualisierung" msgid "" -"git tag [-a | -s | -u <key-id>] [-f] [-m <msg> | -F <file>]\n" -" <tagname> [<head>]" +"git tag [-a | -s | -u <key-id>] [-f] [-m <msg> | -F <file>] [-e]\n" +" <tagname> [<commit> | <object>]" msgstr "" -"git tag [-a | -s | -u <Schlüssel-ID>] [-f] [-m <Beschreibung> | -F <Datei>]\n" -" <Tagname> [<Commit>]" +"git tag [-a | -s | -u <Key-ID>] [-f] [-m <Beschreibung> | -F <Datei>] [-e]\n" +" <Tagname> [<Commit> | <Objekt>]" msgid "git tag -d <tagname>..." msgstr "git tag -d <Tagname>..." msgid "" -"git tag -l [-n[<num>]] [--contains <commit>] [--no-contains <commit>] [--" -"points-at <object>]\n" -" [--format=<format>] [--merged <commit>] [--no-merged <commit>] " -"[<pattern>...]" +"git tag [-n[<num>]] -l [--contains <commit>] [--no-contains <commit>]\n" +" [--points-at <object>] [--column[=<options>] | --no-column]\n" +" [--create-reflog] [--sort=<key>] [--format=<format>]\n" +" [--merged <commit>] [--no-merged <commit>] [<pattern>...]" msgstr "" -"git tag -l [-n[<Nummer>]] [--contains <Commit>] [--no-contains <Commit>] [--" -"points-at <Objekt>]\n" -" [--format=<format>] [--merged <Commit>] [--no-merged <Commit>] " -"[<Muster>...]" +"git tag [-n[<Nummer>]] -l [--contains <Commit>] [--no-contains <Commit>]\n" +" [--points-at <Objekt>] [--column[=<Optionen>] | --no-column]\n" +" [--create-reflog] [--sort=<Schlüssel>] [--format=<Format>]\n" +" [--merged <Commit>] [--no-merged <Commit>] [<Muster>...]" msgid "git tag -v [--format=<format>] <tagname>..." msgstr "git tag -v [--format=<Format>] <Tagname>..." @@ -13367,8 +13454,12 @@ msgstr "Aktualisierungen von der Standard-Eingabe lesen" msgid "update the info files from scratch" msgstr "die Informationsdateien von Grund auf aktualisieren" -msgid "git upload-pack [<options>] <dir>" -msgstr "git upload-pack [<Optionen>] <Verzeichnis>" +msgid "" +"git-upload-pack [--[no-]strict] [--timeout=<n>] [--stateless-rpc]\n" +" [--advertise-refs] <directory>" +msgstr "" +"git-upload-pack [--[no-]strict] [--timeout=<n>] [--stateless-rpc]\n" +" [--advertise-refs] <directory>" msgid "quit after a single request/response exchange" msgstr "nach einem einzigen Request/Response-Austausch beenden" @@ -13384,8 +13475,8 @@ msgstr "" msgid "interrupt transfer after <n> seconds of inactivity" msgstr "Übertragung nach <n> Sekunden Inaktivität unterbrechen" -msgid "git verify-commit [-v | --verbose] <commit>..." -msgstr "git verify-commit [-v | --verbose] <Commit>..." +msgid "git verify-commit [-v | --verbose] [--raw] <commit>..." +msgstr "git verify-commit [-v | --verbose] [--raw] <Commit>..." msgid "print commit contents" msgstr "Commit-Inhalte ausgeben" @@ -13393,8 +13484,9 @@ msgstr "Commit-Inhalte ausgeben" msgid "print raw gpg status output" msgstr "unbearbeitete Ausgabe des Status von gpg ausgeben" -msgid "git verify-pack [-v | --verbose] [-s | --stat-only] <pack>..." -msgstr "git verify-pack [-v | --verbose] [-s | --stat-only] <Paket>..." +msgid "git verify-pack [-v | --verbose] [-s | --stat-only] [--] <pack>.idx..." +msgstr "" +"git verify-pack [-v | --verbose] [-s | --stat-only] [--] <Paket>.idx..." msgid "verbose" msgstr "erweiterte Ausgaben" @@ -13402,35 +13494,40 @@ msgstr "erweiterte Ausgaben" msgid "show statistics only" msgstr "nur Statistiken anzeigen" -msgid "git verify-tag [-v | --verbose] [--format=<format>] <tag>..." -msgstr "git verify-tag [-v | --verbose] [--format=<Format>] <Tag>..." +msgid "git verify-tag [-v | --verbose] [--format=<format>] [--raw] <tag>..." +msgstr "git verify-tag [-v | --verbose] [--format=<Format>] [--raw] <Tag>..." msgid "print tag contents" msgstr "Tag-Inhalte ausgeben" -msgid "git worktree add [<options>] <path> [<commit-ish>]" -msgstr "git worktree add [<Optionen>] <Pfad> [<Commit-Angabe>]" +msgid "" +"git worktree add [-f] [--detach] [--checkout] [--lock [--reason <string>]]\n" +" [-b <new-branch>] <path> [<commit-ish>]" +msgstr "" +"git worktree add [-f] [--detach] [--checkout] [--lock [--reason " +"<Zeichenkette>]]\n" +" [-b <neuer-Branch>] <Pfad> [<Commit-Angabe>]" -msgid "git worktree list [<options>]" -msgstr "git worktree list [<Optionen>]" +msgid "git worktree list [-v | --porcelain [-z]]" +msgstr "git worktree list [-v | --porcelain [-z]]" -msgid "git worktree lock [<options>] <path>" -msgstr "git worktree lock [<Optionen>] <Pfad>" +msgid "git worktree lock [--reason <string>] <worktree>" +msgstr "git worktree lock [--reason <Zeichenkette>] <Arbeitsverzeichnis>" msgid "git worktree move <worktree> <new-path>" msgstr "git worktree move <Arbeitsverzeichnis> <neuer-Pfad>" -msgid "git worktree prune [<options>]" -msgstr "git worktree prune [<Optionen>]" +msgid "git worktree prune [-n] [-v] [--expire <expire>]" +msgstr "git worktree prune [-n] [-v] [--expire <Zeit>]" -msgid "git worktree remove [<options>] <worktree>" -msgstr "git worktree remove [<Optionen>] <Arbeitsverzeichnis>" +msgid "git worktree remove [-f] <worktree>" +msgstr "git worktree remove [-f] <Arbeitsverzeichnis>" msgid "git worktree repair [<path>...]" msgstr "git worktree repair [<Pfad>...]" -msgid "git worktree unlock <path>" -msgstr "git worktree unlock <Pfad>" +msgid "git worktree unlock <worktree>" +msgstr "git worktree unlock <Arbeitsverzeichnis>" #, c-format msgid "Removing %s/%s: %s" @@ -13681,6 +13778,10 @@ msgstr "nur nützlich für Fehlersuche" msgid "core.fsyncMethod = batch is unsupported on this platform" msgstr "core.fsyncMethod = batch wird auf dieser Plattform nicht unterstützt" +#, c-format +msgid "bundle list at '%s' has no mode" +msgstr "Paketliste bei '%s' hat keinen Modus" + msgid "failed to create temporary file" msgstr "temporäre Datei kann nicht erstellt werden" @@ -13688,16 +13789,29 @@ msgid "insufficient capabilities" msgstr "unzureichende Fähigkeiten" #, c-format +msgid "unrecognized bundle mode from URI '%s'" +msgstr "nicht erkannter Bundle-Modus von URI '%s'" + +#, c-format +msgid "exceeded bundle URI recursion limit (%d)" +msgstr "Rekursionsgrenze für Bundle-URI überschritten (%d)" + +#, c-format msgid "failed to download bundle from URI '%s'" msgstr "Download des Bundles von URI '%s' fehlgeschlagen" #, c-format -msgid "file at URI '%s' is not a bundle" -msgstr "Datei unter URI '%s' ist kein Bundle" +msgid "file at URI '%s' is not a bundle or bundle list" +msgstr "Datei unter URI '%s' ist kein Paket oder keine Paketliste" -#, c-format -msgid "failed to unbundle bundle from URI '%s'" -msgstr "Bundle von URI '%s' konnte nicht entpackt werden" +msgid "bundle-uri: got an empty line" +msgstr "bundle-uri: erhielt eine leere Zeile" + +msgid "bundle-uri: line is not of the form 'key=value'" +msgstr "bundle-uri: Zeile hat nicht die Form 'Schlüssel=Wert'" + +msgid "bundle-uri: line has empty key or value" +msgstr "bundle-uri: Zeile hat leeren Schlüssel oder Wert" #, c-format msgid "unrecognized bundle hash algorithm: %s" @@ -14301,8 +14415,8 @@ msgstr "Das Bundle-Dateiformat" msgid "Chunk-based file formats" msgstr "Chunk-basierte Dateiformate" -msgid "Git commit graph format" -msgstr "Git Commit Graph Format" +msgid "Git commit-graph format" +msgstr "Git Commit-Graph Format" msgid "Git index format" msgstr "Git-Index-Format" @@ -14653,6 +14767,10 @@ msgstr "unbehandelter Fall in 'has_worktree_moved': %d" msgid "health thread wait failed [GLE %ld]" msgstr "Warten des health Thread fehlgeschlagen [GLE %ld]" +#, c-format +msgid "Invalid path: %s" +msgstr "Ungültiger Pfad: %s" + msgid "Unable to create FSEventStream." msgstr "Konnte FSEventStream nicht erstellen." @@ -14684,6 +14802,22 @@ msgid "could not read directory changes [GLE %ld]" msgstr "konnte Verzeichnisveränderungen nicht lesen [GLE %ld]" #, c-format +msgid "opendir('%s') failed" +msgstr "opendir('%s') fehlgeschlagen" + +#, c-format +msgid "lstat('%s') failed" +msgstr "lstat('%s') fehlgeschlagen" + +#, c-format +msgid "strbuf_readlink('%s') failed" +msgstr "strbuf_readlink('%s') fehlgeschlagen" + +#, c-format +msgid "closedir('%s') failed" +msgstr "closedir('%s') fehlgeschlagen" + +#, c-format msgid "[GLE %ld] unable to open for read '%ls'" msgstr "[GLE %ld] '%ls' kann nicht zum Lesen geöffnet werden" @@ -16326,9 +16460,11 @@ msgstr "virtuelles Repository '%s' ist inkompatibel mit fsmonitor" #, c-format msgid "" -"repository '%s' is incompatible with fsmonitor due to lack of Unix sockets" +"socket directory '%s' is incompatible with fsmonitor due to lack of Unix " +"sockets support" msgstr "" -"Repository '%s' is inkompatibel mit fsmonitor wegen fehlender Unix sockets" +"Socket-Verzeichnis '%s' ist mit fsmonitor inkompatibel, da es keine Unix-" +"Sockets unterstützt" msgid "" "git [-v | --version] [-h | --help] [-C <path>] [-c <name>=<value>]\n" @@ -16653,8 +16789,8 @@ msgstr[1] "" "\n" "Die ähnlichsten Befehle sind" -msgid "git version [<options>]" -msgstr "git version [<Optionen>]" +msgid "git version [--build-options]" +msgstr "git version [--build-options]" #, c-format msgid "%s: %s - %s" @@ -17272,8 +17408,8 @@ msgstr "" #, c-format msgid "" -"CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s" -"\"->\"%s\" in \"%s\"%s" +"CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename " +"\"%s\"->\"%s\" in \"%s\"%s" msgstr "" "KONFLIKT (umbenennen/umbenennen): Benenne um \"%s\"->\"%s\" in Branch \"%s\" " "und \"%s\"->\"%s\" in Branch \"%s\"%s" @@ -17601,10 +17737,6 @@ msgstr "Konnte alternativen Objektpfad '%s' nicht normalisieren." msgid "%s: ignoring alternate object stores, nesting too deep" msgstr "%s: ignoriere alternative Objektspeicher - Verschachtelung zu tief" -#, c-format -msgid "unable to normalize object directory: %s" -msgstr "Konnte Objektverzeichnis '%s' nicht normalisieren." - msgid "unable to fdopen alternates lockfile" msgstr "Konnte fdopen nicht auf Lock-Datei für \"alternates\" aufrufen." @@ -18450,6 +18582,10 @@ msgstr "" msgid "promisor remote name cannot begin with '/': %s" msgstr "Promisor-Remote-Name kann nicht mit '/' beginnen: %s" +#, c-format +msgid "could not fetch %s from promisor remote" +msgstr "konnte %s nicht von Promisor-Remote abrufen" + msgid "object-info: expected flush after arguments" msgstr "object-info: erwartete Flush nach Argumenten" @@ -19540,6 +19676,13 @@ msgid "failed to find tree of %s" msgstr "Fehler beim Finden des \"Tree\"-Objektes von %s." #, c-format +msgid "unsupported section for hidden refs: %s" +msgstr "nicht unterstützter Abschnitt für versteckte Referenzen: %s" + +msgid "--exclude-hidden= passed more than once" +msgstr "--exclude-hidden= mehr als einmal übergeben" + +#, c-format msgid "resolve-undo records `%s` which is missing" msgstr "resolve-undo zeichnet `%s` auf, das fehlt" @@ -19684,6 +19827,14 @@ msgid "--all or <enlistment>, but not both" msgstr "--all oder <Eintragung>, aber nicht beides" #, c-format +msgid "could not remove stale scalar.repo '%s'" +msgstr "konnte veraltetes scalar.repo '%s' nicht entfernen" + +#, c-format +msgid "removing stale scalar.repo '%s'" +msgstr "entferne veraltetes scalar.repo '%s'" + +#, c-format msgid "git repository gone in '%s'" msgstr "Git-Repository entfernt in '%s'" @@ -20317,16 +20468,16 @@ msgstr "" msgid "illegal label name: '%.*s'" msgstr "unerlaubter Beschriftungsname: '%.*s'" +#, c-format +msgid "could not resolve '%s'" +msgstr "konnte '%s' nicht auflösen" + msgid "writing fake root commit" msgstr "unechten Root-Commit schreiben" msgid "writing squash-onto" msgstr "squash-onto schreiben" -#, c-format -msgid "could not resolve '%s'" -msgstr "konnte '%s' nicht auflösen" - msgid "cannot merge without a current revision" msgstr "kann nicht ohne einen aktuellen Commit mergen" @@ -20936,6 +21087,17 @@ msgstr "ls-tree mit unerwartetem Rückgabewert %d beendet" msgid "failed to lstat '%s'" msgstr "'lstat' für '%s' fehlgeschlagen" +msgid "test-tool cache-tree <options> (control|prime|update)" +msgstr "test-tool cache-tree <Optionen> (control|prime|update)" + +msgid "clear the cache tree before each iteration" +msgstr "das Cache-Verzeichnis vor jeder Iteration löschen" + +msgid "number of entries in the cache tree to invalidate (default 0)" +msgstr "" +"Anzahl der Einträge im Cache-Verzeichnis, die ungültig gemacht werden sollen " +"(Standardwert 0)" + msgid "unhandled options" msgstr "unbehandelte Optionen" @@ -21970,8 +22132,8 @@ msgstr "Sie führen gerade \"cherry-pick\" von Commit %s aus." msgid " (fix conflicts and run \"git cherry-pick --continue\")" msgstr "" -" (beheben Sie die Konflikte und führen Sie dann \"git cherry-pick --continue" -"\" aus)" +" (beheben Sie die Konflikte und führen Sie dann \"git cherry-pick --" +"continue\" aus)" msgid " (run \"git cherry-pick --continue\" to continue)" msgstr " (Führen Sie \"git cherry-pick --continue\" aus, um weiterzumachen)" @@ -48,7 +48,7 @@ # pack | paquet # patches | patchs # pattern | motif -# to prune | éliminer +# to prune | élaguer # to push | pousser # to rebase | rebaser # scheduler | planificateur @@ -78,8 +78,8 @@ msgid "" msgstr "" "Project-Id-Version: git\n" "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n" -"POT-Creation-Date: 2022-09-28 21:43+0200\n" -"PO-Revision-Date: 2022-09-28 21:45+0200\n" +"POT-Creation-Date: 2022-11-30 19:40+0100\n" +"PO-Revision-Date: 2022-11-30 19:42+0100\n" "Last-Translator: Cédric Malard <c.malard-git@valdun.net>\n" "Language-Team: Jean-Noël Avila <jn.avila@free.fr>\n" "Language: fr\n" @@ -841,6 +841,9 @@ msgstr "cmdline se termine par \\" msgid "unclosed quote" msgstr "citation non fermée" +msgid "too many arguments" +msgstr "trop d'arguments" + #, c-format msgid "unrecognized whitespace option '%s'" msgstr "option d'espace non reconnue '%s'" @@ -2633,42 +2636,6 @@ msgstr "" "la bissection a échoué : 'git bisect--helper --bisect-state %s' a retourné " "le code erreur %d" -msgid "reset the bisection state" -msgstr "réinitialiser l'état de la bissection" - -msgid "check whether bad or good terms exist" -msgstr "vérifier si les termes bons ou mauvais existent" - -msgid "print out the bisect terms" -msgstr "afficher les termes de bissection" - -msgid "start the bisect session" -msgstr "démarrer une session de bissection" - -msgid "find the next bisection commit" -msgstr "trouver le prochain commit de bissection" - -msgid "mark the state of ref (or refs)" -msgstr "marquer l'état d'une références (ou plusieurs)" - -msgid "list the bisection steps so far" -msgstr "lister les étapes de bissection jusqu'ici" - -msgid "replay the bisection process from the given file" -msgstr "rejouer le processus de bissection depuis le fichier fourni" - -msgid "skip some commits for checkout" -msgstr "sauter certains commits pour l'extraction" - -msgid "visualize the bisection" -msgstr "visualiser la bissection" - -msgid "use <cmd>... to automatically bisect" -msgstr "utiliser <cmd>... pour bissecter automatiquement" - -msgid "no log for BISECT_WRITE" -msgstr "pas de journal pour BISECT_WRITE" - msgid "--bisect-reset requires either no argument or a commit" msgstr "--bisect-reset supporte soit aucun argument, soit un commit" @@ -2687,6 +2654,9 @@ msgstr "pas de fichier de log donné" msgid "git blame [<options>] [<rev-opts>] [<rev>] [--] <file>" msgstr "git blame [<options>] [<rev-opts>] [<rev>] [--] <fichier>" +msgid "git annotate [<options>] [<rev-opts>] [<rev>] [--] <file>" +msgstr "git annotate [<options>] [<options-de-rev>] [<rev>] [--] <fichier>" + msgid "<rev-opts> are documented in git-rev-list(1)" msgstr "<options-de-révision> sont documentés dans git-rev-list(1)" @@ -2887,9 +2857,6 @@ msgstr "Échec de la mise à jour du fichier de configuration" msgid "cannot use -a with -d" msgstr "impossible d'utiliser -a avec -d" -msgid "Couldn't look up commit object for HEAD" -msgstr "Impossible de rechercher l'objet commit pour HEAD" - #, c-format msgid "Cannot delete branch '%s' checked out at '%s'" msgstr "Impossible de supprimer la branche '%s' extraite dans '%s'" @@ -2928,16 +2895,18 @@ msgstr "La branche %s est en cours de rebasage sur %s" msgid "Branch %s is being bisected at %s" msgstr "La branche %s est en cours de bissection sur %s" -msgid "cannot copy the current branch while not on any." -msgstr "impossible de copier la branche actuelle, il n'y en a pas." - -msgid "cannot rename the current branch while not on any." -msgstr "impossible de renommer la branche actuelle, il n'y en a pas." - #, c-format msgid "Invalid branch name: '%s'" msgstr "Nom de branche invalide : '%s'" +#, c-format +msgid "No commit on branch '%s' yet." +msgstr "Aucun commit sur la branche '%s'." + +#, c-format +msgid "No branch named '%s'." +msgstr "Aucune branche nommée '%s'." + msgid "Branch rename failed" msgstr "Échec de renommage de la branche" @@ -3100,13 +3069,11 @@ msgstr "Impossible de décrire une HEAD détachée" msgid "cannot edit description of more than one branch" msgstr "impossible d'éditer la description de plus d'une branche" -#, c-format -msgid "No commit on branch '%s' yet." -msgstr "Aucun commit sur la branche '%s'." +msgid "cannot copy the current branch while not on any." +msgstr "impossible de copier la branche actuelle, il n'y en a pas." -#, c-format -msgid "No branch named '%s'." -msgstr "Aucune branche nommée '%s'." +msgid "cannot rename the current branch while not on any." +msgstr "impossible de renommer la branche actuelle, il n'y en a pas." msgid "too many branches for a copy operation" msgstr "trop de branches pour une opération de copie" @@ -3176,11 +3143,12 @@ msgid "not run from a git repository - no hooks to show\n" msgstr "lancé hors d'un dépôt git - aucun crochet à montrer\n" msgid "" -"git bugreport [-o|--output-directory <file>] [-s|--suffix <format>] [--" -"diagnose[=<mode>]" +"git bugreport [(-o | --output-directory) <path>] [(-s | --suffix) <format>]\n" +" [--diagnose[=<mode>]]" msgstr "" -"git bugreport [-o|--output-directory <fichier>] [-s|--suffix <format>] [--" -"diagnose[=<mode>]]" +"git bugreport [(-o | --output-directory) <chemin>] [(-s | --suffix) " +"<format>]\n" +" [--diagnose[=<mode>]]" msgid "" "Thank you for filling out a Git bug report!\n" @@ -3255,17 +3223,23 @@ msgstr "impossible d'écrire dans %s" msgid "Created new report at '%s'.\n" msgstr "Nouveau rapport créé à '%s'.\n" -msgid "git bundle create [<options>] <file> <git-rev-list args>" -msgstr "git bundle create [<options>] <fichier> <args git-rev-list>" +msgid "" +"git bundle create [-q | --quiet | --progress | --all-progress] [--all-" +"progress-implied]\n" +" [--version=<version>] <file> <git-rev-list-args>" +msgstr "" +"git bundle create [-q | --quiet | --progress | --all-progress] [--all-" +"progress-implied]\n" +" [--version=<version>] <file> <args-de-git-rev-list>" -msgid "git bundle verify [<options>] <file>" -msgstr "git bundle verify [<options>] <fichier>" +msgid "git bundle verify [-q | --quiet] <file>" +msgstr "git bundle verify [-q | --quiet] <fichier>" msgid "git bundle list-heads <file> [<refname>...]" msgstr "git bundle list-heads <fichier> [<nom-de-ref>...]" -msgid "git bundle unbundle <file> [<refname>...]" -msgstr "git bundle unbundle <fichier> [<nom-de-ref>...]" +msgid "git bundle unbundle [--progress] <file> [<refname>...]" +msgstr "git bundle unbundle [--progress] <fichier> [<nom-de-ref>...]" msgid "do not show progress meter" msgstr "ne pas afficher la barre de progression" @@ -3340,12 +3314,12 @@ msgid "" "git cat-file (--batch | --batch-check | --batch-command) [--batch-all-" "objects]\n" " [--buffer] [--follow-symlinks] [--unordered]\n" -" [--textconv | --filters]" +" [--textconv | --filters] [-z]" msgstr "" "git cat-file (--batch | --batch-check | --batch-command) [--batch-all-" "objects]\n" " [--buffer] [--follow-symlinks] [--unordered]\n" -" [--textconv | --filters]" +" [--textconv | --filters] [-z]" msgid "" "git cat-file (--textconv | --filters)\n" @@ -3456,9 +3430,6 @@ msgstr "<rev> nécessaire avec '%s'" msgid "<object> required with '-%c'" msgstr "<objet> nécessaire avec '-%c'" -msgid "too many arguments" -msgstr "trop d'arguments" - #, c-format msgid "only two arguments allowed in <type> <object> mode, not %d" msgstr "deux arguments seulement permis dans le mode <type> <objet>, pas %d" @@ -4001,9 +3972,11 @@ msgid "use overlay mode" msgstr "utiliser le mode de superposition" msgid "" -"git clean [-d] [-f] [-i] [-n] [-q] [-e <pattern>] [-x | -X] [--] <paths>..." +"git clean [-d] [-f] [-i] [-n] [-q] [-e <pattern>] [-x | -X] [--] " +"[<pathspec>...]" msgstr "" -"git clean [-d] [-f] [-i] [-n] [-q] [-e <motif>] [-x | -X] [--] <chemins>..." +"git clean [-d] [-f] [-i] [-n] [-q] [-e <motif>] [-x | -X] [--] [<spec-de-" +"chemins>...]" #, c-format msgid "Removing %s\n" @@ -4301,6 +4274,10 @@ msgid "failed to start iterator over '%s'" msgstr "échec du démarrage un itérateur sur '%s'" #, c-format +msgid "symlink '%s' exists, refusing to clone with --local" +msgstr "le lien symbolique '%s' existe, refus de cloner avec --local" + +#, c-format msgid "failed to unlink '%s'" msgstr "échec pour délier '%s'" @@ -4366,10 +4343,6 @@ msgstr "Trop d'arguments." msgid "You must specify a repository to clone." msgstr "Vous devez spécifier un dépôt à cloner." -#, c-format -msgid "options '%s' and '%s %s' cannot be used together" -msgstr "les options '%s' et '%s %s' ne peuvent pas être utilisées ensemble" - msgid "" "--bundle-uri is incompatible with --depth, --shallow-since, and --shallow-" "exclude" @@ -4496,18 +4469,24 @@ msgid "--command must be the first argument" msgstr "--command doit être le premier argument" msgid "" -"git commit-graph verify [--object-dir <objdir>] [--shallow] [--[no-]progress]" +"git commit-graph verify [--object-dir <dir>] [--shallow] [--[no-]progress]" msgstr "" -"git commit-graph verify [--object-dir <objdir>] [--shallow] [--[no-]progress]" +"git commit-graph verify [--object-dir <rép>] [--shallow] [--[no-]progress]" msgid "" -"git commit-graph write [--object-dir <objdir>] [--append] [--" -"split[=<strategy>]] [--reachable|--stdin-packs|--stdin-commits] [--changed-" -"paths] [--[no-]max-new-filters <n>] [--[no-]progress] <split options>" +"git commit-graph write [--object-dir <dir>] [--append]\n" +" [--split[=<strategy>]] [--reachable | --stdin-packs | " +"--stdin-commits]\n" +" [--changed-paths] [--[no-]max-new-filters <n>] [--" +"[no-]progress]\n" +" <split options>" msgstr "" -"git commit-graph write [--object-dir <répertoire-d'objet>] [--append] [--" -"split[=<stratégie>]] [--reachable|--stdin-packs|--stdin-commits] [--changed-" -"paths] [--[no-]max-new-filters <n>] [--[no-]progress] <options de division>" +"git commit-graph write [--object-dir <rép>] [--append]\n" +" [--split[=<stratégie>]] [--reachable | --stdin-packs " +"| --stdin-commits]\n" +" [--changed-paths] [--[no-]max-new-filters <n>] [--" +"[no-]progress]\n" +" <options de division>" msgid "dir" msgstr "répertoire" @@ -4577,12 +4556,15 @@ msgstr "utilisez un seul parmi --reachable, --stdin-commits ou --stdin-packs" msgid "Collecting commits from input" msgstr "Collecte des commits depuis l'entrée" +msgid "git commit-tree <tree> [(-p <parent>)...]" +msgstr "git commit-tree <arbre> [(-p <parent>)...]" + msgid "" -"git commit-tree [(-p <parent>)...] [-S[<keyid>]] [(-m <message>)...] [(-F " -"<file>)...] <tree>" +"git commit-tree [(-p <parent>)...] [-S[<keyid>]] [(-m <message>)...]\n" +" [(-F <file>)...] <tree>" msgstr "" -"git commit-tree [(-p <parent>)...] [-S[<idclé>]] [(-m <message>)...] [(-F " -"<fichier>)...] <arbre>" +"git commit-tree [(-p <parent>)...] [-S[<idclé>]] [(-m <message>)...]\n" +" [(-F <fichier>)...] <arbre>" #, c-format msgid "duplicate parent %s ignored" @@ -4624,11 +4606,29 @@ msgstr "exactement un arbre obligatoire" msgid "git commit-tree: failed to read" msgstr "git commit-tree : échec de la lecture" -msgid "git commit [<options>] [--] <pathspec>..." -msgstr "git commit [<options>] [--] <spécification-de-chemin>..." +msgid "" +"git commit [-a | --interactive | --patch] [-s] [-v] [-u<mode>] [--amend]\n" +" [--dry-run] [(-c | -C | --squash) <commit> | --fixup [(amend|" +"reword):]<commit>)]\n" +" [-F <file> | -m <msg>] [--reset-author] [--allow-empty]\n" +" [--allow-empty-message] [--no-verify] [-e] [--author=<author>]\n" +" [--date=<date>] [--cleanup=<mode>] [--[no-]status]\n" +" [-i | -o] [--pathspec-from-file=<file> [--pathspec-file-nul]]\n" +" [(--trailer <token>[(=|:)<value>])...] [-S[<keyid>]]\n" +" [--] [<pathspec>...]" +msgstr "" +"git commit [-a | --interactive | --patch] [-s] [-v] [-u<mode>] [--amend]\n" +" [--dry-run] [(-c | -C | --squash) <commit> | --fixup [(amend|" +"reword):]<commit>)]\n" +" [-F <file> | -m <msg>] [--reset-author] [--allow-empty]\n" +" [--allow-empty-message] [--no-verify] [-e] [--author=<auteur>]\n" +" [--date=<date>] [--cleanup=<mode>] [--[no-]status]\n" +" [-i | -o] [--pathspec-from-file=<fichier> [--pathspec-file-nul]]\n" +" [(--trailer <symbole>[(=|:)<valeur>])...] [-S[<id-clé>]]\n" +" [--] [<spéc-de-chemin>...]" -msgid "git status [<options>] [--] <pathspec>..." -msgstr "git status [<options>] [--] <spécification-de-chemin>..." +msgid "git status [<options>] [--] [<pathspec>...]" +msgstr "git status [<options>] [--] [<spécification-de-chemin>...]" msgid "" "You asked to amend the most recent commit, but doing so would make\n" @@ -5412,11 +5412,18 @@ msgstr "credential-cache non disponible ; pas de gestion des socket unix" msgid "unable to get credential storage lock in %d ms" msgstr "impossible d'accéder au verrou de stockage d'identification en %d ms" -msgid "git describe [<options>] [<commit-ish>...]" -msgstr "git describe [<options>] <commit ou apparenté>*" +msgid "" +"git describe [--all] [--tags] [--contains] [--abbrev=<n>] [<commit-ish>...]" +msgstr "" +"git describe [--all] [--tags] [--contains] [--abbrev=<n>] [<commit-esque>...]" -msgid "git describe [<options>] --dirty" -msgstr "git describe [<options>] --dirty" +msgid "" +"git describe [--all] [--tags] [--contains] [--abbrev=<n>] --dirty[=<mark>]" +msgstr "" +"git describe [--all] [--tags] [--contains] [--abbrev=<n>] --dirty[=<marque>]" + +msgid "git describe <blob>" +msgstr "git describe <blob>" msgid "head" msgstr "tête" @@ -5543,11 +5550,11 @@ msgstr "" "l'option '%s' et des commit-esques ne peuvent pas être utilisées ensemble" msgid "" -"git diagnose [-o|--output-directory <path>] [-s|--suffix <format>] [--" -"mode=<mode>]" +"git diagnose [(-o | --output-directory) <path>] [(-s | --suffix) <format>]\n" +" [--mode=<mode>]" msgstr "" -"git diagnose [-o|--output-directory <fichier>] [-s|--suffix <format>] [--" -"mode=<mode>]" +"git diagnose [-o | --output-directory <fichier>] [(-s | --suffix) <format>]\n" +" [--mode=<mode>]" msgid "specify a destination for the diagnostics archive" msgstr "spécifier la destination de l'archive de diagnostique" @@ -5565,6 +5572,9 @@ msgstr "--merge-base ne fonctionne qu'avec deux commits" msgid "'%s': not a regular file or symlink" msgstr "'%s' : n'est pas un fichier régulier ni un lien symbolique" +msgid "no merge given, only parents." +msgstr "pas de fusion fournie, seulement des parents." + #, c-format msgid "invalid option: %s" msgstr "option invalide : %s" @@ -5858,12 +5868,12 @@ msgstr "" msgid "prune remote-tracking branches no longer on remote" msgstr "" -"éliminer les branches de suivi distant si la branche n'existe plus dans le " +"élaguer les branches de suivi distant si la branche n'existe plus dans le " "dépôt distant" msgid "prune local tags no longer on remote and clobber changed tags" msgstr "" -"éliminer les étiquettes locales qui ont disparu du dépôt distant et qui " +"élaguer les étiquettes locales qui ont disparu du dépôt distant et qui " "encombrent les étiquettes modifiées" msgid "on-demand" @@ -6214,8 +6224,8 @@ msgstr "afficher seulement les références qui contiennent le commit" msgid "print only refs which don't contain the commit" msgstr "afficher seulement les références qui ne contiennent pas le commit" -msgid "git for-each-repo --config=<config> <command-args>" -msgstr "git for-each-repo --config=<config> <arguments-de-commande>" +msgid "git for-each-repo --config=<config> [--] <arguments>" +msgstr "git for-each-repo --config=<config> [--] <arguments>" msgid "config" msgstr "config" @@ -6386,8 +6396,16 @@ msgstr "non-arbre dans l'arbre de cache" msgid "%s: invalid sha1 pointer in resolve-undo" msgstr "%s : pointeur sha1 invalide dans resolve-undo" -msgid "git fsck [<options>] [<object>...]" -msgstr "git fsck [<options>] [<objet>...]" +msgid "" +"git fsck [--tags] [--root] [--unreachable] [--cache] [--no-reflogs]\n" +" [--[no-]full] [--strict] [--verbose] [--lost-found]\n" +" [--[no-]dangling] [--[no-]progress] [--connectivity-only]\n" +" [--[no-]name-objects] [<object>...]" +msgstr "" +"git fsck [--tags] [--root] [--unreachable] [--cache] [--no-reflogs]\n" +" [--[no-]full] [--strict] [--verbose] [--lost-found]\n" +" [--[no-]dangling] [--[no-]progress] [--connectivity-only]\n" +" [--[no-]name-objects] [<objec>...]" msgid "show unreachable objects" msgstr "afficher les objets inaccessibles" @@ -6443,12 +6461,6 @@ msgstr "git fsmonitor--daemon start [<options>]" msgid "git fsmonitor--daemon run [<options>]" msgstr "git fsmonitor--daemon run [<options>]" -msgid "git fsmonitor--daemon stop" -msgstr "git fsmonitor--daemon stop" - -msgid "git fsmonitor--daemon status" -msgstr "git fsmonitor--daemon status" - #, c-format msgid "value of '%s' out of range: %d" msgstr "valeur de '%s' hors de gamme : %d" @@ -6565,7 +6577,7 @@ msgstr "" "%s" msgid "prune unreferenced objects" -msgstr "éliminer les objets non référencés" +msgstr "élaguer les objets non référencés" msgid "pack unreferenced objects separately" msgstr "empaqueter les objets non référencés séparément" @@ -6694,8 +6706,20 @@ msgstr "lancer une tâche spécifique" msgid "use at most one of --auto and --schedule=<frequency>" msgstr "--auto et --schedule=<fréquence> sont mutuellement exclusifs" -msgid "failed to run 'git config'" -msgstr "échec du lancement de 'git config'" +#, c-format +msgid "unable to add '%s' value of '%s'" +msgstr "impossible d'ajouter la valeur '%s' de '%s'" + +msgid "return success even if repository was not registered" +msgstr "renvoyer un succès même si le dépôt n'était pas enregistré" + +#, c-format +msgid "unable to unset '%s' value of '%s'" +msgstr "impossible de retirer la valeur '%s' de '%s'" + +#, c-format +msgid "repository '%s' is not registered" +msgstr "le dépôt '%s' n'est pas enregistré" #, c-format msgid "failed to expand path '%s'" @@ -6996,11 +7020,14 @@ msgid "both --cached and trees are given" msgstr "--cached et des arbres sont fournis en même temps" msgid "" -"git hash-object [-t <type>] [-w] [--path=<file> | --no-filters] [--stdin] " -"[--] <file>..." +"git hash-object [-t <type>] [-w] [--path=<file> | --no-filters]\n" +" [--stdin [--literally]] [--] <file>..." msgstr "" -"git hash-object [-t <type>] [-w] [--path=<fichier> | --no-filters] [--stdin] " -"[--] <fichier>..." +"git hash-object [-t <type>] [-w] [--path=<fichier> | --no-filters]\n" +" [--stdin [--literally]] [--] <fichier>..." + +msgid "git hash-object [-t <type>] [-w] --stdin-paths [--no-filters]" +msgstr "git hash-object [-t <type>] [-w] --stdin-paths [--no-filters]" msgid "object type" msgstr "type d'objet" @@ -7429,11 +7456,15 @@ msgid "Initialized empty Git repository in %s%s\n" msgstr "Dépôt Git vide initialisé dans %s%s\n" msgid "" -"git init [-q | --quiet] [--bare] [--template=<template-directory>] [--" -"shared[=<permissions>]] [<directory>]" +"git init [-q | --quiet] [--bare] [--template=<template-directory>]\n" +" [--separate-git-dir <git-dir>] [--object-format=<format>]\n" +" [-b <branch-name> | --initial-branch=<branch-name>]\n" +" [--shared[=<permissions>]] [<directory>]" msgstr "" -"git init [-q | --quiet] [--bare] [--template=<répertoire-modèle>] [--" -"shared[=<permissions>]] [<répertoire>]" +"git init [-q | --quiet] [--bare] [--template=<répertoire-modèle>]\n" +" [--separate-git-dir <rép-git>] [--object-format=<format>]\\n\"\n" +" [-b <nom-de-branche> | --initial-branch=<nom-de-branche>]\\n\"\n" +" [--shared[=<permissions>]] [<répertoire>]" msgid "permissions" msgstr "permissions" @@ -7474,11 +7505,13 @@ msgid "--separate-git-dir incompatible with bare repository" msgstr "--separate-git-dir est incompatible avec un dépôt nu" msgid "" -"git interpret-trailers [--in-place] [--trim-empty] [(--trailer " -"<token>[(=|:)<value>])...] [<file>...]" +"git interpret-trailers [--in-place] [--trim-empty]\n" +" [(--trailer <token>[(=|:)<value>])...]\n" +" [--parse] [<file>...]" msgstr "" -"git interpret-trailers [--in-place] [--trim-empty] [(--trailer " -"<symbole>[(=|:)<valeur>])...] [<fichier>...]" +"git interpret-trailers [--in-place] [--trim-empty]\n" +" [(--trailer <symbole>[(=|:)<valeur>])...]\n" +" [--parse] [<fichier>...]" msgid "edit files in place" msgstr "éditer les fichiers sur place" @@ -7977,11 +8010,11 @@ msgstr "" msgid "" "git ls-remote [--heads] [--tags] [--refs] [--upload-pack=<exec>]\n" -" [-q | --quiet] [--exit-code] [--get-url]\n" +" [-q | --quiet] [--exit-code] [--get-url] [--sort=<key>]\n" " [--symref] [<repository> [<refs>...]]" msgstr "" "git ls-remote [--heads] [--tags] [--refs] [--upload-pack=<exec>]\n" -" [-q | --quiet] [--exit-code] [--get-url]\n" +" [-q | --quiet] [--exit-code] [--get-url] [--sort=<clé>]\n" " [--symref] [<dépôt> [<réf>...]]" msgid "do not print remote URL" @@ -8116,12 +8149,12 @@ msgstr "git merge-base [-a | --all] <commit> <commit>..." msgid "git merge-base [-a | --all] --octopus <commit>..." msgstr "git merge-base [-a | --all] --octopus <commit>..." -msgid "git merge-base --independent <commit>..." -msgstr "git merge-base --independent <validation>..." - msgid "git merge-base --is-ancestor <commit> <commit>" msgstr "git merge-base --is-ancestor <validation> <validation>" +msgid "git merge-base --independent <commit>..." +msgstr "git merge-base --independent <validation>..." + msgid "git merge-base --fork-point <ref> [<commit>]" msgstr "git merge-base --fork-point <référence> [<validation>]" @@ -8229,9 +8262,20 @@ msgstr "lister les noms de fichier sans modes/oids/indexation" msgid "allow merging unrelated histories" msgstr "permettre la fusion d'historiques sans rapport" +msgid "perform multiple merges, one per line of input" +msgstr "réaliser des fusions multiples, une par ligne d'entrée" + msgid "--trivial-merge is incompatible with all other options" msgstr "--trivial-merge est incompatible avec d'autres options" +#, c-format +msgid "malformed input line: '%s'." +msgstr "ligne en entrée malformée : '%s'." + +#, c-format +msgid "merging cannot continue; got unclean result of %d" +msgstr "la fusion ne peut pas continuer ; résultat non propre retourné %d" + msgid "git merge [<options>] [<commit>...]" msgstr "git merge [<options>] [<commit>...]" @@ -8860,10 +8904,6 @@ msgid "cannot read note data from non-blob object '%s'." msgstr "impossible de lire les informations de note d'un objet non-blob '%s'." #, c-format -msgid "malformed input line: '%s'." -msgstr "ligne en entrée malformée : '%s'." - -#, c-format msgid "failed to copy notes from '%s' to '%s'" msgstr "impossible de copier les notes de '%s' vers '%s'" @@ -9055,16 +9095,15 @@ msgstr "utiliser les notes depuis <références-notes>" msgid "unknown subcommand: `%s'" msgstr "sous-commande inconnue : `%s'" -msgid "" -"git pack-objects --stdout [<options>...] [< <ref-list> | < <object-list>]" +msgid "git pack-objects --stdout [<options>] [< <ref-list> | < <object-list>]" msgstr "" -"git pack-objects --stdout [options...] [< <liste-références> | < <liste-" +"git pack-objects --stdout [<options>] [< <liste-références> | < <liste-" "objets>]" msgid "" -"git pack-objects [<options>...] <base-name> [< <ref-list> | < <object-list>]" +"git pack-objects [<options>] <base-name> [< <ref-list> | < <object-list>]" msgstr "" -"git pack-objects [options...] base-name [< <liste-références> | < <liste-" +"git pack-objects [<options>] <nom-de-base> [< <liste-références> | < <liste-" "objets>]" #, c-format @@ -9453,20 +9492,32 @@ msgstr "" "sur la ligne de commande pour nous avertir par\n" "un courriel à <git@vger.kernel.org>. Merci.\n" -msgid "git pack-refs [<options>]" -msgstr "git pack-refs [<options>]" +msgid "git pack-refs [--all] [--no-prune]" +msgstr "git pack-refs [--all] [--no-prune]" msgid "pack everything" msgstr "empaqueter tout" msgid "prune loose refs (default)" -msgstr "éliminer les références perdues (défaut)" +msgstr "élaguer les références perdues (défaut)" + +msgid "git patch-id [--stable | --unstable | --verbatim]" +msgstr "git patch-id [--stable | --unstable | --verbatim]" + +msgid "use the unstable patch-id algorithm" +msgstr "utiliser l'algorithme instable patch-id" + +msgid "use the stable patch-id algorithm" +msgstr "utiliser l'algorithme stable patch-id" + +msgid "don't strip whitespace from the patch" +msgstr "ne pas retirer les espaces blancs de la rustine" msgid "git prune [-n] [-v] [--progress] [--expire <time>] [--] [<head>...]" msgstr "git prune [-n] [-v] [--progress] [--expire <heure>] [--] [<head>…]" msgid "report pruned objects" -msgstr "afficher les objets éliminés" +msgstr "afficher les objets élagués" msgid "expire objects older than <time>" msgstr "faire expirer les objets plus vieux que <heure>" @@ -9475,7 +9526,7 @@ msgid "limit traversal to objects outside promisor packfiles" msgstr "limiter la traversée aux objets hors des fichiers paquets prometteurs" msgid "cannot prune in a precious-objects repo" -msgstr "impossible de nettoyer dans un dépôt d'objets précieux" +msgstr "impossible d'élaguer dans un dépôt d'objets précieux" msgid "git pull [<options>] [<repository> [<refspec>...]]" msgstr "git pull [<options>] [<dépôt> [<spécification-de-référence>...]]" @@ -9682,9 +9733,8 @@ msgstr "" msgid "" "\n" -"To avoid automatically configuring upstream branches when their name\n" -"doesn't match the local branch, see option 'simple' of branch." -"autoSetupMerge\n" +"To avoid automatically configuring an upstream branch when its name\n" +"won't match the local branch, see option 'simple' of branch.autoSetupMerge\n" "in 'git help config'.\n" msgstr "" "\n" @@ -9856,6 +9906,13 @@ msgstr "Poussée vers %s\n" msgid "failed to push some refs to '%s'" msgstr "impossible de pousser des références vers '%s'" +msgid "" +"recursing into submodule with push.recurseSubmodules=only; using on-demand " +"instead" +msgstr "" +"la récursion dans le sous-module avec push.recurseSubmodules=only ; " +"utilisation de on-demande à la place" + #, c-format msgid "invalid value for '%s'" msgstr "valeur invalide pour '%s'" @@ -9901,7 +9958,7 @@ msgid "set upstream for git pull/status" msgstr "définir la branche amont pour git pull/status" msgid "prune locally removed refs" -msgstr "éliminer les références locales supprimées" +msgstr "élaguer les références locales supprimées" msgid "bypass pre-push hook" msgstr "éviter d'utiliser le crochet pre-push" @@ -9996,14 +10053,15 @@ msgid "need two commit ranges" msgstr "plage entre deux commits requise" msgid "" -"git read-tree [(-m [--trivial] [--aggressive] | --reset | --prefix=<prefix>) " -"[-u | -i]] [--no-sparse-checkout] [--index-output=<file>] (--empty | <tree-" -"ish1> [<tree-ish2> [<tree-ish3>]])" +"git read-tree [(-m [--trivial] [--aggressive] | --reset | --" +"prefix=<prefix>)\n" +" [-u | -i]] [--index-output=<file>] [--no-sparse-checkout]\n" +" (--empty | <tree-ish1> [<tree-ish2> [<tree-ish3>]])" msgstr "" "git read-tree [(-m [--trivial] [--aggressive] | --reset | --" -"prefix=<préfixe>) [-u | -i]] [--no-sparse-checkout] [--index-" -"output=<fichier>] (--empty | <arbre-esque1> [<arbre-esque2> [<arbre-" -"esque3>]])" +"prefix=<préfixe>)\n" +" [-u | -i]] [--index-output=<fichier>] [--no-sparse-checkout]\n" +" (--empty | <arbre-esque1> [<arbre-esque2> [<arbre-esque3>]])" msgid "write resulting index to <file>" msgstr "écrire l'index résultant dans <fichier>" @@ -10094,8 +10152,8 @@ msgid "%s requires the merge backend" msgstr "%s requiert un moteur de fusion" #, c-format -msgid "could not get 'onto': '%s'" -msgstr "impossible d'accéder 'onto' : '%s'" +msgid "invalid onto: '%s'" +msgstr "destination invalide : '%s'" #, c-format msgid "invalid orig-head: '%s'" @@ -10405,8 +10463,8 @@ msgstr "pas de branche ou commit '%s'" msgid "No such ref: %s" msgstr "Référence inexistante : %s" -msgid "Could not resolve HEAD to a revision" -msgstr "Impossible de résoudre le commit HEAD vers un révision" +msgid "Could not resolve HEAD to a commit" +msgstr "impossible de résoudre HEAD en un commit" #, c-format msgid "'%s': need exactly one merge base with branch" @@ -10981,14 +11039,14 @@ msgstr "URL : %s" #, c-format msgid " * [would prune] %s" -msgstr " * [serait éliminé] %s" +msgstr " * [élaguerait] %s" #, c-format msgid " * [pruned] %s" -msgstr " * [éliminé] %s" +msgstr " * [élagué] %s" msgid "prune remotes after fetching" -msgstr "éliminer les distants après le rapatriement" +msgstr "élagué les distants après la récupération" #, c-format msgid "No such remote '%s'" @@ -11082,6 +11140,10 @@ msgstr "impossible d'ouvrir le fichier temporaire %s en écriture" msgid "could not close refs snapshot tempfile" msgstr "impossible de fermer le fichier temporaire d'instantané des réfs" +#, c-format +msgid "could not remove stale bitmap: %s" +msgstr "impossible de revenir la bitmap obsolète : %s" + msgid "pack everything in a single pack" msgstr "empaqueter tout dans un seul paquet" @@ -11156,6 +11218,9 @@ msgstr "trouver une progression géométrique avec un facteur <N>" msgid "write a multi-pack index of the resulting packs" msgstr "écrire un index de multi-paquet des paquets résultants" +msgid "pack prefix to store a pack containing pruned objects" +msgstr "préfixe de paquet pour stocker un paquet contenant les objets élagués" + msgid "cannot delete packs in a precious-objects repo" msgstr "impossible de supprimer les paquets dans un dépôt d'objets précieux" @@ -11167,8 +11232,12 @@ msgid "pack prefix %s does not begin with objdir %s" msgstr "le préfixe %s ne commence pas avec objdir %s" #, c-format -msgid "missing required file: %s" -msgstr "fichier nécessaire manquant : %s" +msgid "renaming pack to '%s' failed" +msgstr "le renommage du paquet en '%s' a échoué" + +#, c-format +msgid "pack-objects did not write a '%s' file for pack %s-%s" +msgstr "pack-objects n'a pas écrit un fichier '%s' pour la paquet %s-%s" #, c-format msgid "could not unlink: %s" @@ -11362,9 +11431,10 @@ msgstr "--convert-graft-file ne supporte aucun argument" msgid "only one pattern can be given with -l" msgstr "-l n'accepte qu'un motifs" -msgid "git rerere [clear | forget <path>... | status | remaining | diff | gc]" +msgid "" +"git rerere [clear | forget <pathspec>... | diff | status | remaining | gc]" msgstr "" -"git rerere [clear | forget <chemin>... | status | remaining | diff | gc]" +"git rerere [clear | forget <chemin>... | diff | status | remaining | gc]" msgid "register clean resolutions in index" msgstr "enregistrer des résolutions propres dans l'index" @@ -11572,6 +11642,15 @@ msgstr "--prefix exige un argument" msgid "unknown mode for --abbrev-ref: %s" msgstr "mode inconnu pour --abbrev-ref : %s" +msgid "--exclude-hidden cannot be used together with --branches" +msgstr "--exclude-hidden ne peut être utilisé avec --branches" + +msgid "--exclude-hidden cannot be used together with --tags" +msgstr "--exclude-hidden ne peut pas être utilisé avec --tags" + +msgid "--exclude-hidden cannot be used together with --remotes" +msgstr "--exclude-hidden ne peut pas être utilisé avec --remotes" + msgid "this operation must be run in a work tree" msgstr "cette opération doit être effectuée dans un arbre de travail" @@ -11579,17 +11658,25 @@ msgstr "cette opération doit être effectuée dans un arbre de travail" msgid "unknown mode for --show-object-format: %s" msgstr "mode inconnu pour --show-object-format : %s" -msgid "git revert [<options>] <commit-ish>..." -msgstr "git revert [<options>] <commit ou apparenté>..." +msgid "" +"git revert [--[no-]edit] [-n] [-m <parent-number>] [-s] [-S[<keyid>]] " +"<commit>..." +msgstr "" +"git revert [--[no-]edit] [-n] [-m <numéro-de-parent>] [-s] [-S[<id-clé>]] " +"<commit>..." -msgid "git revert <subcommand>" -msgstr "git revert <sous-commande>" +msgid "git revert (--continue | --skip | --abort | --quit)" +msgstr "git revert (--continue | --skip | --abort | --quit)" -msgid "git cherry-pick [<options>] <commit-ish>..." -msgstr "git cherry-pick [<options>] <commit ou apparenté>..." +msgid "" +"git cherry-pick [--edit] [-n] [-m <parent-number>] [-s] [-x] [--ff]\n" +" [-S[<keyid>]] <commit>..." +msgstr "" +"git cherry-pick [--edit] [-n] [-m <numéro-de-parent>] [-s] [-x] [--ff]\n" +" [-S[<clé-id>]] <commit>..." -msgid "git cherry-pick <subcommand>" -msgstr "git cherry-pick <sous-commande>" +msgid "git cherry-pick (--continue | --skip | --abort | --quit)" +msgstr "git cherry-pick (--continue | --skip | --abort | --quit)" #, c-format msgid "option `%s' expects a number greater than zero" @@ -11650,8 +11737,14 @@ msgstr "revert a échoué" msgid "cherry-pick failed" msgstr "le picorage a échoué" -msgid "git rm [<options>] [--] <file>..." -msgstr "git rm [<options>] [--] <fichier>..." +msgid "" +"git rm [-f | --force] [-n] [-r] [--cached] [--ignore-unmatch]\n" +" [--quiet] [--pathspec-from-file=<file> [--pathspec-file-nul]]\n" +" [--] [<pathspec>...]" +msgstr "" +"git rm [-f | --force] [-n] [-r] [--cached] [--ignore-unmatch]\n" +" [--quiet] [--pathspec-from-file=<fichier> [--pathspec-file-nul]]\n" +" [--] [<spéc-de-chemin>...]" msgid "" "the following file has staged content different from both the\n" @@ -11726,11 +11819,13 @@ msgid "" "git send-pack [--mirror] [--dry-run] [--force]\n" " [--receive-pack=<git-receive-pack>]\n" " [--verbose] [--thin] [--atomic]\n" +" [--[no-]signed | --signed=(true|false|if-asked)]\n" " [<host>:]<directory> (--all | <ref>...)" msgstr "" "git send-pack [--mirror] [--dry-run] [--force]\n" " [--receive-pack=<git-receive-pack>]\n" " [--verbose] [--thin] [--atomic]\n" +" [--[no-]signed | --signed=(true | false | if-asked)]\n" " [<hôte>:]<répertoire> (--all | <réf>...)" msgid "remote name" @@ -11755,8 +11850,9 @@ msgid "using multiple --group options with stdin is not supported" msgstr "" "l'utilisation de plusieurs options --group avec stdin n'est pas supportée" -msgid "using --group=trailer with stdin is not supported" -msgstr "l'utilisation de --group=trailer avec stdin n'est pas supportée" +#, c-format +msgid "using %s with stdin is not supported" +msgstr "l'utilisation de %s avec stdin n'est pas supportée" #, c-format msgid "unknown group type: %s" @@ -11795,12 +11891,14 @@ msgid "" "git show-branch [-a | --all] [-r | --remotes] [--topo-order | --date-order]\n" " [--current] [--color[=<when>] | --no-color] [--sparse]\n" " [--more=<n> | --list | --independent | --merge-base]\n" -" [--no-name | --sha1-name] [--topics] [(<rev> | <glob>)...]" +" [--no-name | --sha1-name] [--topics]\n" +" [(<rev> | <glob>)...]" msgstr "" "git show-branch [-a | --all] [-r | --remotes] [--topo-order | --date-order]\n" " [--current] [--color[=<quand>] | --no-color] [--sparse]\n" " [--more=<n> | --list | --independent | --merge-base]\n" -" [--no-name | --sha1-name] [--topics] [(<rév> | <glob>)...]" +" [--no-name | --sha1-name] [--topics]\n" +" [(<rév> | <glob>)...]" msgid "git show-branch (-g | --reflog)[=<n>[,<base>]] [--list] [<ref>]" msgstr "git show-branch (-g | --reflog)[=<n>[,<base>]] [--list] [<référence>]" @@ -11902,11 +12000,13 @@ msgid "Unknown hash algorithm" msgstr "Algorithme d'empreinte inconnu" msgid "" -"git show-ref [-q | --quiet] [--verify] [--head] [-d | --dereference] [-s | --" -"hash[=<n>]] [--abbrev[=<n>]] [--tags] [--heads] [--] [<pattern>...]" +"git show-ref [-q | --quiet] [--verify] [--head] [-d | --dereference]\n" +" [-s | --hash[=<n>]] [--abbrev[=<n>]] [--tags]\n" +" [--heads] [--] [<pattern>...]" msgstr "" -"git show-ref [-q | --quiet] [--verify] [--head] [-d | --dereference] [-s | --" -"hash[=<n>]] [--abbrev[=<n>]] [--tags] [--heads] [--] [<motif>...]" +"git show-ref [-q | --quiet] [--verify] [--head] [-d | --dereference]\n" +" [-s | --hash[=<n>]] [--abbrev[=<n>]] [--tags]\n" +" [--heads] [--] [<motif>...]" msgid "git show-ref --exclude-existing[=<pattern>]" msgstr "git show-ref --exclude-existing[=<motif>]" @@ -11940,8 +12040,10 @@ msgstr "" "afficher les références de l'entrée standard qui ne sont pas dans le dépôt " "local" -msgid "git sparse-checkout (init|list|set|add|reapply|disable) <options>" -msgstr "git sparse-checkout (init|list|set|add|reapply|disable) <options>" +msgid "" +"git sparse-checkout (init | list | set | add | reapply | disable) [<options>]" +msgstr "" +"git sparse-checkout (init | list | set | add | reapply | disable) [<options>]" msgid "this worktree is not sparse" msgstr "cet arbre de travail n'est pas clairsemé" @@ -12071,67 +12173,57 @@ msgstr "" msgid "error while refreshing working directory" msgstr "erreur lors du rafraîchissement du répertoire de travail" -msgid "git stash list [<options>]" -msgstr "git stash list [<options>]" +msgid "git stash list [<log-options>]" +msgstr "git stash list [<options-de-log>]" + +msgid "" +"git stash show [-u | --include-untracked | --only-untracked] [<diff-" +"options>] [<stash>]" +msgstr "" +"git stash show [-u | --include-untracked | --only-untracked] [<options-de-" +"diff>] [<stash>]" -msgid "git stash show [<options>] [<stash>]" -msgstr "git stash show [<options>] [<remise>]" +msgid "git stash drop [-q | --quiet] [<stash>]" +msgstr "git stash drop [-q | --quiet] [<remise>]" -msgid "git stash drop [-q|--quiet] [<stash>]" -msgstr "git stash drop [-q|--quiet] [<remise>]" +msgid "git stash pop [--index] [-q | --quiet] [<stash>]" +msgstr "git stash pop [--index] [-q | --quiet] [<remise>]" -msgid "git stash ( pop | apply ) [--index] [-q|--quiet] [<stash>]" -msgstr "git stash ( pop | apply ) [--index] [-q|--quiet] [<remise>]" +msgid "git stash apply [--index] [-q | --quiet] [<stash>]" +msgstr "git stash apply [--index] [-q | --quiet] [<remise>]" msgid "git stash branch <branchname> [<stash>]" msgstr "git stash branch <nom-de-branche> [<remise>]" +msgid "git stash store [(-m | --message) <message>] [-q | --quiet] <commit>" +msgstr "git stash store [(-m | --message) <message>] [-q | --quiet] <remise>" + msgid "" -"git stash [push [-p|--patch] [-S|--staged] [-k|--[no-]keep-index] [-q|--" -"quiet]\n" -" [-u|--include-untracked] [-a|--all] [-m|--message <message>]\n" +"git stash [push [-p | --patch] [-S | --staged] [-k | --[no-]keep-index] [-q " +"| --quiet]\n" +" [-u | --include-untracked] [-a | --all] [(-m | --message) " +"<message>]\n" " [--pathspec-from-file=<file> [--pathspec-file-nul]]\n" " [--] [<pathspec>...]]" msgstr "" -"git stash [push [-p|--patch] [-S|--staged] [-k|--[no-]keep-index] [-q|--" -"quiet]\n" -" [-u|--include-untracked] [-a|--all] [-m|--message <message>]\n" +"git stash [push [-p | --patch] [-S | --staged] [-k | --[no-]keep-index] [-q " +"| --quiet]\n" +" [-u | --include-untracked] [-a | --all] [(-m | --message) " +"<message>]\n" " [--pathspec-from-file=<fichier> [--pathspec-file-nul]]\n" " [--] [<spécificateur-de-chemin>...]]" msgid "" -"git stash save [-p|--patch] [-S|--staged] [-k|--[no-]keep-index] [-q|--" -"quiet]\n" -" [-u|--include-untracked] [-a|--all] [<message>]" -msgstr "" -"git stash save [-p|--patch] [-S|--staged] [-k|--[no-]keep-index] [-q|--" -"quiet]\n" -" [-u|--include-untracked] [-a|--all] [<message>]" - -msgid "git stash pop [--index] [-q|--quiet] [<stash>]" -msgstr "git stash pop [--index] [-q|--quiet] [<remise>]" - -msgid "git stash apply [--index] [-q|--quiet] [<stash>]" -msgstr "git stash apply [--index] [-q|--quiet] [<remise>]" - -msgid "git stash store [-m|--message <message>] [-q|--quiet] <commit>" -msgstr "git stash store [-m|--message <message>] [-q|--quiet] <remise>" - -msgid "" -"git stash [push [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]\n" -" [-u|--include-untracked] [-a|--all] [-m|--message <message>]\n" -" [--] [<pathspec>...]]" +"git stash save [-p | --patch] [-S | --staged] [-k | --[no-]keep-index] [-q | " +"--quiet]\n" +" [-u | --include-untracked] [-a | --all] [<message>]" msgstr "" -"git stash [push [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]\n" -" [-u|--include-untracked] [-a|--all] [-m|--message <message>]\n" -" [--] [<spécificateur-de-chemin>...]]" +"git stash save [-p | --patch] [-S | --staged] [-k | --[no-]keep-index] [-q | " +"--quiet]\n" +" [-u | --include-untracked] [-a | --all] [<message>]" -msgid "" -"git stash save [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]\n" -" [-u|--include-untracked] [-a|--all] [<message>]" -msgstr "" -"git stash save [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]\n" -" [-u|--include-untracked] [-a|--all] [<message>]" +msgid "git stash create [<message>]" +msgstr "git stash create [<message>]" #, c-format msgid "'%s' is not a stash-like commit" @@ -12712,9 +12804,6 @@ msgstr "traverser les sous-modules récursivement" msgid "don't fetch new objects from the remote site" msgstr "ne pas récupérer les nouveaux objets depuis le site distant" -msgid "path into the working tree" -msgstr "chemin dans la copie de travail" - msgid "use the 'checkout' update strategy (default)" msgstr "utiliser la stratégie de mise à jour 'checkout' (valeur par défaut)" @@ -12750,28 +12839,9 @@ msgstr "" "[no-]recommend-shallow] [--reference <dépôt>] [--recursive] [--[no-]single-" "branch] [--] [<chemin>...]" -msgid "recurse into submodules" -msgstr "parcourir récursivement les sous-modules" - msgid "git submodule absorbgitdirs [<options>] [<path>...]" msgstr "git submodule absorbgitdirs [<options>] [<chemin>...]" -msgid "check if it is safe to write to the .gitmodules file" -msgstr "vérifier si écrire dans le fichier .gitmodules est sur" - -msgid "unset the config in the .gitmodules file" -msgstr "désactiver la configuration dans le fichier .gitmodules" - -msgid "git submodule--helper config <name> [<value>]" -msgstr "git submodule--helper config name [<valeur>]" - -msgid "git submodule--helper config --unset <name>" -msgstr "git submodule--helper config --unset <nom>" - -msgid "please make sure that the .gitmodules file is in the working tree" -msgstr "" -"veuillez vous assurer que le fichier .gitmodules est dans l'arbre de travail" - msgid "suppress output for setting url of a submodule" msgstr "supprimer la sortie lors du paramétrage de l'url d'un sous-module" @@ -12851,6 +12921,10 @@ msgstr "Réactivation du répertoire git local pour le sous-module '%s'\n" msgid "unable to checkout submodule '%s'" msgstr "Impossible d'extraire le sous-module '%s'" +msgid "please make sure that the .gitmodules file is in the working tree" +msgstr "" +"veuillez vous assurer que le fichier .gitmodules est dans l'arbre de travail" + #, c-format msgid "Failed to add submodule '%s'" msgstr "Échec d'ajout du sous-module '%s'" @@ -12903,19 +12977,21 @@ msgstr "l'URL de dépôt : '%s' doit être absolu ou commencer par ./|../" msgid "'%s' is not a valid submodule name" msgstr "'%s' n'est pas un nom valide de sous-module" +msgid "git submodule--helper <command>" +msgstr "git submodule--helper <commande>" + #, c-format msgid "%s doesn't support --super-prefix" msgstr "%s ne gère pas --super-prefix" -#, c-format -msgid "'%s' is not a valid submodule--helper subcommand" -msgstr "'%s' n'est pas une sous-commande valide de submodule--helper" +msgid "git symbolic-ref [-m <reason>] <name> <ref>" +msgstr "git symbolic-ref [-m <raison>] <nom> <réf>" -msgid "git symbolic-ref [<options>] <name> [<ref>]" -msgstr "git symbolic-ref [<options>] <nom> [<référence>]" +msgid "git symbolic-ref [-q] [--short] [--no-recurse] <name>" +msgstr "git symbolic-ref [-q] [--short] [--no-recurse] <nom>" -msgid "git symbolic-ref -d [-q] <name>" -msgstr "git symbolic-ref -d [-q] <nom>" +msgid "git symbolic-ref --delete [-q] <name>" +msgstr "git symbolic-ref --delete [-q] <nom>" msgid "suppress error message for non-symbolic (detached) refs" msgstr "" @@ -12927,6 +13003,9 @@ msgstr "supprimer la référence symbolique" msgid "shorten ref output" msgstr "raccourcir l'affichage de la référence" +msgid "recursively dereference (default)" +msgstr "déréférencer récursivement (défaut)" + msgid "reason" msgstr "raison" @@ -12934,25 +13013,25 @@ msgid "reason of the update" msgstr "raison de la mise à jour" msgid "" -"git tag [-a | -s | -u <key-id>] [-f] [-m <msg> | -F <file>]\n" -" <tagname> [<head>]" +"git tag [-a | -s | -u <key-id>] [-f] [-m <msg> | -F <file>] [-e]\n" +" <tagname> [<commit> | <object>]" msgstr "" -"git tag [-a | -s | -u <id-clé>] [-f] [-m <msg> | -F <fichier>]\n" -" <nom-d-étiquette> [<tête>]" +"git tag [-a | -s | -u <id-clé>] [-f] [-m <msg> | -F <fichier>] [-e]\n" +" <nom-d-étiquette> [<commit> | <objet>]" msgid "git tag -d <tagname>..." msgstr "git tag -d <nom-d-étiquette>..." msgid "" -"git tag -l [-n[<num>]] [--contains <commit>] [--no-contains <commit>] [--" -"points-at <object>]\n" -" [--format=<format>] [--merged <commit>] [--no-merged <commit>] " -"[<pattern>...]" +"git tag [-n[<num>]] -l [--contains <commit>] [--no-contains <commit>]\n" +" [--points-at <object>] [--column[=<options>] | --no-column]\n" +" [--create-reflog] [--sort=<key>] [--format=<format>]\n" +" [--merged <commit>] [--no-merged <commit>] [<pattern>...]" msgstr "" -"git tag -l [-n[<num>]] [--contains <commit>] [--no-contains <commit>] [--" -"points-at <objet>]\n" -" [--format=<format>] [--merged <commit>] [--no-merged <commit>] " -"[<motif>...]" +"git tag [-n[<num>]] -l [--contains <commit>] [--no-contains <commit>]\n" +" [--points-at <objet>] [--column[=<options>] | --no-column]\n" +" [--create-reflog] [--sort=<clé>] [--format=<format>]\n" +" [--merged <commit>] [--no-merged <commit>] [<motif>...]" msgid "git tag -v [--format=<format>] <tagname>..." msgstr "git tag -v [--format=<format>] <nom-d-étiquette>..." @@ -13345,8 +13424,12 @@ msgstr "lire les mises à jour depuis l'entrée standard" msgid "update the info files from scratch" msgstr "mettre à jour les fichiers d'information à partir de zéro" -msgid "git upload-pack [<options>] <dir>" -msgstr "git upload-pack [<options>] <répertoire>" +msgid "" +"git-upload-pack [--[no-]strict] [--timeout=<n>] [--stateless-rpc]\n" +" [--advertise-refs] <directory>" +msgstr "" +"git-upload-pack [--[no-]strict] [--timeout=<n>] [--stateless-rpc]\n" +" [--advertise-refs] <répertoire>" msgid "quit after a single request/response exchange" msgstr "quitter après un unique échange requête/réponse" @@ -13361,8 +13444,8 @@ msgstr "" msgid "interrupt transfer after <n> seconds of inactivity" msgstr "interrompre le transfert après <n> secondes d'inactivité" -msgid "git verify-commit [-v | --verbose] <commit>..." -msgstr "git verify-commit [-v | --verbose] <commit>..." +msgid "git verify-commit [-v | --verbose] [--raw] <commit>..." +msgstr "git verify-commit [-v | --verbose] [--raw] <commit>..." msgid "print commit contents" msgstr "afficher le contenu du commit" @@ -13370,8 +13453,9 @@ msgstr "afficher le contenu du commit" msgid "print raw gpg status output" msgstr "afficher les messages bruts de gpg" -msgid "git verify-pack [-v | --verbose] [-s | --stat-only] <pack>..." -msgstr "git verify-pack [-v | --verbose] [-s | --stat-only] <pack>..." +msgid "git verify-pack [-v | --verbose] [-s | --stat-only] [--] <pack>.idx..." +msgstr "" +"git verify-pack [-v | --verbose] [-s | --stat-only] [--] <paquet>.idx..." msgid "verbose" msgstr "verbeux" @@ -13379,42 +13463,47 @@ msgstr "verbeux" msgid "show statistics only" msgstr "afficher seulement les statistiques" -msgid "git verify-tag [-v | --verbose] [--format=<format>] <tag>..." -msgstr "git verify-tag [-v | --verbose] [--format=<format>] <étiquette>..." +msgid "git verify-tag [-v | --verbose] [--format=<format>] [--raw] <tag>..." +msgstr "" +"git verify-tag [-v | --verbose] [--format=<format>] [--raw] <étiquette>..." msgid "print tag contents" msgstr "afficher le contenu de l'étiquette" -msgid "git worktree add [<options>] <path> [<commit-ish>]" -msgstr "git worktree add [<options>] <chemin> [<commit>]" +msgid "" +"git worktree add [-f] [--detach] [--checkout] [--lock [--reason <string>]]\n" +" [-b <new-branch>] <path> [<commit-ish>]" +msgstr "" +"git worktree add [-f] [--detach] [--checkout] [--lock [--reason <chaîne>]]\n" +" [-b <nouvelle-branche>] <chemin> [<commit-esque>]" -msgid "git worktree list [<options>]" -msgstr "git worktree list [<options>]" +msgid "git worktree list [-v | --porcelain [-z]]" +msgstr "git worktree list [-v | --porcelain [-z]]" -msgid "git worktree lock [<options>] <path>" -msgstr "git worktree lock [<options>] <chemin>" +msgid "git worktree lock [--reason <string>] <worktree>" +msgstr "git worktree lock [--reason <chaîne>] <arbre-de-travail>" msgid "git worktree move <worktree> <new-path>" msgstr "git worktree move <arbre-de-travail> <nouveau-chemin>" -msgid "git worktree prune [<options>]" -msgstr "git worktree prune [<options>]" +msgid "git worktree prune [-n] [-v] [--expire <expire>]" +msgstr "git worktree prune [-n] [-v] [--expire <date>]" -msgid "git worktree remove [<options>] <worktree>" -msgstr "git worktree remove [<options>] <arbre-de-travail>" +msgid "git worktree remove [-f] <worktree>" +msgstr "git worktree remove [-f] <arbre-de-travail>" msgid "git worktree repair [<path>...]" msgstr "git worktree repair [<chemin>...]" -msgid "git worktree unlock <path>" -msgstr "git worktree unlock <chemin>" +msgid "git worktree unlock <worktree>" +msgstr "git worktree unlock <arbre-de-travail>" #, c-format msgid "Removing %s/%s: %s" msgstr "Suppression de %s/%s : %s" msgid "report pruned working trees" -msgstr "afficher les arbres de travail éliminés" +msgstr "afficher les arbres de travail élagués" msgid "expire working trees older than <time>" msgstr "faire expirer les arbres de travail plus vieux que <temps>" @@ -13654,6 +13743,10 @@ msgstr "seulement utile pour le débogage" msgid "core.fsyncMethod = batch is unsupported on this platform" msgstr "core.fsyncMethod = batch non géré sur cette plateforme" +#, c-format +msgid "bundle list at '%s' has no mode" +msgstr "la liste de colis n'a pas de mode à '%s'" + msgid "failed to create temporary file" msgstr "impossible de créer un fichier temporaire" @@ -13661,16 +13754,29 @@ msgid "insufficient capabilities" msgstr "capacités insuffisantes" #, c-format +msgid "unrecognized bundle mode from URI '%s'" +msgstr "mode de colisage non reconnu depuis l'URI '%s'" + +#, c-format +msgid "exceeded bundle URI recursion limit (%d)" +msgstr "limite de récursion d'URI de colis dépassée (%d)" + +#, c-format msgid "failed to download bundle from URI '%s'" msgstr "impossible de télécharger le colis depuis l'URI '%s'" #, c-format -msgid "file at URI '%s' is not a bundle" -msgstr "le fichier à l'URI '%s' n'est pas un colis" +msgid "file at URI '%s' is not a bundle or bundle list" +msgstr "le fichier à l'URI '%s' n'est pas un colis ou une liste de colis" -#, c-format -msgid "failed to unbundle bundle from URI '%s'" -msgstr "échec pour ouvrir le colis de l'URI '%s'" +msgid "bundle-uri: got an empty line" +msgstr "bundle-uri : ligne vide rencontrée" + +msgid "bundle-uri: line is not of the form 'key=value'" +msgstr "bundle-uri : la ligne n'est pas de la forme 'clé=valeur'" + +msgid "bundle-uri: line has empty key or value" +msgstr "bundle-uri : la ligne a une clé ou une valeur vide" #, c-format msgid "unrecognized bundle hash algorithm: %s" @@ -14062,8 +14168,7 @@ msgid "Compute unique ID for a patch" msgstr "Calculer l'ID unique d'un patch" msgid "Prune all unreachable objects from the object database" -msgstr "" -"Éliminer les objets inatteignables depuis la base de données des objets" +msgstr "Élaguer les objets inatteignables depuis la base de données des objets" msgid "Remove extra objects that are already in pack files" msgstr "Éliminer les objets qui sont déjà présents dans les fichiers pack" @@ -14265,8 +14370,8 @@ msgstr "le format du fichier de colis" msgid "Chunk-based file formats" msgstr "format de fichier avec des sections" -msgid "Git commit graph format" -msgstr "format de graphe de commit de Gti" +msgid "Git commit-graph format" +msgstr "format de graphe de commit de Git" msgid "Git index format" msgstr "format d'index Git" @@ -14634,6 +14739,10 @@ msgstr "cas non géré dans 'has_worktree_moved': %d" msgid "health thread wait failed [GLE %ld]" msgstr "l'attente du fil de santé a échoué [GLE %ld]" +#, c-format +msgid "Invalid path: %s" +msgstr "chemin invalide : '%s'" + msgid "Unable to create FSEventStream." msgstr "impossible de créer FSEVEntStream." @@ -14665,6 +14774,22 @@ msgid "could not read directory changes [GLE %ld]" msgstr "impossible de lire les modifications du répertoire [GLE %ld]" #, c-format +msgid "opendir('%s') failed" +msgstr "échec de opendir(%s)" + +#, c-format +msgid "lstat('%s') failed" +msgstr "échec de lstat('%s')" + +#, c-format +msgid "strbuf_readlink('%s') failed" +msgstr "échec de strbuf_readlink('%s')" + +#, c-format +msgid "closedir('%s') failed" +msgstr "échec de closedir('%s')" + +#, c-format msgid "[GLE %ld] unable to open for read '%ls'" msgstr "[GLE %ld] impossible d'ouvrir pour lire '%ls'" @@ -16322,9 +16447,11 @@ msgstr "le dépôt virtuel '%s' est incompatible avec fsmonitor" #, c-format msgid "" -"repository '%s' is incompatible with fsmonitor due to lack of Unix sockets" +"socket directory '%s' is incompatible with fsmonitor due to lack of Unix " +"sockets support" msgstr "" -"le dépôt '%s' est incompatible avec fsmonitor par manque de sockets Unix" +"le répertoire de socket '%s' est incompatible avec fsmonitor par manque de " +"sockets Unix" msgid "" "git [-v | --version] [-h | --help] [-C <path>] [-c <name>=<value>]\n" @@ -16650,8 +16777,8 @@ msgstr[1] "" "\n" "Les commandes les plus ressemblantes sont" -msgid "git version [<options>]" -msgstr "git version [<options>]" +msgid "git version [--build-options]" +msgstr "git version [--build-options]" #, c-format msgid "%s: %s - %s" @@ -17584,10 +17711,6 @@ msgstr "impossible de normaliser le chemin d'objet alternatif : %s" msgid "%s: ignoring alternate object stores, nesting too deep" msgstr "%s : magasins d'objets alternatifs ignorés, récursion trop profonde" -#, c-format -msgid "unable to normalize object directory: %s" -msgstr "impossible de normaliser le répertoire d'objet : %s" - msgid "unable to fdopen alternates lockfile" msgstr "impossible d'ouvrir (fdopen) le fichier verrou des alternatives" @@ -18433,6 +18556,10 @@ msgstr "" msgid "promisor remote name cannot begin with '/': %s" msgstr "un nom de prometteur distant ne peut pas commencer par '/' : %s" +#, c-format +msgid "could not fetch %s from promisor remote" +msgstr "impossible de récupérer %s depuis le distant de prometteur" + msgid "object-info: expected flush after arguments" msgstr "object-info : vidage attendu après les arguments" @@ -19519,6 +19646,13 @@ msgid "failed to find tree of %s" msgstr "impossible de trouver l'arbre de %s" #, c-format +msgid "unsupported section for hidden refs: %s" +msgstr "section non géree pour les réfs cachées : %s" + +msgid "--exclude-hidden= passed more than once" +msgstr "--exclude-hidden= présent plus d'une fois" + +#, c-format msgid "resolve-undo records `%s` which is missing" msgstr "resolve-undo enregistre `%s` qui manque" @@ -19664,6 +19798,14 @@ msgid "--all or <enlistment>, but not both" msgstr "--all ou <enrôlement>, mais pas les deux" #, c-format +msgid "could not remove stale scalar.repo '%s'" +msgstr "impossible de supprimé le scalar.repo obsolète '%s'" + +#, c-format +msgid "removing stale scalar.repo '%s'" +msgstr "suppression du scalar.repo obsolète '%s'" + +#, c-format msgid "git repository gone in '%s'" msgstr "dépôt git parti dans '%s'" @@ -20291,16 +20433,16 @@ msgstr "" msgid "illegal label name: '%.*s'" msgstr "nom de label illégal '%.*s'" +#, c-format +msgid "could not resolve '%s'" +msgstr "impossible de résoudre '%s'" + msgid "writing fake root commit" msgstr "écriture d'un commit racine bidon" msgid "writing squash-onto" msgstr "écriture de 'écraser-sur'" -#, c-format -msgid "could not resolve '%s'" -msgstr "impossible de résoudre '%s'" - msgid "cannot merge without a current revision" msgstr "impossible de fusionner avec une révision courante" @@ -20911,6 +21053,15 @@ msgstr "ls-tree a renvoyé un code de retour inattendu %d" msgid "failed to lstat '%s'" msgstr "échec du lstat de '%s'" +msgid "test-tool cache-tree <options> (control|prime|update)" +msgstr "test-tool cache-tree <options> (control|prime|update)" + +msgid "clear the cache tree before each iteration" +msgstr "effacer l'arbre de cache avant chaque itération" + +msgid "number of entries in the cache tree to invalidate (default 0)" +msgstr "nombre d'entrées dans l'arbre de cache à invalider (par défaut, 0)" + msgid "unhandled options" msgstr "options non gérées" @@ -22768,6 +22919,153 @@ msgstr "%s sauté avec un suffix de sauvegarde '%s'.\n" msgid "Do you really want to send %s? [y|N]: " msgstr "Souhaitez-vous réellement envoyer %s ?[y|N] : " +#, c-format +#~ msgid "unable to normalize object directory: %s" +#~ msgstr "impossible de normaliser le répertoire d'objet : %s" + +#~ msgid "reset the bisection state" +#~ msgstr "réinitialiser l'état de la bissection" + +#~ msgid "check whether bad or good terms exist" +#~ msgstr "vérifier si les termes bons ou mauvais existent" + +#~ msgid "print out the bisect terms" +#~ msgstr "afficher les termes de bissection" + +#~ msgid "start the bisect session" +#~ msgstr "démarrer une session de bissection" + +#~ msgid "find the next bisection commit" +#~ msgstr "trouver le prochain commit de bissection" + +#~ msgid "mark the state of ref (or refs)" +#~ msgstr "marquer l'état d'une références (ou plusieurs)" + +#~ msgid "list the bisection steps so far" +#~ msgstr "lister les étapes de bissection jusqu'ici" + +#~ msgid "replay the bisection process from the given file" +#~ msgstr "rejouer le processus de bissection depuis le fichier fourni" + +#~ msgid "skip some commits for checkout" +#~ msgstr "sauter certains commits pour l'extraction" + +#~ msgid "visualize the bisection" +#~ msgstr "visualiser la bissection" + +#~ msgid "use <cmd>... to automatically bisect" +#~ msgstr "utiliser <cmd>... pour bissecter automatiquement" + +#~ msgid "no log for BISECT_WRITE" +#~ msgstr "pas de journal pour BISECT_WRITE" + +#~ msgid "Couldn't look up commit object for HEAD" +#~ msgstr "Impossible de rechercher l'objet commit pour HEAD" + +#~ msgid "git bundle create [<options>] <file> <git-rev-list args>" +#~ msgstr "git bundle create [<options>] <fichier> <args git-rev-list>" + +#, c-format +#~ msgid "options '%s' and '%s %s' cannot be used together" +#~ msgstr "les options '%s' et '%s %s' ne peuvent pas être utilisées ensemble" + +#~ msgid "git commit [<options>] [--] <pathspec>..." +#~ msgstr "git commit [<options>] [--] <spécification-de-chemin>..." + +#~ msgid "git fsck [<options>] [<object>...]" +#~ msgstr "git fsck [<options>] [<objet>...]" + +#~ msgid "git fsmonitor--daemon stop" +#~ msgstr "git fsmonitor--daemon stop" + +#~ msgid "git fsmonitor--daemon status" +#~ msgstr "git fsmonitor--daemon status" + +#~ msgid "failed to run 'git config'" +#~ msgstr "échec du lancement de 'git config'" + +#, c-format +#~ msgid "could not get 'onto': '%s'" +#~ msgstr "impossible d'accéder 'onto' : '%s'" + +#~ msgid "Could not resolve HEAD to a revision" +#~ msgstr "Impossible de résoudre le commit HEAD vers un révision" + +#, c-format +#~ msgid "missing required file: %s" +#~ msgstr "fichier nécessaire manquant : %s" + +#~ msgid "git revert [<options>] <commit-ish>..." +#~ msgstr "git revert [<options>] <commit ou apparenté>..." + +#~ msgid "git revert <subcommand>" +#~ msgstr "git revert <sous-commande>" + +#~ msgid "git cherry-pick [<options>] <commit-ish>..." +#~ msgstr "git cherry-pick [<options>] <commit ou apparenté>..." + +#~ msgid "git cherry-pick <subcommand>" +#~ msgstr "git cherry-pick <sous-commande>" + +#~ msgid "git rm [<options>] [--] <file>..." +#~ msgstr "git rm [<options>] [--] <fichier>..." + +#~ msgid "using --group=trailer with stdin is not supported" +#~ msgstr "l'utilisation de --group=trailer avec stdin n'est pas supportée" + +#~ msgid "git stash show [<options>] [<stash>]" +#~ msgstr "git stash show [<options>] [<remise>]" + +#~ msgid "git stash ( pop | apply ) [--index] [-q|--quiet] [<stash>]" +#~ msgstr "git stash ( pop | apply ) [--index] [-q|--quiet] [<remise>]" + +#~ msgid "" +#~ "git stash [push [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]\n" +#~ " [-u|--include-untracked] [-a|--all] [-m|--message <message>]\n" +#~ " [--] [<pathspec>...]]" +#~ msgstr "" +#~ "git stash [push [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]\n" +#~ " [-u|--include-untracked] [-a|--all] [-m|--message <message>]\n" +#~ " [--] [<spécificateur-de-chemin>...]]" + +#~ msgid "" +#~ "git stash save [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]\n" +#~ " [-u|--include-untracked] [-a|--all] [<message>]" +#~ msgstr "" +#~ "git stash save [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]\n" +#~ " [-u|--include-untracked] [-a|--all] [<message>]" + +#~ msgid "path into the working tree" +#~ msgstr "chemin dans la copie de travail" + +#~ msgid "recurse into submodules" +#~ msgstr "parcourir récursivement les sous-modules" + +#~ msgid "check if it is safe to write to the .gitmodules file" +#~ msgstr "vérifier si écrire dans le fichier .gitmodules est sur" + +#~ msgid "unset the config in the .gitmodules file" +#~ msgstr "désactiver la configuration dans le fichier .gitmodules" + +#~ msgid "git submodule--helper config <name> [<value>]" +#~ msgstr "git submodule--helper config name [<valeur>]" + +#~ msgid "git submodule--helper config --unset <name>" +#~ msgstr "git submodule--helper config --unset <nom>" + +#, c-format +#~ msgid "'%s' is not a valid submodule--helper subcommand" +#~ msgstr "'%s' n'est pas une sous-commande valide de submodule--helper" + +#~ msgid "git upload-pack [<options>] <dir>" +#~ msgstr "git upload-pack [<options>] <répertoire>" + +#~ msgid "git worktree add [<options>] <path> [<commit-ish>]" +#~ msgstr "git worktree add [<options>] <chemin> [<commit>]" + +#~ msgid "git worktree lock [<options>] <path>" +#~ msgstr "git worktree lock [<options>] <chemin>" + #~ msgid "(stats|all)" #~ msgstr "(stats|all)" @@ -22804,9 +23102,6 @@ msgstr "Souhaitez-vous réellement envoyer %s ?[y|N] : " #~ msgid "git submodule--helper list [--prefix=<path>] [<path>...]" #~ msgstr "git submodule--helper list [--prefix=<chemin>] [<chemin>...]" -#~ msgid "git submodule--helper name <path>" -#~ msgstr "git submodule--helper <nom> <chemin>" - #, c-format #~ msgid "failed to get the default remote for submodule '%s'" #~ msgstr "" @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: Git\n" "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n" -"POT-Creation-Date: 2022-09-28 14:31+0700\n" -"PO-Revision-Date: 2022-09-28 14:50+0700\n" +"POT-Creation-Date: 2022-11-30 11:05+0700\n" +"PO-Revision-Date: 2022-11-30 20:45+0700\n" "Last-Translator: Bagas Sanjaya <bagasdotme@gmail.com>\n" "Language-Team: Indonesian\n" "Language: id\n" @@ -900,6 +900,11 @@ msgstr "baris perintah diakhiri dengan \\" msgid "unclosed quote" msgstr "tanda kutip tak ditutup" +#: alias.c builtin/cat-file.c builtin/notes.c builtin/prune-packed.c +#: builtin/receive-pack.c builtin/tag.c +msgid "too many arguments" +msgstr "terlalu banyak argumen" + #: apply.c #, c-format msgid "unrecognized whitespace option '%s'" @@ -1364,7 +1369,7 @@ msgid "No valid patches in input (allow with \"--allow-empty\")" msgstr "" "Tidak ada tambalan valid dalam masukan (perbolehkan dengan \"--allow-empty\")" -#: apply.c +#: apply.c t/helper/test-cache-tree.c msgid "unable to read index file" msgstr "tidak dapa membaca berkas indeks" @@ -1599,7 +1604,7 @@ msgstr "tidak ada referensi seperti: %.*s" msgid "not a valid object name: %s" msgstr "bukan nama objek valid: %s" -#: archive.c +#: archive.c t/helper/test-cache-tree.c #, c-format msgid "not a tree object: %s" msgstr "bukan objek pohon: %s" @@ -1650,7 +1655,7 @@ msgid "prepend prefix to each pathname in the archive" msgstr "tambahkan prefiks di depan setiap nama jalur dalam arsip" #: archive.c builtin/blame.c builtin/commit-tree.c builtin/config.c -#: builtin/fast-export.c builtin/grep.c builtin/hash-object.c +#: builtin/fast-export.c builtin/gc.c builtin/grep.c builtin/hash-object.c #: builtin/ls-files.c builtin/notes.c builtin/read-tree.c parse-options.h msgid "file" msgstr "berkas" @@ -3116,54 +3121,6 @@ msgstr "" "keluar %d" #: builtin/bisect--helper.c -msgid "reset the bisection state" -msgstr "setel ulang keadaan pembagian dua" - -#: builtin/bisect--helper.c -msgid "check whether bad or good terms exist" -msgstr "periksa apakah ada istilah jelek atau bagus" - -#: builtin/bisect--helper.c -msgid "print out the bisect terms" -msgstr "cetak istilah pembagian dua" - -#: builtin/bisect--helper.c -msgid "start the bisect session" -msgstr "mulai sesi pembagian dua" - -#: builtin/bisect--helper.c -msgid "find the next bisection commit" -msgstr "temukan komit pembagian dua berikutnya" - -#: builtin/bisect--helper.c -msgid "mark the state of ref (or refs)" -msgstr "tandai keadaan referensi" - -#: builtin/bisect--helper.c -msgid "list the bisection steps so far" -msgstr "daftar langkah pembagian dua sejauh ini" - -#: builtin/bisect--helper.c -msgid "replay the bisection process from the given file" -msgstr "mainkan ulang proses pembagian dua dari berkas yang diberikan" - -#: builtin/bisect--helper.c -msgid "skip some commits for checkout" -msgstr "lewati beberapa komit untuk checkout" - -#: builtin/bisect--helper.c -msgid "visualize the bisection" -msgstr "visualisasikan pembagian dua" - -#: builtin/bisect--helper.c -msgid "use <cmd>... to automatically bisect" -msgstr "gunakan <cmd>... untuk bagi dua otomatis." - -#: builtin/bisect--helper.c -msgid "no log for BISECT_WRITE" -msgstr "tidak ada log untuk BISECT_WRITE" - -#: builtin/bisect--helper.c msgid "--bisect-reset requires either no argument or a commit" msgstr "--bisect-reset butuh baik tanpa argumen atau sebuah komit" @@ -3188,6 +3145,10 @@ msgid "git blame [<options>] [<rev-opts>] [<rev>] [--] <file>" msgstr "git blame [<opsi>] [<opsi revisi>] [<revisi>] [--] <berkas>" #: builtin/blame.c +msgid "git annotate [<options>] [<rev-opts>] [<rev>] [--] <file>" +msgstr "git annotate [<opsi>] [<opsi revisi>] [<revisi>] [--] <berkas>" + +#: builtin/blame.c msgid "<rev-opts> are documented in git-rev-list(1)" msgstr "<opsi revisi> didokumentasikan dalam git-rev-list(1)" @@ -3427,10 +3388,6 @@ msgid "cannot use -a with -d" msgstr "tidak dapat gunakan -a dengan -d" #: builtin/branch.c -msgid "Couldn't look up commit object for HEAD" -msgstr "Tidak dapat mencari objek komit untuk HEAD" - -#: builtin/branch.c #, c-format msgid "Cannot delete branch '%s' checked out at '%s'" msgstr "Tidak dapat menghapus cabang '%s' yang ter-checkout pada '%s'" @@ -3479,17 +3436,19 @@ msgid "Branch %s is being bisected at %s" msgstr "Cabang %s sedang dibagi dua pada %s" #: builtin/branch.c -msgid "cannot copy the current branch while not on any." -msgstr "tidak dapat menyalin cabang saat ini ketika tidak ada." +#, c-format +msgid "Invalid branch name: '%s'" +msgstr "Nama cabang tidak valid: '%s'" #: builtin/branch.c -msgid "cannot rename the current branch while not on any." -msgstr "tidak dapat mengganti nama cabang saat ini ketika tidak ada." +#, c-format +msgid "No commit on branch '%s' yet." +msgstr "Belum ada komit pada cabang '%s'." #: builtin/branch.c #, c-format -msgid "Invalid branch name: '%s'" -msgstr "Nama cabang tidak valid: '%s'" +msgid "No branch named '%s'." +msgstr "Tidak ada cabang bernama '%s'." #: builtin/branch.c msgid "Branch rename failed" @@ -3699,14 +3658,12 @@ msgid "cannot edit description of more than one branch" msgstr "tidak dapat menyunting deskripsi lebih dari satu cabang" #: builtin/branch.c -#, c-format -msgid "No commit on branch '%s' yet." -msgstr "Belum ada komit pada cabang '%s'." +msgid "cannot copy the current branch while not on any." +msgstr "tidak dapat menyalin cabang saat ini ketika tidak ada." #: builtin/branch.c -#, c-format -msgid "No branch named '%s'." -msgstr "Tidak ada cabang bernama '%s'." +msgid "cannot rename the current branch while not on any." +msgstr "tidak dapat mengganti nama cabang saat ini ketika tidak ada." #: builtin/branch.c msgid "too many branches for a copy operation" @@ -3794,11 +3751,12 @@ msgstr "" #: builtin/bugreport.c msgid "" -"git bugreport [-o|--output-directory <file>] [-s|--suffix <format>] [--" -"diagnose[=<mode>]" +"git bugreport [(-o | --output-directory) <path>] [(-s | --suffix) <format>]\n" +" [--diagnose[=<mode>]]" msgstr "" -"git bugreport [-o|--output-directory <berkas>] [-s|--suffix <format>] [--" -"diagnose[=<mode>]]" +"git bugreport [(-o | --output-directory) <berkas>] [(-s |-- suffix) " +"<format>]\n" +" [--diagnose[=<mode>]]" #: builtin/bugreport.c msgid "" @@ -3881,20 +3839,26 @@ msgid "Created new report at '%s'.\n" msgstr "Laporan baru dibuat pada '%s'.\n" #: builtin/bundle.c -msgid "git bundle create [<options>] <file> <git-rev-list args>" -msgstr "git bundle create [<opsi>] <berkas> <argumen git-rev-list>" +msgid "" +"git bundle create [-q | --quiet | --progress | --all-progress] [--all-" +"progress-implied]\n" +" [--version=<version>] <file> <git-rev-list-args>" +msgstr "" +"git bundle create [-q | --quiet | --progress | --all-progress] [-all-" +"progress-implied]\n" +" [--version=<versi>] <berkas> <argumen git-rev-list>" #: builtin/bundle.c -msgid "git bundle verify [<options>] <file>" -msgstr "git bundle verify [<opsi>] <berkas>" +msgid "git bundle verify [-q | --quiet] <file>" +msgstr "git bundle verify [-q | --quiet] <berkas>" #: builtin/bundle.c msgid "git bundle list-heads <file> [<refname>...]" msgstr "git bundle list-heads <berkas> [<nama referensi>...]" #: builtin/bundle.c -msgid "git bundle unbundle <file> [<refname>...]" -msgstr "git bundle unbundle <berkas> [<nama referensi>...]" +msgid "git bundle unbundle [--progress] <file> [<refname>...]" +msgstr "git bundle unbundle [--progress] <berkas> [<nama referensi>...]" #: builtin/bundle.c builtin/pack-objects.c msgid "do not show progress meter" @@ -3991,12 +3955,12 @@ msgid "" "git cat-file (--batch | --batch-check | --batch-command) [--batch-all-" "objects]\n" " [--buffer] [--follow-symlinks] [--unordered]\n" -" [--textconv | --filters]" +" [--textconv | --filters] [-z]" msgstr "" "git cat-file (--batch | --batch-check | --batch-command) [--batch-all-" "objects]\n" " [--buffer] [--follow-symlinks] [--unordered]\n" -" [--textconv | --filters]" +" [--textconv | --filters] [-z]" #: builtin/cat-file.c msgid "" @@ -4138,11 +4102,6 @@ msgstr "<revisi> diperlukan dengan '%s'" msgid "<object> required with '-%c'" msgstr "<objek> diperlukan dengan '-%c'" -#: builtin/cat-file.c builtin/notes.c builtin/prune-packed.c -#: builtin/receive-pack.c builtin/tag.c -msgid "too many arguments" -msgstr "terlalu banyak argumen" - #: builtin/cat-file.c #, c-format msgid "only two arguments allowed in <type> <object> mode, not %d" @@ -4810,9 +4769,11 @@ msgstr "gunakan mode hamparan" #: builtin/clean.c msgid "" -"git clean [-d] [-f] [-i] [-n] [-q] [-e <pattern>] [-x | -X] [--] <paths>..." +"git clean [-d] [-f] [-i] [-n] [-q] [-e <pattern>] [-x | -X] [--] " +"[<pathspec>...]" msgstr "" -"git clean [-d] [-f] [-i] [-n] [-q] [-e <pola>] [-x | -X] [--] <jalur>..." +"git clean [-d] [-f] [-i] [-n] [-q] [-e <pola>] [-x | -X] [--] [<spek " +"jalur>...]" #: builtin/clean.c #, c-format @@ -5181,6 +5142,11 @@ msgstr "%s ada dan bukan direktori" msgid "failed to start iterator over '%s'" msgstr "gagal memulai iterator pada '%s'" +#: builtin/clone.c +#, c-format +msgid "symlink '%s' exists, refusing to clone with --local" +msgstr "tautan simbolik '%s' ada, menolak mengkloning dengan --local" + #: builtin/clone.c compat/precompose_utf8.c #, c-format msgid "failed to unlink '%s'" @@ -5263,11 +5229,6 @@ msgid "You must specify a repository to clone." msgstr "Anda harus sebutkan repositori untuk diklon." #: builtin/clone.c -#, c-format -msgid "options '%s' and '%s %s' cannot be used together" -msgstr "opsi '%s' dan '%s %s' tidak dapat digunakan bersamaan" - -#: builtin/clone.c msgid "" "--bundle-uri is incompatible with --depth, --shallow-since, and --shallow-" "exclude" @@ -5423,22 +5384,28 @@ msgstr "--command harus menjadi argumen pertama" #: builtin/commit-graph.c msgid "" -"git commit-graph verify [--object-dir <objdir>] [--shallow] [--[no-]progress]" +"git commit-graph verify [--object-dir <dir>] [--shallow] [--[no-]progress]" msgstr "" -"git commit-graph verify [--object-dir <direktori objek>] [--shallow] [--" +"git commit-graph verify [--object-dir <direktori>] [--shallow] [--" "[no-]progress]" #: builtin/commit-graph.c msgid "" -"git commit-graph write [--object-dir <objdir>] [--append] [--" -"split[=<strategy>]] [--reachable|--stdin-packs|--stdin-commits] [--changed-" -"paths] [--[no-]max-new-filters <n>] [--[no-]progress] <split options>" -msgstr "" -"git commit-graph write [--object-dir <direktori objek>] [--append] [--" -"split[=<strategi>]] [--reachable|--stdin-packs|--stdin-commits] [--changed-" -"paths] [--[no-]max-new-filters <n>] [--[-no-]progrss] <opsi pemisah>" - -#: builtin/commit-graph.c builtin/fetch.c builtin/log.c +"git commit-graph write [--object-dir <dir>] [--append]\n" +" [--split[=<strategy>]] [--reachable | --stdin-packs | " +"--stdin-commits]\n" +" [--changed-paths] [--[no-]max-new-filters <n>] [--" +"[no-]progress]\n" +" <split options>" +msgstr "" +"git commit-graph write [--object-dir <direktori>] [--append]\n" +" [--split[=<strategi>]] [--reachable | --stdin-packs | " +"--stdin-commits]\n" +" [--changed-paths] [--[no-]max-new-filters <n>] [--[-" +"no-]progress]\n" +" <opsi pemisahan>" + +#: builtin/commit-graph.c builtin/fetch.c builtin/log.c builtin/repack.c msgid "dir" msgstr "direktori" @@ -5526,12 +5493,16 @@ msgid "Collecting commits from input" msgstr "Mengumpulkan komit dari masukan" #: builtin/commit-tree.c +msgid "git commit-tree <tree> [(-p <parent>)...]" +msgstr "git commit-tree <pohon> [(-p <induk>)...]" + +#: builtin/commit-tree.c msgid "" -"git commit-tree [(-p <parent>)...] [-S[<keyid>]] [(-m <message>)...] [(-F " -"<file>)...] <tree>" +"git commit-tree [(-p <parent>)...] [-S[<keyid>]] [(-m <message>)...]\n" +" [(-F <file>)...] <tree>" msgstr "" -"git commit-tree [(-p <induk>)...] [-S[<id kunci>]] [(-m <pesan>)...] [(-F " -"<berkas>)...] <pohon>" +"git commit-tree [(-p <induk>)...] [-S[<id kunci>]] [(-m <pesan>)...]\n" +" [(-F <berkas>)...] <pohon>" #: builtin/commit-tree.c #, c-format @@ -5588,12 +5559,31 @@ msgid "git commit-tree: failed to read" msgstr "git commit-tree: gagal membaca" #: builtin/commit.c -msgid "git commit [<options>] [--] <pathspec>..." -msgstr "git commit [<opsi>] [--] <spek jalur>..." +msgid "" +"git commit [-a | --interactive | --patch] [-s] [-v] [-u<mode>] [--amend]\n" +" [--dry-run] [(-c | -C | --squash) <commit> | --fixup [(amend|" +"reword):]<commit>)]\n" +" [-F <file> | -m <msg>] [--reset-author] [--allow-empty]\n" +" [--allow-empty-message] [--no-verify] [-e] [--author=<author>]\n" +" [--date=<date>] [--cleanup=<mode>] [--[no-]status]\n" +" [-i | -o] [--pathspec-from-file=<file> [--pathspec-file-nul]]\n" +" [(--trailer <token>[(=|:)<value>])...] [-S[<keyid>]]\n" +" [--] [<pathspec>...]" +msgstr "" +"git commit [-a | --interactive | --patch] [-s] [-v] [-u<mode>] [--amend]\n" +" [--dry-run] [(-c | -C | --squash) <komit> | --fixup [(amend|" +"reword):]<komit>)]\n" +" [-F <berkas> | -m <pesan>] [--reset-author] [--allow-empty]\n" +" [--allow-empty-message] [--no-verify] [-e] [--" +"author=<pengarang>]\n" +" [--date=<tanggal>] [--cleanup=<mode>] [--[no-]status]\n" +" [-i | -o] [--pathspec-from-file=<berkas> [--pathspec-file-nul]]\n" +" [(--trailer <token>[(=|:)<nilai>])...] [-S[<id kunci>]]\n" +" [--] [<spek jalur>...]" #: builtin/commit.c -msgid "git status [<options>] [--] <pathspec>..." -msgstr "git status [<opsi>] [--] <spek jalur>..." +msgid "git status [<options>] [--] [<pathspec>...]" +msgstr "git status [<opsi>] [--] [<spek jalur>...]" #: builtin/commit.c msgid "" @@ -6215,7 +6205,7 @@ msgstr "gunakan berkas konfigurasi repositori" msgid "use per-worktree config file" msgstr "gunakan berkas konfigurasi per pohon kerja" -#: builtin/config.c +#: builtin/config.c builtin/gc.c msgid "use given config file" msgstr "gunakan berkas konfigurasi yang diberikan" @@ -6439,7 +6429,7 @@ msgstr "--blob hanya dapat digunakan di dalam repositori git" msgid "--worktree can only be used inside a git repository" msgstr "--worktree hanya dapat digunakan di dalam repositori git" -#: builtin/config.c +#: builtin/config.c builtin/gc.c msgid "$HOME not set" msgstr "$HOME tak disetel" @@ -6553,12 +6543,20 @@ msgstr "" "tidak dapat mendapatkan kunci penyimpanan kredensial dalam %d milidetik" #: builtin/describe.c -msgid "git describe [<options>] [<commit-ish>...]" -msgstr "git describe [<opsi>] [<mirip-komit>...]" +msgid "" +"git describe [--all] [--tags] [--contains] [--abbrev=<n>] [<commit-ish>...]" +msgstr "" +"git describe [--all] [--tags] [--contains] [--abbrev=<n>] [<mirip-komit>...]" + +#: builtin/describe.c +msgid "" +"git describe [--all] [--tags] [--contains] [--abbrev=<n>] --dirty[=<mark>]" +msgstr "" +"git describe [--all] [--tags] [--contains] [--abbrev=<n>] --dirty[=<penanda>]" #: builtin/describe.c -msgid "git describe [<options>] --dirty" -msgstr "git describe [<opsi>] --dirty" +msgid "git describe <blob>" +msgstr "git describe <blob>" #: builtin/describe.c msgid "head" @@ -6713,11 +6711,11 @@ msgstr "opsi '%s' dan mirip-komit tidak dapat digunakan bersamaan" #: builtin/diagnose.c msgid "" -"git diagnose [-o|--output-directory <path>] [-s|--suffix <format>] [--" -"mode=<mode>]" +"git diagnose [(-o | --output-directory) <path>] [(-s | --suffix) <format>]\n" +" [--mode=<mode>]" msgstr "" -"git diagnose [-o|--output-directory <jalur>] [-s|--suffix <format>] [--" -"mode=<mode>]" +"git diagnose [(-o | --output-directory) <jalur>] [(-s | --suffix) <format>]\n" +" [--mode=<mode>]" #: builtin/diagnose.c msgid "specify a destination for the diagnostics archive" @@ -6741,6 +6739,10 @@ msgid "'%s': not a regular file or symlink" msgstr "'%s': bukan berkas reguler atau tautan simbolik" #: builtin/diff.c +msgid "no merge given, only parents." +msgstr "tidak ada penggabungan yang diberikan, hanya induk." + +#: builtin/diff.c #, c-format msgid "invalid option: %s" msgstr "opsi tidak valid: %s" @@ -7552,8 +7554,8 @@ msgid "print only refs which don't contain the commit" msgstr "hanya cetak referensi yang tidak berisi komit" #: builtin/for-each-repo.c -msgid "git for-each-repo --config=<config> <command-args>" -msgstr "git for-each-repo --config=<konfigurasi> <argumen perintah>" +msgid "git for-each-repo --config=<config> [--] <arguments>" +msgstr "git for-each-repo --config=<konfigurasi> [--] <argumen perintah>" #: builtin/for-each-repo.c msgid "config" @@ -7770,8 +7772,16 @@ msgid "%s: invalid sha1 pointer in resolve-undo" msgstr "%s: penunjuk sha1 tidak valid di resolve-undo" #: builtin/fsck.c -msgid "git fsck [<options>] [<object>...]" -msgstr "git fsck [<opsi>] [<objek>...]" +msgid "" +"git fsck [--tags] [--root] [--unreachable] [--cache] [--no-reflogs]\n" +" [--[no-]full] [--strict] [--verbose] [--lost-found]\n" +" [--[no-]dangling] [--[no-]progress] [--connectivity-only]\n" +" [--[no-]name-objects] [<object>...]" +msgstr "" +"git fsck [--tags] [--root] [--unreachable] [--cache] [--no-reflogs]\n" +" [--[no-]full] [--strict] [--verbose] [--lost-found]\n" +" [--[no-]dangling] [--[no-]progress] [--connectivity-only]\n" +" [--[no-]name-objects] [<objek>...]" #: builtin/fsck.c msgid "show unreachable objects" @@ -7844,14 +7854,6 @@ msgid "git fsmonitor--daemon run [<options>]" msgstr "git fsmonitor--daemon run [<opsi>]" #: builtin/fsmonitor--daemon.c -msgid "git fsmonitor--daemon stop" -msgstr "git fsmonitor--daemon stop" - -#: builtin/fsmonitor--daemon.c -msgid "git fsmonitor--daemon status" -msgstr "git fsmonitor--daemon status" - -#: builtin/fsmonitor--daemon.c #, c-format msgid "value of '%s' out of range: %d" msgstr "nilai '%s' di luar jangkauan: %d" @@ -7952,7 +7954,7 @@ msgstr "" msgid "invalid 'ipc-threads' value (%d)" msgstr "nilai 'ipc-threads' tidak valid (%d)" -#: builtin/fsmonitor--daemon.c +#: builtin/fsmonitor--daemon.c t/helper/test-cache-tree.c #, c-format msgid "Unhandled subcommand '%s'" msgstr "Subperintah tidak tertangani '%s'" @@ -8157,8 +8159,23 @@ msgid "use at most one of --auto and --schedule=<frequency>" msgstr "gunakan paling banyak satu dari --auto dan --schedule=<frekuensi>" #: builtin/gc.c -msgid "failed to run 'git config'" -msgstr "gagal menjalankan 'git config'" +#, c-format +msgid "unable to add '%s' value of '%s'" +msgstr "tidak dapat menambahkan nilai '%s' dari '%s'" + +#: builtin/gc.c +msgid "return success even if repository was not registered" +msgstr "kembalikan sukses bahkan jika repositori tidak terdaftar" + +#: builtin/gc.c +#, c-format +msgid "unable to unset '%s' value of '%s'" +msgstr "tidak dapat membatal-setel nilai '%s' dari '%s'" + +#: builtin/gc.c +#, c-format +msgid "repository '%s' is not registered" +msgstr "repositori '%s' tidak terdaftar" #: builtin/gc.c #, c-format @@ -8537,11 +8554,15 @@ msgstr "baik --cached dan pohon diberikan" #: builtin/hash-object.c msgid "" -"git hash-object [-t <type>] [-w] [--path=<file> | --no-filters] [--stdin] " -"[--] <file>..." +"git hash-object [-t <type>] [-w] [--path=<file> | --no-filters]\n" +" [--stdin [--literally]] [--] <file>..." msgstr "" -"git hash-object [-t <tipe>] [-w] [--path=<berkas> | --no-filters] [--stdin] " -"[--] <berkas>..." +"git hash-object [-t <tipe>] [-w] [--path=<berkas> | --no-filters]\n" +" [--stdin [--literally]] [--] <berkas>..." + +#: builtin/hash-object.c +msgid "git hash-object [-t <type>] [-w] --stdin-paths [--no-filters]" +msgstr "git hash-object [-t <tipe>] [-w] --stdin-paths [--no-filters]" #: builtin/hash-object.c msgid "object type" @@ -9080,11 +9101,15 @@ msgstr "Repositori Git kosong dinisialisasi di %s%s\n" #: builtin/init-db.c msgid "" -"git init [-q | --quiet] [--bare] [--template=<template-directory>] [--" -"shared[=<permissions>]] [<directory>]" +"git init [-q | --quiet] [--bare] [--template=<template-directory>]\n" +" [--separate-git-dir <git-dir>] [--object-format=<format>]\n" +" [-b <branch-name> | --initial-branch=<branch-name>]\n" +" [--shared[=<permissions>]] [<directory>]" msgstr "" -"git init [-q | --quiet] [--bare] [--template=<direktori-templat>][--" -"shared[=<perizinan>]] [<direktori>]" +"git init [-q | --quiet] [--bare] [--template=<direktori templat>]\n" +" [--separate-git-dir <direktori git>] [--object-format=<format>]\n" +" [-b <nama cabang> | --initial-branch=<nama cabang>]\n" +" [--shared[=<perizinan>]] [<direktori>]" #: builtin/init-db.c msgid "permissions" @@ -9137,11 +9162,13 @@ msgstr "--separate-git-dir tidak kompatibel dengan repositori bare" #: builtin/interpret-trailers.c msgid "" -"git interpret-trailers [--in-place] [--trim-empty] [(--trailer " -"<token>[(=|:)<value>])...] [<file>...]" +"git interpret-trailers [--in-place] [--trim-empty]\n" +" [(--trailer <token>[(=|:)<value>])...]\n" +" [--parse] [<file>...]" msgstr "" -"git interpret-trailers [--in-place] [--trim-empty] [(--trailer " -"<token>[(=|:)<nilai>])...] [<berkas>...]" +"git interpret-trailers [--in-place] [--trim-empty]\n" +" [(--trailer <token>[(=|:)<nilai>])...]\n" +" [--parse] [<berkas>...]" #: builtin/interpret-trailers.c msgid "edit files in place" @@ -9771,11 +9798,11 @@ msgstr "" #: builtin/ls-remote.c msgid "" "git ls-remote [--heads] [--tags] [--refs] [--upload-pack=<exec>]\n" -" [-q | --quiet] [--exit-code] [--get-url]\n" +" [-q | --quiet] [--exit-code] [--get-url] [--sort=<key>]\n" " [--symref] [<repository> [<refs>...]]" msgstr "" "git ls-remote [--heads] [--tags] [--refs] [--upload-pack=<exec>]\n" -" [-q | --quiet] [--exit-code] [--get-url]\n" +" [-q | --quiet] [--exit-code] [--get-url] [--sort=<kunci>]\n" " [--symref] [<repositori> [<referensi>...]]" #: builtin/ls-remote.c @@ -9948,14 +9975,14 @@ msgid "git merge-base [-a | --all] --octopus <commit>..." msgstr "git merge-base [-a | --all] --octopus <komit>..." #: builtin/merge-base.c -msgid "git merge-base --independent <commit>..." -msgstr "git merge-base --independent <komit>..." - -#: builtin/merge-base.c msgid "git merge-base --is-ancestor <commit> <commit>" msgstr "git merge-base --is-ancestor <komit> <komit>" #: builtin/merge-base.c +msgid "git merge-base --independent <commit>..." +msgstr "git merge-base --independent <komit>..." + +#: builtin/merge-base.c msgid "git merge-base --fork-point <ref> [<commit>]" msgstr "git merge-base --fork-point <referensi> [<komit>]" @@ -10095,9 +10122,23 @@ msgid "allow merging unrelated histories" msgstr "perbolehkan penggabungan riwayat yang tak terkait" #: builtin/merge-tree.c +msgid "perform multiple merges, one per line of input" +msgstr "lakukan banyak penggabungan, satu per baris masukan" + +#: builtin/merge-tree.c msgid "--trivial-merge is incompatible with all other options" msgstr "--trivial-merge tidak kompatibel dengan semua opsi lainnya" +#: builtin/merge-tree.c builtin/notes.c +#, c-format +msgid "malformed input line: '%s'." +msgstr "baris masukan jelek: '%s'." + +#: builtin/merge-tree.c +#, c-format +msgid "merging cannot continue; got unclean result of %d" +msgstr "penggabungan tidak dapat berlanjut; dapat hasil kotor dari %d" + #: builtin/merge.c msgid "git merge [<options>] [<commit>...]" msgstr "git merge [<opsi>] [<komit>...]" @@ -10680,7 +10721,7 @@ msgstr "%s, source=%s, destination=%s" msgid "Renaming %s to %s\n" msgstr "Mengganti nama %s ke %s\n" -#: builtin/mv.c builtin/remote.c builtin/repack.c +#: builtin/mv.c builtin/remote.c #, c-format msgid "renaming '%s' failed" msgstr "gagal mengganti nama '%s'" @@ -10886,11 +10927,6 @@ msgstr "gagal membaca data catatan dari objek bukan blob '%s'." #: builtin/notes.c #, c-format -msgid "malformed input line: '%s'." -msgstr "baris masukan jelek: '%s'." - -#: builtin/notes.c -#, c-format msgid "failed to copy notes from '%s' to '%s'" msgstr "gagal menyalin catatan dari '%s' ke '%s'" @@ -11130,15 +11166,14 @@ msgid "unknown subcommand: `%s'" msgstr "subperintah tidak dikenal: `%s'" #: builtin/pack-objects.c -msgid "" -"git pack-objects --stdout [<options>...] [< <ref-list> | < <object-list>]" +msgid "git pack-objects --stdout [<options>] [< <ref-list> | < <object-list>]" msgstr "" -"git pack-objects --stdout [<opsi>...] [< <daftar referensi>| < <daftar-" +"git pack-objects --stdout [<opsi>...] [< <daftar referensi> | < <daftar-" "objek>]" #: builtin/pack-objects.c msgid "" -"git pack-objects [<options>...] <base-name> [< <ref-list> | < <object-list>]" +"git pack-objects [<options>] <base-name> [< <ref-list> | < <object-list>]" msgstr "" "git pack-objects [<opsi>...] <nama dasar> [< <daftar referensi> | < <daftar-" "objek>]" @@ -11620,8 +11655,8 @@ msgstr "" "<git@vger.kernel.org>. Terima kasih.\n" #: builtin/pack-refs.c -msgid "git pack-refs [<options>]" -msgstr "git pack-refs [<opsi>]" +msgid "git pack-refs [--all] [--no-prune]" +msgstr "git pack-refs [--all] [--no-prune]" #: builtin/pack-refs.c msgid "pack everything" @@ -11631,6 +11666,22 @@ msgstr "pak semuanya" msgid "prune loose refs (default)" msgstr "pangkas referensi longgar (asali)" +#: builtin/patch-id.c +msgid "git patch-id [--stable | --unstable | --verbatim]" +msgstr "git patch-id [--stable | --unstable | --verbatim]" + +#: builtin/patch-id.c +msgid "use the unstable patch-id algorithm" +msgstr "gunakan algoritma id tambalan tidak stabil" + +#: builtin/patch-id.c +msgid "use the stable patch-id algorithm" +msgstr "gunakan algoritma id tambalan stabil" + +#: builtin/patch-id.c +msgid "don't strip whitespace from the patch" +msgstr "jangan kupas spasi dari tambalan" + #: builtin/prune.c msgid "git prune [-n] [-v] [--progress] [--expire <time>] [--] [<head>...]" msgstr "git prune [-n] [-v] [--progress] [--expire <waktu>] [--] [<kepala>...]" @@ -11895,14 +11946,13 @@ msgstr "" #: builtin/push.c msgid "" "\n" -"To avoid automatically configuring upstream branches when their name\n" -"doesn't match the local branch, see option 'simple' of branch." -"autoSetupMerge\n" +"To avoid automatically configuring an upstream branch when its name\n" +"won't match the local branch, see option 'simple' of branch.autoSetupMerge\n" "in 'git help config'.\n" msgstr "" "\n" "Untuk menghindari konfigurasi cabang hulu otomatis ketika namanya\n" -"tidak cocok dengan cabang lokal, lihat opsi 'simple' dari branch." +"tidak akan cocok dengan cabang lokal, lihat opsi 'simple' dari branch." "autoSetupMerge\n" "di 'git help config'.\n" @@ -12068,6 +12118,14 @@ msgstr "Mendorong ke %s\n" msgid "failed to push some refs to '%s'" msgstr "gagal dorong beberapa referensi ke '%s'" +#: builtin/push.c +msgid "" +"recursing into submodule with push.recurseSubmodules=only; using on-demand " +"instead" +msgstr "" +"mengulangi ke dalam submodul dengan push.recurseSubmodules=only; menggunakan " +"on-demand sebagai gantinya" + #: builtin/push.c builtin/send-pack.c submodule-config.c #, c-format msgid "invalid value for '%s'" @@ -12242,14 +12300,15 @@ msgstr "butuh dua rentang komit" #: builtin/read-tree.c msgid "" -"git read-tree [(-m [--trivial] [--aggressive] | --reset | --prefix=<prefix>) " -"[-u | -i]] [--no-sparse-checkout] [--index-output=<file>] (--empty | <tree-" -"ish1> [<tree-ish2> [<tree-ish3>]])" +"git read-tree [(-m [--trivial] [--aggressive] | --reset | --" +"prefix=<prefix>)\n" +" [-u | -i]] [--index-output=<file>] [--no-sparse-checkout]\n" +" (--empty | <tree-ish1> [<tree-ish2> [<tree-ish3>]])" msgstr "" "git read-tree [(-m [--trivial] [--aggressive] | --reset | --" -"prefix=<prefiks>) [-u | -i]] [--no-sparse-checkout] [--index-" -"output=<berkas>] (--empty | <mirip-pohon 1> [<mirip-pohon 2> <mirip-pohon " -"3>])" +"prefix=<awalan>)\n" +" [-u | -i]] [--index-output=<berkas>] [--no-sparse-checkout]\n" +" (--empty | <mirip pohon 1> [<mirip pohon 2> [mirip pohon 3]])" #: builtin/read-tree.c msgid "write resulting index to <file>" @@ -12368,8 +12427,8 @@ msgstr "%s butuh tulang belakang penggabungan" #: builtin/rebase.c #, c-format -msgid "could not get 'onto': '%s'" -msgstr "tidak dapat mendapatkan 'ke': '%s'" +msgid "invalid onto: '%s'" +msgstr "kepada tidak valid: '%s'" #: builtin/rebase.c #, c-format @@ -12742,8 +12801,8 @@ msgid "No such ref: %s" msgstr "Tidak ada referensi seperti: %s" #: builtin/rebase.c -msgid "Could not resolve HEAD to a revision" -msgstr "Tidak dapat menguraikan HEAD ke sebuah revisi" +msgid "Could not resolve HEAD to a commit" +msgstr "tidak dapat menguraikan komit HEAD ke sebuah komit" #: builtin/rebase.c #, c-format @@ -13558,6 +13617,11 @@ msgid "could not close refs snapshot tempfile" msgstr "tidak dapat menutup berkas sementara jepretan referensi" #: builtin/repack.c +#, c-format +msgid "could not remove stale bitmap: %s" +msgstr "tidak dapt memindahkan bitmap basi: %s" + +#: builtin/repack.c msgid "pack everything in a single pack" msgstr "pak semuanya dalam satu pak" @@ -13656,6 +13720,10 @@ msgid "write a multi-pack index of the resulting packs" msgstr "tulis indeks multipak dari pak yang dihasilkan" #: builtin/repack.c +msgid "pack prefix to store a pack containing pruned objects" +msgstr "awalan pak untuk menyimpan pak berisi objek terpangkas" + +#: builtin/repack.c msgid "cannot delete packs in a precious-objects repo" msgstr "tidak dapat menghapus pak dalam repositori objek berharga" @@ -13670,11 +13738,16 @@ msgstr "nama berkas paket %s tidak diawali dengan %s" #: builtin/repack.c #, c-format -msgid "missing required file: %s" -msgstr "berkas yang diperlukan hilang: %s" +msgid "renaming pack to '%s' failed" +msgstr "gagal mengganti nama pak ke '%s'" #: builtin/repack.c #, c-format +msgid "pack-objects did not write a '%s' file for pack %s-%s" +msgstr "pack-objects tidak menulis berkas '%s' untuk pak %s-%s" + +#: builtin/repack.c sequencer.c +#, c-format msgid "could not unlink: %s" msgstr "tidak dapat membatal taut: %s" @@ -13917,8 +13990,10 @@ msgid "only one pattern can be given with -l" msgstr "hanya satu pola yang dapat diberikan dengan -l" #: builtin/rerere.c -msgid "git rerere [clear | forget <path>... | status | remaining | diff | gc]" -msgstr "git rerere [clear | forge <jalur>... | status | remaining | diff | gc]" +msgid "" +"git rerere [clear | forget <pathspec>... | diff | status | remaining | gc]" +msgstr "" +"git rerere [clear | forget <spek jalur>... | diff | status | remaining | gc]" #: builtin/rerere.c msgid "register clean resolutions in index" @@ -14176,6 +14251,18 @@ msgstr "--prefix butuh sebuah argumen" msgid "unknown mode for --abbrev-ref: %s" msgstr "mode untuk --abbrev-ref tidak dikenal: %s" +#: builtin/rev-parse.c revision.c +msgid "--exclude-hidden cannot be used together with --branches" +msgstr "--exclude-hidden tidak dapat digunakan bersamaan dengan --branches" + +#: builtin/rev-parse.c revision.c +msgid "--exclude-hidden cannot be used together with --tags" +msgstr "--exclude-hidden tidak dapat digunakan bersamaan dengan --tags" + +#: builtin/rev-parse.c revision.c +msgid "--exclude-hidden cannot be used together with --remotes" +msgstr "--exclude-hidden tidak dapat digunakan dengan --remotes" + #: builtin/rev-parse.c setup.c msgid "this operation must be run in a work tree" msgstr "operasi ini harus dijalankan di dalam pohon kerja" @@ -14186,20 +14273,28 @@ msgid "unknown mode for --show-object-format: %s" msgstr "mode untuk --show-object-format tidak dikenal: %s" #: builtin/revert.c -msgid "git revert [<options>] <commit-ish>..." -msgstr "git revert [<opsi>] <mirip-komit>..." +msgid "" +"git revert [--[no-]edit] [-n] [-m <parent-number>] [-s] [-S[<keyid>]] " +"<commit>..." +msgstr "" +"git revert [--[no-]edit] [-n] [-m <nomor induk>] [-s] [-S[<id kunci>]] " +"<komit>..." #: builtin/revert.c -msgid "git revert <subcommand>" -msgstr "git revert <subperintah>" +msgid "git revert (--continue | --skip | --abort | --quit)" +msgstr "git revert (--continue | --skip | --abort | --quit)" #: builtin/revert.c -msgid "git cherry-pick [<options>] <commit-ish>..." -msgstr "git cherry-pick [<opsi>] <mirip-komit>..." +msgid "" +"git cherry-pick [--edit] [-n] [-m <parent-number>] [-s] [-x] [--ff]\n" +" [-S[<keyid>]] <commit>..." +msgstr "" +"git cherry-pick [--edit] [-n] [-m <nomor induk>] [-s] [-x] [--ff]\n" +" [-S[<id kunci>]] <komit>..." #: builtin/revert.c -msgid "git cherry-pick <subcommand>" -msgstr "git cherry-pick <subperintah>" +msgid "git cherry-pick (--continue | --skip | --abort | --quit)" +msgstr "git cherry-pick (--continue | --skip | --abort | --quit)" #: builtin/revert.c #, c-format @@ -14280,8 +14375,14 @@ msgid "cherry-pick failed" msgstr "pemetikan ceri gagal" #: builtin/rm.c -msgid "git rm [<options>] [--] <file>..." -msgstr "git rm [<opsi>] [--] <berkas>..." +msgid "" +"git rm [-f | --force] [-n] [-r] [--cached] [--ignore-unmatch]\n" +" [--quiet] [--pathspec-from-file=<file> [--pathspec-file-nul]]\n" +" [--] [<pathspec>...]" +msgstr "" +"git rm [-f | --force] [-n] [-r] [--cached] [--ignore-unmatch]\n" +" [--quiet] [--pathspec-from-file=<berkas> [--pathspec-file-nul]]\n" +" [--] [<spek jalur>...]" #: builtin/rm.c msgid "" @@ -14369,11 +14470,13 @@ msgid "" "git send-pack [--mirror] [--dry-run] [--force]\n" " [--receive-pack=<git-receive-pack>]\n" " [--verbose] [--thin] [--atomic]\n" +" [--[no-]signed | --signed=(true|false|if-asked)]\n" " [<host>:]<directory> (--all | <ref>...)" msgstr "" "git send-pack [--mirror] [--dry-run] [--force]\n" " [--receive-pack=<git-receive-pack>\n" -"] [--verbose] [--thin] [--atomic]\n" +" [--verbose] [--thin] [--atomic]\n" +" [--[no-]signed | --signed=(true|false|if-asked)]\n" " [<tuan rumah>:]<direktori> (--all | <referensi>...)" #: builtin/send-pack.c @@ -14405,8 +14508,9 @@ msgid "using multiple --group options with stdin is not supported" msgstr "menggunakan banyak opsi --group dengan masukan standar tidak didukung" #: builtin/shortlog.c -msgid "using --group=trailer with stdin is not supported" -msgstr "mengguanakn --group=trailer dengan stdin tidak didukung" +#, c-format +msgid "using %s with stdin is not supported" +msgstr "menggunakan %s dengan masukan standar tidak didukung" #: builtin/shortlog.c #, c-format @@ -14454,12 +14558,14 @@ msgid "" "git show-branch [-a | --all] [-r | --remotes] [--topo-order | --date-order]\n" " [--current] [--color[=<when>] | --no-color] [--sparse]\n" " [--more=<n> | --list | --independent | --merge-base]\n" -" [--no-name | --sha1-name] [--topics] [(<rev> | <glob>)...]" +" [--no-name | --sha1-name] [--topics]\n" +" [(<rev> | <glob>)...]" msgstr "" "git show-branch [-a | --all] [-r | --remotes] [--topo-order | --date-order]\n" " [--current] [--color[=<kapan>] | --no-color] [--sparse]\n" " [--more=<n> | --list | --independent | --merge-base]\n" -" [--no-name | --sha1-name] [--topics] [(<revisi> | <glob>)...]" +" [--no-name | --sha1-name] [--topics]\n" +" [(<revisi> | <glob>)...]" #: builtin/show-branch.c msgid "git show-branch (-g | --reflog)[=<n>[,<base>]] [--list] [<ref>]" @@ -14589,11 +14695,13 @@ msgstr "algoritma hash tidak dikenal" #: builtin/show-ref.c msgid "" -"git show-ref [-q | --quiet] [--verify] [--head] [-d | --dereference] [-s | --" -"hash[=<n>]] [--abbrev[=<n>]] [--tags] [--heads] [--] [<pattern>...]" +"git show-ref [-q | --quiet] [--verify] [--head] [-d | --dereference]\n" +" [-s | --hash[=<n>]] [--abbrev[=<n>]] [--tags]\n" +" [--heads] [--] [<pattern>...]" msgstr "" -"git show-ref [-q | --quiet] [--verify] [--head] [-d | --dereference] [-s | --" -"hash[=<n>]] [--abbrev[=<n>]] [--tags] [--heads] [--] [<pola>...]" +"git show-ref [-q | --quiet] [--verify] [--head] [-d | --dereference]\n" +" [-s | --hash[=<n>]] [--abbrev[=<n>]] [--tags]\n" +" [--heads] [--] [<pola>...]" #: builtin/show-ref.c msgid "git show-ref --exclude-existing[=<pattern>]" @@ -14634,8 +14742,10 @@ msgstr "" "lokal" #: builtin/sparse-checkout.c -msgid "git sparse-checkout (init|list|set|add|reapply|disable) <options>" -msgstr "git sparse-checkout (init|list|set|add|reapply|disable) <opsi>" +msgid "" +"git sparse-checkout (init | list | set | add | reapply | disable) [<options>]" +msgstr "" +"git sparse-checkout (init | list | set | add | reapply | disable) [<opsi>]" #: builtin/sparse-checkout.c msgid "this worktree is not sparse" @@ -14787,76 +14897,66 @@ msgid "error while refreshing working directory" msgstr "kesalahan saat menyegarkan direktori kerja" #: builtin/stash.c -msgid "git stash list [<options>]" -msgstr "git stash list [<opsi>]" +msgid "git stash list [<log-options>]" +msgstr "git stash list [<opsi log>]" + +#: builtin/stash.c +msgid "" +"git stash show [-u | --include-untracked | --only-untracked] [<diff-" +"options>] [<stash>]" +msgstr "" +"git stash show [-u | --include-untracked | --only-untracked] [<opsi diff>] " +"[<stase>]" #: builtin/stash.c -msgid "git stash show [<options>] [<stash>]" -msgstr "git stash show [<opsi>] [<stase>]" +msgid "git stash drop [-q | --quiet] [<stash>]" +msgstr "git stash drop [-q | --quiet] [<stase>]" #: builtin/stash.c -msgid "git stash drop [-q|--quiet] [<stash>]" -msgstr "git stash drop [-q|--quiet] [<stase>]" +msgid "git stash pop [--index] [-q | --quiet] [<stash>]" +msgstr "git stash pop [--index] [-q | --quiet] [<stase>]" #: builtin/stash.c -msgid "git stash ( pop | apply ) [--index] [-q|--quiet] [<stash>]" -msgstr "git stash ( pop | apply ) [--index] [-q|--quiet] [<stase>]" +msgid "git stash apply [--index] [-q | --quiet] [<stash>]" +msgstr "git stash apply [--index] [-q | --quiet] [<stase>]" #: builtin/stash.c msgid "git stash branch <branchname> [<stash>]" msgstr "git stash branch <nama cabang> [<stase>]" #: builtin/stash.c -msgid "" -"git stash [push [-p|--patch] [-S|--staged] [-k|--[no-]keep-index] [-q|--" -"quiet]\n" -" [-u|--include-untracked] [-a|--all] [-m|--message <message>]\n" -" [--pathspec-from-file=<file> [--pathspec-file-nul]]\n" -" [--] [<pathspec>...]]" -msgstr "" -"git stash [push [-p|--patch] [-S|--staged] [-k|--[no-]keep-index]\n" -" [-q|--quiet] [-u|--include-untracked] [-a|--all]\n" -" [-m|--message <pesan>] [--pathspec-from-file=<berkas>\n" -" [--pathspec-file-nul]] [--] [<spek jalur>...]]" +msgid "git stash store [(-m | --message) <message>] [-q | --quiet] <commit>" +msgstr "git stash store [(-m | --message) <pesan>] [-q|--quiet] <komit>" #: builtin/stash.c msgid "" -"git stash save [-p|--patch] [-S|--staged] [-k|--[no-]keep-index] [-q|--" -"quiet]\n" -" [-u|--include-untracked] [-a|--all] [<message>]" +"git stash [push [-p | --patch] [-S | --staged] [-k | --[no-]keep-index] [-q " +"| --quiet]\n" +" [-u | --include-untracked] [-a | --all] [(-m | --message) " +"<message>]\n" +" [--pathspec-from-file=<file> [--pathspec-file-nul]]\n" +" [--] [<pathspec>...]]" msgstr "" -"git stash save [-p|--patch] [-S|--staged] [-k|--[no-]keep-index]\n" -" [-q|--quiet] [-u|--include-untracked] [-a|--all] [<pesan>]" - -#: builtin/stash.c -msgid "git stash pop [--index] [-q|--quiet] [<stash>]" -msgstr "git stash pop [--index] [-q|--quiet] [<stase>]" - -#: builtin/stash.c -msgid "git stash apply [--index] [-q|--quiet] [<stash>]" -msgstr "git stash apply [--index] [-q|--quiet] [<stase>]" - -#: builtin/stash.c -msgid "git stash store [-m|--message <message>] [-q|--quiet] <commit>" -msgstr "git stash store [-m|--message <pesan>] [-q|--quiet] <komit>" +"git stash [push [-p | --patch] [-S | --staged] [-k | --[no-]keep-index] [-q " +"| --quiet]\n" +" [-u | --include-untracked] [-a | --all] [(-m | --message) " +"<pesan>]\n" +" [--pathspec-from-file=<berkas> [--pathspec-file-nul]]\n" +" [--] [<spek jalur>...]]" #: builtin/stash.c msgid "" -"git stash [push [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]\n" -" [-u|--include-untracked] [-a|--all] [-m|--message <message>]\n" -" [--] [<pathspec>...]]" +"git stash save [-p | --patch] [-S | --staged] [-k | --[no-]keep-index] [-q | " +"--quiet]\n" +" [-u | --include-untracked] [-a | --all] [<message>]" msgstr "" -"git stash [push [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]\n" -" [-u|--include-untracked] [-a|--all] [-m|--message <pesan>]\n" -" [--] [<spek jalur>...]" +"git stash save [-p | --patch] [-S | --staged] [-k | --[no-]keep-index] [-q | " +"--quiet]\n" +" [-u | --include-untracked] [-a | --all] [<pesan>]" #: builtin/stash.c -msgid "" -"git stash save [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]\n" -" [-u|--include-untracked] [-a|--all] [<message>]" -msgstr "" -"git stash save [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]\n" -" [-u|--include-untracked] [-a|--all] [<pesan>]" +msgid "git stash create [<message>]" +msgstr "git stash create [<pesan>]" #: builtin/stash.c #, c-format @@ -15565,10 +15665,6 @@ msgid "don't fetch new objects from the remote site" msgstr "jangan ambil objek baru dari situs remote" #: builtin/submodule--helper.c -msgid "path into the working tree" -msgstr "jalur ke dalam pohon kerja" - -#: builtin/submodule--helper.c msgid "use the 'checkout' update strategy (default)" msgstr "gunakan strategi pembaruan 'checkout' (asali)" @@ -15614,34 +15710,10 @@ msgstr "" "[--] [<jalur>...]" #: builtin/submodule--helper.c -msgid "recurse into submodules" -msgstr "rekursi ke dalam submodul" - -#: builtin/submodule--helper.c msgid "git submodule absorbgitdirs [<options>] [<path>...]" msgstr "git submodule absorbgitdirs [<opsi>] [<jalur>...]" #: builtin/submodule--helper.c -msgid "check if it is safe to write to the .gitmodules file" -msgstr "periksa apakah itu aman untuk menulis ke berkas .gitmodules" - -#: builtin/submodule--helper.c -msgid "unset the config in the .gitmodules file" -msgstr "batal setel konfigurasi dalam berkas .gitmodules" - -#: builtin/submodule--helper.c -msgid "git submodule--helper config <name> [<value>]" -msgstr "git submodule--helper config <nama> [<nilai>]" - -#: builtin/submodule--helper.c -msgid "git submodule--helper config --unset <name>" -msgstr "git submodule--helper config --unset <nama>" - -#: builtin/submodule--helper.c -msgid "please make sure that the .gitmodules file is in the working tree" -msgstr "mohom pastikan berkas .gitmodules di dalam pohon kerja" - -#: builtin/submodule--helper.c msgid "suppress output for setting url of a submodule" msgstr "sembunyikan keluaran penyetelan url submodule" @@ -15737,6 +15809,10 @@ msgid "unable to checkout submodule '%s'" msgstr "Tidak dapat men-checkout submodul '%s'" #: builtin/submodule--helper.c +msgid "please make sure that the .gitmodules file is in the working tree" +msgstr "mohom pastikan berkas .gitmodules di dalam pohon kerja" + +#: builtin/submodule--helper.c #, c-format msgid "Failed to add submodule '%s'" msgstr "Tidak dapat menambahkan submodul '%s'" @@ -15798,23 +15874,26 @@ msgstr "URL repo: '%s' harus absolut atau diawali dengan ./|../" msgid "'%s' is not a valid submodule name" msgstr "'%s' bukan nama submodul yang valid" +#: builtin/submodule--helper.c +msgid "git submodule--helper <command>" +msgstr "git submodule--helper <nama>" + #: builtin/submodule--helper.c git.c #, c-format msgid "%s doesn't support --super-prefix" msgstr "%s tidak mendukung --super-prefix" -#: builtin/submodule--helper.c -#, c-format -msgid "'%s' is not a valid submodule--helper subcommand" -msgstr "'%s' bukan subperintah submodule--helper valid" +#: builtin/symbolic-ref.c +msgid "git symbolic-ref [-m <reason>] <name> <ref>" +msgstr "git symbolic-ref [-m <alasan>] <nama> <referensi>" #: builtin/symbolic-ref.c -msgid "git symbolic-ref [<options>] <name> [<ref>]" -msgstr "git symbolic-ref [<opsi>] <nama> [<referensi>]" +msgid "git symbolic-ref [-q] [--short] [--no-recurse] <name>" +msgstr "git symbolic-ref [-q] [--short] [--no-recurse] <nama>" #: builtin/symbolic-ref.c -msgid "git symbolic-ref -d [-q] <name>" -msgstr "git symbolic-ref -d [-q] <nama>" +msgid "git symbolic-ref --delete [-q] <name>" +msgstr "git symbolic-ref --delete [-q] <nama>" #: builtin/symbolic-ref.c msgid "suppress error message for non-symbolic (detached) refs" @@ -15828,6 +15907,10 @@ msgstr "hapus referensi simbolik" msgid "shorten ref output" msgstr "pendekkan keluaran referensi" +#: builtin/symbolic-ref.c +msgid "recursively dereference (default)" +msgstr "derefensi secara rekursif (asali)" + #: builtin/symbolic-ref.c builtin/update-ref.c msgid "reason" msgstr "alasan" @@ -15838,11 +15921,11 @@ msgstr "alasan pembaruan" #: builtin/tag.c msgid "" -"git tag [-a | -s | -u <key-id>] [-f] [-m <msg> | -F <file>]\n" -" <tagname> [<head>]" +"git tag [-a | -s | -u <key-id>] [-f] [-m <msg> | -F <file>] [-e]\n" +" <tagname> [<commit> | <object>]" msgstr "" -"git tag [-a | -s | -u <id kunci>] [-f] [-m <pesan | -F <berkas>]\n" -" <nama tag> [<kepala>]" +"git tag [-a | -s | -u <id kunci>] [-f] [-m <pesan> | -F <berkas>] [-e]\n" +" <nama tag> [<komit> | <objek>]" #: builtin/tag.c msgid "git tag -d <tagname>..." @@ -15850,15 +15933,15 @@ msgstr "git tag -d <nama tag>..." #: builtin/tag.c msgid "" -"git tag -l [-n[<num>]] [--contains <commit>] [--no-contains <commit>] [--" -"points-at <object>]\n" -" [--format=<format>] [--merged <commit>] [--no-merged <commit>] " -"[<pattern>...]" +"git tag [-n[<num>]] -l [--contains <commit>] [--no-contains <commit>]\n" +" [--points-at <object>] [--column[=<options>] | --no-column]\n" +" [--create-reflog] [--sort=<key>] [--format=<format>]\n" +" [--merged <commit>] [--no-merged <commit>] [<pattern>...]" msgstr "" -"git tag -l [-n[<angka>]] [--contains <komit>] [--no-contains <komit>] [--" -"points-at <objek>]\n" -" [--format=<format>] [--merged <komit>] [--no-merged <komit>] " -"[<pola>...]" +"git tag [-n[<angka>]] -l [--contains <komit>] [--no-contains <komit>]\n" +" [--points-at <objeck>] [--column[=<opsi>] | --no-column]\n" +" [--create-reflog] [--sort=<kunci>] [--format=<format>]\n" +" [--merged <komit>] [--no-merged <komit>] [<pola>...]" #: builtin/tag.c msgid "git tag -v [--format=<format>] <tagname>..." @@ -16340,8 +16423,12 @@ msgid "update the info files from scratch" msgstr "perbarui berkas info dari awal" #: builtin/upload-pack.c -msgid "git upload-pack [<options>] <dir>" -msgstr "git upload-pack [<opsi>] <direktori>" +msgid "" +"git-upload-pack [--[no-]strict] [--timeout=<n>] [--stateless-rpc]\n" +" [--advertise-refs] <directory>" +msgstr "" +"git-upload-pack [--[no-]strict] [--timeout=<n>] [--stateless-rpc]\n" +" [--advertise-refs] <direktori>" #: builtin/upload-pack.c t/helper/test-serve-v2.c msgid "quit after a single request/response exchange" @@ -16360,8 +16447,8 @@ msgid "interrupt transfer after <n> seconds of inactivity" msgstr "interupsi transfer setelah <n> detik niraktivitas" #: builtin/verify-commit.c -msgid "git verify-commit [-v | --verbose] <commit>..." -msgstr "git verify-commit [-v | --verbose] <komit>..." +msgid "git verify-commit [-v | --verbose] [--raw] <commit>..." +msgstr "git verify-commit [-v | --verbose] [--raw] <komit>..." #: builtin/verify-commit.c msgid "print commit contents" @@ -16372,8 +16459,8 @@ msgid "print raw gpg status output" msgstr "cetak keluaran status gpg mentah" #: builtin/verify-pack.c -msgid "git verify-pack [-v | --verbose] [-s | --stat-only] <pack>..." -msgstr "git verify-pack [-v | --verbose] [-s | --stat-only] <pak>..." +msgid "git verify-pack [-v | --verbose] [-s | --stat-only] [--] <pack>.idx..." +msgstr "git verify-pack [-v | --verbose] [-s | --stat-only] [--] <pak>.idx..." #: builtin/verify-pack.c msgid "verbose" @@ -16384,44 +16471,48 @@ msgid "show statistics only" msgstr "hanya perlihatkan statistik" #: builtin/verify-tag.c -msgid "git verify-tag [-v | --verbose] [--format=<format>] <tag>..." -msgstr "git verify-tag [-v | --verbose] [--format=<format>] <tag>..." +msgid "git verify-tag [-v | --verbose] [--format=<format>] [--raw] <tag>..." +msgstr "git verify-tag [-v | --verbose] [--format=<format>] [--raw] <tag>..." #: builtin/verify-tag.c msgid "print tag contents" msgstr "cetak isi tag" #: builtin/worktree.c -msgid "git worktree add [<options>] <path> [<commit-ish>]" -msgstr "git worktree add [<opsi>] <jalur> [<mirip komit>]" +msgid "" +"git worktree add [-f] [--detach] [--checkout] [--lock [--reason <string>]]\n" +" [-b <new-branch>] <path> [<commit-ish>]" +msgstr "" +"git worktree add [-f] [--detach] [--checkout] [--lock [--reason <untai>]]\n" +" [-b <cabang baru>] <jalur> [<mirip komit>]" #: builtin/worktree.c -msgid "git worktree list [<options>]" -msgstr "git worktree list [<opsi>]" +msgid "git worktree list [-v | --porcelain [-z]]" +msgstr "git worktree list [-v | --porcelain [-z]" #: builtin/worktree.c -msgid "git worktree lock [<options>] <path>" -msgstr "git worktree lock [<opsi>] <jalur>" +msgid "git worktree lock [--reason <string>] <worktree>" +msgstr "git worktree lock [--reason <untai>] <pohon kerja>" #: builtin/worktree.c msgid "git worktree move <worktree> <new-path>" msgstr "git worktree move <pohon kerja> <jalur baru>" #: builtin/worktree.c -msgid "git worktree prune [<options>]" -msgstr "git worktree prune [<opsi>]" +msgid "git worktree prune [-n] [-v] [--expire <expire>]" +msgstr "git worktree prune [-n] [-v] [--expire <kadaluarsa>]" #: builtin/worktree.c -msgid "git worktree remove [<options>] <worktree>" -msgstr "git worktree remove [<opsi>] <pohon kerja>" +msgid "git worktree remove [-f] <worktree>" +msgstr "git worktree remove [-f] <pohon kerja>" #: builtin/worktree.c msgid "git worktree repair [<path>...]" msgstr "git worktree repair [<jalur>...]" #: builtin/worktree.c -msgid "git worktree unlock <path>" -msgstr "git worktree unlock <jalur>" +msgid "git worktree unlock <worktree>" +msgstr "git worktree unlock <worktree>" #: builtin/worktree.c #, c-format @@ -16713,6 +16804,11 @@ msgid "core.fsyncMethod = batch is unsupported on this platform" msgstr "core.fsyncMethod = batch tidak didukung pada platform ini" #: bundle-uri.c +#, c-format +msgid "bundle list at '%s' has no mode" +msgstr "daftar bundel pada '%s' tidak punya mode" + +#: bundle-uri.c msgid "failed to create temporary file" msgstr "tidak dapat membuat berkas sementara" @@ -16722,18 +16818,35 @@ msgstr "tidak cukup kemampuan" #: bundle-uri.c #, c-format +msgid "unrecognized bundle mode from URI '%s'" +msgstr "mode bundel tidak dikenal dari URI '%s'" + +#: bundle-uri.c +#, c-format +msgid "exceeded bundle URI recursion limit (%d)" +msgstr "batas rekursi URI bundel (%d) terlewati" + +#: bundle-uri.c +#, c-format msgid "failed to download bundle from URI '%s'" msgstr "gagal mengunduh bundel dari URI '%s'" #: bundle-uri.c #, c-format -msgid "file at URI '%s' is not a bundle" -msgstr "berkas pada URI '%s' bukan sebuah bundle" +msgid "file at URI '%s' is not a bundle or bundle list" +msgstr "berkas pada URI '%s' bukan sebuah bundel atau daftar bundel" #: bundle-uri.c -#, c-format -msgid "failed to unbundle bundle from URI '%s'" -msgstr "gagal membongkar bundel dari URI '%s'" +msgid "bundle-uri: got an empty line" +msgstr "bundle-uri: dapat satu baris kosong" + +#: bundle-uri.c +msgid "bundle-uri: line is not of the form 'key=value'" +msgstr "bundle-uri: baris bukan berbentuk 'kunci=nilai'" + +#: bundle-uri.c +msgid "bundle-uri: line has empty key or value" +msgstr "bundle-uri: baris berisi kunci atau nilai kosong" #: bundle.c #, c-format @@ -17496,7 +17609,7 @@ msgid "Chunk-based file formats" msgstr "Berkas format berbasis bingkah" #: command-list.h -msgid "Git commit graph format" +msgid "Git commit-graph format" msgstr "Format grafik komit Git" #: command-list.h @@ -17929,6 +18042,11 @@ msgstr "kasus tak tertangani di 'has_worktree_moved': %d" msgid "health thread wait failed [GLE %ld]" msgstr "antri utas kesehatan gagal [GLE %ld]" +#: compat/fsmonitor/fsm-ipc-darwin.c +#, c-format +msgid "Invalid path: %s" +msgstr "Jalur tidak valid: %s" + #: compat/fsmonitor/fsm-listen-darwin.c msgid "Unable to create FSEventStream." msgstr "tidak dapat membuat FSEventStream." @@ -17967,12 +18085,32 @@ msgstr "GetOverlappedResult gagal pada '%s' [GLE %ld]" msgid "could not read directory changes [GLE %ld]" msgstr "tidak dapat membaca perubahan direktori [GLE %ld]" -#: compat/fsmonitor/fsm-settings-win32.c +#: compat/fsmonitor/fsm-path-utils-darwin.c +#, c-format +msgid "opendir('%s') failed" +msgstr "opendir('%s') gagal" + +#: compat/fsmonitor/fsm-path-utils-darwin.c +#, c-format +msgid "lstat('%s') failed" +msgstr "lstat('%s') gagal" + +#: compat/fsmonitor/fsm-path-utils-darwin.c +#, c-format +msgid "strbuf_readlink('%s') failed" +msgstr "strbuf_readlink('%s') gagal" + +#: compat/fsmonitor/fsm-path-utils-darwin.c +#, c-format +msgid "closedir('%s') failed" +msgstr "closedir('%s') gagal" + +#: compat/fsmonitor/fsm-path-utils-win32.c #, c-format msgid "[GLE %ld] unable to open for read '%ls'" msgstr "[GLE %ld] tidak dapat membuka untuk dibaca '%ls'" -#: compat/fsmonitor/fsm-settings-win32.c +#: compat/fsmonitor/fsm-path-utils-win32.c #, c-format msgid "[GLE %ld] unable to get protocol information for '%ls'" msgstr "[GLE %ld] tidak dapat mendapatkan informasi protokol untuk '%ls'" @@ -19983,10 +20121,11 @@ msgstr "repositori virtual '%s' tidka kompatibel dengan fsmonitor" #: fsmonitor-settings.c #, c-format msgid "" -"repository '%s' is incompatible with fsmonitor due to lack of Unix sockets" +"socket directory '%s' is incompatible with fsmonitor due to lack of Unix " +"sockets support" msgstr "" -"repositori '%s' tidak kompatibel dengan fsmonitor karena kekurangan soket " -"Unix" +"direktori soket '%s' tidak kompatibel dengan fsmonitor karena kekurangan " +"dukungan soket Unix" #: git.c msgid "" @@ -20380,8 +20519,8 @@ msgstr[1] "" "Perintah paling mirip adalah" #: help.c -msgid "git version [<options>]" -msgstr "git version [<opsi>]" +msgid "git version [--build-options]" +msgstr "git version [--build-options]" #: help.c #, c-format @@ -21493,11 +21632,6 @@ msgid "%s: ignoring alternate object stores, nesting too deep" msgstr "%s: mengabaikan penyimpanan objek alternatif, bersarang terlalu dalam" #: object-file.c -#, c-format -msgid "unable to normalize object directory: %s" -msgstr "tidak dapat menormalisasikan direktori objek: %s" - -#: object-file.c msgid "unable to fdopen alternates lockfile" msgstr "tidak dapat men-fdopen berkas kunci alternatif" @@ -22520,6 +22654,11 @@ msgstr "" msgid "promisor remote name cannot begin with '/': %s" msgstr "nama remote penjanji tidak dapat diawali dengan '/': %s" +#: promisor-remote.c +#, c-format +msgid "could not fetch %s from promisor remote" +msgstr "tidak dapat mengambil %s dari remote penjanji" + #: protocol-caps.c msgid "object-info: expected flush after arguments" msgstr "object-info: bilasan diharapkan setelah argumen" @@ -23821,6 +23960,15 @@ msgstr "gagal menemukan pohon %s" #: revision.c #, c-format +msgid "unsupported section for hidden refs: %s" +msgstr "seksi tidak didukung untuk referensi tersembunyi: %s" + +#: revision.c +msgid "--exclude-hidden= passed more than once" +msgstr "--exclude-hidden= dilewatkan lebih dari sekali" + +#: revision.c +#, c-format msgid "resolve-undo records `%s` which is missing" msgstr "resolve-undo merekam `%s` yang dimana hilang" @@ -24007,6 +24155,16 @@ msgstr "--all atau <pendaftaran>, tetapi bukan kedua-duanya" #: scalar.c #, c-format +msgid "could not remove stale scalar.repo '%s'" +msgstr "tidak dapat menghapus scalar.repo basi '%s'" + +#: scalar.c +#, c-format +msgid "removing stale scalar.repo '%s'" +msgstr "menghapus scalar.repo basi '%s'" + +#: scalar.c +#, c-format msgid "git repository gone in '%s'" msgstr "repositori git pergi di '%s'" @@ -24763,6 +24921,11 @@ msgid "illegal label name: '%.*s'" msgstr "nama label ilegal: '%.*s'" #: sequencer.c +#, c-format +msgid "could not resolve '%s'" +msgstr "tidak dapat menguraikan '%s'" + +#: sequencer.c msgid "writing fake root commit" msgstr "menulis komit akar palsu" @@ -24771,11 +24934,6 @@ msgid "writing squash-onto" msgstr "menulis squash-onto" #: sequencer.c -#, c-format -msgid "could not resolve '%s'" -msgstr "tidak dapat menguraikan '%s'" - -#: sequencer.c msgid "cannot merge without a current revision" msgstr "tidak dapat menggabungkan tanpa revisi saat ini" @@ -25502,100 +25660,116 @@ msgstr "ls-tree kembalikan kode kembali %d yang tak diharapkan" msgid "failed to lstat '%s'" msgstr "gagal men-lstat '%s'" +#: t/helper/test-cache-tree.c +msgid "test-tool cache-tree <options> (control|prime|update)" +msgstr "test-tool cache-tree <opsi> (control|prime|update)" + +#: t/helper/test-cache-tree.c +msgid "clear the cache tree before each iteration" +msgstr "bersihkan pohon tembolok sebelum setiap iterasi" + +#: t/helper/test-cache-tree.c +msgid "number of entries in the cache tree to invalidate (default 0)" +msgstr "jumlah entri di dalam pohon tembolok untuk dinirvalidasi (asali 0)" + #: t/helper/test-fast-rebase.c msgid "unhandled options" -msgstr "" +msgstr "opsi tak tertangani" #: t/helper/test-fast-rebase.c msgid "error preparing revisions" -msgstr "" +msgstr "kesalahan menyiapkan revisi" #: t/helper/test-reach.c #, c-format msgid "commit %s is not marked reachable" -msgstr "" +msgstr "komit %s tidak ditandai sebagai dapat dicapai" #: t/helper/test-reach.c msgid "too many commits marked reachable" -msgstr "" +msgstr "terlalu banyak komit yang ditandai sebagai dapat dicapai" #: t/helper/test-serve-v2.c msgid "test-tool serve-v2 [<options>]" -msgstr "" +msgstr "test-tool serve-v2 [<opsi>]" #: t/helper/test-serve-v2.c msgid "exit immediately after advertising capabilities" -msgstr "" +msgstr "langsung keluar setelah mengiklankan kemampuan" #: t/helper/test-simple-ipc.c msgid "test-helper simple-ipc is-active [<name>] [<options>]" -msgstr "" +msgstr "test-helper simple-ipc is-active [<nama>] [<opsi>]" #: t/helper/test-simple-ipc.c msgid "test-helper simple-ipc run-daemon [<name>] [<threads>]" -msgstr "" +msgstr "test-helper simple-ipc run-daemon [<nama>] [<utas>]" #: t/helper/test-simple-ipc.c msgid "test-helper simple-ipc start-daemon [<name>] [<threads>] [<max-wait>]" msgstr "" +"test-helper simple-ipc start-daemon [<nama>] [<utas>] [<tunggu maksimum>]" #: t/helper/test-simple-ipc.c msgid "test-helper simple-ipc stop-daemon [<name>] [<max-wait>]" -msgstr "" +msgstr "test-helper simple-ipc stop-daemon [<nama> [<tunggu maksimum>]" #: t/helper/test-simple-ipc.c msgid "test-helper simple-ipc send [<name>] [<token>]" -msgstr "" +msgstr "test-helper simple-ipc send [<nama>] [<token>]" #: t/helper/test-simple-ipc.c msgid "test-helper simple-ipc sendbytes [<name>] [<bytecount>] [<byte>]" msgstr "" +"test-helper simple-ipc sendbytes [<nama>] [<hitungan bita>] [<bita>]" #: t/helper/test-simple-ipc.c msgid "" "test-helper simple-ipc multiple [<name>] [<threads>] [<bytecount>] " "[<batchsize>]" msgstr "" +"test-helper simple-ipc multiple [<nama>] [<utas>] [<hitungan bita>] " +"[<ukuran batch>]" #: t/helper/test-simple-ipc.c msgid "name or pathname of unix domain socket" -msgstr "" +msgstr "nama atau nama jalur soket domain unix" #: t/helper/test-simple-ipc.c msgid "named-pipe name" -msgstr "" +msgstr "nama pipa bernama" #: t/helper/test-simple-ipc.c msgid "number of threads in server thread pool" -msgstr "" +msgstr "jumlah utas pada kolam utas peladen" #: t/helper/test-simple-ipc.c msgid "seconds to wait for daemon to start or stop" -msgstr "" +msgstr "waktu menunggu daemon dimulai atau dihentikan (dalam detik)" #: t/helper/test-simple-ipc.c msgid "number of bytes" -msgstr "" +msgstr "jumlah bita" #: t/helper/test-simple-ipc.c msgid "number of requests per thread" -msgstr "" +msgstr "jumlah permintaan tiap utas" #: t/helper/test-simple-ipc.c msgid "byte" -msgstr "" +msgstr "bita" #: t/helper/test-simple-ipc.c msgid "ballast character" -msgstr "" +msgstr "karakter pemberat" #: t/helper/test-simple-ipc.c msgid "token" -msgstr "" +msgstr "token" #: t/helper/test-simple-ipc.c msgid "command token to send to the server" -msgstr "" +msgstr "token perintah untuk dikirim ke peladen" #: trailer.c #, c-format @@ -27634,3 +27808,147 @@ msgstr "Melewati %s dengan akhiran cadangan '%s'.\n" #, perl-format msgid "Do you really want to send %s? [y|N]: " msgstr "Anda benar-benar ingin mengirim %s? [y|N]: " + +#, c-format +#~ msgid "unable to normalize object directory: %s" +#~ msgstr "tidak dapat menormalisasikan direktori objek: %s" + +#~ msgid "reset the bisection state" +#~ msgstr "setel ulang keadaan pembagian dua" + +#~ msgid "check whether bad or good terms exist" +#~ msgstr "periksa apakah ada istilah jelek atau bagus" + +#~ msgid "print out the bisect terms" +#~ msgstr "cetak istilah pembagian dua" + +#~ msgid "start the bisect session" +#~ msgstr "mulai sesi pembagian dua" + +#~ msgid "find the next bisection commit" +#~ msgstr "temukan komit pembagian dua berikutnya" + +#~ msgid "mark the state of ref (or refs)" +#~ msgstr "tandai keadaan referensi" + +#~ msgid "list the bisection steps so far" +#~ msgstr "daftar langkah pembagian dua sejauh ini" + +#~ msgid "replay the bisection process from the given file" +#~ msgstr "mainkan ulang proses pembagian dua dari berkas yang diberikan" + +#~ msgid "skip some commits for checkout" +#~ msgstr "lewati beberapa komit untuk checkout" + +#~ msgid "visualize the bisection" +#~ msgstr "visualisasikan pembagian dua" + +#~ msgid "use <cmd>... to automatically bisect" +#~ msgstr "gunakan <cmd>... untuk bagi dua otomatis." + +#~ msgid "no log for BISECT_WRITE" +#~ msgstr "tidak ada log untuk BISECT_WRITE" + +#~ msgid "Couldn't look up commit object for HEAD" +#~ msgstr "Tidak dapat mencari objek komit untuk HEAD" + +#~ msgid "git bundle create [<options>] <file> <git-rev-list args>" +#~ msgstr "git bundle create [<opsi>] <berkas> <argumen git-rev-list>" + +#, c-format +#~ msgid "options '%s' and '%s %s' cannot be used together" +#~ msgstr "opsi '%s' dan '%s %s' tidak dapat digunakan bersamaan" + +#~ msgid "git commit [<options>] [--] <pathspec>..." +#~ msgstr "git commit [<opsi>] [--] <spek jalur>..." + +#~ msgid "git fsck [<options>] [<object>...]" +#~ msgstr "git fsck [<opsi>] [<objek>...]" + +#~ msgid "git fsmonitor--daemon stop" +#~ msgstr "git fsmonitor--daemon stop" + +#~ msgid "git fsmonitor--daemon status" +#~ msgstr "git fsmonitor--daemon status" + +#~ msgid "failed to run 'git config'" +#~ msgstr "gagal menjalankan 'git config'" + +#, c-format +#~ msgid "could not get 'onto': '%s'" +#~ msgstr "tidak dapat mendapatkan 'ke': '%s'" + +#~ msgid "Could not resolve HEAD to a revision" +#~ msgstr "Tidak dapat menguraikan HEAD ke sebuah revisi" + +#, c-format +#~ msgid "missing required file: %s" +#~ msgstr "berkas yang diperlukan hilang: %s" + +#~ msgid "git revert [<options>] <commit-ish>..." +#~ msgstr "git revert [<opsi>] <mirip-komit>..." + +#~ msgid "git revert <subcommand>" +#~ msgstr "git revert <subperintah>" + +#~ msgid "git cherry-pick [<options>] <commit-ish>..." +#~ msgstr "git cherry-pick [<opsi>] <mirip-komit>..." + +#~ msgid "git cherry-pick <subcommand>" +#~ msgstr "git cherry-pick <subperintah>" + +#~ msgid "git rm [<options>] [--] <file>..." +#~ msgstr "git rm [<opsi>] [--] <berkas>..." + +#~ msgid "using --group=trailer with stdin is not supported" +#~ msgstr "mengguanakn --group=trailer dengan stdin tidak didukung" + +#~ msgid "git stash show [<options>] [<stash>]" +#~ msgstr "git stash show [<opsi>] [<stase>]" + +#~ msgid "git stash ( pop | apply ) [--index] [-q|--quiet] [<stash>]" +#~ msgstr "git stash ( pop | apply ) [--index] [-q|--quiet] [<stase>]" + +#~ msgid "" +#~ "git stash [push [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]\n" +#~ " [-u|--include-untracked] [-a|--all] [-m|--message <message>]\n" +#~ " [--] [<pathspec>...]]" +#~ msgstr "" +#~ "git stash [push [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]\n" +#~ " [-u|--include-untracked] [-a|--all] [-m|--message <pesan>]\n" +#~ " [--] [<spek jalur>...]" + +#~ msgid "" +#~ "git stash save [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]\n" +#~ " [-u|--include-untracked] [-a|--all] [<message>]" +#~ msgstr "" +#~ "git stash save [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]\n" +#~ " [-u|--include-untracked] [-a|--all] [<pesan>]" + +#~ msgid "path into the working tree" +#~ msgstr "jalur ke dalam pohon kerja" + +#~ msgid "recurse into submodules" +#~ msgstr "rekursi ke dalam submodul" + +#~ msgid "check if it is safe to write to the .gitmodules file" +#~ msgstr "periksa apakah itu aman untuk menulis ke berkas .gitmodules" + +#~ msgid "unset the config in the .gitmodules file" +#~ msgstr "batal setel konfigurasi dalam berkas .gitmodules" + +#~ msgid "git submodule--helper config --unset <name>" +#~ msgstr "git submodule--helper config --unset <nama>" + +#, c-format +#~ msgid "'%s' is not a valid submodule--helper subcommand" +#~ msgstr "'%s' bukan subperintah submodule--helper valid" + +#~ msgid "git upload-pack [<options>] <dir>" +#~ msgstr "git upload-pack [<opsi>] <direktori>" + +#~ msgid "git worktree add [<options>] <path> [<commit-ish>]" +#~ msgstr "git worktree add [<opsi>] <jalur> [<mirip komit>]" + +#~ msgid "git worktree lock [<options>] <path>" +#~ msgstr "git worktree lock [<opsi>] <jalur>" @@ -5,10 +5,10 @@ # msgid "" msgstr "" -"Project-Id-Version: git 2.38.0\n" +"Project-Id-Version: git 2.39.0\n" "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n" -"POT-Creation-Date: 2022-09-26 06:34+0100\n" -"PO-Revision-Date: 2022-09-26 06:35+0100\n" +"POT-Creation-Date: 2022-11-29 04:57+0000\n" +"PO-Revision-Date: 2022-11-29 22:50+0100\n" "Last-Translator: Peter Krefting <peter@softwolves.pp.se>\n" "Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n" "Language: sv\n" @@ -764,6 +764,9 @@ msgstr "kommandorad avslutas med \\" msgid "unclosed quote" msgstr "citat ej stängt" +msgid "too many arguments" +msgstr "för mÃ¥nga argument" + #, c-format msgid "unrecognized whitespace option '%s'" msgstr "okänt alternativ för whitespace: \"%s\"" @@ -2523,42 +2526,6 @@ msgstr "" "\"bisect\"-körningen misslyckades: \"git bisect--helper --bisect-state %s\" " "avslutades med felkoden %d" -msgid "reset the bisection state" -msgstr "Ã¥terställ bisect-tillstÃ¥nd" - -msgid "check whether bad or good terms exist" -msgstr "se efter om termer för rätt och fel finns" - -msgid "print out the bisect terms" -msgstr "skriv ut termer för bisect" - -msgid "start the bisect session" -msgstr "pÃ¥börja bisect-körningen" - -msgid "find the next bisection commit" -msgstr "hitta nästa incheckning i bisect" - -msgid "mark the state of ref (or refs)" -msgstr "markera tillstÃ¥ndet för en eller flera referenser" - -msgid "list the bisection steps so far" -msgstr "lista \"bisect\"-stegen som utförts sÃ¥ lÃ¥ngt" - -msgid "replay the bisection process from the given file" -msgstr "spela upp \"bisect\"-processen frÃ¥n angiven fil" - -msgid "skip some commits for checkout" -msgstr "hoppa över ett par incheckningar" - -msgid "visualize the bisection" -msgstr "visualisera \"bisect\"-körningen" - -msgid "use <cmd>... to automatically bisect" -msgstr "använd <kommando>... för att utföra \"bisect\" automatiskt" - -msgid "no log for BISECT_WRITE" -msgstr "ingen logg för BISECT_WRITE" - msgid "--bisect-reset requires either no argument or a commit" msgstr "--bisect-reset kräver antingen inget argument eller en incheckning" @@ -2577,6 +2544,9 @@ msgstr "ingen loggfil angiven" msgid "git blame [<options>] [<rev-opts>] [<rev>] [--] <file>" msgstr "git blame [<flaggor>] [<rev-flaggor>] [<rev>] [--] <fil>" +msgid "git annotate [<options>] [<rev-opts>] [<rev>] [--] <file>" +msgstr "git annotate [<flaggor>] [<rev-flaggor>] [<rev>] [--] <fil>" + msgid "<rev-opts> are documented in git-rev-list(1)" msgstr "<rev-flaggor> dokumenteras i git-rev-list(1)" @@ -2763,9 +2733,6 @@ msgstr "Misslyckades uppdatera konfigurationsfil" msgid "cannot use -a with -d" msgstr "kan inte ange -a med -d" -msgid "Couldn't look up commit object for HEAD" -msgstr "Kunde inte slÃ¥ upp incheckningsobjekt för HEAD" - #, c-format msgid "Cannot delete branch '%s' checked out at '%s'" msgstr "Kan inte ta bort grenen \"%s\" som är utcheckad pÃ¥ \"%s\"" @@ -2804,17 +2771,18 @@ msgstr "Grenen %s ombaseras pÃ¥ %s" msgid "Branch %s is being bisected at %s" msgstr "Grenen %s är i en \"bisect\" pÃ¥ %s" -msgid "cannot copy the current branch while not on any." -msgstr "kunde inte kopiera aktuell gren när du inte befinner dig pÃ¥ nÃ¥gon." - -msgid "cannot rename the current branch while not on any." -msgstr "" -"kunde inte byta namn pÃ¥ aktuell gren när du inte befinner dig pÃ¥ nÃ¥gon." - #, c-format msgid "Invalid branch name: '%s'" msgstr "Felaktigt namn pÃ¥ gren: \"%s\"" +#, c-format +msgid "No commit on branch '%s' yet." +msgstr "Inga incheckningar pÃ¥ grenen \"%s\" ännu." + +#, c-format +msgid "No branch named '%s'." +msgstr "Ingen gren vid namnet \"%s\"." + msgid "Branch rename failed" msgstr "Misslyckades byta namn pÃ¥ gren" @@ -2962,7 +2930,7 @@ msgstr "" "propagateBranches har aktiverats" msgid "--recurse-submodules can only be used to create branches" -msgstr "--recurse-submodules jan endast användas för att skapa grenar" +msgstr "--recurse-submodules kan endast användas för att skapa grenar" msgid "branch name required" msgstr "grennamn krävs" @@ -2973,13 +2941,12 @@ msgstr "Kan inte beskriva frÃ¥nkopplad HEAD" msgid "cannot edit description of more than one branch" msgstr "kan inte redigera beskrivning för mer än en gren" -#, c-format -msgid "No commit on branch '%s' yet." -msgstr "Inga incheckningar pÃ¥ grenen \"%s\" ännu." +msgid "cannot copy the current branch while not on any." +msgstr "kunde inte kopiera aktuell gren när du inte befinner dig pÃ¥ nÃ¥gon." -#, c-format -msgid "No branch named '%s'." -msgstr "Ingen gren vid namnet \"%s\"." +msgid "cannot rename the current branch while not on any." +msgstr "" +"kunde inte byta namn pÃ¥ aktuell gren när du inte befinner dig pÃ¥ nÃ¥gon." msgid "too many branches for a copy operation" msgstr "för mÃ¥nga grenar för kopiering" @@ -3046,11 +3013,11 @@ msgid "not run from a git repository - no hooks to show\n" msgstr "körs inte frÃ¥n ett git-arkiv - inga krokar att visa\n" msgid "" -"git bugreport [-o|--output-directory <file>] [-s|--suffix <format>] [--" -"diagnose[=<mode>]" +"git bugreport [(-o | --output-directory) <path>] [(-s | --suffix) <format>]\n" +" [--diagnose[=<mode>]]" msgstr "" -"git bugreport [-o|--output-directory <fil>] [-s|--suffix <format>] [--" -"diagnose[=<läge>]" +"git bugreport [(-o | --output-directory) <fil>] [(-s | --suffix) <format>]\n" +" [--diagnose[=<läge>]" msgid "" "Thank you for filling out a Git bug report!\n" @@ -3124,17 +3091,23 @@ msgstr "kunde inte skriva till %s" msgid "Created new report at '%s'.\n" msgstr "Skapade ny rapport pÃ¥ \"%s\"\n" -msgid "git bundle create [<options>] <file> <git-rev-list args>" -msgstr "git bundle create [<flaggor>] <fil> <git-rev-list-flaggor>" +msgid "" +"git bundle create [-q | --quiet | --progress | --all-progress] [--all-" +"progress-implied]\n" +" [--version=<version>] <file> <git-rev-list-args>" +msgstr "" +"git bundle create [-q | --quiet | --progress | --all-progress] [--all-" +"progress-implied]\n" +" [--version=<version>] <fil> <git-rev-list-flaggor>" -msgid "git bundle verify [<options>] <file>" -msgstr "git bundle verify [<flaggor>] <fil>" +msgid "git bundle verify [-q | --quiet] <file>" +msgstr "git bundle verify [-q | --quiet] <fil>" msgid "git bundle list-heads <file> [<refname>...]" msgstr "git bundle list-heads <fil> [<refnamn>...]" -msgid "git bundle unbundle <file> [<refname>...]" -msgstr "git bundle unbundle <fil> [<refnamn>...]" +msgid "git bundle unbundle [--progress] <file> [<refname>...]" +msgstr "git bundle unbundle [--progress] <fil> [<refnamn>...]" msgid "do not show progress meter" msgstr "visa inte förloppsindikator" @@ -3209,12 +3182,12 @@ msgid "" "git cat-file (--batch | --batch-check | --batch-command) [--batch-all-" "objects]\n" " [--buffer] [--follow-symlinks] [--unordered]\n" -" [--textconv | --filters]" +" [--textconv | --filters] [-z]" msgstr "" "git cat-file (--batch | --batch-check | --batch-command) [--batch-all-" "objects]\n" " [--buffer] [--follow-symlinks] [--unordered]\n" -" [--textconv | --filters]" +" [--textconv | --filters] [-z]" msgid "" "git cat-file (--textconv | --filters)\n" @@ -3323,9 +3296,6 @@ msgstr "<rev> krävs med \"%s\"" msgid "<object> required with '-%c'" msgstr "<objekt> krävs med \"-%c\"" -msgid "too many arguments" -msgstr "för mÃ¥nga argument" - #, c-format msgid "only two arguments allowed in <type> <object> mode, not %d" msgstr "endast tvÃ¥ argument krävs i <typ> <objekt>-läge, inte %d" @@ -3858,10 +3828,10 @@ msgid "use overlay mode" msgstr "använd överläggsläge" msgid "" -"git clean [-d] [-f] [-i] [-n] [-q] [-e <pattern>] [-x | -X] [--] <paths>..." +"git clean [-d] [-f] [-i] [-n] [-q] [-e <pattern>] [-x | -X] [--] " +"[<pathspec>...]" msgstr "" -"git clean [-d] [-f] [-i] [-n] [-q] [-e <mönster>] [-x | -X] [--] " -"<sökvägar>..." +"git clean [-d] [-f] [-i] [-n] [-q] [-e <mönster>] [-x | -X] [--] <sökväg>..." #, c-format msgid "Removing %s\n" @@ -4151,6 +4121,10 @@ msgid "failed to start iterator over '%s'" msgstr "misslyckades starta iterator över \"%s\"" #, c-format +msgid "symlink '%s' exists, refusing to clone with --local" +msgstr "symbolisk länk \"%s\" finns redan, vägrar klona med --local" + +#, c-format msgid "failed to unlink '%s'" msgstr "misslyckades ta bort länken \"%s\"" @@ -4214,10 +4188,6 @@ msgstr "För mÃ¥nga argument." msgid "You must specify a repository to clone." msgstr "Du mÃ¥ste ange ett arkiv att klona." -#, c-format -msgid "options '%s' and '%s %s' cannot be used together" -msgstr "flaggorna \"%s\" och \"%s %s\" kan inte användas samtidigt" - msgid "" "--bundle-uri is incompatible with --depth, --shallow-since, and --shallow-" "exclude" @@ -4338,18 +4308,24 @@ msgid "--command must be the first argument" msgstr "--command mÃ¥ste vara första argument" msgid "" -"git commit-graph verify [--object-dir <objdir>] [--shallow] [--[no-]progress]" +"git commit-graph verify [--object-dir <dir>] [--shallow] [--[no-]progress]" msgstr "" -"git commit-graph verify [--object-dir <objkat>] [--shallow] [--[no-]progress]" +"git commit-graph verify [--object-dir <kat>] [--shallow] [--[no-]progress]" msgid "" -"git commit-graph write [--object-dir <objdir>] [--append] [--" -"split[=<strategy>]] [--reachable|--stdin-packs|--stdin-commits] [--changed-" -"paths] [--[no-]max-new-filters <n>] [--[no-]progress] <split options>" +"git commit-graph write [--object-dir <dir>] [--append]\n" +" [--split[=<strategy>]] [--reachable | --stdin-packs | " +"--stdin-commits]\n" +" [--changed-paths] [--[no-]max-new-filters <n>] [--" +"[no-]progress]\n" +" <split options>" msgstr "" -"git commit-graph write [--object-dir <objkat>] [--append] [--" -"split[=<strategi>]] [--reachable|--stdin-packs|--stdin-commits] [--changed-" -"paths] [--[no-]max-new-filters <n>] [--[no-]progress] <delnings-flaggor>" +"git commit-graph write [--object-dir <kat>] [--append]\n" +" [--split[=<strategi>]] [--reachable | --stdin-packs | " +"--stdin-commits]\n" +" [--changed-paths] [--[no-]max-new-filters <n>] [--" +"[no-]progress]\n" +" <delnings-flaggor>" msgid "dir" msgstr "kat" @@ -4417,12 +4393,16 @@ msgstr "använd som mest en av --reachable, --stdin-commits och --stdin-packs" msgid "Collecting commits from input" msgstr "Hämtar incheckningar frÃ¥n indata" +msgid "git commit-tree <tree> [(-p <parent>)...]" +msgstr "git commit-tree <träd> [(-p <förälder>)...]" + msgid "" -"git commit-tree [(-p <parent>)...] [-S[<keyid>]] [(-m <message>)...] [(-F " -"<file>)...] <tree>" +"git commit-tree [(-p <parent>)...] [-S[<keyid>]] [(-m <message>)...]\n" +" [(-F <file>)...] <tree>" msgstr "" -"git commit-tree [(-p <föräldrer>)...] [-S[<nyckelid>]] [(-m " -"<meddelande>)...] [(-F <fil>)...] <träd>" +"git commit-tree [(-p <förälder>)...] [-S[<nyckelid>]] [(-m " +"<meddelande>)...]\n" +" [(-F <fil>)...] <träd>" #, c-format msgid "duplicate parent %s ignored" @@ -4464,10 +4444,29 @@ msgstr "mÃ¥ste ange exakt ett träd" msgid "git commit-tree: failed to read" msgstr "git commit-tree: misslyckades läsa" -msgid "git commit [<options>] [--] <pathspec>..." -msgstr "git commit [<flaggor>] [--] <sökväg>..." - -msgid "git status [<options>] [--] <pathspec>..." +msgid "" +"git commit [-a | --interactive | --patch] [-s] [-v] [-u<mode>] [--amend]\n" +" [--dry-run] [(-c | -C | --squash) <commit> | --fixup [(amend|" +"reword):]<commit>)]\n" +" [-F <file> | -m <msg>] [--reset-author] [--allow-empty]\n" +" [--allow-empty-message] [--no-verify] [-e] [--author=<author>]\n" +" [--date=<date>] [--cleanup=<mode>] [--[no-]status]\n" +" [-i | -o] [--pathspec-from-file=<file> [--pathspec-file-nul]]\n" +" [(--trailer <token>[(=|:)<value>])...] [-S[<keyid>]]\n" +" [--] [<pathspec>...]" +msgstr "" +"git commit [-a | --interactive | --patch] [-s] [-v] [-u<läge>] [--amend]\n" +" [--dry-run] [(-c | -C | --squash) <incheckning> | --fixup [(amend|" +"reword):]<incheckning>)]\n" +" [-F <fil> | -m <medd>] [--reset-author] [--allow-empty]\n" +" [--allow-empty-message] [--no-verify] [-e] [--" +"author=<författare>]\n" +" [--date=<datum>] [--cleanup=<läge>] [--[no-]status]\n" +" [-i | -o] [--pathspec-from-file=<fil> [--pathspec-file-nul]]\n" +" [(--trailer <symbol>[(=|:)<värde>])...] [-S[<nyckel-id>]]\n" +" [--] [<sökväg>...]" + +msgid "git status [<options>] [--] [<pathspec>...]" msgstr "git status [<flaggor>] [--] <sökväg>..." msgid "" @@ -5233,11 +5232,19 @@ msgstr "\"credential-cache\" ej tillgänglig; stöd för unix-uttag saknas" msgid "unable to get credential storage lock in %d ms" msgstr "kunde inte erhÃ¥lla lÃ¥set för lagring av inlogginsuppgifter pÃ¥ %d ms" -msgid "git describe [<options>] [<commit-ish>...]" -msgstr "git describe [<flaggor>] [<incheckning-igt>...]" +msgid "" +"git describe [--all] [--tags] [--contains] [--abbrev=<n>] [<commit-ish>...]" +msgstr "" +"git describe [--all] [--tag] [--contains] [--abbrev=<n>] [<incheckning-" +"igt>...]" + +msgid "" +"git describe [--all] [--tags] [--contains] [--abbrev=<n>] --dirty[=<mark>]" +msgstr "" +"git describe [--all] [--tags] [--contains] [--abbrev=<n>] --dirty[=<märke>]" -msgid "git describe [<options>] --dirty" -msgstr "git describe [<flaggor>] --dirty" +msgid "git describe <blob>" +msgstr "git describe <objekt>" msgid "head" msgstr "huvud" @@ -5359,11 +5366,12 @@ msgid "option '%s' and commit-ishes cannot be used together" msgstr "flaggorna \"%s\" och incheckning-igter kan inte användas samtidigt" msgid "" -"git diagnose [-o|--output-directory <path>] [-s|--suffix <format>] [--" -"mode=<mode>]" +"git diagnose [(-o | --output-directory) <path>] [(-s | --suffix) <format>]\n" +" [--mode=<mode>]" msgstr "" -"git diagnose [-o|--output-directory <sökväg>] [-s|--suffix <format>] [--" -"mode=<läge>]" +"git diagnose [(-o | --output-directory) <sökväg>] [(-s | --suffix) " +"<format>]\n" +" [--mode=<läge>]" msgid "specify a destination for the diagnostics archive" msgstr "ange mÃ¥l för diagnostikarkivet" @@ -5381,6 +5389,9 @@ msgstr "--merge-base fungerar endast med tvÃ¥ incheckningar" msgid "'%s': not a regular file or symlink" msgstr "\"%s\": inte en normal fil eller symbolisk länk" +msgid "no merge given, only parents." +msgstr "ingen sammanslagning angiven, endast föräldrar." + #, c-format msgid "invalid option: %s" msgstr "ogiltig flagga: %s" @@ -6013,8 +6024,8 @@ msgstr "visa endast referenser som innehÃ¥ller incheckningen" msgid "print only refs which don't contain the commit" msgstr "visa endast referenser som inte innehÃ¥ller incheckningen" -msgid "git for-each-repo --config=<config> <command-args>" -msgstr "git for-each-repo --config=<konfig> <kommandoargument>" +msgid "git for-each-repo --config=<config> [--] <arguments>" +msgstr "git for-each-repo --config=<konfig> [--] <argument>" msgid "config" msgstr "konfig" @@ -6189,8 +6200,16 @@ msgstr "icke-träd i cacheträd" msgid "%s: invalid sha1 pointer in resolve-undo" msgstr "%s: ogiltig sha1-pekare i resolve-undo" -msgid "git fsck [<options>] [<object>...]" -msgstr "git fsck [<flaggor>] [<objekt>...]" +msgid "" +"git fsck [--tags] [--root] [--unreachable] [--cache] [--no-reflogs]\n" +" [--[no-]full] [--strict] [--verbose] [--lost-found]\n" +" [--[no-]dangling] [--[no-]progress] [--connectivity-only]\n" +" [--[no-]name-objects] [<object>...]" +msgstr "" +"git fsck [--tags] [--root] [--unreachable] [--cache] [--no-reflogs]\n" +" [--[no-]full] [--strict] [--verbose] [--lost-found]\n" +" [--[no-]dangling] [--[no-]progress] [--connectivity-only]\n" +" [--[no-]name-objects] [<objekt>...]" msgid "show unreachable objects" msgstr "visa onÃ¥bara objekt" @@ -6247,12 +6266,6 @@ msgstr "git fsmonitor--daemon start [<flaggor>]" msgid "git fsmonitor--daemon run [<options>]" msgstr "git fsmonitor--daemon run [<flaggor>]" -msgid "git fsmonitor--daemon stop" -msgstr "git fsmonitor--daemon stop" - -msgid "git fsmonitor--daemon status" -msgstr "git fsmonitor--daemon status" - #, c-format msgid "value of '%s' out of range: %d" msgstr "värdet för \"%s\" utanför intervallet: %d" @@ -6494,8 +6507,20 @@ msgstr "utför en specifik uppgift" msgid "use at most one of --auto and --schedule=<frequency>" msgstr "använd som mest en av --auto och --schedule=<frekvens>" -msgid "failed to run 'git config'" -msgstr "misslyckades köra \"git config\"" +#, c-format +msgid "unable to add '%s' value of '%s'" +msgstr "kan inte lägga till \"%s\"-värdet för \"%s\"" + +msgid "return success even if repository was not registered" +msgstr "returnera framgÃ¥ng även om arkivet inte var registrerat" + +#, c-format +msgid "unable to unset '%s' value of '%s'" +msgstr "kan inte ta bort \"%s\"-värdet för \"%s\"" + +#, c-format +msgid "repository '%s' is not registered" +msgstr "arkivet \"%s\" har inte registrerats" #, c-format msgid "failed to expand path '%s'" @@ -6783,11 +6808,14 @@ msgid "both --cached and trees are given" msgstr "bÃ¥de --cached och träd angavs" msgid "" -"git hash-object [-t <type>] [-w] [--path=<file> | --no-filters] [--stdin] " -"[--] <file>..." +"git hash-object [-t <type>] [-w] [--path=<file> | --no-filters]\n" +" [--stdin [--literally]] [--] <file>..." msgstr "" -"git hash-object [-t <typ>] [-w] [--path=<fil> | --no-filters] [--stdin] [--] " -"<fil>..." +"git hash-object [-t <typ>] [-w] [--path=<fil> | --no-filters]\n" +" [--stdin [--literally]] [--] <fil>..." + +msgid "git hash-object [-t <type>] [-w] --stdin-paths [--no-filters]" +msgstr "git hash-object [-t <typ>] [-w] --stdin-paths [--no-filters]" msgid "object type" msgstr "objekttyp" @@ -7211,11 +7239,15 @@ msgid "Initialized empty Git repository in %s%s\n" msgstr "Initierade tomt Git-arkiv i %s%s\n" msgid "" -"git init [-q | --quiet] [--bare] [--template=<template-directory>] [--" -"shared[=<permissions>]] [<directory>]" +"git init [-q | --quiet] [--bare] [--template=<template-directory>]\n" +" [--separate-git-dir <git-dir>] [--object-format=<format>]\n" +" [-b <branch-name> | --initial-branch=<branch-name>]\n" +" [--shared[=<permissions>]] [<directory>]" msgstr "" -"git init [-q | --quiet] [--bare] [--template=<mallkatalog>] [--" -"shared[=<behörigheter>]] [<katalog>]" +"git init [-q | --quiet] [--bare] [--template=<mallkatalog>]\n" +" [--separate-git-dir <git-kat>] [--object-format=<format>]\n" +" [-b <grennamn> | --initial-branch=<grennamn>]\n" +" [--shared[=<behörigheter>]] [<katalog>]" msgid "permissions" msgstr "behörigheter" @@ -7256,11 +7288,13 @@ msgid "--separate-git-dir incompatible with bare repository" msgstr "--separate-git-dir är inkompatibelt med naket arkiv" msgid "" -"git interpret-trailers [--in-place] [--trim-empty] [(--trailer " -"<token>[(=|:)<value>])...] [<file>...]" +"git interpret-trailers [--in-place] [--trim-empty]\n" +" [(--trailer <token>[(=|:)<value>])...]\n" +" [--parse] [<file>...]" msgstr "" -"git interpret-trailers [--in-place] [--trim-empty] [(--trailer " -"<symbol>[(=|:)<värde>])...] [<fil>...]" +"git interpret-trailers [--in-place] [--trim-empty]\n" +" [(--trailer <symbol>[(=|:)<värde>])...]\n" +" [--parse] [<fil>...]" msgid "edit files in place" msgstr "redigera filer pÃ¥ plats" @@ -7735,11 +7769,11 @@ msgstr "" msgid "" "git ls-remote [--heads] [--tags] [--refs] [--upload-pack=<exec>]\n" -" [-q | --quiet] [--exit-code] [--get-url]\n" +" [-q | --quiet] [--exit-code] [--get-url] [--sort=<key>]\n" " [--symref] [<repository> [<refs>...]]" msgstr "" "git ls-remote [--heads] [--tags] [--refs] [--upload-pack=<exec>]\n" -" [-q | --quiet] [--exit-code] [--get-url]\n" +" [-q | --quiet] [--exit-code] [--get-url] [--sort=<nyckel>]\n" " [--symref] [<arkiv> [<referenser>...]]" msgid "do not print remote URL" @@ -7868,12 +7902,12 @@ msgstr "git merge-base [-a | --all] <incheckning> <incheckning>..." msgid "git merge-base [-a | --all] --octopus <commit>..." msgstr "git merge-base [-a | --all] --octopus <incheckning>..." -msgid "git merge-base --independent <commit>..." -msgstr "git merge-base --independent <incheckning>..." - msgid "git merge-base --is-ancestor <commit> <commit>" msgstr "git merge-base --is-ancestor <incheckning> <incheckning>" +msgid "git merge-base --independent <commit>..." +msgstr "git merge-base --independent <incheckning>..." + msgid "git merge-base --fork-point <ref> [<commit>]" msgstr "git merge-base --fork-point <ref> [<incheckning>]" @@ -7981,9 +8015,20 @@ msgstr "lista filnamn utan lägen/oid/köer" msgid "allow merging unrelated histories" msgstr "tillÃ¥t sammanslagning av orelaterade historier" +msgid "perform multiple merges, one per line of input" +msgstr "utför flera sammanslagningar, en per indatarad" + msgid "--trivial-merge is incompatible with all other options" msgstr "--trivial-merge är inkompatibelt med andra flaggor" +#, c-format +msgid "malformed input line: '%s'." +msgstr "felaktig indatarad: \"%s\"." + +#, c-format +msgid "merging cannot continue; got unclean result of %d" +msgstr "sammanslagning kan inte fortsätta; fick inte rent resultat frÃ¥n %d" + msgid "git merge [<options>] [<commit>...]" msgstr "git merge [<flaggor>] [<incheckning>...]" @@ -8600,10 +8645,6 @@ msgid "cannot read note data from non-blob object '%s'." msgstr "kan inte läsa anteckningsdata frÃ¥n icke-blob-objektet \"%s\"." #, c-format -msgid "malformed input line: '%s'." -msgstr "felaktig indatarad: \"%s\"." - -#, c-format msgid "failed to copy notes from '%s' to '%s'" msgstr "misslyckades kopiera anteckningar frÃ¥n \"%s\" till \"%s\"" @@ -8794,15 +8835,13 @@ msgstr "använd anteckningar frÃ¥n <anteckningsref>" msgid "unknown subcommand: `%s'" msgstr "okänt underkommando: \"%s\"" -msgid "" -"git pack-objects --stdout [<options>...] [< <ref-list> | < <object-list>]" -msgstr "" -"git pack-objects --stdout [<flaggor>...] [< <reflista> | < <objektlista>]" +msgid "git pack-objects --stdout [<options>] [< <ref-list> | < <object-list>]" +msgstr "git pack-objects --stdout [<flaggor>] [< <reflista> | < <objektlista>]" msgid "" -"git pack-objects [<options>...] <base-name> [< <ref-list> | < <object-list>]" +"git pack-objects [<options>] <base-name> [< <ref-list> | < <object-list>]" msgstr "" -"git pack-objects [<flaggor>...] <basnamn> [< <reflista> | < <objektlista>]" +"git pack-objects [<flaggor>] <basnamn> [< <reflista> | < <objektlista>]" #, c-format msgid "" @@ -9176,8 +9215,8 @@ msgstr "" "oss att du fortfarande använder det pÃ¥ e-post till\n" "<git@vger.kernel.org>. Tack.\n" -msgid "git pack-refs [<options>]" -msgstr "git pack-refs [<flaggor>]" +msgid "git pack-refs [--all] [--no-prune]" +msgstr "git pack-refs [--all] [--no-prune]" msgid "pack everything" msgstr "packa allt" @@ -9185,6 +9224,18 @@ msgstr "packa allt" msgid "prune loose refs (default)" msgstr "ta bort lösa referenser (standard)" +msgid "git patch-id [--stable | --unstable | --verbatim]" +msgstr "git patch-id [--stable | --unstable | --verbatim]" + +msgid "use the unstable patch-id algorithm" +msgstr "använd den instabila patch-id-algoritmen" + +msgid "use the stable patch-id algorithm" +msgstr "använd den stabila patch-id-algoritmen" + +msgid "don't strip whitespace from the patch" +msgstr "ta inte bort blanksteg frÃ¥n patchen" + msgid "git prune [-n] [-v] [--progress] [--expire <time>] [--] [<head>...]" msgstr "git prune [-n] [-v] [--progress] [--expire <tid>] [--] [<huvud>...]" @@ -9397,14 +9448,13 @@ msgstr "" msgid "" "\n" -"To avoid automatically configuring upstream branches when their name\n" -"doesn't match the local branch, see option 'simple' of branch." -"autoSetupMerge\n" +"To avoid automatically configuring an upstream branch when its name\n" +"won't match the local branch, see option 'simple' of branch.autoSetupMerge\n" "in 'git help config'.\n" msgstr "" "\n" -"För att undvika att uppströmsgrenar automatiskt konfigureras när deras\n" -"namn inte motsvarar en lokal gren, se värdet \"simple\" i branch." +"För att undvika att en uppströmsgren automatiskt konfigureras när dess namn\n" +"inte motsvarar den lokala grenen, se värdet \"simple\" i branch." "autoSetupMerge\n" "i \"git help config\".\n" @@ -9556,6 +9606,13 @@ msgstr "Sänder till %s\n" msgid "failed to push some refs to '%s'" msgstr "misslyckades sända vissa referenser till \"%s\"" +msgid "" +"recursing into submodule with push.recurseSubmodules=only; using on-demand " +"instead" +msgstr "" +"rekurserar in i undermoduler med push.recurseSubmodules=only; använder " +"istället vid behov" + #, c-format msgid "invalid value for '%s'" msgstr "ogiltigt värde för \"%s\"" @@ -9691,13 +9748,15 @@ msgid "need two commit ranges" msgstr "behöver tvÃ¥ incheckningsintervall" msgid "" -"git read-tree [(-m [--trivial] [--aggressive] | --reset | --prefix=<prefix>) " -"[-u | -i]] [--no-sparse-checkout] [--index-output=<file>] (--empty | <tree-" -"ish1> [<tree-ish2> [<tree-ish3>]])" +"git read-tree [(-m [--trivial] [--aggressive] | --reset | --" +"prefix=<prefix>)\n" +" [-u | -i]] [--index-output=<file>] [--no-sparse-checkout]\n" +" (--empty | <tree-ish1> [<tree-ish2> [<tree-ish3>]])" msgstr "" -"git read-tree [(-m [--trivial] [--aggressive] | --reset | --prefix=<prefix>) " -"[-u | -i]] [--no-sparse-checkout] [--index-output=<fil>] (--empty | <träd-" -"igt1> [<träd-igt2> [<träd-igt3>]])" +"git read-tree [(-m [--trivial] [--aggressive] | --reset | --" +"prefix=<prefix>)\n" +" [-u | -i]] [--index-output=<fil>] [--no-sparse-checkout]\n" +" (--empty | <träd-igt1> [<träd-igt2> [<träd-igt3>]])" msgid "write resulting index to <file>" msgstr "skriv resulterande index till <fil>" @@ -9787,12 +9846,12 @@ msgid "%s requires the merge backend" msgstr "%s kräver \"merge\"-bakändan" #, c-format -msgid "could not get 'onto': '%s'" -msgstr "kunde inte hämta \"onto\": \"%s\"" +msgid "invalid onto: '%s'" +msgstr "ogiltig \"onto\": \"%s\"" #, c-format msgid "invalid orig-head: '%s'" -msgstr "ogiltigt orig-head: \"%s\"" +msgstr "ogiltig \"orig-head\": \"%s\"" #, c-format msgid "ignoring invalid allow_rerere_autoupdate: '%s'" @@ -10091,8 +10150,8 @@ msgstr "ingen sÃ¥dan gren/incheckning: \"%s\"" msgid "No such ref: %s" msgstr "Ingen sÃ¥dan referens: %s" -msgid "Could not resolve HEAD to a revision" -msgstr "Kunde inte bestämma HEAD:s incheckning" +msgid "Could not resolve HEAD to a commit" +msgstr "Kunde inte bestämma en incheckning för HEAD" #, c-format msgid "'%s': need exactly one merge base with branch" @@ -10746,6 +10805,10 @@ msgstr "kunde inte öppna temporär fil %s för skrivning" msgid "could not close refs snapshot tempfile" msgstr "kunde inte stänga temporär fil för refs-ögonblicksbild" +#, c-format +msgid "could not remove stale bitmap: %s" +msgstr "kunde inte ta bort gammal bitkarta: %s" + msgid "pack everything in a single pack" msgstr "packa allt i ett enda paket" @@ -10818,6 +10881,9 @@ msgstr "hitta ett geometrisk förlopp med faktor <N>" msgid "write a multi-pack index of the resulting packs" msgstr "skriv ett flerpaketsindex för de skapade paketen" +msgid "pack prefix to store a pack containing pruned objects" +msgstr "paketprefix att lagra ett paket som innehÃ¥ller bortrensade objekt" + msgid "cannot delete packs in a precious-objects repo" msgstr "kan inte ta bort paket i ett \"precious-objects\"-arkiv" @@ -10829,8 +10895,12 @@ msgid "pack prefix %s does not begin with objdir %s" msgstr "paketprefixet %s börjar inte med objkat %s" #, c-format -msgid "missing required file: %s" -msgstr "nödvändig fil saknas: %s" +msgid "renaming pack to '%s' failed" +msgstr "misslyckades byta namn pÃ¥ paket till \"%s\"" + +#, c-format +msgid "pack-objects did not write a '%s' file for pack %s-%s" +msgstr "pack-objects skrev inte en \"%s\"-fil för paketet %s-%s" #, c-format msgid "could not unlink: %s" @@ -11024,8 +11094,10 @@ msgstr "--convert-graft-file tar inga argument" msgid "only one pattern can be given with -l" msgstr "endast ett mönster kan anges med -l" -msgid "git rerere [clear | forget <path>... | status | remaining | diff | gc]" -msgstr "git rerere [clear | forget <path>... | status | remaining | diff | gc]" +msgid "" +"git rerere [clear | forget <pathspec>... | diff | status | remaining | gc]" +msgstr "" +"git rerere [clear | forget <sökväg>... | diff | status | remaining | gc]" msgid "register clean resolutions in index" msgstr "registrera rena lösningar i indexet" @@ -11229,6 +11301,15 @@ msgstr "--prefix kräver ett argument" msgid "unknown mode for --abbrev-ref: %s" msgstr "okänt läge för --abbrev-ref: %s" +msgid "--exclude-hidden cannot be used together with --branches" +msgstr "--exclude-hidden kan endast användas tillsammans med --branches" + +msgid "--exclude-hidden cannot be used together with --tags" +msgstr "--exclude-hidden kan kan inte användas tillsammans med --tags" + +msgid "--exclude-hidden cannot be used together with --remotes" +msgstr "--exclude-hidden kan kan inte användas tillsammans med --remotes" + msgid "this operation must be run in a work tree" msgstr "funktionen mÃ¥ste köras i en arbetskatalog" @@ -11236,17 +11317,25 @@ msgstr "funktionen mÃ¥ste köras i en arbetskatalog" msgid "unknown mode for --show-object-format: %s" msgstr "okänt läge för --show-object-format: %s" -msgid "git revert [<options>] <commit-ish>..." -msgstr "git revert [<flaggor>] <incheckning-igt>..." +msgid "" +"git revert [--[no-]edit] [-n] [-m <parent-number>] [-s] [-S[<keyid>]] " +"<commit>..." +msgstr "" +"git revert [--[no-]edit] [-n] [-m <förälder-nummer>] [-s] [-S[<nyckelid>]] " +"<incheckning>..." -msgid "git revert <subcommand>" -msgstr "git revert <underkommando>" +msgid "git revert (--continue | --skip | --abort | --quit)" +msgstr "git revert (--continue | --skip | --abort | --quit)" -msgid "git cherry-pick [<options>] <commit-ish>..." -msgstr "git cherry-pick [<flaggor>] <incheckning-igt>..." +msgid "" +"git cherry-pick [--edit] [-n] [-m <parent-number>] [-s] [-x] [--ff]\n" +" [-S[<keyid>]] <commit>..." +msgstr "" +"git cherry-pick [--edit] [-n] [-m <förälder-nummer>] [-s] [-x] [--ff]\n" +" [-S[<nyckelid>]] <incheckning>..." -msgid "git cherry-pick <subcommand>" -msgstr "git cherry-pick <underkommando>" +msgid "git cherry-pick (--continue | --skip | --abort | --quit)" +msgstr "git cherry-pick (--continue | --skip | --abort | --quit)" #, c-format msgid "option `%s' expects a number greater than zero" @@ -11307,8 +11396,14 @@ msgstr "\"revert\" misslyckades" msgid "cherry-pick failed" msgstr "\"cherry-pick\" misslyckades" -msgid "git rm [<options>] [--] <file>..." -msgstr "git rm [<flaggor>] [--] <fil>..." +msgid "" +"git rm [-f | --force] [-n] [-r] [--cached] [--ignore-unmatch]\n" +" [--quiet] [--pathspec-from-file=<file> [--pathspec-file-nul]]\n" +" [--] [<pathspec>...]" +msgstr "" +"git rm [-f | --force] [-n] [-r] [--cached] [--ignore-unmatch]\n" +" [--quiet] [--pathspec-from-file=<fil> [--pathspec-file-nul]]\n" +" [--] [<sökväg>...]" msgid "" "the following file has staged content different from both the\n" @@ -11379,11 +11474,13 @@ msgid "" "git send-pack [--mirror] [--dry-run] [--force]\n" " [--receive-pack=<git-receive-pack>]\n" " [--verbose] [--thin] [--atomic]\n" +" [--[no-]signed | --signed=(true|false|if-asked)]\n" " [<host>:]<directory> (--all | <ref>...)" msgstr "" "git send-pack [--mirror] [--dry-run] [--force]\n" " [--receive-pack=<git-receive-pack>]\n" " [--verbose] [--thin] [--atomic]\n" +" [--[no-]signed | --signed=(true|false|if-asked)]\n" " [<värd>:]<katalog> (--all | <ref>...)" msgid "remote name" @@ -11407,8 +11504,9 @@ msgstr "git log --pretty=short | git shortlog [<flaggor>]" msgid "using multiple --group options with stdin is not supported" msgstr "mer än en \"--group\"-flagga stöds inte med standard in" -msgid "using --group=trailer with stdin is not supported" -msgstr "att använda --group=trailer stöds inte med standard in" +#, c-format +msgid "using %s with stdin is not supported" +msgstr "använda %s med standard in stöds inte" #, c-format msgid "unknown group type: %s" @@ -11445,12 +11543,14 @@ msgid "" "git show-branch [-a | --all] [-r | --remotes] [--topo-order | --date-order]\n" " [--current] [--color[=<when>] | --no-color] [--sparse]\n" " [--more=<n> | --list | --independent | --merge-base]\n" -" [--no-name | --sha1-name] [--topics] [(<rev> | <glob>)...]" +" [--no-name | --sha1-name] [--topics]\n" +" [(<rev> | <glob>)...]" msgstr "" "git show-branch [-a | --all] [-r | --remotes] [--topo-order | --date-order]\n" " [--current] [--color[=<när>] | --no-color] [--sparse]\n" " [--more=<n> | --list | --independent | --merge-base]\n" -" [--no-name | --sha1-name] [--topics] [(<rev> | <mönster>)...]" +" [--no-name | --sha1-name] [--topics]\n" +" [(<rev> | <mönster>)...]" msgid "git show-branch (-g | --reflog)[=<n>[,<base>]] [--list] [<ref>]" msgstr "git show-branch (-g | --reflog)[=<n>[,<bas>]] [--list] [<ref>]" @@ -11550,11 +11650,13 @@ msgid "Unknown hash algorithm" msgstr "okänd hashningsalgoritm" msgid "" -"git show-ref [-q | --quiet] [--verify] [--head] [-d | --dereference] [-s | --" -"hash[=<n>]] [--abbrev[=<n>]] [--tags] [--heads] [--] [<pattern>...]" +"git show-ref [-q | --quiet] [--verify] [--head] [-d | --dereference]\n" +" [-s | --hash[=<n>]] [--abbrev[=<n>]] [--tags]\n" +" [--heads] [--] [<pattern>...]" msgstr "" -"git show-ref [-q | --quiet] [--verify] [--head] [-d | --dereference] [-s | --" -"hash[=<n>]] [--abbrev[=<n>]] [--tags] [--heads] [--] [<mönster>...]" +"git show-ref [-q | --quiet] [--verify] [--head] [-d | --dereference]\n" +" [-s | --hash[=<n>]] [--abbrev[=<n>]] [--tags]\n" +" [--heads] [--] [<mönster>...]" msgid "git show-ref --exclude-existing[=<pattern>]" msgstr "git show-ref --exclude-existing[=<mönster>]" @@ -11583,8 +11685,10 @@ msgstr "visa inte resultat pÃ¥ standard ut (användbart med --verify)" msgid "show refs from stdin that aren't in local repository" msgstr "visa referenser frÃ¥n standard in som inte finns i lokalt arkiv" -msgid "git sparse-checkout (init|list|set|add|reapply|disable) <options>" -msgstr "git sparse-checkout (init|list|set|add|reapply|disable) <flaggor>" +msgid "" +"git sparse-checkout (init | list | set | add | reapply | disable) [<options>]" +msgstr "" +"git sparse-checkout (init | list | set | add | reapply | disable) <flaggor>" msgid "this worktree is not sparse" msgstr "arbetskatalogen är inte gren" @@ -11707,67 +11811,58 @@ msgstr "" msgid "error while refreshing working directory" msgstr "fel vid uppdatering av arbetskatalog" -msgid "git stash list [<options>]" -msgstr "git stash list [<flaggor>]" +msgid "git stash list [<log-options>]" +msgstr "git stash list [<\"log\"-flaggor>]" + +msgid "" +"git stash show [-u | --include-untracked | --only-untracked] [<diff-" +"options>] [<stash>]" +msgstr "" +"git stash show [-u | --include-untracked | --only-untracked] [<\"diff\"-" +"flaggor>] [<stash>]" -msgid "git stash show [<options>] [<stash>]" -msgstr "git stash show [<flaggor>] [<stash>]" +msgid "git stash drop [-q | --quiet] [<stash>]" +msgstr "git stash drop [-q | --quiet] [<stash>]" -msgid "git stash drop [-q|--quiet] [<stash>]" -msgstr "git stash drop [-q|--quiet] [<stash>]" +msgid "git stash pop [--index] [-q | --quiet] [<stash>]" +msgstr "git stash pop [--index] [-q | --quiet] [<stash>]" -msgid "git stash ( pop | apply ) [--index] [-q|--quiet] [<stash>]" -msgstr "git stash ( pop | apply ) [--index] [-q|--quiet] [<stash>]" +msgid "git stash apply [--index] [-q | --quiet] [<stash>]" +msgstr "git stash apply [--index] [-q | --quiet] [<stash>]" msgid "git stash branch <branchname> [<stash>]" msgstr "git stash branch <grennamn> [<stash>]" +msgid "git stash store [(-m | --message) <message>] [-q | --quiet] <commit>" +msgstr "" +"git stash store [(-m | --message) <meddelande>] [-q | --quiet] <incheckning>" + msgid "" -"git stash [push [-p|--patch] [-S|--staged] [-k|--[no-]keep-index] [-q|--" -"quiet]\n" -" [-u|--include-untracked] [-a|--all] [-m|--message <message>]\n" +"git stash [push [-p | --patch] [-S | --staged] [-k | --[no-]keep-index] [-q " +"| --quiet]\n" +" [-u | --include-untracked] [-a | --all] [(-m | --message) " +"<message>]\n" " [--pathspec-from-file=<file> [--pathspec-file-nul]]\n" " [--] [<pathspec>...]]" msgstr "" -"git stash [push [-p|--patch] [S|--staged] [-k|--[no-]keep-index] [-q|--" -"quiet]\n" -" [-u|--include-untracked] [-a|--all] [-m|--message <meddelande>]\n" +"git stash [push [-p | --patch] [S | --staged] [-k | --[no-]keep-index] [-q | " +"--quiet]\n" +" [-u | --include-untracked] [-a | --all] [(-m | --message " +"<meddelande>]\n" " [--pathspec-from-file=<fil> [--pathspec-file-nul]]\n" " [--] [<sökväg>...]]" msgid "" -"git stash save [-p|--patch] [-S|--staged] [-k|--[no-]keep-index] [-q|--" -"quiet]\n" -" [-u|--include-untracked] [-a|--all] [<message>]" +"git stash save [-p | --patch] [-S | --staged] [-k | --[no-]keep-index] [-q | " +"--quiet]\n" +" [-u | --include-untracked] [-a | --all] [<message>]" msgstr "" -"git stash save [-p|--patch] [-S|--staged] [-k|--[no-]keep-index] [-q|--" -"quiet]\n" -" [-u|--include-untracked] [-a|--all] [<meddelande>]" +"git stash save [-p | --patch] [-S | --staged] [-k | --[no-]keep-index] [-q | " +"--quiet]\n" +" [-u | --include-untracked] [-a | --all] [<meddelande>]" -msgid "git stash pop [--index] [-q|--quiet] [<stash>]" -msgstr "git stash pop [--index] [-q|--quiet] [<stash>]" - -msgid "git stash apply [--index] [-q|--quiet] [<stash>]" -msgstr "git stash apply [--index] [-q|--quiet] [<stash>]" - -msgid "git stash store [-m|--message <message>] [-q|--quiet] <commit>" -msgstr "git stash store [-m|--message <meddelande>] [-q|--quiet] <incheckning>" - -msgid "" -"git stash [push [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]\n" -" [-u|--include-untracked] [-a|--all] [-m|--message <message>]\n" -" [--] [<pathspec>...]]" -msgstr "" -"git stash [push [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]\n" -" [-u|--include-untracked] [-a|--all] [-m|--message <meddelande>]\n" -" [--] [<sökväg>...]]" - -msgid "" -"git stash save [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]\n" -" [-u|--include-untracked] [-a|--all] [<message>]" -msgstr "" -"git stash save [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]\n" -" [-u|--include-untracked] [-a|--all] [<meddelande>]" +msgid "git stash create [<message>]" +msgstr "git stash create [<meddelande>]" #, c-format msgid "'%s' is not a stash-like commit" @@ -12327,9 +12422,6 @@ msgstr "traversera undermoduler rekursivt" msgid "don't fetch new objects from the remote site" msgstr "hämta inte nya objekt frÃ¥n fjärrplatsen" -msgid "path into the working tree" -msgstr "sökväg inuti arbetskatalogen" - msgid "use the 'checkout' update strategy (default)" msgstr "använd uppdateringsstrategin \"checkout\" (utcheckning; förval)" @@ -12365,27 +12457,9 @@ msgstr "" "[no-]recommend-shallow] [--reference <arkiv>] [--recursive] [--[no-]single-" "branch] [--] [<sökväg>...]" -msgid "recurse into submodules" -msgstr "rekursera ner i undermoduler" - msgid "git submodule absorbgitdirs [<options>] [<path>...]" msgstr "git submodule absorbgitdirs [<flaggor>] [<sökväg>...]" -msgid "check if it is safe to write to the .gitmodules file" -msgstr "se om det är säkert att skriva till .gitmodules-filen" - -msgid "unset the config in the .gitmodules file" -msgstr "ta bort konfigurationen frÃ¥n .gitmodules-filen" - -msgid "git submodule--helper config <name> [<value>]" -msgstr "git submodule--helper config <namn> [<värde>]" - -msgid "git submodule--helper config --unset <name>" -msgstr "git submodule--helper config --unset <namn>" - -msgid "please make sure that the .gitmodules file is in the working tree" -msgstr "se till att .gitmodules finns i arbetskatalogen" - msgid "suppress output for setting url of a submodule" msgstr "dölj utdata frÃ¥n inställning av url för undermodul" @@ -12464,6 +12538,9 @@ msgstr "Aktiverar lokal git-katalog för undermodulen \"%s\" pÃ¥ nytt.\n" msgid "unable to checkout submodule '%s'" msgstr "Kan inte checka ut undermodulen \"%s\"" +msgid "please make sure that the .gitmodules file is in the working tree" +msgstr "se till att .gitmodules finns i arbetskatalogen" + #, c-format msgid "Failed to add submodule '%s'" msgstr "Misslyckades lägga till undermodulen \"%s\"" @@ -12514,19 +12591,21 @@ msgstr "arkiv-URL: \"%s\" mÃ¥ste vara absolut eller börja med ./|../" msgid "'%s' is not a valid submodule name" msgstr "\"%s\" är inte ett giltigt namn pÃ¥ undermodul" +msgid "git submodule--helper <command>" +msgstr "git submodule--helper <kommando>" + #, c-format msgid "%s doesn't support --super-prefix" msgstr "%s stöder inte --super-prefix" -#, c-format -msgid "'%s' is not a valid submodule--helper subcommand" -msgstr "\"%s\" är inte ett giltigt underkommando till submodule--helper" +msgid "git symbolic-ref [-m <reason>] <name> <ref>" +msgstr "git symbolic-ref [-m <orsak>] <namn> <ref>" -msgid "git symbolic-ref [<options>] <name> [<ref>]" -msgstr "git symbolic-ref [<flaggor>] <namn> [<ref>]" +msgid "git symbolic-ref [-q] [--short] [--no-recurse] <name>" +msgstr "git symbolic-ref [-q] [--short] [--no-recurse] <namn>" -msgid "git symbolic-ref -d [-q] <name>" -msgstr "git symbolic-ref -d [-q] <namn>" +msgid "git symbolic-ref --delete [-q] <name>" +msgstr "git symbolic-ref --delete [-q] <namn>" msgid "suppress error message for non-symbolic (detached) refs" msgstr "" @@ -12538,6 +12617,9 @@ msgstr "ta bort symbolisk referens" msgid "shorten ref output" msgstr "förkorta ref-utdata" +msgid "recursively dereference (default)" +msgstr "avreferera rekursivt (standard)" + msgid "reason" msgstr "skäl" @@ -12545,25 +12627,26 @@ msgid "reason of the update" msgstr "skäl till uppdateringen" msgid "" -"git tag [-a | -s | -u <key-id>] [-f] [-m <msg> | -F <file>]\n" -" <tagname> [<head>]" +"git tag [-a | -s | -u <key-id>] [-f] [-m <msg> | -F <file>] [-e]\n" +" <tagname> [<commit> | <object>]" msgstr "" -"git tag [-a | -s | -u <nyckel-id>] [-f] [-m <medd> | -F <fil>]\n" -" <taggnamn> [<huvud>]" +"git tag [-a | -s | -u <nyckel-id>] [-f] [-m <medd> | -F <fil>] [-e]\n" +" <taggnamn> [<incheckning> | <objekt>]" msgid "git tag -d <tagname>..." msgstr "git tag -d <taggnamn>..." msgid "" -"git tag -l [-n[<num>]] [--contains <commit>] [--no-contains <commit>] [--" -"points-at <object>]\n" -" [--format=<format>] [--merged <commit>] [--no-merged <commit>] " -"[<pattern>...]" +"git tag [-n[<num>]] -l [--contains <commit>] [--no-contains <commit>]\n" +" [--points-at <object>] [--column[=<options>] | --no-column]\n" +" [--create-reflog] [--sort=<key>] [--format=<format>]\n" +" [--merged <commit>] [--no-merged <commit>] [<pattern>...]" msgstr "" -"git tag -l [-n[<antal>]] [--contains <incheckning>] [--no-contains " -"<incheckning>] [--points-at <objekt>]\n" -" [--format=<format>] [--merged <incheckning>] [--no-merged " -"<incheckning>] [<mönster>...]" +"git tag [-n[<antal>]] -l [--contains <incheckning>] [--no-contains " +"<incheckning>\n" +" [--points-at <objekt>] [--column[=<flaggor>] | --no-column]\n" +" [--create-reflog] [--sort=<nyckel>] [--format=<format>]\n" +" [--merged <incheckning>] [--no-merged <incheckning>] [<mönster>...]" msgid "git tag -v [--format=<format>] <tagname>..." msgstr "git tag -v [--format=<format>] <taggnamn>..." @@ -12938,8 +13021,12 @@ msgstr "läs uppdateringar frÃ¥n standard in" msgid "update the info files from scratch" msgstr "uppdatera informationsfilerna frÃ¥n grunden" -msgid "git upload-pack [<options>] <dir>" -msgstr "git upload-pack [<flaggor>] <katalog>" +msgid "" +"git-upload-pack [--[no-]strict] [--timeout=<n>] [--stateless-rpc]\n" +" [--advertise-refs] <directory>" +msgstr "" +"git-upload-pack [--[no-]strict] [--timeout=<n>] [--stateless-rpc]\n" +" [--advertise-refs] <katalog>" msgid "quit after a single request/response exchange" msgstr "avsluta omedelbart efter första anrop/svar-utväxling" @@ -12953,8 +13040,8 @@ msgstr "testa inte <katalog>/.git/ om <katalog> inte är en Git-katalog" msgid "interrupt transfer after <n> seconds of inactivity" msgstr "avbryt överföringen efter <n> sekunders inaktivitet" -msgid "git verify-commit [-v | --verbose] <commit>..." -msgstr "git verify-commit [-v | --verbose] <incheckning>..." +msgid "git verify-commit [-v | --verbose] [--raw] <commit>..." +msgstr "git verify-commit [-v | --verbose] [--raw] <incheckning>..." msgid "print commit contents" msgstr "visa innehÃ¥ll för incheckning" @@ -12962,8 +13049,9 @@ msgstr "visa innehÃ¥ll för incheckning" msgid "print raw gpg status output" msgstr "visa rÃ¥a gpg-statusdata" -msgid "git verify-pack [-v | --verbose] [-s | --stat-only] <pack>..." -msgstr "git verify-pack [-v | --verbose] [-s | --stat-only] <paket>..." +msgid "git verify-pack [-v | --verbose] [-s | --stat-only] [--] <pack>.idx..." +msgstr "" +"git verify-pack [-v | --verbose] [-s | --stat-only] [--] <paket>.idx..." msgid "verbose" msgstr "pratsam" @@ -12971,35 +13059,39 @@ msgstr "pratsam" msgid "show statistics only" msgstr "visa endast statistik" -msgid "git verify-tag [-v | --verbose] [--format=<format>] <tag>..." -msgstr "git verify-tag [-v | --verbose] [--format=<format>] <tagg>..." +msgid "git verify-tag [-v | --verbose] [--format=<format>] [--raw] <tag>..." +msgstr "git verify-tag [-v | --verbose] [--format=<format>] [--raw] <tagg>..." msgid "print tag contents" msgstr "visa innehÃ¥ll för tag" -msgid "git worktree add [<options>] <path> [<commit-ish>]" -msgstr "git worktree add [<flaggor>] <sökväg> [<incheckning-igt>]" +msgid "" +"git worktree add [-f] [--detach] [--checkout] [--lock [--reason <string>]]\n" +" [-b <new-branch>] <path> [<commit-ish>]" +msgstr "" +"git worktree add [-f] [--detach] [--checkout] [--lock [--reason <sträng>]]\n" +" [-b <ny-gren>] <sökväg> [<incheckning-igt>]" -msgid "git worktree list [<options>]" -msgstr "git worktree list [<flaggor>]" +msgid "git worktree list [-v | --porcelain [-z]]" +msgstr "git worktree list [-v | --porcelain [-z]]" -msgid "git worktree lock [<options>] <path>" -msgstr "git worktree lock [<flaggor>] <sökväg>" +msgid "git worktree lock [--reason <string>] <worktree>" +msgstr "git worktree lock [--reason <sträng>] <arbetskatalog>" msgid "git worktree move <worktree> <new-path>" msgstr "git worktree move <arbetskatalog> <ny-sökväg>" -msgid "git worktree prune [<options>]" -msgstr "git worktree prune [<flaggor>]" +msgid "git worktree prune [-n] [-v] [--expire <expire>]" +msgstr "git worktree prune [-n] [-v] [--expire <utgÃ¥r>]" -msgid "git worktree remove [<options>] <worktree>" -msgstr "git worktree remove [<flaggor>] <arbetskatalog>" +msgid "git worktree remove [-f] <worktree>" +msgstr "git worktree remove [-f] <arbetskatalog>" msgid "git worktree repair [<path>...]" msgstr "git worktree repair [<sökväg>...]" -msgid "git worktree unlock <path>" -msgstr "git worktree unlock <sökväg>" +msgid "git worktree unlock <worktree>" +msgstr "git worktree unlock <arbetskatalog>" #, c-format msgid "Removing %s/%s: %s" @@ -13235,6 +13327,10 @@ msgstr "endast användbart vid felsökning" msgid "core.fsyncMethod = batch is unsupported on this platform" msgstr "core.fsyncMethod = batch stöds inte pÃ¥ denna plattform" +#, c-format +msgid "bundle list at '%s' has no mode" +msgstr "buntlistan pÃ¥ \"%s\" har inget läge" + msgid "failed to create temporary file" msgstr "misslyckades skapa temporär fil" @@ -13242,16 +13338,29 @@ msgid "insufficient capabilities" msgstr "otillräckliga kapabiliteter" #, c-format +msgid "unrecognized bundle mode from URI '%s'" +msgstr "okänt buntlägre frÃ¥n URI:en \"%s\"" + +#, c-format +msgid "exceeded bundle URI recursion limit (%d)" +msgstr "överskred buntens URI-rekursionsgräns (%d)" + +#, c-format msgid "failed to download bundle from URI '%s'" msgstr "kunde inte hämta bunt frÃ¥n URI:en \"%s\"" #, c-format -msgid "file at URI '%s' is not a bundle" -msgstr "filen pÃ¥ URI \"%s\" är inte en bunt" +msgid "file at URI '%s' is not a bundle or bundle list" +msgstr "filen pÃ¥ URI:en \"%s\" är inte en bunt eller buntlista" -#, c-format -msgid "failed to unbundle bundle from URI '%s'" -msgstr "misslyckades packa upp bunten frÃ¥n URI:en \"%s\"" +msgid "bundle-uri: got an empty line" +msgstr "bunt-uri: fick en tom rad" + +msgid "bundle-uri: line is not of the form 'key=value'" +msgstr "bunt-uri: raden är inte pÃ¥ formen \"nyckel=värde\"" + +msgid "bundle-uri: line has empty key or value" +msgstr "bunt-uri: raden har tom nyckel eller värde" #, c-format msgid "unrecognized bundle hash algorithm: %s" @@ -13822,7 +13931,7 @@ msgstr "Filformat för bunt" msgid "Chunk-based file formats" msgstr "Styckebaserade filformat" -msgid "Git commit graph format" +msgid "Git commit-graph format" msgstr "Format för Git-incheckningsgraf" msgid "Git index format" @@ -14175,6 +14284,10 @@ msgstr "ohanterat fall i \"has_worktree_moved\": %d" msgid "health thread wait failed [GLE %ld]" msgstr "misslyckades vänta pÃ¥ hälsotrÃ¥den [GLE %ld]" +#, c-format +msgid "Invalid path: %s" +msgstr "ogiltig sökväg: %s" + msgid "Unable to create FSEventStream." msgstr "kunde inte skapa FSEventStream." @@ -14206,6 +14319,22 @@ msgid "could not read directory changes [GLE %ld]" msgstr "kunde inte läsa katalogändringar [GLE %ld]" #, c-format +msgid "opendir('%s') failed" +msgstr "opendir('%s') misslyckades" + +#, c-format +msgid "lstat('%s') failed" +msgstr "lstat('%s') misslyckades" + +#, c-format +msgid "strbuf_readlink('%s') failed" +msgstr "strbuf_readlink('%s') misslyckades" + +#, c-format +msgid "closedir('%s') failed" +msgstr "closedir('%s') misslyckades" + +#, c-format msgid "[GLE %ld] unable to open for read '%ls'" msgstr "[GLE %ld] kunde inte öppna \"%ls\" för läsning" @@ -15804,10 +15933,11 @@ msgstr "det virtuella arkivet \"%s\" är inkompatibelt med fsmonitor" #, c-format msgid "" -"repository '%s' is incompatible with fsmonitor due to lack of Unix sockets" +"socket directory '%s' is incompatible with fsmonitor due to lack of Unix " +"sockets support" msgstr "" -"arkivet \"%s\" är inkompatibelt med fsmonitor pÃ¥ grund av avsaknad av Unix-" -"uttag" +"uttagskatalogen \"%s\" är inkompatibelt med fsmonitor pÃ¥ grund av avsaknad " +"av Unix-uttag" msgid "" "git [-v | --version] [-h | --help] [-C <path>] [-c <name>=<value>]\n" @@ -16128,8 +16258,8 @@ msgstr[1] "" "\n" "Mest lika kommandon är" -msgid "git version [<options>]" -msgstr "git version [<flaggor>]" +msgid "git version [--build-options]" +msgstr "git version [--build-options]" #, c-format msgid "%s: %s - %s" @@ -17041,10 +17171,6 @@ msgstr "kunde inte normalisera supplerande objektsökväg: %s" msgid "%s: ignoring alternate object stores, nesting too deep" msgstr "%s: ignorerar supplerande objektlager, för djup nästling" -#, c-format -msgid "unable to normalize object directory: %s" -msgstr "kan inte normalisera objektkatalogen: %s" - msgid "unable to fdopen alternates lockfile" msgstr "kan inte utföra \"fdopen\" pÃ¥ suppleantlÃ¥sfil" @@ -17867,6 +17993,10 @@ msgstr "" msgid "promisor remote name cannot begin with '/': %s" msgstr "kontraktsfjärr kan inte börja med \"/\": %s" +#, c-format +msgid "could not fetch %s from promisor remote" +msgstr "kunde inte hämta %s frÃ¥n kontraktsfjärr" + msgid "object-info: expected flush after arguments" msgstr "object-info: förväntade \"flush\" efter argument" @@ -18937,6 +19067,13 @@ msgid "failed to find tree of %s" msgstr "kunde inte hitta trädet för %s." #, c-format +msgid "unsupported section for hidden refs: %s" +msgstr "sktionen för dolda referenser stöds ej: %s" + +msgid "--exclude-hidden= passed more than once" +msgstr "--exclude-hidden= angavs mer än en gÃ¥ng" + +#, c-format msgid "resolve-undo records `%s` which is missing" msgstr "resolve-undo registrerar \"%s\" som saknas" @@ -19080,6 +19217,14 @@ msgid "--all or <enlistment>, but not both" msgstr "--all eller <enrollering>, men inte bägge" #, c-format +msgid "could not remove stale scalar.repo '%s'" +msgstr "kunde inte ta bort gammal scalar.repo \"%s\"" + +#, c-format +msgid "removing stale scalar.repo '%s'" +msgstr "tar bort gammal scalar.repo \"%s\"" + +#, c-format msgid "git repository gone in '%s'" msgstr "git-arkiv försvunnet i \"%s\"" @@ -19702,16 +19847,16 @@ msgstr "" msgid "illegal label name: '%.*s'" msgstr "ogiltigt etikettnamn: \"%.*s\"" +#, c-format +msgid "could not resolve '%s'" +msgstr "kunde inte upplösa \"%s\"" + msgid "writing fake root commit" msgstr "skriver fejkad rotincheckning" msgid "writing squash-onto" msgstr "skriver squash-onto" -#, c-format -msgid "could not resolve '%s'" -msgstr "kunde inte upplösa \"%s\"" - msgid "cannot merge without a current revision" msgstr "kan inte slÃ¥ ihop utan en aktuell incheckning" @@ -20308,6 +20453,15 @@ msgstr "ls-tree returnerade en oväntad returkod %d" msgid "failed to lstat '%s'" msgstr "misslyckades ta status (lstat) pÃ¥ \"%s\"" +msgid "test-tool cache-tree <options> (control|prime|update)" +msgstr "test-tool cache-tree <flaggor> (control|prime|update)" + +msgid "clear the cache tree before each iteration" +msgstr "töm cacheträdet före varje iteration" + +msgid "number of entries in the cache tree to invalidate (default 0)" +msgstr "antal poster i cacheträdet att ogiltigförklara (förval är 0)" + msgid "unhandled options" msgstr "flaggor som inte hanterats" @@ -92,8 +92,8 @@ msgid "" msgstr "" "Project-Id-Version: Git Turkish Localization Project\n" "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n" -"POT-Creation-Date: 2022-09-28 10:54+0300\n" -"PO-Revision-Date: 2022-09-28 14:00+0300\n" +"POT-Creation-Date: 2022-12-07 17:32+0300\n" +"PO-Revision-Date: 2022-12-07 18:00+0300\n" "Last-Translator: Emir SARI <emir_sari@icloud.com>\n" "Language-Team: Turkish (https://github.com/bitigchi/git-po/)\n" "Language: tr\n" @@ -840,6 +840,9 @@ msgstr "komut satırı \\ ile bitiyor" msgid "unclosed quote" msgstr "kapatılmamış tırnak" +msgid "too many arguments" +msgstr "pek fazla argüman" + #, c-format msgid "unrecognized whitespace option '%s'" msgstr "tanımlanamayan boÅŸluk seçeneÄŸi '%s'" @@ -1880,7 +1883,7 @@ msgid "allow updating entries outside of the sparse-checkout cone" msgstr "aralıklı çıkış konisi dışındaki girdileri güncellemeye izin ver" msgid "override the executable bit of the listed files" -msgstr "listelenen dosyaların çalıştırılabilir kısımlarını geçersiz kıl" +msgstr "listelenen dosyaların yürütülebilir kısımlarını geçersiz kıl" msgid "warn when adding an embedded repository" msgstr "gömülü bir depo eklenirken uyar" @@ -2597,42 +2600,6 @@ msgstr "" "ikili arama çalıştırılamadı: 'git bisect--helper --bisect-state %s', %d hata " "koduyla çıktı" -msgid "reset the bisection state" -msgstr "ikili arama durumunu sıfırla" - -msgid "check whether bad or good terms exist" -msgstr "iyi veya kötü terimlerin olup olmadığını denetle" - -msgid "print out the bisect terms" -msgstr "ikili arama terimlerini yazdır" - -msgid "start the bisect session" -msgstr "ikili arama oturumunu baÅŸlat" - -msgid "find the next bisection commit" -msgstr "bir sonraki ikili arama iÅŸlemesini bul" - -msgid "mark the state of ref (or refs)" -msgstr "baÅŸvurunun (veya baÅŸvuruların) durumunu imle" - -msgid "list the bisection steps so far" -msgstr "ÅŸu ana kadarki ikili arama durumunu listele" - -msgid "replay the bisection process from the given file" -msgstr "verilen dosyadan ikili arama iÅŸlemini yeniden oynat" - -msgid "skip some commits for checkout" -msgstr "çıkış için birkaç iÅŸlemeyi atla" - -msgid "visualize the bisection" -msgstr "ikili aramayı görselleÅŸtir" - -msgid "use <cmd>... to automatically bisect" -msgstr "kendiliÄŸinden ikili aramak için <komut>... kullan" - -msgid "no log for BISECT_WRITE" -msgstr "BISECT_WRITE için günlük yok" - msgid "--bisect-reset requires either no argument or a commit" msgstr "--bisect-reset bir argüman veya iÅŸleme gerektirmiyor" @@ -2651,6 +2618,9 @@ msgstr "hiçbir günlük dosyası verilmedi" msgid "git blame [<options>] [<rev-opts>] [<rev>] [--] <file>" msgstr "git blame [<seçenekler>] [<rev-sçnk>] [<rev>] [--] <dosya>" +msgid "git annotate [<options>] [<rev-opts>] [<rev>] [--] <file>" +msgstr "git annotate [<seçenekler>] [<rev-sçnk>] [<rev>] [--] <dosya>" + msgid "<rev-opts> are documented in git-rev-list(1)" msgstr "<rev-sçnk>, git-rev-list(1) içinde belgelendirilmiÅŸtir" @@ -2838,9 +2808,6 @@ msgstr "config-file güncellemesi baÅŸarısız" msgid "cannot use -a with -d" msgstr "-a, -d ile kullanılamıyor" -msgid "Couldn't look up commit object for HEAD" -msgstr "HEAD için iÅŸleme nesnesi aranamadı" - #, c-format msgid "Cannot delete branch '%s' checked out at '%s'" msgstr "'%s' dalı silinemiyor, ÅŸurada çıkış yapılmış: '%s'" @@ -2879,16 +2846,18 @@ msgstr "%s dalı %s konumunda yeniden temellendiriliyor" msgid "Branch %s is being bisected at %s" msgstr "%s dalı %s konumunda ikili aranıyor" -msgid "cannot copy the current branch while not on any." -msgstr "Bir dalın üzerinde deÄŸilken geçerli dal kopyalanamaz." - -msgid "cannot rename the current branch while not on any." -msgstr "Bir dalın üzerinde deÄŸilken geçerli dal yeniden adlandırılamaz." - #, c-format msgid "Invalid branch name: '%s'" msgstr "Geçersiz dal adı: '%s'" +#, c-format +msgid "No commit on branch '%s' yet." +msgstr "'%s' dalında henüz bir iÅŸleme yok." + +#, c-format +msgid "No branch named '%s'." +msgstr "'%s' adında bir dal yok." + msgid "Branch rename failed" msgstr "Dal yeniden adlandırması baÅŸarısız" @@ -3047,22 +3016,20 @@ msgstr "Ayrılmış HEAD'e açıklama verilemiyor" msgid "cannot edit description of more than one branch" msgstr "birden çok dalın açıklaması düzenlenemiyor" -#, c-format -msgid "No commit on branch '%s' yet." -msgstr "'%s' dalında henüz bir iÅŸleme yok." +msgid "cannot copy the current branch while not on any." +msgstr "Bir dalın üzerinde deÄŸilken geçerli dal kopyalanamaz." -#, c-format -msgid "No branch named '%s'." -msgstr "'%s' adında bir dal yok." +msgid "cannot rename the current branch while not on any." +msgstr "Bir dalın üzerinde deÄŸilken geçerli dal yeniden adlandırılamaz." msgid "too many branches for a copy operation" -msgstr "bir kopyalama iÅŸlemi için çok fazla dal" +msgstr "bir kopyalama iÅŸlemi için pek fazla dal" msgid "too many arguments for a rename operation" -msgstr "bir yeniden adlandırma iÅŸlemi için çok fazla argüman" +msgstr "bir yeniden adlandırma iÅŸlemi için pek fazla argüman" msgid "too many arguments to set new upstream" -msgstr "yeni üstkaynak ayarlamak için çok fazla argüman" +msgstr "yeni üstkaynak ayarlamak için pek fazla argüman" #, c-format msgid "" @@ -3080,7 +3047,7 @@ msgid "branch '%s' does not exist" msgstr "'%s' diye bir dal yok" msgid "too many arguments to unset upstream" -msgstr "üst kaynağı kaldırmak için çok fazla argüman" +msgstr "üst kaynağı kaldırmak için pek fazla argüman" msgid "could not unset upstream of HEAD when it does not point to any branch." msgstr "" @@ -3121,11 +3088,11 @@ msgid "not run from a git repository - no hooks to show\n" msgstr "bir git deposundan çalıştırılmadı - gösterilecek kanca yok\n" msgid "" -"git bugreport [-o|--output-directory <file>] [-s|--suffix <format>] [--" -"diagnose[=<mode>]" +"git bugreport [(-o | --output-directory) <path>] [(-s | --suffix) <format>]\n" +" [--diagnose[=<mode>]]" msgstr "" -"git bugreport [-o|--output-directory <dosya>] [-s|--suffix <biçim>] [--" -"diagnose[=<kip>]" +"git bugreport [(-o | --output-directory) <yol>] [(-s | --suffix) <biçim>]\n" +" [--diagnose[=<kip>]]" msgid "" "Thank you for filling out a Git bug report!\n" @@ -3196,17 +3163,23 @@ msgstr "%s dosyasına yazılamıyor" msgid "Created new report at '%s'.\n" msgstr "Hata raporu '%s' dosyasına yazıldı.\n" -msgid "git bundle create [<options>] <file> <git-rev-list args>" -msgstr "git bundle create [<seçenekler>] <dosya> <git-rev-liste argümanlar>" +msgid "" +"git bundle create [-q | --quiet | --progress | --all-progress] [--all-" +"progress-implied]\n" +" [--version=<version>] <file> <git-rev-list-args>" +msgstr "" +"git bundle create [-q | --quiet | --progress | --all-progress] [--all-" +"progress-implied]\n" +" [--version=<sürüm>] <dosya> <git-rev-liste-argümanları>" -msgid "git bundle verify [<options>] <file>" -msgstr "git bundle verify [<seçenekler>] <dosya>" +msgid "git bundle verify [-q | --quiet] <file>" +msgstr "git bundle verify [-q | --quiet] <dosya>" msgid "git bundle list-heads <file> [<refname>...]" msgstr "git bundle list-heads <dosya> [<baÅŸvuru-adı>...]" -msgid "git bundle unbundle <file> [<refname>...]" -msgstr "git bundle unbundle <dosya> [<baÅŸvuru-adı>...]" +msgid "git bundle unbundle [--progress] <file> [<refname>...]" +msgstr "git bundle unbundle [--progress] <dosya> [<baÅŸvuru-adı>...]" msgid "do not show progress meter" msgstr "ilerleme çubuÄŸunu gösterme" @@ -3281,12 +3254,12 @@ msgid "" "git cat-file (--batch | --batch-check | --batch-command) [--batch-all-" "objects]\n" " [--buffer] [--follow-symlinks] [--unordered]\n" -" [--textconv | --filters]" +" [--textconv | --filters] [-z]" msgstr "" "git cat-file (--batch | --batch-check | --batch-command) [--batch-all-" "objects]\n" " [--buffer] [--follow-symlinks] [--unordered]\n" -" [--textconv | --filters]" +" [--textconv | --filters] [-z]" msgid "" "git cat-file (--textconv | --filters)\n" @@ -3396,9 +3369,6 @@ msgstr "<revizyon>, '%s' ile gerekiyor" msgid "<object> required with '-%c'" msgstr "<nesne>, '-%c' ile gerekiyor" -msgid "too many arguments" -msgstr "çok fazla argüman" - #, c-format msgid "only two arguments allowed in <type> <object> mode, not %d" msgstr "<tür> <nesne> kipinde yalnızca iki argümana izin veriliyor, %d deÄŸil" @@ -3929,9 +3899,11 @@ msgid "use overlay mode" msgstr "yerpaylaşım kipini kullan" msgid "" -"git clean [-d] [-f] [-i] [-n] [-q] [-e <pattern>] [-x | -X] [--] <paths>..." +"git clean [-d] [-f] [-i] [-n] [-q] [-e <pattern>] [-x | -X] [--] " +"[<pathspec>...]" msgstr "" -"git clean [-d] [-f] [-i] [-n] [-q] [-e <dizgi>] [-x | -X] [--] <yollar>..." +"git clean [-d] [-f] [-i] [-n] [-q] [-e <dizgi>] [-x | -X] [--] [<yol-" +"blrtç>...]" #, c-format msgid "Removing %s\n" @@ -4223,6 +4195,10 @@ msgid "failed to start iterator over '%s'" msgstr "yineleyici '%s' üzerinden çalıştırılamadı" #, c-format +msgid "symlink '%s' exists, refusing to clone with --local" +msgstr "'%s' sembolik baÄŸlantısı var, --local ile klonlama reddediliyor" + +#, c-format msgid "failed to unlink '%s'" msgstr "'%s' baÄŸlantısı kesilemedi" @@ -4286,10 +4262,6 @@ msgstr "Çok fazla argüman." msgid "You must specify a repository to clone." msgstr "Klonlamak için bir depo belirtmelisiniz." -#, c-format -msgid "options '%s' and '%s %s' cannot be used together" -msgstr "'%s' ve '%s %s' seçenekleri birlikte kullanılamaz" - msgid "" "--bundle-uri is incompatible with --depth, --shallow-since, and --shallow-" "exclude" @@ -4409,18 +4381,24 @@ msgid "--command must be the first argument" msgstr "--command ilk argüman olmalı" msgid "" -"git commit-graph verify [--object-dir <objdir>] [--shallow] [--[no-]progress]" +"git commit-graph verify [--object-dir <dir>] [--shallow] [--[no-]progress]" msgstr "" -"git commit-graph verify [--object-dir <nsndzn>] [--shallow] [--[no-]progress]" +"git commit-graph verify [--object-dir <dizin>] [--shallow] [--[no-]progress]" msgid "" -"git commit-graph write [--object-dir <objdir>] [--append] [--" -"split[=<strategy>]] [--reachable|--stdin-packs|--stdin-commits] [--changed-" -"paths] [--[no-]max-new-filters <n>] [--[no-]progress] <split options>" +"git commit-graph write [--object-dir <dir>] [--append]\n" +" [--split[=<strategy>]] [--reachable | --stdin-packs | " +"--stdin-commits]\n" +" [--changed-paths] [--[no-]max-new-filters <n>] [--" +"[no-]progress]\n" +" <split options>" msgstr "" -"git commit-graph write [--object-dir <nsndzn>] [--append] [--" -"split[=<strateji>]] [--reachable|--stdin-packs|--stdin-commits] [--changed-" -"paths] [--[no-]max-new-filters <n>] [--[no-]progress] <bölme-seçenekleri>" +"git commit-graph write [--object-dir <dizin>] [--append]\n" +" [--split[=<<strateji>]] [--reachable | --stdin-packs " +"| --stdin-commits]\n" +" [--changed-paths] [--[no-]max-new-filters <n>] [--" +"[no-]progress]\n" +" <bölme-seçenekleri>" msgid "dir" msgstr "dizin" @@ -4491,12 +4469,16 @@ msgstr "" msgid "Collecting commits from input" msgstr "Girdiden iÅŸlemeler toplanıyor" +msgid "git commit-tree <tree> [(-p <parent>)...]" +msgstr "git commit-tree <aÄŸaç> [(-p <üst-öge>)...]" + msgid "" -"git commit-tree [(-p <parent>)...] [-S[<keyid>]] [(-m <message>)...] [(-F " -"<file>)...] <tree>" +"git commit-tree [(-p <parent>)...] [-S[<keyid>]] [(-m <message>)...]\n" +" [(-F <file>)...] <tree>" msgstr "" -"git commit-tree [(-p <üst-öge>)...] [-S[<deÄŸer-no>]] [(-m <ileti>)...] [(-F " -"<dosya>)...] <aÄŸaç>" +"git commit-tree [(-p <üst-öge>)...] [-S[<anahtar-kimliÄŸi>]] [(-m " +"<ileti>)...]\n" +" [(-F <dosya>)...] <aÄŸaç>" #, c-format msgid "duplicate parent %s ignored" @@ -4538,11 +4520,29 @@ msgstr "bir tam aÄŸaç vermeli" msgid "git commit-tree: failed to read" msgstr "git commit-tree: okunamadı" -msgid "git commit [<options>] [--] <pathspec>..." -msgstr "git commit [<seçenekler>] [--] <yol-blrtç>..." +msgid "" +"git commit [-a | --interactive | --patch] [-s] [-v] [-u<mode>] [--amend]\n" +" [--dry-run] [(-c | -C | --squash) <commit> | --fixup [(amend|" +"reword):]<commit>)]\n" +" [-F <file> | -m <msg>] [--reset-author] [--allow-empty]\n" +" [--allow-empty-message] [--no-verify] [-e] [--author=<author>]\n" +" [--date=<date>] [--cleanup=<mode>] [--[no-]status]\n" +" [-i | -o] [--pathspec-from-file=<file> [--pathspec-file-nul]]\n" +" [(--trailer <token>[(=|:)<value>])...] [-S[<keyid>]]\n" +" [--] [<pathspec>...]" +msgstr "" +"git commit [-a | --interactive | --patch] [-s] [-v] [-u<kip>] [--amend]\n" +" [--dry-run] [(-c | -C | --squash) <iÅŸleme> | --fixup [(amend|" +"reword):]<iÅŸleme>)]\n" +" [-F <dosya> | -m <ileti>] [--reset-author] [--allow-empty]\n" +" [--allow-empty-message] [--no-verify] [-e] [--author=<author>]\n" +" [--date=<tarih>] [--cleanup=<kip>] [--[no-]status]\n" +" [-i | -o] [--pathspec-from-file=<dosya> [--pathspec-file-nul]]\n" +" [(--trailer <jeton>[(=|:)<deÄŸer>])...] [-S[<anahtar-kimliÄŸi>]]\n" +" [--] [<yol-blrtç>...]" -msgid "git status [<options>] [--] <pathspec>..." -msgstr "git status [<seçenekler>] [--] <yol-blrtç>..." +msgid "git status [<options>] [--] [<pathspec>...]" +msgstr "git status [<seçenekler>] [--] [<yol-blrtç>...]" msgid "" "You asked to amend the most recent commit, but doing so would make\n" @@ -5298,7 +5298,7 @@ msgid "" "\n" "\tchmod 0700 %s" msgstr "" -"Soket dizininizdeki izinler çok gevÅŸek; diÄŸer kullanıcılar sizin\n" +"Yuva dizininizdeki izinler çok gevÅŸek; diÄŸer kullanıcılar sizin\n" "önbelleÄŸe alınmış yetkilerinizi okuyabilirler. Åžunu çalıştırmayı düşünün:\n" "\n" "\tchmod 0700 %s" @@ -5307,20 +5307,27 @@ msgid "print debugging messages to stderr" msgstr "hata ayıklama iletilerini stderr'e yazdır" msgid "credential-cache--daemon unavailable; no unix socket support" -msgstr "credential-cache--daemon kullanılamıyor; unix soket desteÄŸi yok" +msgstr "credential-cache--daemon kullanılamıyor; unix yuva desteÄŸi yok" msgid "credential-cache unavailable; no unix socket support" -msgstr "credential-cache kullanılamıyor; unix soket desteÄŸi yok" +msgstr "credential-cache kullanılamıyor; unix yuva desteÄŸi yok" #, c-format msgid "unable to get credential storage lock in %d ms" msgstr "kimlik depo kilidi %d ms içinde alınamadı" -msgid "git describe [<options>] [<commit-ish>...]" -msgstr "git describe [<seçenekler>] [<iÅŸlememsi>...]" +msgid "" +"git describe [--all] [--tags] [--contains] [--abbrev=<n>] [<commit-ish>...]" +msgstr "" +"git describe [--all] [--tags] [--contains] [--abbrev=<n>] [<iÅŸlememsi>...]" + +msgid "" +"git describe [--all] [--tags] [--contains] [--abbrev=<n>] --dirty[=<mark>]" +msgstr "" +"git describe [--all] [--tags] [--contains] [--abbrev=<n>] --dirty[=<im>]" -msgid "git describe [<options>] --dirty" -msgstr "git describe [<seçenekler>] --dirty" +msgid "git describe <blob>" +msgstr "git describe <ikili>" msgid "head" msgstr "dal ucu" @@ -5442,11 +5449,11 @@ msgid "option '%s' and commit-ishes cannot be used together" msgstr "'%s' seçeneÄŸi ve iÅŸlememsiler birlikte kullanılamaz" msgid "" -"git diagnose [-o|--output-directory <path>] [-s|--suffix <format>] [--" -"mode=<mode>]" +"git diagnose [(-o | --output-directory) <path>] [(-s | --suffix) <format>]\n" +" [--mode=<mode>]" msgstr "" -"git diagnose [-o|--output-directory <yol>] [-s|--suffix <biçim>] [--" -"mode=<kip>]" +"git diagnose [(-o | --output-directory) <yol>] [(-s | --suffix) <biçim>]\n" +" [--mode=<kip>]" msgid "specify a destination for the diagnostics archive" msgstr "tanı arÅŸivi için bir hedef konum belirtin" @@ -5464,6 +5471,9 @@ msgstr "--merge-base yalnızca iki iÅŸleme ile kullanılabilir" msgid "'%s': not a regular file or symlink" msgstr "'%s': Sıradan bir dosya veya sembolik baÄŸ deÄŸil" +msgid "no merge given, only parents." +msgstr "birleÅŸtirme verilmedi, yalnızca üst ögeler." + #, c-format msgid "invalid option: %s" msgstr "geçersiz seçenek: %s" @@ -5596,8 +5606,8 @@ msgstr "" #, c-format msgid "" -"option `--default' expects an unsigned long value with `--type=ulong`, not `" -"%s`" +"option `--default' expects an unsigned long value with `--type=ulong`, not " +"`%s`" msgstr "" "--default seçeneÄŸi, --type=ulong ile birlikte bir imzalanmamış uzun deÄŸer " "bekliyor, '%s' deÄŸil" @@ -6101,8 +6111,8 @@ msgstr "yalnızca iÅŸlemeyi içeren baÅŸvuruları yazdır" msgid "print only refs which don't contain the commit" msgstr "yalnızca iÅŸlemeyi içermeyen baÅŸvuruları yazdır" -msgid "git for-each-repo --config=<config> <command-args>" -msgstr "git for-each-repo --config=<yapılandırma> <komut-argümanları>" +msgid "git for-each-repo --config=<config> [--] <arguments>" +msgstr "git for-each-repo --config=<yapılandırma> [--] <argümanlar>" msgid "config" msgstr "yapılandırma" @@ -6273,8 +6283,16 @@ msgstr "cache-tree içinde aÄŸaç olmayan öge" msgid "%s: invalid sha1 pointer in resolve-undo" msgstr "%s: resolve-undo içinde geçersiz sha1 iÅŸaretçisi" -msgid "git fsck [<options>] [<object>...]" -msgstr "git fsck [<seçenekler>] [<nesne>...]" +msgid "" +"git fsck [--tags] [--root] [--unreachable] [--cache] [--no-reflogs]\n" +" [--[no-]full] [--strict] [--verbose] [--lost-found]\n" +" [--[no-]dangling] [--[no-]progress] [--connectivity-only]\n" +" [--[no-]name-objects] [<object>...]" +msgstr "" +"git fsck [--tags] [--root] [--unreachable] [--cache] [--no-reflogs]\n" +" [--[no-]full] [--strict] [--verbose] [--lost-found]\n" +" [--[no-]dangling] [--[no-]progress] [--connectivity-only]\n" +" [--[no-]name-objects] [<nesne>...]" msgid "show unreachable objects" msgstr "ulaşılamayan nesneleri göster" @@ -6329,12 +6347,6 @@ msgstr "git fsmonitor--daemon start [<seçenekler>]" msgid "git fsmonitor--daemon run [<options>]" msgstr "git fsmonitor--daemon run [<seçenekler>]" -msgid "git fsmonitor--daemon stop" -msgstr "git fsmonitor--daemon stop" - -msgid "git fsmonitor--daemon status" -msgstr "git fsmonitor--daemon status" - #, c-format msgid "value of '%s' out of range: %d" msgstr "'%s' deÄŸeri erim dışında: %d" @@ -6574,8 +6586,20 @@ msgstr "belirli bir görevi çalıştır" msgid "use at most one of --auto and --schedule=<frequency>" msgstr "tek kezde --auto ve --schedule=<sıklık>'tan birini kullan" -msgid "failed to run 'git config'" -msgstr "'git config' çalıştırılamadı" +#, c-format +msgid "unable to add '%s' value of '%s'" +msgstr "ÅŸunun için '%s' deÄŸeri eklenemiyor: '%s'" + +msgid "return success even if repository was not registered" +msgstr "depo kaydı yapılmamış olsa bile baÅŸarılı durum döndür" + +#, c-format +msgid "unable to unset '%s' value of '%s'" +msgstr "ÅŸunun '%s' deÄŸeri ayarı kaldırılamıyor: '%s'" + +#, c-format +msgid "repository '%s' is not registered" +msgstr "'%s' deposu kaydı yapılmamış" #, c-format msgid "failed to expand path '%s'" @@ -6863,11 +6887,14 @@ msgid "both --cached and trees are given" msgstr "hem --cached hem aÄŸaçlar verilmiÅŸ" msgid "" -"git hash-object [-t <type>] [-w] [--path=<file> | --no-filters] [--stdin] " -"[--] <file>..." +"git hash-object [-t <type>] [-w] [--path=<file> | --no-filters]\n" +" [--stdin [--literally]] [--] <file>..." msgstr "" -"git hash-object [-t <tür>] [-w] [--path=<dosya> | --no-filters] [--stdin] " -"[--] <dosya>..." +"git hash-object [-t <tür>] [-w] [--path=<dosya> | --no-filters]\n" +" [--stdin [--literally]] [--] <dosya>..." + +msgid "git hash-object [-t <type>] [-w] --stdin-paths [--no-filters]" +msgstr "git hash-object [-t <tür>] [-w] --stdin-paths [--no-filters]" msgid "object type" msgstr "nesne türü" @@ -7295,11 +7322,15 @@ msgid "Initialized empty Git repository in %s%s\n" msgstr "%s%s içinde boÅŸ Git deposu ilklendirildi\n" msgid "" -"git init [-q | --quiet] [--bare] [--template=<template-directory>] [--" -"shared[=<permissions>]] [<directory>]" +"git init [-q | --quiet] [--bare] [--template=<template-directory>]\n" +" [--separate-git-dir <git-dir>] [--object-format=<format>]\n" +" [-b <branch-name> | --initial-branch=<branch-name>]\n" +" [--shared[=<permissions>]] [<directory>]" msgstr "" -"git init [-q | --quiet] [--bare] [--template=<ÅŸablon-dizini>] [--" -"shared[=<izinler>]] [<dizin>]" +"git init [-q | --quiet] [--bare] [--template=<ÅŸablon-dizini>]\n" +" [--separate-git-dir <git-dizini>] [--object-format=<biçim>]\n" +" [-b <dal-adı> | --initial-branch=<dal-adı>]\n" +" [--shared[=<izinler>]] [<dizin>]" msgid "permissions" msgstr "izinler" @@ -7340,11 +7371,13 @@ msgid "--separate-git-dir incompatible with bare repository" msgstr "--separate-git-dir, çıplak depo ile uyumsuz" msgid "" -"git interpret-trailers [--in-place] [--trim-empty] [(--trailer " -"<token>[(=|:)<value>])...] [<file>...]" +"git interpret-trailers [--in-place] [--trim-empty]\n" +" [(--trailer <token>[(=|:)<value>])...]\n" +" [--parse] [<file>...]" msgstr "" -"git interpret-trailers [--in-place] [--trim-empty] [(--trailer " -"<jeton>[(=|:)<deÄŸer>])...] [<dosya>...]" +"git interpret-trailers [--in-place] [--trim-empty]\n" +" [(--trailer <jeton>[(=|:)<deÄŸer>])...]\n" +" [--parse] [<dosya>...]" msgid "edit files in place" msgstr "dosyaları yerinde düzenle" @@ -7822,11 +7855,11 @@ msgstr "" msgid "" "git ls-remote [--heads] [--tags] [--refs] [--upload-pack=<exec>]\n" -" [-q | --quiet] [--exit-code] [--get-url]\n" +" [-q | --quiet] [--exit-code] [--get-url] [--sort=<key>]\n" " [--symref] [<repository> [<refs>...]]" msgstr "" -"git ls-remote [--heads] [--tags] [--refs] [--upload-pack=<çlÅŸtr>]\n" -" [-q | --quiet] [--exit-code] [--get-url]\n" +"git ls-remote [--heads] [--tags] [--refs] [--upload-pack=<yürütülebilir>]\n" +" [-q | --quiet] [--exit-code] [--get-url] [--sort=<anahtar>]\n" " [--symref] [<depo> [<baÅŸvurular>...]]" msgid "do not print remote URL" @@ -7955,12 +7988,12 @@ msgstr "git merge-base [-a | --all] <iÅŸleme> <iÅŸleme>..." msgid "git merge-base [-a | --all] --octopus <commit>..." msgstr "git merge-base [-a | --all] --octopus <iÅŸleme>..." -msgid "git merge-base --independent <commit>..." -msgstr "git merge-base --independent <iÅŸleme>..." - msgid "git merge-base --is-ancestor <commit> <commit>" msgstr "git merge-base --is-ancestor <iÅŸleme> <iÅŸleme>" +msgid "git merge-base --independent <commit>..." +msgstr "git merge-base --independent <iÅŸleme>..." + msgid "git merge-base --fork-point <ref> [<commit>]" msgstr "git merge-base --fork-point <baÅŸvuru> [<iÅŸleme>]" @@ -8068,9 +8101,20 @@ msgstr "kipi/oid'si/hazırlığı olmayan dosya adlarını listele" msgid "allow merging unrelated histories" msgstr "birbiriyle iliÅŸkisi olmayan geçmiÅŸlerin birleÅŸtirilmesine izin ver" +msgid "perform multiple merges, one per line of input" +msgstr "girdi satırı başına bir adet çoklu birleÅŸtirmeler gerçekleÅŸtir" + msgid "--trivial-merge is incompatible with all other options" msgstr "--trivial-merge, tüm diÄŸer seçeneklerle uyumsuz" +#, c-format +msgid "malformed input line: '%s'." +msgstr "hatalı oluÅŸturulmuÅŸ girdi satırı: '%s'." + +#, c-format +msgid "merging cannot continue; got unclean result of %d" +msgstr "birleÅŸtirme sürdürülemiyor; %d için temiz olmayan sonuçlar alındı" + msgid "git merge [<options>] [<commit>...]" msgstr "git merge [<seçenekler>] [<iÅŸleme>...]" @@ -8683,10 +8727,6 @@ msgid "cannot read note data from non-blob object '%s'." msgstr "İkili nesne olmayan '%s' nesnesinden not verisi okunamıyor." #, c-format -msgid "malformed input line: '%s'." -msgstr "hatalı oluÅŸturulmuÅŸ girdi satırı: '%s'." - -#, c-format msgid "failed to copy notes from '%s' to '%s'" msgstr "notlar '%s' konumundan '%s' konumuna kopyalanamadı" @@ -8875,16 +8915,16 @@ msgstr "notları <not-bÅŸvr>'ndan kullan" msgid "unknown subcommand: `%s'" msgstr "bilinmeyen altkomut: '%s'" -msgid "" -"git pack-objects --stdout [<options>...] [< <ref-list> | < <object-list>]" +msgid "git pack-objects --stdout [<options>] [< <ref-list> | < <object-list>]" msgstr "" -"git pack-objects --stdout [<seçenekler>...] [< <bÅŸvr-liste> | < <nesne-" -"liste>]" +"git pack-objects --stdout [<sçnklr>] [< <baÅŸvuru-listesi> | < <nesne-" +"listesi>]" msgid "" -"git pack-objects [<options>...] <base-name> [< <ref-list> | < <object-list>]" +"git pack-objects [<options>] <base-name> [< <ref-list> | < <object-list>]" msgstr "" -"git pack-objects [<sçnklr>...] <base-name> [< <bÅŸvr-liste> | < <nesne-liste>]" +"git pack-objects [<sçnklr>] <temel-ad> [< <bÅŸvru-listesi> | < <nesne-" +"listesi>]" #, c-format msgid "" @@ -9262,8 +9302,8 @@ msgstr "" "<git@vger.kernel.org> adresine bir e-posta atarak\n" "bize haber verin. SaÄŸ olun.\n" -msgid "git pack-refs [<options>]" -msgstr "git pack-refs [<seçenekler>]" +msgid "git pack-refs [--all] [--no-prune]" +msgstr "git pack-refs [--all] [--no-prune]" msgid "pack everything" msgstr "her ÅŸeyi paketle" @@ -9271,6 +9311,18 @@ msgstr "her ÅŸeyi paketle" msgid "prune loose refs (default)" msgstr "gevÅŸek baÅŸvuruları buda (öntanımlı)" +msgid "git patch-id [--stable | --unstable | --verbatim]" +msgstr "git patch-id [--stable | --unstable | --verbatim]" + +msgid "use the unstable patch-id algorithm" +msgstr "kararlı olmayan yama kimliÄŸi algoritmasını kullan" + +msgid "use the stable patch-id algorithm" +msgstr "kararlı yama kimliÄŸi algoritmasını kullan" + +msgid "don't strip whitespace from the patch" +msgstr "yamadan boÅŸlukları çıkarma" + msgid "git prune [-n] [-v] [--progress] [--expire <time>] [--] [<head>...]" msgstr "" "git prune [-n] [-v] [--progress] [--expire <zaman>] [--] [<dal-ucu>...]" @@ -9484,9 +9536,8 @@ msgstr "" msgid "" "\n" -"To avoid automatically configuring upstream branches when their name\n" -"doesn't match the local branch, see option 'simple' of branch." -"autoSetupMerge\n" +"To avoid automatically configuring an upstream branch when its name\n" +"won't match the local branch, see option 'simple' of branch.autoSetupMerge\n" "in 'git help config'.\n" msgstr "" "\n" @@ -9643,6 +9694,13 @@ msgstr "İtme konumu: %s\n" msgid "failed to push some refs to '%s'" msgstr "bazı baÅŸvurular '%s' konumuna itilemedi" +msgid "" +"recursing into submodule with push.recurseSubmodules=only; using on-demand " +"instead" +msgstr "" +"altmodül içine push.recurseSubmodules=only ile özyineleniyor; yerine talep " +"başına kullanılıyor" + #, c-format msgid "invalid value for '%s'" msgstr "'%s' için geçersiz deÄŸer" @@ -9666,7 +9724,7 @@ msgid "force updates" msgstr "zorla güncelle" msgid "<refname>:<expect>" -msgstr "<baÅŸvuruadı>:<bekle>" +msgstr "<bÅŸvr-adı>:<bekle>" msgid "require old value of ref to be at this value" msgstr "baÅŸvurunun eski deÄŸerinin bu deÄŸerde olmasını gerektir" @@ -9779,13 +9837,14 @@ msgid "need two commit ranges" msgstr "iki iÅŸleme erimi gerekli" msgid "" -"git read-tree [(-m [--trivial] [--aggressive] | --reset | --prefix=<prefix>) " -"[-u | -i]] [--no-sparse-checkout] [--index-output=<file>] (--empty | <tree-" -"ish1> [<tree-ish2> [<tree-ish3>]])" +"git read-tree [(-m [--trivial] [--aggressive] | --reset | --" +"prefix=<prefix>)\n" +" [-u | -i]] [--index-output=<file>] [--no-sparse-checkout]\n" +" (--empty | <tree-ish1> [<tree-ish2> [<tree-ish3>]])" msgstr "" -"git read-tree [(-m [--trivial] [--aggressive] | --reset | --prefix=<önek>) [-" -"u | -i]] [--no-sparse-checkout] [--index-output=<dosya>] (--empty | " -"<aÄŸacımsı1> [<aÄŸacımsı2> [<aÄŸacımsı3>]])" +"git read-tree [(-m [--trivial] [--aggressive] | --reset | --prefix=<önek>)\n" +" [-u | -i]] [--index-output=<dosya>] [--no-sparse-checkout]\n" +" (--empty | <aÄŸacımsı1> [<aÄŸacımsı2> [<aÄŸacımsı3>]])" msgid "write resulting index to <file>" msgstr "ortaya çıkan indeksi <dosya>'ya yaz" @@ -9876,8 +9935,8 @@ msgid "%s requires the merge backend" msgstr "%s birleÅŸtirme arka ucunu gerektiriyor" #, c-format -msgid "could not get 'onto': '%s'" -msgstr "'onto' alınamadı: '%s'" +msgid "invalid onto: '%s'" +msgstr "üzerine geçersiz: '%s'" #, c-format msgid "invalid orig-head: '%s'" @@ -9928,8 +9987,8 @@ msgstr "ÅŸuraya geçilemedi: %s" #, c-format msgid "" -"unrecognized empty type '%s'; valid values are \"drop\", \"keep\", and \"ask" -"\"." +"unrecognized empty type '%s'; valid values are \"drop\", \"keep\", and " +"\"ask\"." msgstr "" "Tanımlanamayan boÅŸ tür '%s'; geçerli türler: \"drop\", \"keep\" ve \"ask\"." @@ -10186,8 +10245,8 @@ msgstr "böyle bir dal/iÅŸleme yok: '%s'" msgid "No such ref: %s" msgstr "Böyle bir baÅŸvuru yok: %s" -msgid "Could not resolve HEAD to a revision" -msgstr "HEAD bir revizyona çözülemedi" +msgid "Could not resolve HEAD to a commit" +msgstr "HEAD, bir iÅŸlemeye çözülemedi" #, c-format msgid "'%s': need exactly one merge base with branch" @@ -10849,6 +10908,10 @@ msgstr "geçici dosya '%s', yazma için açılamadı" msgid "could not close refs snapshot tempfile" msgstr "baÅŸvurular anlık görüntü geçici dosyası kapatılamadı" +#, c-format +msgid "could not remove stale bitmap: %s" +msgstr "eskimiÅŸ biteÅŸlem kaldırılamadı: %s" + msgid "pack everything in a single pack" msgstr "her ÅŸeyi tek bir pakete sığdır" @@ -10921,6 +10984,9 @@ msgstr "<N> faktörlü bir geometrik ilerleme bul" msgid "write a multi-pack index of the resulting packs" msgstr "ortaya çıkan paketlerin bir çoklu paket indeksini yaz" +msgid "pack prefix to store a pack containing pruned objects" +msgstr "budanan nesneler içeren paketi depolamak için paket öneki" + msgid "cannot delete packs in a precious-objects repo" msgstr "bir precious-objects deposundaki paketler silinemiyor" @@ -10932,8 +10998,12 @@ msgid "pack prefix %s does not begin with objdir %s" msgstr "paket öneki %s, nesne dizini %s ile baÅŸlamıyor" #, c-format -msgid "missing required file: %s" -msgstr "gereken dosya eksik: %s" +msgid "renaming pack to '%s' failed" +msgstr "paketi '%s' olarak yeniden adlandırma baÅŸarısız" + +#, c-format +msgid "pack-objects did not write a '%s' file for pack %s-%s" +msgstr "pack-objects, ÅŸu paket için bir '%s' dosyası yazmadı: %s-%s" #, c-format msgid "could not unlink: %s" @@ -11127,8 +11197,10 @@ msgstr "--convert-graft-file argüman almaz" msgid "only one pattern can be given with -l" msgstr "-l ile yalnızca bir dizgi verilebilir" -msgid "git rerere [clear | forget <path>... | status | remaining | diff | gc]" -msgstr "git rerere [clear | forget <yol>... | status | remaining | diff | gc]" +msgid "" +"git rerere [clear | forget <pathspec>... | diff | status | remaining | gc]" +msgstr "" +"git rerere [clear | forget <yol-blrtç>... | diff | status | remaining | gc]" msgid "register clean resolutions in index" msgstr "indeksteki temiz çözümlerin kaydını yap" @@ -11333,6 +11405,15 @@ msgstr "--prefix bir argüman gerektiriyor" msgid "unknown mode for --abbrev-ref: %s" msgstr "--abbrev-ref için bilinmeyen kip: %s" +msgid "--exclude-hidden cannot be used together with --branches" +msgstr "--exclude-hidden, --branches ile birlikte kullanılamıyor" + +msgid "--exclude-hidden cannot be used together with --tags" +msgstr "--exclude-hidden, --tags ile birlikte kullanılamıyor" + +msgid "--exclude-hidden cannot be used together with --remotes" +msgstr "--exclude-hidden, --remotes ile birlikte kullanılamıyor" + msgid "this operation must be run in a work tree" msgstr "bu iÅŸlem bir çalışma aÄŸacı içinde çalıştırılmalı" @@ -11340,17 +11421,25 @@ msgstr "bu iÅŸlem bir çalışma aÄŸacı içinde çalıştırılmalı" msgid "unknown mode for --show-object-format: %s" msgstr "--show-object-format için bilinmeyen kip: %s" -msgid "git revert [<options>] <commit-ish>..." -msgstr "git revert [<seçenekler>] <iÅŸlememsi>..." +msgid "" +"git revert [--[no-]edit] [-n] [-m <parent-number>] [-s] [-S[<keyid>]] " +"<commit>..." +msgstr "" +"git revert [--[no-]edit] [-n] [-m <üst-öge-numarası>] [-s] [-S[<anahtar-" +"kimliÄŸi>]] <iÅŸleme>..." -msgid "git revert <subcommand>" -msgstr "git revert <altkomut>" +msgid "git revert (--continue | --skip | --abort | --quit)" +msgstr "git revert (--continue | --skip | --abort | --quit)" -msgid "git cherry-pick [<options>] <commit-ish>..." -msgstr "git cherry-pick [<seçenekler>] <iÅŸlememsi>..." +msgid "" +"git cherry-pick [--edit] [-n] [-m <parent-number>] [-s] [-x] [--ff]\n" +" [-S[<keyid>]] <commit>..." +msgstr "" +"git cherry-pick [--edit] [-n] [-m <üst-öge-numarası>] [-s] [-x] [--ff]\n" +" [-S[<anahtar-kimliÄŸi>]] <iÅŸleme>..." -msgid "git cherry-pick <subcommand>" -msgstr "git cherry-pick <altkomut>" +msgid "git cherry-pick (--continue | --skip | --abort | --quit)" +msgstr "git cherry-pick (--continue | --skip | --abort | --quit)" #, c-format msgid "option `%s' expects a number greater than zero" @@ -11411,8 +11500,14 @@ msgstr "geri al baÅŸarısız" msgid "cherry-pick failed" msgstr "seç-al baÅŸarısız" -msgid "git rm [<options>] [--] <file>..." -msgstr "git rm [<seçenekler>] [--] <dosya>..." +msgid "" +"git rm [-f | --force] [-n] [-r] [--cached] [--ignore-unmatch]\n" +" [--quiet] [--pathspec-from-file=<file> [--pathspec-file-nul]]\n" +" [--] [<pathspec>...]" +msgstr "" +"git rm [-f | --force] [-n] [-r] [--cached] [--ignore-unmatch]\n" +" [--quiet] [--pathspec-from-file=<dosya> [--pathspec-file-nul]]\n" +" [--] [<yol-blrtç>...]" msgid "" "the following file has staged content different from both the\n" @@ -11486,12 +11581,14 @@ msgid "" "git send-pack [--mirror] [--dry-run] [--force]\n" " [--receive-pack=<git-receive-pack>]\n" " [--verbose] [--thin] [--atomic]\n" +" [--[no-]signed | --signed=(true|false|if-asked)]\n" " [<host>:]<directory> (--all | <ref>...)" msgstr "" "git send-pack [--mirror] [--dry-run] [--force]\n" -" [--receive-pack=<git-receive-pack>]\n" +" [--receive-pack=<git-paket-al>]\n" " [--verbose] [--thin] [--atomic]\n" -" [<makine>:]<dizin> (--all | <baÅŸvurular>...)" +" [--[no-]signed | --signed=(true|false|if-asked)]\n" +" [<makine>:]<dizin> (--all | <baÅŸvuru>...)" msgid "remote name" msgstr "uzak konum adı" @@ -11514,8 +11611,9 @@ msgstr "git log --pretty=short | git shortlog [<seçenekler>]" msgid "using multiple --group options with stdin is not supported" msgstr "stdin ile çoklu --group seçenekleri kullanımı desteklenmiyor" -msgid "using --group=trailer with stdin is not supported" -msgstr "stdin ile --group=trailer kullanımı desteklenmiyor" +#, c-format +msgid "using %s with stdin is not supported" +msgstr "stdin ile %s kullanma desteklenmiyor" #, c-format msgid "unknown group type: %s" @@ -11546,18 +11644,20 @@ msgid "group by field" msgstr "alan ile grupla" msgid "too many arguments given outside repository" -msgstr "depo dışında çok fazla argüman verildi" +msgstr "depo dışında pek fazla argüman verildi" msgid "" "git show-branch [-a | --all] [-r | --remotes] [--topo-order | --date-order]\n" " [--current] [--color[=<when>] | --no-color] [--sparse]\n" " [--more=<n> | --list | --independent | --merge-base]\n" -" [--no-name | --sha1-name] [--topics] [(<rev> | <glob>)...]" +" [--no-name | --sha1-name] [--topics]\n" +" [(<rev> | <glob>)...]" msgstr "" "git show-branch [-a | --all] [-r | --remotes] [--topo-order | --date-order]\n" -" [--current] [--color[=<nezaman>] | --no-color] [--sparse]\n" +" [--current] [--color[=<ne-zaman>] | --no-color] [--sparse]\n" " [--more=<n> | --list | --independent | --merge-base]\n" -" [--no-name | --sha1-name] [--topics] [(<bÅŸvr> | <glob>)...]" +" [--no-name | --sha1-name] [--topics]\n" +" [(<rev> | <glob>)...]" msgid "git show-branch (-g | --reflog)[=<n>[,<base>]] [--list] [<ref>]" msgstr "git show-branch (-g | --reflog)[=<n>[,<temel>]] [--list] [<baÅŸvuru>]" @@ -11657,11 +11757,13 @@ msgid "Unknown hash algorithm" msgstr "bilinmeyen saÄŸlama algoritması '%s'" msgid "" -"git show-ref [-q | --quiet] [--verify] [--head] [-d | --dereference] [-s | --" -"hash[=<n>]] [--abbrev[=<n>]] [--tags] [--heads] [--] [<pattern>...]" +"git show-ref [-q | --quiet] [--verify] [--head] [-d | --dereference]\n" +" [-s | --hash[=<n>]] [--abbrev[=<n>]] [--tags]\n" +" [--heads] [--] [<pattern>...]" msgstr "" -"git show-ref [-q | --quiet] [--verify] [--head] [-d | --dereference] [-s | --" -"hash[=<n>]] [--abbrev[=<n>]] [--tags] [--heads] [--] [<dizgi>...]" +"git show-ref [-q | --quiet] [--verify] [--head] [-d | --dereference]\n" +" [-s | --hash[=<n>]] [--abbrev[=<n>]] [--tags]\n" +" [--heads] [--] [<dizgi>...]" msgid "git show-ref --exclude-existing[=<pattern>]" msgstr "git show-ref --exclude-existing[=<dizgi>]" @@ -11690,8 +11792,10 @@ msgstr "sonuçları stdout'a yazdırma (--verify ile birlikte kullanışlı)" msgid "show refs from stdin that aren't in local repository" msgstr "stdin'den yerel bir depoda olmayan baÅŸvuruları göster" -msgid "git sparse-checkout (init|list|set|add|reapply|disable) <options>" -msgstr "git sparse-checkout (init|list|set|add|reapply|disable) <seçenekler>" +msgid "" +"git sparse-checkout (init | list | set | add | reapply | disable) [<options>]" +msgstr "" +"git sparse-checkout (init | list | set | add | reapply | disable) [<sçnklr>]" msgid "this worktree is not sparse" msgstr "bu çalışma aÄŸacı aralıklı deÄŸil" @@ -11813,67 +11917,56 @@ msgstr "" msgid "error while refreshing working directory" msgstr "çalışma dizini yenilenirken hata" -msgid "git stash list [<options>]" -msgstr "git stash list [<seçenekler>]" +msgid "git stash list [<log-options>]" +msgstr "git stash list [<günlük-seçenekleri>]" -msgid "git stash show [<options>] [<stash>]" -msgstr "git stash show [<seçenekler>] [<zula>]" +msgid "" +"git stash show [-u | --include-untracked | --only-untracked] [<diff-" +"options>] [<stash>]" +msgstr "" +"git stash show [-u | --include-untracked | --only-untracked] [<diff-" +"seçenekleri>] [<zula>]" + +msgid "git stash drop [-q | --quiet] [<stash>]" +msgstr "git stash drop [-q | --quiet] [<zula>]" -msgid "git stash drop [-q|--quiet] [<stash>]" -msgstr "git stash drop [-q|--quiet] [<zula>]" +msgid "git stash pop [--index] [-q | --quiet] [<stash>]" +msgstr "git stash pop [--index] [-q | --quiet] [<zula>]" -msgid "git stash ( pop | apply ) [--index] [-q|--quiet] [<stash>]" -msgstr "git stash ( pop | apply ) [--index] [-q|--quiet] [<zula>]" +msgid "git stash apply [--index] [-q | --quiet] [<stash>]" +msgstr "git stash apply [--index] [-q | --quiet] [<zula>]" msgid "git stash branch <branchname> [<stash>]" msgstr "git stash branch <dal-adı> [<zula>]" +msgid "git stash store [(-m | --message) <message>] [-q | --quiet] <commit>" +msgstr "git stash store [(-m | --message) <ileti>] [-q | --quiet] <iÅŸleme>" + msgid "" -"git stash [push [-p|--patch] [-S|--staged] [-k|--[no-]keep-index] [-q|--" -"quiet]\n" -" [-u|--include-untracked] [-a|--all] [-m|--message <message>]\n" +"git stash [push [-p | --patch] [-S | --staged] [-k | --[no-]keep-index] [-q " +"| --quiet]\n" +" [-u | --include-untracked] [-a | --all] [(-m | --message) " +"<message>]\n" " [--pathspec-from-file=<file> [--pathspec-file-nul]]\n" " [--] [<pathspec>...]]" msgstr "" -"git stash [push [-p|--patch] [-S|--staged] [-k|--[no-]keep-index] [-q|--" -"quiet]\n" -" [-u|--include-untracked] [-a|--all] [-m|--message <ileti>]\n" -" [--pathspec-from-file=<dosya> [--pathspec-file-nul]]\n" +"git stash [push [-p | --patch] [-S | --staged] [-k | --[no-]keep-index] [-q\n" +" | --quiet] [-u | --include-untracked] [-a | --all] [(-m | --" +"message)\n" +" <ileti>] [--pathspec-from-file=<dosya> [--pathspec-file-nul]]\n" " [--] [<yol-blrtç>...]]" msgid "" -"git stash save [-p|--patch] [-S|--staged] [-k|--[no-]keep-index] [-q|--" -"quiet]\n" -" [-u|--include-untracked] [-a|--all] [<message>]" +"git stash save [-p | --patch] [-S | --staged] [-k | --[no-]keep-index] [-q | " +"--quiet]\n" +" [-u | --include-untracked] [-a | --all] [<message>]" msgstr "" -"git stash save [-p|--patch] [-S|--staged] [-k|--[no-]keep-index] [-q|--" -"quiet]\n" -" [-u|--include-untracked] [-a|--all] [<ileti>]" - -msgid "git stash pop [--index] [-q|--quiet] [<stash>]" -msgstr "git stash pop [--index] [-q|--quiet] [<zula>]" - -msgid "git stash apply [--index] [-q|--quiet] [<stash>]" -msgstr "git stash apply [--index] [-q|--quiet] [<zula>]" +"git stash save [-p | --patch] [-S | --staged] [-k | --[no-]keep-index] [-q " +"|\n" +" --quiet] [-u | --include-untracked] [-a | --all] [<ileti>]" -msgid "git stash store [-m|--message <message>] [-q|--quiet] <commit>" -msgstr "git stash store [-m|--message <ileti>] [-q|--quiet] <iÅŸleme>" - -msgid "" -"git stash [push [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]\n" -" [-u|--include-untracked] [-a|--all] [-m|--message <message>]\n" -" [--] [<pathspec>...]]" -msgstr "" -"git stash [push [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]\n" -" [-u|--include-untracked] [-a|--all] [-m|--message <ileti>]\n" -" [--] [<yol-blrtç>...]]" - -msgid "" -"git stash save [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]\n" -" [-u|--include-untracked] [-a|--all] [<message>]" -msgstr "" -"git stash save [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]\n" -" [-u|--include-untracked] [-a|--all] [<ileti>]" +msgid "git stash create [<message>]" +msgstr "git stash create [<ileti>]" #, c-format msgid "'%s' is not a stash-like commit" @@ -12359,7 +12452,7 @@ msgstr "Åžu altmodül yolunda '%s' birleÅŸtirilemedi: '%s'" #, c-format msgid "Execution of '%s %s' failed in submodule path '%s'" -msgstr "Åžu altmodül yolunda '%s %s' çalıştırılamadı: '%s'" +msgstr "Åžu altmodül yolunda '%s %s' yürütülemedi: '%s'" #, c-format msgid "Submodule path '%s': checked out '%s'\n" @@ -12434,9 +12527,6 @@ msgstr "altmodülleri özyineli basamaklandır" msgid "don't fetch new objects from the remote site" msgstr "yeni nesneleri uzak konumdan getirme" -msgid "path into the working tree" -msgstr "çalışma aÄŸacına giden yol" - msgid "use the 'checkout' update strategy (default)" msgstr "'checkout' güncelleme stratejisini kullan (öntanımlı)" @@ -12472,27 +12562,9 @@ msgstr "" "shallow] [--reference <depo>] [--recursive] [--[no-]single-branch] [--] " "[<yol>...]" -msgid "recurse into submodules" -msgstr "altmodüllere özyinele" - msgid "git submodule absorbgitdirs [<options>] [<path>...]" msgstr "git submodule absorbgitdirs [<seçenekler>] [<yol>...]" -msgid "check if it is safe to write to the .gitmodules file" -msgstr ".gitmodules dosyasına yazım güvenli mi deÄŸil mi denetle" - -msgid "unset the config in the .gitmodules file" -msgstr ".gitmodules dosyasındaki yapılandırmayı kaldır" - -msgid "git submodule--helper config <name> [<value>]" -msgstr "git submodule--helper config <ad> [<deÄŸer>]" - -msgid "git submodule--helper config --unset <name>" -msgstr "git submodule--helper config --unset <ad>" - -msgid "please make sure that the .gitmodules file is in the working tree" -msgstr ".gitmodules dosyasının çalışma aÄŸacında olduÄŸundan lütfen emin ol" - msgid "suppress output for setting url of a submodule" msgstr "bir altmodül url ayarlanması çıktısını gizle" @@ -12570,6 +12642,9 @@ msgstr "'%s' altmodülü için yerel git dizini yeniden etkinleÅŸtiriliyor\n" msgid "unable to checkout submodule '%s'" msgstr "'%s' altmodülü çıkış yapılamıyor" +msgid "please make sure that the .gitmodules file is in the working tree" +msgstr ".gitmodules dosyasının çalışma aÄŸacında olduÄŸundan lütfen emin ol" + #, c-format msgid "Failed to add submodule '%s'" msgstr "'%s' altmodülü eklenemedi" @@ -12620,19 +12695,21 @@ msgstr "depo URL'si: '%s' mutlak olmalı veya ./|../ ile baÅŸlamalıdır" msgid "'%s' is not a valid submodule name" msgstr "'%s' geçerli bir altmodül adı deÄŸil" +msgid "git submodule--helper <command>" +msgstr "git submodule--helper <komut>" + #, c-format msgid "%s doesn't support --super-prefix" msgstr "%s, --super-prefix desteklemiyor" -#, c-format -msgid "'%s' is not a valid submodule--helper subcommand" -msgstr "'%s' geçerli bir submodule--helper altkomutu deÄŸil" +msgid "git symbolic-ref [-m <reason>] <name> <ref>" +msgstr "git symbolic-ref [-m <neden>] <ad> <baÅŸvuru>" -msgid "git symbolic-ref [<options>] <name> [<ref>]" -msgstr "git symbolic-ref [<seçenekler>] <ad> [<baÅŸvuru>]" +msgid "git symbolic-ref [-q] [--short] [--no-recurse] <name>" +msgstr "git symbolic-ref [-q] [--short] [--no-recurse] <ad>" -msgid "git symbolic-ref -d [-q] <name>" -msgstr "git symbolic-ref -d [-q] <ad>" +msgid "git symbolic-ref --delete [-q] <name>" +msgstr "git symbolic-ref --delete [-q] <ad>" msgid "suppress error message for non-symbolic (detached) refs" msgstr "sembolik olmayan (ayrık) baÅŸvurular için hata iletisini gizle" @@ -12643,6 +12720,9 @@ msgstr "sembolik baÅŸvuruyu sil" msgid "shorten ref output" msgstr "baÅŸvuru çıktısını kısalt" +msgid "recursively dereference (default)" +msgstr "baÅŸvuruyu özyineli olarak kaldır (öntanımlı)" + msgid "reason" msgstr "neden" @@ -12650,24 +12730,26 @@ msgid "reason of the update" msgstr "güncelleme nedeni" msgid "" -"git tag [-a | -s | -u <key-id>] [-f] [-m <msg> | -F <file>]\n" -" <tagname> [<head>]" +"git tag [-a | -s | -u <key-id>] [-f] [-m <msg> | -F <file>] [-e]\n" +" <tagname> [<commit> | <object>]" msgstr "" -"git tag [-a | -s | -u <anahtar-kimliÄŸi>] [-f] [-m <ileti> | -F <dosya>]\n" -" <etiket-adı> [<head>]" +"git tag [-a | -s | -u <anahtar-kimliÄŸi>] [-f] [-m <ileti> | -F <dosya>] [-" +"e]\n" +" <etiket-adı> [<iÅŸleme> | <nesne>]" msgid "git tag -d <tagname>..." msgstr "git tag -d <etiket-adı>..." msgid "" -"git tag -l [-n[<num>]] [--contains <commit>] [--no-contains <commit>] [--" -"points-at <object>]\n" -" [--format=<format>] [--merged <commit>] [--no-merged <commit>] " -"[<pattern>...]" +"git tag [-n[<num>]] -l [--contains <commit>] [--no-contains <commit>]\n" +" [--points-at <object>] [--column[=<options>] | --no-column]\n" +" [--create-reflog] [--sort=<key>] [--format=<format>]\n" +" [--merged <commit>] [--no-merged <commit>] [<pattern>...]" msgstr "" -"git tag -l [-n[<sayı>]] [--contains <iÅŸleme>] [--no-contains <iÅŸleme>]\n" -" [-- points-at <nesne>] [--format=<biçim>] [--merged <iÅŸleme>]\n" -" [--no-merged <iÅŸleme>] [<dizgi>...]" +"git tag [-n[<sayı>]] -l [--contains <iÅŸleme>] [--no-contains <iÅŸleme>]\n" +" [--points-at <nesne>] [--column[=<seçenekler>] | --no-column]\n" +" [--create-reflog] [--sort=<anahtar>] [--format=<biçim>]\n" +" [--merged <iÅŸleme>] [--no-merged <iÅŸleme>] [<dizgi>...]" msgid "git tag -v [--format=<format>] <tagname>..." msgstr "git tag -v [--format=<biçim>] <etiket-adı>..." @@ -13043,8 +13125,12 @@ msgstr "güncellemeleri stdin'den oku" msgid "update the info files from scratch" msgstr "bilgi dosyalarını en baÅŸtan güncelle" -msgid "git upload-pack [<options>] <dir>" -msgstr "git upload-pack [<seçenekler>] <dizin>" +msgid "" +"git-upload-pack [--[no-]strict] [--timeout=<n>] [--stateless-rpc]\n" +" [--advertise-refs] <directory>" +msgstr "" +"git-upload-pack [--[no-]strict] [--timeout=<n>] [--stateless-rpc]\n" +" [--advertise-refs] <dizin>" msgid "quit after a single request/response exchange" msgstr "tek bir istek/yanıt deÄŸiÅŸ tokuÅŸundan sonra çık" @@ -13058,8 +13144,8 @@ msgstr "eÄŸer <dizin> bir Git dizini deÄŸilse <dizin>/.git/ deneme" msgid "interrupt transfer after <n> seconds of inactivity" msgstr "aktarımı <n> saniye hareketsizlikten sonra kes" -msgid "git verify-commit [-v | --verbose] <commit>..." -msgstr "git verify-commit [-v | --verbose] <iÅŸleme>..." +msgid "git verify-commit [-v | --verbose] [--raw] <commit>..." +msgstr "git verify-commit [-v | --verbose] [--raw] <iÅŸleme>..." msgid "print commit contents" msgstr "iÅŸleme içeriÄŸini yazdır" @@ -13067,8 +13153,9 @@ msgstr "iÅŸleme içeriÄŸini yazdır" msgid "print raw gpg status output" msgstr "ham gpg durum çıktısını yazdır" -msgid "git verify-pack [-v | --verbose] [-s | --stat-only] <pack>..." -msgstr "git verify-pack [-v | --verbose] [-s | --stat-only] <paket>..." +msgid "git verify-pack [-v | --verbose] [-s | --stat-only] [--] <pack>.idx..." +msgstr "" +"git verify-pack [-v | --verbose] [-s | --stat-only] [--] <paket>.idx..." msgid "verbose" msgstr "ayrıntılı anlatım" @@ -13076,35 +13163,39 @@ msgstr "ayrıntılı anlatım" msgid "show statistics only" msgstr "yalnızca istatistikleri göster" -msgid "git verify-tag [-v | --verbose] [--format=<format>] <tag>..." -msgstr "git verify-tag [-v | --verbose] [--format=<biçim>] <etiket>..." +msgid "git verify-tag [-v | --verbose] [--format=<format>] [--raw] <tag>..." +msgstr "git verify-tag [-v | --verbose] [--format=<biçim>] [--raw] <etiket>..." msgid "print tag contents" msgstr "etiket içeriÄŸini yazdır" -msgid "git worktree add [<options>] <path> [<commit-ish>]" -msgstr "git worktree add [<seçenekler>] <yol> [<iÅŸlememsi>]" +msgid "" +"git worktree add [-f] [--detach] [--checkout] [--lock [--reason <string>]]\n" +" [-b <new-branch>] <path> [<commit-ish>]" +msgstr "" +"git worktree add [-f] [--detach] [--checkout] [--lock [--reason <dizi>]]\n" +" [-b <yeni-dal>] <yol> [<iÅŸlememsi>]" -msgid "git worktree list [<options>]" -msgstr "git worktree list [<seçenekler>]" +msgid "git worktree list [-v | --porcelain [-z]]" +msgstr "git worktree list [-v | --porcelain [-z]]" -msgid "git worktree lock [<options>] <path>" -msgstr "git worktree lock [<seçenekler>] <yol>" +msgid "git worktree lock [--reason <string>] <worktree>" +msgstr "git worktree lock [--reason <dizi>] <çalışma-aÄŸacı>" msgid "git worktree move <worktree> <new-path>" msgstr "git worktree move <ç-aÄŸacı> <yeni-yol>" -msgid "git worktree prune [<options>]" -msgstr "git worktree prune [<seçenekler>]" +msgid "git worktree prune [-n] [-v] [--expire <expire>]" +msgstr "git worktree prune [-n] [-v] [--expire <süre-dolum>]" -msgid "git worktree remove [<options>] <worktree>" -msgstr "git worktree remove [<seçenekler>] <ç-aÄŸacı>" +msgid "git worktree remove [-f] <worktree>" +msgstr "git worktree remove [-f] <çalışma-aÄŸacı>" msgid "git worktree repair [<path>...]" msgstr "git worktree repair [<yol>...]" -msgid "git worktree unlock <path>" -msgstr "git worktree unlock <yol>" +msgid "git worktree unlock <worktree>" +msgstr "git worktree unlock <çalışma-aÄŸacı>" #, c-format msgid "Removing %s/%s: %s" @@ -13334,6 +13425,10 @@ msgstr "yalnızca hata ayıklama için yararlı" msgid "core.fsyncMethod = batch is unsupported on this platform" msgstr "core.fsyncMethod = batch, bu platformda desteklenmiyor" +#, c-format +msgid "bundle list at '%s' has no mode" +msgstr "'%s' konumundaki demet listesinin kipi yok" + msgid "failed to create temporary file" msgstr "geçici dosya oluÅŸturulamadı" @@ -13341,16 +13436,29 @@ msgid "insufficient capabilities" msgstr "yetersiz yetenekler" #, c-format +msgid "unrecognized bundle mode from URI '%s'" +msgstr "'%s' URI'sinden tanımlanamayan demet kipi" + +#, c-format +msgid "exceeded bundle URI recursion limit (%d)" +msgstr "demet URI özyineleme sınırı aşıldı (%d)" + +#, c-format msgid "failed to download bundle from URI '%s'" msgstr "'%s' URI'sinden demet indirilemedi" #, c-format -msgid "file at URI '%s' is not a bundle" -msgstr "'%s' URI'sindeki dosya bir demet deÄŸil" +msgid "file at URI '%s' is not a bundle or bundle list" +msgstr "'%s' URI'sindeki dosya bir demet veya demet listesi deÄŸil" -#, c-format -msgid "failed to unbundle bundle from URI '%s'" -msgstr "'%s' URI'sindeki demet çözülemedi" +msgid "bundle-uri: got an empty line" +msgstr "bundle-uri: boÅŸ bir satır alındı" + +msgid "bundle-uri: line is not of the form 'key=value'" +msgstr "bundle-uri: satır, 'anahtar=deÄŸer' olarak biçimlenmemiÅŸ" + +msgid "bundle-uri: line has empty key or value" +msgstr "bundle-uri: satırda boÅŸ anahtar veya deÄŸer var" #, c-format msgid "unrecognized bundle hash algorithm: %s" @@ -13920,8 +14028,8 @@ msgstr "Demet dosya biçimi" msgid "Chunk-based file formats" msgstr "geçersiz gitfile biçimi: %s" -msgid "Git commit graph format" -msgstr "Git iÅŸleme grafiÄŸi biçimi" +msgid "Git commit-graph format" +msgstr "Git commit-graph biçimi" msgid "Git index format" msgstr "Git indeks biçimi" @@ -14115,7 +14223,7 @@ msgstr "" "bir commit-graph yazılmaya çalışılıyor; ancak 'core.commitGraph' devre dışı" msgid "too many commits to write graph" -msgstr "grafik yazımı için çok fazla iÅŸleme" +msgstr "grafik yazımı için pek fazla iÅŸleme" msgid "the commit-graph file has incorrect checksum and is likely corrupt" msgstr "" @@ -14269,6 +14377,10 @@ msgstr "'has_worktree_moved' içinde iÅŸlenmemiÅŸ senaryo: %d" msgid "health thread wait failed [GLE %ld]" msgstr "saÄŸlık iÅŸ parçacığı bekleme baÅŸarısız oldu [GLE %ld]" +#, c-format +msgid "Invalid path: %s" +msgstr "Geçersiz yol %s" + msgid "Unable to create FSEventStream." msgstr "FSEventStream oluÅŸturulamadı." @@ -14300,6 +14412,22 @@ msgid "could not read directory changes [GLE %ld]" msgstr "dizin deÄŸiÅŸiklikleri okunamadı [GLE %ld]" #, c-format +msgid "opendir('%s') failed" +msgstr "opendir('%s') baÅŸarısız oldu" + +#, c-format +msgid "lstat('%s') failed" +msgstr "lstat('%s') baÅŸarısız oldu" + +#, c-format +msgid "strbuf_readlink('%s') failed" +msgstr "strbuf_readlink('%s') baÅŸarısız oldu" + +#, c-format +msgid "closedir('%s') failed" +msgstr "closedir('%s') baÅŸarısız oldu" + +#, c-format msgid "[GLE %ld] unable to open for read '%ls'" msgstr "[GLE %ld] '%ls', okuma için açılamıyor" @@ -14484,7 +14612,7 @@ msgstr "%s içinde düzmece sayım" #, c-format msgid "too many entries in %s" -msgstr "%s içinde çok fazla girdi" +msgstr "%s içinde pek fazla girdi" #, c-format msgid "missing config key %s" @@ -14768,7 +14896,7 @@ msgid "protocol '%s' is not supported" msgstr "'%s' protokolü desteklenmiyor" msgid "unable to set SO_KEEPALIVE on socket" -msgstr "soket üzerinde SO_KEEPALIVE ayarlanamıyor" +msgstr "yuva üzerinde SO_KEEPALIVE ayarlanamıyor" #, c-format msgid "Looking up %s ... " @@ -15049,7 +15177,7 @@ msgstr "'%s' için delta adası düzenli ifadesi yüklenemedi: %s" #, c-format msgid "island regex from config has too many capture groups (max=%d)" msgstr "" -"yapılandırmanın delta adası düzenli ifadesinde çok fazla yakalama grubu var " +"yapılandırmanın delta adası düzenli ifadesinde pek fazla yakalama grubu var " "(en çok %d)" #, c-format @@ -15504,7 +15632,7 @@ msgid "disable all output of the program" msgstr "tüm program çıktısını devre dışı bırak" msgid "allow an external diff helper to be executed" -msgstr "bir dış diff yardımcısının çalıştırılmasına izin ver" +msgstr "bir dış diff yardımcısının yürütülmesine izin ver" msgid "run external text conversion filters when comparing binary files" msgstr "" @@ -15581,7 +15709,7 @@ msgstr "belirli bir dosyaya çıktıla" msgid "exhaustive rename detection was skipped due to too many files." msgstr "" -"GeniÅŸ kapsamlı yeniden adlandırma algılaması çok fazla dosya olmasından " +"GeniÅŸ kapsamlı yeniden adlandırma algılaması pek fazla dosya olmasından " "dolayı atlandı." msgid "only found copies from modified paths due to too many files." @@ -15672,7 +15800,7 @@ msgstr "hatalı git ad alanı yolu \"%s\"" #, c-format msgid "too many args to run %s" -msgstr "%s çalıştırmak için çok fazla argüman" +msgstr "%s çalıştırmak için pek fazla argüman" msgid "git fetch-pack: expected shallow list" msgstr "git fetch-pack: sığ bir liste bekleniyordu" @@ -15902,9 +16030,10 @@ msgstr "sanal depo '%s', fsmonitor ile uyumsuz" #, c-format msgid "" -"repository '%s' is incompatible with fsmonitor due to lack of Unix sockets" +"socket directory '%s' is incompatible with fsmonitor due to lack of Unix " +"sockets support" msgstr "" -"Unix soketleri eksik olduÄŸundan dolayı; '%s' deposu, fsmonitor ile uyumsuz" +"yuva dizini '%s', Unix yuva dasteÄŸi olmadığından dolayı fsmonitor ile uyumsuz" msgid "" "git [-v | --version] [-h | --help] [-C <path>] [-c <name>=<value>]\n" @@ -16189,7 +16318,7 @@ msgid "" "able to execute it. Maybe git-%s is broken?" msgstr "" "'%s' bir git komutu gibi görünüyor; ancak biz onu\n" -"çalıştıramadık. git-%s bozuk olabilir mi?" +"yürütemedik. git-%s bozuk olabilir mi?" #, c-format msgid "git: '%s' is not a git command. See 'git --help'." @@ -16228,8 +16357,8 @@ msgstr[1] "" "\n" "Buna en yakın komutlar:" -msgid "git version [<options>]" -msgstr "git version [<seçenekler>]" +msgid "git version [--build-options]" +msgstr "git version [--build-options]" #, c-format msgid "%s: %s - %s" @@ -16253,7 +16382,7 @@ msgid "" "The '%s' hook was ignored because it's not set as executable.\n" "You can disable this warning with `git config advice.ignoredHook false`." msgstr "" -"'%s' kancası yok sayıldı; çünkü bir çalıştırılabilir olarak ayarlanmamış.\n" +"'%s' kancası yok sayıldı; çünkü bir yürütülebilir olarak ayarlanmamış.\n" "Bu uyarıyı 'git config advice.ignoredHook false' ile kapatabilirsiniz." #, c-format @@ -16479,7 +16608,7 @@ msgstr "" "%s" msgid "Failed to execute internal merge" -msgstr "İç birleÅŸtirme çalıştırılamadı" +msgstr "İç birleÅŸtirme yürütülemedi" #, c-format msgid "Unable to add %s to database" @@ -16833,8 +16962,8 @@ msgstr "" #, c-format msgid "" -"CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s" -"\"->\"%s\" in \"%s\"%s" +"CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename " +"\"%s\"->\"%s\" in \"%s\"%s" msgstr "" "ÇAKIÅžMA (y. adlandır/y. adlandır): \"%s\"->\"%s\" olarak adlandır (\"%s\" " "dalında), \"%s\"->\"%s\" olarak adlandır (\"%s\"%s içinde)" @@ -16845,8 +16974,8 @@ msgstr " (çözülmeden bırakıldı)" #, c-format msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s" msgstr "" -"ÇAKIÅžMA (y. adlandır/y. adlandır): %s->%s olarak adlandır (%s içinde). %s->" -"%s olarak adlandır (%s içinde)" +"ÇAKIÅžMA (y. adlandır/y. adlandır): %s->%s olarak adlandır (%s içinde). %s-" +">%s olarak adlandır (%s içinde)" #, c-format msgid "" @@ -17148,10 +17277,6 @@ msgstr "alternatif nesne yolu olaÄŸanlaÅŸtırılamıyor: %s" msgid "%s: ignoring alternate object stores, nesting too deep" msgstr "%s: alternatif nesne depoları yok sayılıyor, iç içe geçme pek derin" -#, c-format -msgid "unable to normalize object directory: %s" -msgstr "nesne dizini olaÄŸanlaÅŸtırılamıyor: %s" - msgid "unable to fdopen alternates lockfile" msgstr "alternatifler kilit dosyası fdopen yapılamıyor" @@ -17974,6 +18099,10 @@ msgstr "promisor-remote: alt sürecine getirmek için stdin kapatılamıyor" msgid "promisor remote name cannot begin with '/': %s" msgstr "vaatçi uzak konum adı '/' ile baÅŸlayamaz: %s" +#, c-format +msgid "could not fetch %s from promisor remote" +msgstr "vaatçi uzak konumundan %s getirilemedi" + msgid "object-info: expected flush after arguments" msgstr "object-info: argümanlardan sonra floÅŸ bekleniyordu" @@ -18225,7 +18354,7 @@ msgstr "" " bir yer tutucu izle. <baÅŸ>, yeniden temellendirmenin\n" " sonunda güncellenir\n" "\n" -"Bu satırlar yeniden sıralanabilirler, yukarıdan aÅŸağıya çalıştırılırlar.\n" +"Bu satırlar yeniden sıralanabilirler, yukarıdan aÅŸağıya yürütülürler.\n" #, c-format msgid "Rebase %s onto %s (%d command)" @@ -19038,6 +19167,13 @@ msgid "failed to find tree of %s" msgstr "%s ögesinin aÄŸacı bulunamadı" #, c-format +msgid "unsupported section for hidden refs: %s" +msgstr "gizli baÅŸvurular için desteklenmeyen bölüm: %s" + +msgid "--exclude-hidden= passed more than once" +msgstr "--exclude-hidden=, birden çok kez geçirildi" + +#, c-format msgid "resolve-undo records `%s` which is missing" msgstr "resolve-undo, kayıp olan '%s' ögesini kaydetmiÅŸ" @@ -19181,6 +19317,14 @@ msgid "--all or <enlistment>, but not both" msgstr "--all veya <gönüllükayıt>; ancak ikisi deÄŸil" #, c-format +msgid "could not remove stale scalar.repo '%s'" +msgstr "eskimiÅŸ scalar.repo '%s' kaldırılamadı" + +#, c-format +msgid "removing stale scalar.repo '%s'" +msgstr "eskimiÅŸ scalar.repo '%s' kaldırılıyor" + +#, c-format msgid "git repository gone in '%s'" msgstr "git deposu '%s' içinde gitti" @@ -19761,7 +19905,7 @@ msgstr "%.*s birleÅŸtirilemedi" #, c-format msgid "Executing: %s\n" -msgstr "Çalıştırılıyor: %s\n" +msgstr "Yürütülüyor: %s\n" #, c-format msgid "" @@ -19771,7 +19915,7 @@ msgid "" " git rebase --continue\n" "\n" msgstr "" -"Çalıştırma baÅŸarısız: %s\n" +"Yürütme baÅŸarısız: %s\n" "%sSorunu çözüp sürdürmek için ÅŸunu çalıştırın:\n" "\n" "\tgit rebase --continue\n" @@ -19789,7 +19933,7 @@ msgid "" " git rebase --continue\n" "\n" msgstr "" -"Çalıştırma baÅŸarılı oldu: %s,\n" +"Yürütme baÅŸarılı oldu: %s,\n" "ancak indeksinize ve/veya çalışma aÄŸacınıza deÄŸiÅŸiklikler bıraktı\n" "DeÄŸiÅŸikliklerinizi iÅŸleyin veya zulalayın, ardından ÅŸunu çalıştırın:\n" "\n" @@ -19800,16 +19944,16 @@ msgstr "" msgid "illegal label name: '%.*s'" msgstr "izin verilmeyen etiket adı: '%.*s'" +#, c-format +msgid "could not resolve '%s'" +msgstr "'%s' çözülemedi" + msgid "writing fake root commit" msgstr "sahte kök iÅŸlemesi yazılıyor" msgid "writing squash-onto" msgstr "squash-onto yazılıyor" -#, c-format -msgid "could not resolve '%s'" -msgstr "'%s' çözülemedi" - msgid "cannot merge without a current revision" msgstr "güncel bir revizyon olmadan birleÅŸtirilemiyor" @@ -19822,7 +19966,7 @@ msgid "nothing to merge: '%.*s'" msgstr "birleÅŸtirilecek bir ÅŸey yok: '%.*s'" msgid "octopus merge cannot be executed on top of a [new root]" -msgstr "ahtapot birleÅŸtirmesi bir [yeni kök]ün üzerinde çalıştırılamaz" +msgstr "ahtapot birleÅŸtirmesi bir [yeni kök]ün üzerinde yürütülemez" #, c-format msgid "could not get commit message of '%s'" @@ -19920,7 +20064,7 @@ msgid "" " git rebase --edit-todo\n" " git rebase --continue\n" msgstr "" -"todo komutu çalıştırılamadı.\n" +"todo komutu yürütülemedi.\n" "\n" "\t%.*s\n" "Yeniden zamanlandı; sürdürmeden önce komutu düzenlemek için lütfen\n" @@ -20405,6 +20549,15 @@ msgstr "ls-tree beklenmedik bir biçimde %d kodu ile çıktı" msgid "failed to lstat '%s'" msgstr "'%s', lstat yapılamadı" +msgid "test-tool cache-tree <options> (control|prime|update)" +msgstr "test-tool cache-tree <seçenekler> (control|prime|update)" + +msgid "clear the cache tree before each iteration" +msgstr "her bir yinelemeden önce önbellek aÄŸacını temizle" + +msgid "number of entries in the cache tree to invalidate (default 0)" +msgstr "önbellek aÄŸacındaki geçersizleÅŸtirilecek girdi sayısı (öntanımlı 0)" + msgid "unhandled options" msgstr "beklenmeyen seçenekler" @@ -20416,7 +20569,7 @@ msgid "commit %s is not marked reachable" msgstr "%s iÅŸlemesi ulaşılabilir olarak imlenmedi" msgid "too many commits marked reachable" -msgstr "çok fazla iÅŸleme ulaşılabilir olarak imlenmiÅŸ" +msgstr "pek fazla iÅŸleme ulaşılabilir olarak imlenmiÅŸ" msgid "test-tool serve-v2 [<options>]" msgstr "test-tool serve-v2 [<seçenekler>]" @@ -21175,8 +21328,8 @@ msgstr " (iÅŸlenecekleri güncellemek için \"git add/rm <dosya>...\" kullanın msgid "" " (use \"git restore <file>...\" to discard changes in working directory)" msgstr "" -" (çalışma dizinindeki deÄŸiÅŸiklikleri atmak için \"git restore <dosya>...\" " -"kullanın)" +" (çalışma dizinindeki deÄŸiÅŸiklikleri atmak için\n" +" \"git restore <dosya>...\" kullanın)" msgid " (commit or discard the untracked or modified content in submodules)" msgstr " (altmodüllerdeki izlenmeyen/deÄŸiÅŸtirilen içeriÄŸi gönder veya at)" @@ -21497,8 +21650,7 @@ msgstr "DeÄŸiÅŸiklik yok" #, c-format msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n" msgstr "" -"İşlemeye eklenen deÄŸiÅŸiklik yok (\"git add\" ve/veya \"git commit -a\" " -"kullanın)\n" +"İşlemeye eklenen deÄŸiÅŸiklik yok (\"git add\" ve/veya \"git commit -a\" kullanın)\n" #, c-format msgid "no changes added to commit\n" @@ -21509,8 +21661,8 @@ msgid "" "nothing added to commit but untracked files present (use \"git add\" to " "track)\n" msgstr "" -"iÅŸlemeye bir ÅŸey eklenmedi; ancak izlenmeyen dosyalar var (izlemek için " -"\"git add\" kullanın)\n" +"iÅŸlemeye bir ÅŸey eklenmedi; ancak izlenmeyen dosyalar var\n" +" (izlemek için \"git add\" kullanın)\n" #, c-format msgid "nothing added to commit but untracked files present\n" @@ -21519,8 +21671,8 @@ msgstr "iÅŸlemeye bir ÅŸey eklenmedi; ancak izlenmeyen dosyalar var\n" #, c-format msgid "nothing to commit (create/copy files and use \"git add\" to track)\n" msgstr "" -"İşlenecek bir ÅŸey yok (dosyalar oluÅŸturun/kopyalayın ve izlemek için \"git " -"add\" kullanın)\n" +"İşlenecek bir ÅŸey yok\n" +" (dosyalar oluÅŸturun/kopyalayın ve izlemek için \"git add\" kullanın)\n" #, c-format msgid "nothing to commit\n" @@ -22169,7 +22321,7 @@ msgstr "(body) Cc: %s, '%s' satırından ekleniyor\n" #, perl-format msgid "(%s) Could not execute '%s'" -msgstr "(%s) '%s' çalıştırılamadı" +msgstr "(%s) '%s' yürütülemedi" #, perl-format msgid "(%s) Adding %s: %s from: '%s'\n" diff --git a/po/zh_CN.po b/po/zh_CN.po index b0832be695..1a0026a7dc 100644 --- a/po/zh_CN.po +++ b/po/zh_CN.po @@ -119,6 +119,7 @@ # smart HTTP protocol | 智能 HTTP åè®® # squash | 挤压 # stage | n. æš‚å˜åŒºï¼ˆå³ç´¢å¼•); v. æš‚å˜ +# stale | 过期的 # stash | n. è´®è—区; v. è´®è— # submodule | 忍¡ç»„ # symref | 符å·å¼•用 @@ -144,8 +145,8 @@ msgid "" msgstr "" "Project-Id-Version: Git\n" "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n" -"POT-Creation-Date: 2022-09-28 15:50+0100\n" -"PO-Revision-Date: 2022-09-23 14:53+0100\n" +"POT-Creation-Date: 2022-12-01 14:04+0000\n" +"PO-Revision-Date: 2022-12-01 14:17+0000\n" "Last-Translator: Fangyi Zhou <me@fangyi.io>\n" "Language-Team: GitHub <https://github.com/fangyi-zhou/git-po/>\n" "Language: zh_CN\n" @@ -1016,6 +1017,11 @@ msgstr "命令行以 \\ 结尾" msgid "unclosed quote" msgstr "未关é—的引å·" +#: alias.c builtin/cat-file.c builtin/notes.c builtin/prune-packed.c +#: builtin/receive-pack.c builtin/tag.c +msgid "too many arguments" +msgstr "å¤ªå¤šå‚æ•°" + #: apply.c #, c-format msgid "unrecognized whitespace option '%s'" @@ -1467,7 +1473,7 @@ msgstr "ç•¥è¿‡è¡¥ä¸ '%s'。" msgid "No valid patches in input (allow with \"--allow-empty\")" msgstr "è¾“å…¥ä¸æ²¡æœ‰åˆæ³•çš„è¡¥ä¸ ï¼ˆä½¿ç”¨ \"--allow-empty\" æ¥å…许)" -#: apply.c +#: apply.c t/helper/test-cache-tree.c msgid "unable to read index file" msgstr "æ— æ³•è¯»å–索引文件" @@ -1700,7 +1706,7 @@ msgstr "æ— æ¤å¼•用:%.*s" msgid "not a valid object name: %s" msgstr "䏿˜¯ä¸€ä¸ªæœ‰æ•ˆçš„对象å:%s" -#: archive.c +#: archive.c t/helper/test-cache-tree.c #, c-format msgid "not a tree object: %s" msgstr "䏿˜¯ä¸€ä¸ªæ ‘对象:%s" @@ -1751,7 +1757,7 @@ msgid "prepend prefix to each pathname in the archive" msgstr "ä¸ºå½’æ¡£ä¸æ¯ä¸ªè·¯å¾„ååŠ ä¸Šå‰ç¼€" #: archive.c builtin/blame.c builtin/commit-tree.c builtin/config.c -#: builtin/fast-export.c builtin/grep.c builtin/hash-object.c +#: builtin/fast-export.c builtin/gc.c builtin/grep.c builtin/hash-object.c #: builtin/ls-files.c builtin/notes.c builtin/read-tree.c parse-options.h msgid "file" msgstr "文件" @@ -3176,54 +3182,6 @@ msgid "" msgstr "二分查找è¿è¡Œå¤±è´¥ï¼š'git bisect--helper --bisect-state %s' 退出ç 为 %d" #: builtin/bisect--helper.c -msgid "reset the bisection state" -msgstr "清除二分查找状æ€" - -#: builtin/bisect--helper.c -msgid "check whether bad or good terms exist" -msgstr "检查åçš„æˆ–å¥½çš„æœ¯è¯æ˜¯å¦å˜åœ¨" - -#: builtin/bisect--helper.c -msgid "print out the bisect terms" -msgstr "打å°äºŒåˆ†æŸ¥æ‰¾æœ¯è¯" - -#: builtin/bisect--helper.c -msgid "start the bisect session" -msgstr "å¯åŠ¨äºŒåˆ†æŸ¥æ‰¾è¿‡ç¨‹" - -#: builtin/bisect--helper.c -msgid "find the next bisection commit" -msgstr "查询下一个二分查找æäº¤" - -#: builtin/bisect--helper.c -msgid "mark the state of ref (or refs)" -msgstr "æ ‡è®°å¼•ç”¨çš„çŠ¶æ€" - -#: builtin/bisect--helper.c -msgid "list the bisection steps so far" -msgstr "列出到目å‰ä¸ºæ¢çš„二分查找æ¥éª¤" - -#: builtin/bisect--helper.c -msgid "replay the bisection process from the given file" -msgstr "ä»Žç»™å®šæ–‡ä»¶é‡æ”¾äºŒåˆ†æŸ¥æ‰¾è¿›ç¨‹" - -#: builtin/bisect--helper.c -msgid "skip some commits for checkout" -msgstr "è·³è¿‡è¦æ£€å‡ºçš„一些æäº¤" - -#: builtin/bisect--helper.c -msgid "visualize the bisection" -msgstr "å¯è§†åŒ–二分查找过程" - -#: builtin/bisect--helper.c -msgid "use <cmd>... to automatically bisect" -msgstr "使用 <命令>... æ¥è‡ªåŠ¨äºŒåˆ†æŸ¥æ‰¾" - -#: builtin/bisect--helper.c -msgid "no log for BISECT_WRITE" -msgstr "BISECT_WRITE æ— æ—¥å¿—" - -#: builtin/bisect--helper.c msgid "--bisect-reset requires either no argument or a commit" msgstr "--bisect-reset æ— éœ€å‚æ•°æˆ–者需è¦ä¸€ä¸ªæäº¤" @@ -3248,6 +3206,10 @@ msgid "git blame [<options>] [<rev-opts>] [<rev>] [--] <file>" msgstr "git blame [<选项>] [<版本选项>] [<版本>] [--] <文件>" #: builtin/blame.c +msgid "git annotate [<options>] [<rev-opts>] [<rev>] [--] <file>" +msgstr "git annotate [<选项>] [<版本选项>] [<版本>] [--] <文件>" + +#: builtin/blame.c msgid "<rev-opts> are documented in git-rev-list(1)" msgstr "<版本选项> 的文档记录在 git-rev-list(1) ä¸" @@ -3487,10 +3449,6 @@ msgid "cannot use -a with -d" msgstr "ä¸èƒ½å°† -a å’Œ -d åŒæ—¶ä½¿ç”¨" #: builtin/branch.c -msgid "Couldn't look up commit object for HEAD" -msgstr "æ— æ³•æŸ¥è¯¢ HEAD 指å‘çš„æäº¤å¯¹è±¡" - -#: builtin/branch.c #, c-format msgid "Cannot delete branch '%s' checked out at '%s'" msgstr "æ— æ³•åˆ é™¤æ£€å‡ºäºŽ '%2$s' 的分支 '%1$s'。" @@ -3539,17 +3497,19 @@ msgid "Branch %s is being bisected at %s" msgstr "分支 %s æ£è¢«äºŒåˆ†æŸ¥æ‰¾äºŽ %s" #: builtin/branch.c -msgid "cannot copy the current branch while not on any." -msgstr "æ— æ³•æ‹·è´å½“å‰åˆ†æ”¯å› 为ä¸å¤„于任何分支上。" +#, c-format +msgid "Invalid branch name: '%s'" +msgstr "æ— æ•ˆçš„åˆ†æ”¯å:'%s'" #: builtin/branch.c -msgid "cannot rename the current branch while not on any." -msgstr "æ— æ³•é‡å‘½å当å‰åˆ†æ”¯å› 为ä¸å¤„于任何分支上。" +#, c-format +msgid "No commit on branch '%s' yet." +msgstr "分支 '%s' å°šæ— æäº¤ã€‚" #: builtin/branch.c #, c-format -msgid "Invalid branch name: '%s'" -msgstr "æ— æ•ˆçš„åˆ†æ”¯å:'%s'" +msgid "No branch named '%s'." +msgstr "没有分支 '%s'。" #: builtin/branch.c msgid "Branch rename failed" @@ -3758,14 +3718,12 @@ msgid "cannot edit description of more than one branch" msgstr "ä¸èƒ½ä¸ºä¸€ä¸ªä»¥ä¸Šçš„分支编辑æè¿°" #: builtin/branch.c -#, c-format -msgid "No commit on branch '%s' yet." -msgstr "分支 '%s' å°šæ— æäº¤ã€‚" +msgid "cannot copy the current branch while not on any." +msgstr "ä¸å¤„äºŽä»»ä½•åˆ†æ”¯ä¸Šï¼Œæ— æ³•æ‹·è´å½“å‰åˆ†æ”¯ã€‚" #: builtin/branch.c -#, c-format -msgid "No branch named '%s'." -msgstr "没有分支 '%s'。" +msgid "cannot rename the current branch while not on any." +msgstr "ä¸å¤„äºŽä»»ä½•åˆ†æ”¯ä¸Šï¼Œæ— æ³•é‡å‘½å当å‰åˆ†æ”¯ã€‚" #: builtin/branch.c msgid "too many branches for a copy operation" @@ -3846,11 +3804,11 @@ msgstr "䏿˜¯åœ¨ git ä»“åº“ä¸æ‰§è¡Œ - æ²¡æœ‰å¯æ˜¾ç¤ºçš„é’©å\n" #: builtin/bugreport.c msgid "" -"git bugreport [-o|--output-directory <file>] [-s|--suffix <format>] [--" -"diagnose[=<mode>]" +"git bugreport [(-o | --output-directory) <path>] [(-s | --suffix) <format>]\n" +" [--diagnose[=<mode>]]" msgstr "" -"git bugreport [-o|--output-directory <文件>] [-s|--suffix <æ ¼å¼>] [--" -"diagnose[=<模å¼>]" +"git bugreport [-o|--output-directory <文件>] [(-s|--suffix) <æ ¼å¼>]\n" +" [--diagnose[=<模å¼>]" #: builtin/bugreport.c msgid "" @@ -3933,20 +3891,26 @@ msgid "Created new report at '%s'.\n" msgstr "在 '%s' 创建了新报告。\n" #: builtin/bundle.c -msgid "git bundle create [<options>] <file> <git-rev-list args>" -msgstr "git bundle create [<选项>] <文件> <git-rev-list 傿•°>" +msgid "" +"git bundle create [-q | --quiet | --progress | --all-progress] [--all-" +"progress-implied]\n" +" [--version=<version>] <file> <git-rev-list-args>" +msgstr "" +"git bundle create [-q | --quiet | --progress | --all-progress] [--all-" +"progress-implied]\n" +" [--version=<版本>] <文件> <git-rev-list-傿•°>" #: builtin/bundle.c -msgid "git bundle verify [<options>] <file>" -msgstr "git bundle verify [<选项>] <文件>" +msgid "git bundle verify [-q | --quiet] <file>" +msgstr "git bundle verify [-q | --quiet] <文件>" #: builtin/bundle.c msgid "git bundle list-heads <file> [<refname>...]" msgstr "git bundle list-heads <文件> [<引用å>...]" #: builtin/bundle.c -msgid "git bundle unbundle <file> [<refname>...]" -msgstr "git bundle unbundle <文件> [<引用å>...]" +msgid "git bundle unbundle [--progress] <file> [<refname>...]" +msgstr "git bundle unbundle [--progress] <文件> [<引用å>...]" #: builtin/bundle.c builtin/pack-objects.c msgid "do not show progress meter" @@ -4043,12 +4007,12 @@ msgid "" "git cat-file (--batch | --batch-check | --batch-command) [--batch-all-" "objects]\n" " [--buffer] [--follow-symlinks] [--unordered]\n" -" [--textconv | --filters]" +" [--textconv | --filters] [-z]" msgstr "" "git cat-file (--batch | --batch-check | --batch-command) [--batch-all-" "objects]\n" " [--buffer] [--follow-symlinks] [--unordered]\n" -" [--textconv | --filters]" +" [--textconv | --filters] [-z]" #: builtin/cat-file.c msgid "" @@ -4185,11 +4149,6 @@ msgstr "'%s' éœ€è¦ <版本>" msgid "<object> required with '-%c'" msgstr "'-%c' éœ€è¦ <对象>" -#: builtin/cat-file.c builtin/notes.c builtin/prune-packed.c -#: builtin/receive-pack.c builtin/tag.c -msgid "too many arguments" -msgstr "å¤ªå¤šå‚æ•°" - #: builtin/cat-file.c #, c-format msgid "only two arguments allowed in <type> <object> mode, not %d" @@ -4847,9 +4806,10 @@ msgstr "使用å åŠ æ¨¡å¼" #: builtin/clean.c msgid "" -"git clean [-d] [-f] [-i] [-n] [-q] [-e <pattern>] [-x | -X] [--] <paths>..." +"git clean [-d] [-f] [-i] [-n] [-q] [-e <pattern>] [-x | -X] [--] " +"[<pathspec>...]" msgstr "" -"git clean [-d] [-f] [-i] [-n] [-q] [-e <模å¼>] [-x | -X] [--] <路径>..." +"git clean [-d] [-f] [-i] [-n] [-q] [-e <模å¼>] [-x | -X] [--] <è·¯å¾„è§„æ ¼>..." #: builtin/clean.c #, c-format @@ -5215,6 +5175,11 @@ msgstr "%s å˜åœ¨ä¸”䏿˜¯ä¸€ä¸ªç›®å½•" msgid "failed to start iterator over '%s'" msgstr "æ— æ³•åœ¨ '%s' 上å¯åЍè¿ä»£å™¨" +#: builtin/clone.c +#, c-format +msgid "symlink '%s' exists, refusing to clone with --local" +msgstr "符å·é“¾æŽ¥ '%s' å˜åœ¨ï¼Œæ‹’ç»ç”¨ --local 克隆" + #: builtin/clone.c compat/precompose_utf8.c #, c-format msgid "failed to unlink '%s'" @@ -5297,11 +5262,6 @@ msgid "You must specify a repository to clone." msgstr "您必须指定一个仓库æ¥å…‹éš†ã€‚" #: builtin/clone.c -#, c-format -msgid "options '%s' and '%s %s' cannot be used together" -msgstr "选项 '%s' å’Œ '%s %s' ä¸èƒ½åŒæ—¶ä½¿ç”¨" - -#: builtin/clone.c msgid "" "--bundle-uri is incompatible with --depth, --shallow-since, and --shallow-" "exclude" @@ -5451,22 +5411,27 @@ msgstr "--command å¿…é¡»æ˜¯ç¬¬ä¸€ä¸ªå‚æ•°" #: builtin/commit-graph.c msgid "" -"git commit-graph verify [--object-dir <objdir>] [--shallow] [--[no-]progress]" +"git commit-graph verify [--object-dir <dir>] [--shallow] [--[no-]progress]" msgstr "" -"git commit-graph verify [--object-dir <对象目录>] [--shallow] [--" -"[no-]progress]" +"git commit-graph verify [--object-dir <目录>] [--shallow] [--[no-]progress]" #: builtin/commit-graph.c msgid "" -"git commit-graph write [--object-dir <objdir>] [--append] [--" -"split[=<strategy>]] [--reachable|--stdin-packs|--stdin-commits] [--changed-" -"paths] [--[no-]max-new-filters <n>] [--[no-]progress] <split options>" -msgstr "" -"git commit-graph write [--object-dir <对象目录>] [--append] [--split[=<ç–ç•¥" -">]] [--reachable|--stdin-packs|--stdin-commits] [--changed-paths] [--" -"[no-]max-new-filters <n>] [--[no-]progress] <切分选项>" - -#: builtin/commit-graph.c builtin/fetch.c builtin/log.c +"git commit-graph write [--object-dir <dir>] [--append]\n" +" [--split[=<strategy>]] [--reachable | --stdin-packs | " +"--stdin-commits]\n" +" [--changed-paths] [--[no-]max-new-filters <n>] [--" +"[no-]progress]\n" +" <split options>" +msgstr "" +"git commit-graph write [--object-dir <目录>] [--append]\n" +" [--split[=<ç–ç•¥>]] [--reachable | --stdin-packs | --" +"stdin-commits] \n" +" [--changed-paths] [--[no-]max-new-filters <n>] [--" +"[no-]progress]\n" +" <切分选项>" + +#: builtin/commit-graph.c builtin/fetch.c builtin/log.c builtin/repack.c msgid "dir" msgstr "目录" @@ -5552,12 +5517,16 @@ msgid "Collecting commits from input" msgstr "æ£ä»Žæ ‡å‡†è¾“入收集æäº¤" #: builtin/commit-tree.c +msgid "git commit-tree <tree> [(-p <parent>)...]" +msgstr "git commit-tree <æ ‘> [(-p <父æäº¤>)...]" + +#: builtin/commit-tree.c msgid "" -"git commit-tree [(-p <parent>)...] [-S[<keyid>]] [(-m <message>)...] [(-F " -"<file>)...] <tree>" +"git commit-tree [(-p <parent>)...] [-S[<keyid>]] [(-m <message>)...]\n" +" [(-F <file>)...] <tree>" msgstr "" -"git commit-tree [(-p <父æäº¤>)...] [-S[<keyid>]] [(-m <消æ¯>)...] [(-F <文件" -">)...] <æ ‘>" +"git commit-tree [(-p <父æäº¤>)...] [-S[<ç§é’¥ ID>]] [(-m <消æ¯>)...]\n" +" [(-F <文件>)...] <æ ‘>" #: builtin/commit-tree.c #, c-format @@ -5614,12 +5583,30 @@ msgid "git commit-tree: failed to read" msgstr "git commit-treeï¼šæ— æ³•è¯»å–" #: builtin/commit.c -msgid "git commit [<options>] [--] <pathspec>..." -msgstr "git commit [<选项>] [--] <è·¯å¾„è§„æ ¼>..." +msgid "" +"git commit [-a | --interactive | --patch] [-s] [-v] [-u<mode>] [--amend]\n" +" [--dry-run] [(-c | -C | --squash) <commit> | --fixup [(amend|" +"reword):]<commit>)]\n" +" [-F <file> | -m <msg>] [--reset-author] [--allow-empty]\n" +" [--allow-empty-message] [--no-verify] [-e] [--author=<author>]\n" +" [--date=<date>] [--cleanup=<mode>] [--[no-]status]\n" +" [-i | -o] [--pathspec-from-file=<file> [--pathspec-file-nul]]\n" +" [(--trailer <token>[(=|:)<value>])...] [-S[<keyid>]]\n" +" [--] [<pathspec>...]" +msgstr "" +"git commit [-a | --interactive | --patch] [-s] [-v] [-u<模å¼>] [--amend]\n" +" [--dry-run] [(-c | -C | --squash) <æäº¤> | --fixup [(amend|" +"reword):]<æäº¤>)]\n" +" [-F <文件> | -m <消æ¯>] [--reset-author] [--allow-empty]\n" +" [--allow-empty-message] [--no-verify] [-e] [--author=<作者>]\n" +" [--date=<日期>] [--cleanup=<模å¼>] [--[no-]status]\n" +" [-i | -o] [--pathspec-from-file=<文件> [--pathspec-file-nul]]\n" +" [(--trailer <é”®>[(=|:)<值>])...] [-S[<ç§é’¥ ID>]]\n" +" [--] [<è·¯å¾„è§„æ ¼>...]" #: builtin/commit.c -msgid "git status [<options>] [--] <pathspec>..." -msgstr "git status [<选项>] [--] <è·¯å¾„è§„æ ¼>..." +msgid "git status [<options>] [--] [<pathspec>...]" +msgstr "git status [<选项>] [--] [<è·¯å¾„è§„æ ¼>...]" #: builtin/commit.c msgid "" @@ -6228,7 +6215,7 @@ msgstr "使用仓库级é…置文件" msgid "use per-worktree config file" msgstr "使用工作区级别的é…置文件" -#: builtin/config.c +#: builtin/config.c builtin/gc.c msgid "use given config file" msgstr "使用指定的é…置文件" @@ -6449,7 +6436,7 @@ msgstr "--blob åªèƒ½åœ¨ git 仓库内使用" msgid "--worktree can only be used inside a git repository" msgstr "--worktree åªèƒ½åœ¨ git 仓库内使用" -#: builtin/config.c +#: builtin/config.c builtin/gc.c msgid "$HOME not set" msgstr "$HOME 未设置" @@ -6559,12 +6546,20 @@ msgid "unable to get credential storage lock in %d ms" msgstr "æ— æ³•åœ¨ %d ms 获得å‡è¯å˜å‚¨é”" #: builtin/describe.c -msgid "git describe [<options>] [<commit-ish>...]" -msgstr "git describe [<选项>] [<æäº¤å·>...]" +msgid "" +"git describe [--all] [--tags] [--contains] [--abbrev=<n>] [<commit-ish>...]" +msgstr "" +"git describe [--all] [--tags] [--contains] [--abbrev=<n>] [<æäº¤å·>...]" + +#: builtin/describe.c +msgid "" +"git describe [--all] [--tags] [--contains] [--abbrev=<n>] --dirty[=<mark>]" +msgstr "" +"git describe [--all] [--tags] [--contains] [--abbrev=<n>] --dirty[=<æ ‡è®°>]" #: builtin/describe.c -msgid "git describe [<options>] --dirty" -msgstr "git describe [<选项>] --dirty" +msgid "git describe <blob>" +msgstr "git describe <æ•°æ®å¯¹è±¡>" #: builtin/describe.c msgid "head" @@ -6717,11 +6712,11 @@ msgstr "选项 '%s' å’Œæäº¤å·ä¸èƒ½åŒæ—¶ä½¿ç”¨" #: builtin/diagnose.c msgid "" -"git diagnose [-o|--output-directory <path>] [-s|--suffix <format>] [--" -"mode=<mode>]" +"git diagnose [(-o | --output-directory) <path>] [(-s | --suffix) <format>]\n" +" [--mode=<mode>]" msgstr "" -"git diagnose [-o|--output-directory <文件>] [-s|--suffix <æ ¼å¼>] [--mode=<模" -"å¼>]" +"git diagnose [(-o | --output-directory) <路径>] [(-s | --suffix) <æ ¼å¼>]\n" +" [--mode=<模å¼>]" #: builtin/diagnose.c msgid "specify a destination for the diagnostics archive" @@ -6745,6 +6740,10 @@ msgid "'%s': not a regular file or symlink" msgstr "'%s'ï¼šä¸æ˜¯ä¸€ä¸ªæ£è§„文件或符å·é“¾æŽ¥" #: builtin/diff.c +msgid "no merge given, only parents." +msgstr "没有给出åˆå¹¶ï¼Œåªæœ‰çˆ¶æäº¤ã€‚" + +#: builtin/diff.c #, c-format msgid "invalid option: %s" msgstr "æ— æ•ˆé€‰é¡¹ï¼š%s" @@ -7533,8 +7532,8 @@ msgid "print only refs which don't contain the commit" msgstr "åªæ‰“å°ä¸åŒ…å«è¯¥æäº¤çš„引用" #: builtin/for-each-repo.c -msgid "git for-each-repo --config=<config> <command-args>" -msgstr "git for-each-repo --config=<é…ç½®> <命令傿•°>" +msgid "git for-each-repo --config=<config> [--] <arguments>" +msgstr "git for-each-repo --config=<é…ç½®> [--] <命令傿•°>" #: builtin/for-each-repo.c msgid "config" @@ -7751,8 +7750,16 @@ msgid "%s: invalid sha1 pointer in resolve-undo" msgstr "%s:resolve-undo 䏿— 效的 sha1 指针" #: builtin/fsck.c -msgid "git fsck [<options>] [<object>...]" -msgstr "git fsck [<选项>] [<对象>...]" +msgid "" +"git fsck [--tags] [--root] [--unreachable] [--cache] [--no-reflogs]\n" +" [--[no-]full] [--strict] [--verbose] [--lost-found]\n" +" [--[no-]dangling] [--[no-]progress] [--connectivity-only]\n" +" [--[no-]name-objects] [<object>...]" +msgstr "" +"git fsck [--tags] [--root] [--unreachable] [--cache] [--no-reflogs]\n" +" [--[no-]full] [--strict] [--verbose] [--lost-found]\n" +" [--[no-]dangling] [--[no-]progress] [--connectivity-only]\n" +" [--[no-]name-objects] [<对象>...]" #: builtin/fsck.c msgid "show unreachable objects" @@ -7825,14 +7832,6 @@ msgid "git fsmonitor--daemon run [<options>]" msgstr "git fsmonitor--daemon run [<选项>]" #: builtin/fsmonitor--daemon.c -msgid "git fsmonitor--daemon stop" -msgstr "git fsmonitor--daemon stop" - -#: builtin/fsmonitor--daemon.c -msgid "git fsmonitor--daemon status" -msgstr "git fsmonitor--daemon status" - -#: builtin/fsmonitor--daemon.c #, c-format msgid "value of '%s' out of range: %d" msgstr "'%s' 的值超出范围:%d" @@ -7932,7 +7931,7 @@ msgstr "ç‰å¾…守护进程å¯åŠ¨çš„æœ€å¤§ç§’æ•°" msgid "invalid 'ipc-threads' value (%d)" msgstr "æ— æ•ˆçš„ 'ipc-threads' 值(%d)" -#: builtin/fsmonitor--daemon.c +#: builtin/fsmonitor--daemon.c t/helper/test-cache-tree.c #, c-format msgid "Unhandled subcommand '%s'" msgstr "未处ç†çš„å命令 '%s'" @@ -8132,8 +8131,23 @@ msgid "use at most one of --auto and --schedule=<frequency>" msgstr "最多使用 --auto å’Œ --schedule=<频率> å…¶ä¸ä¹‹ä¸€" #: builtin/gc.c -msgid "failed to run 'git config'" -msgstr "æ— æ³•è¿è¡Œ 'git config'" +#, c-format +msgid "unable to add '%s' value of '%s'" +msgstr "æ— æ³•æ·»åŠ '%2$s' çš„ '%1$s' 值" + +#: builtin/gc.c +msgid "return success even if repository was not registered" +msgstr "å³ä¾¿ä»“åº“éžæ³¨å†Œä»ç„¶è¿”回æˆåŠŸ" + +#: builtin/gc.c +#, c-format +msgid "unable to unset '%s' value of '%s'" +msgstr "æ— æ³•å–æ¶ˆè®¾ç½® '%2$s' çš„ '%1$s' 值" + +#: builtin/gc.c +#, c-format +msgid "repository '%s' is not registered" +msgstr "仓库 '%s' 未注册" #: builtin/gc.c #, c-format @@ -8509,11 +8523,15 @@ msgstr "åŒæ—¶ç»™å‡ºäº† --cached å’Œæ ‘å¯¹è±¡" #: builtin/hash-object.c msgid "" -"git hash-object [-t <type>] [-w] [--path=<file> | --no-filters] [--stdin] " -"[--] <file>..." +"git hash-object [-t <type>] [-w] [--path=<file> | --no-filters]\n" +" [--stdin [--literally]] [--] <file>..." msgstr "" -"git hash-object [-t <类型>] [-w] [--path=<文件> | --no-filters] [--stdin] " -"[--] <文件>..." +"git hash-object [-t <类型>] [-w] [--path=<文件> | --no-filters]\n" +" [--stdin [--literally]] [--] <文件>..." + +#: builtin/hash-object.c +msgid "git hash-object [-t <type>] [-w] --stdin-paths [--no-filters]" +msgstr "git hash-object [-t <类型>] [-w] --stdin-paths [--no-filters]" #: builtin/hash-object.c msgid "object type" @@ -9047,11 +9065,15 @@ msgstr "å·²åˆå§‹åŒ–空的 Git 仓库于 %s%s\n" #: builtin/init-db.c msgid "" -"git init [-q | --quiet] [--bare] [--template=<template-directory>] [--" -"shared[=<permissions>]] [<directory>]" +"git init [-q | --quiet] [--bare] [--template=<template-directory>]\n" +" [--separate-git-dir <git-dir>] [--object-format=<format>]\n" +" [-b <branch-name> | --initial-branch=<branch-name>]\n" +" [--shared[=<permissions>]] [<directory>]" msgstr "" -"git init [-q | --quiet] [--bare] [--template=<模æ¿ç›®å½•>] [--shared[=<æƒé™>]] " -"[<目录>]" +"git init [-q | --quiet] [--bare] [--template=<模æ¿ç›®å½•>]\n" +" [--separate-git-dir <git 目录>] [--object-format=<æ ¼å¼>]\n" +" [-b <分支å> | --initial-branch=<分支å>]\n" +" [--shared[=<æƒé™>]] [<目录>]" #: builtin/init-db.c msgid "permissions" @@ -9101,11 +9123,13 @@ msgstr "--separate-git-dir ä¸èƒ½ç”¨äºŽçº¯ä»“库" #: builtin/interpret-trailers.c msgid "" -"git interpret-trailers [--in-place] [--trim-empty] [(--trailer " -"<token>[(=|:)<value>])...] [<file>...]" +"git interpret-trailers [--in-place] [--trim-empty]\n" +" [(--trailer <token>[(=|:)<value>])...]\n" +" [--parse] [<file>...]" msgstr "" -"git interpret-trailers [--in-place] [--trim-empty] [(--trailer <é”®>[(=|:)<值" -">])...] [<文件>...]" +"git interpret-trailers [--in-place] [--trim-empty]\n" +" [(--trailer <é”®>[(=|:)<值>])...]\n" +" [--parse] [<文件>...]" #: builtin/interpret-trailers.c msgid "edit files in place" @@ -9724,11 +9748,11 @@ msgstr "" #: builtin/ls-remote.c msgid "" "git ls-remote [--heads] [--tags] [--refs] [--upload-pack=<exec>]\n" -" [-q | --quiet] [--exit-code] [--get-url]\n" +" [-q | --quiet] [--exit-code] [--get-url] [--sort=<key>]\n" " [--symref] [<repository> [<refs>...]]" msgstr "" -"git ls-remote [--heads] [--tags] [--refs] [--upload-pack=<exec>]\n" -" [-q | --quiet] [--exit-code] [--get-url]\n" +"git ls-remote [--heads] [--tags] [--refs] [--upload-pack=<坿‰§è¡Œæ–‡ä»¶>]\n" +" [-q | --quiet] [--exit-code] [--get-url] [--sort=<é”®>]\n" " [--symref] [<仓库> [<引用>...]]" #: builtin/ls-remote.c @@ -9898,14 +9922,14 @@ msgid "git merge-base [-a | --all] --octopus <commit>..." msgstr "git merge-base [-a | --all] --octopus <æäº¤>..." #: builtin/merge-base.c -msgid "git merge-base --independent <commit>..." -msgstr "git merge-base --independent <æäº¤>..." - -#: builtin/merge-base.c msgid "git merge-base --is-ancestor <commit> <commit>" msgstr "git merge-base --is-ancestor <æäº¤> <æäº¤>" #: builtin/merge-base.c +msgid "git merge-base --independent <commit>..." +msgstr "git merge-base --independent <æäº¤>..." + +#: builtin/merge-base.c msgid "git merge-base --fork-point <ref> [<commit>]" msgstr "git merge-base --fork-point <引用> [<æäº¤>]" @@ -10045,9 +10069,23 @@ msgid "allow merging unrelated histories" msgstr "å…许åˆå¹¶ä¸ç›¸å…³çš„历å²" #: builtin/merge-tree.c +msgid "perform multiple merges, one per line of input" +msgstr "实施多个åˆå¹¶ï¼Œæ¯è¾“入行一个" + +#: builtin/merge-tree.c msgid "--trivial-merge is incompatible with all other options" msgstr "--trivial-merge 与其他所有选项ä¸å…¼å®¹" +#: builtin/merge-tree.c builtin/notes.c +#, c-format +msgid "malformed input line: '%s'." +msgstr "æ ¼å¼é”™è¯¯çš„输入行:'%s'。" + +#: builtin/merge-tree.c +#, c-format +msgid "merging cannot continue; got unclean result of %d" +msgstr "åˆå¹¶æ— 法继ç»ï¼›å¾—到ä¸å¹²å‡€çš„结果 %d" + #: builtin/merge.c msgid "git merge [<options>] [<commit>...]" msgstr "git merge [<选项>] [<æäº¤>...]" @@ -10620,7 +10658,7 @@ msgstr "%s,æº=%sï¼Œç›®æ ‡=%s" msgid "Renaming %s to %s\n" msgstr "é‡å‘½å %s 至 %s\n" -#: builtin/mv.c builtin/remote.c builtin/repack.c +#: builtin/mv.c builtin/remote.c #, c-format msgid "renaming '%s' failed" msgstr "é‡å‘½å '%s' 失败" @@ -10823,11 +10861,6 @@ msgstr "ä¸èƒ½ä»Žéžæ•°æ®å¯¹è±¡ '%s' ä¸è¯»å–注解数æ®ã€‚" #: builtin/notes.c #, c-format -msgid "malformed input line: '%s'." -msgstr "æ ¼å¼é”™è¯¯çš„输入行:'%s'。" - -#: builtin/notes.c -#, c-format msgid "failed to copy notes from '%s' to '%s'" msgstr "æ— æ³•æŠŠæ³¨è§£ä»Ž '%s' æ‹·è´åˆ° '%s'" @@ -11058,14 +11091,13 @@ msgid "unknown subcommand: `%s'" msgstr "未知å命令:`%s'" #: builtin/pack-objects.c -msgid "" -"git pack-objects --stdout [<options>...] [< <ref-list> | < <object-list>]" -msgstr "git pack-objects --stdout [<选项>...] [< <引用列表> | < <对象列表>]" +msgid "git pack-objects --stdout [<options>] [< <ref-list> | < <object-list>]" +msgstr "git pack-objects --stdout [<选项>] [< <引用列表> | < <对象列表>]" #: builtin/pack-objects.c msgid "" -"git pack-objects [<options>...] <base-name> [< <ref-list> | < <object-list>]" -msgstr "git pack-objects [<选项>...] <å‰ç¼€åç§°> [< <引用列表> | < <对象列表>]" +"git pack-objects [<options>] <base-name> [< <ref-list> | < <object-list>]" +msgstr "git pack-objects [<选项>] <å‰ç¼€åç§°> [< <引用列表> | < <对象列表>]" #: builtin/pack-objects.c #, c-format @@ -11535,8 +11567,8 @@ msgstr "" "使用它。 谢谢。\n" #: builtin/pack-refs.c -msgid "git pack-refs [<options>]" -msgstr "git pack-refs [<选项>]" +msgid "git pack-refs [--all] [--no-prune]" +msgstr "git pack-refs [--all] [--no-prune]" #: builtin/pack-refs.c msgid "pack everything" @@ -11546,6 +11578,22 @@ msgstr "打包一切" msgid "prune loose refs (default)" msgstr "æ¸…é™¤æ¾æ•£çš„引用(默认)" +#: builtin/patch-id.c +msgid "git patch-id [--stable | --unstable | --verbatim]" +msgstr "git patch-id [--stable | --unstable | --verbatim]" + +#: builtin/patch-id.c +msgid "use the unstable patch-id algorithm" +msgstr "使用ä¸ç¨³å®šçš„ patch-id 算法" + +#: builtin/patch-id.c +msgid "use the stable patch-id algorithm" +msgstr "使用稳定的 patch-id 算法" + +#: builtin/patch-id.c +msgid "don't strip whitespace from the patch" +msgstr "ä¸è¦ä»Žè¡¥ä¸ä¸åˆ 除空白å—符" + #: builtin/prune.c msgid "git prune [-n] [-v] [--progress] [--expire <time>] [--] [<head>...]" msgstr "git prune [-n] [-v] [--progress] [--expire <æ—¶é—´>] [--] [<head>...]" @@ -11793,9 +11841,8 @@ msgstr "" #: builtin/push.c msgid "" "\n" -"To avoid automatically configuring upstream branches when their name\n" -"doesn't match the local branch, see option 'simple' of branch." -"autoSetupMerge\n" +"To avoid automatically configuring an upstream branch when its name\n" +"won't match the local branch, see option 'simple' of branch.autoSetupMerge\n" "in 'git help config'.\n" msgstr "" "\n" @@ -11953,6 +12000,13 @@ msgstr "推é€åˆ° %s\n" msgid "failed to push some refs to '%s'" msgstr "æ— æ³•æŽ¨é€ä¸€äº›å¼•用到 '%s'" +#: builtin/push.c +msgid "" +"recursing into submodule with push.recurseSubmodules=only; using on-demand " +"instead" +msgstr "" +"在 push.recurseSubmodules=only æ—¶é€’å½’è¿›å…¥åæ¨¡ç»„ï¼›å–而代之使用 on-demand" + #: builtin/push.c builtin/send-pack.c submodule-config.c #, c-format msgid "invalid value for '%s'" @@ -12125,13 +12179,14 @@ msgstr "需è¦ä¸¤ä¸ªæäº¤èŒƒå›´" #: builtin/read-tree.c msgid "" -"git read-tree [(-m [--trivial] [--aggressive] | --reset | --prefix=<prefix>) " -"[-u | -i]] [--no-sparse-checkout] [--index-output=<file>] (--empty | <tree-" -"ish1> [<tree-ish2> [<tree-ish3>]])" +"git read-tree [(-m [--trivial] [--aggressive] | --reset | --" +"prefix=<prefix>)\n" +" [-u | -i]] [--index-output=<file>] [--no-sparse-checkout]\n" +" (--empty | <tree-ish1> [<tree-ish2> [<tree-ish3>]])" msgstr "" -"git read-tree [(-m [--trivial] [--aggressive] | --reset | --prefix=<å‰ç¼€>) [-" -"u | -i]] [--no-sparse-checkout] [--index-output=<文件>] (--empty | <æ ‘å¯¹è±¡ä¸€" -"> [<æ ‘å¯¹è±¡äºŒ> [<æ ‘å¯¹è±¡ä¸‰>]])" +"git read-tree [(-m [--trivial] [--aggressive] | --reset | --prefix=<å‰ç¼€>)\n" +" [-u | -i]] [--index-output=<文件>] [--no-sparse-checkout]\n" +" (--empty | <æ ‘å¯¹è±¡ä¸€> [<æ ‘å¯¹è±¡äºŒ> [<æ ‘å¯¹è±¡ä¸‰>]])" #: builtin/read-tree.c msgid "write resulting index to <file>" @@ -12248,8 +12303,8 @@ msgstr "%s 需è¦åˆå¹¶åŽç«¯" #: builtin/rebase.c #, c-format -msgid "could not get 'onto': '%s'" -msgstr "æ— æ³•èŽ·å– 'onto':'%s'" +msgid "invalid onto: '%s'" +msgstr "æ— æ•ˆæ–°åŸºçº¿ï¼š'%s'" #: builtin/rebase.c #, c-format @@ -12613,8 +12668,8 @@ msgid "No such ref: %s" msgstr "æ²¡æœ‰è¿™æ ·çš„å¼•ç”¨ï¼š%s" #: builtin/rebase.c -msgid "Could not resolve HEAD to a revision" -msgstr "æ— æ³•å°† HEAD è§£æžä¸ºä¸€ä¸ªç‰ˆæœ¬" +msgid "Could not resolve HEAD to a commit" +msgstr "ä¸èƒ½è§£æž HEAD 至一个æäº¤" #: builtin/rebase.c #, c-format @@ -13084,7 +13139,7 @@ msgstr " 已跳过" #: builtin/remote.c msgid " stale (use 'git remote prune' to remove)" -msgstr " 过时(使用 'git remote prune' æ¥ç§»é™¤ï¼‰" +msgstr " 已过期(使用 'git remote prune' æ¥ç§»é™¤ï¼‰" #: builtin/remote.c msgid " ???" @@ -13416,6 +13471,11 @@ msgid "could not close refs snapshot tempfile" msgstr "ä¸èƒ½å…³é—引用快照临时文件" #: builtin/repack.c +#, c-format +msgid "could not remove stale bitmap: %s" +msgstr "æ— æ³•åˆ é™¤è¿‡æœŸçš„ä½å›¾ï¼š %s" + +#: builtin/repack.c msgid "pack everything in a single pack" msgstr "所有内容打包到一个包文件ä¸" @@ -13512,6 +13572,10 @@ msgid "write a multi-pack index of the resulting packs" msgstr "写入结果包的多包索引" #: builtin/repack.c +msgid "pack prefix to store a pack containing pruned objects" +msgstr "储å˜è¢«æ¸…除的对象的包的å‰ç¼€" + +#: builtin/repack.c msgid "cannot delete packs in a precious-objects repo" msgstr "ä¸èƒ½åˆ 除çå“仓库ä¸çš„æ‰“包文件" @@ -13526,11 +13590,16 @@ msgstr "包å‰ç¼€ %s 没有以对象目录 .%s 开始" #: builtin/repack.c #, c-format -msgid "missing required file: %s" -msgstr "缺少需è¦çš„æ–‡ä»¶ï¼š%s" +msgid "renaming pack to '%s' failed" +msgstr "é‡å‘½å包至 '%s' 失败" #: builtin/repack.c #, c-format +msgid "pack-objects did not write a '%s' file for pack %s-%s" +msgstr "pack-objects 未为包 %2$s-%3$s 写入 '%1$s' 文件" + +#: builtin/repack.c sequencer.c +#, c-format msgid "could not unlink: %s" msgstr "ä¸èƒ½åˆ 除:%s" @@ -13771,8 +13840,10 @@ msgid "only one pattern can be given with -l" msgstr "åªèƒ½ä¸º -l æä¾›ä¸€ä¸ªæ¨¡å¼" #: builtin/rerere.c -msgid "git rerere [clear | forget <path>... | status | remaining | diff | gc]" -msgstr "git rerere [clear | forget <路径>... | status | remaining | diff | gc]" +msgid "" +"git rerere [clear | forget <pathspec>... | diff | status | remaining | gc]" +msgstr "" +"git rerere [clear | forget <è·¯å¾„è§„æ ¼>... | diff | status | remaining | gc]" #: builtin/rerere.c msgid "register clean resolutions in index" @@ -14027,6 +14098,18 @@ msgstr "--prefix 需è¦ä¸€ä¸ªå‚æ•°" msgid "unknown mode for --abbrev-ref: %s" msgstr "未知的 --abbrev-ref 模å¼ï¼š%s" +#: builtin/rev-parse.c revision.c +msgid "--exclude-hidden cannot be used together with --branches" +msgstr "--exclude-hidden ä¸èƒ½ä¸Ž --branches 一起使用" + +#: builtin/rev-parse.c revision.c +msgid "--exclude-hidden cannot be used together with --tags" +msgstr "--exclude-hidden ä¸èƒ½ä¸Ž --tags 一起使用" + +#: builtin/rev-parse.c revision.c +msgid "--exclude-hidden cannot be used together with --remotes" +msgstr "--exclude-hidden ä¸èƒ½ä¸Ž --remotes 一起使用" + #: builtin/rev-parse.c setup.c msgid "this operation must be run in a work tree" msgstr "该æ“作必须在一个工作区ä¸è¿è¡Œ" @@ -14037,20 +14120,27 @@ msgid "unknown mode for --show-object-format: %s" msgstr "未知的 --show-object-format 模å¼ï¼š%s" #: builtin/revert.c -msgid "git revert [<options>] <commit-ish>..." -msgstr "git revert [<选项>] <æäº¤å·>..." +msgid "" +"git revert [--[no-]edit] [-n] [-m <parent-number>] [-s] [-S[<keyid>]] " +"<commit>..." +msgstr "" +"git revert [--[no-]edit] [-n] [-m <父编å·>] [-s] [-S[<ç§é’¥ ID>]] <æäº¤>..." #: builtin/revert.c -msgid "git revert <subcommand>" -msgstr "git revert <å命令>" +msgid "git revert (--continue | --skip | --abort | --quit)" +msgstr "git revert (--continue | --skip | --abort | --quit)" #: builtin/revert.c -msgid "git cherry-pick [<options>] <commit-ish>..." -msgstr "git cherry-pick [<选项>] <æäº¤å·>..." +msgid "" +"git cherry-pick [--edit] [-n] [-m <parent-number>] [-s] [-x] [--ff]\n" +" [-S[<keyid>]] <commit>..." +msgstr "" +"git cherry-pick [--edit] [-n] [-m <父编å·>] [-s] [-x] [--ff]\n" +" [-S[<ç§é’¥ ID>]] <æäº¤>..." #: builtin/revert.c -msgid "git cherry-pick <subcommand>" -msgstr "git cherry-pick <å命令>" +msgid "git cherry-pick (--continue | --skip | --abort | --quit)" +msgstr "git cherry-pick (--continue | --skip | --abort | --quit)" #: builtin/revert.c #, c-format @@ -14131,8 +14221,14 @@ msgid "cherry-pick failed" msgstr "拣选失败" #: builtin/rm.c -msgid "git rm [<options>] [--] <file>..." -msgstr "git rm [<选项>] [--] <文件>..." +msgid "" +"git rm [-f | --force] [-n] [-r] [--cached] [--ignore-unmatch]\n" +" [--quiet] [--pathspec-from-file=<file> [--pathspec-file-nul]]\n" +" [--] [<pathspec>...]" +msgstr "" +"git rm [-f | --force] [-n] [-r] [--cached] [--ignore-unmatch]\n" +" [--quiet] [--pathspec-from-file=<文件> [--pathspec-file-nul]]\n" +" [--] [<è·¯å¾„è§„æ ¼>...]" #: builtin/rm.c msgid "" @@ -14215,11 +14311,13 @@ msgid "" "git send-pack [--mirror] [--dry-run] [--force]\n" " [--receive-pack=<git-receive-pack>]\n" " [--verbose] [--thin] [--atomic]\n" +" [--[no-]signed | --signed=(true|false|if-asked)]\n" " [<host>:]<directory> (--all | <ref>...)" msgstr "" "git send-pack [--mirror] [--dry-run] [--force]\n" " [--receive-pack=<git-receive-pack>]\n" " [--verbose] [--thin] [--atomic]\n" +" [--[no-]signed | --signed=(true|false|if-asked)]\n" " [<主机>:]<目录> (--all | <引用>...)" #: builtin/send-pack.c @@ -14251,8 +14349,9 @@ msgid "using multiple --group options with stdin is not supported" msgstr "䏿”¯æŒå’Œæ ‡å‡†è¾“入一起使用多个 --group 选项" #: builtin/shortlog.c -msgid "using --group=trailer with stdin is not supported" -msgstr "䏿”¯æŒå’Œæ ‡å‡†è¾“入一起使用 --group=trailer" +#, c-format +msgid "using %s with stdin is not supported" +msgstr "䏿”¯æŒå¯¹ %s ä½¿ç”¨æ ‡å‡†è¾“å…¥" #: builtin/shortlog.c #, c-format @@ -14300,12 +14399,14 @@ msgid "" "git show-branch [-a | --all] [-r | --remotes] [--topo-order | --date-order]\n" " [--current] [--color[=<when>] | --no-color] [--sparse]\n" " [--more=<n> | --list | --independent | --merge-base]\n" -" [--no-name | --sha1-name] [--topics] [(<rev> | <glob>)...]" +" [--no-name | --sha1-name] [--topics]\n" +" [(<rev> | <glob>)...]" msgstr "" "git show-branch [-a | --all] [-r | --remotes] [--topo-order | --date-order]\n" " [--current] [--color[=<何时>] | --no-color] [--sparse]\n" " [--more=<n> | --list | --independent | --merge-base]\n" -" [--no-name | --sha1-name] [--topics] [(<版本> | <通é…符>)...]" +" [--no-name | --sha1-name] [--topics]\n" +" [(<版本> | <通é…符>)...]" #: builtin/show-branch.c msgid "git show-branch (-g | --reflog)[=<n>[,<base>]] [--list] [<ref>]" @@ -14434,11 +14535,13 @@ msgstr "未知的哈希算法" #: builtin/show-ref.c msgid "" -"git show-ref [-q | --quiet] [--verify] [--head] [-d | --dereference] [-s | --" -"hash[=<n>]] [--abbrev[=<n>]] [--tags] [--heads] [--] [<pattern>...]" +"git show-ref [-q | --quiet] [--verify] [--head] [-d | --dereference]\n" +" [-s | --hash[=<n>]] [--abbrev[=<n>]] [--tags]\n" +" [--heads] [--] [<pattern>...]" msgstr "" -"git show-ref [-q | --quiet] [--verify] [--head] [-d | --dereference] [-s | --" -"hash[=<n>]] [--abbrev[=<n>]] [--tags] [--heads] [--] [<模å¼>...]" +"git show-ref [-q | --quiet] [--verify] [--head] [-d | --dereference]\n" +" [-s | --hash[=<n>]] [--abbrev[=<n>]] [--tags]\n" +" [--heads] [--] [<模å¼>...]" #: builtin/show-ref.c msgid "git show-ref --exclude-existing[=<pattern>]" @@ -14477,8 +14580,10 @@ msgid "show refs from stdin that aren't in local repository" msgstr "æ˜¾ç¤ºä»Žæ ‡å‡†è¾“å…¥ä¸è¯»å…¥çš„ä¸åœ¨æœ¬åœ°ä»“库ä¸çš„引用" #: builtin/sparse-checkout.c -msgid "git sparse-checkout (init|list|set|add|reapply|disable) <options>" -msgstr "git sparse-checkout (init|list|set|add|reapply|disable) <选项>" +msgid "" +"git sparse-checkout (init | list | set | add | reapply | disable) [<options>]" +msgstr "" +"git sparse-checkout (init | list | set | add | reapply | disable) [<选项>]" #: builtin/sparse-checkout.c msgid "this worktree is not sparse" @@ -14619,78 +14724,65 @@ msgid "error while refreshing working directory" msgstr "刷新工作目录时出错" #: builtin/stash.c -msgid "git stash list [<options>]" -msgstr "git stash list [<选项>]" +msgid "git stash list [<log-options>]" +msgstr "git stash list [<日志选项>]" + +#: builtin/stash.c +msgid "" +"git stash show [-u | --include-untracked | --only-untracked] [<diff-" +"options>] [<stash>]" +msgstr "" +"git stash show [-u | --include-untracked | --only-untracked] [<差异选项>] [<" +"è´®å˜>]" #: builtin/stash.c -msgid "git stash show [<options>] [<stash>]" -msgstr "git stash show [<选项>] [<stash>]" +msgid "git stash drop [-q | --quiet] [<stash>]" +msgstr "git stash drop [-q | --quiet] [<è´®å˜>]" #: builtin/stash.c -msgid "git stash drop [-q|--quiet] [<stash>]" -msgstr "git stash drop [-q|--quiet] [<stash>]" +msgid "git stash pop [--index] [-q | --quiet] [<stash>]" +msgstr "git stash pop [--index] [-q | --quiet] [<è´®å˜>]" #: builtin/stash.c -msgid "git stash ( pop | apply ) [--index] [-q|--quiet] [<stash>]" -msgstr "git stash ( pop | apply ) [--index] [-q|--quiet] [<stash>]" +msgid "git stash apply [--index] [-q | --quiet] [<stash>]" +msgstr "git stash apply [--index] [-q | --quiet] [<è´®å˜>]" #: builtin/stash.c msgid "git stash branch <branchname> [<stash>]" msgstr "git stash branch <分支å> [<stash>]" #: builtin/stash.c +msgid "git stash store [(-m | --message) <message>] [-q | --quiet] <commit>" +msgstr "git stash store [(-m | --message) <消æ¯>] [-q | --quiet] <æäº¤>" + +#: builtin/stash.c msgid "" -"git stash [push [-p|--patch] [-S|--staged] [-k|--[no-]keep-index] [-q|--" -"quiet]\n" -" [-u|--include-untracked] [-a|--all] [-m|--message <message>]\n" +"git stash [push [-p | --patch] [-S | --staged] [-k | --[no-]keep-index] [-q " +"| --quiet]\n" +" [-u | --include-untracked] [-a | --all] [(-m | --message) " +"<message>]\n" " [--pathspec-from-file=<file> [--pathspec-file-nul]]\n" " [--] [<pathspec>...]]" msgstr "" -"git stash [push [-p|--patch] [[-S|--staged] -k|--[no-]keep-index] [-q|--" -"quiet]\n" -" [-u|--include-untracked] [-a|--all] [-m|--message <消æ¯>]\n" +"git stash [push [-p | --patch] [-S | --staged] [-k | --[no-]keep-index] [-q " +"| --quiet]\n" +" [-u | --include-untracked] [-a | --all] [(-m | --message <消æ¯>]\n" " [--pathspec-from-file=<文件> [--pathspec-file-nul]]\n" " [--] [<è·¯å¾„è§„æ ¼>...]]" #: builtin/stash.c msgid "" -"git stash save [-p|--patch] [-S|--staged] [-k|--[no-]keep-index] [-q|--" -"quiet]\n" -" [-u|--include-untracked] [-a|--all] [<message>]" +"git stash save [-p | --patch] [-S | --staged] [-k | --[no-]keep-index] [-q | " +"--quiet]\n" +" [-u | --include-untracked] [-a | --all] [<message>]" msgstr "" -"git stash save [-p|--patch] [-S|--staged] [-k|--[no-]keep-index] [-q|--" -"quiet]\n" -" [-u|--include-untracked] [-a|--all] [<消æ¯>]" - -#: builtin/stash.c -msgid "git stash pop [--index] [-q|--quiet] [<stash>]" -msgstr "git stash pop [--index] [-q|--quiet] [<stash>]" - -#: builtin/stash.c -msgid "git stash apply [--index] [-q|--quiet] [<stash>]" -msgstr "git stash apply [--index] [-q|--quiet] [<stash>]" +"git stash save [-p | --patch] [-S | --staged] [-k | --[no-]keep-index] [-q | " +"--quiet]\n" +" [-u | --include-untracked] [-a | --all] [<消æ¯>]" #: builtin/stash.c -msgid "git stash store [-m|--message <message>] [-q|--quiet] <commit>" -msgstr "git stash store [-m|--message <消æ¯>] [-q|--quiet] <æäº¤>" - -#: builtin/stash.c -msgid "" -"git stash [push [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]\n" -" [-u|--include-untracked] [-a|--all] [-m|--message <message>]\n" -" [--] [<pathspec>...]]" -msgstr "" -"git stash [push [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]\n" -" [-u|--include-untracked] [-a|--all] [-m|--message <消æ¯>]\n" -" [--] [<è·¯å¾„è§„æ ¼>...]]" - -#: builtin/stash.c -msgid "" -"git stash save [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]\n" -" [-u|--include-untracked] [-a|--all] [<message>]" -msgstr "" -"git stash save [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]\n" -" [-u|--include-untracked] [-a|--all] [<消æ¯>]" +msgid "git stash create [<message>]" +msgstr "git stash create [<消æ¯>]" #: builtin/stash.c #, c-format @@ -15379,10 +15471,6 @@ msgid "don't fetch new objects from the remote site" msgstr "ä¸è¦ä»Žè¿œç¨‹åœ°å€èŽ·å–æ–°å¯¹è±¡" #: builtin/submodule--helper.c -msgid "path into the working tree" -msgstr "到工作区的路径" - -#: builtin/submodule--helper.c msgid "use the 'checkout' update strategy (default)" msgstr "使用 'checkout' æ›´æ–°ç–略(默认)" @@ -15427,34 +15515,10 @@ msgstr "" "径>...]" #: builtin/submodule--helper.c -msgid "recurse into submodules" -msgstr "åœ¨åæ¨¡ç»„ä¸é€’å½’" - -#: builtin/submodule--helper.c msgid "git submodule absorbgitdirs [<options>] [<path>...]" msgstr "git submodule absorbgitdirs [<选项>] [<路径>...]" #: builtin/submodule--helper.c -msgid "check if it is safe to write to the .gitmodules file" -msgstr "检查写入 .gitmodules 文件是å¦å®‰å…¨" - -#: builtin/submodule--helper.c -msgid "unset the config in the .gitmodules file" -msgstr "å–æ¶ˆ .gitmodules 文件ä¸çš„设置" - -#: builtin/submodule--helper.c -msgid "git submodule--helper config <name> [<value>]" -msgstr "git submodule--helper config <åç§°> [<值>]" - -#: builtin/submodule--helper.c -msgid "git submodule--helper config --unset <name>" -msgstr "git submodule--helper config --unset <åç§°>" - -#: builtin/submodule--helper.c -msgid "please make sure that the .gitmodules file is in the working tree" -msgstr "请确认 .gitmodules 文件在工作区里" - -#: builtin/submodule--helper.c msgid "suppress output for setting url of a submodule" msgstr "æŠ‘åˆ¶è®¾ç½®åæ¨¡ç»„ URL 的输出" @@ -15548,6 +15612,10 @@ msgid "unable to checkout submodule '%s'" msgstr "æ— æ³•æ£€å‡ºåæ¨¡ç»„ '%s'" #: builtin/submodule--helper.c +msgid "please make sure that the .gitmodules file is in the working tree" +msgstr "请确认 .gitmodules 文件在工作区里" + +#: builtin/submodule--helper.c #, c-format msgid "Failed to add submodule '%s'" msgstr "æ— æ³•æ·»åŠ åæ¨¡ç»„ '%s'" @@ -15608,23 +15676,26 @@ msgstr "仓库 URL:'%s' 必须是ç»å¯¹è·¯å¾„或以 ./|../ èµ·å§‹" msgid "'%s' is not a valid submodule name" msgstr "'%s' 䏿˜¯ä¸€ä¸ªæœ‰æ•ˆçš„忍¡ç»„åç§°" +#: builtin/submodule--helper.c +msgid "git submodule--helper <command>" +msgstr "git submodule--helper <命令>" + #: builtin/submodule--helper.c git.c #, c-format msgid "%s doesn't support --super-prefix" msgstr "%s 䏿”¯æŒ --super-prefix" -#: builtin/submodule--helper.c -#, c-format -msgid "'%s' is not a valid submodule--helper subcommand" -msgstr "'%s' 䏿˜¯ä¸€ä¸ªæœ‰æ•ˆçš„ submodule--helper å命令" +#: builtin/symbolic-ref.c +msgid "git symbolic-ref [-m <reason>] <name> <ref>" +msgstr "git symbolic-ref [-m <ç†ç”±>] <åç§°> <引用>" #: builtin/symbolic-ref.c -msgid "git symbolic-ref [<options>] <name> [<ref>]" -msgstr "git symbolic-ref [<选项>] <åç§°> [<引用>]" +msgid "git symbolic-ref [-q] [--short] [--no-recurse] <name>" +msgstr "git symbolic-ref [-q] [--short] [--no-recurse] <åç§°>" #: builtin/symbolic-ref.c -msgid "git symbolic-ref -d [-q] <name>" -msgstr "git symbolic-ref -d [-q] <åç§°>" +msgid "git symbolic-ref --delete [-q] <name>" +msgstr "git symbolic-ref --delete [-q] <åç§°>" #: builtin/symbolic-ref.c msgid "suppress error message for non-symbolic (detached) refs" @@ -15638,6 +15709,10 @@ msgstr "åˆ é™¤ç¬¦å·å¼•用" msgid "shorten ref output" msgstr "缩çŸå¼•用输出" +#: builtin/symbolic-ref.c +msgid "recursively dereference (default)" +msgstr "递归解引用(默认)" + #: builtin/symbolic-ref.c builtin/update-ref.c msgid "reason" msgstr "åŽŸå› " @@ -15648,11 +15723,11 @@ msgstr "æ›´æ–°çš„åŽŸå› " #: builtin/tag.c msgid "" -"git tag [-a | -s | -u <key-id>] [-f] [-m <msg> | -F <file>]\n" -" <tagname> [<head>]" +"git tag [-a | -s | -u <key-id>] [-f] [-m <msg> | -F <file>] [-e]\n" +" <tagname> [<commit> | <object>]" msgstr "" -"git tag [-a | -s | -u <key-id>] [-f] [-m <消æ¯> | -F <文件>]\n" -" <æ ‡ç¾å> [<头>]" +"git tag [-a | -s | -u <ç§é’¥ ID>] [-f] [-m <消æ¯> | -F <文件>] [-e]\n" +" <æ ‡ç¾å> [<æäº¤> | <对象>]" #: builtin/tag.c msgid "git tag -d <tagname>..." @@ -15660,14 +15735,15 @@ msgstr "git tag -d <æ ‡ç¾å>..." #: builtin/tag.c msgid "" -"git tag -l [-n[<num>]] [--contains <commit>] [--no-contains <commit>] [--" -"points-at <object>]\n" -" [--format=<format>] [--merged <commit>] [--no-merged <commit>] " -"[<pattern>...]" +"git tag [-n[<num>]] -l [--contains <commit>] [--no-contains <commit>]\n" +" [--points-at <object>] [--column[=<options>] | --no-column]\n" +" [--create-reflog] [--sort=<key>] [--format=<format>]\n" +" [--merged <commit>] [--no-merged <commit>] [<pattern>...]" msgstr "" -"git tag -l [-n[<æ•°å—>]] [--contains <æäº¤>] [--no-contains <æäº¤>] [--points-" -"at <对象>]\n" -" [--format=<æ ¼å¼>] [--merged <æäº¤>] [--no-merged <æäº¤>] [<模å¼>...]" +"git tag [-n[<æ•°å—>]] -l [--contains <æäº¤>] [--no-contains <æäº¤>]\n" +" [--points-at <对象>] [--column[=<选项>] | --no-column]\n" +" [--create-reflog] [--sort=<é”®>] [--format=<æ ¼å¼>]\n" +" [--merged <æäº¤>] [--no-merged <æäº¤>] [<模å¼>...]" #: builtin/tag.c msgid "git tag -v [--format=<format>] <tagname>..." @@ -16139,8 +16215,12 @@ msgid "update the info files from scratch" msgstr "从头开始更新文件信æ¯" #: builtin/upload-pack.c -msgid "git upload-pack [<options>] <dir>" -msgstr "git upload-pack [<选项>] <目录>" +msgid "" +"git-upload-pack [--[no-]strict] [--timeout=<n>] [--stateless-rpc]\n" +" [--advertise-refs] <directory>" +msgstr "" +"git-upload-pack [--[no-]strict] [--timeout=<n>] [--stateless-rpc]\n" +" [--advertise-refs] <目录>" #: builtin/upload-pack.c t/helper/test-serve-v2.c msgid "quit after a single request/response exchange" @@ -16159,8 +16239,8 @@ msgid "interrupt transfer after <n> seconds of inactivity" msgstr "䏿´»åЍ <n> ç§’é’ŸåŽç»ˆæ¢ä¼ 输" #: builtin/verify-commit.c -msgid "git verify-commit [-v | --verbose] <commit>..." -msgstr "git verify-commit [-v | --verbose] <æäº¤>..." +msgid "git verify-commit [-v | --verbose] [--raw] <commit>..." +msgstr "git verify-commit [-v | --verbose] [--raw] <æäº¤>..." #: builtin/verify-commit.c msgid "print commit contents" @@ -16171,8 +16251,8 @@ msgid "print raw gpg status output" msgstr "打å°åŽŸå§‹ gpg 状æ€è¾“出" #: builtin/verify-pack.c -msgid "git verify-pack [-v | --verbose] [-s | --stat-only] <pack>..." -msgstr "git verify-pack [-v | --verbose] [-s | --stat-only] <包>..." +msgid "git verify-pack [-v | --verbose] [-s | --stat-only] [--] <pack>.idx..." +msgstr "git verify-pack [-v | --verbose] [-s | --stat-only] [--] <包>.idx..." #: builtin/verify-pack.c msgid "verbose" @@ -16183,44 +16263,48 @@ msgid "show statistics only" msgstr "åªæ˜¾ç¤ºç»Ÿè®¡" #: builtin/verify-tag.c -msgid "git verify-tag [-v | --verbose] [--format=<format>] <tag>..." -msgstr "git verify-tag [-v | --verbose] [--format=<æ ¼å¼>] <æ ‡ç¾>..." +msgid "git verify-tag [-v | --verbose] [--format=<format>] [--raw] <tag>..." +msgstr "git verify-tag [-v | --verbose] [--format=<æ ¼å¼>] [--raw] <æ ‡ç¾>..." #: builtin/verify-tag.c msgid "print tag contents" msgstr "æ‰“å°æ ‡ç¾å†…容" #: builtin/worktree.c -msgid "git worktree add [<options>] <path> [<commit-ish>]" -msgstr "git worktree add [<选项>] <路径> [<æäº¤>]" +msgid "" +"git worktree add [-f] [--detach] [--checkout] [--lock [--reason <string>]]\n" +" [-b <new-branch>] <path> [<commit-ish>]" +msgstr "" +"git worktree add [-f] [--detach] [--checkout] [--lock [--reason <å—符串>]]\n" +" [-b <新分支>] <路径> [<æäº¤å·>]" #: builtin/worktree.c -msgid "git worktree list [<options>]" -msgstr "git worktree list [<选项>]" +msgid "git worktree list [-v | --porcelain [-z]]" +msgstr "git worktree list [-v | --porcelain [-z]]" #: builtin/worktree.c -msgid "git worktree lock [<options>] <path>" -msgstr "git worktree lock [<选项>] <路径>" +msgid "git worktree lock [--reason <string>] <worktree>" +msgstr "git worktree lock [--reason <å—符串>] <工作区>" #: builtin/worktree.c msgid "git worktree move <worktree> <new-path>" msgstr "git worktree move <工作区> <新路径>" #: builtin/worktree.c -msgid "git worktree prune [<options>]" -msgstr "git worktree prune [<选项>]" +msgid "git worktree prune [-n] [-v] [--expire <expire>]" +msgstr "git worktree prune [-n] [-v] [--expire <过期>]" #: builtin/worktree.c -msgid "git worktree remove [<options>] <worktree>" -msgstr "git worktree remove [<选项>] <工作区>" +msgid "git worktree remove [-f] <worktree>" +msgstr "git worktree remove [-f] <工作区>" #: builtin/worktree.c msgid "git worktree repair [<path>...]" msgstr "git worktree repair [<路径>...]" #: builtin/worktree.c -msgid "git worktree unlock <path>" -msgstr "git worktree unlock <路径>" +msgid "git worktree unlock <worktree>" +msgstr "git worktree unlock <工作区>" #: builtin/worktree.c #, c-format @@ -16505,6 +16589,11 @@ msgid "core.fsyncMethod = batch is unsupported on this platform" msgstr "core.fsyncMethod = batch 䏿”¯æŒæœ¬å¹³å°" #: bundle-uri.c +#, c-format +msgid "bundle list at '%s' has no mode" +msgstr "在 '%s' 的归档包列表没有模å¼" + +#: bundle-uri.c msgid "failed to create temporary file" msgstr "æ— æ³•åˆ›å»ºä¸´æ—¶æ–‡ä»¶" @@ -16514,18 +16603,35 @@ msgstr "缺ä¹èƒ½åŠ›" #: bundle-uri.c #, c-format +msgid "unrecognized bundle mode from URI '%s'" +msgstr "ä¸å¯è¾¨è®¤çš„å½’æ¡£åŒ…æ¨¡å¼æ¥è‡ª URI '%s'" + +#: bundle-uri.c +#, c-format +msgid "exceeded bundle URI recursion limit (%d)" +msgstr "超过了 URI 递归é™åˆ¶ (%d)" + +#: bundle-uri.c +#, c-format msgid "failed to download bundle from URI '%s'" msgstr "æ— æ³•ä»Ž URI '%s' 下载归档包" #: bundle-uri.c #, c-format -msgid "file at URI '%s' is not a bundle" -msgstr "ä½äºŽ URI '%s' çš„æ–‡ä»¶ä¸æ˜¯å½’档包" +msgid "file at URI '%s' is not a bundle or bundle list" +msgstr "ä½äºŽ URI '%s' çš„æ–‡ä»¶ä¸æ˜¯å½’档包或归档包列表" #: bundle-uri.c -#, c-format -msgid "failed to unbundle bundle from URI '%s'" -msgstr "æ— æ³•ä»Ž URI '%s' 解开归档包" +msgid "bundle-uri: got an empty line" +msgstr "bundle-uri: 获得了空行" + +#: bundle-uri.c +msgid "bundle-uri: line is not of the form 'key=value'" +msgstr "bundle-uri: è¡Œä¸æ˜¯ä»¥ 'key=value' æ ¼å¼" + +#: bundle-uri.c +msgid "bundle-uri: line has empty key or value" +msgstr "bundle-uri: 行有空的键或值" #: bundle.c #, c-format @@ -17280,7 +17386,7 @@ msgid "Chunk-based file formats" msgstr "å—弿–‡ä»¶æ ¼å¼" #: command-list.h -msgid "Git commit graph format" +msgid "Git commit-graph format" msgstr "Git æäº¤å›¾æ ¼å¼" #: command-list.h @@ -17707,6 +17813,11 @@ msgstr "'has_worktree_moved' 䏿œªå¤„ç†çš„æƒ…况:%d" msgid "health thread wait failed [GLE %ld]" msgstr "å¥åº·ç›‘测线程ç‰å¾…失败 [GLE %ld]" +#: compat/fsmonitor/fsm-ipc-darwin.c +#, c-format +msgid "Invalid path: %s" +msgstr "æ— æ•ˆè·¯å¾„ï¼š %s" + #: compat/fsmonitor/fsm-listen-darwin.c msgid "Unable to create FSEventStream." msgstr "æ— æ³•åˆ›å»º FSEventStream。" @@ -17745,12 +17856,32 @@ msgstr "GetOverlappedResult 失败于 '%s' [GLE %ld]" msgid "could not read directory changes [GLE %ld]" msgstr "æ— æ³•èŽ·å–ç›®å½•å˜æ›´ [GLE %ld]" -#: compat/fsmonitor/fsm-settings-win32.c +#: compat/fsmonitor/fsm-path-utils-darwin.c +#, c-format +msgid "opendir('%s') failed" +msgstr "opendir('%s') 失败" + +#: compat/fsmonitor/fsm-path-utils-darwin.c +#, c-format +msgid "lstat('%s') failed" +msgstr "lstat('%s') 失败" + +#: compat/fsmonitor/fsm-path-utils-darwin.c +#, c-format +msgid "strbuf_readlink('%s') failed" +msgstr "strbuf_readlink('%s') 失败" + +#: compat/fsmonitor/fsm-path-utils-darwin.c +#, c-format +msgid "closedir('%s') failed" +msgstr "closedir('%s') 失败" + +#: compat/fsmonitor/fsm-path-utils-win32.c #, c-format msgid "[GLE %ld] unable to open for read '%ls'" msgstr "[GLE %ld] æ— æ³•æ‰“å¼€è¦è¯»å–çš„ '%ls'" -#: compat/fsmonitor/fsm-settings-win32.c +#: compat/fsmonitor/fsm-path-utils-win32.c #, c-format msgid "[GLE %ld] unable to get protocol information for '%ls'" msgstr "[GLE %ld] æ— æ³•èŽ·å– '%ls' çš„åè®®ä¿¡æ¯ " @@ -19719,8 +19850,9 @@ msgstr "虚拟仓库 '%s' 与 fsmonitor ä¸å…¼å®¹" #: fsmonitor-settings.c #, c-format msgid "" -"repository '%s' is incompatible with fsmonitor due to lack of Unix sockets" -msgstr "å› ä¸ºç¼ºå°‘ Unix 套接å—,仓库 '%s' 与 fsmonitor ä¸å…¼å®¹" +"socket directory '%s' is incompatible with fsmonitor due to lack of Unix " +"sockets support" +msgstr "å› ä¸ºç¼ºå°‘ Unix å¥—æŽ¥å—æ”¯æŒï¼Œå¥—接å—目录 '%s' 与 fsmonitor ä¸å…¼å®¹" #: git.c msgid "" @@ -20107,8 +20239,8 @@ msgstr[1] "" "最相似的命令是" #: help.c -msgid "git version [<options>]" -msgstr "git version [<选项>]" +msgid "git version [--build-options]" +msgstr "git version [--build-options]" #: help.c #, c-format @@ -21181,11 +21313,6 @@ msgid "%s: ignoring alternate object stores, nesting too deep" msgstr "%s:忽略备用对象库,嵌套太深" #: object-file.c -#, c-format -msgid "unable to normalize object directory: %s" -msgstr "æ— æ³•è§„èŒƒåŒ–å¯¹è±¡ç›®å½•: %s" - -#: object-file.c msgid "unable to fdopen alternates lockfile" msgstr "æ— æ³• fdopen 替æ¢é”文件" @@ -22194,6 +22321,11 @@ msgstr "promisor-remoteï¼šæ— æ³•å…³é—至 fetch åè¿›ç¨‹çš„æ ‡å‡†è¾“å…¥" msgid "promisor remote name cannot begin with '/': %s" msgstr "promisor 远程åç§°ä¸èƒ½ä»¥ '/' 开始:%s" +#: promisor-remote.c +#, c-format +msgid "could not fetch %s from promisor remote" +msgstr "æ— æ³•ä»Žæ‰¿è¯ºè€…è¿œç¨‹èŽ·å– %s" + #: protocol-caps.c msgid "object-info: expected flush after arguments" msgstr "object-infoï¼šåœ¨å‚æ•°ä¹‹åŽåº”有一个 flush" @@ -23468,6 +23600,15 @@ msgstr "æ— æ³•æ‰¾åˆ° %s 指å‘çš„æ ‘" #: revision.c #, c-format +msgid "unsupported section for hidden refs: %s" +msgstr "䏿”¯æŒçš„éšè—引用片段: %s" + +#: revision.c +msgid "--exclude-hidden= passed more than once" +msgstr "--exclude-hidden= ä¼ é€’äº†ä¸æ¢ä¸€æ¬¡" + +#: revision.c +#, c-format msgid "resolve-undo records `%s` which is missing" msgstr "resolve-undo 记录 `%s`,现缺失" @@ -23653,6 +23794,16 @@ msgstr "--all 或者 <登记>ï¼Œè€Œä¸æ˜¯ä¸¤ä¸ªä¸€èµ·" #: scalar.c #, c-format +msgid "could not remove stale scalar.repo '%s'" +msgstr "æ— æ³•åˆ é™¤è¿‡æœŸçš„ scalar.repo '%s'" + +#: scalar.c +#, c-format +msgid "removing stale scalar.repo '%s'" +msgstr "æ£åœ¨åˆ 除过期的 scalar.repo '%s'" + +#: scalar.c +#, c-format msgid "git repository gone in '%s'" msgstr "在 '%s' çš„ git 仓库已消失" @@ -24398,6 +24549,11 @@ msgid "illegal label name: '%.*s'" msgstr "éžæ³•çš„æ ‡ç¾å称:'%.*s'" #: sequencer.c +#, c-format +msgid "could not resolve '%s'" +msgstr "æ— æ³•è§£æž '%s'" + +#: sequencer.c msgid "writing fake root commit" msgstr "å†™ä¼ªæ ¹æäº¤" @@ -24406,11 +24562,6 @@ msgid "writing squash-onto" msgstr "写入 squash-onto" #: sequencer.c -#, c-format -msgid "could not resolve '%s'" -msgstr "æ— æ³•è§£æž '%s'" - -#: sequencer.c msgid "cannot merge without a current revision" msgstr "没有当å‰ç‰ˆæœ¬ä¸èƒ½åˆå¹¶" @@ -25123,6 +25274,18 @@ msgstr "ls-tree 返回未知返回值 %d" msgid "failed to lstat '%s'" msgstr "æ— æ³•æ‰§è¡Œ lstat '%s'" +#: t/helper/test-cache-tree.c +msgid "test-tool cache-tree <options> (control|prime|update)" +msgstr "test-tool cache-tree <选项> (control|prime|update)" + +#: t/helper/test-cache-tree.c +msgid "clear the cache tree before each iteration" +msgstr "åœ¨æ¯æ¬¡è¿ä»£å‰æ¸…é™¤ç¼“å˜æ ‘" + +#: t/helper/test-cache-tree.c +msgid "number of entries in the cache tree to invalidate (default 0)" +msgstr "ç¼“å˜æ ‘䏿— 效化的æ¡ç›®æ•°é‡ï¼ˆé»˜è®¤ 0)" + #: t/helper/test-fast-rebase.c msgid "unhandled options" msgstr "未处ç†çš„选项" diff --git a/po/zh_TW.po b/po/zh_TW.po index 29b8089141..aa59a8e933 100644 --- a/po/zh_TW.po +++ b/po/zh_TW.po @@ -1,9 +1,11 @@ # Chinese (traditional) translations for Git package # Git 套è£è»Ÿé«”çš„ç¹é«”䏿–‡ç¿»è¯ã€‚ # Copyright (C) 2012-2021 Jiang Xin <worldhello.net AT gmail.com> -# Copyright (C) 2019-2021 Yi-Jyun Pan <pan93412@gmail.com> +# Copyright (C) 2019-2022 Yi-Jyun Pan <pan93412@gmail.com> # This file is distributed under the same license as the Git package. # +# The glossary can be found on https://github.com/l10n-tw/git-glossary +# # Contributors (CN): # - Fangyi Zhou <me AT fangyi.io> # - Jiang Xin <worldhello.net AT gmail.com> @@ -18,12 +20,13 @@ # - Zhuang Ya <zhuangya AT me.com> # # Yi-Jyun Pan <pan93412@gmail.com>, 2021, 2022. +# Kaiyang Wu <self@origincode.me>, 2022. msgid "" msgstr "" "Project-Id-Version: Git\n" "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n" -"POT-Creation-Date: 2022-09-23 21:57+0000\n" -"PO-Revision-Date: 2022-10-01 19:02+0800\n" +"POT-Creation-Date: 2022-12-11 00:28+0800\n" +"PO-Revision-Date: 2022-12-10 17:12+0000\n" "Last-Translator: Yi-Jyun Pan <pan93412@gmail.com>\n" "Language-Team: Chinese (Traditional) <http://weblate.slat.org/projects/git-" "po/git-cli/zh_Hant/>\n" @@ -32,7 +35,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Poedit 3.1.1\n" +"X-Generator: Weblate 4.14.2\n" "X-ZhConverter: ç¹åŒ–姬 dict-f4bc617e-r910 @ 2019/11/16 20:23:12 | https://" "zhconvert.org\n" @@ -64,7 +67,7 @@ msgstr "æ›´æ–°" #: add-interactive.c #, c-format msgid "could not stage '%s'" -msgstr "無法暫å˜ã€Œ%sã€" +msgstr "ç„¡æ³•æš«å˜ â€œ%sâ€" #: add-interactive.c builtin/stash.c reset.c sequencer.c msgid "could not write index" @@ -79,12 +82,12 @@ msgstr[0] "已更新 %d 個路徑\n" #: add-interactive.c git-add--interactive.perl #, c-format, perl-format msgid "note: %s is untracked now.\n" -msgstr "注æ„:%s ç¾å·²ä¸å†è¿½è¹¤ã€‚\n" +msgstr "註:ç¾å·²ä¸å†è¿½è¹¤ %s。\n" #: add-interactive.c apply.c builtin/checkout.c builtin/reset.c #, c-format msgid "make_cache_entry failed for path '%s'" -msgstr "「%sã€è·¯å¾‘執行 make_cache_entry 失敗" +msgstr "å° â€œ%s†路徑執行 make_cache_entry 失敗" #: add-interactive.c git-add--interactive.perl msgid "Revert" @@ -92,13 +95,13 @@ msgstr "還原" #: add-interactive.c msgid "Could not parse HEAD^{tree}" -msgstr "ä¸èƒ½è§£æž HEAD^{樹}" +msgstr "ç„¡æ³•è§£æž HEAD^{tree}" #: add-interactive.c git-add--interactive.perl #, c-format, perl-format msgid "reverted %d path\n" msgid_plural "reverted %d paths\n" -msgstr[0] "還原了 %d 個路徑\n" +msgstr[0] "已還原 %d 個路徑\n" #: add-interactive.c git-add--interactive.perl #, c-format @@ -107,28 +110,28 @@ msgstr "沒有未追蹤的檔案。\n" #: add-interactive.c git-add--interactive.perl msgid "Add untracked" -msgstr "新增未追蹤的" +msgstr "åŠ å…¥æœªè¿½è¹¤é …ç›®" #: add-interactive.c git-add--interactive.perl #, c-format, perl-format msgid "added %d path\n" msgid_plural "added %d paths\n" -msgstr[0] "å¢žåŠ äº† %d 個路徑\n" +msgstr[0] "å·²åŠ å…¥ %d 個路徑\n" #: add-interactive.c #, c-format msgid "ignoring unmerged: %s" -msgstr "忽略未åˆä½µï¼š%s" +msgstr "忽略未åˆä½µé …目:%s" #: add-interactive.c add-patch.c git-add--interactive.perl #, c-format msgid "Only binary files changed.\n" -msgstr "åªæœ‰äºŒé€²ä½æª”案被修改。\n" +msgstr "åªè®Šæ›´äºŒé€²ä½æª”案。\n" #: add-interactive.c add-patch.c git-add--interactive.perl #, c-format msgid "No changes.\n" -msgstr "沒有修改。\n" +msgstr "沒有更動。\n" #: add-interactive.c git-add--interactive.perl msgid "Patch update" @@ -136,19 +139,19 @@ msgstr "修補檔更新" #: add-interactive.c git-add--interactive.perl msgid "Review diff" -msgstr "檢視 diff" +msgstr "檢閱差異" #: add-interactive.c msgid "show paths with changes" -msgstr "顯示有變更的路徑" +msgstr "顯示有更動的路徑" #: add-interactive.c msgid "add working tree state to the staged set of changes" -msgstr "åŠ å…¥å·¥ä½œå€ç‹€æ…‹è‡³æš«å˜åˆ—表" +msgstr "將工作å€ç‹€æ…‹åŠ å…¥è‡³æš«å˜æ›´å‹•集" #: add-interactive.c msgid "revert staged set of changes back to the HEAD version" -msgstr "還原修改的暫å˜é›†è‡³ HEAD 版本" +msgstr "將暫å˜çš„æ›´å‹•集還原回 HEAD 版本" #: add-interactive.c msgid "pick hunks and update selectively" @@ -160,7 +163,7 @@ msgstr "檢視 HEAD åŠç´¢å¼•之間的差異" #: add-interactive.c msgid "add contents of untracked files to the staged set of changes" -msgstr "åŠ å…¥æœªè¿½è¹¤æª”æ¡ˆçš„å…§å®¹è‡³æš«å˜åˆ—表" +msgstr "å°‡æœªè¿½è¹¤æª”æ¡ˆçš„å…§å®¹åŠ å…¥è‡³æ›´å‹•æš«å˜é›†" #: add-interactive.c msgid "Prompt help:" @@ -168,23 +171,23 @@ msgstr "æç¤ºèªªæ˜Žï¼š" #: add-interactive.c msgid "select a single item" -msgstr "鏿“‡å–®ä¸€é …ç›®" +msgstr "é¸å–ä¸€å€‹é …ç›®" #: add-interactive.c msgid "select a range of items" -msgstr "鏿“‡é …目範åœ" +msgstr "é¸å–範åœä¸é …ç›®" #: add-interactive.c msgid "select multiple ranges" -msgstr "鏿“‡å¤šå€‹ç¯„åœ" +msgstr "é¸å–多個範åœ" #: add-interactive.c msgid "select item based on unique prefix" -msgstr "基於唯一å‰ç¶´é¸æ“‡é …ç›®" +msgstr "æ ¹æ“šç¨ç‰¹å‰ç¶´é¸å–é …ç›®" #: add-interactive.c msgid "unselect specified items" -msgstr "å–æ¶ˆé¸æ“‡æŒ‡å®šé …ç›®" +msgstr "å–æ¶ˆé¸å–æŒ‡å®šé …ç›®" #: add-interactive.c msgid "choose all items" @@ -196,15 +199,15 @@ msgstr "(空)完æˆé¸å–" #: add-interactive.c msgid "select a numbered item" -msgstr "鏿“‡ç·¨è™ŸéŽçš„é …ç›®" +msgstr "é¸å–編號éŽçš„é …ç›®" #: add-interactive.c msgid "(empty) select nothing" -msgstr "(空)全ä¸é¸å–" +msgstr "(空)全部ä¸é¸å–" #: add-interactive.c builtin/clean.c git-add--interactive.perl msgid "*** Commands ***" -msgstr "*** 指令 ***" +msgstr "*** 命令 ***" #: add-interactive.c builtin/clean.c git-add--interactive.perl msgid "What now" @@ -212,11 +215,11 @@ msgstr "è«‹é¸æ“‡" #: add-interactive.c git-add--interactive.perl msgid "staged" -msgstr "å¿«å–" +msgstr "已暫å˜" #: add-interactive.c git-add--interactive.perl msgid "unstaged" -msgstr "未快å–" +msgstr "未暫å˜" #: add-interactive.c apply.c builtin/am.c builtin/bugreport.c builtin/clone.c #: builtin/diagnose.c builtin/fetch.c builtin/merge.c builtin/pull.c @@ -236,17 +239,17 @@ msgstr "å†è¦‹ã€‚\n" #: add-patch.c git-add--interactive.perl #, c-format, perl-format msgid "Stage mode change [y,n,q,a,d%s,?]? " -msgstr "æš«å˜æ¨¡å¼è®Šæ›´ [y,n,q,a,d%s,?]? " +msgstr "æš«å˜æ¨¡å¼æ›´å‹• [y,n,q,a,d%s,?]? " #: add-patch.c git-add--interactive.perl #, c-format, perl-format msgid "Stage deletion [y,n,q,a,d%s,?]? " -msgstr "æš«å˜åˆªé™¤è®Šæ›´ [y,n,q,a,d%s,?]? " +msgstr "æš«å˜åˆªé™¤å‹•作 [y,n,q,a,d%s,?]? " #: add-patch.c git-add--interactive.perl #, c-format, perl-format msgid "Stage addition [y,n,q,a,d%s,?]? " -msgstr "æš«å˜æ–°å¢žè®Šæ›´ [y,n,q,a,d%s,?]? " +msgstr "æš«å˜åŠ å…¥å‹•ä½œ [y,n,q,a,d%s,?]? " #: add-patch.c git-add--interactive.perl #, c-format, perl-format @@ -257,7 +260,7 @@ msgstr "æš«å˜æ¤å€å¡Š [y,n,q,a,d%s,?]? " msgid "" "If the patch applies cleanly, the edited hunk will immediately be marked for " "staging." -msgstr "如果修補檔能乾淨地套用,編輯å€å¡Šå°‡ç«‹å³æ¨™è¨˜ç‚ºæš«å˜ã€‚" +msgstr "如果修補檔能完全套用,編輯å€å¡Šå°‡ç«‹å³æ¨™è¨˜ç‚ºæš«å˜ã€‚" #: add-patch.c msgid "" @@ -276,28 +279,28 @@ msgstr "" #: add-patch.c git-add--interactive.perl #, c-format, perl-format msgid "Stash mode change [y,n,q,a,d%s,?]? " -msgstr "å„²è—æ¨¡å¼è®Šæ›´ [y,n,q,a,d%s,?]? " +msgstr "è²¯å˜æ¨¡å¼æ›´å‹• [y,n,q,a,d%s,?]? " #: add-patch.c git-add--interactive.perl #, c-format, perl-format msgid "Stash deletion [y,n,q,a,d%s,?]? " -msgstr "儲è—刪除變更 [y,n,q,a,d%s,?]? " +msgstr "貯å˜åˆªé™¤å‹•作 [y,n,q,a,d%s,?]? " #: add-patch.c git-add--interactive.perl #, c-format, perl-format msgid "Stash addition [y,n,q,a,d%s,?]? " -msgstr "å„²è—æ–°å¢žè®Šæ›´ [y,n,q,a,d%s,?]? " +msgstr "貯å˜åŠ å…¥å‹•ä½œ [y,n,q,a,d%s,?]? " #: add-patch.c git-add--interactive.perl #, c-format, perl-format msgid "Stash this hunk [y,n,q,a,d%s,?]? " -msgstr "å„²è—æ¤å€å¡Š [y,n,q,a,d%s,?]? " +msgstr "è²¯å˜æ¤å€å¡Š [y,n,q,a,d%s,?]? " #: add-patch.c msgid "" "If the patch applies cleanly, the edited hunk will immediately be marked for " "stashing." -msgstr "如果修補檔能乾淨地套用,編輯å€å¡Šå°‡ç«‹å³æ¨™è¨˜ç‚ºå„²è—。" +msgstr "如果修補檔能完全套用,編輯å€å¡Šå°‡ç«‹å³æ¨™è¨˜ç‚ºè²¯å˜ã€‚" #: add-patch.c msgid "" @@ -307,26 +310,26 @@ msgid "" "a - stash this hunk and all later hunks in the file\n" "d - do not stash this hunk or any of the later hunks in the file\n" msgstr "" -"y - å„²è—æ¤å€å¡Š\n" -"n - ä¸è¦å„²è—æ¤å€å¡Š\n" -"q - 離開。ä¸å„²è—æ¤å€å¡ŠåŠå¾Œé¢çš„全部å€å¡Š\n" -"a - å„²è—æ¤å€å¡Šå’Œæœ¬æª”案ä¸å¾Œé¢çš„全部å€å¡Š\n" -"d - ä¸å„²è—æ¤å€å¡Šå’Œæœ¬æª”案ä¸å¾Œé¢çš„全部å€å¡Š\n" +"y - è²¯å˜æ¤å€å¡Š\n" +"n - ä¸è¦è²¯å˜æ¤å€å¡Š\n" +"q - 離開。ä¸è²¯å˜æ¤å€å¡ŠåŠå¾Œé¢çš„全部å€å¡Š\n" +"a - è²¯å˜æ¤å€å¡Šå’Œæœ¬æª”案ä¸å¾Œé¢çš„全部å€å¡Š\n" +"d - ä¸è²¯å˜æ¤å€å¡Šå’Œæœ¬æª”案ä¸å¾Œé¢çš„全部å€å¡Š\n" #: add-patch.c git-add--interactive.perl #, c-format, perl-format msgid "Unstage mode change [y,n,q,a,d%s,?]? " -msgstr "å–æ¶ˆæš«å˜æ¨¡å¼è®Šæ›´ [y,n,q,a,d%s,?]? " +msgstr "å–æ¶ˆæš«å˜æ¨¡å¼æ›´å‹• [y,n,q,a,d%s,?]? " #: add-patch.c git-add--interactive.perl #, c-format, perl-format msgid "Unstage deletion [y,n,q,a,d%s,?]? " -msgstr "å–æ¶ˆæš«å˜åˆªé™¤è®Šæ›´ [y,n,q,a,d%s,?]? " +msgstr "å–æ¶ˆæš«å˜åˆªé™¤å‹•作 [y,n,q,a,d%s,?]? " #: add-patch.c git-add--interactive.perl #, c-format, perl-format msgid "Unstage addition [y,n,q,a,d%s,?]? " -msgstr "å–æ¶ˆæš«å˜æ–°å¢žè®Šæ›´ [y,n,q,a,d%s,?]? " +msgstr "å–æ¶ˆæš«å˜åŠ å…¥å‹•ä½œ [y,n,q,a,d%s,?]? " #: add-patch.c git-add--interactive.perl #, c-format, perl-format @@ -337,7 +340,7 @@ msgstr "å–æ¶ˆæš«å˜æ¤å€å¡Š [y,n,q,a,d%s,?]? " msgid "" "If the patch applies cleanly, the edited hunk will immediately be marked for " "unstaging." -msgstr "如果修補檔能乾淨地套用,編輯å€å¡Šå°‡ç«‹å³æ¨™è¨˜ç‚ºæœªæš«å˜ã€‚" +msgstr "如果修補檔能完全套用,編輯å€å¡Šå°‡ç«‹å³æ¨™è¨˜ç‚ºæœªæš«å˜ã€‚" #: add-patch.c msgid "" @@ -356,17 +359,17 @@ msgstr "" #: add-patch.c git-add--interactive.perl #, c-format, perl-format msgid "Apply mode change to index [y,n,q,a,d%s,?]? " -msgstr "將模å¼è®Šæ›´å¥—用到索引 [y,n,q,a,d%s,?]? " +msgstr "å°‡æ¨¡å¼æ›´å‹•套用到索引 [y,n,q,a,d%s,?]? " #: add-patch.c git-add--interactive.perl #, c-format, perl-format msgid "Apply deletion to index [y,n,q,a,d%s,?]? " -msgstr "將刪除變更套用到索引 [y,n,q,a,d%s,?]? " +msgstr "將刪除動作套用至索引 [y,n,q,a,d%s,?]? " #: add-patch.c git-add--interactive.perl #, c-format, perl-format msgid "Apply addition to index [y,n,q,a,d%s,?]? " -msgstr "套用新增變更至索引 [y,n,q,a,d%s,?]? " +msgstr "å°‡åŠ å…¥å‹•ä½œå¥—ç”¨è‡³ç´¢å¼• [y,n,q,a,d%s,?]? " #: add-patch.c git-add--interactive.perl #, c-format, perl-format @@ -377,7 +380,7 @@ msgstr "å°‡æ¤å€å¡Šå¥—用到索引 [y,n,q,a,d%s,?]? " msgid "" "If the patch applies cleanly, the edited hunk will immediately be marked for " "applying." -msgstr "如果修補檔能乾淨地套用,編輯å€å¡Šå°‡ç«‹å³æ¨™è¨˜ç‚ºå¥—用。" +msgstr "如果修補檔能完全套用,編輯å€å¡Šå°‡ç«‹å³æ¨™è¨˜ç‚ºå¥—用。" #: add-patch.c msgid "" @@ -396,28 +399,28 @@ msgstr "" #: add-patch.c git-add--interactive.perl #, c-format, perl-format msgid "Discard mode change from worktree [y,n,q,a,d%s,?]? " -msgstr "從工作å€ä¸æ¨æ£„模å¼è®Šæ›´ [y,n,q,a,d%s,?]? " +msgstr "å¾žå·¥ä½œå€æ¨æ£„æ¨¡å¼æ›´å‹• [y,n,q,a,d%s,?]? " #: add-patch.c git-add--interactive.perl #, c-format, perl-format msgid "Discard deletion from worktree [y,n,q,a,d%s,?]? " -msgstr "從工作å€ä¸æ¨æ£„刪除變更 [y,n,q,a,d%s,?]? " +msgstr "å¾žå·¥ä½œå€æ¨æ£„刪除動作 [y,n,q,a,d%s,?]? " #: add-patch.c git-add--interactive.perl #, c-format, perl-format msgid "Discard addition from worktree [y,n,q,a,d%s,?]? " -msgstr "放棄工作目錄的新增變更 [y,n,q,a,d%s,?]? " +msgstr "å¾žå·¥ä½œå€æ¨æ£„åŠ å…¥å‹•ä½œ [y,n,q,a,d%s,?]? " #: add-patch.c git-add--interactive.perl #, c-format, perl-format msgid "Discard this hunk from worktree [y,n,q,a,d%s,?]? " -msgstr "從工作å€ä¸æ¨æ£„æ¤å€å¡Š [y,n,q,a,d%s,?]? " +msgstr "å¾žå·¥ä½œå€æ¨æ£„æ¤å€å¡Š [y,n,q,a,d%s,?]? " #: add-patch.c msgid "" "If the patch applies cleanly, the edited hunk will immediately be marked for " "discarding." -msgstr "如果修補檔能乾淨地套用,編輯å€å¡Šå°‡ç«‹å³æ¨™è¨˜ç‚ºæ¨æ£„。" +msgstr "如果修補檔能完全套用,編輯å€å¡Šå°‡ç«‹å³æ¨™è¨˜ç‚ºæ¨æ£„。" #: add-patch.c msgid "" @@ -436,22 +439,22 @@ msgstr "" #: add-patch.c git-add--interactive.perl #, 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,?]? " +msgstr "å¾žç´¢å¼•å’Œå·¥ä½œå€æ¨æ£„æ¨¡å¼æ›´å‹• [y,n,q,a,d%s,?]? " #: add-patch.c git-add--interactive.perl #, c-format, perl-format msgid "Discard deletion from index and worktree [y,n,q,a,d%s,?]? " -msgstr "從索引和工作å€ä¸æ¨æ£„刪除 [y,n,q,a,d%s,?]? " +msgstr "å¾žç´¢å¼•å’Œå·¥ä½œå€æ¨æ£„刪除 [y,n,q,a,d%s,?]? " #: add-patch.c git-add--interactive.perl #, c-format, perl-format msgid "Discard addition from index and worktree [y,n,q,a,d%s,?]? " -msgstr "放棄索引åŠå·¥ä½œç›®éŒ„的新增變更 [y,n,q,a,d%s,?]? " +msgstr "å¾žç´¢å¼•å’Œå·¥ä½œå€æ¨æ£„åŠ å…¥å‹•ä½œ [y,n,q,a,d%s,?]? " #: add-patch.c git-add--interactive.perl #, 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,?]? " +msgstr "å¾žç´¢å¼•å’Œå·¥ä½œå€æ¨æ£„æ¤å€å¡Š [y,n,q,a,d%s,?]? " #: add-patch.c msgid "" @@ -470,17 +473,17 @@ msgstr "" #: add-patch.c git-add--interactive.perl #, 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,?]? " +msgstr "å°‡æ¨¡å¼æ›´å‹•å¥—ç”¨åˆ°ç´¢å¼•å’Œå·¥ä½œå€ [y,n,q,a,d%s,?]? " #: add-patch.c git-add--interactive.perl #, c-format, perl-format msgid "Apply deletion to index and worktree [y,n,q,a,d%s,?]? " -msgstr "å°‡åˆªé™¤è®Šæ›´å¥—ç”¨åˆ°ç´¢å¼•å’Œå·¥ä½œå€ [y,n,q,a,d%s,?]? " +msgstr "å°‡åˆªé™¤å‹•ä½œå¥—ç”¨åˆ°ç´¢å¼•å’Œå·¥ä½œå€ [y,n,q,a,d%s,?]? " #: add-patch.c git-add--interactive.perl #, c-format, perl-format msgid "Apply addition to index and worktree [y,n,q,a,d%s,?]? " -msgstr "套用索引åŠå·¥ä½œç›®éŒ„的新增變更 [y,n,q,a,d%s,?]? " +msgstr "å°‡åŠ å…¥å‹•ä½œå¥—ç”¨åˆ°ç´¢å¼•å’Œå·¥ä½œå€ [y,n,q,a,d%s,?]? " #: add-patch.c git-add--interactive.perl #, c-format, perl-format @@ -504,17 +507,17 @@ msgstr "" #: add-patch.c git-add--interactive.perl #, c-format, perl-format msgid "Apply mode change to worktree [y,n,q,a,d%s,?]? " -msgstr "將模å¼è®Šæ›´å¥—ç”¨åˆ°å·¥ä½œå€ [y,n,q,a,d%s,?]? " +msgstr "å°‡æ¨¡å¼æ›´å‹•å¥—ç”¨åˆ°å·¥ä½œå€ [y,n,q,a,d%s,?]? " #: add-patch.c git-add--interactive.perl #, c-format, perl-format msgid "Apply deletion to worktree [y,n,q,a,d%s,?]? " -msgstr "å°‡åˆªé™¤è®Šæ›´å¥—ç”¨åˆ°å·¥ä½œå€ [y,n,q,a,d%s,?]? " +msgstr "å°‡åˆªé™¤å‹•ä½œå¥—ç”¨åˆ°å·¥ä½œå€ [y,n,q,a,d%s,?]? " #: add-patch.c git-add--interactive.perl #, c-format, perl-format msgid "Apply addition to worktree [y,n,q,a,d%s,?]? " -msgstr "å°‡æ–°å¢žè®Šæ›´å¥—ç”¨åˆ°å·¥ä½œå€ [y,n,q,a,d%s,?]? " +msgstr "å°‡åŠ å…¥å‹•ä½œå¥—ç”¨åˆ°å·¥ä½œå€ [y,n,q,a,d%s,?]? " #: add-patch.c git-add--interactive.perl #, c-format, perl-format @@ -538,20 +541,20 @@ msgstr "" #: add-patch.c #, c-format msgid "could not parse hunk header '%.*s'" -msgstr "無法解æžå€å¡Šæ¨™é '%.*s'" +msgstr "無法解æžå€å¡Šæ¨™é “%.*sâ€" #: add-patch.c msgid "could not parse diff" -msgstr "無法解æžå·®ç•° (diff)" +msgstr "無法解æžå·®ç•°" #: add-patch.c msgid "could not parse colored diff" -msgstr "無法解æžä¸Šè‰²éŽçš„差異 (diff)" +msgstr "無法解æžä¸Šè‰²éŽçš„差異" #: add-patch.c #, c-format msgid "failed to run '%s'" -msgstr "無法執行 '%s'" +msgstr "無法執行 “%sâ€" #: add-patch.c msgid "mismatched output from interactive.diffFilter" @@ -562,7 +565,7 @@ msgid "" "Your filter must maintain a one-to-one correspondence\n" "between its input and output lines." msgstr "" -"æ‚¨çš„éŽæ¿¾å™¨å¿…é ˆåœ¨å…¶è¼¸å…¥åŠè¼¸å‡ºè¡Œ\n" +"æ‚¨çš„éŽæ¿¾å™¨å¿…é ˆåœ¨å…¶è¼¸å…¥åŠè¼¸å‡ºåˆ—\n" "ç¶æŒä¸€å°ä¸€çš„å°æ‡‰é—œä¿‚。" #: add-patch.c @@ -571,7 +574,7 @@ msgid "" "expected context line #%d in\n" "%.*s" msgstr "" -"應有上下文行 #%d æ–¼\n" +"é æœŸåœ¨ä¸‹è¿°ä½ç½®æœ‰ä¸Šä¸‹æ–‡åˆ— #%d:\n" "%.*s" #: add-patch.c @@ -584,12 +587,12 @@ msgid "" msgstr "" "å€å¡Šæœªé‡ç–Šï¼š\n" "%.*s\n" -"\tä¸ä»¥ä¸‹è¿°çµå°¾ï¼š\n" +"\tçµå°¾ä¸æ˜¯ï¼š\n" "%.*s" #: add-patch.c git-add--interactive.perl msgid "Manual hunk edit mode -- see bottom for a quick guide.\n" -msgstr "手動å€å¡Šç·¨è¼¯æ¨¡å¼ -- 檢視底部的快速指å—。\n" +msgstr "手動å€å¡Šç·¨è¼¯æ¨¡å¼â€”—檢視底部的快速指引。\n" #: add-patch.c #, c-format @@ -600,9 +603,9 @@ msgid "" "Lines starting with %c will be removed.\n" msgstr "" "---\n" -"è¦åˆªé™¤ '%c' 開始的行,使其æˆç‚º ' ' 開始的行(上下文)。\n" -"è¦åˆªé™¤ '%c' 開始的行,刪除它們。\n" -"以 %c 開始的行將被刪除。\n" +"è¦åˆªé™¤ “%c†開é 的列,請將列首(上下文)改æˆç©ºç™½ã€‚\n" +"è¦åˆªé™¤ “%c†開é 的列,請直接刪除。\n" +"é–‹é æ˜¯ %c 的列將會被移除。\n" #. #-#-#-#-# git-add--interactive.perl.po #-#-#-#-# #. TRANSLATORS: 'it' refers to the patch mentioned in the previous messages. @@ -612,9 +615,9 @@ msgid "" "edit again. If all lines of the hunk are removed, then the edit is\n" "aborted and the hunk is left unchanged.\n" msgstr "" -"å¦‚æžœæœªä¹¾æ·¨å¥—ç”¨ï¼Œæ‚¨å°±æœ‰æ©Ÿæœƒé‡æ–°ç·¨è¼¯ã€‚\n" -"若刪掉æ¤å€å¡Šçš„å…¨éƒ¨å…§å®¹ï¼Œå‰‡æœƒä¸æ¢\n" -"本次編輯,å€å¡Šå‰‡ä¸æœƒè¢«ä¿®æ”¹ã€‚\n" +"如果沒有完全套用,您å¯ä»¥å†æ¬¡ç·¨è¼¯ã€‚\n" +"若刪掉æ¤å€å¡Šçš„æ‰€æœ‰å…§å®¹ï¼Œå‰‡æœƒä¸æ¢ç·¨è¼¯ï¼Œ\n" +"å€å¡Šå‰‡ä¸æœƒè®Šæ›´ã€‚\n" #: add-patch.c msgid "could not parse hunk header" @@ -622,7 +625,7 @@ msgstr "無法解æžå€å¡Šæ¨™é " #: add-patch.c msgid "'git apply --cached' failed" -msgstr "「git apply --cachedã€å¤±æ•—" +msgstr "“git apply --cached†失敗" #. #-#-#-#-# add-patch.c.po #-#-#-#-# #. TRANSLATORS: do not translate [y/n] @@ -641,15 +644,15 @@ msgstr "「git apply --cachedã€å¤±æ•—" #: add-patch.c git-add--interactive.perl msgid "" "Your edited hunk does not apply. Edit again (saying \"no\" discards!) [y/n]? " -msgstr "未套用編輯å€å¡Šã€‚是å¦é‡æ–°ç·¨è¼¯ï¼ˆè¼¸å…¥ “noâ€ æ¨æ£„ï¼ï¼‰ [y/n]? " +msgstr "未套用您編輯的å€å¡Šã€‚是å¦é‡æ–°ç·¨è¼¯ï¼ˆè¼¸å…¥ “noâ€ æ¨æ£„ï¼ï¼‰ [y/n]? " #: add-patch.c msgid "The selected hunks do not apply to the index!" -msgstr "é¸å–çš„å€å¡Šä¸æœƒå¥—用進索引ï¼" +msgstr "é¸å–çš„å€å¡Šç„¡æ³•套用至索引ï¼" #: add-patch.c git-add--interactive.perl msgid "Apply them to the worktree anyway? " -msgstr "無論如何都è¦å¥—用到工作å€å—Žï¼Ÿ " +msgstr "無論如何都è¦å¥—用到工作å€å—Ž? " #: add-patch.c git-add--interactive.perl msgid "Nothing was applied.\n" @@ -687,20 +690,20 @@ msgstr "沒有下一個å€å¡Š" #: add-patch.c msgid "No other hunks to goto" -msgstr "沒有其它å¯ä¾›è·³è½‰çš„å€å¡Š" +msgstr "沒有其它å¯ä»¥è·³è½‰çš„å€å¡Š" #: add-patch.c git-add--interactive.perl msgid "go to which hunk (<ret> to see more)? " -msgstr "è¦è·³è½‰åˆ°å“ªå€‹å€å¡Šï¼ˆ<Enter> 檢視更多)? " +msgstr "è¦è·³è½‰åˆ°å“ªå€‹å€å¡Šï¼ˆ<ret> 檢視更多)? " #: add-patch.c git-add--interactive.perl msgid "go to which hunk? " -msgstr "跳轉到哪個å€å¡Šï¼Ÿ " +msgstr "跳轉到哪個å€å¡Š? " #: add-patch.c #, c-format msgid "Invalid number: '%s'" -msgstr "無效數å—:'%s'" +msgstr "無效數å—:“%sâ€" #: add-patch.c #, c-format @@ -710,20 +713,20 @@ msgstr[0] "å°ä¸èµ·ï¼Œåªæœ‰ %d 個å¯ç”¨å€å¡Šã€‚" #: add-patch.c msgid "No other hunks to search" -msgstr "沒有其它å¯ä¾›å°‹æ‰¾çš„å€å¡Š" +msgstr "沒有其它å¯ä»¥å°‹æ‰¾çš„å€å¡Š" #: add-patch.c git-add--interactive.perl msgid "search for regex? " -msgstr "使用常è¦è¡¨ç¤ºå¼æœå°‹ï¼Ÿ " +msgstr "使用常è¦è¡¨ç¤ºå¼æœå°‹? " #: add-patch.c #, c-format msgid "Malformed search regexp %s: %s" -msgstr "錯誤的常è¦è¡¨ç¤ºå¼ %s:%s" +msgstr "æ ¼å¼éŒ¯èª¤çš„常è¦è¡¨ç¤ºå¼ %s:%s" #: add-patch.c msgid "No hunk matches the given pattern" -msgstr "沒有和æä¾›æ¨¡å¼ç›¸ç¬¦åˆçš„å€å¡Š" +msgstr "æ²’æœ‰ç¬¦åˆæä¾›æ¨¡å¼çš„å€å¡Š" #: add-patch.c msgid "Sorry, cannot split this hunk" @@ -736,11 +739,11 @@ msgstr "分割為 %d 個å€å¡Šã€‚" #: add-patch.c msgid "Sorry, cannot edit this hunk" -msgstr "å°ä¸èµ·ï¼Œä¸èƒ½ç·¨è¼¯é€™å€‹å€å¡Š" +msgstr "å°ä¸èµ·ï¼Œç„¡æ³•編輯這個å€å¡Š" #: add-patch.c msgid "'git apply' failed" -msgstr "'git apply' 失敗" +msgstr "“git apply†失敗" #: advice.c #, c-format @@ -749,7 +752,7 @@ msgid "" "Disable this message with \"git config advice.%s false\"" msgstr "" "\n" -"請使用「git config advice.%s falseã€ä¾†åœç”¨æ¤è¨Šæ¯" +"請使用 “git config advice.%s false†åœç”¨æ¤è¨Šæ¯" #: advice.c #, c-format @@ -758,56 +761,56 @@ msgstr "%sæç¤ºï¼š%.*s%s\n" #: advice.c msgid "Cherry-picking is not possible because you have unmerged files." -msgstr "無法æ€é¸ï¼Œå› 為您有未åˆä½µçš„æª”案。" +msgstr "無法æ€é¸ï¼Œæœ‰æœªåˆä½µçš„æª”案。" #: advice.c msgid "Committing is not possible because you have unmerged files." -msgstr "無法æäº¤ï¼Œå› 為您有未åˆä½µçš„æª”案。" +msgstr "無法æäº¤ï¼Œæœ‰æœªåˆä½µçš„æª”案。" #: advice.c msgid "Merging is not possible because you have unmerged files." -msgstr "無法åˆä½µï¼Œå› 為您有未åˆä½µçš„æª”案。" +msgstr "無法åˆä½µï¼Œæœ‰æœªåˆä½µçš„æª”案。" #: advice.c msgid "Pulling is not possible because you have unmerged files." -msgstr "無法拉å–ï¼Œå› ç‚ºæ‚¨æœ‰æœªåˆä½µçš„æª”案。" +msgstr "無法拉å–,有未åˆä½µçš„æª”案。" #: advice.c msgid "Reverting is not possible because you have unmerged files." -msgstr "無法還原æäº¤ï¼Œå› 為您有未åˆä½µçš„æª”案。" +msgstr "無法還原æäº¤ï¼Œæœ‰æœªåˆä½µçš„æª”案。" #: advice.c #, c-format msgid "It is not possible to %s because you have unmerged files." -msgstr "無法 %sï¼Œå› ç‚ºæ‚¨æœ‰æœªåˆä½µçš„æª”案。" +msgstr "無法 %s,有未åˆä½µçš„æª”案。" #: advice.c msgid "" "Fix them up in the work tree, and then use 'git add/rm <file>'\n" "as appropriate to mark resolution and make a commit." msgstr "" -"è«‹åœ¨å·¥ä½œå€æ”¹æ£æª”案,然後酌情使用 'git add/rm <檔案>' 指令標記\n" -"解決方案並æäº¤ã€‚" +"請在工作å€ä¿®æ£æª”案,然後視情æ³ä½¿ç”¨ “git add/rm <file>â€\n" +"命令標記解決方案並æäº¤ã€‚" #: advice.c msgid "Exiting because of an unresolved conflict." -msgstr "å› ç‚ºå˜åœ¨æœªè§£æ±ºçš„è¡çªè€Œé›¢é–‹ã€‚" +msgstr "å˜åœ¨æœªè§£æ±ºçš„è¡çªï¼Œé›¢é–‹ã€‚" #: advice.c builtin/merge.c msgid "You have not concluded your merge (MERGE_HEAD exists)." -msgstr "æ‚¨å°šæœªçµæŸæ‚¨çš„åˆä½µï¼ˆå˜åœ¨ MERGE_HEAD)。" +msgstr "åˆä½µå°šæœªçµæŸï¼ˆæœ‰ MERGE_HEAD)。" #: advice.c msgid "Please, commit your changes before merging." -msgstr "請在åˆä½µå‰å…ˆæäº¤æ‚¨çš„修改。" +msgstr "請在åˆä½µå‰å…ˆæäº¤æ‚¨çš„æ›´å‹•。" #: advice.c msgid "Exiting because of unfinished merge." -msgstr "å› ç‚ºå˜åœ¨æœªå®Œæˆçš„åˆä½µè€Œé›¢é–‹ã€‚" +msgstr "å˜åœ¨æœªå®Œæˆçš„åˆä½µï¼Œé›¢é–‹ã€‚" #: advice.c msgid "Not possible to fast-forward, aborting." -msgstr "無法快轉,終æ¢ã€‚" +msgstr "ç„¡æ³•å¿«è½‰ï¼Œä¸æ¢ã€‚" #: advice.c #, c-format @@ -852,18 +855,18 @@ msgid "" "false\n" "\n" msgstr "" -"注æ„:æ£åœ¨åˆ‡æ›åˆ° '%s'。\n" +"註:切æ›è‡³ “%sâ€ã€‚\n" "\n" -"您æ£è™•æ–¼åˆ†é›¢é–‹é æŒ‡æ¨™ç‹€æ…‹ã€‚您å¯ä»¥æª¢è¦–ã€é€²è¡Œå¯¦é©—性修改並æäº¤ï¼Œ\n" -"而且您å¯ä»¥åœ¨åˆ‡æ›å›žä¸€å€‹åˆ†æ”¯æ™‚,\n" -"æ¨æ£„在æ¤ç‹€æ…‹ä¸‹æ‰€åšçš„æäº¤è€Œä¸å°åˆ†æ”¯é€ æˆå½±éŸ¿ã€‚\n" +"您æ£è™•於「分離 HEADã€ç‹€æ…‹ã€‚您å¯ä»¥æª¢è¦–ã€é€²è¡Œå¯¦é©—性修改並æäº¤ï¼Œ\n" +"而且您å¯ä»¥åœ¨åˆ‡å›žåˆ†æ”¯æ™‚ï¼Œæ¨æ£„在æ¤ç‹€æ…‹ä¸‹æ‰€åšçš„æäº¤\n" +"而ä¸å°åˆ†æ”¯é€ æˆå½±éŸ¿ã€‚\n" "\n" "如果您想è¦é€éŽå»ºç«‹åˆ†æ”¯ä¾†ä¿ç•™åœ¨æ¤ç‹€æ…‹ä¸‹æ‰€åšçš„æäº¤ï¼Œ\n" "您å¯ä»¥ç¾åœ¨æˆ–ç¨å¾Œåœ¨ switch 指令使用 -c é¸é …。例如:\n" "\n" " git switch -c <新分支å稱>\n" "\n" -"或者是復原æ¤å‹•作:\n" +"或者是使用下述命令復原æ¤å‹•作:\n" "\n" " git switch -\n" "\n" @@ -887,26 +890,31 @@ msgid "" "* Use \"git sparse-checkout reapply\" to apply the sparsity rules" msgstr "" "è‹¥è¦æ›´æ£é€™äº›è·¯å¾‘的稀ç–狀態,請:\n" -"* 使用 `git add --sparse <路徑>` 更新索引\n" -"* 使用 `git sparse-checkout reapply` 套用稀ç–è¦å‰‡" +"* 使用 “git add --sparse <路徑†更新索引\n" +"* 使用 “git sparse-checkout reapply†套用稀ç–è¦å‰‡" #: alias.c msgid "cmdline ends with \\" -msgstr "指令列以 \\ çµå°¾" +msgstr "命令列以 \\ çµå°¾" #: alias.c msgid "unclosed quote" msgstr "未閉åˆçš„引號" +#: alias.c builtin/cat-file.c builtin/notes.c builtin/prune-packed.c +#: builtin/receive-pack.c builtin/tag.c +msgid "too many arguments" +msgstr "引數éŽå¤š" + #: apply.c #, c-format msgid "unrecognized whitespace option '%s'" -msgstr "無法è˜åˆ¥çš„空白å—å…ƒé¸é … '%s'" +msgstr "空白å—å…ƒé¸é … “%s†無法è˜åˆ¥" #: apply.c #, c-format msgid "unrecognized whitespace ignore option '%s'" -msgstr "無法è˜åˆ¥çš„空白å—元忽略é¸é … '%s'" +msgstr "空白å—元忽略é¸é … “%s†無法è˜åˆ¥" #: apply.c archive.c builtin/add.c builtin/branch.c builtin/checkout.c #: builtin/clone.c builtin/commit.c builtin/describe.c builtin/diff-tree.c @@ -918,12 +926,12 @@ msgstr "無法è˜åˆ¥çš„空白å—元忽略é¸é … '%s'" #: builtin/tag.c builtin/worktree.c parse-options.c range-diff.c revision.c #, c-format msgid "options '%s' and '%s' cannot be used together" -msgstr "ä¸èƒ½åŒæ™‚使用 '%s' å’Œ '%s' é¸é …" +msgstr "ç„¡æ³•åŒæ™‚使用 “%s†和 “%s†é¸é …" #: apply.c #, c-format msgid "'%s' outside a repository" -msgstr "'%s' 在版本庫之外" +msgstr "“%s†在版本庫之外" #: apply.c #, c-format @@ -933,42 +941,42 @@ msgstr "無法準備時間戳常è¦è¡¨ç¤ºå¼ %s" #: apply.c #, c-format msgid "regexec returned %d for input: %s" -msgstr "regexec 返回 %d,輸入為:%s" +msgstr "regexec 回傳 %d,輸入為:%s" #: apply.c #, c-format msgid "unable to find filename in patch at line %d" -msgstr "ä¸èƒ½åœ¨ä¿®è£œæª”的第 %d 行找到檔案å" +msgstr "無法在修補檔的第 %d 列找到檔案å稱" #: apply.c #, c-format msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d" -msgstr "git apply:錯誤的 git-diff - 應為 /dev/null,但在第 %2$d 行得到 %1$s" +msgstr "git apply:無效的 git-diff — 應為 /dev/null,但在第 %2$d 列得到 %1$s" #: apply.c #, c-format msgid "git apply: bad git-diff - inconsistent new filename on line %d" -msgstr "git apply:錯誤的 git-diff - 第 %d 行上新檔案åä¸ä¸€è‡´" +msgstr "git apply:無效的 git-diff — 第 %d 列的新檔案å稱ä¸ä¸€è‡´" #: apply.c #, c-format msgid "git apply: bad git-diff - inconsistent old filename on line %d" -msgstr "git apply:錯誤的 git-diff - 第 %d 行上舊檔案åä¸ä¸€è‡´" +msgstr "git apply:無效的 git-diff — 第 %d 列上舊檔案å稱ä¸ä¸€è‡´" #: apply.c #, c-format msgid "git apply: bad git-diff - expected /dev/null on line %d" -msgstr "git apply:錯誤的 git-diff - 第 %d 行處應為 /dev/null" +msgstr "git apply:無效的 git-diff — 第 %d åˆ—è™•é æœŸæ˜¯ /dev/null" #: apply.c #, c-format msgid "invalid mode on line %d: %s" -msgstr "第 %d 行包å«ç„¡æ•ˆæª”案模å¼ï¼š%s" +msgstr "第 %d 列包å«ç„¡æ•ˆæª”案模å¼ï¼š%s" #: apply.c #, c-format msgid "inconsistent header lines %d and %d" -msgstr "ä¸ä¸€è‡´çš„æª”案é ,%d 行和 %d 行" +msgstr "ä¸ä¸€è‡´çš„æª”案標é (%d 列和 %d 列)" #: apply.c #, c-format @@ -978,22 +986,22 @@ msgid "" msgid_plural "" "git diff header lacks filename information when removing %d leading pathname " "components (line %d)" -msgstr[0] "當移除 %d 個å‰å°Žè·¯å¾‘後 git diff é ç¼ºä¹æª”案å訊æ¯ï¼ˆç¬¬ %d 行)" +msgstr[0] "移除 %d 個å‰å°Žè·¯å¾‘部分後,git diff 標é 缺少檔案å稱資訊(第 %d 列)" #: apply.c #, c-format msgid "git diff header lacks filename information (line %d)" -msgstr "git diff 的標é 訊æ¯ä¸ç¼ºä¹æª”案å訊æ¯ï¼ˆç¬¬ %d 行)" +msgstr "git diff 標é 缺少檔案å稱資訊(第 %d 列)" #: apply.c #, c-format msgid "recount: unexpected line: %.*s" -msgstr "recount:æ„外的行:%.*s" +msgstr "recount:é‡åˆ°éžé 期的列:%.*s" #: apply.c #, c-format msgid "patch fragment without header at line %d: %.*s" -msgstr "第 %d 行的修補檔å€å¡Šæ²’有標é 訊æ¯ï¼š%.*s" +msgstr "第 %d åˆ—çš„ä¿®è£œæª”å€æ®µæ²’有標é :%.*s" #: apply.c msgid "new file depends on old contents" @@ -1006,7 +1014,7 @@ msgstr "åˆªé™¤çš„æª”æ¡ˆä»æœ‰å…§å®¹" #: apply.c #, c-format msgid "corrupt patch at line %d" -msgstr "修補檔在第 %d è¡Œç™¼ç¾æå£ž" +msgstr "修補檔在第 %d åˆ—ç™¼ç¾æå£ž" #: apply.c #, c-format @@ -1026,17 +1034,17 @@ msgstr "** è¦å‘Šï¼šæª”案 %s æˆç‚ºç©ºæª”案但並未刪除" #: apply.c #, c-format msgid "corrupt binary patch at line %d: %.*s" -msgstr "二進ä½ä¿®è£œæª”在第 %d 行æå£žï¼š%.*s" +msgstr "二進ä½ä¿®è£œæª”在第 %d 列æå£žï¼š%.*s" #: apply.c #, c-format msgid "unrecognized binary patch at line %d" -msgstr "無法è˜åˆ¥çš„二進ä½ä¿®è£œæª”使–¼ç¬¬ %d 行" +msgstr "第 %d 列的二進ä½ä¿®è£œæª”無法è˜åˆ¥" #: apply.c #, c-format msgid "patch with only garbage at line %d" -msgstr "修補檔案的第 %d è¡Œåªæœ‰åžƒåœ¾è³‡æ–™" +msgstr "修補檔案的第 %d åˆ—åªæœ‰åžƒåœ¾è³‡æ–™" #: apply.c #, c-format @@ -1046,23 +1054,23 @@ msgstr "無法讀å–ç¬¦è™Ÿé€£çµ %s" #: apply.c #, c-format msgid "unable to open or read %s" -msgstr "ä¸èƒ½é–‹å•Ÿæˆ–è®€å– %s" +msgstr "ç„¡æ³•é–‹å•Ÿæˆ–è®€å– %s" #: apply.c #, c-format msgid "invalid start of line: '%c'" -msgstr "無效的行首å—元:'%c'" +msgstr "無效的列首å—元:“%câ€" #: apply.c #, c-format msgid "Hunk #%d succeeded at %d (offset %d line)." msgid_plural "Hunk #%d succeeded at %d (offset %d lines)." -msgstr[0] "å€å¡Š #%d æˆåŠŸå¥—ç”¨æ–¼ %d(ä½ç§» %d 行)。" +msgstr[0] "å€å¡Š #%d æˆåŠŸå¥—ç”¨æ–¼ %d(åç§» %d 列)。" #: apply.c #, c-format msgid "Context reduced to (%ld/%ld) to apply fragment at %d" -msgstr "上下文減少到(%ld/%ld)以在第 %d 行套用修補檔å€å¡Š" +msgstr "上下文減少到(%ld/%ld)以在第 %d 列套用修補檔å€å¡Š" #: apply.c #, c-format @@ -1076,53 +1084,53 @@ msgstr "" #: apply.c #, c-format msgid "missing binary patch data for '%s'" -msgstr "缺少 '%s' 的二進ä½ä¿®è£œæª”資料" +msgstr "缺少 “%s†的二進ä½ä¿®è£œæª”資料" #: apply.c #, c-format msgid "cannot reverse-apply a binary patch without the reverse hunk to '%s'" -msgstr "ä¸èƒ½åå‘套用一個缺少到 '%s' çš„åå‘資料å€å¡Šçš„二進ä½ä¿®è£œæª”" +msgstr "無法åå‘套用一個缺少至 “%s†的åå‘資料å€å¡Šçš„二進ä½ä¿®è£œæª”" #: apply.c #, c-format msgid "cannot apply binary patch to '%s' without full index line" -msgstr "ä¸èƒ½åœ¨ '%s' 上套用沒有完整索引行的二進ä½ä¿®è£œæª”" +msgstr "無法在 “%s†上套用沒有完整索引列的二進ä½ä¿®è£œæª”" #: apply.c #, c-format msgid "" "the patch applies to '%s' (%s), which does not match the current contents." -msgstr "修補檔套用到 '%s'(%s),但是和目å‰å…§å®¹ä¸ç¬¦åˆã€‚" +msgstr "修補檔è¦å¥—用到 “%sâ€ï¼ˆ%s),但與目å‰å…§å®¹ä¸ç¬¦ã€‚" #: apply.c #, c-format msgid "the patch applies to an empty '%s' but it is not empty" -msgstr "修補檔套用到空檔案 '%s',但其並éžç©ºæª”案" +msgstr "修補檔è¦å¥—用至空檔案 “%sâ€ï¼Œä½†å…¶éžç©ºæª”案" #: apply.c #, c-format msgid "the necessary postimage %s for '%s' cannot be read" -msgstr "ç„¡æ³•è®€å– '%2$s' 必需的目標檔案 %1$s" +msgstr "ç„¡æ³•è®€å– â€œ%2$sâ€ å¿…é ˆçš„ç›®æ¨™æª”æ¡ˆ %1$s" #: apply.c #, c-format msgid "binary patch does not apply to '%s'" -msgstr "二進ä½ä¿®è£œæª”未套用到 '%s'" +msgstr "二進ä½ä¿®è£œæª”未套用到 “%sâ€" #: apply.c #, c-format msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)" -msgstr "到 '%s' 的二進ä½ä¿®è£œæª”ç”¢ç”Ÿäº†ä¸æ£ç¢ºçš„çµæžœï¼ˆæ‡‰ç‚º %s,å»ç‚º %s)" +msgstr "修補 “%s†的二進ä½ä¿®è£œæª”ï¼Œç”¢ç”Ÿäº†ä¸æ£ç¢ºçš„çµæžœï¼ˆé 期 %s,å»ç‚º %s)" #: apply.c #, c-format msgid "patch failed: %s:%ld" -msgstr "打修補檔失敗:%s:%ld" +msgstr "修補失敗:%s:%ld" #: apply.c builtin/mv.c #, c-format msgid "cannot checkout %s" -msgstr "ä¸èƒ½ç°½å‡º %s" +msgstr "無法簽出 %s" #: apply.c midx.c pack-mtimes.c pack-revindex.c setup.c #, c-format @@ -1132,51 +1140,51 @@ msgstr "ç„¡æ³•è®€å– %s" #: apply.c #, c-format msgid "reading from '%s' beyond a symbolic link" -msgstr "讀å–使–¼ç¬¦è™Ÿé€£çµä¸çš„ '%s'" +msgstr "讀å–符號連çµèƒŒå¾Œçš„ “%sâ€" #: apply.c #, c-format msgid "path %s has been renamed/deleted" -msgstr "路徑 %s å·²ç¶“è¢«é‡æ–°å‘½å/刪除" +msgstr "路徑 %s å·²è¢«é‡æ–°å‘½å或刪除" #: apply.c #, c-format msgid "%s: does not exist in index" -msgstr "%s:ä¸å˜åœ¨æ–¼ç´¢å¼•ä¸" +msgstr "%s:ä¸åœ¨ç´¢å¼•ä¸" #: apply.c #, c-format msgid "%s: does not match index" -msgstr "%s:和索引ä¸ç¬¦åˆ" +msgstr "%s:與索引ä¸ç¬¦" #: apply.c msgid "repository lacks the necessary blob to perform 3-way merge." -msgstr "版本庫缺少用來進行三方åˆä½µæ‰€éœ€è¦çš„資料物件。" +msgstr "版本庫缺少用來進行三方åˆä½µï¼Œæ‰€éœ€è¦çš„資料物件。" #: apply.c #, c-format msgid "Performing three-way merge...\n" -msgstr "æ£åœ¨é€²è¡Œä¸‰æ–¹åˆä½µâ‹¯â‹¯\n" +msgstr "æ£åœ¨é€²è¡Œä¸‰æ–¹åˆä½µâ€¦â€¦\n" #: apply.c #, c-format msgid "cannot read the current contents of '%s'" -msgstr "ç„¡æ³•è®€å– '%s' 的目å‰å…§å®¹" +msgstr "ç„¡æ³•è®€å– â€œ%s†目å‰çš„內容" #: apply.c #, c-format msgid "Failed to perform three-way merge...\n" -msgstr "無法進行三方åˆä½µâ‹¯â‹¯\n" +msgstr "無法進行三方åˆä½µâ€¦â€¦\n" #: apply.c #, c-format msgid "Applied patch to '%s' with conflicts.\n" -msgstr "套用修補檔到 '%s' å˜åœ¨è¡çªã€‚\n" +msgstr "å·²å¥—ç”¨å° â€œ%s†的修補檔,但有è¡çªã€‚\n" #: apply.c #, c-format msgid "Applied patch to '%s' cleanly.\n" -msgstr "æˆåŠŸå¥—ç”¨ä¿®è£œæª”åˆ° '%s'。\n" +msgstr "å·²å®Œå…¨å¥—ç”¨å° â€œ%s†的修補檔。\n" #: apply.c #, c-format @@ -1185,7 +1193,7 @@ msgstr "回復至直接套用模å¼â‹¯â‹¯\n" #: apply.c msgid "removal patch leaves file contents" -msgstr "移除修補檔ä»ç•™ä¸‹äº†æª”案內容" +msgstr "ç§»é™¤æ€§çš„ä¿®è£œæª”ä»æœ‰ç•™ä¸‹æª”案內容" #: apply.c #, c-format @@ -1195,117 +1203,117 @@ msgstr "%s:錯誤類型" #: apply.c #, c-format msgid "%s has type %o, expected %o" -msgstr "%s 的類型是 %o,應為 %o" +msgstr "%s 的類型是 %oï¼Œé æœŸæ˜¯ %o" #: apply.c read-cache.c #, c-format msgid "invalid path '%s'" -msgstr "無效路徑 '%s'" +msgstr "路徑 “%s†無效" #: apply.c #, c-format msgid "%s: already exists in index" -msgstr "%s:已經å˜åœ¨æ–¼ç´¢å¼•ä¸" +msgstr "%s:已å˜åœ¨æ–¼ç´¢å¼•ä¸" #: apply.c #, c-format msgid "%s: already exists in working directory" -msgstr "%s:已經å˜åœ¨æ–¼å·¥ä½œå€ä¸" +msgstr "%s:已å˜åœ¨æ–¼å·¥ä½œå€ä¸" #: apply.c #, c-format msgid "new mode (%o) of %s does not match old mode (%o)" -msgstr "%2$s 的新模å¼ï¼ˆ%1$o)和舊模å¼ï¼ˆ%3$o)ä¸ç¬¦åˆ" +msgstr "%2$s çš„æ–°æ¨¡å¼ (%1$o) å’ŒèˆŠæ¨¡å¼ (%3$o) ä¸ç¬¦" #: apply.c #, c-format msgid "new mode (%o) of %s does not match old mode (%o) of %s" -msgstr "%2$s 的新模å¼ï¼ˆ%1$o)和 %4$s 的舊模å¼ï¼ˆ%3$o)ä¸ç¬¦åˆ" +msgstr "%2$s çš„æ–°æ¨¡å¼ (%1$o) å’Œ %4$s çš„èˆŠæ¨¡å¼ (%3$o) ä¸ç¬¦" #: apply.c #, c-format msgid "affected file '%s' is beyond a symbolic link" -msgstr "å—影響的檔案 '%s' 使–¼ç¬¦è™Ÿé€£çµä¸" +msgstr "å—影響的檔案 “%s†在符號連çµå¾Œ" #: apply.c #, c-format msgid "%s: patch does not apply" -msgstr "%s:修補檔未套用" +msgstr "%s:未套用修補檔" #: apply.c #, c-format msgid "Checking patch %s..." -msgstr "æ£åœ¨æª¢æŸ¥ä¿®è£œæª” %s..." +msgstr "æ£åœ¨æª¢æŸ¥ä¿®è£œæª” %s……" #: apply.c #, c-format msgid "sha1 information is lacking or useless for submodule %s" -msgstr "忍¡çµ„ %s çš„ sha1 訊æ¯ç¼ºå°‘或無效" +msgstr "%s 忍¡çµ„缺少 sha1 資訊或沒有幫助" #: apply.c #, c-format msgid "mode change for %s, which is not in current HEAD" -msgstr "%s 的模å¼è®Šæ›´ï¼Œä½†å®ƒä¸åœ¨ç›®å‰ HEAD ä¸" +msgstr "%s çš„æ¨¡å¼æœ‰æ›´å‹•,但其ä¸åœ¨ç›®å‰ HEAD ä¸" #: apply.c #, c-format msgid "sha1 information is lacking or useless (%s)." -msgstr "sha1 訊æ¯ç¼ºå°‘或無效(%s)。" +msgstr "缺少 sha1 資訊或沒有幫助 (%s)。" #: apply.c #, c-format msgid "could not add %s to temporary index" -msgstr "ä¸èƒ½åœ¨æš«æ™‚ç´¢å¼•ä¸æ–°å¢ž %s" +msgstr "無法將 %s åŠ é€²æš«å˜ç´¢å¼•" #: apply.c #, c-format msgid "could not write temporary index to %s" -msgstr "ä¸èƒ½æŠŠæš«æ™‚索引寫入到 %s" +msgstr "無法將暫å˜ç´¢å¼•寫入 %s" #: apply.c #, c-format msgid "unable to remove %s from index" -msgstr "ä¸èƒ½å¾žç´¢å¼•ä¸ç§»é™¤ %s" +msgstr "無法從索引移除 %s" #: apply.c #, c-format msgid "corrupt patch for submodule %s" -msgstr "忍¡çµ„ %s æå£žçš„修補檔" +msgstr "修補 %s 忍¡çµ„的修補檔æå£ž" #: apply.c #, c-format msgid "unable to stat newly created file '%s'" -msgstr "ä¸èƒ½å°å»ºç«‹æª”案 '%s' å‘¼å« stat" +msgstr "無法å°å‰›å»ºç«‹çš„æª”案 “%s†執行 stat" #: apply.c #, c-format msgid "unable to create backing store for newly created file %s" -msgstr "ä¸èƒ½ç‚ºå»ºç«‹æª”案 %s 建立後端儲å˜" +msgstr "無法å°å‰›å»ºç«‹çš„æª”案 %s 建立後端儲å˜" #: apply.c #, c-format msgid "unable to add cache entry for %s" -msgstr "無法為 %s æ–°å¢žå¿«å–æ¢ç›®" +msgstr "無法為 %s åŠ å…¥å¿«å–é …ç›®" #: apply.c builtin/bisect--helper.c builtin/gc.c #, c-format msgid "failed to write to '%s'" -msgstr "寫入 '%s' 失敗" +msgstr "無法寫入 “%sâ€" #: apply.c #, c-format msgid "closing file '%s'" -msgstr "關閉檔案 '%s'" +msgstr "關閉檔案 “%sâ€" #: apply.c #, c-format msgid "unable to write file '%s' mode %o" -msgstr "ä¸èƒ½å¯«å…¥æª”案 '%s' æ¬Šé™ %o" +msgstr "ç„¡æ³•ä»¥æ¨¡å¼ %2$o 寫入 “%1$s†檔案" #: apply.c #, c-format msgid "Applied patch %s cleanly." -msgstr "æˆåŠŸå¥—ç”¨ä¿®è£œæª” %s。" +msgstr "已完全套用 %s 修補檔。" #: apply.c msgid "internal error" @@ -1315,22 +1323,22 @@ msgstr "內部錯誤" #, c-format msgid "Applying patch %%s with %d reject..." msgid_plural "Applying patch %%s with %d rejects..." -msgstr[0] "套用 %%s å€‹ä¿®è£œæª”ï¼Œå…¶ä¸ %d 個被拒絕..." +msgstr[0] "套用 %%s å€‹ä¿®è£œæª”ï¼Œå…¶ä¸ %d 個被拒絕……" #: apply.c #, c-format msgid "truncating .rej filename to %.*s.rej" -msgstr "æˆªçŸ .rej 檔案å為 %.*s.rej" +msgstr "æ£åœ¨å°‡ .rej 檔案å稱截çŸç‚º %.*s.rej" #: apply.c #, c-format msgid "cannot open %s" -msgstr "ä¸èƒ½é–‹å•Ÿ %s" +msgstr "無法開啟 %s" #: apply.c #, c-format msgid "Hunk #%d applied cleanly." -msgstr "æˆåŠŸå¥—ç”¨ç¬¬ #%d 個å€å¡Šã€‚" +msgstr "æˆåŠŸå®Œå…¨å¥—ç”¨ç¬¬ #%d 個å€å¡Šã€‚" #: apply.c #, c-format @@ -1340,20 +1348,20 @@ msgstr "拒絕第 #%d 個å€å¡Šã€‚" #: apply.c #, c-format msgid "Skipped patch '%s'." -msgstr "ç•¥éŽä¿®è£œæª” '%s'。" +msgstr "ç•¥éŽä¿®è£œæª” “%sâ€ã€‚" #: apply.c msgid "No valid patches in input (allow with \"--allow-empty\")" -msgstr "è¼¸å…¥ä¸æ²’有有效的修補檔內容(傳入「--allow-emptyã€å…許)" +msgstr "輸入沒有有效的修補檔內容(傳入 “--allow-empty†å…許æ¤è¡Œç‚ºï¼‰" -#: apply.c +#: apply.c t/helper/test-cache-tree.c msgid "unable to read index file" msgstr "無法讀å–索引檔案" #: apply.c #, c-format msgid "can't open patch '%s': %s" -msgstr "ä¸èƒ½é–‹å•Ÿä¿®è£œæª” '%s':%s" +msgstr "無法開啟修補檔 “%sâ€ï¼š%s" #: apply.c #, c-format @@ -1365,13 +1373,13 @@ msgstr[0] "æŠ‘åˆ¶ä¸‹ä»æœ‰ %d 個空白å—元誤用" #, c-format msgid "%d line adds whitespace errors." msgid_plural "%d lines add whitespace errors." -msgstr[0] "%d 行新增了空白å—元誤用。" +msgstr[0] "%d åˆ—åŠ å…¥äº†ç©ºç™½å—元誤用。" #: apply.c #, c-format msgid "%d line applied after fixing whitespace errors." msgid_plural "%d lines applied after fixing whitespace errors." -msgstr[0] "修復空白錯誤後,套用了 %d 行。" +msgstr[0] "ä¿®æ£ç©ºç™½èª¤ç”¨å¾Œï¼Œå¥—用了 %d 列。" #: apply.c builtin/add.c builtin/mv.c builtin/rm.c msgid "Unable to write new index file" @@ -1379,11 +1387,11 @@ msgstr "無法寫入新索引檔案" #: apply.c msgid "don't apply changes matching the given path" -msgstr "ä¸è¦å¥—ç”¨ç¬¦åˆæä¾›è·¯å¾‘çš„è®Šæ›´" +msgstr "ä¸è¦å¥—ç”¨ç¬¦åˆæä¾›è·¯å¾‘çš„æ›´å‹•" #: apply.c msgid "apply changes matching the given path" -msgstr "å¥—ç”¨ç¬¦åˆæä¾›è·¯å¾‘çš„è®Šæ›´" +msgstr "å¥—ç”¨ç¬¦åˆæä¾›è·¯å¾‘çš„æ›´å‹•" #: apply.c builtin/am.c msgid "num" @@ -1391,19 +1399,19 @@ msgstr "數å—" #: apply.c msgid "remove <num> leading slashes from traditional diff paths" -msgstr "從傳統的 diff 路徑ä¸ç§»é™¤æŒ‡å®šæ•¸é‡çš„å‰å°Žæ–œç·š" +msgstr "從傳統的 diff 路徑ä¸ç§»é™¤ <num> 個å‰å°Žæ–œç·š" #: apply.c msgid "ignore additions made by the patch" -msgstr "忽略修補檔ä¸çš„æ–°å¢žçš„æª”案" +msgstr "忽略修補檔ä¸çš„åŠ å…¥å…§å®¹" #: apply.c msgid "instead of applying the patch, output diffstat for the input" -msgstr "ä¸å¥—用修補檔,而是顯示輸入的差異統計(diffstat)" +msgstr "ä¸å¥—用修補檔,而是顯示輸入的差異統計 (diffstat)" #: apply.c msgid "show number of added and deleted lines in decimal notation" -msgstr "以å進使•¸é¡¯ç¤ºæ–°å¢žå’Œåˆªé™¤çš„行數" +msgstr "以å進使•¸å—ï¼Œé¡¯ç¤ºåŠ å…¥å’Œåˆªé™¤çš„åˆ—æ•¸" #: apply.c msgid "instead of applying the patch, output a summary for the input" @@ -1419,7 +1427,7 @@ msgstr "確èªä¿®è£œæª”å¯ä»¥å¥—用到目å‰ç´¢å¼•" #: apply.c msgid "mark new files with `git add --intent-to-add`" -msgstr "使用指令 `git add --intent-to-add` 標記新增檔案" +msgstr "使用 `git add --intent-to-add` 命令標記新檔案" #: apply.c msgid "apply a patch without touching the working tree" @@ -1431,15 +1439,15 @@ msgstr "接å—修改工作å€ä¹‹å¤–檔案的修補檔" #: apply.c msgid "also apply the patch (use with --stat/--summary/--check)" -msgstr "還套用æ¤ä¿®è£œæª”(與 --stat/--summary/--check é¸é …åŒæ™‚使用)" +msgstr "亦套用修補檔(與 --stat/--summary/--check é¸é …åŒæ™‚使用)" #: apply.c msgid "attempt three-way merge, fall back on normal patch if that fails" -msgstr "嘗試三方åˆä½µã€‚如果失敗,則回到æ£å¸¸ä¿®è£œæª” (patch) 模å¼" +msgstr "嘗試三方åˆä½µï¼Œè‹¥å¤±æ•—則回到æ£å¸¸ä¿®è£œæ¨¡å¼" #: apply.c msgid "build a temporary index based on embedded index information" -msgstr "建立一個暫時索引基於嵌入的索引訊æ¯" +msgstr "組建以嵌入索引資訊為基礎的暫å˜ç´¢å¼•" #: apply.c builtin/checkout-index.c msgid "paths are separated with NUL character" @@ -1447,7 +1455,7 @@ msgstr "路徑以 NUL å—元分隔" #: apply.c msgid "ensure at least <n> lines of context match" -msgstr "確ä¿è‡³å°‘ç¬¦åˆ <n> 行上下文" +msgstr "確ä¿è‡³å°‘ç¬¦åˆ <n> 列上下文" #: apply.c builtin/am.c builtin/interpret-trailers.c builtin/pack-objects.c #: builtin/rebase.c @@ -1456,11 +1464,11 @@ msgstr "動作" #: apply.c msgid "detect new or modified lines that have whitespace errors" -msgstr "檢查新增和修改的行ä¸é–“的空白å—元濫用" +msgstr "檢查新增和修改的列ä¸é–“ï¼Œæ˜¯å¦æœ‰ç©ºç™½å—元誤用" #: apply.c msgid "ignore changes in whitespace when finding context" -msgstr "尋找上下文時忽略空白å—元的變更" +msgstr "尋找上下文時忽略空白å—元更動" #: apply.c msgid "apply the patch in reverse" @@ -1468,23 +1476,23 @@ msgstr "åå‘套用修補檔" #: apply.c msgid "don't expect at least one line of context" -msgstr "無需至少一行上下文" +msgstr "無需至少一列上下文" #: apply.c msgid "leave the rejected hunks in corresponding *.rej files" -msgstr "將拒絕的修補檔å€å¡Šå„²å˜åœ¨å°æ‡‰çš„ *.rej 檔案ä¸" +msgstr "將拒絕的修補檔å€å¡Šï¼Œç•™åœ¨å°æ‡‰çš„ *.rej 檔案ä¸" #: apply.c msgid "allow overlapping hunks" -msgstr "å…許é‡ç–Šçš„修補檔å€å¡Š" +msgstr "å…許é‡ç–Šå€å¡Š" #: apply.c msgid "tolerate incorrectly detected missing new-line at the end of file" -msgstr "å…è¨±ä¸æ£ç¢ºçš„æª”案末尾æ›è¡Œç¬¦è™Ÿ" +msgstr "å…è¨±ä¸æ£ç¢ºçš„æª”案末尾æ›åˆ—符號" #: apply.c msgid "do not trust the line counts in the hunk headers" -msgstr "ä¸ä¿¡ä»»ä¿®è£œæª”å€å¡Šçš„æ¨™é 訊æ¯ä¸çš„行號" +msgstr "ä¸ä¿¡ä»»å€å¡Šæ¨™é ä¸çš„列號" #: apply.c builtin/am.c msgid "root" @@ -1492,21 +1500,21 @@ msgstr "æ ¹ç›®éŒ„" #: apply.c msgid "prepend <root> to all filenames" -msgstr "為所有檔案å剿–°å¢ž <æ ¹ç›®éŒ„>" +msgstr "在所有檔案å稱å‰åŠ ä¸Š <root>" #: apply.c msgid "don't return error for empty patches" -msgstr "é‡åˆ°ç©ºç™½ä¿®è£œæª”時ä¸å›žå‚³éŒ¯èª¤" +msgstr "é‡åˆ°ç©ºç™½ä¿®è£œæª”時,ä¸å›žå‚³éŒ¯èª¤" #: archive-tar.c archive-zip.c #, c-format msgid "cannot stream blob %s" -msgstr "ä¸èƒ½é–‹å•Ÿè³‡æ–™ç‰©ä»¶ %s" +msgstr "無法串æµè³‡æ–™ç‰©ä»¶ %s" #: archive-tar.c archive-zip.c #, c-format msgid "unsupported file mode: 0%o (SHA1: %s)" -msgstr "䏿”¯æ´çš„æª”案模å¼ï¼š0%o (SHA1: %s)" +msgstr "䏿”¯æ´çš„æª”案模å¼ï¼š0%o (SHA1:%s)" #: archive-tar.c archive-zip.c builtin/pack-objects.c #, c-format @@ -1516,16 +1524,16 @@ msgstr "壓縮錯誤 (%d)" #: archive-tar.c #, c-format msgid "unable to start '%s' filter" -msgstr "無法啟動 '%s' éŽæ¿¾å™¨" +msgstr "無法啟動 “%sâ€ éŽæ¿¾å™¨" #: archive-tar.c msgid "unable to redirect descriptor" -msgstr "無法é‡å®šå‘æè¿°ç¬¦" +msgstr "ç„¡æ³•é‡æ–°å°Žå‘æè¿°å…ƒ" #: archive-tar.c #, c-format msgid "'%s' filter reported error" -msgstr "'%s' éŽæ¿¾å™¨å ±å‘Šäº†éŒ¯èª¤" +msgstr "“%sâ€ éŽæ¿¾å™¨å›žå ±éŒ¯èª¤" #: archive-zip.c #, c-format @@ -1535,36 +1543,36 @@ msgstr "è·¯å¾‘ä¸æ˜¯æœ‰æ•ˆçš„ UTF-8:%s" #: archive-zip.c #, c-format msgid "path too long (%d chars, SHA1: %s): %s" -msgstr "路徑太長(%d å—元,SHA1:%s):%s" +msgstr "路徑太長(%d 個å—元,SHA1:%s):%s" #: archive-zip.c #, c-format msgid "timestamp too large for this system: %<PRIuMAX>" -msgstr "å°æ–¼æœ¬ç³»çµ±æ™‚間戳太大:%<PRIuMAX>" +msgstr "å°æœ¬ç³»çµ±è€Œè¨€æ™‚間戳太大:%<PRIuMAX>" #: archive.c msgid "git archive [<options>] <tree-ish> [<path>...]" -msgstr "git archive [<é¸é …>] <樹或æäº¤> [<路徑>...]" +msgstr "git archive [<options>] <tree-ish> [<path>...]" #: archive.c msgid "" "git archive --remote <repo> [--exec <cmd>] [<options>] <tree-ish> [<path>...]" msgstr "" -"git archive --remote <版本庫> [--exec <命令>] [<é¸é …>] <樹或æäº¤> [<路徑>...]" +"git archive --remote <repo> [--exec <cmd>] [<options>] <tree-ish> [<path>...]" #: archive.c msgid "git archive --remote <repo> [--exec <cmd>] --list" -msgstr "git archive --remote <版本庫> [--exec <命令>] --list" +msgstr "git archive --remote <repo> [--exec <cmd>] --list" #: archive.c builtin/gc.c builtin/notes.c builtin/tag.c #, c-format msgid "cannot read '%s'" -msgstr "ä¸èƒ½è®€å– '%s'" +msgstr "ç„¡æ³•è®€å– â€œ%sâ€" #: archive.c builtin/add.c builtin/rm.c #, c-format msgid "pathspec '%s' did not match any files" -msgstr "è·¯å¾‘è¦æ ¼ '%s' 未符åˆä»»ä½•檔案" +msgstr "è·¯å¾‘è¦æ ¼ “%s†未符åˆä»»ä½•檔案" #: archive.c #, c-format @@ -1574,16 +1582,16 @@ msgstr "ç„¡æ¤å¼•用:%.*s" #: archive.c #, c-format msgid "not a valid object name: %s" -msgstr "䏿˜¯ä¸€å€‹æœ‰æ•ˆçš„物件å:%s" +msgstr "éžæœ‰æ•ˆç‰©ä»¶å稱:%s" -#: archive.c +#: archive.c t/helper/test-cache-tree.c #, c-format msgid "not a tree object: %s" -msgstr "䏿˜¯ä¸€å€‹æ¨¹ç‹€ç‰©ä»¶ï¼š%s" +msgstr "éžæ¨¹ç‹€ç‰©ä»¶ï¼š%s" #: archive.c msgid "current working directory is untracked" -msgstr "ç›®å‰å·¥ä½œç›®éŒ„未被追蹤" +msgstr "尚未追蹤目å‰çš„工作目錄" #: archive.c #, c-format @@ -1598,25 +1606,25 @@ msgstr "䏿˜¯ä¸€èˆ¬æª”案:%s" #: archive.c #, c-format msgid "unclosed quote: '%s'" -msgstr "未閉åˆçš„引號:「%sã€" +msgstr "未閉åˆçš„引號:“%sâ€" #: archive.c #, c-format msgid "missing colon: '%s'" -msgstr "缺少冒號:「%sã€" +msgstr "缺少冒號:“%sâ€" #: archive.c #, c-format msgid "empty file name: '%s'" -msgstr "檔案å稱空白:「%sã€" +msgstr "檔案å稱空白:“%sâ€" #: archive.c msgid "fmt" -msgstr "æ ¼å¼" +msgstr "fmt" #: archive.c msgid "archive format" -msgstr "æ¸æª”æ ¼å¼" +msgstr "å°å˜æ ¼å¼" #: archive.c builtin/log.c msgid "prefix" @@ -1624,33 +1632,33 @@ msgstr "å‰ç¶´" #: archive.c msgid "prepend prefix to each pathname in the archive" -msgstr "ç‚ºæ¸æª”䏿¯å€‹è·¯å¾‘ååŠ ä¸Šå‰ç¶´" +msgstr "為å°å˜ä¸çš„æ¯å€‹è·¯å¾‘åç¨±åŠ ä¸Šå‰ç¶´" #: archive.c builtin/blame.c builtin/commit-tree.c builtin/config.c -#: builtin/fast-export.c builtin/grep.c builtin/hash-object.c +#: builtin/fast-export.c builtin/gc.c builtin/grep.c builtin/hash-object.c #: builtin/ls-files.c builtin/notes.c builtin/read-tree.c parse-options.h msgid "file" -msgstr "檔案" +msgstr "file" #: archive.c msgid "add untracked file to archive" -msgstr "å°‡æœªè¿½è¹¤æª”æ¡ˆåŠ å…¥æ¸æª”" +msgstr "å°‡æœªè¿½è¹¤æª”æ¡ˆåŠ é€²å°å˜" #: archive.c msgid "path:content" -msgstr "路徑:內容" +msgstr "path:content" #: archive.c builtin/archive.c msgid "write the archive to this file" -msgstr "æ¸æª”å¯«å…¥æ¤æª”案" +msgstr "å°‡å°å˜å¯«å…¥æ¤æª”案" #: archive.c msgid "read .gitattributes in working directory" -msgstr "讀å–工作å€ä¸çš„ .gitattributes" +msgstr "讀å–工作目錄ä¸çš„ .gitattributes" #: archive.c msgid "report archived files on stderr" -msgstr "åœ¨æ¨™æº–éŒ¯èª¤ä¸Šå ±å‘Šæ¸æª”檔案" +msgstr "在 stderr ä¸Šå›žå ±å°å˜çš„æª”案" #: archive.c msgid "set compression level" @@ -1658,27 +1666,27 @@ msgstr "è¨å®šå£“縮級別" #: archive.c msgid "list supported archive formats" -msgstr "列出支æ´çš„æ¸æª”æ ¼å¼" +msgstr "列出支æ´çš„å°å˜æ ¼å¼" #: archive.c builtin/archive.c builtin/clone.c builtin/submodule--helper.c msgid "repo" -msgstr "版本庫" +msgstr "repo" #: archive.c builtin/archive.c msgid "retrieve the archive from remote repository <repo>" -msgstr "從é 端版本庫(<版本庫>ï¼‰æ“·å–æ¸æª”檔案" +msgstr "從é 端版本庫 <repo> æ“·å–å°å˜æª”案" #: archive.c builtin/archive.c builtin/difftool.c builtin/notes.c msgid "command" -msgstr "指令" +msgstr "command" #: archive.c builtin/archive.c msgid "path to the remote git-upload-archive command" -msgstr "é 端 git-upload-archive 指令的路徑" +msgstr "é 端 git-upload-archive 命令的路徑" #: archive.c msgid "Unexpected option --remote" -msgstr "æœªçŸ¥åƒæ•¸ --remote" +msgstr "éžé 期é¸é … --remote" #: archive.c builtin/add.c builtin/checkout.c builtin/clone.c builtin/commit.c #: builtin/fast-export.c builtin/index-pack.c builtin/log.c builtin/reset.c @@ -1686,26 +1694,26 @@ msgstr "æœªçŸ¥åƒæ•¸ --remote" #: revision.c #, c-format msgid "the option '%s' requires '%s'" -msgstr "「%sã€é¸é …需è¦ã€Œ%sã€" +msgstr "“%s†é¸é …éœ€è¦ â€œ%sâ€" #: archive.c msgid "Unexpected option --output" -msgstr "æœªçŸ¥åƒæ•¸ --output" +msgstr "éžé 期é¸é … --output" #: archive.c #, c-format msgid "Unknown archive format '%s'" -msgstr "æœªçŸ¥æ¸æª”æ ¼å¼ '%s'" +msgstr "å°å˜æ ¼å¼ “%s†未知" #: archive.c #, c-format msgid "Argument not supported for format '%s': -%d" -msgstr "åƒæ•¸ä¸æ”¯æ´æ¤æ ¼å¼ '%s':-%d" +msgstr "å¼•æ•¸ä¸æ”¯æ´ “%sâ€ æ ¼å¼ï¼š-%d" #: attr.c #, c-format msgid "%.*s is not a valid attribute name" -msgstr "%.*s 䏿˜¯ä¸€å€‹æœ‰æ•ˆçš„屬性å" +msgstr "%.*s 䏿˜¯æœ‰æ•ˆçš„屬性å稱" #: attr.c #, c-format @@ -1717,23 +1725,23 @@ msgid "" "Negative patterns are ignored in git attributes\n" "Use '\\!' for literal leading exclamation." msgstr "" -"å呿¨¡å¼åœ¨ git attributes ä¸è¢«å¿½ç•¥\n" -"ç•¶å—串確定è¦ä»¥é©šå˜†è™Ÿé–‹å§‹æ™‚,使用 '\\!'。" +"git attributes 會忽略å呿¨¡å¼\n" +"ç•¶å—串確定è¦ä»¥é©šå˜†è™Ÿé–‹å§‹æ™‚,請使用 “\\!â€ã€‚" #: bisect.c #, c-format msgid "Badly quoted content in file '%s': %s" -msgstr "檔案 '%s' 包å«éŒ¯èª¤çš„å¼•ç”¨æ ¼å¼ï¼š%s" +msgstr "檔案 “%s†包å«ç„¡æ•ˆçš„引用內容:%s" #: bisect.c #, c-format msgid "We cannot bisect more!\n" -msgstr "我們無法進行更多的二分æœå°‹ï¼\n" +msgstr "已經無法繼續二分æœå°‹ï¼\n" #: bisect.c #, c-format msgid "Not a valid commit name %s" -msgstr "䏿˜¯ä¸€å€‹æœ‰æ•ˆçš„æäº¤å %s" +msgstr "%s 䏿˜¯æœ‰æ•ˆçš„æäº¤å稱" #: bisect.c #, c-format @@ -1742,7 +1750,7 @@ msgid "" "This means the bug has been fixed between %s and [%s].\n" msgstr "" "åˆä½µåŸºç¤Ž %s 是壞的。\n" -"這æ„味著介於 %s å’Œ [%s] 之間的 bug 已經被修復。\n" +"這æ„味著 bug 已經在 %s å’Œ [%s] 之間被修æ£ã€‚\n" #: bisect.c #, c-format @@ -1751,7 +1759,7 @@ msgid "" "The property has changed between %s and [%s].\n" msgstr "" "åˆä½µåŸºç¤Ž %s 是新的。\n" -"介於 %s å’Œ [%s] 之間的屬性已經被修改。\n" +"介於 %s å’Œ [%s] 之間的屬性已被修改。\n" #: bisect.c #, c-format @@ -1760,7 +1768,7 @@ msgid "" "This means the first '%s' commit is between %s and [%s].\n" msgstr "" "åˆä½µåŸºç¤Ž %s 是 %s。\n" -"這æ„味著第一個 '%s' æäº¤ä½æ–¼ %s å’Œ [%s] 之間。\n" +"這æ„味著第一個 “%s†æäº¤ä½æ–¼ %s å’Œ [%s] 之間。\n" #: bisect.c #, c-format @@ -1769,9 +1777,9 @@ msgid "" "git bisect cannot work properly in this case.\n" "Maybe you mistook %s and %s revs?\n" msgstr "" -"一些 %s ç‰ˆæœ¬ä¸æ˜¯ %s 版本的祖先。\n" -"這種情æ³ä¸‹ git 二分æœå°‹ç„¡æ³•æ£å¸¸å·¥ä½œã€‚\n" -"您å¯èƒ½å¼„錯了 %s å’Œ %s 版本?\n" +"部分 %s ä¿®è¨‚ç‰ˆä¸æ˜¯ %s 修訂版的祖先。\n" +"這種情æ³ä¸‹ git bisect 無法æ£å¸¸é‹ä½œã€‚\n" +"您å¯èƒ½å¼„錯了 %s å’Œ %s 修訂版?\n" #: bisect.c #, c-format @@ -1780,33 +1788,33 @@ msgid "" "So we cannot be sure the first %s commit is between %s and %s.\n" "We continue anyway." msgstr "" -"介於 %s å’Œ [%s] çš„åˆä½µåŸºç¤Žä¸€å®šè¢«å¿½ç•¥äº†ã€‚\n" +"介於 %s å’Œ [%s] çš„åˆä½µåŸºç¤Žä¸€å®šè¢«ç•¥éŽäº†ã€‚\n" "所以我們無法確èªç¬¬ä¸€å€‹ %s æäº¤æ˜¯å¦ä»‹æ–¼ %s å’Œ %s 之間。\n" "我們ä»èˆŠç¹¼çºŒã€‚" #: bisect.c #, c-format msgid "Bisecting: a merge base must be tested\n" -msgstr "二分æœå°‹ä¸ï¼šåˆä½µåŸºç¤Žå¿…é ˆæ˜¯ç¶“éŽæ¸¬è©¦çš„\n" +msgstr "二分æœå°‹ä¸ï¼šåˆä½µåŸºç¤Žå¿…é ˆç¶“éŽæ¸¬è©¦\n" #: bisect.c #, c-format msgid "a %s revision is needed" -msgstr "需è¦ä¸€å€‹ %s 版本" +msgstr "需è¦ä¸€å€‹ %s 修訂版" #: bisect.c #, c-format msgid "could not create file '%s'" -msgstr "ä¸èƒ½å»ºç«‹æª”案 '%s'" +msgstr "無法建立 “%s†檔案" #: bisect.c builtin/merge.c #, c-format msgid "could not read file '%s'" -msgstr "ä¸èƒ½è®€å–檔案 '%s'" +msgstr "ç„¡æ³•è®€å– â€œ%s†檔案" #: bisect.c msgid "reading bisect refs failed" -msgstr "讀å–二分æœå°‹å¼•用失敗" +msgstr "無法讀å–二分æœå°‹çš„引用" #: bisect.c #, c-format @@ -1820,13 +1828,13 @@ msgid "" "Maybe you started with bad path arguments?\n" msgstr "" "æ²’æ‰¾åˆ°èƒ½å¤ æ¸¬è©¦çš„æäº¤ã€‚\n" -"å¯èƒ½æ˜¯åŸ·è¡Œå‚³å…¥çš„路徑引數是錯誤的?\n" +"å¯èƒ½æ˜¯å‚³å…¥çš„路徑引數有誤?\n" #: bisect.c #, c-format msgid "(roughly %d step)" msgid_plural "(roughly %d steps)" -msgstr[0] "(大概 %d æ¥ï¼‰" +msgstr[0] "(大約 %d æ¥ï¼‰" #. TRANSLATORS: the last %s will be replaced with "(roughly %d #. steps)" translation. @@ -1835,7 +1843,7 @@ msgstr[0] "(大概 %d æ¥ï¼‰" #, c-format msgid "Bisecting: %d revision left to test after this %s\n" msgid_plural "Bisecting: %d revisions left to test after this %s\n" -msgstr[0] "二分æœå°‹ä¸ï¼šåœ¨æ¤ä¹‹å¾Œï¼Œé‚„剩 %d 個版本待測試 %s\n" +msgstr[0] "二分æœå°‹ä¸ï¼šåœ¨æ¤ (%2$s) 之後,尚餘 %1$d 個版本待測試\n" #: blame.c msgid "--contents and --reverse do not blend well." @@ -1843,7 +1851,7 @@ msgstr "--contents å’Œ --reverse ä¸èƒ½æ··ç”¨ã€‚" #: blame.c msgid "cannot use --contents with final commit object name" -msgstr "ä¸èƒ½å°‡ --contents 和最終的æäº¤ç‰©ä»¶å共用" +msgstr "無法將 --contents 與最終的æäº¤ç‰©ä»¶å稱共用" #: blame.c msgid "--reverse and --first-parent together require specified latest commit" @@ -1853,48 +1861,48 @@ msgstr "--reverse å’Œ --first-parent å…±ç”¨ï¼Œéœ€è¦æŒ‡å®šæœ€æ–°çš„æäº¤" #: builtin/pack-objects.c builtin/shortlog.c bundle.c midx.c pack-bitmap.c #: ref-filter.c remote.c sequencer.c submodule.c msgid "revision walk setup failed" -msgstr "ç‰ˆæœ¬éæ·è¨å®šå¤±æ•—" +msgstr "ä¿®è¨‚ç‰ˆéæ·è¨å®šå¤±æ•—" #: blame.c msgid "" "--reverse --first-parent together require range along first-parent chain" -msgstr "--reverse å’Œ --first-parent 共用,需è¦ç¬¬ä¸€ç¥–å…ˆéˆä¸Šçš„æäº¤ç¯„åœ" +msgstr "--reverse å’Œ --first-parent 共用,需è¦ç¬¬ä¸€ä¸Šç´šéˆçš„æäº¤ç¯„åœ" #: blame.c #, c-format msgid "no such path %s in %s" -msgstr "在 %2$s ä¸ç„¡æ¤è·¯å¾‘ %1$s" +msgstr "在 %2$s ä¸ï¼Œæ²’有路徑 %1$s" #: blame.c #, c-format msgid "cannot read blob %s for path %s" -msgstr "ä¸èƒ½ç‚ºè·¯å¾‘ %2$s 讀å–資料物件 %1$s" +msgstr "無法為 %2$s 路徑讀å–資料物件 %1$s" #: branch.c msgid "" "cannot inherit upstream tracking configuration of multiple refs when " "rebasing is requested" -msgstr "請求é‡å®šåŸºåº•時,無法繼承多個åƒç…§çš„上游追蹤è¨å®š" +msgstr "請求é‡å®šåŸºåº•時,無法繼承多個引用的上游追蹤è¨å®š" #: branch.c #, c-format msgid "not setting branch '%s' as its own upstream" -msgstr "未將「%sã€åˆ†æ”¯è¨å®šç‚ºå…¶è‡ªå·±çš„上游" +msgstr "未將 “%s†分支è¨ç‚ºå…¶è‡ªå·±çš„上游" #: branch.c #, c-format msgid "branch '%s' set up to track '%s' by rebasing." -msgstr "已將「%sã€åˆ†æ”¯è¨å®šç‚ºé€éŽé‡å®šåŸºåº•追蹤「%sã€ã€‚" +msgstr "已藉由é‡è¨‚基底,將 “%s†分支è¨å®šç‚ºè¿½è¹¤ “%sâ€ã€‚" #: branch.c #, c-format msgid "branch '%s' set up to track '%s'." -msgstr "已將「%sã€åˆ†æ”¯è¨å®šç‚ºè¿½è¹¤ã€Œ%sã€ã€‚" +msgstr "已將 “%s†分支è¨å®šç‚ºè¿½è¹¤ “%sâ€ã€‚" #: branch.c #, c-format msgid "branch '%s' set up to track:" -msgstr "「%sã€åˆ†æ”¯å·²è¨å®šè¿½è¹¤ï¼š" +msgstr "“%s†分支已è¨å®šè¿½è¹¤ï¼š" #: branch.c msgid "unable to write upstream branch configuration" @@ -1907,23 +1915,23 @@ msgid "" "the remote tracking information by invoking:" msgstr "" "\n" -"ä¿®æ£éŒ¯èª¤å¾Œï¼Œæ‚¨å¯ä»¥åŸ·è¡Œä¸‹è¿°å‘½ä»¤\n" -"命令修æ£é 端追蹤資訊:" +"ä¿®æ£ç—…ç¶å¾Œï¼Œæ‚¨å¯ä»¥åŸ·è¡Œä¸‹è¿°å‘½ä»¤\n" +"ä¿®æ£é 端追蹤資訊:" #: branch.c #, c-format msgid "asked to inherit tracking from '%s', but no remote is set" -msgstr "請求繼承「%sã€çš„追蹤è¨å®šï¼Œä½†æœªè¨å®šé 端" +msgstr "請求繼承 “%s†的追蹤è¨å®šï¼Œä½†æœªè¨å®šé 端" #: branch.c #, c-format msgid "asked to inherit tracking from '%s', but no merge configuration is set" -msgstr "請求繼承「%sã€çš„追蹤è¨å®šï¼Œä½†æœªè¨å®šåˆä½µè¨å®š" +msgstr "請求繼承 “%s†的追蹤è¨å®šï¼Œä½†æœªè¨å®šåˆä½µè¨å®š" #: branch.c #, c-format msgid "not tracking: ambiguous information for ref '%s'" -msgstr "未追蹤:「%sã€å¼•用有æ§ç¾©" +msgstr "未追蹤:“%s†引用有æ§ç¾©" # è¯è€…:為ä¿è‰åœ¨è¼¸å‡ºä¸å°é½Šï¼Œæ³¨æ„調整å¥ä¸ç©ºæ ¼ï¼ #. #-#-#-#-# branch.c.po #-#-#-#-# @@ -1957,37 +1965,38 @@ msgid "" "different remotes' fetch refspecs map into different\n" "tracking namespaces." msgstr "" -"有多個é 端的抓å–å¼•ç”¨è¦æ ¼æ˜ 射到é 端追蹤引用「%sã€çš„è¦æ ¼ï¼š\n" +"有多個é 端的抓å–å¼•ç”¨è¦æ ¼ï¼Œæ˜ 射到\n" +"é 端追蹤引用 “%sâ€ çš„è¦æ ¼ï¼š\n" "%s\n" "這通常是è¨å®šéŒ¯èª¤ã€‚\n" "\n" -"è‹¥è¦æ”¯æ´è¨å®šè¿½è¹¤åˆ†æ”¯ï¼Œè«‹ç¢ºå®šä¸åŒé 端的抓å–å¼•ç”¨è¦æ ¼\n" -"æ˜ å°„åˆ°ä¸åŒçš„追蹤命å空間。" +"è‹¥è¦æ”¯æ´è¨å®šè¿½è¹¤åˆ†æ”¯ï¼Œè«‹ç¢ºå®šä¸åŒé 端的\n" +"抓å–å¼•ç”¨è¦æ ¼ï¼Œæ˜ 射到ä¸åŒçš„追蹤命å空間。" #: branch.c #, c-format msgid "'%s' is not a valid branch name" -msgstr "「%sã€ä¸æ˜¯ä¸€å€‹æœ‰æ•ˆçš„分支å稱" +msgstr "“%sâ€ ä¸æ˜¯æœ‰æ•ˆçš„分支å稱" #: branch.c #, c-format msgid "a branch named '%s' already exists" -msgstr "已有åŒå「%sã€åˆ†æ”¯" +msgstr "已有åŒå “%s†分支" #: branch.c #, c-format msgid "cannot force update the branch '%s' checked out at '%s'" -msgstr "無法強制更新在「%2$sã€ç°½å‡ºçš„「%1$sã€åˆ†æ”¯" +msgstr "無法強制更新在 “%2$s†簽出的 “%1$s†分支" #: branch.c #, c-format msgid "cannot set up tracking information; starting point '%s' is not a branch" -msgstr "無法è¨å®šè¿½è¹¤è³‡è¨Šï¼šèµ·å§‹é»žã€Œ%sã€ä¸æ˜¯åˆ†æ”¯" +msgstr "無法è¨å®šè¿½è¹¤è³‡è¨Šï¼šèµ·å§‹é»ž “%sâ€ ä¸æ˜¯åˆ†æ”¯" #: branch.c #, c-format msgid "the requested upstream branch '%s' does not exist" -msgstr "請求的上游分支 '%s' ä¸å˜åœ¨" +msgstr "請求的上游分支 “%s†ä¸å˜åœ¨" #: branch.c msgid "" @@ -2002,31 +2011,31 @@ msgid "" msgstr "" "\n" "如果您打算以é 端ç¾å˜çš„上游分支為基礎進行修改,\n" -"您或許需è¦åŸ·è¡Œã€Œgit fetchã€å–得分支。\n" +"您或許需è¦åŸ·è¡Œ `git fetch` å–得分支。\n" "\n" -"如果您打算將新建立的本機分支推é€è‡³å°æ‡‰çš„é 端分支,\n" -"且建立兩個分支間的追蹤關係,\n" -"您å¯èƒ½éœ€è¦ä½¿ç”¨ã€Œgit push -uã€æŽ¨é€åˆ†æ”¯ä¸¦è¨å®šå’Œä¸Šæ¸¸çš„é—œè¯ã€‚" +"如果您打算將新建立的本機分支,推é€è‡³å°æ‡‰çš„é 端分支,\n" +"並建立兩個分支間的追蹤關係,您å¯èƒ½éœ€è¦ä½¿ç”¨ `git push -u`\n" +"推é€åˆ†æ”¯ä¸¦è¨å®šå’Œä¸Šæ¸¸çš„é—œè¯ã€‚" #: branch.c builtin/replace.c #, c-format msgid "not a valid object name: '%s'" -msgstr "䏿˜¯ä¸€å€‹æœ‰æ•ˆçš„物件å:'%s'" +msgstr "物件å稱無效:“%sâ€" #: branch.c #, c-format msgid "ambiguous object name: '%s'" -msgstr "物件å稱有æ§ç¾©ï¼šã€Œ%sã€" +msgstr "物件å稱有æ§ç¾©ï¼šâ€œ%sâ€" #: branch.c #, c-format msgid "not a valid branch point: '%s'" -msgstr "無效的分支點:「%sã€" +msgstr "分支點無效:“%sâ€" #: branch.c #, c-format msgid "submodule '%s': unable to find submodule" -msgstr "「%sã€å模組:找ä¸åˆ°å模組" +msgstr "“%sâ€ åæ¨¡çµ„:找ä¸åˆ°å模組" #: branch.c #, c-format @@ -2034,37 +2043,37 @@ msgid "" "You may try updating the submodules using 'git checkout %s && git submodule " "update --init'" msgstr "" -"您å¯ä»¥å˜—試使用「git checkout %s && git submodule update --initã€å‘½ä»¤æ›´æ–°å模" -"組" +"您å¯ä»¥å˜—試使用 “git checkout %s && git submodule update --init†命令,更新å" +"模組" #: branch.c #, c-format msgid "submodule '%s': cannot create branch '%s'" -msgstr "「%sã€å模組:無法建立「%sã€åˆ†æ”¯" +msgstr "“%sâ€ åæ¨¡çµ„:無法建立 “%s†分支" #: branch.c #, c-format msgid "'%s' is already checked out at '%s'" -msgstr "'%s' 已經簽出到 '%s'" +msgstr "“%s†已在 “%s†點簽出" #: branch.c #, c-format msgid "HEAD of working tree %s is not updated" -msgstr "å·¥ä½œå€ %s çš„ HEAD æŒ‡å‘æ²’有被更新" +msgstr "%s 工作å€çš„ HEAD æŒ‡é‡æœªè¢«æ›´æ–°" #: builtin/add.c msgid "git add [<options>] [--] <pathspec>..." -msgstr "git add [<é¸é …>] [--] <è·¯å¾‘è¦æ ¼>..." +msgstr "git add [<options>] [--] <pathspec>..." #: builtin/add.c #, c-format msgid "cannot chmod %cx '%s'" -msgstr "無法 chmod %cx ‘%s’" +msgstr "無法 chmod %cx '%s'" #: builtin/add.c #, c-format msgid "unexpected diff status %c" -msgstr "æ„外的差異狀態 %c" +msgstr "éžé 期的 diff 狀態 %c" #: builtin/add.c builtin/commit.c msgid "updating files failed" @@ -2073,19 +2082,19 @@ msgstr "更新檔案失敗" #: builtin/add.c #, c-format msgid "remove '%s'\n" -msgstr "刪除 '%s'\n" +msgstr "移除 “%sâ€\n" #: builtin/add.c msgid "Unstaged changes after refreshing the index:" -msgstr "釿–°æ•´ç†ç´¢å¼•之後尚未被暫å˜çš„變更:" +msgstr "釿–°æ•´ç†ç´¢å¼•之後,尚未被暫å˜çš„æ›´å‹•:" #: builtin/add.c builtin/rev-parse.c msgid "Could not read the index" -msgstr "ä¸èƒ½è®€å–索引" +msgstr "無法讀å–索引" #: builtin/add.c msgid "Could not write patch" -msgstr "ä¸èƒ½ç”Ÿæˆä¿®è£œæª”" +msgstr "無法寫入修補檔" #: builtin/add.c msgid "editing patch failed" @@ -2094,20 +2103,20 @@ msgstr "編輯修補檔失敗" #: builtin/add.c #, c-format msgid "Could not stat '%s'" -msgstr "ä¸èƒ½å° '%s' å‘¼å« stat" +msgstr "ä¸èƒ½å° “%s†執行 stat" #: builtin/add.c msgid "Empty patch. Aborted." -msgstr "空修補檔。異常終æ¢ã€‚" +msgstr "ä¿®è£œæª”ç©ºç™½ã€‚ä¸æ¢ã€‚" #: builtin/add.c #, c-format msgid "Could not apply '%s'" -msgstr "ä¸èƒ½å¥—用 '%s'" +msgstr "無法套用 “%sâ€" #: builtin/add.c msgid "The following paths are ignored by one of your .gitignore files:\n" -msgstr "ä¸‹åˆ—è·¯å¾‘æ ¹æ“šæ‚¨çš„ä¸€å€‹ .gitignore 檔案而被忽略:\n" +msgstr "ä¸‹åˆ—è·¯å¾‘æ ¹æ“šå…¶ä¸ä¸€å€‹ .gitignore 檔案而被忽略:\n" #: builtin/add.c builtin/clean.c builtin/fetch.c builtin/mv.c #: builtin/prune-packed.c builtin/pull.c builtin/push.c builtin/remote.c @@ -2123,11 +2132,11 @@ msgstr "詳細輸出" #: builtin/add.c msgid "interactive picking" -msgstr "äº’å‹•å¼æ€é¸" +msgstr "äº’å‹•å¼æŒ‘é¸" #: builtin/add.c builtin/checkout.c builtin/reset.c msgid "select hunks interactively" -msgstr "äº’å‹•å¼æŒ‘é¸è³‡æ–™å€å¡Š" +msgstr "互動å¼é¸å–å€å¡Š" #: builtin/add.c msgid "edit current diff and apply" @@ -2135,7 +2144,7 @@ msgstr "編輯目å‰å·®ç•°ä¸¦å¥—用" #: builtin/add.c msgid "allow adding otherwise ignored files" -msgstr "å…許新增忽略的檔案" +msgstr "å…è¨±åŠ å…¥åŽŸå…ˆè¢«å¿½ç•¥çš„æª”æ¡ˆ" #: builtin/add.c msgid "update tracked files" @@ -2143,15 +2152,15 @@ msgstr "更新已追蹤的檔案" #: builtin/add.c msgid "renormalize EOL of tracked files (implies -u)" -msgstr "å°å·²è¿½è¹¤æª”æ¡ˆï¼ˆéš±å« -uï¼‰é‡æ–°æ¸ä¸€æ›è¡Œç¬¦è™Ÿ" +msgstr "å°å·²è¿½è¹¤æª”æ¡ˆï¼ˆéš±å« -uï¼‰é‡æ–°æ¨™æº–化 EOL" #: builtin/add.c msgid "record only the fact that the path will be added later" -msgstr "åªè¨˜éŒ„,該路徑ç¨å¾Œå†æ–°å¢ž" +msgstr "åªè¨˜éŒ„「路徑ç¨å¾Œæœƒå†åŠ å…¥ã€" #: builtin/add.c msgid "add changes from all tracked and untracked files" -msgstr "新增所有改變的已追蹤檔案和未追蹤檔案" +msgstr "å¾žæ‰€æœ‰å·²è¿½è¹¤å’Œæœªè¿½è¹¤æª”æ¡ˆåŠ å…¥æ›´å‹•" #: builtin/add.c msgid "ignore paths removed in the working tree (same as --no-all)" @@ -2167,7 +2176,7 @@ msgstr "ç•¥éŽå› 發生錯誤ä¸èƒ½æ–°å¢žçš„æª”案" #: builtin/add.c msgid "check if - even missing - files are ignored in dry run" -msgstr "檢查在測試執行模å¼ä¸‹æª”案(å³ä½¿ä¸å˜åœ¨ï¼‰æ˜¯å¦è¢«å¿½ç•¥" +msgstr "檢查(å³ä½¿ä¸å˜åœ¨çš„)檔案是å¦åœ¨æ¸¬è©¦åŸ·è¡Œæ¨¡å¼ä¸è¢«å¿½ç•¥" #: builtin/add.c builtin/mv.c builtin/rm.c msgid "allow updating entries outside of the sparse-checkout cone" @@ -2175,11 +2184,11 @@ msgstr "å…許更新稀ç–簽出 cone å¤–çš„é …ç›®" #: builtin/add.c builtin/update-index.c msgid "override the executable bit of the listed files" -msgstr "覆蓋列表裡檔案的å¯åŸ·è¡Œä½" +msgstr "覆寫列出檔案ä¸çš„å¯åŸ·è¡Œä½å…ƒ" #: builtin/add.c msgid "warn when adding an embedded repository" -msgstr "建立一個嵌入å¼ç‰ˆæœ¬åº«æ™‚給予è¦å‘Š" +msgstr "嵌入版本庫時發出è¦å‘Š" #: builtin/add.c #, c-format @@ -2198,22 +2207,24 @@ msgid "" "\n" "See \"git help submodule\" for more information." msgstr "" -"您在目å‰ç‰ˆæœ¬åº«ä¸æ–°å¢žäº†å¦å¤–一個 Git 版本庫。複製外層的版本庫將ä¸åŒ…å«åµŒå…¥ç‰ˆæœ¬åº«" -"的內容,並且ä¸çŸ¥é“該如何å–得它。\n" -"å¦‚æžœæ‚¨è¦æ–°å¢žä¸€å€‹å模組,使用:\n" +"您在目å‰çš„版本庫ä¸åР進å¦ä¸€å€‹ Git 版本庫。\n" +"複製外層的版本庫,將ä¸åŒ…å«åµŒå…¥ç‰ˆæœ¬åº«çš„內容,\n" +"並且ä¸åŒ…å«å–å¾—æ¤ç‰ˆæœ¬åº«çš„æ–¹å¼ã€‚\n" +"如果您è¦åР入忍¡çµ„,請使用:\n" "\n" "\tgit submodule add <url> %s\n" "\n" -"如果您ä¸å°å¿ƒæ–°å¢žäº†é€™å€‹è·¯å¾‘,å¯ä»¥ç”¨ä¸‹é¢çš„æŒ‡ä»¤å°‡å…¶å¾žç´¢å¼•ä¸åˆªé™¤ï¼š\n" +"如果您ä¸å°å¿ƒåŠ å…¥äº†é€™å€‹è·¯å¾‘ï¼Œ\n" +"å¯ä»¥ç”¨ä¸‹é¢çš„命令,將其從索引ä¸ç§»é™¤ï¼š\n" "\n" "\tgit rm --cached %s\n" "\n" -"åƒè¦‹ \"git help submodule\" å–得更多訊æ¯ã€‚" +"åƒè¦‹ “git help submodule†深入了解。" #: builtin/add.c #, c-format msgid "adding embedded git repository: %s" -msgstr "æ£åœ¨æ–°å¢žåµŒå…¥å¼ git 版本庫:%s" +msgstr "æ£åœ¨åŠ å…¥åµŒå…¥å¼ git 版本庫:%s" #: builtin/add.c msgid "" @@ -2221,29 +2232,29 @@ msgid "" "Turn this message off by running\n" "\"git config advice.addIgnoredFile false\"" msgstr "" -"å¦‚æžœæ‚¨çœŸçš„æƒ³åŠ å…¥ï¼Œè«‹ä½¿ç”¨ -f。\n" +"è‹¥æ‚¨çœŸçš„æƒ³åŠ å…¥ï¼Œè«‹å‚³å…¥ -f。\n" "如è¦é—œé–‰æ¤è¨Šæ¯ï¼Œè«‹åŸ·è¡Œ\n" -"\"git config advice.addIgnoredFile false\"" +"“git config advice.addIgnoredFile falseâ€" #: builtin/add.c msgid "adding files failed" -msgstr "新增檔案失敗" +msgstr "åŠ å…¥æª”æ¡ˆå¤±æ•—" #: builtin/add.c #, c-format msgid "--chmod param '%s' must be either -x or +x" -msgstr "åƒæ•¸ --chmod å–值 '%s' å¿…é ˆæ˜¯ -x 或 +x" +msgstr "--chmod çš„åƒæ•¸ “%sâ€ å¿…é ˆæ˜¯ -x 或 +x" #: builtin/add.c builtin/checkout.c builtin/commit.c builtin/reset.c #: builtin/rm.c builtin/stash.c #, c-format msgid "'%s' and pathspec arguments cannot be used together" -msgstr "「%sã€å’Œè·¯å¾‘è¦æ ¼å¼•數ä¸å¾—åŒæ™‚使用" +msgstr "“%sâ€ å’Œè·¯å¾‘è¦æ ¼å¼•數ä¸å¾—åŒæ™‚使用" #: builtin/add.c #, c-format msgid "Nothing specified, nothing added.\n" -msgstr "沒有指定檔案,也沒有檔案被新增。\n" +msgstr "æ²’æœ‰æŒ‡å®šï¼Œäº¦æœªåŠ å…¥æª”æ¡ˆã€‚\n" #: builtin/add.c msgid "" @@ -2251,9 +2262,9 @@ msgid "" "Turn this message off by running\n" "\"git config advice.addEmptyPathspec false\"" msgstr "" -"å¯èƒ½ä½ è¦åšçš„æ˜¯ 'git add .'?\n" +"å¯èƒ½æ‚¨æƒ³åš “git add .â€ï¼Ÿ\n" "如è¦é—œé–‰æ¤è¨Šæ¯ï¼Œè«‹åŸ·è¡Œ\n" -"\"git config advice.addEmptyPathspec false\"" +"“git config advice.addEmptyPathspec falseâ€" #: builtin/add.c builtin/check-ignore.c builtin/checkout.c builtin/clean.c #: builtin/commit.c builtin/diff-tree.c builtin/grep.c builtin/mv.c @@ -2265,43 +2276,43 @@ msgstr "索引檔案æå£ž" #: builtin/am.c builtin/mailinfo.c mailinfo.c #, c-format msgid "bad action '%s' for '%s'" -msgstr "「%sã€å‹•作å°ã€Œ%sã€ç„¡æ•ˆ" +msgstr "“%sâ€ å‹•ä½œå° â€œ%s†無效" #: builtin/am.c builtin/blame.c builtin/fetch.c builtin/pack-objects.c #: builtin/pull.c diff-merges.c gpg-interface.c ls-refs.c parallel-checkout.c #: sequencer.c setup.c #, c-format msgid "invalid value for '%s': '%s'" -msgstr "「%sã€çš„值無效:「%sã€" +msgstr "“%s†的值無效:“%sâ€" #: builtin/am.c builtin/commit.c builtin/merge.c sequencer.c #, c-format msgid "could not read '%s'" -msgstr "ä¸èƒ½è®€å– '%s'" +msgstr "ç„¡æ³•è®€å– â€œ%sâ€" #: builtin/am.c msgid "could not parse author script" -msgstr "ä¸èƒ½è§£æžä½œè€…腳本" +msgstr "無法解æžä½œè€…文稿" #: builtin/am.c builtin/replace.c commit.c sequencer.c #, c-format msgid "could not parse %s" -msgstr "ä¸èƒ½è§£æž %s" +msgstr "ç„¡æ³•è§£æž %s" #: builtin/am.c #, c-format msgid "'%s' was deleted by the applypatch-msg hook" -msgstr "'%s' 被 applypatch-msg 掛鉤刪除" +msgstr "“%s†被 applypatch-msg 掛鉤刪除" #: builtin/am.c #, c-format msgid "Malformed input line: '%s'." -msgstr "éžæ³•的輸入行:'%s'。" +msgstr "æ ¼å¼éŒ¯èª¤çš„輸入列:“%sâ€ã€‚" #: builtin/am.c #, c-format msgid "Failed to copy notes from '%s' to '%s'" -msgstr "從 '%s' 複製註解到 '%s' 時失敗" +msgstr "從 “%s†拷è²è¨»è§£åˆ° “%s†失敗" #: builtin/am.c msgid "fseek failed" @@ -2310,21 +2321,21 @@ msgstr "fseek 失敗" #: builtin/am.c builtin/rebase.c sequencer.c wrapper.c #, c-format msgid "could not open '%s' for reading" -msgstr "無法開啟 '%s' 進行讀å–" +msgstr "無法開啟 “%s†進行讀å–" #: builtin/am.c builtin/rebase.c sequencer.c strbuf.c wrapper.c #, c-format msgid "could not open '%s' for writing" -msgstr "無法開啟 '%s' 進行寫入" +msgstr "無法開啟 “%s†進行寫入" #: builtin/am.c #, c-format msgid "could not parse patch '%s'" -msgstr "無法解æžä¿®è£œæª” '%s'" +msgstr "無法解æžä¿®è£œæª” “%sâ€" #: builtin/am.c msgid "Only one StGIT patch series can be applied at once" -msgstr "一次åªèƒ½æœ‰ä¸€å€‹ StGIT 修補檔佇列被套用" +msgstr "一次åªèƒ½å¥—用一個 StGIT 修補檔åºåˆ—" #: builtin/am.c msgid "invalid timestamp" @@ -2332,11 +2343,11 @@ msgstr "無效的時間戳" #: builtin/am.c msgid "invalid Date line" -msgstr "無效的日期行" +msgstr "無效的 Date 列" #: builtin/am.c msgid "invalid timezone offset" -msgstr "無效的時å€ä½ç§»å€¼" +msgstr "無效的時å€åç§»" #: builtin/am.c msgid "Patch format detection failed." @@ -2345,74 +2356,74 @@ msgstr "ä¿®è£œæª”æ ¼å¼åµæ¸¬å¤±æ•—。" #: builtin/am.c builtin/clone.c #, c-format msgid "failed to create directory '%s'" -msgstr "建立目錄 '%s' 失敗" +msgstr "無法建立目錄 “%sâ€" #: builtin/am.c msgid "Failed to split patches." -msgstr "分割修補檔失敗。" +msgstr "無法切割修補檔。" #: builtin/am.c #, c-format msgid "When you have resolved this problem, run \"%s --continue\"." -msgstr "當您解決這一å•題,執行 \"%s --continue\"。" +msgstr "解決æ¤å•題後,請執行 “%s --continueâ€ã€‚" #: builtin/am.c #, c-format msgid "If you prefer to skip this patch, run \"%s --skip\" instead." -msgstr "如果您想è¦ç•¥éŽé€™ä¸€ä¿®è£œæª”,則執行 \"%s --skip\"。" +msgstr "è‹¥è¦ç•¥éŽæ¤ä¿®è£œï¼Œè«‹æ”¹åŸ·è¡Œ “%s --skipâ€ã€‚" #: builtin/am.c #, c-format msgid "To record the empty patch as an empty commit, run \"%s --allow-empty\"." -msgstr "è‹¥è¦å°‡ç©ºç™½ä¿®è£œæª”錄製為空白æäº¤ï¼Œè«‹åŸ·è¡Œã€Œ%s --allow-emptyã€ã€‚" +msgstr "è‹¥è¦å°‡ç©ºç™½ä¿®è£œæª”錄入為空白æäº¤ï¼Œè«‹åŸ·è¡Œ “%s --allow-emptyâ€ã€‚" #: builtin/am.c #, c-format msgid "To restore the original branch and stop patching, run \"%s --abort\"." -msgstr "è‹¥è¦å¾©åŽŸè‡³åŽŸå§‹åˆ†æ”¯ä¸¦åœæ¢ä¿®è£œå‹•作,執行 \"%s --abort\"。" +msgstr "è‹¥è¦é‚„åŽŸè‡³åŽŸå§‹åˆ†æ”¯ï¼Œä¸¦åœæ¢ä¿®è£œå‹•作,請執行 “%s --abortâ€ã€‚" #: builtin/am.c msgid "Patch sent with format=flowed; space at the end of lines might be lost." -msgstr "修補檔使用 format=flowed æ ¼å¼å‚³é€ï¼Œè¡Œå°¾çš„ç©ºæ ¼å¯èƒ½æœƒéºå¤±ã€‚" +msgstr "修補檔使用 format=flowed æ ¼å¼å‚³é€ï¼šåˆ—å°¾çš„ç©ºæ ¼å¯èƒ½æœƒéºå¤±ã€‚" #: builtin/am.c #, c-format msgid "missing author line in commit %s" -msgstr "在æäº¤ %s ä¸ç¼ºå°‘作者行" +msgstr "在æäº¤ %s ä¸ç¼ºå°‘作者列" #: builtin/am.c #, c-format msgid "invalid ident line: %.*s" -msgstr "無效的身份標記:%.*s" +msgstr "ident 列無效:%.*s" #: builtin/am.c builtin/checkout.c builtin/clone.c commit-graph.c #, c-format msgid "unable to parse commit %s" -msgstr "ä¸èƒ½è§£æžæäº¤ %s" +msgstr "ç„¡æ³•è§£æž %s æäº¤" #: builtin/am.c msgid "Repository lacks necessary blobs to fall back on 3-way merge." -msgstr "版本庫缺ä¹å¿…è¦çš„資料物件以進行三方åˆä½µã€‚" +msgstr "版本庫缺少必è¦çš„資料物件,無法進行三方åˆä½µã€‚" #: builtin/am.c msgid "Using index info to reconstruct a base tree..." -msgstr "使用索引來é‡å»ºä¸€å€‹ï¼ˆä¸‰æ–¹åˆä½µçš„)基礎目錄樹..." +msgstr "æ£åœ¨ä½¿ç”¨ç´¢å¼•資訊é‡å»ºåŸºç¤Žæ¨¹â€¦â€¦" #: builtin/am.c msgid "" "Did you hand edit your patch?\n" "It does not apply to blobs recorded in its index." msgstr "" -"æ‚¨æ˜¯å¦æ›¾æ‰‹å‹•ç·¨è¼¯éŽæ‚¨çš„修補檔?\n" -"無法套用修補檔到索引ä¸çš„資料物件上。" +"æ‚¨æ˜¯å¦æ›¾è‡ªè¡Œç·¨è¼¯éŽæ‚¨çš„修補檔?\n" +"未能套用至索引錄入的資料物件。" #: builtin/am.c msgid "Falling back to patching base and 3-way merge..." -msgstr "回è½åˆ°åŸºç¤Žç‰ˆæœ¬ä¸Šä¿®è£œåŠé€²è¡Œä¸‰æ–¹åˆä½µ..." +msgstr "æ£åœ¨å›žå¾©åˆ°ä¿®è£œåŸºç¤Žè™•,並進行三方åˆä½µâ€¦â€¦" #: builtin/am.c msgid "Failed to merge in the changes." -msgstr "無法åˆä½µè®Šæ›´ã€‚" +msgstr "無法åˆä½µæ›´å‹•。" #: builtin/am.c builtin/merge.c sequencer.c msgid "git write-tree failed to write a tree" @@ -2420,12 +2431,12 @@ msgstr "git write-tree 無法寫入樹狀物件" #: builtin/am.c msgid "applying to an empty history" -msgstr "æ£å¥—用到一個空æ·å²ä¸Š" +msgstr "æ£åœ¨å¥—用至空白æ·å²è¨˜éŒ„上" #: builtin/am.c builtin/commit.c builtin/merge.c sequencer.c #: t/helper/test-fast-rebase.c msgid "failed to write commit object" -msgstr "寫æäº¤ç‰©ä»¶å¤±æ•—" +msgstr "無法寫入æäº¤ç‰©ä»¶" #: builtin/am.c #, c-format @@ -2434,7 +2445,7 @@ msgstr "無法繼續:%s ä¸å˜åœ¨ã€‚" #: builtin/am.c msgid "Commit Body is:" -msgstr "æäº¤å…§å®¹ç‚ºï¼š" +msgstr "æäº¤å…§æ–‡ç‚ºï¼š" # è¯è€…ï¼šè«‹ç¶æŒå¥å°¾ç©ºæ ¼ #. TRANSLATORS: Make sure to include [y], [n], [e], [v] and [a] @@ -2444,7 +2455,7 @@ msgstr "æäº¤å…§å®¹ç‚ºï¼š" #: builtin/am.c #, c-format msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all: " -msgstr "套用?是[y]/å¦[n]/編輯[e]/檢視修補檔[v]/全部接å—[a]: " +msgstr "是å¦å¥—用?是[y]/å¦[n]/編輯[e]/檢視修補檔[v]/全部接å—[a]: " #: builtin/am.c builtin/commit.c msgid "unable to write index file" @@ -2453,7 +2464,7 @@ msgstr "無法寫入索引檔案" #: builtin/am.c #, c-format msgid "Dirty index: cannot apply patches (dirty: %s)" -msgstr "髒索引:ä¸èƒ½å¥—用修補檔(髒檔案:%s)" +msgstr "有異動索引:無法套用修補檔(異動處:%s)" #: builtin/am.c #, c-format @@ -2467,7 +2478,7 @@ msgstr "建立空白æäº¤ï¼š%.*s" #: builtin/am.c msgid "Patch is empty." -msgstr "修補檔為空。" +msgstr "修補檔空白。" #: builtin/am.c #, c-format @@ -2476,20 +2487,20 @@ msgstr "套用:%.*s" #: builtin/am.c msgid "No changes -- Patch already applied." -msgstr "沒有變更——修補檔已經套用éŽã€‚" +msgstr "沒有變更——修補檔已套用éŽã€‚" #: builtin/am.c #, c-format msgid "Patch failed at %s %.*s" -msgstr "打修補檔失敗於 %s %.*s" +msgstr "在 %s %.*s 處修補失敗" #: builtin/am.c msgid "Use 'git am --show-current-patch=diff' to see the failed patch" -msgstr "用 'git am --show-current-patch=diff' 命令檢視失敗的修補檔" +msgstr "使用 “git am --show-current-patch=diff†命令檢視失敗的修補檔" #: builtin/am.c msgid "No changes - recorded it as an empty commit." -msgstr "沒有變更 ï¼ å°‡å…¶éŒ„è£½ç‚ºç©ºç™½æäº¤ã€‚" +msgstr "沒有變更:將其錄入為空白æäº¤ã€‚" #: builtin/am.c msgid "" @@ -2497,9 +2508,9 @@ msgid "" "If there is nothing left to stage, chances are that something else\n" "already introduced the same changes; you might want to skip this patch." msgstr "" -"沒有變更 —— æ‚¨æ˜¯ä¸æ˜¯å¿˜äº†åŸ·è¡Œ 'git add'?\n" -"å¦‚æžœæ²’æœ‰ä»€éº¼è¦æ–°å¢žåˆ°æš«å˜å€çš„,則很å¯èƒ½æ˜¯å…¶å®ƒæäº¤å·²ç¶“引入了相åŒçš„變更。\n" -"您也許想è¦ç•¥éŽé€™å€‹ä¿®è£œæª”。" +"沒有變更:是å¦å¿˜è¨˜åŸ·è¡Œ “git addâ€ï¼Ÿ\n" +"å¦‚æžœæ²’æœ‰å…¶ä»–è¦æ–°å¢žåˆ°æš«å˜å€çš„,則很å¯èƒ½æ˜¯å…¶å®ƒæäº¤\n" +"已經引入了相åŒçš„變更。您也許想è¦ç•¥éŽé€™å€‹ä¿®è£œæª”。" #: builtin/am.c msgid "" @@ -2508,59 +2519,61 @@ msgid "" "such.\n" "You might run `git rm` on a file to accept \"deleted by them\" for it." msgstr "" -"在您的索引ä¸ä»å˜åœ¨æœªåˆä½µçš„路徑。\n" -"您應該å°å·²ç¶“è¡çªè§£æ±ºçš„æ¯ä¸€å€‹æª”æ¡ˆåŸ·è¡Œ 'git add' 來標記已經完æˆã€‚ \n" -"ä½ å¯ä»¥å° \"由他們刪除\" 的檔案執行 `git rm` 指令。" +"索引ä¸ä»æœ‰æœªåˆä½µè·¯å¾‘。\n" +"您應該å°å·²ç¶“解決è¡çªçš„æ¯ä¸€å€‹æª”æ¡ˆåŸ·è¡Œ `git add`,標記為已經完æˆã€‚\n" +"ä½ å¯ä»¥å°ã€Œç”±ä»–們刪除ã€çš„æª”案,執行 `git rm` 指令。" #: builtin/am.c builtin/checkout.c builtin/clone.c builtin/stash.c merge.c #: rerere.c msgid "unable to write new index file" -msgstr "無法寫新的索引檔案" +msgstr "無法寫入新的索引檔案" #: builtin/am.c builtin/reset.c #, c-format msgid "Could not parse object '%s'." -msgstr "ä¸èƒ½è§£æžç‰©ä»¶ '%s'。" +msgstr "ç„¡æ³•è§£æž â€œ%s†物件。" #: builtin/am.c msgid "failed to clean index" -msgstr "清空索引失敗" +msgstr "無法清除索引" #: builtin/am.c msgid "" "You seem to have moved HEAD since the last 'am' failure.\n" "Not rewinding to ORIG_HEAD" -msgstr "您好åƒåœ¨ä¸Šä¸€æ¬¡ 'am' 失敗後移動了 HEAD。未還原至 ORIG_HEAD" +msgstr "" +"您似乎在上一次 “am†失敗後移動了 HEAD。\n" +"未倒轉回 ORIG_HEAD" #: builtin/am.c builtin/bisect--helper.c worktree.c #, c-format msgid "failed to read '%s'" -msgstr "è®€å– '%s' 失敗" +msgstr "ç„¡æ³•è®€å– â€œ%sâ€" #: builtin/am.c #, c-format msgid "options '%s=%s' and '%s=%s' cannot be used together" -msgstr "「%s=%sã€å’Œã€Œ%s=%sã€é¸é …ä¸å¾—åŒæ™‚使用" +msgstr "“%s=%s†和 “%s=%s†é¸é …ä¸å¾—åŒæ™‚使用" #: builtin/am.c msgid "git am [<options>] [(<mbox> | <Maildir>)...]" -msgstr "git am [<é¸é …>] [(<mbox> | <Maildir>)...]" +msgstr "git am [<options>] [(<mbox> | <Maildir>)...]" #: builtin/am.c msgid "git am [<options>] (--continue | --skip | --abort)" -msgstr "git am [<é¸é …>] (--continue | --skip | --abort)" +msgstr "git am [<options>] (--continue | --skip | --abort)" #: builtin/am.c msgid "run interactively" -msgstr "ä»¥äº’å‹•å¼æ–¹å¼åŸ·è¡Œ" +msgstr "互動å¼åŸ·è¡Œ" #: builtin/am.c msgid "historical option -- no-op" -msgstr "è€çš„åƒæ•¸ —— 無作用" +msgstr "æ·å²éºç•™é¸é …——無作用" #: builtin/am.c msgid "allow fall back on 3way merging if needed" -msgstr "如果必è¦ï¼Œå…許使用三方åˆä½µ" +msgstr "å¿…è¦æ™‚å…許回復至三方åˆä½µ" #: builtin/am.c builtin/init-db.c builtin/prune-packed.c builtin/repack.c #: builtin/stash.c @@ -2569,7 +2582,7 @@ msgstr "éœé»˜æ¨¡å¼" #: builtin/am.c msgid "add a Signed-off-by trailer to the commit message" -msgstr "在æäº¤èªªæ˜Žçµå°¾åŠ å…¥ Signed-off-by" +msgstr "在æäº¤èªªæ˜Žçµå°¾è™•åŠ å…¥ Signed-off-by" #: builtin/am.c msgid "recode into utf8 (default)" @@ -2577,35 +2590,35 @@ msgstr "使用 utf8 å—元集(é è¨ï¼‰" #: builtin/am.c msgid "pass -k flag to git-mailinfo" -msgstr "å‘ git-mailinfo å‚³éž -k åƒæ•¸" +msgstr "å‘ git-mailinfo 傳入 -k åƒæ•¸" #: builtin/am.c msgid "pass -b flag to git-mailinfo" -msgstr "å‘ git-mailinfo å‚³éž -b åƒæ•¸" +msgstr "å‘ git-mailinfo 傳入 -b åƒæ•¸" #: builtin/am.c msgid "pass -m flag to git-mailinfo" -msgstr "å‘ git-mailinfo å‚³éž -m åƒæ•¸" +msgstr "å‘ git-mailinfo 傳入 -m åƒæ•¸" #: builtin/am.c msgid "pass --keep-cr flag to git-mailsplit for mbox format" -msgstr "é‡å° mbox æ ¼å¼ï¼Œå‘ git-mailsplit å‚³éž --keep-cr åƒæ•¸" +msgstr "若為 mbox æ ¼å¼ï¼Œå‘ git-mailsplit 傳入 --keep-cr 標記" #: builtin/am.c msgid "do not pass --keep-cr flag to git-mailsplit independent of am.keepcr" -msgstr "ä¸å‘ git-mailsplit å‚³éž --keep-cr åƒæ•¸ï¼Œè¦†è“‹ am.keepcr çš„è¨å®š" +msgstr "ä¸å‘ git-mailsplit 傳入 --keep-cr 標記,無視 am.keepcr çš„è¨å®š" #: builtin/am.c msgid "strip everything before a scissors line" -msgstr "æ¨æ£„è£åˆ‡ç·šå‰çš„æ‰€æœ‰å…§å®¹" +msgstr "截掉è£åˆ‡ç·šå‰çš„æ‰€æœ‰å…§å®¹" #: builtin/am.c msgid "pass it through git-mailinfo" -msgstr "é€éŽ git-mailinfo 傳éž" +msgstr "é€éŽ git-mailinfo 傳入" #: builtin/am.c msgid "pass it through git-apply" -msgstr "傳éžçµ¦ git-apply" +msgstr "é€éŽ git-apply 傳入" #: builtin/am.c builtin/commit.c builtin/fmt-merge-msg.c builtin/grep.c #: builtin/merge.c builtin/pull.c builtin/rebase.c builtin/repack.c @@ -2617,7 +2630,7 @@ msgstr "n" #: builtin/diagnose.c builtin/for-each-ref.c builtin/ls-files.c #: builtin/ls-tree.c builtin/replace.c builtin/tag.c builtin/verify-tag.c msgid "format" -msgstr "æ ¼å¼" +msgstr "format" #: builtin/am.c msgid "format the patch(es) are in" @@ -2625,7 +2638,7 @@ msgstr "ä¿®è£œæª”çš„æ ¼å¼" #: builtin/am.c msgid "override error message when patch failure occurs" -msgstr "打修補檔失敗時顯示的錯誤訊æ¯" +msgstr "覆蓋修補失敗時顯示的錯誤訊æ¯" #: builtin/am.c msgid "continue applying patches after resolving a conflict" @@ -2645,7 +2658,7 @@ msgstr "é‚„åŽŸåŽŸå§‹åˆ†æ”¯ä¸¦ä¸æ¢ä¿®è£œå‹•作" #: builtin/am.c msgid "abort the patching operation but keep HEAD where it is" -msgstr "終æ¢ä¿®è£œå‹•ä½œä½†ä¿æŒ HEAD ä¸è®Š" +msgstr "䏿¢ä¿®è£œå‹•ä½œä½†ä¿æŒ HEAD ä¸è®Š" #: builtin/am.c msgid "show the patch being applied" @@ -2653,15 +2666,15 @@ msgstr "顯示æ£åœ¨å¥—用的修補檔" #: builtin/am.c msgid "record the empty patch as an empty commit" -msgstr "將空白修補檔錄製為空白æäº¤" +msgstr "將空白修補檔錄入為空白æäº¤" #: builtin/am.c msgid "lie about committer date" -msgstr "將作者日期作為æäº¤æ—¥æœŸ" +msgstr "將作者日期當作æäº¤æ—¥æœŸ" #: builtin/am.c msgid "use current timestamp for author date" -msgstr "ç”¨ç›®å‰æ™‚間作為作者日期" +msgstr "æŠŠç›®å‰æ™‚間戳當作是作者日期" #: builtin/am.c builtin/commit-tree.c builtin/commit.c builtin/merge.c #: builtin/pull.c builtin/rebase.c builtin/revert.c builtin/tag.c @@ -2685,8 +2698,8 @@ msgid "" "The -b/--binary option has been a no-op for long time, and\n" "it will be removed. Please do not use it anymore." msgstr "" -"åƒæ•¸ -b/--binary 已經很長時間ä¸åšä»»ä½•實質動作了,並且將被移除。\n" -"è«‹ä¸è¦å†ä½¿ç”¨å®ƒäº†ã€‚" +"-b/--binary é¸é …已經有很長時間ä¸åšä»»ä½•實質動作了,\n" +"並且將被移除。請ä¸è¦å†ä½¿ç”¨å®ƒäº†ã€‚" #: builtin/am.c msgid "failed to read the index" @@ -2703,49 +2716,49 @@ msgid "" "Stray %s directory found.\n" "Use \"git am --abort\" to remove it." msgstr "" -"發ç¾äº†éŒ¯èª¤çš„ %s 目錄。\n" -"使用 \"git am --abort\" 刪除它。" +"發ç¾å¤±æ•£çš„ %s 目錄。\n" +"使用 “git am --abort†移除。" #: builtin/am.c msgid "Resolve operation not in progress, we are not resuming." -msgstr "è§£æ±ºå‹•ä½œæœªé€²è¡Œï¼Œæˆ‘å€‘ä¸æœƒç¹¼çºŒã€‚" +msgstr "æœªåœ¨é€²è¡Œè§£æ±ºå‹•ä½œï¼Œä¸æœƒç¹¼çºŒã€‚" #: builtin/am.c msgid "interactive mode requires patches on the command line" -msgstr "äº’å‹•å¼æ¨¡å¼éœ€è¦æŒ‡ä»¤åˆ—上æä¾›ä¿®è£œæª”" +msgstr "互動模å¼éœ€è¦å‘½ä»¤åˆ—上æä¾›ä¿®è£œæª”" #: builtin/apply.c msgid "git apply [<options>] [<patch>...]" -msgstr "git apply [<é¸é …>] [<修補檔>...]" +msgstr "git apply [<options>] [<patch>...]" #: builtin/archive.c diagnose.c msgid "could not redirect output" -msgstr "ä¸èƒ½é‡å®šå‘輸出" +msgstr "ç„¡æ³•é‡æ–°å°Žå‘輸出" #: builtin/archive.c msgid "git archive: Remote with no URL" -msgstr "git archive:未æä¾›é 端 URL" +msgstr "git archive: 未æä¾›é 端 URL" #: builtin/archive.c msgid "git archive: expected ACK/NAK, got a flush packet" -msgstr "git archive:期望是 ACK/NAK,å»å¾—到 flush 包" +msgstr "git archiveï¼šé æœŸæ˜¯ ACK/NAKï¼Œå»æ”¶åˆ° flush å°åŒ…" #: builtin/archive.c #, c-format msgid "git archive: NACK %s" -msgstr "git archive:NACK %s" +msgstr "git archive: NACK %s" #: builtin/archive.c msgid "git archive: protocol error" -msgstr "git archive:å”定錯誤" +msgstr "git archive:通訊å”定錯誤" #: builtin/archive.c msgid "git archive: expected a flush" -msgstr "git archive:應有一個 flush 包" +msgstr "git archiveï¼šé æœŸæ”¶åˆ° flush å°åŒ…" #: builtin/bisect--helper.c msgid "git bisect--helper --bisect-reset [<commit>]" -msgstr "git bisect--helper --bisect-reset [<æäº¤>]" +msgstr "git bisect--helper --bisect-reset [<commit>]" #: builtin/bisect--helper.c msgid "" @@ -2753,24 +2766,25 @@ msgid "" "=<term>] [--no-checkout] [--first-parent] [<bad> [<good>...]] [--] " "[<paths>...]" msgstr "" -"git bisect--helper --bisect-start [--term-{new,bad}=<術語> --term-{old,good}" -"=<術語>] [--no-checkout] [--first-parent] [<壞> [<好>...]] [--] [<路徑>...]" +"git bisect--helper --bisect-start [--term-{new,bad}=<term> --term-{old,good}" +"=<term>] [--no-checkout] [--first-parent] [<bad> [<good>...]] [--] " +"[<paths>...]" #: builtin/bisect--helper.c msgid "git bisect--helper --bisect-state (bad|new) [<rev>]" -msgstr "git bisect--helper --bisect-state (bad|new) [<修訂版>]" +msgstr "git bisect--helper --bisect-state (bad|new) [<rev>]" #: builtin/bisect--helper.c msgid "git bisect--helper --bisect-state (good|old) [<rev>...]" -msgstr "git bisect--helper --bisect-state (good|old) [<修訂版>...]" +msgstr "git bisect--helper --bisect-state (good|old) [<rev>...]" #: builtin/bisect--helper.c msgid "git bisect--helper --bisect-replay <filename>" -msgstr "git bisect--helper --bisect-replay <檔å>" +msgstr "git bisect--helper --bisect-replay <filename>" #: builtin/bisect--helper.c msgid "git bisect--helper --bisect-skip [(<rev>|<range>)...]" -msgstr "git bisect--helper --bisect-skip [(<修訂版>|<範åœ>)...]" +msgstr "git bisect--helper --bisect-skip [(<rev>|<range>)...]" #: builtin/bisect--helper.c msgid "git bisect--helper --bisect-run <cmd>..." @@ -2779,32 +2793,32 @@ msgstr "git bisect--helper --bisect-run <cmd>..." #: builtin/bisect--helper.c #, c-format msgid "cannot open file '%s' in mode '%s'" -msgstr "無法以 '%2$s' 模å¼é–‹å•Ÿ '%1$s' 檔案" +msgstr "無法以 “%2$s†模å¼é–‹å•Ÿ “%1$s†檔案" #: builtin/bisect--helper.c #, c-format msgid "could not write to file '%s'" -msgstr "無法寫入 '%s' 檔案" +msgstr "無法寫入 “%s†檔案" #: builtin/bisect--helper.c #, c-format msgid "cannot open file '%s' for reading" -msgstr "無法開啟「%sã€æª”案進行讀å–" +msgstr "無法開啟 “%s†檔案進行讀å–" #: builtin/bisect--helper.c #, c-format msgid "'%s' is not a valid term" -msgstr "'%s' 䏿˜¯ä¸€å€‹æœ‰æ•ˆçš„術語" +msgstr "“%sâ€ ä¸æ˜¯æœ‰æ•ˆè¡“語" #: builtin/bisect--helper.c #, c-format msgid "can't use the builtin command '%s' as a term" -msgstr "ä¸èƒ½ä½¿ç”¨å…§å»ºæŒ‡ä»¤ '%s' 作為術語" +msgstr "ä¸èƒ½å°‡å…§å»ºå‘½ä»¤ “%s†當作術語使用" #: builtin/bisect--helper.c #, c-format msgid "can't change the meaning of the term '%s'" -msgstr "ä¸èƒ½ä¿®æ”¹è¡“語 '%s' çš„å«ç¾©" +msgstr "ä¸èƒ½è®Šæ›´è¡“語 “%s†的å«ç¾©" #: builtin/bisect--helper.c msgid "please use two different terms" @@ -2818,33 +2832,33 @@ msgstr "我們沒有在二分æœå°‹ã€‚\n" #: builtin/bisect--helper.c #, c-format msgid "'%s' is not a valid commit" -msgstr "'%s' 䏿˜¯ä¸€å€‹æœ‰æ•ˆçš„æäº¤" +msgstr "“%sâ€ ä¸æ˜¯æœ‰æ•ˆçš„æäº¤" #: builtin/bisect--helper.c #, c-format msgid "" "could not check out original HEAD '%s'. Try 'git bisect reset <commit>'." -msgstr "ä¸èƒ½ç°½å‡ºåŽŸå§‹ HEAD '%s'。嘗試 'git bisect reset <æäº¤>'。" +msgstr "ä¸èƒ½ç°½å‡ºåŽŸå§‹ HEAD “%sâ€ã€‚請嘗試 “git bisect reset <commit>â€ã€‚" #: builtin/bisect--helper.c #, c-format msgid "Bad bisect_write argument: %s" -msgstr "壞的 bisect_write åƒæ•¸ï¼š%s" +msgstr "bisect_write 引數無效:%s" #: builtin/bisect--helper.c #, c-format msgid "couldn't get the oid of the rev '%s'" -msgstr "無法å–得版本 '%s' 的物件 ID" +msgstr "無法å–得修訂版 “%s†的物件 ID" #: builtin/bisect--helper.c #, c-format msgid "couldn't open the file '%s'" -msgstr "無法開啟檔案 '%s'" +msgstr "無法開啟檔案 “%sâ€" #: builtin/bisect--helper.c #, c-format msgid "Invalid command: you're currently in a %s/%s bisect" -msgstr "ç„¡æ•ˆçš„æŒ‡ä»¤ï¼šæ‚¨ç›®å‰æ£è™•於一個 %s/%s 二分æœå°‹ä¸" +msgstr "å‘½ä»¤ç„¡æ•ˆï¼šæ‚¨ç›®å‰æ£è™•於二分æœå°‹ %s/%s 的狀態" #: builtin/bisect--helper.c #, c-format @@ -2852,8 +2866,8 @@ msgid "" "You need to give me at least one %s and %s revision.\n" "You can use \"git bisect %s\" and \"git bisect %s\" for that." msgstr "" -"您需è¦çµ¦æˆ‘至少一個 %s 和一個 %s 版本。\n" -"ç‚ºæ¤æ‚¨å¯ä»¥ç”¨ \"git bisect %s\" å’Œ \"git bisect %s\"。" +"需指定至少一個 %s 和一個 %s 修訂版。\n" +"ç‚ºæ¤æ‚¨å¯ä»¥ç”¨ “git bisect %s†和 “git bisect %sâ€ã€‚" #: builtin/bisect--helper.c #, c-format @@ -2862,9 +2876,9 @@ msgid "" "You then need to give me at least one %s and %s revision.\n" "You can use \"git bisect %s\" and \"git bisect %s\" for that." msgstr "" -"您需è¦åŸ·è¡Œ \"git bisect start\" 來開始。\n" -"ç„¶å¾Œéœ€è¦æä¾›æˆ‘è‡³å°‘ä¸€å€‹ %s 和一個 %s 版本。\n" -"ç‚ºæ¤æ‚¨å¯ä»¥ç”¨ \"git bisect %s\" å’Œ \"git bisect %s\" 指令。" +"è¦é–‹å§‹ï¼Œè«‹åŸ·è¡Œ “git bisect startâ€ã€‚\n" +"接著æä¾›è‡³å°‘一個 %s 和一個 %s 修訂版。\n" +"ç‚ºæ¤æ‚¨å¯ä»¥ç”¨ “git bisect %s†和 “git bisect %sâ€ã€‚" #: builtin/bisect--helper.c #, c-format @@ -2878,7 +2892,7 @@ msgstr "åœ¨åªæœ‰ä¸€å€‹ %s æäº¤çš„æƒ…æ³ä¸‹äºŒåˆ†æœå°‹" #. #: builtin/bisect--helper.c msgid "Are you sure [Y/n]? " -msgstr "您確èªå—Ž[Y/n]? " +msgstr "是å¦ç¢ºå®š [Y/n]? " #: builtin/bisect--helper.c msgid "status: waiting for both good and bad commits\n" @@ -2903,7 +2917,9 @@ msgstr "未定義術語" msgid "" "Your current terms are %s for the old state\n" "and %s for the new state.\n" -msgstr "您目å‰é‡å°èˆŠç‹€æ…‹çš„術語是 %sï¼Œå°æ–°ç‹€æ…‹çš„術語是 %s。\n" +msgstr "" +"您目å‰é‡å°èˆŠç‹€æ…‹çš„術語是 %sï¼›\n" +"å°æ–°ç‹€æ…‹çš„術語是 %s。\n" #: builtin/bisect--helper.c #, c-format @@ -2911,57 +2927,57 @@ msgid "" "invalid argument %s for 'git bisect terms'.\n" "Supported options are: --term-good|--term-old and --term-bad|--term-new." msgstr "" -"指令 'git bisect terms' çš„åƒæ•¸ %s 無效。\n" +"傳入 “git bisect terms†的 %s 引數無效。\n" "支æ´çš„é¸é …有:--term-good|--term-old å’Œ --term-bad|--term-new。" #: builtin/bisect--helper.c msgid "revision walk setup failed\n" -msgstr "ç‰ˆæœ¬éæ·è¨å®šå¤±æ•—\n" +msgstr "ä¿®è¨‚ç‰ˆéæ·è¨å®šå¤±æ•—\n" #: builtin/bisect--helper.c #, c-format msgid "could not open '%s' for appending" -msgstr "無法開啟 '%s' é€²è¡Œé™„åŠ " +msgstr "無法開啟 “%sâ€ é€²è¡Œé™„åŠ " #: builtin/bisect--helper.c msgid "'' is not a valid term" -msgstr "'' 䏿˜¯ä¸€å€‹æœ‰æ•ˆçš„術語" +msgstr "“ â€ ä¸æ˜¯æœ‰æ•ˆè¡“語" #: builtin/bisect--helper.c #, c-format msgid "unrecognized option: '%s'" -msgstr "未è˜åˆ¥çš„é¸é …:'%s'" +msgstr "無法è˜åˆ¥é¸é …:“%sâ€" #: builtin/bisect--helper.c #, c-format msgid "'%s' does not appear to be a valid revision" -msgstr "'%s' çœ‹èµ·ä¾†ä¸æ˜¯ä¸€å€‹æœ‰æ•ˆçš„版本" +msgstr "“%sâ€ ä¼¼ä¹Žä¸æ˜¯æœ‰æ•ˆä¿®è¨‚版" #: builtin/bisect--helper.c msgid "bad HEAD - I need a HEAD" -msgstr "壞的 HEAD - 我需è¦ä¸€å€‹ HEAD" +msgstr "HEAD 無效 — 需è¦ä¸€å€‹ HEAD" #: builtin/bisect--helper.c #, c-format msgid "checking out '%s' failed. Try 'git bisect start <valid-branch>'." -msgstr "簽出 '%s' 失敗。嘗試 'git bisect start <有效分支>'。" +msgstr "簽出 “%s†失敗。請嘗試 “git bisect start <valid-branch>â€ã€‚" #: builtin/bisect--helper.c msgid "won't bisect on cg-seek'ed tree" -msgstr "䏿œƒåœ¨åšäº† cg-seek 的樹上åšäºŒåˆ†æœå°‹" +msgstr "䏿œƒåœ¨åšäº† cg-seek 的樹狀物件上進行二分æœå°‹" #: builtin/bisect--helper.c msgid "bad HEAD - strange symbolic ref" -msgstr "壞的 HEAD - 奇怪的符號引用" +msgstr "HEAD 無效 — 異常符號引用" #: builtin/bisect--helper.c #, c-format msgid "invalid ref: '%s'" -msgstr "無效的引用:'%s'" +msgstr "引用無效:“%sâ€" #: builtin/bisect--helper.c msgid "You need to start by \"git bisect start\"\n" -msgstr "您需è¦åŸ·è¡Œ \"git bisect start\" 來開始\n" +msgstr "è¦é–‹å§‹ï¼Œè«‹åŸ·è¡Œ “git bisect startâ€\n" # è¯è€…ï¼šè«‹ç¶æŒå¥å°¾ç©ºæ ¼ #. TRANSLATORS: Make sure to include [Y] and [n] in your @@ -2970,7 +2986,7 @@ msgstr "您需è¦åŸ·è¡Œ \"git bisect start\" 來開始\n" #. #: builtin/bisect--helper.c msgid "Do you want me to do it for you [Y/n]? " -msgstr "您想讓我為您這樣åšå—Ž[Y/n]? " +msgstr "是å¦è¦é€™éº¼åš [Y/n]? " #: builtin/bisect--helper.c msgid "Please call `--bisect-state` with at least one argument" @@ -2979,17 +2995,17 @@ msgstr "è¦å‘¼å« `--bisect-state`,請傳入一個以上的引數" #: builtin/bisect--helper.c #, c-format msgid "'git bisect %s' can take only one argument." -msgstr "'git bisect %s' åªèƒ½æœ‰ä¸€å€‹åƒæ•¸ã€‚" +msgstr "“git bisect %s†åªå–一個引數。" #: builtin/bisect--helper.c #, c-format msgid "Bad rev input: %s" -msgstr "<修訂版> è¼¸å…¥æ ¼å¼éŒ¯èª¤ï¼š%s" +msgstr "rev è¼¸å…¥æ ¼å¼éŒ¯èª¤ï¼š%s" #: builtin/bisect--helper.c #, c-format msgid "Bad rev input (not a commit): %s" -msgstr "ä¿®è¨‚ç‰ˆè¼¸å…¥æœ‰èª¤ï¼ˆä¸æ˜¯æäº¤ï¼‰ï¼š%s" +msgstr "rev è¼¸å…¥æœ‰èª¤ï¼ˆä¸æ˜¯æäº¤ï¼‰ï¼š%s" #: builtin/bisect--helper.c msgid "We are not bisecting." @@ -3003,7 +3019,7 @@ msgstr "「%sã€ï¼Ÿï¼Ÿæ‚¨åœ¨èªªä»€éº¼ï¼Ÿ" #: builtin/bisect--helper.c #, c-format msgid "cannot read file '%s' for replaying" -msgstr "無法讀å–「%sã€æª”æ¡ˆä¾†é‡æ”¾" +msgstr "無法讀å–「%sã€æª”æ¡ˆé€²è¡Œé‡æ”¾" #: builtin/bisect--helper.c #, c-format @@ -3012,27 +3028,27 @@ msgstr "æ£åœ¨åŸ·è¡Œ %s\n" #: builtin/bisect--helper.c msgid "bisect run failed: no command provided." -msgstr "二分æœå°‹åŸ·è¡Œå¤±æ•—:沒有æä¾›æŒ‡ä»¤ã€‚" +msgstr "二分æœå°‹åŸ·è¡Œå¤±æ•—:沒有æä¾›å‘½ä»¤ã€‚" #: builtin/bisect--helper.c #, c-format msgid "unable to verify '%s' on good revision" -msgstr "無法在æ£ç¢ºä¿®è¨‚版上驗è‰ã€Œ%sã€" +msgstr "ç„¡æ³•åœ¨å¥½çš„ä¿®è¨‚ç‰ˆä¸Šé©—è‰ â€œ%sâ€" #: builtin/bisect--helper.c #, c-format msgid "bogus exit code %d for good revision" -msgstr "æ£ç¢ºä¿®è¨‚版回傳å½é€ 的錯誤代碼 %d" +msgstr "好的修訂版回傳å½é€ 的錯誤碼 %d" #: builtin/bisect--helper.c #, c-format msgid "bisect run failed: exit code %d from '%s' is < 0 or >= 128" -msgstr "二分æœå°‹åŸ·è¡Œå¤±æ•—:「%2$sã€è¿”回的離開碼 %1$d å°æ–¼ 0 或 >= 128" +msgstr "二分æœå°‹åŸ·è¡Œå¤±æ•—:“%2$s†回傳的離開碼 %1$d å°æ–¼ 0 或 >= 128" #: builtin/bisect--helper.c #, c-format msgid "cannot open file '%s' for writing" -msgstr "無法開啟「%sã€æª”案進行寫入" +msgstr "無法開啟 “%s†檔案進行寫入" #: builtin/bisect--helper.c msgid "bisect run cannot continue any more" @@ -3054,63 +3070,15 @@ msgid "" "bisect run failed: 'git bisect--helper --bisect-state %s' exited with error " "code %d" msgstr "" -"二分æœå°‹åŸ·è¡Œå¤±æ•—:'git bisect--helper --bisect-state %s' 以錯誤代碼 %d 離開" - -#: builtin/bisect--helper.c -msgid "reset the bisection state" -msgstr "清除二分æœå°‹ç‹€æ…‹" - -#: builtin/bisect--helper.c -msgid "check whether bad or good terms exist" -msgstr "檢查壞的或好的術語是å¦å˜åœ¨" - -#: builtin/bisect--helper.c -msgid "print out the bisect terms" -msgstr "列å°äºŒåˆ†æœå°‹è¡“語" - -#: builtin/bisect--helper.c -msgid "start the bisect session" -msgstr "啟動二分æœå°‹éŽç¨‹" - -#: builtin/bisect--helper.c -msgid "find the next bisection commit" -msgstr "尋找下一個二分æœå°‹æäº¤" - -#: builtin/bisect--helper.c -msgid "mark the state of ref (or refs)" -msgstr "標記 ref (或 refs) 的狀態" - -#: builtin/bisect--helper.c -msgid "list the bisection steps so far" -msgstr "列出迄今的二分æœå°‹æ¥é©Ÿ" - -#: builtin/bisect--helper.c -msgid "replay the bisection process from the given file" -msgstr "å¾žæŒ‡å®šæª”æ¡ˆé‡æ”¾äºŒåˆ†æœå°‹éŽç¨‹" - -#: builtin/bisect--helper.c -msgid "skip some commits for checkout" -msgstr "ç•¥éŽè¦ç°½å‡ºçš„部分æäº¤" - -#: builtin/bisect--helper.c -msgid "visualize the bisection" -msgstr "視覺化二分æœå°‹éŽç¨‹" - -#: builtin/bisect--helper.c -msgid "use <cmd>... to automatically bisect" -msgstr "使用 <cmd>... 自動進行二分æœå°‹" - -#: builtin/bisect--helper.c -msgid "no log for BISECT_WRITE" -msgstr "BISECT_WRITE 無日誌" +"二分æœå°‹åŸ·è¡Œå¤±æ•—:“git bisect--helper --bisect-state %s†以錯誤碼 %d 離開" #: builtin/bisect--helper.c msgid "--bisect-reset requires either no argument or a commit" -msgstr "--bisect-reset ç„¡éœ€åƒæ•¸æˆ–者需è¦ä¸€å€‹æäº¤" +msgstr "--bisect-reset å¯ä»¥ä¸éœ€è¦å¼•數,或者得傳入一個æäº¤" #: builtin/bisect--helper.c msgid "--bisect-terms requires 0 or 1 argument" -msgstr "--bisect-terms éœ€è¦ 0 或 1 å€‹åƒæ•¸" +msgstr "--bisect-terms éœ€è¦ 0 或 1 個引數" #: builtin/bisect--helper.c msgid "--bisect-next requires 0 arguments" @@ -3129,6 +3097,10 @@ msgid "git blame [<options>] [<rev-opts>] [<rev>] [--] <file>" msgstr "git blame [<é¸é …>] [<版本é¸é …>] [<版本>] [--] <檔案>" #: builtin/blame.c +msgid "git annotate [<options>] [<rev-opts>] [<rev>] [--] <file>" +msgstr "git annotate [<é¸é …>] [<版本é¸é …>] [<版本>] [--] <檔案>" + +#: builtin/blame.c msgid "<rev-opts> are documented in git-rev-list(1)" msgstr "<版本é¸é …> 的檔案記錄在 git-rev-list(1) ä¸" @@ -3367,10 +3339,6 @@ msgid "cannot use -a with -d" msgstr "ä¸èƒ½å°‡ -a å’Œ -d åŒæ™‚使用" #: builtin/branch.c -msgid "Couldn't look up commit object for HEAD" -msgstr "無法查詢 HEAD 指å‘çš„æäº¤ç‰©ä»¶" - -#: builtin/branch.c #, c-format msgid "Cannot delete branch '%s' checked out at '%s'" msgstr "無法刪除在「%2$sã€ç°½å‡ºçš„「%1$sã€åˆ†æ”¯" @@ -3419,17 +3387,19 @@ msgid "Branch %s is being bisected at %s" msgstr "分支 %s æ£è¢«äºŒåˆ†æœå°‹æ–¼ %s" #: builtin/branch.c -msgid "cannot copy the current branch while not on any." -msgstr "無法複製目å‰åˆ†æ”¯å› 為ä¸è™•於任何分支上。" +#, c-format +msgid "Invalid branch name: '%s'" +msgstr "無效的分支å:'%s'" #: builtin/branch.c -msgid "cannot rename the current branch while not on any." -msgstr "ç„¡æ³•é‡æ–°å‘½åç›®å‰åˆ†æ”¯å› 為ä¸è™•於任何分支上。" +#, c-format +msgid "No commit on branch '%s' yet." +msgstr "分支 '%s' å°šç„¡æäº¤ã€‚" #: builtin/branch.c #, c-format -msgid "Invalid branch name: '%s'" -msgstr "無效的分支å:'%s'" +msgid "No branch named '%s'." +msgstr "沒有分支 '%s'。" #: builtin/branch.c msgid "Branch rename failed" @@ -3638,14 +3608,12 @@ msgid "cannot edit description of more than one branch" msgstr "ä¸èƒ½ç‚ºä¸€å€‹ä»¥ä¸Šçš„分支編輯æè¿°" #: builtin/branch.c -#, c-format -msgid "No commit on branch '%s' yet." -msgstr "分支 '%s' å°šç„¡æäº¤ã€‚" +msgid "cannot copy the current branch while not on any." +msgstr "無法複製目å‰åˆ†æ”¯å› 為ä¸è™•於任何分支上。" #: builtin/branch.c -#, c-format -msgid "No branch named '%s'." -msgstr "沒有分支 '%s'。" +msgid "cannot rename the current branch while not on any." +msgstr "ç„¡æ³•é‡æ–°å‘½åç›®å‰åˆ†æ”¯å› 為ä¸è™•於任何分支上。" #: builtin/branch.c msgid "too many branches for a copy operation" @@ -3726,11 +3694,11 @@ msgstr "䏿˜¯å¾ž git 版本庫執行 - 沒有å¯é¡¯ç¤ºçš„æŽ›é‰¤\n" #: builtin/bugreport.c msgid "" -"git bugreport [-o|--output-directory <file>] [-s|--suffix <format>] [--" -"diagnose[=<mode>]" +"git bugreport [(-o | --output-directory) <path>] [(-s | --suffix) <format>]\n" +" [--diagnose[=<mode>]]" msgstr "" -"git bugreport [-o|--output-directory <file>] [-s|--suffix <format>] [--" -"diagnose[=<mode>]" +"git bugreport [(-o | --output-directory) <path>] [(-s | --suffix) <format>]\n" +" [--diagnose[=<mode>]]" #: builtin/bugreport.c msgid "" @@ -3778,7 +3746,7 @@ msgstr "建立詳細診斷資訊的é¡å¤– zip å°å˜æª”案(é è¨å€¼æ˜¯ “sta #: builtin/bugreport.c msgid "specify a destination for the bugreport file(s)" -msgstr "æŒ‡å®šéŒ¯èª¤å ±å‘Šæª”æ¡ˆçš„ç›®çš„åœ°" +msgstr "請指定è‡èŸ²å ±å‘Šæª”案的目的地" #: builtin/bugreport.c msgid "specify a strftime format suffix for the filename(s)" @@ -3813,20 +3781,26 @@ msgid "Created new report at '%s'.\n" msgstr "已在「%sã€å»ºç«‹æ–°å ±å‘Šã€‚\n" #: builtin/bundle.c -msgid "git bundle create [<options>] <file> <git-rev-list args>" -msgstr "git bundle create [<é¸é …>] <檔案> <git-rev-list åƒæ•¸>" +msgid "" +"git bundle create [-q | --quiet | --progress | --all-progress] [--all-" +"progress-implied]\n" +" [--version=<version>] <file> <git-rev-list-args>" +msgstr "" +"git bundle create [-q | --quiet | --progress | --all-progress] [--all-" +"progress-implied]\n" +" [--version=<version>] <file> <git-rev-list-args>" #: builtin/bundle.c -msgid "git bundle verify [<options>] <file>" -msgstr "git bundle verify [<é¸é …>] <檔案>" +msgid "git bundle verify [-q | --quiet] <file>" +msgstr "git bundle verify [-q | --quiet] <file>" #: builtin/bundle.c msgid "git bundle list-heads <file> [<refname>...]" msgstr "git bundle list-heads <檔案> [<引用å稱>...]" #: builtin/bundle.c -msgid "git bundle unbundle <file> [<refname>...]" -msgstr "git bundle unbundle <檔案> [<引用å稱>...]" +msgid "git bundle unbundle [--progress] <file> [<refname>...]" +msgstr "git bundle unbundle [--progress] <file> [<refname>...]" #: builtin/bundle.c builtin/pack-objects.c msgid "do not show progress meter" @@ -3846,15 +3820,15 @@ msgstr "當進度表顯示時類似於 --all-progress" #: builtin/bundle.c msgid "specify bundle format version" -msgstr "æŒ‡å®šå¥—ä»¶çš„æ ¼å¼ç‰ˆæœ¬" +msgstr "æŒ‡å®šå¥—ä»¶åŒ…çš„æ ¼å¼ç‰ˆæœ¬" #: builtin/bundle.c msgid "Need a repository to create a bundle." -msgstr "需è¦ç‰ˆæœ¬åº«ä¾†å»ºç«‹å¥—件。" +msgstr "需è¦ç‰ˆæœ¬åº«ä¾†å»ºç«‹å¥—件包。" #: builtin/bundle.c msgid "do not show bundle details" -msgstr "ä¸é¡¯ç¤ºå¥—件詳細資訊" +msgstr "ä¸é¡¯ç¤ºå¥—件包的詳細資訊" #: builtin/bundle.c #, c-format @@ -3863,7 +3837,7 @@ msgstr "%s å¯ä»¥\n" #: builtin/bundle.c msgid "Need a repository to unbundle." -msgstr "需è¦ç‰ˆæœ¬åº«æ‰èƒ½æ‹†åˆ†å¥—件。" +msgstr "需è¦ç‰ˆæœ¬åº«æ‰èƒ½æ‹†åˆ†å¥—件包。" #: builtin/bundle.c msgid "Unbundling objects" @@ -3923,12 +3897,12 @@ msgid "" "git cat-file (--batch | --batch-check | --batch-command) [--batch-all-" "objects]\n" " [--buffer] [--follow-symlinks] [--unordered]\n" -" [--textconv | --filters]" +" [--textconv | --filters] [-z]" msgstr "" "git cat-file (--batch | --batch-check | --batch-command) [--batch-all-" "objects]\n" " [--buffer] [--follow-symlinks] [--unordered]\n" -" [--textconv | --filters]" +" [--textconv | --filters] [-z]" #: builtin/cat-file.c msgid "" @@ -3984,7 +3958,7 @@ msgstr "類似 --batch 但ä¸è¼¸å‡º <contents>" #: builtin/cat-file.c msgid "stdin is NUL-terminated" -msgstr "標準輸入的çµå°¾æ˜¯ NUL" +msgstr "標準輸入以 NUL å—元終æ¢" #: builtin/cat-file.c msgid "read commands from stdin" @@ -4065,11 +4039,6 @@ msgstr "<rev> éœ€è¦æé…「%sã€" msgid "<object> required with '-%c'" msgstr "<object> éœ€è¦æé…「-%cã€" -#: builtin/cat-file.c builtin/notes.c builtin/prune-packed.c -#: builtin/receive-pack.c builtin/tag.c -msgid "too many arguments" -msgstr "å¤ªå¤šåƒæ•¸" - #: builtin/cat-file.c #, c-format msgid "only two arguments allowed in <type> <object> mode, not %d" @@ -4714,9 +4683,10 @@ msgstr "ä½¿ç”¨ç–ŠåŠ æ¨¡å¼" #: builtin/clean.c msgid "" -"git clean [-d] [-f] [-i] [-n] [-q] [-e <pattern>] [-x | -X] [--] <paths>..." +"git clean [-d] [-f] [-i] [-n] [-q] [-e <pattern>] [-x | -X] [--] " +"[<pathspec>...]" msgstr "" -"git clean [-d] [-f] [-i] [-n] [-q] [-e <模å¼>] [-x | -X] [--] <路徑>..." +"git clean [-d] [-f] [-i] [-n] [-q] [-e <模å¼>] [-x | -X] [--] [<è·¯å¾‘è¦æ ¼>...]" #: builtin/clean.c #, c-format @@ -5059,7 +5029,7 @@ msgstr "uri" #: builtin/clone.c msgid "a URI for downloading bundles before fetching from origin remote" -msgstr "在從 origin é 端抓å–å‰ï¼Œç”¨ä¾†ä¸‹è¼‰å¥—ä»¶çš„ URI" +msgstr "在從 origin é 端抓å–å‰ï¼Œç”¨ä¾†ä¸‹è¼‰å¥—件包的 URI" #: builtin/clone.c #, c-format @@ -5081,6 +5051,11 @@ msgstr "%s å˜åœ¨ä¸”䏿˜¯ä¸€å€‹ç›®éŒ„" msgid "failed to start iterator over '%s'" msgstr "無法在 '%s' 上啟動疊代器" +#: builtin/clone.c +#, c-format +msgid "symlink '%s' exists, refusing to clone with --local" +msgstr "「%sã€ç¬¦è™Ÿé€£çµå·²å˜åœ¨ï¼Œæ‹’絕使用 --local 複製" + #: builtin/clone.c compat/precompose_utf8.c #, c-format msgid "failed to unlink '%s'" @@ -5136,7 +5111,7 @@ msgstr "無法åˆå§‹åŒ–稀ç–簽出" #: builtin/clone.c msgid "remote HEAD refers to nonexistent ref, unable to checkout" -msgstr "é 端 HEAD 指å‘ä¸å˜åœ¨çš„引用,無法簽出" +msgstr "é 端 HEAD 指å‘一個ä¸å˜åœ¨çš„引用,無法簽出" #: builtin/clone.c msgid "unable to checkout working tree" @@ -5163,11 +5138,6 @@ msgid "You must specify a repository to clone." msgstr "æ‚¨å¿…é ˆæŒ‡å®šè¦è¤‡è£½çš„版本庫。" #: builtin/clone.c -#, c-format -msgid "options '%s' and '%s %s' cannot be used together" -msgstr "「%sã€å’Œã€Œ%s %sã€é¸é …ä¸å¾—åŒæ™‚使用" - -#: builtin/clone.c msgid "" "--bundle-uri is incompatible with --depth, --shallow-since, and --shallow-" "exclude" @@ -5259,16 +5229,16 @@ msgstr "--local 被忽略" #: builtin/clone.c msgid "cannot clone from filtered bundle" -msgstr "ç„¡æ³•å¾žéŽæ¿¾å¾Œçš„套件複製" +msgstr "ç„¡æ³•å¾žéŽæ¿¾å¾Œçš„套件包複製" #: builtin/clone.c msgid "failed to initialize the repo, skipping bundle URI" -msgstr "無法åˆå§‹åŒ–版本庫,略éŽå¥—ä»¶ URI" +msgstr "無法åˆå§‹åŒ–版本庫,略éŽå¥—件包 URI" #: builtin/clone.c #, c-format msgid "failed to fetch objects from bundle URI '%s'" -msgstr "無法從套件 URL “%s†抓å–物件" +msgstr "無法從套件包 URL “%s†抓å–物件" #: builtin/clone.c msgid "remote transport reported error" @@ -5317,22 +5287,27 @@ msgstr "--command å¿…é ˆæ˜¯ç¬¬ä¸€å€‹åƒæ•¸" #: builtin/commit-graph.c msgid "" -"git commit-graph verify [--object-dir <objdir>] [--shallow] [--[no-]progress]" +"git commit-graph verify [--object-dir <dir>] [--shallow] [--[no-]progress]" msgstr "" -"git commit-graph verify [--object-dir <物件目錄>] [--shallow] [--" -"[no-]progress]" +"git commit-graph verify [--object-dir <目錄>] [--shallow] [--[no-]progress]" #: builtin/commit-graph.c msgid "" -"git commit-graph write [--object-dir <objdir>] [--append] [--" -"split[=<strategy>]] [--reachable|--stdin-packs|--stdin-commits] [--changed-" -"paths] [--[no-]max-new-filters <n>] [--[no-]progress] <split options>" -msgstr "" -"git commit-graph write [--object-dir <objdir>] [--append] [--" -"split[=<strategy>]] [--reachable|--stdin-packs|--stdin-commits] [--changed-" -"paths] [--[no-]max-new-filters <n>] [--[no-]progress] <split options>" - -#: builtin/commit-graph.c builtin/fetch.c builtin/log.c +"git commit-graph write [--object-dir <dir>] [--append]\n" +" [--split[=<strategy>]] [--reachable | --stdin-packs | " +"--stdin-commits]\n" +" [--changed-paths] [--[no-]max-new-filters <n>] [--" +"[no-]progress]\n" +" <split options>" +msgstr "" +"git commit-graph write [--object-dir <dir>] [--append]\n" +" [--split[=<strategy>]] [--reachable | --stdin-packs | " +"--stdin-commits]\n" +" [--changed-paths] [--[no-]max-new-filters <n>] [--" +"[no-]progress]\n" +" <split options>" + +#: builtin/commit-graph.c builtin/fetch.c builtin/log.c builtin/repack.c msgid "dir" msgstr "目錄" @@ -5418,12 +5393,16 @@ msgid "Collecting commits from input" msgstr "æ£åœ¨å¾žè¼¸å…¥æ”¶é›†æäº¤" #: builtin/commit-tree.c +msgid "git commit-tree <tree> [(-p <parent>)...]" +msgstr "git commit-tree <tree> [(-p <parent>)...]" + +#: builtin/commit-tree.c msgid "" -"git commit-tree [(-p <parent>)...] [-S[<keyid>]] [(-m <message>)...] [(-F " -"<file>)...] <tree>" +"git commit-tree [(-p <parent>)...] [-S[<keyid>]] [(-m <message>)...]\n" +" [(-F <file>)...] <tree>" msgstr "" -"git commit-tree [(-p <父æäº¤>)...] [-S[<keyid>]] [(-m <消æ¯>)...] [(-F <檔案" -">)...] <樹>" +"git commit-tree [(-p <parent>)...] [-S[<keyid>]] [(-m <message>)...]\n" +" [(-F <file>)...] <tree>" #: builtin/commit-tree.c #, c-format @@ -5480,12 +5459,30 @@ msgid "git commit-tree: failed to read" msgstr "git commit-tree:讀å–失敗" #: builtin/commit.c -msgid "git commit [<options>] [--] <pathspec>..." -msgstr "git commit [<é¸é …>] [--] <è·¯å¾‘è¦æ ¼>..." +msgid "" +"git commit [-a | --interactive | --patch] [-s] [-v] [-u<mode>] [--amend]\n" +" [--dry-run] [(-c | -C | --squash) <commit> | --fixup [(amend|" +"reword):]<commit>)]\n" +" [-F <file> | -m <msg>] [--reset-author] [--allow-empty]\n" +" [--allow-empty-message] [--no-verify] [-e] [--author=<author>]\n" +" [--date=<date>] [--cleanup=<mode>] [--[no-]status]\n" +" [-i | -o] [--pathspec-from-file=<file> [--pathspec-file-nul]]\n" +" [(--trailer <token>[(=|:)<value>])...] [-S[<keyid>]]\n" +" [--] [<pathspec>...]" +msgstr "" +"git commit [-a | --interactive | --patch] [-s] [-v] [-u<mode>] [--amend]\n" +" [--dry-run] [(-c | -C | --squash) <commit> | --fixup [(amend|" +"reword):]<commit>)]\n" +" [-F <file> | -m <msg>] [--reset-author] [--allow-empty]\n" +" [--allow-empty-message] [--no-verify] [-e] [--author=<author>]\n" +" [--date=<date>] [--cleanup=<mode>] [--[no-]status]\n" +" [-i | -o] [--pathspec-from-file=<file> [--pathspec-file-nul]]\n" +" [(--trailer <token>[(=|:)<value>])...] [-S[<keyid>]]\n" +" [--] [<pathspec>...]" #: builtin/commit.c -msgid "git status [<options>] [--] <pathspec>..." -msgstr "git status [<é¸é …>] [--] <è·¯å¾‘è¦æ ¼>..." +msgid "git status [<options>] [--] [<pathspec>...]" +msgstr "git status [<é¸é …>] [--] [<è·¯å¾‘è¦æ ¼>...]" #: builtin/commit.c msgid "" @@ -5827,7 +5824,7 @@ msgstr "顯示分支訊æ¯" #: builtin/commit.c msgid "show stash information" -msgstr "顯示儲è—å€è¨Šæ¯" +msgstr "顯示貯å˜å€è¨Šæ¯" #: builtin/commit.c msgid "compute full ahead/behind values" @@ -6100,7 +6097,7 @@ msgstr "使用版本庫級è¨å®šæª”案" msgid "use per-worktree config file" msgstr "使用工作å€ç´šåˆ¥çš„è¨å®šæª”案" -#: builtin/config.c +#: builtin/config.c builtin/gc.c msgid "use given config file" msgstr "使用指定的è¨å®šæª”案" @@ -6226,11 +6223,11 @@ msgstr "åªé¡¯ç¤ºè®Šæ•¸å" #: builtin/config.c msgid "respect include directives on lookup" -msgstr "查詢時åƒç…§ include 指令éžè¿´å°‹æ‰¾" +msgstr "查詢時引用 include 指令éžè¿´å°‹æ‰¾" #: builtin/config.c msgid "show origin of config (file, standard input, blob, command line)" -msgstr "顯示è¨å®šçš„來æºï¼ˆæª”æ¡ˆã€æ¨™æº–輸入ã€è³‡æ–™ç‰©ä»¶ï¼Œæˆ–指令列)" +msgstr "顯示è¨å®šçš„來æºï¼ˆæª”æ¡ˆã€æ¨™æº–輸入ã€è³‡æ–™ç‰©ä»¶ï¼Œæˆ–命令列)" #: builtin/config.c msgid "show scope of config (worktree, local, global, system, command)" @@ -6323,7 +6320,7 @@ msgstr "--blob åªèƒ½åœ¨ä¸€å€‹ç‰ˆæœ¬åº«å…§ä½¿ç”¨" msgid "--worktree can only be used inside a git repository" msgstr "--worktree åªèƒ½åœ¨ git 版本庫ä¸ä½¿ç”¨" -#: builtin/config.c +#: builtin/config.c builtin/gc.c msgid "$HOME not set" msgstr "$HOME 未è¨å®š" @@ -6433,12 +6430,20 @@ msgid "unable to get credential storage lock in %d ms" msgstr "無法在 %d 毫秒內å–得憑è‰å„²å˜ç©ºé–“的鎖" #: builtin/describe.c -msgid "git describe [<options>] [<commit-ish>...]" -msgstr "git describe [<é¸é …>] [<æäº¤è™Ÿ>...]" +msgid "" +"git describe [--all] [--tags] [--contains] [--abbrev=<n>] [<commit-ish>...]" +msgstr "" +"git describe [--all] [--tags] [--contains] [--abbrev=<n>] [<commit-ish>...]" + +#: builtin/describe.c +msgid "" +"git describe [--all] [--tags] [--contains] [--abbrev=<n>] --dirty[=<mark>]" +msgstr "" +"git describe [--all] [--tags] [--contains] [--abbrev=<n>] --dirty[=<mark>]" #: builtin/describe.c -msgid "git describe [<options>] --dirty" -msgstr "git describe [<é¸é …>] --dirty" +msgid "git describe <blob>" +msgstr "git describe <blob>" #: builtin/describe.c msgid "head" @@ -6591,15 +6596,15 @@ msgstr "「%sã€é¸é …å’Œæäº¤è™Ÿä¸å¾—åŒæ™‚使用" #: builtin/diagnose.c msgid "" -"git diagnose [-o|--output-directory <path>] [-s|--suffix <format>] [--" -"mode=<mode>]" +"git diagnose [(-o | --output-directory) <path>] [(-s | --suffix) <format>]\n" +" [--mode=<mode>]" msgstr "" -"git diagnose [-o|--output-directory <path>] [-s|--suffix <format>] [--" -"mode=<mode>]" +"git diagnose [(-o | --output-directory) <path>] [(-s | --suffix) <format>]\n" +" [--mode=<mode>]" #: builtin/diagnose.c msgid "specify a destination for the diagnostics archive" -msgstr "指定診斷å°å˜æª”的目的地" +msgstr "請指定診斷å°å˜æª”的目的地" #: builtin/diagnose.c msgid "specify a strftime format suffix for the filename" @@ -6619,6 +6624,10 @@ msgid "'%s': not a regular file or symlink" msgstr "'%s'ï¼šä¸æ˜¯ä¸€å€‹æ£è¦æª”案或符號連çµ" #: builtin/diff.c +msgid "no merge given, only parents." +msgstr "沒有æä¾›åˆä½µæäº¤ï¼Œåªæœ‰æä¾›çˆ¶æäº¤ã€‚" + +#: builtin/diff.c #, c-format msgid "invalid option: %s" msgstr "無效é¸é …:%s" @@ -6781,8 +6790,8 @@ msgstr "é¸é …「--defaultã€é 期收到「--type=boolã€çš„布林值,而éžã #: builtin/env--helper.c #, c-format msgid "" -"option `--default' expects an unsigned long value with `--type=ulong`, not `" -"%s`" +"option `--default' expects an unsigned long value with `--type=ulong`, not " +"`%s`" msgstr "é¸é …「--defaultã€é 期收到「--type=ulongã€çš„無號 long 數值,而éžã€Œ%sã€" #: builtin/fast-export.c @@ -7410,8 +7419,8 @@ msgid "print only refs which don't contain the commit" msgstr "åªåˆ—å°ä¸åŒ…å«è©²æäº¤çš„引用" #: builtin/for-each-repo.c -msgid "git for-each-repo --config=<config> <command-args>" -msgstr "git for-each-repo --config=<è¨å®š> <命令引數>" +msgid "git for-each-repo --config=<config> [--] <arguments>" +msgstr "git for-each-repo --config=<config> [--] <arguments>" #: builtin/for-each-repo.c msgid "config" @@ -7628,8 +7637,16 @@ msgid "%s: invalid sha1 pointer in resolve-undo" msgstr "%s:resolve-undo çš„ sha1 指é‡ç„¡æ•ˆ" #: builtin/fsck.c -msgid "git fsck [<options>] [<object>...]" -msgstr "git fsck [<é¸é …>] [<物件>...]" +msgid "" +"git fsck [--tags] [--root] [--unreachable] [--cache] [--no-reflogs]\n" +" [--[no-]full] [--strict] [--verbose] [--lost-found]\n" +" [--[no-]dangling] [--[no-]progress] [--connectivity-only]\n" +" [--[no-]name-objects] [<object>...]" +msgstr "" +"git fsck [--tags] [--root] [--unreachable] [--cache] [--no-reflogs]\n" +" [--[no-]full] [--strict] [--verbose] [--lost-found]\n" +" [--[no-]dangling] [--[no-]progress] [--connectivity-only]\n" +" [--[no-]name-objects] [<object>...]" #: builtin/fsck.c msgid "show unreachable objects" @@ -7702,14 +7719,6 @@ msgid "git fsmonitor--daemon run [<options>]" msgstr "git fsmonitor--daemon run [<options>]" #: builtin/fsmonitor--daemon.c -msgid "git fsmonitor--daemon stop" -msgstr "git fsmonitor--daemon stop" - -#: builtin/fsmonitor--daemon.c -msgid "git fsmonitor--daemon status" -msgstr "git fsmonitor--daemon status" - -#: builtin/fsmonitor--daemon.c #, c-format msgid "value of '%s' out of range: %d" msgstr "「%sã€çš„æ•¸å€¼è¶…出範åœï¼š%d" @@ -7809,7 +7818,7 @@ msgstr "è¦ç‰å¾…背景守è·ç¨‹å¼å•Ÿå‹•的最長秒數" msgid "invalid 'ipc-threads' value (%d)" msgstr "無效的「ipc-threadsã€æ•¸å€¼ï¼ˆ%d)" -#: builtin/fsmonitor--daemon.c +#: builtin/fsmonitor--daemon.c t/helper/test-cache-tree.c #, c-format msgid "Unhandled subcommand '%s'" msgstr "未處ç†çš„å命令「%sã€" @@ -7857,7 +7866,7 @@ msgstr "清除未引用的物件" #: builtin/gc.c msgid "pack unreferenced objects separately" -msgstr "ç¨ç«‹å°è£ç„¡åƒç…§ç‰©ä»¶" +msgstr "ç¨ç«‹å°è£ç„¡å¼•用物件" #: builtin/gc.c msgid "be more thorough (increased runtime)" @@ -8008,8 +8017,23 @@ msgid "use at most one of --auto and --schedule=<frequency>" msgstr "--auto å’Œ --schedule=<é »çŽ‡> è«‹ä»»é¸ä¸€" #: builtin/gc.c -msgid "failed to run 'git config'" -msgstr "無法執行 ‘git config’" +#, c-format +msgid "unable to add '%s' value of '%s'" +msgstr "無法為「%2$sã€çš„å€¼åŠ ä¸Šã€Œ%1$sã€" + +#: builtin/gc.c +msgid "return success even if repository was not registered" +msgstr "å³ä¾¿ç‰ˆæœ¬åº«æœªè¨»å†Šä»å›žå‚³æˆåŠŸç‹€æ…‹" + +#: builtin/gc.c +#, c-format +msgid "unable to unset '%s' value of '%s'" +msgstr "ç„¡æ³•å–æ¶ˆè¨å®šã€Œ%2$sã€çš„「%1$sã€å€¼" + +#: builtin/gc.c +#, c-format +msgid "repository '%s' is not registered" +msgstr "版本庫「%sã€æœªè¨»å†Š" #: builtin/gc.c #, c-format @@ -8386,11 +8410,15 @@ msgstr "åŒæ™‚給出了 --cached 和樹狀物件" #: builtin/hash-object.c msgid "" -"git hash-object [-t <type>] [-w] [--path=<file> | --no-filters] [--stdin] " -"[--] <file>..." +"git hash-object [-t <type>] [-w] [--path=<file> | --no-filters]\n" +" [--stdin [--literally]] [--] <file>..." msgstr "" -"git hash-object [-t <類型>] [-w] [--path=<檔案> | --no-filters] [--stdin] " -"[--] <檔案>..." +"git hash-object [-t <type>] [-w] [--path=<file> | --no-filters]\n" +" [--stdin [--literally]] [--] <file>..." + +#: builtin/hash-object.c +msgid "git hash-object [-t <type>] [-w] --stdin-paths [--no-filters]" +msgstr "git hash-object [-t <type>] [-w] --stdin-paths [--no-filters]" #: builtin/hash-object.c msgid "object type" @@ -8918,11 +8946,15 @@ msgstr "å·²åˆå§‹åŒ–空的 Git 版本庫於 %s%s\n" #: builtin/init-db.c msgid "" -"git init [-q | --quiet] [--bare] [--template=<template-directory>] [--" -"shared[=<permissions>]] [<directory>]" +"git init [-q | --quiet] [--bare] [--template=<template-directory>]\n" +" [--separate-git-dir <git-dir>] [--object-format=<format>]\n" +" [-b <branch-name> | --initial-branch=<branch-name>]\n" +" [--shared[=<permissions>]] [<directory>]" msgstr "" -"git init [-q | --quiet] [--bare] [--template=<範本目錄>] [--shared[=<權é™>]] " -"[<目錄>]" +"git init [-q | --quiet] [--bare] [--template=<template-directory>]\n" +" [--separate-git-dir <git-dir>] [--object-format=<format>]\n" +" [-b <branch-name> | --initial-branch=<branch-name>]\n" +" [--shared[=<permissions>]] [<directory>]" #: builtin/init-db.c msgid "permissions" @@ -8972,11 +9004,13 @@ msgstr "--separate-git-dir 與純版本庫ä¸ç›¸å®¹" #: builtin/interpret-trailers.c msgid "" -"git interpret-trailers [--in-place] [--trim-empty] [(--trailer " -"<token>[(=|:)<value>])...] [<file>...]" +"git interpret-trailers [--in-place] [--trim-empty]\n" +" [(--trailer <token>[(=|:)<value>])...]\n" +" [--parse] [<file>...]" msgstr "" -"git interpret-trailers [--in-place] [--trim-empty] [(--trailer <éµ>[(=|:)<值" -">])...] [<檔案>...]" +"git interpret-trailers [--in-place] [--trim-empty]\n" +" [(--trailer <token>[(=|:)<value>])...]\n" +" [--parse] [<file>...]" #: builtin/interpret-trailers.c msgid "edit files in place" @@ -9594,12 +9628,12 @@ msgstr "" #: builtin/ls-remote.c msgid "" "git ls-remote [--heads] [--tags] [--refs] [--upload-pack=<exec>]\n" -" [-q | --quiet] [--exit-code] [--get-url]\n" +" [-q | --quiet] [--exit-code] [--get-url] [--sort=<key>]\n" " [--symref] [<repository> [<refs>...]]" msgstr "" "git ls-remote [--heads] [--tags] [--refs] [--upload-pack=<exec>]\n" -" [-q | --quiet] [--exit-code] [--get-url]\n" -" [--symref] [<版本庫> [<引用>...]]" +" [-q | --quiet] [--exit-code] [--get-url] [--sort=<key>]\n" +" [--symref] [<repository> [<refs>...]]" #: builtin/ls-remote.c msgid "do not print remote URL" @@ -9752,7 +9786,7 @@ msgstr "在訊æ¯å…§æ–‡ä¸ä½¿ç”¨æ¨™é " #: builtin/mailsplit.c msgid "reading patches from stdin/tty..." -msgstr "æ£åœ¨å¾žæ¨™æº–輸入或 tty 讀å–修補檔內容⋯⋯" +msgstr "æ£åœ¨å¾žæ¨™æº–輸入或 tty 讀å–修補檔內容……" #: builtin/mailsplit.c #, c-format @@ -9768,14 +9802,14 @@ msgid "git merge-base [-a | --all] --octopus <commit>..." msgstr "git merge-base [-a | --all] --octopus <æäº¤>..." #: builtin/merge-base.c -msgid "git merge-base --independent <commit>..." -msgstr "git merge-base --independent <æäº¤>..." - -#: builtin/merge-base.c msgid "git merge-base --is-ancestor <commit> <commit>" msgstr "git merge-base --is-ancestor <æäº¤> <æäº¤>" #: builtin/merge-base.c +msgid "git merge-base --independent <commit>..." +msgstr "git merge-base --independent <æäº¤>..." + +#: builtin/merge-base.c msgid "git merge-base --fork-point <ref> [<commit>]" msgstr "git merge-base --fork-point <引用> [<æäº¤>]" @@ -9914,9 +9948,23 @@ msgid "allow merging unrelated histories" msgstr "å…許åˆä¸¦ä¸ç›¸é—œçš„æ·å²" #: builtin/merge-tree.c +msgid "perform multiple merges, one per line of input" +msgstr "執行多次åˆä½µï¼Œä¸€æ¬¡åŸ·è¡Œè¼¸å…¥ä¸€åˆ—" + +#: builtin/merge-tree.c msgid "--trivial-merge is incompatible with all other options" msgstr "--trivial-merge 和其他所有é¸é …都ä¸ç›¸å®¹" +#: builtin/merge-tree.c builtin/notes.c +#, c-format +msgid "malformed input line: '%s'." +msgstr "æ ¼å¼éŒ¯èª¤çš„輸入行:'%s'。" + +#: builtin/merge-tree.c +#, c-format +msgid "merging cannot continue; got unclean result of %d" +msgstr "無法繼續åˆä½µï¼šå¾ž %d æ”¶åˆ°çš„çµæžœä¸ä¹¾æ·¨" + #: builtin/merge.c msgid "git merge [<options>] [<commit>...]" msgstr "git merge [<é¸é …>] [<æäº¤>...]" @@ -10029,11 +10077,11 @@ msgstr "ç¹žéŽ pre-merge-commit å’Œ commit-msg 掛鉤" #: builtin/merge.c msgid "could not run stash." -msgstr "ä¸èƒ½åŸ·è¡Œå„²è—。" +msgstr "ä¸èƒ½åŸ·è¡Œè²¯å˜ã€‚" #: builtin/merge.c msgid "stash failed" -msgstr "儲è—失敗" +msgstr "貯å˜å¤±æ•—" #: builtin/merge.c #, c-format @@ -10286,7 +10334,7 @@ msgstr "自動åˆä½µé€²å±•é †åˆ©ï¼ŒæŒ‰è¦æ±‚在æäº¤å‰åœæ¢\n" #: builtin/merge.c #, c-format msgid "When finished, apply stashed changes with `git stash pop`\n" -msgstr "å®Œæˆæ™‚,使用 `git stash pop` å¥—ç”¨å„²è—æ›´æ”¹\n" +msgstr "å®Œæˆæ™‚,使用 `git stash pop` å¥—ç”¨è²¯å˜æ›´æ”¹\n" #: builtin/mktag.c #, c-format @@ -10406,7 +10454,7 @@ msgstr "目錄 %s 在索引ä¸ä¸¦ä¸”䏿˜¯å模組?" #: builtin/mv.c msgid "Please stage your changes to .gitmodules or stash them to proceed" -msgstr "請將您的修改暫å˜åˆ° .gitmodules 䏿ˆ–儲è—後å†ç¹¼çºŒ" +msgstr "請將您的修改暫å˜åˆ° .gitmodules 䏿ˆ–貯å˜å¾Œå†ç¹¼çºŒ" #: builtin/mv.c #, c-format @@ -10490,7 +10538,7 @@ msgstr "%s,來æº=%s,目的地=%s" msgid "Renaming %s to %s\n" msgstr "釿–°å‘½å %s 至 %s\n" -#: builtin/mv.c builtin/remote.c builtin/repack.c +#: builtin/mv.c builtin/remote.c #, c-format msgid "renaming '%s' failed" msgstr "釿–°å‘½å '%s' 失敗" @@ -10693,11 +10741,6 @@ msgstr "ä¸èƒ½å¾žéžè³‡æ–™ç‰©ä»¶ '%s' ä¸è®€å–註解資料。" #: builtin/notes.c #, c-format -msgid "malformed input line: '%s'." -msgstr "æ ¼å¼éŒ¯èª¤çš„輸入行:'%s'。" - -#: builtin/notes.c -#, c-format msgid "failed to copy notes from '%s' to '%s'" msgstr "從 '%s' 複製註解到 '%s' 時失敗" @@ -10928,14 +10971,13 @@ msgid "unknown subcommand: `%s'" msgstr "æœªçŸ¥åæŒ‡ä»¤ï¼šã€Œ%sã€" #: builtin/pack-objects.c -msgid "" -"git pack-objects --stdout [<options>...] [< <ref-list> | < <object-list>]" -msgstr "git pack-objects --stdout [<é¸é …>...] [< <引用列表> | < <物件列表>]" +msgid "git pack-objects --stdout [<options>] [< <ref-list> | < <object-list>]" +msgstr "git pack-objects --stdout [<é¸é …>] [< <引用列表> | < <物件列表>]" #: builtin/pack-objects.c msgid "" -"git pack-objects [<options>...] <base-name> [< <ref-list> | < <object-list>]" -msgstr "git pack-objects [<é¸é …>...] <å‰ç¶´å稱> [< <引用列表> | < <物件列表>]" +"git pack-objects [<options>] <base-name> [< <ref-list> | < <object-list>]" +msgstr "git pack-objects [<é¸é …>] <å‰ç¶´å稱> [< <引用列表> | < <物件列表>]" #: builtin/pack-objects.c #, c-format @@ -11406,8 +11448,8 @@ msgstr "" "感è¬ã€‚\n" #: builtin/pack-refs.c -msgid "git pack-refs [<options>]" -msgstr "git pack-refs [<é¸é …>]" +msgid "git pack-refs [--all] [--no-prune]" +msgstr "git pack-refs [--all] [--no-prune]" #: builtin/pack-refs.c msgid "pack everything" @@ -11417,6 +11459,22 @@ msgstr "打包一切" msgid "prune loose refs (default)" msgstr "剪除鬆散引用(é è¨ï¼‰" +#: builtin/patch-id.c +msgid "git patch-id [--stable | --unstable | --verbatim]" +msgstr "git patch-id [--stable | --unstable | --verbatim]" + +#: builtin/patch-id.c +msgid "use the unstable patch-id algorithm" +msgstr "使用ä¸ç©©å®šçš„ patch-id 演算法" + +#: builtin/patch-id.c +msgid "use the stable patch-id algorithm" +msgstr "使用穩定的 patch-id 演算法" + +#: builtin/patch-id.c +msgid "don't strip whitespace from the patch" +msgstr "ä¸è¦åŽ»é™¤ä¿®è£œæª”çš„ç©ºç™½å—å…ƒ" + #: builtin/prune.c msgid "git prune [-n] [-v] [--progress] [--expire <time>] [--] [<head>...]" msgstr "git prune [-n] [-v] [--progress] [--expire <時間>] [--] [<head>...]" @@ -11463,7 +11521,7 @@ msgstr "控制 pre-merge-commit å’Œ commit-msg 掛鉤的使用" #: builtin/pull.c parse-options.h msgid "automatically stash/stash pop before and after" -msgstr "在動作å‰å¾ŒåŸ·è¡Œè‡ªå‹•儲è—和彈出儲è—" +msgstr "在動作å‰å¾ŒåŸ·è¡Œè‡ªå‹•貯å˜å’Œå½ˆå‡ºè²¯å˜" #: builtin/pull.c msgid "Options related to fetching" @@ -11502,7 +11560,7 @@ msgid "" "for your current branch, you must specify a branch on the command line." msgstr "" "æ‚¨è¦æ±‚從é 端 '%s' 拉å–ï¼Œä½†æ˜¯æœªæŒ‡å®šä¸€å€‹åˆ†æ”¯ã€‚å› ç‚ºé€™ä¸æ˜¯ç›®å‰\n" -"分支é è¨çš„é ç«¯ç‰ˆæœ¬åº«ï¼Œæ‚¨å¿…é ˆåœ¨æŒ‡ä»¤åˆ—ä¸æŒ‡å®šä¸€å€‹åˆ†æ”¯å。" +"分支é è¨çš„é ç«¯ç‰ˆæœ¬åº«ï¼Œæ‚¨å¿…é ˆåœ¨å‘½ä»¤åˆ—ä¸æŒ‡å®šä¸€å€‹åˆ†æ”¯å。" #: builtin/pull.c builtin/rebase.c msgid "You are not currently on a branch." @@ -11594,7 +11652,7 @@ msgstr "é‡å®šåŸºåº•弿‹‰å–" #: builtin/pull.c msgid "please commit or stash them." -msgstr "è«‹æäº¤æˆ–儲è—它們。" +msgstr "è«‹æäº¤æˆ–貯å˜å®ƒå€‘。" #: builtin/pull.c #, c-format @@ -11666,14 +11724,14 @@ msgstr "" #: builtin/push.c msgid "" "\n" -"To avoid automatically configuring upstream branches when their name\n" -"doesn't match the local branch, see option 'simple' of branch." -"autoSetupMerge\n" +"To avoid automatically configuring an upstream branch when its name\n" +"won't match the local branch, see option 'simple' of branch.autoSetupMerge\n" "in 'git help config'.\n" msgstr "" "\n" -"為了é¿å…自動在上游分支的å稱與本機ä¸ç¬¦æ™‚,è¨å®šä¸Šæ¸¸çš„分支,請åƒé–±\n" -"“git help configâ€ ä¸ branch.autoSetupMerge çš„ “simple†é¸é …。\n" +"è‹¥è¦é¿å…在å稱與本機分支ä¸åŒæ™‚自動è¨å®šä¸Šæ¸¸åˆ†æ”¯ï¼Œ\n" +"è«‹åƒé–± “git help configâ€ ä¸ branch.autoSetupMerge çš„\n" +"“simple†é¸é …。\n" #: builtin/push.c #, c-format @@ -11827,6 +11885,12 @@ msgstr "推é€åˆ° %s\n" msgid "failed to push some refs to '%s'" msgstr "推é€ä¸€äº›å¼•用到 '%s' 失敗" +#: builtin/push.c +msgid "" +"recursing into submodule with push.recurseSubmodules=only; using on-demand " +"instead" +msgstr "在有 push.recurseSubmodules=only; 的情æ³å˜—試éžè¿´å模組;改用 on-demand" + #: builtin/push.c builtin/send-pack.c submodule-config.c #, c-format msgid "invalid value for '%s'" @@ -11999,13 +12063,15 @@ msgstr "需è¦å…©å€‹æäº¤ç¯„åœ" #: builtin/read-tree.c msgid "" -"git read-tree [(-m [--trivial] [--aggressive] | --reset | --prefix=<prefix>) " -"[-u | -i]] [--no-sparse-checkout] [--index-output=<file>] (--empty | <tree-" -"ish1> [<tree-ish2> [<tree-ish3>]])" +"git read-tree [(-m [--trivial] [--aggressive] | --reset | --" +"prefix=<prefix>)\n" +" [-u | -i]] [--index-output=<file>] [--no-sparse-checkout]\n" +" (--empty | <tree-ish1> [<tree-ish2> [<tree-ish3>]])" msgstr "" -"git read-tree [(-m [--trivial] [--aggressive] | --reset | --prefix=<å‰ç¶´>) [-" -"u | -i]] [--no-sparse-checkout] [--index-output=<檔案>] (--empty | <樹狀物件" -"1> [<樹狀物件2> [<樹狀物件3>]])" +"git read-tree [(-m [--trivial] [--aggressive] | --reset | --" +"prefix=<prefix>)\n" +" [-u | -i]] [--index-output=<file>] [--no-sparse-checkout]\n" +" (--empty | <tree-ish1> [<tree-ish2> [<tree-ish3>]])" #: builtin/read-tree.c msgid "write resulting index to <file>" @@ -12122,8 +12188,8 @@ msgstr "%s 需è¦åˆä½µå¾Œç«¯" #: builtin/rebase.c #, c-format -msgid "could not get 'onto': '%s'" -msgstr "無法å–å¾— 'onto':'%s'" +msgid "invalid onto: '%s'" +msgstr "無效的 onto:「%sã€" #: builtin/rebase.c #, c-format @@ -12179,8 +12245,8 @@ msgstr "無法切æ›åˆ° %s" #: builtin/rebase.c #, c-format msgid "" -"unrecognized empty type '%s'; valid values are \"drop\", \"keep\", and \"ask" -"\"." +"unrecognized empty type '%s'; valid values are \"drop\", \"keep\", and " +"\"ask\"." msgstr "無法è˜åˆ¥çš„ '%s' 空類型;有效的數值有 \"drop\"ã€\"keep\" è·Ÿ \"ask\"。" #: builtin/rebase.c @@ -12488,8 +12554,8 @@ msgid "No such ref: %s" msgstr "沒有這樣的引用:%s" #: builtin/rebase.c -msgid "Could not resolve HEAD to a revision" -msgstr "無法將 HEAD è§£æžç‚ºä¸€å€‹ç‰ˆæœ¬" +msgid "Could not resolve HEAD to a commit" +msgstr "無法將 HEAD è§£æžæˆæäº¤" #: builtin/rebase.c #, c-format @@ -12508,7 +12574,7 @@ msgstr "沒有指å‘一個有效的æäº¤ '%s'" #: builtin/rebase.c msgid "Please commit or stash them." -msgstr "è«‹æäº¤æˆ–儲è—修改。" +msgstr "è«‹æäº¤æˆ–貯å˜ä¿®æ”¹ã€‚" #: builtin/rebase.c msgid "HEAD is up to date." @@ -13288,6 +13354,11 @@ msgid "could not close refs snapshot tempfile" msgstr "無法關閉 refs çš„å¿«ç…§æš«å˜æª”" #: builtin/repack.c +#, c-format +msgid "could not remove stale bitmap: %s" +msgstr "ç„¡æ³•ç§»é™¤éŽæ™‚ä½åœ–:%s" + +#: builtin/repack.c msgid "pack everything in a single pack" msgstr "所有內容打包到一個包檔案ä¸" @@ -13384,6 +13455,10 @@ msgid "write a multi-pack index of the resulting packs" msgstr "å¯«å…¥çµæžœåŒ…的多包索引" #: builtin/repack.c +msgid "pack prefix to store a pack containing pruned objects" +msgstr "å°è£å‰ç¶´ï¼Œå„²å˜ç‚ºåŒ…å«éŽæ™‚物件的套件包" + +#: builtin/repack.c msgid "cannot delete packs in a precious-objects repo" msgstr "ä¸èƒ½åˆªé™¤çå“版本庫ä¸çš„å°åŒ…" @@ -13398,11 +13473,16 @@ msgstr "å°åŒ…å‰ç¶´ %s ä¸ä»¥ objdir %s é–‹é " #: builtin/repack.c #, c-format -msgid "missing required file: %s" -msgstr "ç¼ºå°‘å¿…è¦æª”案:%s" +msgid "renaming pack to '%s' failed" +msgstr "ç„¡æ³•å°‡åŒ…é‡æ–°å‘½å為「%sã€" #: builtin/repack.c #, c-format +msgid "pack-objects did not write a '%s' file for pack %s-%s" +msgstr "pack-objects 沒有為 %2$s-%3$s 套件包寫入 “%1$s†檔案" + +#: builtin/repack.c sequencer.c +#, c-format msgid "could not unlink: %s" msgstr "ç„¡æ³•å–æ¶ˆé€£çµï¼š%s" @@ -13643,8 +13723,10 @@ msgid "only one pattern can be given with -l" msgstr "åªèƒ½ç‚º -l æä¾›ä¸€å€‹æ¨¡å¼" #: builtin/rerere.c -msgid "git rerere [clear | forget <path>... | status | remaining | diff | gc]" -msgstr "git rerere [clear | forget <路徑>... | status | remaining | diff | gc]" +msgid "" +"git rerere [clear | forget <pathspec>... | diff | status | remaining | gc]" +msgstr "" +"git rerere [clear | forget <pathspec>... | diff | status | remaining | gc]" #: builtin/rerere.c msgid "register clean resolutions in index" @@ -13902,6 +13984,18 @@ msgstr "--prefix éœ€è¦ 1 個引數" msgid "unknown mode for --abbrev-ref: %s" msgstr "--abbrev-ref çš„æ¨¡å¼æœªçŸ¥ï¼š%s" +#: builtin/rev-parse.c revision.c +msgid "--exclude-hidden cannot be used together with --branches" +msgstr "--exclude-hidden 無法與 --branches åŒæ™‚使用" + +#: builtin/rev-parse.c revision.c +msgid "--exclude-hidden cannot be used together with --tags" +msgstr "--exclude-hidden 無法與 --tags åŒæ™‚使用" + +#: builtin/rev-parse.c revision.c +msgid "--exclude-hidden cannot be used together with --remotes" +msgstr "--exclude-hidden 無法與 --remotes åŒæ™‚使用" + #: builtin/rev-parse.c setup.c msgid "this operation must be run in a work tree" msgstr "è©²å‹•ä½œå¿…é ˆåœ¨ä¸€å€‹å·¥ä½œå€ä¸åŸ·è¡Œ" @@ -13912,20 +14006,28 @@ msgid "unknown mode for --show-object-format: %s" msgstr "--show-object-format çš„æ¨¡å¼æœªçŸ¥ï¼š%s" #: builtin/revert.c -msgid "git revert [<options>] <commit-ish>..." -msgstr "git revert [<é¸é …>] <æäº¤è™Ÿ>..." +msgid "" +"git revert [--[no-]edit] [-n] [-m <parent-number>] [-s] [-S[<keyid>]] " +"<commit>..." +msgstr "" +"git revert [--[no-]edit] [-n] [-m <parent-number>] [-s] [-S[<keyid>]] " +"<commit>..." #: builtin/revert.c -msgid "git revert <subcommand>" -msgstr "git revert <åæŒ‡ä»¤>" +msgid "git revert (--continue | --skip | --abort | --quit)" +msgstr "git revert (--continue | --skip | --abort | --quit)" #: builtin/revert.c -msgid "git cherry-pick [<options>] <commit-ish>..." -msgstr "git cherry-pick [<é¸é …>] <æäº¤è™Ÿ>..." +msgid "" +"git cherry-pick [--edit] [-n] [-m <parent-number>] [-s] [-x] [--ff]\n" +" [-S[<keyid>]] <commit>..." +msgstr "" +"git cherry-pick [--edit] [-n] [-m <parent-number>] [-s] [-x] [--ff]\n" +" [-S[<keyid>]] <commit>..." #: builtin/revert.c -msgid "git cherry-pick <subcommand>" -msgstr "git cherry-pick <åæŒ‡ä»¤>" +msgid "git cherry-pick (--continue | --skip | --abort | --quit)" +msgstr "git cherry-pick (--continue | --skip | --abort | --quit)" #: builtin/revert.c #, c-format @@ -14006,8 +14108,14 @@ msgid "cherry-pick failed" msgstr "æ€é¸å¤±æ•—" #: builtin/rm.c -msgid "git rm [<options>] [--] <file>..." -msgstr "git rm [<é¸é …>] [--] <檔案>..." +msgid "" +"git rm [-f | --force] [-n] [-r] [--cached] [--ignore-unmatch]\n" +" [--quiet] [--pathspec-from-file=<file> [--pathspec-file-nul]]\n" +" [--] [<pathspec>...]" +msgstr "" +"git rm [-f | --force] [-n] [-r] [--cached] [--ignore-unmatch]\n" +" [--quiet] [--pathspec-from-file=<file> [--pathspec-file-nul]]\n" +" [--] [<pathspec>...]" #: builtin/rm.c msgid "" @@ -14070,7 +14178,7 @@ msgstr "沒有æä¾›è·¯å¾‘è¦æ ¼ã€‚我該移除哪個檔案?" #: builtin/rm.c msgid "please stage your changes to .gitmodules or stash them to proceed" -msgstr "請將您的修改暫å˜åˆ° .gitmodules 䏿ˆ–儲è—後å†ç¹¼çºŒ" +msgstr "請將您的修改暫å˜åˆ° .gitmodules 䏿ˆ–貯å˜å¾Œå†ç¹¼çºŒ" #: builtin/rm.c #, c-format @@ -14087,12 +14195,14 @@ msgid "" "git send-pack [--mirror] [--dry-run] [--force]\n" " [--receive-pack=<git-receive-pack>]\n" " [--verbose] [--thin] [--atomic]\n" +" [--[no-]signed | --signed=(true|false|if-asked)]\n" " [<host>:]<directory> (--all | <ref>...)" msgstr "" "git send-pack [--mirror] [--dry-run] [--force]\n" " [--receive-pack=<git-receive-pack>]\n" " [--verbose] [--thin] [--atomic]\n" -" [<主機>:]<目錄> (--all | <引用>...)" +" [--[no-]signed | --signed=(true|false|if-asked)]\n" +" [<host>:]<directory> (--all | <ref>...)" #: builtin/send-pack.c msgid "remote name" @@ -14123,8 +14233,9 @@ msgid "using multiple --group options with stdin is not supported" msgstr "䏿”¯æ´åœ¨æ¨™æº–輸入使用多個 --group é¸é …" #: builtin/shortlog.c -msgid "using --group=trailer with stdin is not supported" -msgstr "䏿”¯æ´åœ¨æ¨™æº–輸入使用 --group=trailer" +#, c-format +msgid "using %s with stdin is not supported" +msgstr "䏿”¯æ´å° %s 使用 stdin" #: builtin/shortlog.c #, c-format @@ -14172,13 +14283,14 @@ msgid "" "git show-branch [-a | --all] [-r | --remotes] [--topo-order | --date-order]\n" " [--current] [--color[=<when>] | --no-color] [--sparse]\n" " [--more=<n> | --list | --independent | --merge-base]\n" -" [--no-name | --sha1-name] [--topics] [(<rev> | <glob>)...]" +" [--no-name | --sha1-name] [--topics]\n" +" [(<rev> | <glob>)...]" msgstr "" "git show-branch [-a | --all] [-r | --remotes] [--topo-order | --date-order]\n" -" [--current] [--color[=<何時>] | --no-color] [--sparse]\n" +" [--current] [--color[=<when>] | --no-color] [--sparse]\n" " [--more=<n> | --list | --independent | --merge-base]\n" -" [--no-name | --sha1-name] [--topics] [(<版本> | <è¬ç”¨å—å…ƒ" -">)...]" +" [--no-name | --sha1-name] [--topics]\n" +" [(<rev> | <glob>)...]" #: builtin/show-branch.c msgid "git show-branch (-g | --reflog)[=<n>[,<base>]] [--list] [<ref>]" @@ -14304,11 +14416,13 @@ msgstr "未知的雜湊算法" #: builtin/show-ref.c msgid "" -"git show-ref [-q | --quiet] [--verify] [--head] [-d | --dereference] [-s | --" -"hash[=<n>]] [--abbrev[=<n>]] [--tags] [--heads] [--] [<pattern>...]" +"git show-ref [-q | --quiet] [--verify] [--head] [-d | --dereference]\n" +" [-s | --hash[=<n>]] [--abbrev[=<n>]] [--tags]\n" +" [--heads] [--] [<pattern>...]" msgstr "" -"git show-ref [-q | --quiet] [--verify] [--head] [-d | --dereference] [-s | --" -"hash[=<n>]] [--abbrev[=<n>]] [--tags] [--heads] [--] [<模å¼>...]" +"git show-ref [-q | --quiet] [--verify] [--head] [-d | --dereference]\n" +" [-s | --hash[=<n>]] [--abbrev[=<n>]] [--tags]\n" +" [--heads] [--] [<pattern>...]" #: builtin/show-ref.c msgid "git show-ref --exclude-existing[=<pattern>]" @@ -14347,8 +14461,10 @@ msgid "show refs from stdin that aren't in local repository" msgstr "顯示從標準輸入ä¸è®€å…¥çš„ä¸åœ¨æœ¬æ©Ÿç‰ˆæœ¬åº«ä¸çš„引用" #: builtin/sparse-checkout.c -msgid "git sparse-checkout (init|list|set|add|reapply|disable) <options>" -msgstr "git sparse-checkout (init|list|set|add|reapply|disable) <é¸é …>" +msgid "" +"git sparse-checkout (init | list | set | add | reapply | disable) [<options>]" +msgstr "" +"git sparse-checkout (init | list | set | add | reapply | disable) [<options>]" #: builtin/sparse-checkout.c msgid "this worktree is not sparse" @@ -14490,83 +14606,71 @@ msgid "error while refreshing working directory" msgstr "釿–°æ•´ç†å·¥ä½œç›®éŒ„時發生錯誤" #: builtin/stash.c -msgid "git stash list [<options>]" -msgstr "git stash list [<é¸é …>]" +msgid "git stash list [<log-options>]" +msgstr "git stash list [<log-options>]" #: builtin/stash.c -msgid "git stash show [<options>] [<stash>]" -msgstr "git stash show [<é¸é …>] [<stash>]" +msgid "" +"git stash show [-u | --include-untracked | --only-untracked] [<diff-" +"options>] [<stash>]" +msgstr "" +"git stash show [-u | --include-untracked | --only-untracked] [<diff-" +"options>] [<stash>]" #: builtin/stash.c -msgid "git stash drop [-q|--quiet] [<stash>]" -msgstr "git stash drop [-q|--quiet] [<stash>]" +msgid "git stash drop [-q | --quiet] [<stash>]" +msgstr "git stash drop [-q | --quiet] [<stash>]" #: builtin/stash.c -msgid "git stash ( pop | apply ) [--index] [-q|--quiet] [<stash>]" -msgstr "git stash ( pop | apply ) [--index] [-q|--quiet] [<stash>]" +msgid "git stash pop [--index] [-q | --quiet] [<stash>]" +msgstr "git stash pop [--index] [-q | --quiet] [<stash>]" + +#: builtin/stash.c +msgid "git stash apply [--index] [-q | --quiet] [<stash>]" +msgstr "git stash apply [--index] [-q | --quiet] [<stash>]" #: builtin/stash.c msgid "git stash branch <branchname> [<stash>]" msgstr "git stash branch <分支å> [<stash>]" #: builtin/stash.c -msgid "" -"git stash [push [-p|--patch] [-S|--staged] [-k|--[no-]keep-index] [-q|--" -"quiet]\n" -" [-u|--include-untracked] [-a|--all] [-m|--message <message>]\n" -" [--pathspec-from-file=<file> [--pathspec-file-nul]]\n" -" [--] [<pathspec>...]]" -msgstr "" -"git stash [push [-p|--patch] [-S|--staged] [-k|--[no-]keep-index] [-q|--" -"quiet]\n" -" [-u|--include-untracked] [-a|--all] [-m|--message <訊æ¯>]\n" -" [--pathspec-from-file=<檔案> [--pathspec-file-nul]]\n" -" [--] [<è·¯å¾‘è¦æ ¼>...]]" +msgid "git stash store [(-m | --message) <message>] [-q | --quiet] <commit>" +msgstr "git stash store [(-m | --message) <message>] [-q | --quiet] <commit>" #: builtin/stash.c msgid "" -"git stash save [-p|--patch] [-S|--staged] [-k|--[no-]keep-index] [-q|--" -"quiet]\n" -" [-u|--include-untracked] [-a|--all] [<message>]" +"git stash [push [-p | --patch] [-S | --staged] [-k | --[no-]keep-index] [-q " +"| --quiet]\n" +" [-u | --include-untracked] [-a | --all] [(-m | --message) " +"<message>]\n" +" [--pathspec-from-file=<file> [--pathspec-file-nul]]\n" +" [--] [<pathspec>...]]" msgstr "" -"git stash save [-p|--patch] [-S|--staged] [-k|--[no-]keep-index] [-q|--" -"quiet]\n" -" [-u|--include-untracked] [-a|--all] [<訊æ¯>]" - -#: builtin/stash.c -msgid "git stash pop [--index] [-q|--quiet] [<stash>]" -msgstr "git stash pop [--index] [-q|--quiet] [<stash>]" - -#: builtin/stash.c -msgid "git stash apply [--index] [-q|--quiet] [<stash>]" -msgstr "git stash apply [--index] [-q|--quiet] [<stash>]" - -#: builtin/stash.c -msgid "git stash store [-m|--message <message>] [-q|--quiet] <commit>" -msgstr "git stash store [-m|--message <消æ¯>] [-q|--quiet] <æäº¤>" +"git stash [push [-p | --patch] [-S | --staged] [-k | --[no-]keep-index] [-q " +"| --quiet]\n" +" [-u | --include-untracked] [-a | --all] [(-m | --message) " +"<message>]\n" +" [--pathspec-from-file=<file> [--pathspec-file-nul]]\n" +" [--] [<pathspec>...]]" #: builtin/stash.c msgid "" -"git stash [push [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]\n" -" [-u|--include-untracked] [-a|--all] [-m|--message <message>]\n" -" [--] [<pathspec>...]]" +"git stash save [-p | --patch] [-S | --staged] [-k | --[no-]keep-index] [-q | " +"--quiet]\n" +" [-u | --include-untracked] [-a | --all] [<message>]" msgstr "" -"git stash [push [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]\n" -" [-u|--include-untracked] [-a|--all] [-m|--message <消æ¯>]\n" -" [--] [<è·¯å¾‘è¦æ ¼>...]]" +"git stash save [-p | --patch] [-S | --staged] [-k | --[no-]keep-index] [-q | " +"--quiet]\n" +" [-u | --include-untracked] [-a | --all] [<message>]" #: builtin/stash.c -msgid "" -"git stash save [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]\n" -" [-u|--include-untracked] [-a|--all] [<message>]" -msgstr "" -"git stash save [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]\n" -" [-u|--include-untracked] [-a|--all] [<消æ¯>]" +msgid "git stash create [<message>]" +msgstr "git stash create [<message>]" #: builtin/stash.c #, c-format msgid "'%s' is not a stash-like commit" -msgstr "'%s' ä¸åƒæ˜¯ä¸€å€‹å„²è—æäº¤" +msgstr "'%s' ä¸åƒæ˜¯ä¸€å€‹è²¯å˜æäº¤" #: builtin/stash.c #, c-format @@ -14575,7 +14679,7 @@ msgstr "指定了太多的版本:%s" #: builtin/stash.c msgid "No stash entries found." -msgstr "未發ç¾å„²è—æ¢ç›®ã€‚" +msgstr "未發ç¾è²¯å˜æ¢ç›®ã€‚" #: builtin/stash.c #, c-format @@ -14599,7 +14703,7 @@ msgstr "" #: builtin/stash.c msgid "cannot apply a stash in the middle of a merge" -msgstr "無法在åˆä½µéŽç¨‹å¥—用儲è—" +msgstr "無法在åˆä½µéŽç¨‹å¥—用貯å˜" #: builtin/stash.c #, c-format @@ -14621,11 +14725,11 @@ msgstr "æ£åœ¨åˆä½µ %s å’Œ %s" #: builtin/stash.c msgid "Index was not unstashed." -msgstr "索引未從儲è—ä¸å¾©åŽŸã€‚" +msgstr "索引未從貯å˜ä¸å¾©åŽŸã€‚" #: builtin/stash.c msgid "could not restore untracked files from stash" -msgstr "ç„¡æ³•å¾žå„²è—æ¢ç›®ä¸å¾©åŽŸæœªè¿½è¹¤æª”æ¡ˆ" +msgstr "ç„¡æ³•å¾žè²¯å˜æ¢ç›®ä¸å¾©åŽŸæœªè¿½è¹¤æª”æ¡ˆ" #: builtin/stash.c msgid "attempt to recreate the index" @@ -14639,16 +14743,16 @@ msgstr "æ¨æ£„了 %s(%s)" #: builtin/stash.c #, c-format msgid "%s: Could not drop stash entry" -msgstr "%sï¼šç„¡æ³•æ¨æ£„å„²è—æ¢ç›®" +msgstr "%sï¼šç„¡æ³•æ¨æ£„è²¯å˜æ¢ç›®" #: builtin/stash.c #, c-format msgid "'%s' is not a stash reference" -msgstr "'%s' 䏿˜¯ä¸€å€‹å„²è—引用" +msgstr "'%s' 䏿˜¯ä¸€å€‹è²¯å˜å¼•用" #: builtin/stash.c msgid "The stash entry is kept in case you need it again." -msgstr "å„²è—æ¢ç›®è¢«ä¿ç•™ä»¥å‚™æ‚¨å†æ¬¡éœ€è¦ã€‚" +msgstr "è²¯å˜æ¢ç›®è¢«ä¿ç•™ä»¥å‚™æ‚¨å†æ¬¡éœ€è¦ã€‚" #: builtin/stash.c msgid "No branch name specified" @@ -14664,11 +14768,11 @@ msgstr "無法解包樹" #: builtin/stash.c msgid "include untracked files in the stash" -msgstr "在儲è—å€åŒ…嫿œªè¿½è¹¤æª”案" +msgstr "在貯å˜å€åŒ…嫿œªè¿½è¹¤æª”案" #: builtin/stash.c msgid "only show untracked files in the stash" -msgstr "åªåœ¨å„²è—å€é¡¯ç¤ºæœªè¿½è¹¤æª”案" +msgstr "åªåœ¨è²¯å˜å€é¡¯ç¤ºæœªè¿½è¹¤æª”案" #: builtin/stash.c #, c-format @@ -14677,7 +14781,7 @@ msgstr "無法用 %2$s æ›´æ–° %1$s" #: builtin/stash.c msgid "stash message" -msgstr "儲è—說明" +msgstr "貯å˜èªªæ˜Ž" #: builtin/stash.c msgid "\"git stash store\" requires one <commit> argument" @@ -14733,7 +14837,7 @@ msgstr "沒有è¦å„²å˜çš„æœ¬æ©Ÿä¿®æ”¹" #: builtin/stash.c msgid "Cannot initialize stash" -msgstr "無法åˆå§‹åŒ–儲è—" +msgstr "無法åˆå§‹åŒ–貯å˜" #: builtin/stash.c msgid "Cannot save the current status" @@ -14754,11 +14858,11 @@ msgstr "ä¿æŒç´¢å¼•" #: builtin/stash.c msgid "stash staged changes only" -msgstr "åªå„²è—æš«å˜è®Šæ›´" +msgstr "åªè²¯å˜æš«å˜è®Šæ›´" #: builtin/stash.c msgid "stash in patch mode" -msgstr "以修補檔模å¼å„²è—" +msgstr "以修補檔模å¼è²¯å˜" #: builtin/stash.c msgid "quiet mode" @@ -14766,7 +14870,7 @@ msgstr "éœé»˜æ¨¡å¼" #: builtin/stash.c msgid "include untracked files in stash" -msgstr "儲è—ä¸åŒ…嫿œªè¿½è¹¤æª”案" +msgstr "貯å˜ä¸åŒ…嫿œªè¿½è¹¤æª”案" #: builtin/stash.c msgid "include ignore files" @@ -15249,10 +15353,6 @@ msgid "don't fetch new objects from the remote site" msgstr "ä¸å¾žé 端站å°å–得新物件" #: builtin/submodule--helper.c -msgid "path into the working tree" -msgstr "到工作å€çš„路徑" - -#: builtin/submodule--helper.c msgid "use the 'checkout' update strategy (default)" msgstr "使用 “checkout†更新ç–略(é è¨å€¼ï¼‰" @@ -15297,34 +15397,10 @@ msgstr "" "[--] [<path>...]" #: builtin/submodule--helper.c -msgid "recurse into submodules" -msgstr "åœ¨åæ¨¡çµ„ä¸éžè¿´" - -#: builtin/submodule--helper.c msgid "git submodule absorbgitdirs [<options>] [<path>...]" msgstr "git submodule absorbgitdirs [<options>] [<path>...]" #: builtin/submodule--helper.c -msgid "check if it is safe to write to the .gitmodules file" -msgstr "檢查寫入 .gitmodules 檔案是å¦å®‰å…¨" - -#: builtin/submodule--helper.c -msgid "unset the config in the .gitmodules file" -msgstr "å–æ¶ˆ .gitmodules 檔案ä¸çš„è¨å®š" - -#: builtin/submodule--helper.c -msgid "git submodule--helper config <name> [<value>]" -msgstr "git submodule--helper config <å稱> [<值>]" - -#: builtin/submodule--helper.c -msgid "git submodule--helper config --unset <name>" -msgstr "git submodule--helper config --unset <å稱>" - -#: builtin/submodule--helper.c -msgid "please make sure that the .gitmodules file is in the working tree" -msgstr "è«‹ç¢ºèª .gitmodules 檔案在工作å€è£¡" - -#: builtin/submodule--helper.c msgid "suppress output for setting url of a submodule" msgstr "éš±è—忍¡çµ„è¨å®š URL 的輸出" @@ -15418,6 +15494,10 @@ msgid "unable to checkout submodule '%s'" msgstr "無法簽出「%sã€å模組" #: builtin/submodule--helper.c +msgid "please make sure that the .gitmodules file is in the working tree" +msgstr "è«‹ç¢ºèª .gitmodules 檔案在工作å€è£¡" + +#: builtin/submodule--helper.c #, c-format msgid "Failed to add submodule '%s'" msgstr "ç„¡æ³•åŠ å…¥åæ¨¡çµ„「%sã€" @@ -15478,23 +15558,26 @@ msgstr "版本庫 URL:「%sã€å¿…é ˆæ˜¯çµ•å°è·¯å¾‘ï¼Œæˆ–é–‹é æ˜¯ ./|../" msgid "'%s' is not a valid submodule name" msgstr "「%sã€ä¸æ˜¯æœ‰æ•ˆçš„忍¡çµ„å稱" +#: builtin/submodule--helper.c +msgid "git submodule--helper <command>" +msgstr "git submodule--helper <command>" + #: builtin/submodule--helper.c git.c #, c-format msgid "%s doesn't support --super-prefix" msgstr "%s 䏿”¯æ´ --super-prefix" -#: builtin/submodule--helper.c -#, c-format -msgid "'%s' is not a valid submodule--helper subcommand" -msgstr "'%s' 䏿˜¯ä¸€å€‹æœ‰æ•ˆçš„ submodule--helper åæŒ‡ä»¤" +#: builtin/symbolic-ref.c +msgid "git symbolic-ref [-m <reason>] <name> <ref>" +msgstr "git symbolic-ref [-m <reason>] <name> <ref>" #: builtin/symbolic-ref.c -msgid "git symbolic-ref [<options>] <name> [<ref>]" -msgstr "git symbolic-ref [<é¸é …>] <å稱> [<引用>]" +msgid "git symbolic-ref [-q] [--short] [--no-recurse] <name>" +msgstr "git symbolic-ref [-q] [--short] [--no-recurse] <name>" #: builtin/symbolic-ref.c -msgid "git symbolic-ref -d [-q] <name>" -msgstr "git symbolic-ref -d [-q] <å稱>" +msgid "git symbolic-ref --delete [-q] <name>" +msgstr "git symbolic-ref --delete [-q] <name>" #: builtin/symbolic-ref.c msgid "suppress error message for non-symbolic (detached) refs" @@ -15508,6 +15591,10 @@ msgstr "刪除符號引用" msgid "shorten ref output" msgstr "縮çŸå¼•用輸出" +#: builtin/symbolic-ref.c +msgid "recursively dereference (default)" +msgstr "éžè¿´å解引用(é è¨ï¼‰" + #: builtin/symbolic-ref.c builtin/update-ref.c msgid "reason" msgstr "åŽŸå› " @@ -15518,11 +15605,11 @@ msgstr "æ›´æ–°çš„åŽŸå› " #: builtin/tag.c msgid "" -"git tag [-a | -s | -u <key-id>] [-f] [-m <msg> | -F <file>]\n" -" <tagname> [<head>]" +"git tag [-a | -s | -u <key-id>] [-f] [-m <msg> | -F <file>] [-e]\n" +" <tagname> [<commit> | <object>]" msgstr "" -"git tag [-a | -s | -u <key-id>] [-f] [-m <消æ¯> | -F <檔案>]\n" -" <標籤å> [<head>]" +"git tag [-a | -s | -u <key-id>] [-f] [-m <msg> | -F <file>] [-e]\n" +" <tagname> [<commit> | <object>]" #: builtin/tag.c msgid "git tag -d <tagname>..." @@ -15530,14 +15617,15 @@ msgstr "git tag -d <標籤å>..." #: builtin/tag.c msgid "" -"git tag -l [-n[<num>]] [--contains <commit>] [--no-contains <commit>] [--" -"points-at <object>]\n" -" [--format=<format>] [--merged <commit>] [--no-merged <commit>] " -"[<pattern>...]" +"git tag [-n[<num>]] -l [--contains <commit>] [--no-contains <commit>]\n" +" [--points-at <object>] [--column[=<options>] | --no-column]\n" +" [--create-reflog] [--sort=<key>] [--format=<format>]\n" +" [--merged <commit>] [--no-merged <commit>] [<pattern>...]" msgstr "" -"git tag -l [-n[<數å—>]] [--contains <æäº¤>] [--no-contains <æäº¤>] [--points-" -"at <物件>]\n" -" [--format=<æ ¼å¼>] [--merged <æäº¤>] [--no-merged <æäº¤>] [<模å¼>...]" +"git tag [-n[<num>]] -l [--contains <commit>] [--no-contains <commit>]\n" +" [--points-at <object>] [--column[=<options>] | --no-column]\n" +" [--create-reflog] [--sort=<key>] [--format=<format>]\n" +" [--merged <commit>] [--no-merged <commit>] [<pattern>...]" #: builtin/tag.c msgid "git tag -v [--format=<format>] <tagname>..." @@ -16007,8 +16095,12 @@ msgid "update the info files from scratch" msgstr "從é 開始更新檔案訊æ¯" #: builtin/upload-pack.c -msgid "git upload-pack [<options>] <dir>" -msgstr "git upload-pack [<é¸é …>] <目錄>" +msgid "" +"git-upload-pack [--[no-]strict] [--timeout=<n>] [--stateless-rpc]\n" +" [--advertise-refs] <directory>" +msgstr "" +"git-upload-pack [--[no-]strict] [--timeout=<n>] [--stateless-rpc]\n" +" [--advertise-refs] <directory>" #: builtin/upload-pack.c t/helper/test-serve-v2.c msgid "quit after a single request/response exchange" @@ -16027,8 +16119,8 @@ msgid "interrupt transfer after <n> seconds of inactivity" msgstr "䏿´»å‹• <n> ç§’é˜å¾Œçµ‚æ¢å‚³è¼¸" #: builtin/verify-commit.c -msgid "git verify-commit [-v | --verbose] <commit>..." -msgstr "git verify-commit [-v | --verbose] <æäº¤>..." +msgid "git verify-commit [-v | --verbose] [--raw] <commit>..." +msgstr "git verify-commit [-v | --verbose] [--raw] <commit>..." #: builtin/verify-commit.c msgid "print commit contents" @@ -16039,8 +16131,8 @@ msgid "print raw gpg status output" msgstr "列å°åŽŸå§‹ gpg 狀態輸出" #: builtin/verify-pack.c -msgid "git verify-pack [-v | --verbose] [-s | --stat-only] <pack>..." -msgstr "git verify-pack [-v | --verbose] [-s | --stat-only] <包>..." +msgid "git verify-pack [-v | --verbose] [-s | --stat-only] [--] <pack>.idx..." +msgstr "git verify-pack [-v | --verbose] [-s | --stat-only] [--] <pack>.idx..." #: builtin/verify-pack.c msgid "verbose" @@ -16051,44 +16143,48 @@ msgid "show statistics only" msgstr "åªé¡¯ç¤ºçµ±è¨ˆ" #: builtin/verify-tag.c -msgid "git verify-tag [-v | --verbose] [--format=<format>] <tag>..." -msgstr "git verify-tag [-v | --verbose] [--format=<æ ¼å¼>] <標籤>..." +msgid "git verify-tag [-v | --verbose] [--format=<format>] [--raw] <tag>..." +msgstr "git verify-tag [-v | --verbose] [--format=<format>] [--raw] <tag>..." #: builtin/verify-tag.c msgid "print tag contents" msgstr "åˆ—å°æ¨™ç±¤å…§å®¹" #: builtin/worktree.c -msgid "git worktree add [<options>] <path> [<commit-ish>]" -msgstr "git worktree add [<é¸é …>] <路徑> [<æäº¤>]" +msgid "" +"git worktree add [-f] [--detach] [--checkout] [--lock [--reason <string>]]\n" +" [-b <new-branch>] <path> [<commit-ish>]" +msgstr "" +"git worktree add [-f] [--detach] [--checkout] [--lock [--reason <string>]]\n" +" [-b <new-branch>] <path> [<commit-ish>]" #: builtin/worktree.c -msgid "git worktree list [<options>]" -msgstr "git worktree list [<é¸é …>]" +msgid "git worktree list [-v | --porcelain [-z]]" +msgstr "git worktree list [-v | --porcelain [-z]]" #: builtin/worktree.c -msgid "git worktree lock [<options>] <path>" -msgstr "git worktree lock [<é¸é …>] <路徑>" +msgid "git worktree lock [--reason <string>] <worktree>" +msgstr "git worktree lock [--reason <string>] <worktree>" #: builtin/worktree.c msgid "git worktree move <worktree> <new-path>" msgstr "git worktree move <工作å€> <新路徑>" #: builtin/worktree.c -msgid "git worktree prune [<options>]" -msgstr "git worktree prune [<é¸é …>]" +msgid "git worktree prune [-n] [-v] [--expire <expire>]" +msgstr "git worktree prune [-n] [-v] [--expire <expire>]" #: builtin/worktree.c -msgid "git worktree remove [<options>] <worktree>" -msgstr "git worktree remove [<é¸é …>] <工作å€>" +msgid "git worktree remove [-f] <worktree>" +msgstr "git worktree remove [-f] <worktree>" #: builtin/worktree.c msgid "git worktree repair [<path>...]" msgstr "git worktree repair [<路徑>...]" #: builtin/worktree.c -msgid "git worktree unlock <path>" -msgstr "git worktree unlock <路徑>" +msgid "git worktree unlock <worktree>" +msgstr "git worktree unlock <worktree>" #: builtin/worktree.c #, c-format @@ -16373,6 +16469,11 @@ msgid "core.fsyncMethod = batch is unsupported on this platform" msgstr "core.fsyncMethod = batch 䏿”¯æ´æœ¬å¹³å°" #: bundle-uri.c +#, c-format +msgid "bundle list at '%s' has no mode" +msgstr "使–¼ “%s†的套件包清單沒有模å¼" + +#: bundle-uri.c msgid "failed to create temporary file" msgstr "ç„¡æ³•å»ºç«‹æš«å˜æª”" @@ -16382,23 +16483,40 @@ msgstr "功能ä¸è¶³" #: bundle-uri.c #, c-format -msgid "failed to download bundle from URI '%s'" -msgstr "無法從 “%s†URI 下載套件" +msgid "unrecognized bundle mode from URI '%s'" +msgstr "無法è˜åˆ¥å¾ž URI “%s†å–回的套件包模å¼" + +#: bundle-uri.c +#, c-format +msgid "exceeded bundle URI recursion limit (%d)" +msgstr "超出套件包 URI éžè¿´é™åˆ¶ (%d)" #: bundle-uri.c #, c-format -msgid "file at URI '%s' is not a bundle" -msgstr "使–¼ URI “%sâ€ çš„æª”æ¡ˆä¸æ˜¯å¥—ä»¶" +msgid "failed to download bundle from URI '%s'" +msgstr "無法從 “%s†URI 下載套件包" #: bundle-uri.c #, c-format -msgid "failed to unbundle bundle from URI '%s'" -msgstr "無法解開æºè‡ª URI “%s†的套件" +msgid "file at URI '%s' is not a bundle or bundle list" +msgstr "使–¼ URI “%sâ€ çš„æª”æ¡ˆä¸æ˜¯å¥—件包或套件包清單" + +#: bundle-uri.c +msgid "bundle-uri: got an empty line" +msgstr "bundle-uri: 收到空白列" + +#: bundle-uri.c +msgid "bundle-uri: line is not of the form 'key=value'" +msgstr "bundle-uri: åˆ—çš„æ ¼å¼ä¸æ˜¯ “key=valueâ€" + +#: bundle-uri.c +msgid "bundle-uri: line has empty key or value" +msgstr "bundle-uri: åˆ—æœ‰ç©ºéµæˆ–空值" #: bundle.c #, c-format msgid "unrecognized bundle hash algorithm: %s" -msgstr "無法è˜åˆ¥çš„套件雜湊演算法:%s" +msgstr "無法è˜åˆ¥çš„套件包雜湊演算法:%s" #: bundle.c #, c-format @@ -16408,7 +16526,7 @@ msgstr "未知功能 '%s'" #: bundle.c #, c-format msgid "'%s' does not look like a v2 or v3 bundle file" -msgstr "'%s' ä¸åƒæ˜¯ä¸€å€‹ v2 或 v3 版本的套件檔案" +msgstr "“%s†ä¸åƒæ˜¯ä¸€å€‹ v2 或 v3 版本的套件包檔案" #: bundle.c #, c-format @@ -16421,27 +16539,27 @@ msgstr "版本庫ä¸ç¼ºå°‘這些必備的æäº¤ï¼š" #: bundle.c msgid "need a repository to verify a bundle" -msgstr "需è¦ç‰ˆæœ¬åº«é©—è‰å¥—ä»¶" +msgstr "需è¦ç‰ˆæœ¬åº«é©—è‰å¥—件包" #: bundle.c #, c-format msgid "The bundle contains this ref:" msgid_plural "The bundle contains these %<PRIuMAX> refs:" -msgstr[0] "這個套件嫿œ‰é€™ %<PRIuMAX> 個引用:" +msgstr[0] "é€™å€‹å¥—ä»¶åŒ…ï¼Œå«æœ‰é€™ %<PRIuMAX> 個引用:" #: bundle.c msgid "The bundle records a complete history." -msgstr "這個套件記錄完整æ·å²ç´€éŒ„。" +msgstr "這個套件包記下了完整æ·å²ç´€éŒ„。" #: bundle.c #, c-format msgid "The bundle requires this ref:" msgid_plural "The bundle requires these %<PRIuMAX> refs:" -msgstr[0] "這個套件需è¦é€™ %<PRIuMAX> 個引用:" +msgstr[0] "這個套件包需è¦é€™ %<PRIuMAX> 個引用:" #: bundle.c msgid "unable to dup bundle descriptor" -msgstr "無法複製套件æè¿°ç¬¦" +msgstr "無法複製套件包æè¿°å…ƒ" #: bundle.c msgid "Could not spawn pack-objects" @@ -16459,16 +16577,16 @@ msgstr "引用 '%s' 被 rev-list é¸é …排除" #: bundle.c #, c-format msgid "unsupported bundle version %d" -msgstr "䏿”¯æ´çš„套件版本 %d" +msgstr "䏿”¯æ´çš„套件包版本 %d" #: bundle.c #, c-format msgid "cannot write bundle version %d with algorithm %s" -msgstr "無法寫入 %2$s 演算法的套件版本 %1$d" +msgstr "無法寫入使用 %2$s 演算法的套件包版本 %1$d" #: bundle.c msgid "Refusing to create empty bundle." -msgstr "ä¸èƒ½å»ºç«‹ç©ºå¥—件。" +msgstr "ä¸èƒ½å»ºç«‹ç©ºå¥—件包。" #: bundle.c #, c-format @@ -17015,7 +17133,7 @@ msgstr "將檔案內容新增到索引" #: command-list.h msgid "Stash the changes in a dirty working directory away" -msgstr "儲è—髒工作å€ä¸çš„修改" +msgstr "貯å˜é«’工作å€ä¸çš„修改" #: command-list.h msgid "Show the working tree status" @@ -17111,7 +17229,7 @@ msgstr "定義路徑的屬性" #: command-list.h msgid "Git command-line interface and conventions" -msgstr "Git 指令列介é¢å’Œç´„定" +msgstr "Git 命令列介é¢å’Œç´„定" #: command-list.h msgid "A Git core tutorial for developers" @@ -17139,14 +17257,14 @@ msgstr "Git 使用的常見å•題" #: command-list.h msgid "The bundle file format" -msgstr "å¥—ä»¶æª”æ¡ˆæ ¼å¼" +msgstr "å¥—ä»¶åŒ…æª”æ¡ˆæ ¼å¼" #: command-list.h msgid "Chunk-based file formats" msgstr "以å€å¡Šç‚ºåŸºç¤Žçš„æª”æ¡ˆæ ¼å¼" #: command-list.h -msgid "Git commit graph format" +msgid "Git commit-graph format" msgstr "Git æäº¤åœ–æ ¼å¼" #: command-list.h @@ -17571,6 +17689,11 @@ msgstr "“has_worktree_movedâ€ ä¸æœ‰æœªè™•置的情æ³ï¼š%d" msgid "health thread wait failed [GLE %ld]" msgstr "å¥åº·ç›£è½åŸ·è¡Œç·’ç‰å¾…失敗 [GLE %ld]" +#: compat/fsmonitor/fsm-ipc-darwin.c +#, c-format +msgid "Invalid path: %s" +msgstr "無效路徑:%s" + #: compat/fsmonitor/fsm-listen-darwin.c msgid "Unable to create FSEventStream." msgstr "無法建立 FSEventStream。" @@ -17609,12 +17732,32 @@ msgstr "在 “%sâ€ ä¸Šå‘¼å« GetOverlappedResult 失敗 [GLE %ld]" msgid "could not read directory changes [GLE %ld]" msgstr "無法讀å–目錄變化 [GLE %ld]" -#: compat/fsmonitor/fsm-settings-win32.c +#: compat/fsmonitor/fsm-path-utils-darwin.c +#, c-format +msgid "opendir('%s') failed" +msgstr "opendir('%s') 失敗" + +#: compat/fsmonitor/fsm-path-utils-darwin.c +#, c-format +msgid "lstat('%s') failed" +msgstr "lstat('%s') 失敗" + +#: compat/fsmonitor/fsm-path-utils-darwin.c +#, c-format +msgid "strbuf_readlink('%s') failed" +msgstr "strbuf_readlink('%s') 失敗" + +#: compat/fsmonitor/fsm-path-utils-darwin.c +#, c-format +msgid "closedir('%s') failed" +msgstr "closedir('%s') 失敗" + +#: compat/fsmonitor/fsm-path-utils-win32.c #, c-format msgid "[GLE %ld] unable to open for read '%ls'" msgstr "[GLE %ld] 無法開啟以讀å–「%lsã€" -#: compat/fsmonitor/fsm-settings-win32.c +#: compat/fsmonitor/fsm-path-utils-win32.c #, c-format msgid "[GLE %ld] unable to get protocol information for '%ls'" msgstr "[GLE %ld] 無法å–得「%lsã€çš„通訊å”定資訊" @@ -17879,7 +18022,7 @@ msgstr "忍¡çµ„資料物件 %2$s ä¸éŒ¯èª¤çš„è¨å®šè¡Œ %1$d" #: config.c #, c-format msgid "bad config line %d in command line %s" -msgstr "指令列 %2$s ä¸éŒ¯èª¤çš„è¨å®šè¡Œ %1$d" +msgstr "命令列 %2$s ä¸éŒ¯èª¤çš„è¨å®šè¡Œ %1$d" #: config.c #, c-format @@ -17922,7 +18065,7 @@ msgstr "忍¡çµ„資料 %3$s ä¸è¨å®šè®Šæ•¸ '%2$s' 錯誤的å–值 '%1$s':%4$ #: config.c #, c-format msgid "bad numeric config value '%s' for '%s' in command line %s: %s" -msgstr "指令列 %3$s ä¸è¨å®šè®Šæ•¸ '%2$s' 錯誤的å–值 '%1$s':%4$s" +msgstr "命令列 %3$s ä¸è¨å®šè®Šæ•¸ '%2$s' 錯誤的å–值 '%1$s':%4$s" #: config.c #, c-format @@ -18018,7 +18161,7 @@ msgstr "è§£æž %s 失敗" #: config.c msgid "unable to parse command-line config" -msgstr "ç„¡æ³•è§£æžæŒ‡ä»¤åˆ—ä¸çš„è¨å®š" +msgstr "無法解æžå‘½ä»¤åˆ—ä¸çš„è¨å®š" #: config.c msgid "unknown error occurred while reading the configuration files" @@ -18037,7 +18180,7 @@ msgstr "splitIndex.maxPercentChange çš„å–值 '%d' 應該介於 0 å’Œ 100 之間 #: config.c #, c-format msgid "unable to parse '%s' from command-line config" -msgstr "ç„¡æ³•è§£æžæŒ‡ä»¤åˆ—è¨å®šä¸çš„ '%s'" +msgstr "無法解æžå‘½ä»¤åˆ—è¨å®šä¸çš„ '%s'" #: config.c #, c-format @@ -19242,7 +19385,7 @@ msgid "" "Please specify a directory on the command line" msgstr "" "無法猜到目錄å。\n" -"請在指令列指定一個目錄" +"請在命令列指定一個目錄" #: dir.c #, c-format @@ -19573,8 +19716,9 @@ msgstr "虛擬版本庫 “%s†與 fsmonitor ä¸ç›¸å®¹" #: fsmonitor-settings.c #, c-format msgid "" -"repository '%s' is incompatible with fsmonitor due to lack of Unix sockets" -msgstr "版本庫 “%sâ€ å› ç¼ºå°‘ Unix 通訊端而與 fsmonitor ä¸ç›¸å®¹" +"socket directory '%s' is incompatible with fsmonitor due to lack of Unix " +"sockets support" +msgstr "通訊端 “%sâ€ å› ç¼ºå°‘ Unix 通訊端支æ´ï¼Œè€Œèˆ‡ fsmonitor ä¸ç›¸å®¹" #: git.c msgid "" @@ -19609,7 +19753,7 @@ msgstr "" #: git.c help.c #, c-format msgid "unsupported command listing type '%s'" -msgstr "䏿”¯æ´çš„æŒ‡ä»¤åˆ—表類型 '%s'" +msgstr "䏿”¯æ´çš„命令列表類型 '%s'" #: git.c #, c-format @@ -19958,8 +20102,8 @@ msgstr[0] "" "最類似的指令有" #: help.c -msgid "git version [<options>]" -msgstr "git version [<é¸é …>]" +msgid "git version [--build-options]" +msgstr "git version [--build-options]" #: help.c #, c-format @@ -20642,8 +20786,8 @@ msgstr "拒絕éºå¤±æœªè¿½è¹¤æª”案 '%s',而是新增為 %s" #: merge-recursive.c #, c-format msgid "" -"CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s" -"\"->\"%s\" in \"%s\"%s" +"CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename " +"\"%s\"->\"%s\" in \"%s\"%s" msgstr "" "è¡çªï¼ˆé‡æ–°å‘½å/釿–°å‘½å):在分支 \"%3$s\" ä¸é‡æ–°å‘½å \"%1$s\"->\"%2$s\",在" "分支 \"%6$s\" ä¸é‡æ–°å‘½å \"%4$s\"->\"%5$s\"%7$s" @@ -21033,11 +21177,6 @@ msgid "%s: ignoring alternate object stores, nesting too deep" msgstr "%s:忽略備用物件庫,嵌套太深" #: object-file.c -#, c-format -msgid "unable to normalize object directory: %s" -msgstr "無法è¦ç¯„化物件目錄: %s" - -#: object-file.c msgid "unable to fdopen alternates lockfile" msgstr "無法 fdopen å–代鎖檔案" @@ -22047,6 +22186,11 @@ msgstr "promisor-remote: 無法關閉 fetch å處ç†ç¨‹åºçš„ stdin" msgid "promisor remote name cannot begin with '/': %s" msgstr "promisor é 端å稱ä¸èƒ½ä»¥ '/' 開始:%s" +#: promisor-remote.c +#, c-format +msgid "could not fetch %s from promisor remote" +msgstr "無法從承諾者é ç«¯æŠ“å– %s" + #: protocol-caps.c msgid "object-info: expected flush after arguments" msgstr "object-infoï¼šå¼•æ•¸å¾Œé æœŸè¦æœ‰ flush" @@ -23320,6 +23464,15 @@ msgstr "無法找到 %s 指å‘的樹" #: revision.c #, c-format +msgid "unsupported section for hidden refs: %s" +msgstr "䏿”¯æ´çš„éš±è—引用å€å¡Šï¼š%s" + +#: revision.c +msgid "--exclude-hidden= passed more than once" +msgstr "--exclude-hidden= å‚³å…¥äº†ä¸æ¢ä¸€æ¬¡" + +#: revision.c +#, c-format msgid "resolve-undo records `%s` which is missing" msgstr "resolve-undo ä¸å˜åœ¨çš„「%sã€è¨˜éŒ„" @@ -23505,6 +23658,16 @@ msgstr "--all 或 <enlistment> 但ä¸èƒ½å‚³å…¥å…©è€…" #: scalar.c #, c-format +msgid "could not remove stale scalar.repo '%s'" +msgstr "ç„¡æ³•ç§»é™¤éŽæ™‚çš„ scalar.repo “%sâ€" + +#: scalar.c +#, c-format +msgid "removing stale scalar.repo '%s'" +msgstr "æ£åœ¨ç§»é™¤éŽæ™‚çš„ scalar.repo “%sâ€" + +#: scalar.c +#, c-format msgid "git repository gone in '%s'" msgstr "git 版本庫在「%sã€éºå¤±" @@ -23636,7 +23799,7 @@ msgstr "摘å–" #: sequencer.c msgid "rebase" -msgstr "rebase" +msgstr "é‡å®šåŸºåº•" #: sequencer.c #, c-format @@ -23710,7 +23873,7 @@ msgstr "您的本機修改將被%s覆蓋。" #: sequencer.c msgid "commit your changes or stash them to proceed." -msgstr "æäº¤æ‚¨çš„修改或儲è—後å†ç¹¼çºŒã€‚" +msgstr "æäº¤æ‚¨çš„修改或貯å˜å¾Œå†ç¹¼çºŒã€‚" #. TRANSLATORS: %s will be "revert", "cherry-pick" or #. "rebase". @@ -24244,7 +24407,7 @@ msgid "" msgstr "" "執行æˆåŠŸï¼š%s\n" "但是在索引和/或工作å€ä¸å˜åœ¨è®Šæ›´\n" -"æäº¤æˆ–儲è—修改,然後執行\n" +"æäº¤æˆ–貯å˜ä¿®æ”¹ï¼Œç„¶å¾ŒåŸ·è¡Œ\n" "\n" " git rebase --continue\n" "\n" @@ -24255,6 +24418,11 @@ msgid "illegal label name: '%.*s'" msgstr "éžæ³•的標籤å稱:'%.*s'" #: sequencer.c +#, c-format +msgid "could not resolve '%s'" +msgstr "ç„¡æ³•è§£æž '%s'" + +#: sequencer.c msgid "writing fake root commit" msgstr "坫彿 ¹æäº¤" @@ -24263,11 +24431,6 @@ msgid "writing squash-onto" msgstr "寫入 squash-onto" #: sequencer.c -#, c-format -msgid "could not resolve '%s'" -msgstr "ç„¡æ³•è§£æž '%s'" - -#: sequencer.c msgid "cannot merge without a current revision" msgstr "沒有目å‰ç‰ˆæœ¬ä¸èƒ½åˆä½µ" @@ -24364,16 +24527,16 @@ msgid "" "You can run \"git stash pop\" or \"git stash drop\" at any time.\n" msgstr "" "%s\n" -"您的修改安全地儲å˜åœ¨å„²è—å€ä¸ã€‚\n" +"您的修改安全地儲å˜åœ¨è²¯å˜å€ä¸ã€‚\n" "您å¯ä»¥åœ¨ä»»ä½•時候執行 \"git stash pop\" 或 \"git stash drop\"。\n" #: sequencer.c msgid "Applying autostash resulted in conflicts." -msgstr "å› å¥—ç”¨è‡ªå‹•å„²è—而導致è¡çªã€‚" +msgstr "å› å¥—ç”¨è‡ªå‹•è²¯å˜è€Œå°Žè‡´è¡çªã€‚" #: sequencer.c msgid "Autostash exists; creating a new stash entry." -msgstr "已有自動儲è—;建立新儲è—é …ç›®ã€‚" +msgstr "已有自動貯å˜ï¼›å»ºç«‹æ–°è²¯å˜é …目。" #: sequencer.c msgid "could not detach HEAD" @@ -24778,7 +24941,7 @@ msgstr "submodule.fetchJobs ä¸å…è¨±ç‚ºè² å€¼" #: submodule-config.c #, c-format msgid "ignoring '%s' which may be interpreted as a command-line option: %s" -msgstr "忽略å¯èƒ½è¢«è§£æžç‚ºæŒ‡ä»¤åˆ—é¸é …çš„ '%s':%s" +msgstr "忽略å¯èƒ½è¢«è§£æžç‚ºå‘½ä»¤åˆ—é¸é …çš„ '%s':%s" #: submodule-config.c #, c-format @@ -24976,6 +25139,18 @@ msgstr "ls-tree 返回未知返回值 %d" msgid "failed to lstat '%s'" msgstr "無法 lstat “%sâ€" +#: t/helper/test-cache-tree.c +msgid "test-tool cache-tree <options> (control|prime|update)" +msgstr "test-tool cache-tree <options> (control|prime|update)" + +#: t/helper/test-cache-tree.c +msgid "clear the cache tree before each iteration" +msgstr "æ¯æ¬¡è¿ä»£å‰æ¸…é™¤å¿«å–æ¨¹ç‹€ç‰©ä»¶" + +#: t/helper/test-cache-tree.c +msgid "number of entries in the cache tree to invalidate (default 0)" +msgstr "åœ¨å¿«å–æ¨¹ç‹€ç‰©ä»¶ä¸ï¼Œè¦ä½¿å¤±æ•ˆçš„é …ç›®æ•¸é‡ï¼ˆé è¨å€¼ç‚º 0)" + #: t/helper/test-fast-rebase.c msgid "unhandled options" msgstr "未處ç†é¸é …" @@ -25317,7 +25492,7 @@ msgstr "å°‡è¦è¨å®š '%1$s' 的上游為 '%3$s' çš„ '%2$s'\n" #: transport.c #, c-format msgid "could not read bundle '%s'" -msgstr "無法讀å–「%sã€å¥—ä»¶" +msgstr "無法讀å–「%sã€å¥—件包" #: transport.c #, c-format @@ -25423,7 +25598,7 @@ msgid "" "%%sPlease commit your changes or stash them before you switch branches." msgstr "" "您å°ä¸‹åˆ—檔案的本機修改將被簽出動作覆蓋:\n" -"%%s請在切æ›åˆ†æ”¯å‰æäº¤æˆ–å„²è—æ‚¨çš„修改。" +"%%s請在切æ›åˆ†æ”¯å‰æäº¤æˆ–è²¯å˜æ‚¨çš„修改。" #: unpack-trees.c #, c-format @@ -25441,7 +25616,7 @@ msgid "" "%%sPlease commit your changes or stash them before you merge." msgstr "" "您å°ä¸‹åˆ—檔案的本機修改將被åˆä½µå‹•作覆蓋:\n" -"%%s請在åˆä½µå‰æäº¤æˆ–å„²è—æ‚¨çš„修改。" +"%%s請在åˆä½µå‰æäº¤æˆ–è²¯å˜æ‚¨çš„修改。" #: unpack-trees.c #, c-format @@ -25459,7 +25634,7 @@ msgid "" "%%sPlease commit your changes or stash them before you %s." msgstr "" "您å°ä¸‹åˆ—檔案的本機修改將被 %s 覆蓋:\n" -"%%s請在 %s ä¹‹å‰æäº¤æˆ–å„²è—æ‚¨çš„修改。" +"%%s請在 %s ä¹‹å‰æäº¤æˆ–è²¯å˜æ‚¨çš„修改。" #: unpack-trees.c #, c-format @@ -25710,19 +25885,19 @@ msgstr "無效的 '..' 路徑å€å¡Š" #: usage.c msgid "usage: " -msgstr "用法:" +msgstr "用法: " #: usage.c msgid "fatal: " -msgstr "致命錯誤:" +msgstr "致命錯誤: " #: usage.c msgid "error: " -msgstr "錯誤:" +msgstr "錯誤: " #: usage.c msgid "warning: " -msgstr "è¦å‘Šï¼š" +msgstr "è¦å‘Š: " #: walker.c msgid "Fetching objects" @@ -26001,7 +26176,7 @@ msgstr "未追蹤的內容, " #, c-format msgid "Your stash currently has %d entry" msgid_plural "Your stash currently has %d entries" -msgstr[0] "您的儲è—å€ç›®å‰æœ‰ %d æ¢ç´€éŒ„" +msgstr[0] "您的貯å˜å€ç›®å‰æœ‰ %d æ¢ç´€éŒ„" #: wt-status.c msgid "Submodules changed but not updated:" @@ -26511,31 +26686,31 @@ msgstr[0] "建立了 %d 個路徑\n" msgid "" "If the patch applies cleanly, the edited hunk will immediately be\n" "marked for staging." -msgstr "如果修補檔能乾淨地套用,編輯å€å¡Šå°‡ç«‹å³æ¨™è¨˜ç‚ºæš«å˜ã€‚" +msgstr "如果修補檔能完全套用,編輯å€å¡Šå°‡ç«‹å³æ¨™è¨˜ç‚ºæš«å˜ã€‚" #: git-add--interactive.perl msgid "" "If the patch applies cleanly, the edited hunk will immediately be\n" "marked for stashing." -msgstr "如果修補檔能乾淨地套用,編輯å€å¡Šå°‡ç«‹å³æ¨™è¨˜ç‚ºå„²è—。" +msgstr "如果修補檔能完全套用,編輯å€å¡Šå°‡ç«‹å³æ¨™è¨˜ç‚ºè²¯å˜ã€‚" #: git-add--interactive.perl msgid "" "If the patch applies cleanly, the edited hunk will immediately be\n" "marked for unstaging." -msgstr "如果修補檔能乾淨地套用,編輯å€å¡Šå°‡ç«‹å³æ¨™è¨˜ç‚ºæœªæš«å˜ã€‚" +msgstr "如果修補檔能完全套用,編輯å€å¡Šå°‡ç«‹å³æ¨™è¨˜ç‚ºæœªæš«å˜ã€‚" #: git-add--interactive.perl msgid "" "If the patch applies cleanly, the edited hunk will immediately be\n" "marked for applying." -msgstr "如果修補檔能乾淨地套用,編輯å€å¡Šå°‡ç«‹å³æ¨™è¨˜ç‚ºå¥—用。" +msgstr "如果修補檔能完全套用,編輯å€å¡Šå°‡ç«‹å³æ¨™è¨˜ç‚ºå¥—用。" #: git-add--interactive.perl msgid "" "If the patch applies cleanly, the edited hunk will immediately be\n" "marked for discarding." -msgstr "å¦‚æžœä¿®è£œæª”èƒ½ä¹¾æ·¨åœ°å¥—ç”¨ï¼Œç·¨è¼¯å¡Šå°‡ç«‹å³æ¨™è¨˜ç‚ºæ¨æ£„。" +msgstr "å¦‚æžœä¿®è£œæª”èƒ½å®Œå…¨å¥—ç”¨ï¼Œç·¨è¼¯å¡Šå°‡ç«‹å³æ¨™è¨˜ç‚ºæ¨æ£„。" #: git-add--interactive.perl #, perl-format @@ -26582,11 +26757,11 @@ msgid "" "a - stash this hunk and all later hunks in the file\n" "d - do not stash this hunk or any of the later hunks in the file" msgstr "" -"y - å„²è—æ¤å€å¡Š\n" -"n - ä¸è¦å„²è—æ¤å€å¡Š\n" -"q - 離開。ä¸å„²è—æ¤å€å¡ŠåŠå¾Œé¢çš„全部å€å¡Š\n" -"a - å„²è—æ¤å€å¡Šå’Œæœ¬æª”案ä¸å¾Œé¢çš„全部å€å¡Š\n" -"d - ä¸å„²è—æ¤å€å¡Šå’Œæœ¬æª”案ä¸å¾Œé¢çš„全部å€å¡Š" +"y - è²¯å˜æ¤å€å¡Š\n" +"n - ä¸è¦è²¯å˜æ¤å€å¡Š\n" +"q - 離開。ä¸è²¯å˜æ¤å€å¡ŠåŠå¾Œé¢çš„全部å€å¡Š\n" +"a - è²¯å˜æ¤å€å¡Šå’Œæœ¬æª”案ä¸å¾Œé¢çš„全部å€å¡Š\n" +"d - ä¸è²¯å˜æ¤å€å¡Šå’Œæœ¬æª”案ä¸å¾Œé¢çš„全部å€å¡Š" #: git-add--interactive.perl msgid "" @@ -26801,7 +26976,7 @@ msgstr "致命錯誤:命令「%sã€ä¸æ¢ï¼ŒçµæŸç¢¼ï¼š%d" #: git-send-email.perl msgid "the editor exited uncleanly, aborting everything" -msgstr "ç·¨è¼¯å™¨éžæ£å¸¸é›¢é–‹ï¼Œçµ‚æ¢æ‰€æœ‰å‹•作" +msgstr "ç·¨è¼¯å™¨éžæ£å¸¸é›¢é–‹ï¼Œä¸æ¢æ‰€æœ‰å‹•作" #: git-send-email.perl #, perl-format @@ -26836,7 +27011,7 @@ msgstr "ä¸èƒ½åœ¨ç‰ˆæœ¬åº«ä¹‹å¤–執行 git format-patch\n" msgid "" "`batch-size` and `relogin` must be specified together (via command-line or " "configuration option)\n" -msgstr "`batch-size` å’Œ `relogin` å¿…é ˆåŒæ™‚定義(é€éŽæŒ‡ä»¤åˆ—或者è¨å®šé¸é …)\n" +msgstr "`batch-size` å’Œ `relogin` å¿…é ˆåŒæ™‚定義(é€éŽå‘½ä»¤åˆ—或者è¨å®šé¸é …)\n" #: git-send-email.perl #, perl-format @@ -27158,3 +27333,147 @@ msgstr "ç•¥éŽ %s å«å‚™ä»½å¾Œç¶´ '%s'。\n" #, perl-format msgid "Do you really want to send %s? [y|N]: " msgstr "您真的è¦å‚³é€ %s?[y|N]: " + +#, c-format +#~ msgid "unable to normalize object directory: %s" +#~ msgstr "無法è¦ç¯„化物件目錄: %s" + +#~ msgid "reset the bisection state" +#~ msgstr "清除二分æœå°‹ç‹€æ…‹" + +#~ msgid "check whether bad or good terms exist" +#~ msgstr "檢查壞的或好的術語是å¦å˜åœ¨" + +#~ msgid "print out the bisect terms" +#~ msgstr "列å°äºŒåˆ†æœå°‹è¡“語" + +#~ msgid "start the bisect session" +#~ msgstr "啟動二分æœå°‹éŽç¨‹" + +#~ msgid "find the next bisection commit" +#~ msgstr "尋找下一個二分æœå°‹æäº¤" + +#~ msgid "mark the state of ref (or refs)" +#~ msgstr "標記 ref (或 refs) 的狀態" + +#~ msgid "list the bisection steps so far" +#~ msgstr "列出迄今的二分æœå°‹æ¥é©Ÿ" + +#~ msgid "replay the bisection process from the given file" +#~ msgstr "å¾žæŒ‡å®šæª”æ¡ˆé‡æ”¾äºŒåˆ†æœå°‹éŽç¨‹" + +#~ msgid "skip some commits for checkout" +#~ msgstr "ç•¥éŽè¦ç°½å‡ºçš„部分æäº¤" + +#~ msgid "visualize the bisection" +#~ msgstr "視覺化二分æœå°‹éŽç¨‹" + +#~ msgid "use <cmd>... to automatically bisect" +#~ msgstr "使用 <cmd>... 自動進行二分æœå°‹" + +#~ msgid "no log for BISECT_WRITE" +#~ msgstr "BISECT_WRITE 無日誌" + +#~ msgid "Couldn't look up commit object for HEAD" +#~ msgstr "無法查詢 HEAD 指å‘çš„æäº¤ç‰©ä»¶" + +#~ msgid "git bundle create [<options>] <file> <git-rev-list args>" +#~ msgstr "git bundle create [<é¸é …>] <檔案> <git-rev-list åƒæ•¸>" + +#, c-format +#~ msgid "options '%s' and '%s %s' cannot be used together" +#~ msgstr "「%sã€å’Œã€Œ%s %sã€é¸é …ä¸å¾—åŒæ™‚使用" + +#~ msgid "git commit [<options>] [--] <pathspec>..." +#~ msgstr "git commit [<é¸é …>] [--] <è·¯å¾‘è¦æ ¼>..." + +#~ msgid "git fsck [<options>] [<object>...]" +#~ msgstr "git fsck [<é¸é …>] [<物件>...]" + +#~ msgid "git fsmonitor--daemon stop" +#~ msgstr "git fsmonitor--daemon stop" + +#~ msgid "git fsmonitor--daemon status" +#~ msgstr "git fsmonitor--daemon status" + +#~ msgid "failed to run 'git config'" +#~ msgstr "無法執行 ‘git config’" + +#, c-format +#~ msgid "could not get 'onto': '%s'" +#~ msgstr "無法å–å¾— 'onto':'%s'" + +#~ msgid "Could not resolve HEAD to a revision" +#~ msgstr "無法將 HEAD è§£æžç‚ºä¸€å€‹ç‰ˆæœ¬" + +#, c-format +#~ msgid "missing required file: %s" +#~ msgstr "ç¼ºå°‘å¿…è¦æª”案:%s" + +#~ msgid "git revert [<options>] <commit-ish>..." +#~ msgstr "git revert [<é¸é …>] <æäº¤è™Ÿ>..." + +#~ msgid "git revert <subcommand>" +#~ msgstr "git revert <åæŒ‡ä»¤>" + +#~ msgid "git cherry-pick [<options>] <commit-ish>..." +#~ msgstr "git cherry-pick [<é¸é …>] <æäº¤è™Ÿ>..." + +#~ msgid "git cherry-pick <subcommand>" +#~ msgstr "git cherry-pick <åæŒ‡ä»¤>" + +#~ msgid "git rm [<options>] [--] <file>..." +#~ msgstr "git rm [<é¸é …>] [--] <檔案>..." + +#~ msgid "using --group=trailer with stdin is not supported" +#~ msgstr "䏿”¯æ´åœ¨æ¨™æº–輸入使用 --group=trailer" + +#~ msgid "git stash show [<options>] [<stash>]" +#~ msgstr "git stash show [<é¸é …>] [<stash>]" + +#~ msgid "git stash ( pop | apply ) [--index] [-q|--quiet] [<stash>]" +#~ msgstr "git stash ( pop | apply ) [--index] [-q|--quiet] [<stash>]" + +#~ msgid "" +#~ "git stash [push [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]\n" +#~ " [-u|--include-untracked] [-a|--all] [-m|--message <message>]\n" +#~ " [--] [<pathspec>...]]" +#~ msgstr "" +#~ "git stash [push [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]\n" +#~ " [-u|--include-untracked] [-a|--all] [-m|--message <消æ¯>]\n" +#~ " [--] [<è·¯å¾‘è¦æ ¼>...]]" + +#~ msgid "" +#~ "git stash save [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]\n" +#~ " [-u|--include-untracked] [-a|--all] [<message>]" +#~ msgstr "" +#~ "git stash save [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]\n" +#~ " [-u|--include-untracked] [-a|--all] [<消æ¯>]" + +#~ msgid "path into the working tree" +#~ msgstr "到工作å€çš„路徑" + +#~ msgid "recurse into submodules" +#~ msgstr "åœ¨åæ¨¡çµ„ä¸éžè¿´" + +#~ msgid "check if it is safe to write to the .gitmodules file" +#~ msgstr "檢查寫入 .gitmodules 檔案是å¦å®‰å…¨" + +#~ msgid "unset the config in the .gitmodules file" +#~ msgstr "å–æ¶ˆ .gitmodules 檔案ä¸çš„è¨å®š" + +#~ msgid "git submodule--helper config --unset <name>" +#~ msgstr "git submodule--helper config --unset <å稱>" + +#, c-format +#~ msgid "'%s' is not a valid submodule--helper subcommand" +#~ msgstr "'%s' 䏿˜¯ä¸€å€‹æœ‰æ•ˆçš„ submodule--helper åæŒ‡ä»¤" + +#~ msgid "git upload-pack [<options>] <dir>" +#~ msgstr "git upload-pack [<é¸é …>] <目錄>" + +#~ msgid "git worktree add [<options>] <path> [<commit-ish>]" +#~ msgstr "git worktree add [<é¸é …>] <路徑> [<æäº¤>]" + +#~ msgid "git worktree lock [<options>] <path>" +#~ msgstr "git worktree lock [<é¸é …>] <路徑>" @@ -14,6 +14,13 @@ #include "trailer.h" #include "run-command.h" +/* + * The limit for formatting directives, which enable the caller to append + * arbitrarily many bytes to the formatted buffer. This includes padding + * and wrapping formatters. + */ +#define FORMATTING_LIMIT (16 * 1024) + static char *user_format; static struct cmt_fmt_map { const char *name; @@ -994,7 +1001,9 @@ static void strbuf_wrap(struct strbuf *sb, size_t pos, if (pos) strbuf_add(&tmp, sb->buf, pos); strbuf_add_wrapped_text(&tmp, sb->buf + pos, - (int) indent1, (int) indent2, (int) width); + cast_size_t_to_int(indent1), + cast_size_t_to_int(indent2), + cast_size_t_to_int(width)); strbuf_swap(&tmp, sb); strbuf_release(&tmp); } @@ -1120,9 +1129,18 @@ static size_t parse_padding_placeholder(const char *placeholder, const char *end = start + strcspn(start, ",)"); char *next; int width; - if (!end || end == start) + if (!*end || end == start) return 0; width = strtol(start, &next, 10); + + /* + * We need to limit the amount of padding, or otherwise this + * would allow the user to pad the buffer by arbitrarily many + * bytes and thus cause resource exhaustion. + */ + if (width < -FORMATTING_LIMIT || width > FORMATTING_LIMIT) + return 0; + if (next == start || width == 0) return 0; if (width < 0) { @@ -1405,6 +1423,16 @@ static size_t format_commit_one(struct strbuf *sb, /* in UTF-8 */ if (*next != ')') return 0; } + + /* + * We need to limit the format here as it allows the + * user to prepend arbitrarily many bytes to the buffer + * when rewrapping. + */ + if (width > FORMATTING_LIMIT || + indent1 > FORMATTING_LIMIT || + indent2 > FORMATTING_LIMIT) + return 0; rewrap_message_tail(sb, c, width, indent1, indent2); return end - placeholder + 1; } else @@ -1670,19 +1698,21 @@ static size_t format_and_pad_commit(struct strbuf *sb, /* in UTF-8 */ struct format_commit_context *c) { struct strbuf local_sb = STRBUF_INIT; - int total_consumed = 0, len, padding = c->padding; + size_t total_consumed = 0; + int len, padding = c->padding; + if (padding < 0) { const char *start = strrchr(sb->buf, '\n'); int occupied; if (!start) start = sb->buf; - occupied = utf8_strnwidth(start, -1, 1); + occupied = utf8_strnwidth(start, strlen(start), 1); occupied += c->pretty_ctx->graph_width; padding = (-padding) - occupied; } while (1) { int modifier = *placeholder == 'C'; - int consumed = format_commit_one(&local_sb, placeholder, c); + size_t consumed = format_commit_one(&local_sb, placeholder, c); total_consumed += consumed; if (!modifier) @@ -1694,7 +1724,7 @@ static size_t format_and_pad_commit(struct strbuf *sb, /* in UTF-8 */ placeholder++; total_consumed++; } - len = utf8_strnwidth(local_sb.buf, -1, 1); + len = utf8_strnwidth(local_sb.buf, local_sb.len, 1); if (c->flush_type == flush_left_and_steal) { const char *ch = sb->buf + sb->len - 1; @@ -1709,7 +1739,7 @@ static size_t format_and_pad_commit(struct strbuf *sb, /* in UTF-8 */ if (*ch != 'm') break; p = ch - 1; - while (ch - p < 10 && *p != '\033') + while (p > sb->buf && ch - p < 10 && *p != '\033') p--; if (*p != '\033' || ch + 1 - p != display_mode_esc_sequence_len(p)) @@ -1748,7 +1778,7 @@ static size_t format_and_pad_commit(struct strbuf *sb, /* in UTF-8 */ } strbuf_addbuf(sb, &local_sb); } else { - int sb_len = sb->len, offset = 0; + size_t sb_len = sb->len, offset = 0; if (c->flush_type == flush_left) offset = padding - len; else if (c->flush_type == flush_both) @@ -1771,8 +1801,7 @@ static size_t format_commit_item(struct strbuf *sb, /* in UTF-8 */ const char *placeholder, void *context) { - int consumed; - size_t orig_len; + size_t consumed, orig_len; enum { NO_MAGIC, ADD_LF_BEFORE_NON_EMPTY, @@ -1793,9 +1822,21 @@ static size_t format_commit_item(struct strbuf *sb, /* in UTF-8 */ default: break; } - if (magic != NO_MAGIC) + if (magic != NO_MAGIC) { placeholder++; + switch (placeholder[0]) { + case 'w': + /* + * `%+w()` cannot ever expand to a non-empty string, + * and it potentially changes the layout of preceding + * contents. We're thus not able to handle the magic in + * this combination and refuse the pattern. + */ + return 0; + }; + } + orig_len = sb->len; if (((struct format_commit_context *)context)->flush_type != no_flush) consumed = format_and_pad_commit(sb, placeholder, context); diff --git a/range-diff.c b/range-diff.c index 8b7d81adc1..8255ab4349 100644 --- a/range-diff.c +++ b/range-diff.c @@ -269,14 +269,18 @@ static void find_exact_matches(struct string_list *a, struct string_list *b) hashmap_clear(&map); } -static int diffsize_consume(void *data, char *line, unsigned long len) +static int diffsize_consume(void *data, + char *line UNUSED, + unsigned long len UNUSED) { (*(int *)data)++; return 0; } -static void diffsize_hunk(void *data, long ob, long on, long nb, long nn, - const char *funcline, long funclen) +static void diffsize_hunk(void *data, + long ob UNUSED, long on UNUSED, + long nb UNUSED, long nn UNUSED, + const char *func UNUSED, long funclen UNUSED) { diffsize_consume(data, NULL, 0); } @@ -461,7 +465,7 @@ static void patch_diff(const char *a, const char *b, diff_flush(diffopt); } -static struct strbuf *output_prefix_cb(struct diff_options *opt, void *data) +static struct strbuf *output_prefix_cb(struct diff_options *opt UNUSED, void *data) { return data; } diff --git a/read-cache.c b/read-cache.c index 3202402927..46f5e497b1 100644 --- a/read-cache.c +++ b/read-cache.c @@ -2531,7 +2531,7 @@ int is_index_unborn(struct index_state *istate) return (!istate->cache_nr && !istate->timestamp.sec); } -int discard_index(struct index_state *istate) +void discard_index(struct index_state *istate) { /* * Cache entries in istate->cache[] should have been allocated @@ -2562,8 +2562,6 @@ int discard_index(struct index_state *istate) mem_pool_discard(istate->ce_mem_pool, should_validate_cache_entries()); FREE_AND_NULL(istate->ce_mem_pool); } - - return 0; } /* diff --git a/ref-filter.c b/ref-filter.c index 9dc2cd1451..971303683b 100644 --- a/ref-filter.c +++ b/ref-filter.c @@ -2128,8 +2128,9 @@ static int for_each_fullref_in_pattern(struct ref_filter *filter, return for_each_fullref_in("", cb, cb_data); } - return for_each_fullref_in_prefixes(NULL, filter->name_patterns, - cb, cb_data); + return refs_for_each_fullref_in_prefixes(get_main_ref_store(the_repository), + NULL, filter->name_patterns, + cb, cb_data); } /* @@ -193,7 +193,6 @@ static void mark_reachable(struct expire_reflog_policy_cb *cb) commit_list_insert(commit, &leftover); continue; } - commit->object.flags |= REACHABLE; parent = commit->parents; while (parent) { commit = parent->item; @@ -371,6 +370,9 @@ void reflog_expiry_cleanup(void *cb_data) clear_commit_marks(cb->tip_commit, REACHABLE); break; } + for (elem = cb->mark_list; elem; elem = elem->next) + clear_commit_marks(elem->item, REACHABLE); + free_commit_list(cb->mark_list); } int count_reflog_ent(struct object_id *ooid UNUSED, @@ -1414,9 +1414,8 @@ char *shorten_unambiguous_ref(const char *refname, int strict) refname, strict); } -static struct string_list *hide_refs; - -int parse_hide_refs_config(const char *var, const char *value, const char *section) +int parse_hide_refs_config(const char *var, const char *value, const char *section, + struct string_list *hide_refs) { const char *key; if (!strcmp("transfer.hiderefs", var) || @@ -1431,21 +1430,16 @@ int parse_hide_refs_config(const char *var, const char *value, const char *secti len = strlen(ref); while (len && ref[len - 1] == '/') ref[--len] = '\0'; - if (!hide_refs) { - CALLOC_ARRAY(hide_refs, 1); - hide_refs->strdup_strings = 1; - } - string_list_append(hide_refs, ref); + string_list_append_nodup(hide_refs, ref); } return 0; } -int ref_is_hidden(const char *refname, const char *refname_full) +int ref_is_hidden(const char *refname, const char *refname_full, + const struct string_list *hide_refs) { int i; - if (!hide_refs) - return 0; for (i = hide_refs->nr - 1; i >= 0; i--) { const char *match = hide_refs->items[i].string; const char *subject; @@ -1729,9 +1723,10 @@ static void find_longest_prefixes(struct string_list *out, strbuf_release(&prefix); } -int for_each_fullref_in_prefixes(const char *namespace, - const char **patterns, - each_ref_fn fn, void *cb_data) +int refs_for_each_fullref_in_prefixes(struct ref_store *ref_store, + const char *namespace, + const char **patterns, + each_ref_fn fn, void *cb_data) { struct string_list prefixes = STRING_LIST_INIT_DUP; struct string_list_item *prefix; @@ -1746,7 +1741,7 @@ int for_each_fullref_in_prefixes(const char *namespace, for_each_string_list_item(prefix, &prefixes) { strbuf_addstr(&buf, prefix->string); - ret = for_each_fullref_in(buf.buf, fn, cb_data); + ret = refs_for_each_fullref_in(ref_store, buf.buf, fn, cb_data); if (ret) break; strbuf_setlen(&buf, namespace_len); @@ -354,8 +354,10 @@ int for_each_fullref_in(const char *prefix, each_ref_fn fn, void *cb_data); * * callers should be prepared to ignore references that they did not ask for. */ -int for_each_fullref_in_prefixes(const char *namespace, const char **patterns, - each_ref_fn fn, void *cb_data); +int refs_for_each_fullref_in_prefixes(struct ref_store *refs, + const char *namespace, const char **patterns, + each_ref_fn fn, void *cb_data); + /** * iterate refs from the respective area. */ @@ -808,7 +810,8 @@ int update_ref(const char *msg, const char *refname, const struct object_id *new_oid, const struct object_id *old_oid, unsigned int flags, enum action_on_err onerr); -int parse_hide_refs_config(const char *var, const char *value, const char *); +int parse_hide_refs_config(const char *var, const char *value, const char *, + struct string_list *); /* * Check whether a ref is hidden. If no namespace is set, both the first and @@ -818,7 +821,7 @@ int parse_hide_refs_config(const char *var, const char *value, const char *); * the ref is outside that namespace, the first parameter is NULL. The second * parameter always points to the full ref name. */ -int ref_is_hidden(const char *, const char *); +int ref_is_hidden(const char *, const char *, const struct string_list *); /* Is this a per-worktree ref living in the refs/ namespace? */ int is_per_worktree_ref(const char *refname); diff --git a/refs/packed-backend.c b/refs/packed-backend.c index c1c71d183e..6f5a0709fb 100644 --- a/refs/packed-backend.c +++ b/refs/packed-backend.c @@ -1263,7 +1263,8 @@ static int write_with_updates(struct packed_ref_store *refs, goto error; } - if (fsync_component(FSYNC_COMPONENT_REFERENCE, get_tempfile_fd(refs->tempfile)) || + if (fflush(out) || + fsync_component(FSYNC_COMPONENT_REFERENCE, get_tempfile_fd(refs->tempfile)) || close_tempfile_gently(refs->tempfile)) { strbuf_addf(err, "error closing file %s: %s", get_tempfile_path(refs->tempfile), diff --git a/remote-curl.c b/remote-curl.c index 72dfb8fb86..a76b6405eb 100644 --- a/remote-curl.c +++ b/remote-curl.c @@ -717,25 +717,23 @@ static size_t rpc_out(void *ptr, size_t eltsize, return avail; } -static curlioerr rpc_ioctl(CURL *handle, int cmd, void *clientp) +static int rpc_seek(void *clientp, curl_off_t offset, int origin) { struct rpc_state *rpc = clientp; - switch (cmd) { - case CURLIOCMD_NOP: - return CURLIOE_OK; + if (origin != SEEK_SET) + BUG("rpc_seek only handles SEEK_SET, not %d", origin); - case CURLIOCMD_RESTARTREAD: - if (rpc->initial_buffer) { - rpc->pos = 0; - return CURLIOE_OK; + if (rpc->initial_buffer) { + if (offset < 0 || offset > rpc->len) { + error("curl seek would be outside of rpc buffer"); + return CURL_SEEKFUNC_FAIL; } - error(_("unable to rewind rpc post data - try increasing http.postBuffer")); - return CURLIOE_FAILRESTART; - - default: - return CURLIOE_UNKNOWNCMD; + rpc->pos = offset; + return CURL_SEEKFUNC_OK; } + error(_("unable to rewind rpc post data - try increasing http.postBuffer")); + return CURL_SEEKFUNC_FAIL; } struct check_pktline_state { @@ -959,8 +957,8 @@ retry: rpc->initial_buffer = 1; curl_easy_setopt(slot->curl, CURLOPT_READFUNCTION, rpc_out); curl_easy_setopt(slot->curl, CURLOPT_INFILE, rpc); - curl_easy_setopt(slot->curl, CURLOPT_IOCTLFUNCTION, rpc_ioctl); - curl_easy_setopt(slot->curl, CURLOPT_IOCTLDATA, rpc); + curl_easy_setopt(slot->curl, CURLOPT_SEEKFUNCTION, rpc_seek); + curl_easy_setopt(slot->curl, CURLOPT_SEEKDATA, rpc); if (options.verbosity > 1) { fprintf(stderr, "POST %s (chunked)\n", rpc->service_name); fflush(stderr); diff --git a/repository.c b/repository.c index 5d166b692c..3427085fd6 100644 --- a/repository.c +++ b/repository.c @@ -2,7 +2,7 @@ * not really _using_ the compat macros, just make sure the_index * declaration matches the definition in this file. */ -#define USE_THE_INDEX_COMPATIBILITY_MACROS +#define USE_THE_INDEX_VARIABLE #include "cache.h" #include "repository.h" #include "object-store.h" @@ -128,6 +128,7 @@ int reset_head(struct repository *r, const struct reset_head_opts *opts) unpack_tree_opts.update = 1; unpack_tree_opts.merge = 1; unpack_tree_opts.preserve_ignored = 0; /* FIXME: !overwrite_ignore */ + unpack_tree_opts.skip_cache_tree_update = 1; init_checkout_metadata(&unpack_tree_opts.meta, switch_to_branch, oid, NULL); if (reset_hard) unpack_tree_opts.reset = UNPACK_RESET_PROTECT_UNTRACKED; diff --git a/revision.c b/revision.c index 0760e78936..ec441b80ef 100644 --- a/revision.c +++ b/revision.c @@ -1,4 +1,5 @@ #include "cache.h" +#include "config.h" #include "object-store.h" #include "tag.h" #include "blob.h" @@ -599,10 +600,12 @@ static struct commit *one_relevant_parent(const struct rev_info *revs, static int tree_difference = REV_TREE_SAME; static void file_add_remove(struct diff_options *options, - int addremove, unsigned mode, - const struct object_id *oid, - int oid_valid, - const char *fullpath, unsigned dirty_submodule) + int addremove, + unsigned mode UNUSED, + const struct object_id *oid UNUSED, + int oid_valid UNUSED, + const char *fullpath UNUSED, + unsigned dirty_submodule UNUSED) { int diff = addremove == '+' ? REV_TREE_NEW : REV_TREE_OLD; struct rev_info *revs = options->change_fn_data; @@ -613,12 +616,15 @@ static void file_add_remove(struct diff_options *options, } static void file_change(struct diff_options *options, - unsigned old_mode, unsigned new_mode, - const struct object_id *old_oid, - const struct object_id *new_oid, - int old_oid_valid, int new_oid_valid, - const char *fullpath, - unsigned old_dirty_submodule, unsigned new_dirty_submodule) + unsigned old_mode UNUSED, + unsigned new_mode UNUSED, + const struct object_id *old_oid UNUSED, + const struct object_id *new_oid UNUSED, + int old_oid_valid UNUSED, + int new_oid_valid UNUSED, + const char *fullpath UNUSED, + unsigned old_dirty_submodule UNUSED, + unsigned new_dirty_submodule UNUSED) { tree_difference = REV_TREE_DIFFERENT; options->flags.has_changes = 1; @@ -1517,27 +1523,77 @@ static void add_rev_cmdline_list(struct rev_info *revs, } } -struct all_refs_cb { - int all_flags; - int warned_bad_reflog; - struct rev_info *all_revs; - const char *name_for_errormsg; - struct worktree *wt; -}; - -int ref_excluded(struct string_list *ref_excludes, const char *path) +int ref_excluded(const struct ref_exclusions *exclusions, const char *path) { + const char *stripped_path = strip_namespace(path); struct string_list_item *item; - if (!ref_excludes) - return 0; - for_each_string_list_item(item, ref_excludes) { + for_each_string_list_item(item, &exclusions->excluded_refs) { if (!wildmatch(item->string, path, 0)) return 1; } + + if (ref_is_hidden(stripped_path, path, &exclusions->hidden_refs)) + return 1; + return 0; } +void init_ref_exclusions(struct ref_exclusions *exclusions) +{ + struct ref_exclusions blank = REF_EXCLUSIONS_INIT; + memcpy(exclusions, &blank, sizeof(*exclusions)); +} + +void clear_ref_exclusions(struct ref_exclusions *exclusions) +{ + string_list_clear(&exclusions->excluded_refs, 0); + string_list_clear(&exclusions->hidden_refs, 0); + exclusions->hidden_refs_configured = 0; +} + +void add_ref_exclusion(struct ref_exclusions *exclusions, const char *exclude) +{ + string_list_append(&exclusions->excluded_refs, exclude); +} + +struct exclude_hidden_refs_cb { + struct ref_exclusions *exclusions; + const char *section; +}; + +static int hide_refs_config(const char *var, const char *value, void *cb_data) +{ + struct exclude_hidden_refs_cb *cb = cb_data; + cb->exclusions->hidden_refs_configured = 1; + return parse_hide_refs_config(var, value, cb->section, + &cb->exclusions->hidden_refs); +} + +void exclude_hidden_refs(struct ref_exclusions *exclusions, const char *section) +{ + struct exclude_hidden_refs_cb cb; + + if (strcmp(section, "receive") && strcmp(section, "uploadpack")) + die(_("unsupported section for hidden refs: %s"), section); + + if (exclusions->hidden_refs_configured) + die(_("--exclude-hidden= passed more than once")); + + cb.exclusions = exclusions; + cb.section = section; + + git_config(hide_refs_config, &cb); +} + +struct all_refs_cb { + int all_flags; + int warned_bad_reflog; + struct rev_info *all_revs; + const char *name_for_errormsg; + struct worktree *wt; +}; + static int handle_one_ref(const char *path, const struct object_id *oid, int flag UNUSED, void *cb_data) @@ -1545,7 +1601,7 @@ static int handle_one_ref(const char *path, const struct object_id *oid, struct all_refs_cb *cb = cb_data; struct object *object; - if (ref_excluded(cb->all_revs->ref_excludes, path)) + if (ref_excluded(&cb->all_revs->ref_excludes, path)) return 0; object = get_reference(cb->all_revs, path, oid, cb->all_flags); @@ -1563,24 +1619,6 @@ static void init_all_refs_cb(struct all_refs_cb *cb, struct rev_info *revs, cb->wt = NULL; } -void clear_ref_exclusion(struct string_list **ref_excludes_p) -{ - if (*ref_excludes_p) { - string_list_clear(*ref_excludes_p, 0); - free(*ref_excludes_p); - } - *ref_excludes_p = NULL; -} - -void add_ref_exclusion(struct string_list **ref_excludes_p, const char *exclude) -{ - if (!*ref_excludes_p) { - CALLOC_ARRAY(*ref_excludes_p, 1); - (*ref_excludes_p)->strdup_strings = 1; - } - string_list_append(*ref_excludes_p, exclude); -} - static void handle_refs(struct ref_store *refs, struct rev_info *revs, unsigned flags, int (*for_each)(struct ref_store *, each_ref_fn, void *)) @@ -1865,30 +1903,15 @@ void repo_init_revisions(struct repository *r, struct rev_info *revs, const char *prefix) { - memset(revs, 0, sizeof(*revs)); + struct rev_info blank = REV_INFO_INIT; + memcpy(revs, &blank, sizeof(*revs)); revs->repo = r; - revs->abbrev = DEFAULT_ABBREV; - revs->simplify_history = 1; revs->pruning.repo = r; - revs->pruning.flags.recursive = 1; - revs->pruning.flags.quick = 1; revs->pruning.add_remove = file_add_remove; revs->pruning.change = file_change; revs->pruning.change_fn_data = revs; - revs->sort_order = REV_SORT_IN_GRAPH_ORDER; - revs->dense = 1; revs->prefix = prefix; - revs->max_age = -1; - revs->max_age_as_filter = -1; - revs->min_age = -1; - revs->skip_count = -1; - revs->max_count = -1; - revs->max_parents = -1; - revs->expand_tabs_in_log = -1; - - revs->commit_format = CMIT_FMT_DEFAULT; - revs->expand_tabs_in_log_default = 8; grep_init(&revs->grep_filter, revs->repo); revs->grep_filter.status_only = 1; @@ -1901,6 +1924,7 @@ void repo_init_revisions(struct repository *r, init_display_notes(&revs->notes_opt); list_objects_filter_init(&revs->filter); + init_ref_exclusions(&revs->ref_excludes); } static void add_pending_commit_list(struct rev_info *revs, @@ -2225,7 +2249,7 @@ static int handle_revision_opt(struct rev_info *revs, int argc, const char **arg !strcmp(arg, "--bisect") || starts_with(arg, "--glob=") || !strcmp(arg, "--indexed-objects") || !strcmp(arg, "--alternate-refs") || - starts_with(arg, "--exclude=") || + starts_with(arg, "--exclude=") || starts_with(arg, "--exclude-hidden=") || starts_with(arg, "--branches=") || starts_with(arg, "--tags=") || starts_with(arg, "--remotes=") || starts_with(arg, "--no-walk=")) { @@ -2689,10 +2713,12 @@ static int handle_revision_pseudo_opt(struct rev_info *revs, init_all_refs_cb(&cb, revs, *flags); other_head_refs(handle_one_ref, &cb); } - clear_ref_exclusion(&revs->ref_excludes); + clear_ref_exclusions(&revs->ref_excludes); } else if (!strcmp(arg, "--branches")) { + if (revs->ref_excludes.hidden_refs_configured) + return error(_("--exclude-hidden cannot be used together with --branches")); handle_refs(refs, revs, *flags, refs_for_each_branch_ref); - clear_ref_exclusion(&revs->ref_excludes); + clear_ref_exclusions(&revs->ref_excludes); } else if (!strcmp(arg, "--bisect")) { read_bisect_terms(&term_bad, &term_good); handle_refs(refs, revs, *flags, for_each_bad_bisect_ref); @@ -2700,35 +2726,48 @@ static int handle_revision_pseudo_opt(struct rev_info *revs, for_each_good_bisect_ref); revs->bisect = 1; } else if (!strcmp(arg, "--tags")) { + if (revs->ref_excludes.hidden_refs_configured) + return error(_("--exclude-hidden cannot be used together with --tags")); handle_refs(refs, revs, *flags, refs_for_each_tag_ref); - clear_ref_exclusion(&revs->ref_excludes); + clear_ref_exclusions(&revs->ref_excludes); } else if (!strcmp(arg, "--remotes")) { + if (revs->ref_excludes.hidden_refs_configured) + return error(_("--exclude-hidden cannot be used together with --remotes")); handle_refs(refs, revs, *flags, refs_for_each_remote_ref); - clear_ref_exclusion(&revs->ref_excludes); + clear_ref_exclusions(&revs->ref_excludes); } else if ((argcount = parse_long_opt("glob", argv, &optarg))) { struct all_refs_cb cb; init_all_refs_cb(&cb, revs, *flags); for_each_glob_ref(handle_one_ref, optarg, &cb); - clear_ref_exclusion(&revs->ref_excludes); + clear_ref_exclusions(&revs->ref_excludes); return argcount; } else if ((argcount = parse_long_opt("exclude", argv, &optarg))) { add_ref_exclusion(&revs->ref_excludes, optarg); return argcount; + } else if ((argcount = parse_long_opt("exclude-hidden", argv, &optarg))) { + exclude_hidden_refs(&revs->ref_excludes, optarg); + return argcount; } else if (skip_prefix(arg, "--branches=", &optarg)) { struct all_refs_cb cb; + if (revs->ref_excludes.hidden_refs_configured) + return error(_("--exclude-hidden cannot be used together with --branches")); init_all_refs_cb(&cb, revs, *flags); for_each_glob_ref_in(handle_one_ref, optarg, "refs/heads/", &cb); - clear_ref_exclusion(&revs->ref_excludes); + clear_ref_exclusions(&revs->ref_excludes); } else if (skip_prefix(arg, "--tags=", &optarg)) { struct all_refs_cb cb; + if (revs->ref_excludes.hidden_refs_configured) + return error(_("--exclude-hidden cannot be used together with --tags")); init_all_refs_cb(&cb, revs, *flags); for_each_glob_ref_in(handle_one_ref, optarg, "refs/tags/", &cb); - clear_ref_exclusion(&revs->ref_excludes); + clear_ref_exclusions(&revs->ref_excludes); } else if (skip_prefix(arg, "--remotes=", &optarg)) { struct all_refs_cb cb; + if (revs->ref_excludes.hidden_refs_configured) + return error(_("--exclude-hidden cannot be used together with --remotes")); init_all_refs_cb(&cb, revs, *flags); for_each_glob_ref_in(handle_one_ref, optarg, "refs/remotes/", &cb); - clear_ref_exclusion(&revs->ref_excludes); + clear_ref_exclusions(&revs->ref_excludes); } else if (!strcmp(arg, "--reflog")) { add_reflogs_to_pending(revs, *flags); } else if (!strcmp(arg, "--indexed-objects")) { diff --git a/revision.h b/revision.h index afe1b77985..30febad09a 100644 --- a/revision.h +++ b/revision.h @@ -81,6 +81,35 @@ struct rev_cmdline_info { } *rev; }; +struct ref_exclusions { + /* + * Excluded refs is a list of wildmatch patterns. If any of the + * patterns matches, the reference will be excluded. + */ + struct string_list excluded_refs; + + /* + * Hidden refs is a list of patterns that is to be hidden via + * `ref_is_hidden()`. + */ + struct string_list hidden_refs; + + /* + * Indicates whether hidden refs have been configured. This is to + * distinguish between no hidden refs existing and hidden refs not + * being parsed. + */ + char hidden_refs_configured; +}; + +/** + * Initialize a `struct ref_exclusions` with a macro. + */ +#define REF_EXCLUSIONS_INIT { \ + .excluded_refs = STRING_LIST_INIT_DUP, \ + .hidden_refs = STRING_LIST_INIT_DUP, \ +} + struct oidset; struct topo_walk_info; @@ -103,7 +132,7 @@ struct rev_info { struct list_objects_filter_options filter; /* excluding from --branches, --refs, etc. expansion */ - struct string_list *ref_excludes; + struct ref_exclusions ref_excludes; /* Basic information */ const char *prefix; @@ -357,7 +386,23 @@ struct rev_info { * called before release_revisions() the "struct rev_info" can be left * uninitialized. */ -#define REV_INFO_INIT { 0 } +#define REV_INFO_INIT { \ + .abbrev = DEFAULT_ABBREV, \ + .simplify_history = 1, \ + .pruning.flags.recursive = 1, \ + .pruning.flags.quick = 1, \ + .sort_order = REV_SORT_IN_GRAPH_ORDER, \ + .dense = 1, \ + .max_age = -1, \ + .max_age_as_filter = -1, \ + .min_age = -1, \ + .skip_count = -1, \ + .max_count = -1, \ + .max_parents = -1, \ + .expand_tabs_in_log = -1, \ + .commit_format = CMIT_FMT_DEFAULT, \ + .expand_tabs_in_log_default = 8, \ +} /** * Initialize a rev_info structure with default values. The third parameter may @@ -439,12 +484,14 @@ void mark_trees_uninteresting_sparse(struct repository *r, struct oidset *trees) void show_object_with_name(FILE *, struct object *, const char *); /** - * Helpers to check if a "struct string_list" item matches with - * wildmatch(). + * Helpers to check if a reference should be excluded. */ -int ref_excluded(struct string_list *, const char *path); -void clear_ref_exclusion(struct string_list **); -void add_ref_exclusion(struct string_list **, const char *exclude); + +int ref_excluded(const struct ref_exclusions *exclusions, const char *path); +void init_ref_exclusions(struct ref_exclusions *); +void clear_ref_exclusions(struct ref_exclusions *); +void add_ref_exclusion(struct ref_exclusions *, const char *exclude); +void exclude_hidden_refs(struct ref_exclusions *, const char *section); /** * This function can be used if you want to add commit objects as revision @@ -596,6 +596,24 @@ static int get_scalar_repos(const char *key, const char *value, void *data) return 0; } +static int remove_deleted_enlistment(struct strbuf *path) +{ + int res = 0; + strbuf_realpath_forgiving(path, path->buf, 1); + + if (run_git("config", "--global", + "--unset", "--fixed-value", + "scalar.repo", path->buf, NULL) < 0) + res = -1; + + if (run_git("config", "--global", + "--unset", "--fixed-value", + "maintenance.repo", path->buf, NULL) < 0) + res = -1; + + return res; +} + static int cmd_reconfigure(int argc, const char **argv) { int all = 0; @@ -635,8 +653,22 @@ static int cmd_reconfigure(int argc, const char **argv) strbuf_reset(&gitdir); if (chdir(dir) < 0) { - warning_errno(_("could not switch to '%s'"), dir); - res = -1; + struct strbuf buf = STRBUF_INIT; + + if (errno != ENOENT) { + warning_errno(_("could not switch to '%s'"), dir); + res = -1; + continue; + } + + strbuf_addstr(&buf, dir); + if (remove_deleted_enlistment(&buf)) + res = error(_("could not remove stale " + "scalar.repo '%s'"), dir); + else + warning(_("removing stale scalar.repo '%s'"), + dir); + strbuf_release(&buf); } else if (discover_git_directory(&commondir, &gitdir) < 0) { warning_errno(_("git repository gone in '%s'"), dir); res = -1; @@ -722,24 +754,6 @@ static int cmd_run(int argc, const char **argv) return 0; } -static int remove_deleted_enlistment(struct strbuf *path) -{ - int res = 0; - strbuf_realpath_forgiving(path, path->buf, 1); - - if (run_git("config", "--global", - "--unset", "--fixed-value", - "scalar.repo", path->buf, NULL) < 0) - res = -1; - - if (run_git("config", "--global", - "--unset", "--fixed-value", - "maintenance.repo", path->buf, NULL) < 0) - res = -1; - - return res; -} - static int cmd_unregister(int argc, const char **argv) { struct option options[] = { diff --git a/sequencer.c b/sequencer.c index f0f1af4d47..f51d403b7d 100644 --- a/sequencer.c +++ b/sequencer.c @@ -36,7 +36,6 @@ #include "rebase-interactive.h" #include "reset.h" #include "branch.h" -#include "log-tree.h" #define GIT_REFLOG_ACTION "GIT_REFLOG_ACTION" @@ -375,6 +374,7 @@ int sequencer_remove_state(struct replay_opts *opts) } free(opts->gpg_sign); + free(opts->reflog_action); free(opts->default_strategy); free(opts->strategy); for (i = 0; i < opts->xopts_nr; i++) @@ -1050,6 +1050,8 @@ static int run_git_commit(const char *defmsg, gpg_opt, gpg_opt); } + strvec_pushf(&cmd.env, GIT_REFLOG_ACTION "=%s", opts->reflog_message); + if (opts->committer_date_is_author_date) strvec_pushf(&cmd.env, "GIT_COMMITTER_DATE=%s", opts->ignore_date ? @@ -1589,8 +1591,8 @@ static int try_to_commit(struct repository *r, goto out; } - if (update_head_with_reflog(current_head, oid, - getenv("GIT_REFLOG_ACTION"), msg, &err)) { + if (update_head_with_reflog(current_head, oid, opts->reflog_message, + msg, &err)) { res = error("%s", err.buf); goto out; } @@ -3564,7 +3566,8 @@ static int do_exec(struct repository *r, const char *command_line) status = run_command(&cmd); /* force re-reading of the cache */ - if (discard_index(r->index) < 0 || repo_read_index(r) < 0) + discard_index(r->index); + if (repo_read_index(r) < 0) return error(_("could not read index")); dirty = require_clean_work_tree(r, "rebase", NULL, 1, 1); @@ -3672,17 +3675,28 @@ static int do_label(struct repository *r, const char *name, int len) return ret; } +static const char *sequencer_reflog_action(struct replay_opts *opts) +{ + if (!opts->reflog_action) { + opts->reflog_action = getenv(GIT_REFLOG_ACTION); + opts->reflog_action = + xstrdup(opts->reflog_action ? opts->reflog_action + : action_name(opts)); + } + + return opts->reflog_action; +} + __attribute__((format (printf, 3, 4))) static const char *reflog_message(struct replay_opts *opts, const char *sub_action, const char *fmt, ...) { va_list ap; static struct strbuf buf = STRBUF_INIT; - char *reflog_action = getenv(GIT_REFLOG_ACTION); va_start(ap, fmt); strbuf_reset(&buf); - strbuf_addstr(&buf, reflog_action ? reflog_action : action_name(opts)); + strbuf_addstr(&buf, sequencer_reflog_action(opts)); if (sub_action) strbuf_addf(&buf, " (%s)", sub_action); if (fmt) { @@ -3694,6 +3708,28 @@ static const char *reflog_message(struct replay_opts *opts, return buf.buf; } +static struct commit *lookup_label(struct repository *r, const char *label, + int len, struct strbuf *buf) +{ + struct commit *commit; + struct object_id oid; + + strbuf_reset(buf); + strbuf_addf(buf, "refs/rewritten/%.*s", len, label); + if (!read_ref(buf->buf, &oid)) { + commit = lookup_commit_object(r, &oid); + } else { + /* fall back to non-rewritten ref or commit */ + strbuf_splice(buf, 0, strlen("refs/rewritten/"), "", 0); + commit = lookup_commit_reference_by_name(buf->buf); + } + + if (!commit) + error(_("could not resolve '%s'"), buf->buf); + + return commit; +} + static int do_reset(struct repository *r, const char *name, int len, struct replay_opts *opts) @@ -3725,6 +3761,7 @@ static int do_reset(struct repository *r, oidcpy(&oid, &opts->squash_onto); } else { int i; + struct commit *commit; /* Determine the length of the label */ for (i = 0; i < len; i++) @@ -3732,12 +3769,12 @@ static int do_reset(struct repository *r, break; len = i; - strbuf_addf(&ref_name, "refs/rewritten/%.*s", len, name); - if (get_oid(ref_name.buf, &oid) && - get_oid(ref_name.buf + strlen("refs/rewritten/"), &oid)) { - ret = error(_("could not read '%s'"), ref_name.buf); + commit = lookup_label(r, name, len, &ref_name); + if (!commit) { + ret = -1; goto cleanup; } + oid = commit->object.oid; } setup_unpack_trees_porcelain(&unpack_tree_opts, "reset"); @@ -3748,6 +3785,7 @@ static int do_reset(struct repository *r, unpack_tree_opts.merge = 1; unpack_tree_opts.update = 1; unpack_tree_opts.preserve_ignored = 0; /* FIXME: !overwrite_ignore */ + unpack_tree_opts.skip_cache_tree_update = 1; init_checkout_metadata(&unpack_tree_opts.meta, name, &oid, NULL); if (repo_read_index_unmerged(r)) { @@ -3784,26 +3822,6 @@ cleanup: return ret; } -static struct commit *lookup_label(const char *label, int len, - struct strbuf *buf) -{ - struct commit *commit; - - strbuf_reset(buf); - strbuf_addf(buf, "refs/rewritten/%.*s", len, label); - commit = lookup_commit_reference_by_name(buf->buf); - if (!commit) { - /* fall back to non-rewritten ref or commit */ - strbuf_splice(buf, 0, strlen("refs/rewritten/"), "", 0); - commit = lookup_commit_reference_by_name(buf->buf); - } - - if (!commit) - error(_("could not resolve '%s'"), buf->buf); - - return commit; -} - static int do_merge(struct repository *r, struct commit *commit, const char *arg, int arg_len, @@ -3851,7 +3869,7 @@ static int do_merge(struct repository *r, k = strcspn(p, " \t\n"); if (!k) continue; - merge_commit = lookup_label(p, k, &ref_name); + merge_commit = lookup_label(r, p, k, &ref_name); if (!merge_commit) { ret = error(_("unable to parse '%.*s'"), k, p); goto leave_merge; @@ -4028,9 +4046,11 @@ static int do_merge(struct repository *r, ret = run_command(&cmd); /* force re-reading of the cache */ - if (!ret && (discard_index(r->index) < 0 || - repo_read_index(r) < 0)) - ret = error(_("could not read index")); + if (!ret) { + discard_index(r->index); + if (repo_read_index(r) < 0) + ret = error(_("could not read index")); + } goto leave_merge; } @@ -4128,11 +4148,14 @@ static int write_update_refs_state(struct string_list *refs_to_oids) struct string_list_item *item; char *path; - if (!refs_to_oids->nr) - return 0; - path = rebase_path_update_refs(the_repository->gitdir); + if (!refs_to_oids->nr) { + if (unlink(path) && errno != ENOENT) + result = error_errno(_("could not unlink: %s"), path); + goto cleanup; + } + if (safe_create_leading_directories(path)) { result = error(_("unable to create leading directories of %s"), path); @@ -4400,8 +4423,8 @@ void create_autostash(struct repository *r, const char *path) printf(_("Created autostash: %s\n"), buf.buf); if (reset_head(r, &ropts) < 0) die(_("could not reset --hard")); - if (discard_index(r->index) < 0 || - repo_read_index(r) < 0) + discard_index(r->index); + if (repo_read_index(r) < 0) die(_("could not read index")); } strbuf_release(&buf); @@ -4495,7 +4518,7 @@ static int checkout_onto(struct repository *r, struct replay_opts *opts, RESET_HEAD_RUN_POST_CHECKOUT_HOOK, .head_msg = reflog_message(opts, "start", "checkout %s", onto_name), - .default_reflog_action = "rebase" + .default_reflog_action = sequencer_reflog_action(opts) }; if (reset_head(r, &ropts)) { apply_autostash(rebase_path_autostash()); @@ -4564,11 +4587,8 @@ static int pick_commits(struct repository *r, struct replay_opts *opts) { int res = 0, reschedule = 0; - char *prev_reflog_action; - /* Note that 0 for 3rd parameter of setenv means set only if not set */ - setenv(GIT_REFLOG_ACTION, action_name(opts), 0); - prev_reflog_action = xstrdup(getenv(GIT_REFLOG_ACTION)); + opts->reflog_message = sequencer_reflog_action(opts); if (opts->allow_ff) assert(!(opts->signoff || opts->no_commit || opts->record_origin || should_edit(opts) || @@ -4616,14 +4636,12 @@ static int pick_commits(struct repository *r, } if (item->command <= TODO_SQUASH) { if (is_rebase_i(opts)) - setenv(GIT_REFLOG_ACTION, reflog_message(opts, - command_to_string(item->command), NULL), - 1); + opts->reflog_message = reflog_message(opts, + command_to_string(item->command), NULL); + res = do_pick_commit(r, item, opts, is_final_fixup(todo_list), &check_todo); - if (is_rebase_i(opts)) - setenv(GIT_REFLOG_ACTION, prev_reflog_action, 1); if (is_rebase_i(opts) && res < 0) { /* Reschedule */ advise(_(rescheduled_advice), @@ -5046,8 +5064,6 @@ int sequencer_continue(struct repository *r, struct replay_opts *opts) if (read_populate_opts(opts)) return -1; if (is_rebase_i(opts)) { - char *previous_reflog_action; - if ((res = read_populate_todo(r, &todo_list, opts))) goto release_todo_list; @@ -5058,13 +5074,11 @@ int sequencer_continue(struct repository *r, struct replay_opts *opts) unlink(rebase_path_dropped()); } - previous_reflog_action = xstrdup(getenv(GIT_REFLOG_ACTION)); - setenv(GIT_REFLOG_ACTION, reflog_message(opts, "continue", NULL), 1); + opts->reflog_message = reflog_message(opts, "continue", NULL); if (commit_staged_changes(r, opts, &todo_list)) { res = -1; goto release_todo_list; } - setenv(GIT_REFLOG_ACTION, previous_reflog_action, 1); } else if (!file_exists(get_todo_path(opts))) return continue_single_pick(r, opts); else if ((res = read_populate_todo(r, &todo_list, opts))) @@ -5112,7 +5126,7 @@ static int single_pick(struct repository *r, TODO_PICK : TODO_REVERT; item.commit = cmit; - setenv(GIT_REFLOG_ACTION, action_name(opts), 0); + opts->reflog_message = sequencer_reflog_action(opts); return do_pick_commit(r, &item, opts, 0, &check_todo); } diff --git a/sequencer.h b/sequencer.h index 563fe59933..888c18aad7 100644 --- a/sequencer.h +++ b/sequencer.h @@ -63,6 +63,9 @@ struct replay_opts { char **xopts; size_t xopts_nr, xopts_alloc; + /* Reflog */ + char *reflog_action; + /* Used by fixup/squash */ struct strbuf current_fixups; int current_fixup_count; @@ -73,6 +76,9 @@ struct replay_opts { /* Only used by REPLAY_NONE */ struct rev_info *revs; + + /* Private use */ + const char *reflog_message; }; #define REPLAY_OPTS_INIT { .edit = -1, .action = -1, .current_fixups = STRBUF_INIT } diff --git a/sha1dc_git.h b/sha1dc_git.h index 41e1c3fd3f..60e3ce8439 100644 --- a/sha1dc_git.h +++ b/sha1dc_git.h @@ -17,6 +17,7 @@ void git_SHA1DCInit(SHA1_CTX *); void git_SHA1DCFinal(unsigned char [20], SHA1_CTX *); void git_SHA1DCUpdate(SHA1_CTX *ctx, const void *data, unsigned long len); +#define platform_SHA_IS_SHA1DC /* used by "test-tool sha1-is-sha1dc" */ #define platform_SHA_CTX SHA1_CTX #define platform_SHA1_Init git_SHA1DCInit #define platform_SHA1_Update git_SHA1DCUpdate diff --git a/shared.mak b/shared.mak index 33f43edbf9..aeb80fc4d5 100644 --- a/shared.mak +++ b/shared.mak @@ -37,13 +37,13 @@ space := $(empty) $(empty) QUIET_SUBDIR0 = +$(MAKE) -C # space to separate -C and subdir QUIET_SUBDIR1 = -ifneq ($(findstring w,$(MAKEFLAGS)),w) +ifneq ($(findstring w,$(firstword -$(MAKEFLAGS))),w) PRINT_DIR = --no-print-directory else # "make -w" NO_SUBDIR = : endif -ifneq ($(findstring s,$(MAKEFLAGS)),s) +ifneq ($(findstring s,$(firstword -$(MAKEFLAGS))),s) ifndef V ## common QUIET_SUBDIR0 = +@subdir= @@ -60,6 +60,7 @@ ifndef V QUIET_AR = @echo ' ' AR $@; QUIET_LINK = @echo ' ' LINK $@; QUIET_BUILT_IN = @echo ' ' BUILTIN $@; + QUIET_CP = @echo ' ' CP $< $@; QUIET_LNCP = @echo ' ' LN/CP $@; QUIET_XGETTEXT = @echo ' ' XGETTEXT $@; QUIET_MSGINIT = @echo ' ' MSGINIT $@; @@ -69,8 +70,11 @@ ifndef V QUIET_SP = @echo ' ' SP $<; QUIET_HDR = @echo ' ' HDR $(<:hcc=h); QUIET_RC = @echo ' ' RC $@; - QUIET_SPATCH = @echo ' ' SPATCH $<; - QUIET_SPATCH_T = @echo ' ' SPATCH TEST $(@:.build/%=%); + +## Used in "Makefile": SPATCH + QUIET_SPATCH = @echo ' ' SPATCH $< \>$@; + QUIET_SPATCH_TEST = @echo ' ' SPATCH TEST $(@:.build/%=%); + QUIET_SPATCH_CAT = @echo ' ' SPATCH CAT $(@:%.patch=%.d/)\*\*.patch \>$@; ## Used in "Documentation/Makefile" QUIET_ASCIIDOC = @echo ' ' ASCIIDOC $@; diff --git a/sparse-index.c b/sparse-index.c index e4a54ce194..8c269dab80 100644 --- a/sparse-index.c +++ b/sparse-index.c @@ -493,24 +493,42 @@ void clear_skip_worktree_from_present_files(struct index_state *istate) int dir_found = 1; int i; + int path_count[2] = {0, 0}; + int restarted = 0; if (!core_apply_sparse_checkout || sparse_expect_files_outside_of_patterns) return; + trace2_region_enter("index", "clear_skip_worktree_from_present_files", + istate->repo); restart: for (i = 0; i < istate->cache_nr; i++) { struct cache_entry *ce = istate->cache[i]; - if (ce_skip_worktree(ce) && - path_found(ce->name, &last_dirname, &dir_len, &dir_found)) { - if (S_ISSPARSEDIR(ce->ce_mode)) { - ensure_full_index(istate); - goto restart; + if (ce_skip_worktree(ce)) { + path_count[restarted]++; + if (path_found(ce->name, &last_dirname, &dir_len, &dir_found)) { + if (S_ISSPARSEDIR(ce->ce_mode)) { + if (restarted) + BUG("ensure-full-index did not fully flatten?"); + ensure_full_index(istate); + restarted = 1; + goto restart; + } + ce->ce_flags &= ~CE_SKIP_WORKTREE; } - ce->ce_flags &= ~CE_SKIP_WORKTREE; } } + + if (path_count[0]) + trace2_data_intmax("index", istate->repo, + "sparse_path_count", path_count[0]); + if (restarted) + trace2_data_intmax("index", istate->repo, + "sparse_path_count_full", path_count[1]); + trace2_region_leave("index", "clear_skip_worktree_from_present_files", + istate->repo); } /* diff --git a/submodule.c b/submodule.c index b958162d28..fae24ef34a 100644 --- a/submodule.c +++ b/submodule.c @@ -832,7 +832,7 @@ static void changed_submodule_data_clear(struct changed_submodule_data *cs_data) } static void collect_changed_submodules_cb(struct diff_queue_struct *q, - struct diff_options *options, + struct diff_options *options UNUSED, void *data) { struct collect_changed_submodules_cb_data *me = data; @@ -1130,6 +1130,12 @@ static int push_submodule(const char *path, if (for_each_remote_ref_submodule(path, has_remote, NULL) > 0) { struct child_process cp = CHILD_PROCESS_INIT; strvec_push(&cp.args, "push"); + /* + * When recursing into a submodule, treat any "only" configurations as "on- + * demand", since "only" would not work (we need all submodules to be pushed + * in order to be able to push the superproject). + */ + strvec_push(&cp.args, "--recurse-submodules=only-is-on-demand"); if (dry_run) strvec_push(&cp.args, "--dry-run"); @@ -2139,8 +2145,7 @@ int submodule_move_head(const char *path, if (!(flags & SUBMODULE_MOVE_HEAD_DRY_RUN)) { if (old_head) { if (!submodule_uses_gitfile(path)) - absorb_git_dir_into_superproject(path, - ABSORB_GITDIR_RECURSE_SUBMODULES); + absorb_git_dir_into_superproject(path); } else { struct strbuf gitdir = STRBUF_INIT; submodule_name_to_gitdir(&gitdir, the_repository, @@ -2310,13 +2315,29 @@ static void relocate_single_git_dir_into_superproject(const char *path) strbuf_release(&new_gitdir); } +static void absorb_git_dir_into_superproject_recurse(const char *path) +{ + + struct child_process cp = CHILD_PROCESS_INIT; + + cp.dir = path; + cp.git_cmd = 1; + cp.no_stdin = 1; + strvec_pushf(&cp.args, "--super-prefix=%s%s/", + get_super_prefix_or_empty(), path); + strvec_pushl(&cp.args, "submodule--helper", + "absorbgitdirs", NULL); + prepare_submodule_repo_env(&cp.env); + if (run_command(&cp)) + die(_("could not recurse into submodule '%s'"), path); +} + /* * Migrate the git directory of the submodule given by path from * having its git directory within the working tree to the git dir nested * in its superprojects git dir under modules/. */ -void absorb_git_dir_into_superproject(const char *path, - unsigned flags) +void absorb_git_dir_into_superproject(const char *path) { int err_code; const char *sub_git_dir; @@ -2365,23 +2386,7 @@ void absorb_git_dir_into_superproject(const char *path, } strbuf_release(&gitdir); - if (flags & ABSORB_GITDIR_RECURSE_SUBMODULES) { - struct child_process cp = CHILD_PROCESS_INIT; - - if (flags & ~ABSORB_GITDIR_RECURSE_SUBMODULES) - BUG("we don't know how to pass the flags down?"); - - cp.dir = path; - cp.git_cmd = 1; - cp.no_stdin = 1; - strvec_pushf(&cp.args, "--super-prefix=%s%s/", - get_super_prefix_or_empty(), path); - strvec_pushl(&cp.args, "submodule--helper", - "absorbgitdirs", NULL); - prepare_submodule_repo_env(&cp.env); - if (run_command(&cp)) - die(_("could not recurse into submodule '%s'"), path); - } + absorb_git_dir_into_superproject_recurse(path); } int get_superproject_working_tree(struct strbuf *buf) diff --git a/submodule.h b/submodule.h index 6a9fec6de1..b52a4ff1e7 100644 --- a/submodule.h +++ b/submodule.h @@ -164,9 +164,7 @@ void submodule_unset_core_worktree(const struct submodule *sub); */ void prepare_submodule_repo_env(struct strvec *env); -#define ABSORB_GITDIR_RECURSE_SUBMODULES (1<<0) -void absorb_git_dir_into_superproject(const char *path, - unsigned flags); +void absorb_git_dir_into_superproject(const char *path); /* * Return the absolute path of the working tree of the superproject, which this diff --git a/t/Makefile b/t/Makefile index 882782a519..2c2b252240 100644 --- a/t/Makefile +++ b/t/Makefile @@ -94,7 +94,7 @@ check-chainlint: done \ } >'$(CHAINLINTTMP_SQ)'/expect && \ $(CHAINLINT) --emit-all '$(CHAINLINTTMP_SQ)'/tests | \ - grep -v '^[ ]*$$' >'$(CHAINLINTTMP_SQ)'/actual && \ + sed -e 's/^[1-9][0-9]* //;/^[ ]*$$/d' >'$(CHAINLINTTMP_SQ)'/actual && \ if test -f ../GIT-BUILD-OPTIONS; then \ . ../GIT-BUILD-OPTIONS; \ fi && \ diff --git a/t/chainlint.pl b/t/chainlint.pl index 976db4b8a0..e966412999 100755 --- a/t/chainlint.pl +++ b/t/chainlint.pl @@ -67,6 +67,7 @@ sub new { bless { parser => $parser, buff => $s, + lineno => 1, heretags => [] } => $class; } @@ -75,7 +76,9 @@ sub scan_heredoc_tag { my $self = shift @_; ${$self->{buff}} =~ /\G(-?)/gc; my $indented = $1; - my $tag = $self->scan_token(); + my $token = $self->scan_token(); + return "<<$indented" unless $token; + my $tag = $token->[0]; $tag =~ s/['"\\]//g; push(@{$self->{heretags}}, $indented ? "\t$tag" : "$tag"); return "<<$indented$tag"; @@ -95,7 +98,9 @@ sub scan_op { sub scan_sqstring { my $self = shift @_; ${$self->{buff}} =~ /\G([^']*'|.*\z)/sgc; - return "'" . $1; + my $s = $1; + $self->{lineno} += () = $s =~ /\n/sg; + return "'" . $s; } sub scan_dqstring { @@ -113,7 +118,7 @@ sub scan_dqstring { if ($c eq '\\') { $s .= '\\', last unless $$b =~ /\G(.)/sgc; $c = $1; - next if $c eq "\n"; # line splice + $self->{lineno}++, next if $c eq "\n"; # line splice # backslash escapes only $, `, ", \ in dq-string $s .= '\\' unless $c =~ /^[\$`"\\]$/; $s .= $c; @@ -121,6 +126,7 @@ sub scan_dqstring { } die("internal error scanning dq-string '$c'\n"); } + $self->{lineno} += () = $s =~ /\n/sg; return $s; } @@ -135,6 +141,7 @@ sub scan_balanced { $depth--; last if $depth == 0; } + $self->{lineno} += () = $s =~ /\n/sg; return $s; } @@ -149,7 +156,7 @@ sub scan_dollar { my $self = shift @_; my $b = $self->{buff}; return $self->scan_balanced('(', ')') if $$b =~ /\G\((?=\()/gc; # $((...)) - return '(' . join(' ', $self->scan_subst()) . ')' if $$b =~ /\G\(/gc; # $(...) + return '(' . join(' ', map {$_->[0]} $self->scan_subst()) . ')' if $$b =~ /\G\(/gc; # $(...) return $self->scan_balanced('{', '}') if $$b =~ /\G\{/gc; # ${...} return $1 if $$b =~ /\G(\w+)/gc; # $var return $1 if $$b =~ /\G([@*#?$!0-9-])/gc; # $*, $1, $$, etc. @@ -161,8 +168,11 @@ sub swallow_heredocs { my $b = $self->{buff}; my $tags = $self->{heretags}; while (my $tag = shift @$tags) { + my $start = pos($$b); my $indent = $tag =~ s/^\t// ? '\\s*' : ''; $$b =~ /(?:\G|\n)$indent\Q$tag\E(?:\n|\z)/gc; + my $body = substr($$b, $start, pos($$b) - $start); + $self->{lineno} += () = $body =~ /\n/sg; } } @@ -170,34 +180,37 @@ sub scan_token { my $self = shift @_; my $b = $self->{buff}; my $token = ''; + my ($start, $startln); RESTART: + $startln = $self->{lineno}; $$b =~ /\G[ \t]+/gc; # skip whitespace (but not newline) - return "\n" if $$b =~ /\G#[^\n]*(?:\n|\z)/gc; # comment + $start = pos($$b) || 0; + $self->{lineno}++, return ["\n", $start, pos($$b), $startln, $startln] if $$b =~ /\G#[^\n]*(?:\n|\z)/gc; # comment while (1) { # slurp up non-special characters $token .= $1 if $$b =~ /\G([^\\;&|<>(){}'"\$\s]+)/gc; # handle special characters last unless $$b =~ /\G(.)/sgc; my $c = $1; - last if $c =~ /^[ \t]$/; # whitespace ends token + pos($$b)--, last if $c =~ /^[ \t]$/; # whitespace ends token pos($$b)--, last if length($token) && $c =~ /^[;&|<>(){}\n]$/; $token .= $self->scan_sqstring(), next if $c eq "'"; $token .= $self->scan_dqstring(), next if $c eq '"'; $token .= $c . $self->scan_dollar(), next if $c eq '$'; - $self->swallow_heredocs(), $token = $c, last if $c eq "\n"; + $self->{lineno}++, $self->swallow_heredocs(), $token = $c, last if $c eq "\n"; $token = $self->scan_op($c), last if $c =~ /^[;&|<>]$/; $token = $c, last if $c =~ /^[(){}]$/; if ($c eq '\\') { $token .= '\\', last unless $$b =~ /\G(.)/sgc; $c = $1; - next if $c eq "\n" && length($token); # line splice - goto RESTART if $c eq "\n"; # line splice + $self->{lineno}++, next if $c eq "\n" && length($token); # line splice + $self->{lineno}++, goto RESTART if $c eq "\n"; # line splice $token .= '\\' . $c; next; } die("internal error scanning character '$c'\n"); } - return length($token) ? $token : undef; + return length($token) ? [$token, $start, pos($$b), $startln, $self->{lineno}] : undef; } # ShellParser parses POSIX shell scripts (with minor extensions for Bash). It @@ -239,14 +252,14 @@ sub stop_at { my ($self, $token) = @_; return 1 unless defined($token); my $stop = ${$self->{stop}}[-1] if @{$self->{stop}}; - return defined($stop) && $token =~ $stop; + return defined($stop) && $token->[0] =~ $stop; } sub expect { my ($self, $expect) = @_; my $token = $self->next_token(); - return $token if defined($token) && $token eq $expect; - push(@{$self->{output}}, "?!ERR?! expected '$expect' but found '" . (defined($token) ? $token : "<end-of-input>") . "'\n"); + return $token if defined($token) && $token->[0] eq $expect; + push(@{$self->{output}}, "?!ERR?! expected '$expect' but found '" . (defined($token) ? $token->[0] : "<end-of-input>") . "'\n"); $self->untoken($token) if defined($token); return (); } @@ -255,7 +268,7 @@ sub optional_newlines { my $self = shift @_; my @tokens; while (my $token = $self->peek()) { - last unless $token eq "\n"; + last unless $token->[0] eq "\n"; push(@tokens, $self->next_token()); } return @tokens; @@ -278,7 +291,7 @@ sub parse_case_pattern { my @tokens; while (defined(my $token = $self->next_token())) { push(@tokens, $token); - last if $token eq ')'; + last if $token->[0] eq ')'; } return @tokens; } @@ -293,13 +306,13 @@ sub parse_case { $self->optional_newlines()); while (1) { my $token = $self->peek(); - last unless defined($token) && $token ne 'esac'; + last unless defined($token) && $token->[0] ne 'esac'; push(@tokens, $self->parse_case_pattern(), $self->optional_newlines(), $self->parse(qr/^(?:;;|esac)$/)); # item body $token = $self->peek(); - last unless defined($token) && $token ne 'esac'; + last unless defined($token) && $token->[0] ne 'esac'; push(@tokens, $self->expect(';;'), $self->optional_newlines()); @@ -315,7 +328,7 @@ sub parse_for { $self->next_token(), # variable $self->optional_newlines()); my $token = $self->peek(); - if (defined($token) && $token eq 'in') { + if (defined($token) && $token->[0] eq 'in') { push(@tokens, $self->expect('in'), $self->optional_newlines()); @@ -339,11 +352,11 @@ sub parse_if { $self->optional_newlines(), $self->parse(qr/^(?:elif|else|fi)$/)); # if/elif body my $token = $self->peek(); - last unless defined($token) && $token eq 'elif'; + last unless defined($token) && $token->[0] eq 'elif'; push(@tokens, $self->expect('elif')); } my $token = $self->peek(); - if (defined($token) && $token eq 'else') { + if (defined($token) && $token->[0] eq 'else') { push(@tokens, $self->expect('else'), $self->optional_newlines(), @@ -380,7 +393,7 @@ sub parse_bash_array_assignment { my @tokens = $self->expect('('); while (defined(my $token = $self->next_token())) { push(@tokens, $token); - last if $token eq ')'; + last if $token->[0] eq ')'; } return @tokens; } @@ -398,29 +411,31 @@ sub parse_cmd { my $self = shift @_; my $cmd = $self->next_token(); return () unless defined($cmd); - return $cmd if $cmd eq "\n"; + return $cmd if $cmd->[0] eq "\n"; my $token; my @tokens = $cmd; - if ($cmd eq '!') { + if ($cmd->[0] eq '!') { push(@tokens, $self->parse_cmd()); return @tokens; - } elsif (my $f = $compound{$cmd}) { + } elsif (my $f = $compound{$cmd->[0]}) { push(@tokens, $self->$f()); - } elsif (defined($token = $self->peek()) && $token eq '(') { - if ($cmd !~ /\w=$/) { + } elsif (defined($token = $self->peek()) && $token->[0] eq '(') { + if ($cmd->[0] !~ /\w=$/) { push(@tokens, $self->parse_func()); return @tokens; } - $tokens[-1] .= join(' ', $self->parse_bash_array_assignment()); + my @array = $self->parse_bash_array_assignment(); + $tokens[-1]->[0] .= join(' ', map {$_->[0]} @array); + $tokens[-1]->[2] = $array[$#array][2] if @array; } while (defined(my $token = $self->next_token())) { $self->untoken($token), last if $self->stop_at($token); push(@tokens, $token); - last if $token =~ /^(?:[;&\n|]|&&|\|\|)$/; + last if $token->[0] =~ /^(?:[;&\n|]|&&|\|\|)$/; } - push(@tokens, $self->next_token()) if $tokens[-1] ne "\n" && defined($token = $self->peek()) && $token eq "\n"; + push(@tokens, $self->next_token()) if $tokens[-1]->[0] ne "\n" && defined($token = $self->peek()) && $token->[0] eq "\n"; return @tokens; } @@ -453,11 +468,18 @@ package TestParser; use base 'ShellParser'; +sub new { + my $class = shift @_; + my $self = $class->SUPER::new(@_); + $self->{problems} = []; + return $self; +} + sub find_non_nl { my $tokens = shift @_; my $n = shift @_; $n = $#$tokens if !defined($n); - $n-- while $n >= 0 && $$tokens[$n] eq "\n"; + $n-- while $n >= 0 && $$tokens[$n]->[0] eq "\n"; return $n; } @@ -467,7 +489,7 @@ sub ends_with { for my $needle (reverse(@$needles)) { return undef if $n < 0; $n = find_non_nl($tokens, $n), next if $needle eq "\n"; - return undef if $$tokens[$n] !~ $needle; + return undef if $$tokens[$n]->[0] !~ $needle; $n--; } return 1; @@ -486,13 +508,13 @@ sub parse_loop_body { my $self = shift @_; my @tokens = $self->SUPER::parse_loop_body(@_); # did loop signal failure via "|| return" or "|| exit"? - return @tokens if !@tokens || grep(/^(?:return|exit|\$\?)$/, @tokens); + return @tokens if !@tokens || grep {$_->[0] =~ /^(?:return|exit|\$\?)$/} @tokens; # did loop upstream of a pipe signal failure via "|| echo 'impossible # text'" as the final command in the loop body? return @tokens if ends_with(\@tokens, [qr/^\|\|$/, "\n", qr/^echo$/, qr/^.+$/]); # flag missing "return/exit" handling explicit failure in loop body my $n = find_non_nl(\@tokens); - splice(@tokens, $n + 1, 0, '?!LOOP?!'); + push(@{$self->{problems}}, ['LOOP', $tokens[$n]]); return @tokens; } @@ -505,8 +527,13 @@ my @safe_endings = ( sub accumulate { my ($self, $tokens, $cmd) = @_; + my $problems = $self->{problems}; + + # no previous command to check for missing "&&" goto DONE unless @$tokens; - goto DONE if @$cmd == 1 && $$cmd[0] eq "\n"; + + # new command is empty line; can't yet check if previous is missing "&&" + goto DONE if @$cmd == 1 && $$cmd[0]->[0] eq "\n"; # did previous command end with "&&", "|", "|| return" or similar? goto DONE if match_ending($tokens, \@safe_endings); @@ -514,20 +541,20 @@ sub accumulate { # if this command handles "$?" specially, then okay for previous # command to be missing "&&" for my $token (@$cmd) { - goto DONE if $token =~ /\$\?/; + goto DONE if $token->[0] =~ /\$\?/; } # if this command is "false", "return 1", or "exit 1" (which signal # failure explicitly), then okay for all preceding commands to be # missing "&&" - if ($$cmd[0] =~ /^(?:false|return|exit)$/) { - @$tokens = grep(!/^\?!AMP\?!$/, @$tokens); + if ($$cmd[0]->[0] =~ /^(?:false|return|exit)$/) { + @$problems = grep {$_->[0] ne 'AMP'} @$problems; goto DONE; } # flag missing "&&" at end of previous command my $n = find_non_nl($tokens); - splice(@$tokens, $n + 1, 0, '?!AMP?!') unless $n < 0; + push(@$problems, ['AMP', $tokens->[$n]]) unless $n < 0; DONE: $self->SUPER::accumulate($tokens, $cmd); @@ -553,7 +580,7 @@ sub new { # composition of multiple strings and non-string character runs; for instance, # `"test body"` unwraps to `test body`; `word"a b"42'c d'` to `worda b42c d` sub unwrap { - my $token = @_ ? shift @_ : $_; + my $token = (@_ ? shift @_ : $_)->[0]; # simple case: 'sqstring' or "dqstring" return $token if $token =~ s/^'([^']*)'$/$1/; return $token if $token =~ s/^"([^"]*)"$/$1/; @@ -584,13 +611,25 @@ sub check_test { $self->{ntests}++; my $parser = TestParser->new(\$body); my @tokens = $parser->parse(); - return unless $emit_all || grep(/\?![^?]+\?!/, @tokens); + my $problems = $parser->{problems}; + return unless $emit_all || @$problems; my $c = main::fd_colors(1); - my $checked = join(' ', @tokens); - $checked =~ s/^\n//; - $checked =~ s/^ //mg; - $checked =~ s/ $//mg; + my $lineno = $_[1]->[3]; + my $start = 0; + my $checked = ''; + for (sort {$a->[1]->[2] <=> $b->[1]->[2]} @$problems) { + my ($label, $token) = @$_; + my $pos = $token->[2]; + $checked .= substr($body, $start, $pos - $start) . " ?!$label?! "; + $start = $pos; + } + $checked .= substr($body, $start); + $checked =~ s/^/$lineno++ . ' '/mge; + $checked =~ s/^\d+ \n//; + $checked =~ s/(\s) \?!/$1?!/mg; + $checked =~ s/\?! (\s)/?!$1/mg; $checked =~ s/(\?![^?]+\?!)/$c->{rev}$c->{red}$1$c->{reset}/mg; + $checked =~ s/^\d+/$c->{dim}$&$c->{reset}/mg; $checked .= "\n" unless $checked =~ /\n$/; push(@{$self->{output}}, "$c->{blue}# chainlint: $title$c->{reset}\n$checked"); } @@ -598,9 +637,9 @@ sub check_test { sub parse_cmd { my $self = shift @_; my @tokens = $self->SUPER::parse_cmd(); - return @tokens unless @tokens && $tokens[0] =~ /^test_expect_(?:success|failure)$/; + return @tokens unless @tokens && $tokens[0]->[0] =~ /^test_expect_(?:success|failure)$/; my $n = $#tokens; - $n-- while $n >= 0 && $tokens[$n] =~ /^(?:[;&\n|]|&&|\|\|)$/; + $n-- while $n >= 0 && $tokens[$n]->[0] =~ /^(?:[;&\n|]|&&|\|\|)$/; $self->check_test($tokens[1], $tokens[2]) if $n == 2; # title body $self->check_test($tokens[2], $tokens[3]) if $n > 2; # prereq title body return @tokens; @@ -622,25 +661,39 @@ if (eval {require Time::HiRes; Time::HiRes->import(); 1;}) { # thread and ignore %ENV changes in subthreads. $ENV{TERM} = $ENV{USER_TERM} if $ENV{USER_TERM}; -my @NOCOLORS = (bold => '', rev => '', reset => '', blue => '', green => '', red => ''); +my @NOCOLORS = (bold => '', rev => '', dim => '', reset => '', blue => '', green => '', red => ''); my %COLORS = (); sub get_colors { return \%COLORS if %COLORS; - if (exists($ENV{NO_COLOR}) || - system("tput sgr0 >/dev/null 2>&1") != 0 || - system("tput bold >/dev/null 2>&1") != 0 || - system("tput rev >/dev/null 2>&1") != 0 || - system("tput setaf 1 >/dev/null 2>&1") != 0) { + if (exists($ENV{NO_COLOR})) { %COLORS = @NOCOLORS; return \%COLORS; } - %COLORS = (bold => `tput bold`, - rev => `tput rev`, - reset => `tput sgr0`, - blue => `tput setaf 4`, - green => `tput setaf 2`, - red => `tput setaf 1`); - chomp(%COLORS); + if ($ENV{TERM} =~ /xterm|xterm-\d+color|xterm-new|xterm-direct|nsterm|nsterm-\d+color|nsterm-direct/) { + %COLORS = (bold => "\e[1m", + rev => "\e[7m", + dim => "\e[2m", + reset => "\e[0m", + blue => "\e[34m", + green => "\e[32m", + red => "\e[31m"); + return \%COLORS; + } + if (system("tput sgr0 >/dev/null 2>&1") == 0 && + system("tput bold >/dev/null 2>&1") == 0 && + system("tput rev >/dev/null 2>&1") == 0 && + system("tput dim >/dev/null 2>&1") == 0 && + system("tput setaf 1 >/dev/null 2>&1") == 0) { + %COLORS = (bold => `tput bold`, + rev => `tput rev`, + dim => `tput dim`, + reset => `tput sgr0`, + blue => `tput setaf 4`, + green => `tput setaf 2`, + red => `tput setaf 1`); + return \%COLORS; + } + %COLORS = @NOCOLORS; return \%COLORS; } @@ -656,7 +709,7 @@ sub ncores { # Windows return $ENV{NUMBER_OF_PROCESSORS} if exists($ENV{NUMBER_OF_PROCESSORS}); # Linux / MSYS2 / Cygwin / WSL - do { local @ARGV='/proc/cpuinfo'; return scalar(grep(/^processor\s*:/, <>)); } if -r '/proc/cpuinfo'; + do { local @ARGV='/proc/cpuinfo'; return scalar(grep(/^processor[\s\d]*:/, <>)); } if -r '/proc/cpuinfo'; # macOS & BSD return qx/sysctl -n hw.ncpu/ if $^O =~ /(?:^darwin$|bsd)/; return 1; diff --git a/t/chainlint/block-comment.expect b/t/chainlint/block-comment.expect index d10b2eeaf2..df2beea888 100644 --- a/t/chainlint/block-comment.expect +++ b/t/chainlint/block-comment.expect @@ -1,6 +1,8 @@ ( { + # show a echo a && + # show b echo b } ) diff --git a/t/chainlint/case-comment.expect b/t/chainlint/case-comment.expect index 1e4b054bda..641c157b98 100644 --- a/t/chainlint/case-comment.expect +++ b/t/chainlint/case-comment.expect @@ -1,7 +1,10 @@ ( case "$x" in + # found foo x) foo ;; + # found other *) + # treat it as bar bar ;; esac diff --git a/t/chainlint/close-subshell.expect b/t/chainlint/close-subshell.expect index 0f87db9ae6..2192a2870a 100644 --- a/t/chainlint/close-subshell.expect +++ b/t/chainlint/close-subshell.expect @@ -15,7 +15,8 @@ ) | wuzzle && ( bop -) | fazz fozz && +) | fazz \ + fozz && ( bup ) | diff --git a/t/chainlint/comment.expect b/t/chainlint/comment.expect index f76fde1ffb..a68f1f9d7c 100644 --- a/t/chainlint/comment.expect +++ b/t/chainlint/comment.expect @@ -1,4 +1,8 @@ ( + # comment 1 nothing && + # comment 2 something + # comment 3 + # comment 4 ) diff --git a/t/chainlint/double-here-doc.expect b/t/chainlint/double-here-doc.expect index 75477bb1ad..cd584a4357 100644 --- a/t/chainlint/double-here-doc.expect +++ b/t/chainlint/double-here-doc.expect @@ -1,2 +1,12 @@ -run_sub_test_lib_test_err run-inv-range-start "--run invalid range start" --run="a-5" <<-EOF && -check_sub_test_lib_test_err run-inv-range-start <<-EOF_OUT 3 <<-EOF_ERR +run_sub_test_lib_test_err run-inv-range-start \ + "--run invalid range start" \ + --run="a-5" <<-\EOF && +test_expect_success "passing test #1" "true" +test_done +EOF +check_sub_test_lib_test_err run-inv-range-start \ + <<-\EOF_OUT 3<<-EOF_ERR +> FATAL: Unexpected exit with code 1 +EOF_OUT +> error: --run: invalid non-numeric in range start: ${SQ}a-5${SQ} +EOF_ERR diff --git a/t/chainlint/empty-here-doc.expect b/t/chainlint/empty-here-doc.expect index f42f2d41ba..e8733c97c6 100644 --- a/t/chainlint/empty-here-doc.expect +++ b/t/chainlint/empty-here-doc.expect @@ -1,3 +1,4 @@ git ls-tree $tree path > current && -cat > expected <<EOF && +cat > expected <<\EOF && +EOF test_output diff --git a/t/chainlint/for-loop.expect b/t/chainlint/for-loop.expect index a5810c9bdd..d65c82129a 100644 --- a/t/chainlint/for-loop.expect +++ b/t/chainlint/for-loop.expect @@ -2,7 +2,9 @@ for i in a b c do echo $i ?!AMP?! - cat <<-EOF ?!LOOP?! + cat <<-\EOF ?!LOOP?! + bar + EOF done ?!AMP?! for i in a b c; do echo $i && diff --git a/t/chainlint/here-doc-close-subshell.expect b/t/chainlint/here-doc-close-subshell.expect index 2af9ced71c..7d9c2b5607 100644 --- a/t/chainlint/here-doc-close-subshell.expect +++ b/t/chainlint/here-doc-close-subshell.expect @@ -1,2 +1,4 @@ ( - cat <<-INPUT) + cat <<-\INPUT) + fizz + INPUT diff --git a/t/chainlint/here-doc-indent-operator.expect b/t/chainlint/here-doc-indent-operator.expect index fb6cf7285d..f92a7ce999 100644 --- a/t/chainlint/here-doc-indent-operator.expect +++ b/t/chainlint/here-doc-indent-operator.expect @@ -1,5 +1,11 @@ -cat > expect <<-EOF && +cat >expect <<- EOF && +header: 43475048 1 $(test_oid oid_version) $NUM_CHUNKS 0 +num_commits: $1 +chunks: oid_fanout oid_lookup commit_metadata generation_data bloom_indexes bloom_data +EOF -cat > expect <<-EOF ?!AMP?! +cat >expect << -EOF ?!AMP?! +this is not indented +-EOF cleanup diff --git a/t/chainlint/here-doc-multi-line-command-subst.expect b/t/chainlint/here-doc-multi-line-command-subst.expect index f8b3aa73c4..b7364c82c8 100644 --- a/t/chainlint/here-doc-multi-line-command-subst.expect +++ b/t/chainlint/here-doc-multi-line-command-subst.expect @@ -1,5 +1,8 @@ ( - x=$(bobble <<-END && + x=$(bobble <<-\END && + fossil + vegetable + END wiffle) ?!AMP?! echo $x ) diff --git a/t/chainlint/here-doc-multi-line-string.expect b/t/chainlint/here-doc-multi-line-string.expect index be64b26869..6c13bdcbfb 100644 --- a/t/chainlint/here-doc-multi-line-string.expect +++ b/t/chainlint/here-doc-multi-line-string.expect @@ -1,5 +1,7 @@ ( - cat <<-TXT && echo "multi-line + cat <<-\TXT && echo "multi-line string" ?!AMP?! + fizzle + TXT bap ) diff --git a/t/chainlint/here-doc.expect b/t/chainlint/here-doc.expect index 110059ba58..1df3f78282 100644 --- a/t/chainlint/here-doc.expect +++ b/t/chainlint/here-doc.expect @@ -1,7 +1,25 @@ -boodle wobba gorgo snoot wafta snurb <<EOF && +boodle wobba \ + gorgo snoot \ + wafta snurb <<EOF && +quoth the raven, +nevermore... +EOF cat <<-Arbitrary_Tag_42 >foo && +snoz +boz +woz +Arbitrary_Tag_42 -cat <<zump >boo && +cat <<"zump" >boo && +snoz +boz +woz +zump -horticulture <<EOF +horticulture <<\EOF +gomez +morticia +wednesday +pugsly +EOF diff --git a/t/chainlint/if-then-else.expect b/t/chainlint/if-then-else.expect index 44d86c3597..cbaaf857d4 100644 --- a/t/chainlint/if-then-else.expect +++ b/t/chainlint/if-then-else.expect @@ -8,7 +8,9 @@ echo foo else echo foo && - cat <<-EOF + cat <<-\EOF + bar + EOF fi ?!AMP?! echo poodle ) && diff --git a/t/chainlint/incomplete-line.expect b/t/chainlint/incomplete-line.expect index ffac8f9018..134d3a14f5 100644 --- a/t/chainlint/incomplete-line.expect +++ b/t/chainlint/incomplete-line.expect @@ -1,4 +1,10 @@ -line 1 line 2 line 3 line 4 && +line 1 \ +line 2 \ +line 3 \ +line 4 && ( - line 5 line 6 line 7 line 8 + line 5 \ + line 6 \ + line 7 \ + line 8 ) diff --git a/t/chainlint/inline-comment.expect b/t/chainlint/inline-comment.expect index dd0dace077..6bad218530 100644 --- a/t/chainlint/inline-comment.expect +++ b/t/chainlint/inline-comment.expect @@ -1,6 +1,6 @@ ( - foobar && - barfoo ?!AMP?! + foobar && # comment 1 + barfoo ?!AMP?! # wrong position for && flibble "not a # comment" ) && diff --git a/t/chainlint/loop-detect-status.expect b/t/chainlint/loop-detect-status.expect index 0ad23bb35e..24da9e86d5 100644 --- a/t/chainlint/loop-detect-status.expect +++ b/t/chainlint/loop-detect-status.expect @@ -2,7 +2,7 @@ do printf "Generating blob $i/$blobcount\r" >& 2 && printf "blob\nmark :$i\ndata $blobsize\n" && - + #test-tool genrandom $i $blobsize && printf "%-${blobsize}s" $i && echo "M 100644 :$i $i" >> commit && i=$(($i+1)) || diff --git a/t/chainlint/nested-here-doc.expect b/t/chainlint/nested-here-doc.expect index e3bef63f75..29b3832a98 100644 --- a/t/chainlint/nested-here-doc.expect +++ b/t/chainlint/nested-here-doc.expect @@ -1,7 +1,30 @@ cat <<ARBITRARY >foop && +naddle +fub <<EOF + nozzle + noodle +EOF +formp +ARBITRARY ( - cat <<-INPUT_END && - cat <<-EOT ?!AMP?! + cat <<-\INPUT_END && + fish are mice + but geese go slow + data <<EOF + perl is lerp + and nothing else + EOF + toink + INPUT_END + + cat <<-\EOT ?!AMP?! + text goes here + data <<EOF + data goes here + EOF + more test here + EOT + foobar ) diff --git a/t/chainlint/nested-subshell-comment.expect b/t/chainlint/nested-subshell-comment.expect index be4b27a305..9138cf386d 100644 --- a/t/chainlint/nested-subshell-comment.expect +++ b/t/chainlint/nested-subshell-comment.expect @@ -2,6 +2,8 @@ foo && ( bar && + # bottles wobble while fiddles gobble + # minor numbers of cows (or do they?) baz && snaff ) ?!AMP?! diff --git a/t/chainlint/subshell-here-doc.expect b/t/chainlint/subshell-here-doc.expect index 029d129299..52789278d1 100644 --- a/t/chainlint/subshell-here-doc.expect +++ b/t/chainlint/subshell-here-doc.expect @@ -1,10 +1,30 @@ ( - echo wobba gorgo snoot wafta snurb <<-EOF && + echo wobba \ + gorgo snoot \ + wafta snurb <<-EOF && + quoth the raven, + nevermore... + EOF + cat <<EOF >bip ?!AMP?! - echo <<-EOF >bop + fish fly high +EOF + + echo <<-\EOF >bop + gomez + morticia + wednesday + pugsly + EOF ) && ( - cat <<-ARBITRARY >bup && - cat <<-ARBITRARY3 >bup3 && + cat <<-\ARBITRARY >bup && + glink + FIZZ + ARBITRARY + cat <<-"ARBITRARY3" >bup3 && + glink + FIZZ + ARBITRARY3 meep ) diff --git a/t/chainlint/t7900-subtree.expect b/t/chainlint/t7900-subtree.expect index 69167da2f2..71b3b3bc20 100644 --- a/t/chainlint/t7900-subtree.expect +++ b/t/chainlint/t7900-subtree.expect @@ -4,12 +4,16 @@ sub2 sub3 sub4" && chks_sub=$(cat <<TXT | sed "s,^,sub dir/," +$chks +TXT ) && chkms="main-sub1 main-sub2 main-sub3 main-sub4" && chkms_sub=$(cat <<TXT | sed "s,^,sub dir/," +$chkms +TXT ) && subfiles=$(git ls-files) && check_equal "$subfiles" "$chkms diff --git a/t/chainlint/while-loop.expect b/t/chainlint/while-loop.expect index f272aa21fe..1f5eaea0fd 100644 --- a/t/chainlint/while-loop.expect +++ b/t/chainlint/while-loop.expect @@ -2,7 +2,9 @@ while true do echo foo ?!AMP?! - cat <<-EOF ?!LOOP?! + cat <<-\EOF ?!LOOP?! + bar + EOF done ?!AMP?! while true; do echo foo && diff --git a/t/helper/test-cache-tree.c b/t/helper/test-cache-tree.c new file mode 100644 index 0000000000..9159a17301 --- /dev/null +++ b/t/helper/test-cache-tree.c @@ -0,0 +1,65 @@ +#define USE_THE_INDEX_VARIABLE +#include "test-tool.h" +#include "cache.h" +#include "tree.h" +#include "cache-tree.h" +#include "parse-options.h" + +static char const * const test_cache_tree_usage[] = { + N_("test-tool cache-tree <options> (control|prime|update)"), + NULL +}; + +int cmd__cache_tree(int argc, const char **argv) +{ + struct object_id oid; + struct tree *tree; + int empty = 0; + int invalidate_qty = 0; + int i; + + struct option options[] = { + OPT_BOOL(0, "empty", &empty, + N_("clear the cache tree before each iteration")), + OPT_INTEGER_F(0, "invalidate", &invalidate_qty, + N_("number of entries in the cache tree to invalidate (default 0)"), + PARSE_OPT_NONEG), + OPT_END() + }; + + setup_git_directory(); + + argc = parse_options(argc, argv, NULL, options, test_cache_tree_usage, 0); + + if (repo_read_index(the_repository) < 0) + die(_("unable to read index file")); + + oidcpy(&oid, &the_index.cache_tree->oid); + tree = parse_tree_indirect(&oid); + if (!tree) + die(_("not a tree object: %s"), oid_to_hex(&oid)); + + if (empty) { + /* clear the cache tree & allocate a new one */ + cache_tree_free(&the_index.cache_tree); + the_index.cache_tree = cache_tree(); + } else if (invalidate_qty) { + /* invalidate the specified number of unique paths */ + float f_interval = (float)the_index.cache_nr / invalidate_qty; + int interval = f_interval < 1.0 ? 1 : (int)f_interval; + for (i = 0; i < invalidate_qty && i * interval < the_index.cache_nr; i++) + cache_tree_invalidate_path(&the_index, the_index.cache[i * interval]->name); + } + + if (argc != 1) + usage_with_options(test_cache_tree_usage, options); + else if (!strcmp(argv[0], "prime")) + prime_cache_tree(the_repository, &the_index, tree); + else if (!strcmp(argv[0], "update")) + cache_tree_update(&the_index, WRITE_TREE_SILENT | WRITE_TREE_REPAIR); + /* use "control" subcommand to specify no-op */ + else if (!!strcmp(argv[0], "control")) + die(_("Unhandled subcommand '%s'"), argv[0]); + + return 0; +} diff --git a/t/helper/test-dump-cache-tree.c b/t/helper/test-dump-cache-tree.c index 0d6d7f1ecb..454f17b1a0 100644 --- a/t/helper/test-dump-cache-tree.c +++ b/t/helper/test-dump-cache-tree.c @@ -1,3 +1,4 @@ +#define USE_THE_INDEX_VARIABLE #include "test-tool.h" #include "cache.h" #include "tree.h" @@ -62,12 +63,12 @@ int cmd__dump_cache_tree(int ac, const char **av) int ret; setup_git_directory(); - if (read_cache() < 0) + if (repo_read_index(the_repository) < 0) die("unable to read index file"); istate = the_index; istate.cache_tree = another; cache_tree_update(&istate, WRITE_TREE_DRY_RUN); - ret = dump_cache_tree(active_cache_tree, another, ""); + ret = dump_cache_tree(the_index.cache_tree, another, ""); cache_tree_free(&another); return ret; diff --git a/t/helper/test-dump-split-index.c b/t/helper/test-dump-split-index.c index a209880eb3..0ea97b8407 100644 --- a/t/helper/test-dump-split-index.c +++ b/t/helper/test-dump-split-index.c @@ -1,3 +1,4 @@ +#define USE_THE_INDEX_VARIABLE #include "test-tool.h" #include "cache.h" #include "split-index.h" diff --git a/t/helper/test-dump-untracked-cache.c b/t/helper/test-dump-untracked-cache.c index 99010614f6..6d53683f13 100644 --- a/t/helper/test-dump-untracked-cache.c +++ b/t/helper/test-dump-untracked-cache.c @@ -1,4 +1,4 @@ -#define USE_THE_INDEX_COMPATIBILITY_MACROS +#define USE_THE_INDEX_VARIABLE #include "test-tool.h" #include "cache.h" #include "dir.h" @@ -51,7 +51,7 @@ int cmd__dump_untracked_cache(int ac, const char **av) xsetenv("GIT_CONFIG_VALUE_0", "keep", 1); setup_git_directory(); - if (read_cache() < 0) + if (repo_read_index(the_repository) < 0) die("unable to read index file"); uc = the_index.untracked; if (!uc) { diff --git a/t/helper/test-fast-rebase.c b/t/helper/test-fast-rebase.c index 45665ec19a..efc82dd80c 100644 --- a/t/helper/test-fast-rebase.c +++ b/t/helper/test-fast-rebase.c @@ -10,7 +10,7 @@ * refactoring is the better route). */ -#define USE_THE_INDEX_COMPATIBILITY_MACROS +#define USE_THE_INDEX_VARIABLE #include "test-tool.h" #include "cache-tree.h" @@ -123,7 +123,7 @@ int cmd__fast_rebase(int argc, const char **argv) die(_("Cannot read HEAD")); assert(oideq(&onto->object.oid, &head)); - hold_locked_index(&lock, LOCK_DIE_ON_ERROR); + repo_hold_locked_index(the_repository, &lock, LOCK_DIE_ON_ERROR); if (repo_read_index(the_repository) < 0) BUG("Could not read index"); diff --git a/t/helper/test-lazy-init-name-hash.c b/t/helper/test-lazy-init-name-hash.c index cd1b4c9736..ab86c14c8b 100644 --- a/t/helper/test-lazy-init-name-hash.c +++ b/t/helper/test-lazy-init-name-hash.c @@ -1,3 +1,4 @@ +#define USE_THE_INDEX_VARIABLE #include "test-tool.h" #include "cache.h" #include "parse-options.h" @@ -32,7 +33,7 @@ static void dump_run(void) struct dir_entry *dir; struct cache_entry *ce; - read_cache(); + repo_read_index(the_repository); if (single) { test_lazy_init_name_hash(&the_index, 0); } else { @@ -49,7 +50,7 @@ static void dump_run(void) ent /* member name */) printf("name %08x %s\n", ce->ent.hash, ce->name); - discard_cache(); + discard_index(&the_index); } /* @@ -66,7 +67,7 @@ static uint64_t time_runs(int try_threaded) for (i = 0; i < count; i++) { t0 = getnanotime(); - read_cache(); + repo_read_index(the_repository); t1 = getnanotime(); nr_threads_used = test_lazy_init_name_hash(&the_index, try_threaded); t2 = getnanotime(); @@ -89,7 +90,7 @@ static uint64_t time_runs(int try_threaded) the_index.cache_nr); fflush(stdout); - discard_cache(); + discard_index(&the_index); } avg = sum / count; @@ -113,9 +114,9 @@ static void analyze_run(void) int i; int nr; - read_cache(); + repo_read_index(the_repository); cache_nr_limit = the_index.cache_nr; - discard_cache(); + discard_index(&the_index); nr = analyze; while (1) { @@ -128,23 +129,23 @@ static void analyze_run(void) nr = cache_nr_limit; for (i = 0; i < count; i++) { - read_cache(); + repo_read_index(the_repository); the_index.cache_nr = nr; /* cheap truncate of index */ t1s = getnanotime(); test_lazy_init_name_hash(&the_index, 0); t2s = getnanotime(); sum_single += (t2s - t1s); the_index.cache_nr = cache_nr_limit; - discard_cache(); + discard_index(&the_index); - read_cache(); + repo_read_index(the_repository); the_index.cache_nr = nr; /* cheap truncate of index */ t1m = getnanotime(); nr_threads_used = test_lazy_init_name_hash(&the_index, 1); t2m = getnanotime(); sum_multi += (t2m - t1m); the_index.cache_nr = cache_nr_limit; - discard_cache(); + discard_index(&the_index); if (!nr_threads_used) printf(" [size %8d] [single %f] non-threaded code path used\n", diff --git a/t/helper/test-read-cache.c b/t/helper/test-read-cache.c index b736ef1642..23e9e27109 100644 --- a/t/helper/test-read-cache.c +++ b/t/helper/test-read-cache.c @@ -1,3 +1,4 @@ +#define USE_THE_INDEX_VARIABLE #include "test-tool.h" #include "cache.h" #include "config.h" @@ -20,7 +21,7 @@ int cmd__read_cache(int argc, const char **argv) git_config(git_default_config, NULL); for (i = 0; i < cnt; i++) { - read_cache(); + repo_read_index(the_repository); if (name) { int pos; @@ -33,7 +34,7 @@ int cmd__read_cache(int argc, const char **argv) ce_uptodate(the_index.cache[pos]) ? "" : " not"); write_file(name, "%d\n", i); } - discard_cache(); + discard_index(&the_index); } return 0; } diff --git a/t/helper/test-scrap-cache-tree.c b/t/helper/test-scrap-cache-tree.c index 026c802479..a26107ed70 100644 --- a/t/helper/test-scrap-cache-tree.c +++ b/t/helper/test-scrap-cache-tree.c @@ -1,3 +1,4 @@ +#define USE_THE_INDEX_VARIABLE #include "test-tool.h" #include "cache.h" #include "lockfile.h" @@ -9,11 +10,11 @@ int cmd__scrap_cache_tree(int ac, const char **av) struct lock_file index_lock = LOCK_INIT; setup_git_directory(); - hold_locked_index(&index_lock, LOCK_DIE_ON_ERROR); - if (read_cache() < 0) + repo_hold_locked_index(the_repository, &index_lock, LOCK_DIE_ON_ERROR); + if (repo_read_index(the_repository) < 0) die("unable to read index file"); - cache_tree_free(&active_cache_tree); - active_cache_tree = NULL; + cache_tree_free(&the_index.cache_tree); + the_index.cache_tree = NULL; if (write_locked_index(&the_index, &index_lock, COMMIT_LOCK)) die("unable to write index file"); return 0; diff --git a/t/helper/test-sha1.c b/t/helper/test-sha1.c index d860c387c3..71fe5c6145 100644 --- a/t/helper/test-sha1.c +++ b/t/helper/test-sha1.c @@ -5,3 +5,11 @@ int cmd__sha1(int ac, const char **av) { return cmd_hash_impl(ac, av, GIT_HASH_SHA1); } + +int cmd__sha1_is_sha1dc(int argc UNUSED, const char **argv UNUSED) +{ +#ifdef platform_SHA_IS_SHA1DC + return 0; +#endif + return 1; +} diff --git a/t/helper/test-submodule.c b/t/helper/test-submodule.c index b7d117cd55..e060cc6226 100644 --- a/t/helper/test-submodule.c +++ b/t/helper/test-submodule.c @@ -111,10 +111,94 @@ static int cmd__submodule_resolve_relative_url(int argc, const char **argv) return 0; } +static int cmd__submodule_config_list(int argc, const char **argv) +{ + struct option options[] = { + OPT_END() + }; + const char *const usage[] = { + "test-tool submodule config-list <key>", + NULL + }; + argc = parse_options(argc, argv, "test-tools", options, usage, + PARSE_OPT_KEEP_ARGV0); + + setup_git_directory(); + + if (argc == 2) + return print_config_from_gitmodules(the_repository, argv[1]); + usage_with_options(usage, options); +} + +static int cmd__submodule_config_set(int argc, const char **argv) +{ + struct option options[] = { + OPT_END() + }; + const char *const usage[] = { + "test-tool submodule config-set <key> <value>", + NULL + }; + argc = parse_options(argc, argv, "test-tools", options, usage, + PARSE_OPT_KEEP_ARGV0); + + setup_git_directory(); + + /* Equivalent to ACTION_SET in builtin/config.c */ + if (argc == 3) { + if (!is_writing_gitmodules_ok()) + die("please make sure that the .gitmodules file is in the working tree"); + + return config_set_in_gitmodules_file_gently(argv[1], argv[2]); + } + usage_with_options(usage, options); +} + +static int cmd__submodule_config_unset(int argc, const char **argv) +{ + struct option options[] = { + OPT_END() + }; + const char *const usage[] = { + "test-tool submodule config-unset <key>", + NULL + }; + + setup_git_directory(); + + if (argc == 2) { + if (!is_writing_gitmodules_ok()) + die("please make sure that the .gitmodules file is in the working tree"); + return config_set_in_gitmodules_file_gently(argv[1], NULL); + } + usage_with_options(usage, options); +} + +static int cmd__submodule_config_writeable(int argc, const char **argv) +{ + struct option options[] = { + OPT_END() + }; + const char *const usage[] = { + "test-tool submodule config-writeable", + NULL + }; + setup_git_directory(); + + if (argc == 1) + return is_writing_gitmodules_ok() ? 0 : -1; + + usage_with_options(usage, options); +} + static struct test_cmd cmds[] = { { "check-name", cmd__submodule_check_name }, { "is-active", cmd__submodule_is_active }, { "resolve-relative-url", cmd__submodule_resolve_relative_url}, + { "config-list", cmd__submodule_config_list }, + { "config-set", cmd__submodule_config_set }, + { "config-unset", cmd__submodule_config_unset }, + { "config-writeable", cmd__submodule_config_writeable }, }; int cmd__submodule(int argc, const char **argv) diff --git a/t/helper/test-tool.c b/t/helper/test-tool.c index 01cda9358d..7eb1a26a30 100644 --- a/t/helper/test-tool.c +++ b/t/helper/test-tool.c @@ -14,6 +14,7 @@ static struct test_cmd cmds[] = { { "bitmap", cmd__bitmap }, { "bloom", cmd__bloom }, { "bundle-uri", cmd__bundle_uri }, + { "cache-tree", cmd__cache_tree }, { "chmtime", cmd__chmtime }, { "config", cmd__config }, { "crontab", cmd__crontab }, @@ -73,6 +74,7 @@ static struct test_cmd cmds[] = { { "scrap-cache-tree", cmd__scrap_cache_tree }, { "serve-v2", cmd__serve_v2 }, { "sha1", cmd__sha1 }, + { "sha1-is-sha1dc", cmd__sha1_is_sha1dc }, { "sha256", cmd__sha256 }, { "sigchain", cmd__sigchain }, { "simple-ipc", cmd__simple_ipc }, diff --git a/t/helper/test-tool.h b/t/helper/test-tool.h index ca2948066f..2e20a16eb8 100644 --- a/t/helper/test-tool.h +++ b/t/helper/test-tool.h @@ -1,13 +1,13 @@ #ifndef TEST_TOOL_H #define TEST_TOOL_H -#define USE_THE_INDEX_COMPATIBILITY_MACROS #include "git-compat-util.h" int cmd__advise_if_enabled(int argc, const char **argv); int cmd__bitmap(int argc, const char **argv); int cmd__bloom(int argc, const char **argv); int cmd__bundle_uri(int argc, const char **argv); +int cmd__cache_tree(int argc, const char **argv); int cmd__chmtime(int argc, const char **argv); int cmd__config(int argc, const char **argv); int cmd__crontab(int argc, const char **argv); @@ -66,6 +66,7 @@ int cmd__run_command(int argc, const char **argv); int cmd__scrap_cache_tree(int argc, const char **argv); int cmd__serve_v2(int argc, const char **argv); int cmd__sha1(int argc, const char **argv); +int cmd__sha1_is_sha1dc(int argc, const char **argv); int cmd__oid_array(int argc, const char **argv); int cmd__sha256(int argc, const char **argv); int cmd__sigchain(int argc, const char **argv); diff --git a/t/helper/test-write-cache.c b/t/helper/test-write-cache.c index 8837717d36..7d45cd61e8 100644 --- a/t/helper/test-write-cache.c +++ b/t/helper/test-write-cache.c @@ -1,3 +1,4 @@ +#define USE_THE_INDEX_VARIABLE #include "test-tool.h" #include "cache.h" #include "lockfile.h" @@ -9,9 +10,10 @@ int cmd__write_cache(int argc, const char **argv) if (argc == 2) cnt = strtol(argv[1], NULL, 0); setup_git_directory(); - read_cache(); + repo_read_index(the_repository); for (i = 0; i < cnt; i++) { - hold_locked_index(&index_lock, LOCK_DIE_ON_ERROR); + repo_hold_locked_index(the_repository, &index_lock, + LOCK_DIE_ON_ERROR); if (write_locked_index(&the_index, &index_lock, COMMIT_LOCK)) die("unable to write index file"); } diff --git a/t/lib-httpd.sh b/t/lib-httpd.sh index ba9fe36772..8f59e9dff8 100644 --- a/t/lib-httpd.sh +++ b/t/lib-httpd.sh @@ -65,7 +65,8 @@ done for DEFAULT_HTTPD_MODULE_PATH in '/usr/libexec/apache2' \ '/usr/lib/apache2/modules' \ '/usr/lib64/httpd/modules' \ - '/usr/lib/httpd/modules' + '/usr/lib/httpd/modules' \ + '/usr/libexec/httpd' do if test -d "$DEFAULT_HTTPD_MODULE_PATH" then @@ -98,16 +99,19 @@ then fi HTTPD_VERSION=$($LIB_HTTPD_PATH -v | \ - sed -n 's/^Server version: Apache\/\([0-9]*\)\..*$/\1/p; q') + sed -n 's/^Server version: Apache\/\([0-9.]*\).*$/\1/p; q') +HTTPD_VERSION_MAJOR=$(echo $HTTPD_VERSION | cut -d. -f1) +HTTPD_VERSION_MINOR=$(echo $HTTPD_VERSION | cut -d. -f2) -if test -n "$HTTPD_VERSION" +if test -n "$HTTPD_VERSION_MAJOR" then if test -z "$LIB_HTTPD_MODULE_PATH" then - if ! test $HTTPD_VERSION -ge 2 + if ! test "$HTTPD_VERSION_MAJOR" -eq 2 || + ! test "$HTTPD_VERSION_MINOR" -ge 4 then test_skip_or_die GIT_TEST_HTTPD \ - "at least Apache version 2 is required" + "at least Apache version 2.4 is required" fi if ! test -d "$DEFAULT_HTTPD_MODULE_PATH" then @@ -279,11 +283,11 @@ expect_askpass() { none) ;; pass) - echo "askpass: Password for 'http://$2@$dest': " + echo "askpass: Password for '$HTTPD_PROTO://$2@$dest': " ;; both) - echo "askpass: Username for 'http://$dest': " - echo "askpass: Password for 'http://$2@$dest': " + echo "askpass: Username for '$HTTPD_PROTO://$dest': " + echo "askpass: Password for '$HTTPD_PROTO://$2@$dest': " ;; *) false diff --git a/t/lib-httpd/apache.conf b/t/lib-httpd/apache.conf index 0294739a77..693b75e0ae 100644 --- a/t/lib-httpd/apache.conf +++ b/t/lib-httpd/apache.conf @@ -31,20 +31,9 @@ ErrorLog error.log <IfDefine HTTP2> LoadModule http2_module modules/mod_http2.so -Protocols h2c +Protocols h2 h2c </IfDefine> -<IfVersion < 2.4> -LockFile accept.lock -</IfVersion> - -<IfVersion < 2.1> -<IfModule !mod_auth.c> - LoadModule auth_module modules/mod_auth.so -</IfModule> -</IfVersion> - -<IfVersion >= 2.1> <IfModule !mod_auth_basic.c> LoadModule auth_basic_module modules/mod_auth_basic.so </IfModule> @@ -57,9 +46,7 @@ LockFile accept.lock <IfModule !mod_authz_host.c> LoadModule authz_host_module modules/mod_authz_host.so </IfModule> -</IfVersion> -<IfVersion >= 2.4> <IfModule !mod_authn_core.c> LoadModule authn_core_module modules/mod_authn_core.so </IfModule> @@ -83,7 +70,6 @@ LockFile accept.lock LoadModule mpm_prefork_module modules/mod_mpm_prefork.so </IfModule> </IfDefine> -</IfVersion> PassEnv GIT_VALGRIND PassEnv GIT_VALGRIND_OPTIONS @@ -123,6 +109,10 @@ Alias /auth/dumb/ www/auth/dumb/ Header set Set-Cookie name=value </LocationMatch> <LocationMatch /smart_headers/> + <RequireAll> + Require expr %{HTTP:x-magic-one} == 'abra' + Require expr %{HTTP:x-magic-two} == 'cadabra' + </RequireAll> SetEnv GIT_EXEC_PATH ${GIT_EXEC_PATH} SetEnv GIT_HTTP_EXPORT_ALL </LocationMatch> @@ -205,18 +195,6 @@ RewriteRule ^/intern-redir/(.*)/foo$ /smart/$1 [PT] RewriteRule ^/redir-objects/(.*/info/refs)$ /dumb/$1 [PT] RewriteRule ^/redir-objects/(.*/objects/.*)$ /dumb/$1 [R=301] -# Apache 2.2 does not understand <RequireAll>, so we use RewriteCond. -# And as RewriteCond does not allow testing for non-matches, we match -# the desired case first (one has abra, two has cadabra), and let it -# pass by marking the RewriteRule as [L], "last rule, do not process -# any other matching RewriteRules after this"), and then have another -# RewriteRule that matches all other cases and lets them fail via '[F]', -# "fail the request". -RewriteCond %{HTTP:x-magic-one} =abra -RewriteCond %{HTTP:x-magic-two} =cadabra -RewriteRule ^/smart_headers/.* - [L] -RewriteRule ^/smart_headers/.* - [F] - <IfDefine SSL> LoadModule ssl_module modules/mod_ssl.so @@ -225,7 +203,6 @@ SSLCertificateKeyFile httpd.pem SSLRandomSeed startup file:/dev/urandom 512 SSLRandomSeed connect file:/dev/urandom 512 SSLSessionCache none -SSLMutex file:ssl_mutex SSLEngine On </IfDefine> diff --git a/t/lib-httpd/ssl.cnf b/t/lib-httpd/ssl.cnf index 6dab2579cb..812e8253f0 100644 --- a/t/lib-httpd/ssl.cnf +++ b/t/lib-httpd/ssl.cnf @@ -1,7 +1,7 @@ RANDFILE = $ENV::RANDFILE_PATH [ req ] -default_bits = 1024 +default_bits = 2048 distinguished_name = req_distinguished_name prompt = no [ req_distinguished_name ] diff --git a/t/perf/p0006-read-tree-checkout.sh b/t/perf/p0006-read-tree-checkout.sh index c481c012d2..325566e18e 100755 --- a/t/perf/p0006-read-tree-checkout.sh +++ b/t/perf/p0006-read-tree-checkout.sh @@ -49,6 +49,14 @@ test_perf "read-tree br_base br_ballast ($nr_files)" ' git read-tree -n -m br_base br_ballast ' +test_perf "read-tree br_ballast_plus_1 ($nr_files)" ' + # Run read-tree 100 times for clearer performance results & comparisons + for i in $(test_seq 100) + do + git read-tree -n -m br_ballast_plus_1 || return 1 + done +' + test_perf "switch between br_base br_ballast ($nr_files)" ' git checkout -q br_base && git checkout -q br_ballast diff --git a/t/perf/p0090-cache-tree.sh b/t/perf/p0090-cache-tree.sh new file mode 100755 index 0000000000..a8eabca2c4 --- /dev/null +++ b/t/perf/p0090-cache-tree.sh @@ -0,0 +1,36 @@ +#!/bin/sh + +test_description="Tests performance of cache tree update operations" + +. ./perf-lib.sh + +test_perf_large_repo +test_checkout_worktree + +count=100 + +test_expect_success 'setup cache tree' ' + git write-tree +' + +test_cache_tree () { + test_perf "$1, $3" " + for i in \$(test_seq $count) + do + test-tool cache-tree $4 $2 + done + " +} + +test_cache_tree_update_functions () { + test_cache_tree 'no-op' 'control' "$1" "$2" + test_cache_tree 'prime_cache_tree' 'prime' "$1" "$2" + test_cache_tree 'cache_tree_update' 'update' "$1" "$2" +} + +test_cache_tree_update_functions "clean" "" +test_cache_tree_update_functions "invalidate 2" "--invalidate 2" +test_cache_tree_update_functions "invalidate 50" "--invalidate 50" +test_cache_tree_update_functions "empty" "--empty" + +test_done diff --git a/t/perf/p7102-reset.sh b/t/perf/p7102-reset.sh new file mode 100755 index 0000000000..9b039e8691 --- /dev/null +++ b/t/perf/p7102-reset.sh @@ -0,0 +1,21 @@ +#!/bin/sh + +test_description='performance of reset' +. ./perf-lib.sh + +test_perf_default_repo +test_checkout_worktree + +test_perf 'reset --hard with change in tree' ' + base=$(git rev-parse HEAD) && + test_commit --no-tag A && + new=$(git rev-parse HEAD) && + + for i in $(test_seq 10) + do + git reset --hard $new && + git reset --hard $base || return $? + done +' + +test_done diff --git a/t/t0003-attributes.sh b/t/t0003-attributes.sh index f7ee2f2ff0..d0284fe2d7 100755 --- a/t/t0003-attributes.sh +++ b/t/t0003-attributes.sh @@ -376,4 +376,63 @@ test_expect_success SYMLINKS 'symlinks not respected in-tree' ' test_i18ngrep "unable to access.*gitattributes" err ' +test_expect_success 'large attributes line ignored in tree' ' + test_when_finished "rm .gitattributes" && + printf "path %02043d" 1 >.gitattributes && + git check-attr --all path >actual 2>err && + echo "warning: ignoring overly long attributes line 1" >expect && + test_cmp expect err && + test_must_be_empty actual +' + +test_expect_success 'large attributes line ignores trailing content in tree' ' + test_when_finished "rm .gitattributes" && + # older versions of Git broke lines at 2048 bytes; the 2045 bytes + # of 0-padding here is accounting for the three bytes of "a 1", which + # would knock "trailing" to the "next" line, where it would be + # erroneously parsed. + printf "a %02045dtrailing attribute\n" 1 >.gitattributes && + git check-attr --all trailing >actual 2>err && + echo "warning: ignoring overly long attributes line 1" >expect && + test_cmp expect err && + test_must_be_empty actual +' + +test_expect_success EXPENSIVE 'large attributes file ignored in tree' ' + test_when_finished "rm .gitattributes" && + dd if=/dev/zero of=.gitattributes bs=101M count=1 2>/dev/null && + git check-attr --all path >/dev/null 2>err && + echo "warning: ignoring overly large gitattributes file ${SQ}.gitattributes${SQ}" >expect && + test_cmp expect err +' + +test_expect_success 'large attributes line ignored in index' ' + test_when_finished "git update-index --remove .gitattributes" && + blob=$(printf "path %02043d" 1 | git hash-object -w --stdin) && + git update-index --add --cacheinfo 100644,$blob,.gitattributes && + git check-attr --cached --all path >actual 2>err && + echo "warning: ignoring overly long attributes line 1" >expect && + test_cmp expect err && + test_must_be_empty actual +' + +test_expect_success 'large attributes line ignores trailing content in index' ' + test_when_finished "git update-index --remove .gitattributes" && + blob=$(printf "a %02045dtrailing attribute\n" 1 | git hash-object -w --stdin) && + git update-index --add --cacheinfo 100644,$blob,.gitattributes && + git check-attr --cached --all trailing >actual 2>err && + echo "warning: ignoring overly long attributes line 1" >expect && + test_cmp expect err && + test_must_be_empty actual +' + +test_expect_success EXPENSIVE 'large attributes file ignored in index' ' + test_when_finished "git update-index --remove .gitattributes" && + blob=$(dd if=/dev/zero bs=101M count=1 2>/dev/null | git hash-object -w --stdin) && + git update-index --add --cacheinfo 100644,$blob,.gitattributes && + git check-attr --cached --all path >/dev/null 2>err && + echo "warning: ignoring overly large gitattributes blob ${SQ}.gitattributes${SQ}" >expect && + test_cmp expect err +' + test_done diff --git a/t/t0013-sha1dc.sh b/t/t0013-sha1dc.sh index 9ad76080aa..5324047689 100755 --- a/t/t0013-sha1dc.sh +++ b/t/t0013-sha1dc.sh @@ -6,9 +6,11 @@ TEST_PASSES_SANITIZE_LEAK=true . ./test-lib.sh TEST_DATA="$TEST_DIRECTORY/t0013" -if test -z "$DC_SHA1" +test_lazy_prereq SHA1_IS_SHA1DC 'test-tool sha1-is-sha1dc' + +if ! test_have_prereq SHA1_IS_SHA1DC then - skip_all='skipping sha1 collision tests, DC_SHA1 not set' + skip_all='skipping sha1 collision tests, not using sha1collisiondetection' test_done fi diff --git a/t/t0040-parse-options.sh b/t/t0040-parse-options.sh index 5cc62306e3..7d7ecfd571 100755 --- a/t/t0040-parse-options.sh +++ b/t/t0040-parse-options.sh @@ -709,4 +709,16 @@ test_expect_success 'subcommands are incompatible with KEEP_DASHDASH unless in c grep ^BUG err ' +test_expect_success 'negative magnitude' ' + test_must_fail test-tool parse-options --magnitude -1 >out 2>err && + grep "non-negative integer" err && + test_must_be_empty out +' + +test_expect_success 'magnitude with units but no numbers' ' + test_must_fail test-tool parse-options --magnitude m >out 2>err && + grep "non-negative integer" err && + test_must_be_empty out +' + test_done diff --git a/t/t0061-run-command.sh b/t/t0061-run-command.sh index 7b5423eebd..e2411f6a9b 100755 --- a/t/t0061-run-command.sh +++ b/t/t0061-run-command.sh @@ -130,7 +130,8 @@ World EOF test_expect_success 'run_command runs in parallel with more jobs available than tasks' ' - test-tool run-command run-command-parallel 5 sh -c "printf \"%s\n%s\n\" Hello World" 2>actual && + test-tool run-command run-command-parallel 5 sh -c "printf \"%s\n%s\n\" Hello World" >out 2>actual && + test_must_be_empty out && test_cmp expect actual ' @@ -141,7 +142,8 @@ test_expect_success 'run_command runs ungrouped in parallel with more jobs avail ' test_expect_success 'run_command runs in parallel with as many jobs as tasks' ' - test-tool run-command run-command-parallel 4 sh -c "printf \"%s\n%s\n\" Hello World" 2>actual && + test-tool run-command run-command-parallel 4 sh -c "printf \"%s\n%s\n\" Hello World" >out 2>actual && + test_must_be_empty out && test_cmp expect actual ' @@ -152,7 +154,8 @@ test_expect_success 'run_command runs ungrouped in parallel with as many jobs as ' test_expect_success 'run_command runs in parallel with more tasks than jobs available' ' - test-tool run-command run-command-parallel 3 sh -c "printf \"%s\n%s\n\" Hello World" 2>actual && + test-tool run-command run-command-parallel 3 sh -c "printf \"%s\n%s\n\" Hello World" >out 2>actual && + test_must_be_empty out && test_cmp expect actual ' @@ -172,7 +175,8 @@ asking for a quick stop EOF test_expect_success 'run_command is asked to abort gracefully' ' - test-tool run-command run-command-abort 3 false 2>actual && + test-tool run-command run-command-abort 3 false >out 2>actual && + test_must_be_empty out && test_cmp expect actual ' @@ -187,7 +191,8 @@ no further jobs available EOF test_expect_success 'run_command outputs ' ' - test-tool run-command run-command-no-jobs 3 sh -c "printf \"%s\n%s\n\" Hello World" 2>actual && + test-tool run-command run-command-no-jobs 3 sh -c "printf \"%s\n%s\n\" Hello World" >out 2>actual && + test_must_be_empty out && test_cmp expect actual ' diff --git a/t/t0066-dir-iterator.sh b/t/t0066-dir-iterator.sh index 63a1a45cd3..04b811622b 100755 --- a/t/t0066-dir-iterator.sh +++ b/t/t0066-dir-iterator.sh @@ -110,7 +110,9 @@ test_expect_success SYMLINKS 'setup dirs with symlinks' ' mkdir -p dir5/a/c && ln -s ../c dir5/a/b/d && ln -s ../ dir5/a/b/e && - ln -s ../../ dir5/a/b/f + ln -s ../../ dir5/a/b/f && + + ln -s dir4 dir6 ' test_expect_success SYMLINKS 'dir-iterator should not follow symlinks by default' ' @@ -146,4 +148,27 @@ test_expect_success SYMLINKS 'dir-iterator should follow symlinks w/ follow flag test_cmp expected-follow-sorted-output actual-follow-sorted-output ' +test_expect_success SYMLINKS 'dir-iterator does not resolve top-level symlinks' ' + test_must_fail test-tool dir-iterator ./dir6 >out && + + grep "ENOTDIR" out +' + +test_expect_success SYMLINKS 'dir-iterator resolves top-level symlinks w/ follow flag' ' + cat >expected-follow-sorted-output <<-EOF && + [d] (a) [a] ./dir6/a + [d] (a/f) [f] ./dir6/a/f + [d] (a/f/c) [c] ./dir6/a/f/c + [d] (b) [b] ./dir6/b + [d] (b/c) [c] ./dir6/b/c + [f] (a/d) [d] ./dir6/a/d + [f] (a/e) [e] ./dir6/a/e + EOF + + test-tool dir-iterator --follow-symlinks ./dir6 >out && + sort out >actual-follow-sorted-output && + + test_cmp expected-follow-sorted-output actual-follow-sorted-output +' + test_done diff --git a/t/t0068-for-each-repo.sh b/t/t0068-for-each-repo.sh index 4675e85251..c6e0d65563 100755 --- a/t/t0068-for-each-repo.sh +++ b/t/t0068-for-each-repo.sh @@ -8,9 +8,11 @@ test_expect_success 'run based on configured value' ' git init one && git init two && git init three && + git init ~/four && git -C two commit --allow-empty -m "DID NOT RUN" && git config run.key "$TRASH_DIRECTORY/one" && git config --add run.key "$TRASH_DIRECTORY/three" && + git config --add run.key "~/four" && git for-each-repo --config=run.key commit --allow-empty -m "ran" && git -C one log -1 --pretty=format:%s >message && grep ran message && @@ -18,12 +20,16 @@ test_expect_success 'run based on configured value' ' ! grep ran message && git -C three log -1 --pretty=format:%s >message && grep ran message && + git -C ~/four log -1 --pretty=format:%s >message && + grep ran message && git for-each-repo --config=run.key -- commit --allow-empty -m "ran again" && git -C one log -1 --pretty=format:%s >message && grep again message && git -C two log -1 --pretty=format:%s >message && ! grep again message && git -C three log -1 --pretty=format:%s >message && + grep again message && + git -C ~/four log -1 --pretty=format:%s >message && grep again message ' diff --git a/t/t0211-trace2-perf.sh b/t/t0211-trace2-perf.sh index 0b3436e8ca..b4e9135118 100755 --- a/t/t0211-trace2-perf.sh +++ b/t/t0211-trace2-perf.sh @@ -203,7 +203,7 @@ test_expect_success 'stopwatch timer test/test1' ' have_timer_event "main" "timer" "test" "test1" 5 actual ' -test_expect_success 'stopwatch timer test/test2' ' +test_expect_success PTHREAD 'stopwatch timer test/test2' ' test_when_finished "rm trace.perf actual" && test_config_global trace2.perfBrief 1 && test_config_global trace2.perfTarget "$(pwd)/trace.perf" && @@ -249,7 +249,7 @@ test_expect_success 'global counter test/test1' ' have_counter_event "main" "counter" "test" "test1" 15 actual ' -test_expect_success 'global counter test/test2' ' +test_expect_success PTHREAD 'global counter test/test2' ' test_when_finished "rm trace.perf actual" && test_config_global trace2.perfBrief 1 && test_config_global trace2.perfTarget "$(pwd)/trace.perf" && diff --git a/t/t1022-read-tree-partial-clone.sh b/t/t1022-read-tree-partial-clone.sh index a9953b6a71..da53971635 100755 --- a/t/t1022-read-tree-partial-clone.sh +++ b/t/t1022-read-tree-partial-clone.sh @@ -19,7 +19,7 @@ test_expect_success 'read-tree in partial clone prefetches in one batch' ' git -C server config uploadpack.allowfilter 1 && git -C server config uploadpack.allowanysha1inwant 1 && git clone --bare --filter=blob:none "file://$(pwd)/server" client && - GIT_TRACE_PACKET="$(pwd)/trace" git -C client read-tree $TREE && + GIT_TRACE_PACKET="$(pwd)/trace" git -C client read-tree $TREE $TREE && # "done" marks the end of negotiation (once per fetch). Expect that # only one fetch occurs. diff --git a/t/t1050-large.sh b/t/t1050-large.sh index 4f3aa17c99..c71932b024 100755 --- a/t/t1050-large.sh +++ b/t/t1050-large.sh @@ -5,6 +5,12 @@ test_description='adding and checking out large blobs' . ./test-lib.sh +test_expect_success 'core.bigFileThreshold must be non-negative' ' + test_must_fail git -c core.bigFileThreshold=-1 rev-parse >out 2>err && + grep "bad numeric config value" err && + test_must_be_empty out +' + test_expect_success setup ' # clone does not allow us to pass core.bigfilethreshold to # new repos, so set core.bigfilethreshold globally diff --git a/t/t1091-sparse-checkout-builtin.sh b/t/t1091-sparse-checkout-builtin.sh index b563d6c263..627267be15 100755 --- a/t/t1091-sparse-checkout-builtin.sh +++ b/t/t1091-sparse-checkout-builtin.sh @@ -238,7 +238,7 @@ test_expect_success 'cone mode: match patterns' ' test_expect_success 'cone mode: warn on bad pattern' ' test_when_finished mv sparse-checkout repo/.git/info/ && cp repo/.git/info/sparse-checkout . && - echo "!/deep/deeper/*" >>repo/.git/info/sparse-checkout && + echo "!/deep/deeper/*/" >>repo/.git/info/sparse-checkout && git -C repo read-tree -mu HEAD 2>err && test_i18ngrep "unrecognized negative pattern" err ' @@ -667,6 +667,15 @@ test_expect_success 'pattern-checks: starting "*"' ' check_read_tree_errors repo "a deep" "disabling cone pattern matching" ' +test_expect_success 'pattern-checks: non directory pattern' ' + cat >repo/.git/info/sparse-checkout <<-\EOF && + /deep/deeper1/a + EOF + check_read_tree_errors repo deep "disabling cone pattern matching" && + check_files repo/deep deeper1 && + check_files repo/deep/deeper1 a +' + test_expect_success 'pattern-checks: contained glob characters' ' for c in "[a]" "\\" "?" "*" do diff --git a/t/t1300-config.sh b/t/t1300-config.sh index c6661e61af..f1d42b62b0 100755 --- a/t/t1300-config.sh +++ b/t/t1300-config.sh @@ -617,6 +617,36 @@ test_expect_success 'renaming to bogus section is rejected' ' test_must_fail git config --rename-section branch.zwei "bogus name" ' +test_expect_success 'renaming a section with a long line' ' + { + printf "[b]\\n" && + printf " c = d %1024s [a] e = f\\n" " " && + printf "[a] g = h\\n" + } >y && + git config -f y --rename-section a xyz && + test_must_fail git config -f y b.e +' + +test_expect_success 'renaming an embedded section with a long line' ' + { + printf "[b]\\n" && + printf " c = d %1024s [a] [foo] e = f\\n" " " && + printf "[a] g = h\\n" + } >y && + git config -f y --rename-section a xyz && + test_must_fail git config -f y foo.e +' + +test_expect_success 'renaming a section with an overly-long line' ' + { + printf "[b]\\n" && + printf " c = d %525000s e" " " && + printf "[a] g = h\\n" + } >y && + test_must_fail git config -f y --rename-section a xyz 2>err && + grep "refusing to work with overly long line in .y. on line 2" err +' + cat >> .git/config << EOF [branch "zwei"] a = 1 [branch "vier"] EOF @@ -2228,6 +2258,12 @@ test_expect_success '--type rejects unknown specifiers' ' test_i18ngrep "unrecognized --type argument" error ' +test_expect_success '--type=int requires at least one digit' ' + test_must_fail git config --type int --default m some.key >out 2>error && + grep "bad numeric config value" error && + test_must_be_empty out +' + test_expect_success '--replace-all does not invent newlines' ' q_to_tab >.git/config <<-\EOF && [abc]key diff --git a/t/t1450-fsck.sh b/t/t1450-fsck.sh index ace4556788..de0f6d5e7f 100755 --- a/t/t1450-fsck.sh +++ b/t/t1450-fsck.sh @@ -999,4 +999,28 @@ test_expect_success 'fsck error and recovery on invalid object type' ' ) ' +test_expect_success 'fsck error on gitattributes with excessive line lengths' ' + blob=$(printf "pattern %02048d" 1 | git hash-object -w --stdin) && + test_when_finished "remove_object $blob" && + tree=$(printf "100644 blob %s\t%s\n" $blob .gitattributes | git mktree) && + test_when_finished "remove_object $tree" && + cat >expected <<-EOF && + error in blob $blob: gitattributesLineLength: .gitattributes has too long lines to parse + EOF + test_must_fail git fsck --no-dangling >actual 2>&1 && + test_cmp expected actual +' + +test_expect_success 'fsck error on gitattributes with excessive size' ' + blob=$(test-tool genzeros $((100 * 1024 * 1024 + 1)) | git hash-object -w --stdin) && + test_when_finished "remove_object $blob" && + tree=$(printf "100644 blob %s\t%s\n" $blob .gitattributes | git mktree) && + test_when_finished "remove_object $tree" && + cat >expected <<-EOF && + error in blob $blob: gitattributesLarge: .gitattributes too large to parse + EOF + test_must_fail git fsck --no-dangling >actual 2>&1 && + test_cmp expected actual +' + test_done diff --git a/t/t1800-hook.sh b/t/t1800-hook.sh index 43fcb7c0bf..2ef3579fa7 100755 --- a/t/t1800-hook.sh +++ b/t/t1800-hook.sh @@ -95,7 +95,7 @@ test_expect_success 'git hook run -- out-of-repo runs excluded' ' test_expect_success 'git -c core.hooksPath=<PATH> hook run' ' mkdir my-hooks && write_script my-hooks/test-hook <<-\EOF && - echo Hook ran $1 >>actual + echo Hook ran $1 EOF cat >expect <<-\EOF && diff --git a/t/t3104-ls-tree-format.sh b/t/t3104-ls-tree-format.sh index 383896667b..805b30f403 100755 --- a/t/t3104-ls-tree-format.sh +++ b/t/t3104-ls-tree-format.sh @@ -36,6 +36,12 @@ test_ls_tree_format () { ' } +test_expect_success "ls-tree --format='%(path) %(path) %(path)' HEAD top-file" ' + git ls-tree --format="%(path) %(path) %(path)" HEAD top-file.t >actual && + echo top-file.t top-file.t top-file.t >expect && + test_cmp expect actual +' + test_ls_tree_format \ "%(objectmode) %(objecttype) %(objectname)%x09%(path)" \ "" diff --git a/t/t3200-branch.sh b/t/t3200-branch.sh index 7f605f865b..5a169b68d6 100755 --- a/t/t3200-branch.sh +++ b/t/t3200-branch.sh @@ -279,6 +279,42 @@ test_expect_success 'git branch -M and -C fail on detached HEAD' ' test_cmp expect err ' +test_expect_success 'git branch -d on orphan HEAD (merged)' ' + test_when_finished git checkout main && + git checkout --orphan orphan && + test_when_finished "rm -rf .git/objects/commit-graph*" && + git commit-graph write --reachable && + git branch --track to-delete main && + git branch -d to-delete +' + +test_expect_success 'git branch -d on orphan HEAD (merged, graph)' ' + test_when_finished git checkout main && + git checkout --orphan orphan && + git branch --track to-delete main && + git branch -d to-delete +' + +test_expect_success 'git branch -d on orphan HEAD (unmerged)' ' + test_when_finished git checkout main && + git checkout --orphan orphan && + test_when_finished "git branch -D to-delete" && + git branch to-delete main && + test_must_fail git branch -d to-delete 2>err && + grep "not fully merged" err +' + +test_expect_success 'git branch -d on orphan HEAD (unmerged, graph)' ' + test_when_finished git checkout main && + git checkout --orphan orphan && + test_when_finished "git branch -D to-delete" && + git branch to-delete main && + test_when_finished "rm -rf .git/objects/commit-graph*" && + git commit-graph write --reachable && + test_must_fail git branch -d to-delete 2>err && + grep "not fully merged" err +' + test_expect_success 'git branch -v -d t should work' ' git branch t && git rev-parse --verify refs/heads/t && diff --git a/t/t3204-branch-name-interpretation.sh b/t/t3204-branch-name-interpretation.sh index 793bf4d269..3399344f25 100755 --- a/t/t3204-branch-name-interpretation.sh +++ b/t/t3204-branch-name-interpretation.sh @@ -57,6 +57,16 @@ test_expect_success 'create branch with pseudo-qualified name' ' expect_branch refs/heads/refs/heads/qualified two ' +test_expect_success 'force-copy a branch to itself via @{-1} is no-op' ' + git branch -t copiable main && + git checkout copiable && + git checkout - && + git branch -C @{-1} copiable && + git config --get-all branch.copiable.merge >actual && + echo refs/heads/main >expect && + test_cmp expect actual +' + test_expect_success 'delete branch via @{-1}' ' git branch previous-del && diff --git a/t/t3404-rebase-interactive.sh b/t/t3404-rebase-interactive.sh index 4f5abb5ad2..462cefd25d 100755 --- a/t/t3404-rebase-interactive.sh +++ b/t/t3404-rebase-interactive.sh @@ -1964,6 +1964,113 @@ test_expect_success 'respect user edits to update-ref steps' ' test_cmp_rev HEAD refs/heads/no-conflict-branch ' +test_expect_success '--update-refs: all update-ref lines removed' ' + git checkout -b test-refs-not-removed no-conflict-branch && + git branch -f base HEAD~4 && + git branch -f first HEAD~3 && + git branch -f second HEAD~3 && + git branch -f third HEAD~1 && + git branch -f tip && + + test_commit test-refs-not-removed && + git commit --amend --fixup first && + + git rev-parse first second third tip no-conflict-branch >expect-oids && + + ( + set_cat_todo_editor && + test_must_fail git rebase -i --update-refs base >todo.raw && + sed -e "/^update-ref/d" <todo.raw >todo + ) && + ( + set_replace_editor todo && + git rebase -i --update-refs base + ) && + + # Ensure refs are not deleted and their OIDs have not changed + git rev-parse first second third tip no-conflict-branch >actual-oids && + test_cmp expect-oids actual-oids +' + +test_expect_success '--update-refs: all update-ref lines removed, then some re-added' ' + git checkout -b test-refs-not-removed2 no-conflict-branch && + git branch -f base HEAD~4 && + git branch -f first HEAD~3 && + git branch -f second HEAD~3 && + git branch -f third HEAD~1 && + git branch -f tip && + + test_commit test-refs-not-removed2 && + git commit --amend --fixup first && + + git rev-parse first second third >expect-oids && + + ( + set_cat_todo_editor && + test_must_fail git rebase -i \ + --autosquash --update-refs \ + base >todo.raw && + sed -e "/^update-ref/d" <todo.raw >todo + ) && + + # Add a break to the end of the todo so we can edit later + echo "break" >>todo && + + ( + set_replace_editor todo && + git rebase -i --autosquash --update-refs base && + echo "update-ref refs/heads/tip" >todo && + git rebase --edit-todo && + git rebase --continue + ) && + + # Ensure first/second/third are unchanged, but tip is updated + git rev-parse first second third >actual-oids && + test_cmp expect-oids actual-oids && + test_cmp_rev HEAD tip +' + +test_expect_success '--update-refs: --edit-todo with no update-ref lines' ' + git checkout -b test-refs-not-removed3 no-conflict-branch && + git branch -f base HEAD~4 && + git branch -f first HEAD~3 && + git branch -f second HEAD~3 && + git branch -f third HEAD~1 && + git branch -f tip && + + test_commit test-refs-not-removed3 && + git commit --amend --fixup first && + + git rev-parse first second third tip no-conflict-branch >expect-oids && + + ( + set_cat_todo_editor && + test_must_fail git rebase -i \ + --autosquash --update-refs \ + base >todo.raw && + sed -e "/^update-ref/d" <todo.raw >todo + ) && + + # Add a break to the beginning of the todo so we can resume with no + # update-ref lines + echo "break" >todo.new && + cat todo >>todo.new && + + ( + set_replace_editor todo.new && + git rebase -i --autosquash --update-refs base && + + # Make no changes when editing so update-refs is still empty + cat todo >todo.new && + git rebase --edit-todo && + git rebase --continue + ) && + + # Ensure refs are not deleted and their OIDs have not changed + git rev-parse first second third tip no-conflict-branch >actual-oids && + test_cmp expect-oids actual-oids +' + test_expect_success '--update-refs: check failed ref update' ' git checkout -B update-refs-error no-conflict-branch && git branch -f base HEAD~4 && diff --git a/t/t3430-rebase-merges.sh b/t/t3430-rebase-merges.sh index f351701fec..fa2a06c19f 100755 --- a/t/t3430-rebase-merges.sh +++ b/t/t3430-rebase-merges.sh @@ -138,6 +138,23 @@ test_expect_success '`reset` refuses to overwrite untracked files' ' git rebase --abort ' +test_expect_success '`reset` rejects trees' ' + test_when_finished "test_might_fail git rebase --abort" && + test_must_fail env GIT_SEQUENCE_EDITOR="echo reset A^{tree} >" \ + git rebase -i B C >out 2>err && + grep "object .* is a tree" err && + test_must_be_empty out +' + +test_expect_success '`reset` only looks for labels under refs/rewritten/' ' + test_when_finished "test_might_fail git rebase --abort" && + git branch refs/rewritten/my-label A && + test_must_fail env GIT_SEQUENCE_EDITOR="echo reset my-label >" \ + git rebase -i B C >out 2>err && + grep "could not resolve ${SQ}my-label${SQ}" err && + test_must_be_empty out +' + test_expect_success 'failed `merge -C` writes patch (may be rescheduled, too)' ' test_when_finished "test_might_fail git rebase --abort" && git checkout -b conflicting-merge A && diff --git a/t/t3920-crlf-messages.sh b/t/t3920-crlf-messages.sh index 4c661d4d54..67fd2345af 100755 --- a/t/t3920-crlf-messages.sh +++ b/t/t3920-crlf-messages.sh @@ -12,7 +12,7 @@ create_crlf_ref () { cat >.crlf-orig-$branch.txt && cat .crlf-orig-$branch.txt | append_cr >.crlf-message-$branch.txt && grep 'Subject' .crlf-orig-$branch.txt | tr '\n' ' ' | sed 's/[ ]*$//' | tr -d '\n' >.crlf-subject-$branch.txt && - grep 'Body' .crlf-message-$branch.txt >.crlf-body-$branch.txt || true && + grep 'Body' .crlf-orig-$branch.txt | append_cr >.crlf-body-$branch.txt && LIB_CRLF_BRANCHES="${LIB_CRLF_BRANCHES} ${branch}" && test_tick && hash=$(git commit-tree HEAD^{tree} -p HEAD -F .crlf-message-${branch}.txt) && diff --git a/t/t4023-diff-rename-typechange.sh b/t/t4023-diff-rename-typechange.sh index 7cb9909293..787605ce3f 100755 --- a/t/t4023-diff-rename-typechange.sh +++ b/t/t4023-diff-rename-typechange.sh @@ -52,8 +52,8 @@ test_expect_success setup ' ' test_expect_success 'cross renames to be detected for regular files' ' - - git diff-tree five six -r --name-status -B -M | sort >actual && + git diff-tree five six -r --name-status -B -M >out && + sort out >actual && { echo "R100 foo bar" && echo "R100 bar foo" @@ -63,8 +63,8 @@ test_expect_success 'cross renames to be detected for regular files' ' ' test_expect_success 'cross renames to be detected for typechange' ' - - git diff-tree one two -r --name-status -B -M | sort >actual && + git diff-tree one two -r --name-status -B -M >out && + sort out >actual && { echo "R100 foo bar" && echo "R100 bar foo" @@ -74,8 +74,8 @@ test_expect_success 'cross renames to be detected for typechange' ' ' test_expect_success 'moves and renames' ' - - git diff-tree three four -r --name-status -B -M | sort >actual && + git diff-tree three four -r --name-status -B -M >out && + sort out >actual && { # see -B -M (#6) in t4008 echo "C100 foo bar" && diff --git a/t/t4045-diff-relative.sh b/t/t4045-diff-relative.sh index fab351b48a..5e1bbb57e7 100755 --- a/t/t4045-diff-relative.sh +++ b/t/t4045-diff-relative.sh @@ -162,6 +162,35 @@ check_diff_relative_option subdir file2 true --no-relative --relative check_diff_relative_option . file2 false --no-relative --relative=subdir check_diff_relative_option . file2 true --no-relative --relative=subdir +test_expect_success 'external diff with --relative' ' + test_when_finished "git reset --hard" && + echo changed >file1 && + echo changed >subdir/file2 && + + write_script mydiff <<-\EOF && + # hacky pretend diff; the goal here is just to make sure we got + # passed sensible input that we _could_ diff, without relying on + # the specific output of a system diff tool. + echo "diff a/$1 b/$1" && + echo "--- a/$1" && + echo "+++ b/$1" && + echo "@@ -1 +0,0 @@" && + sed "s/^/-/" "$2" && + sed "s/^/+/" "$5" + EOF + + cat >expect <<-\EOF && + diff a/file2 b/file2 + --- a/file2 + +++ b/file2 + @@ -1 +0,0 @@ + -other content + +changed + EOF + GIT_EXTERNAL_DIFF=./mydiff git diff --relative=subdir >actual && + test_cmp expect actual +' + test_expect_success 'setup diff --relative unmerged' ' test_commit zero file0 && test_commit base subdir/file0 && diff --git a/t/t4115-apply-symlink.sh b/t/t4115-apply-symlink.sh index d0f3edef54..e95e6d4e7d 100755 --- a/t/t4115-apply-symlink.sh +++ b/t/t4115-apply-symlink.sh @@ -45,4 +45,100 @@ test_expect_success 'apply --index symlink patch' ' ' +test_expect_success 'symlink setup' ' + ln -s .git symlink && + git add symlink && + git commit -m "add symlink" +' + +test_expect_success SYMLINKS 'symlink escape when creating new files' ' + test_when_finished "git reset --hard && git clean -dfx" && + + cat >patch <<-EOF && + diff --git a/symlink b/renamed-symlink + similarity index 100% + rename from symlink + rename to renamed-symlink + -- + diff --git /dev/null b/renamed-symlink/create-me + new file mode 100644 + index 0000000..039727e + --- /dev/null + +++ b/renamed-symlink/create-me + @@ -0,0 +1,1 @@ + +busted + EOF + + test_must_fail git apply patch 2>stderr && + cat >expected_stderr <<-EOF && + error: affected file ${SQ}renamed-symlink/create-me${SQ} is beyond a symbolic link + EOF + test_cmp expected_stderr stderr && + ! test_path_exists .git/create-me +' + +test_expect_success SYMLINKS 'symlink escape when modifying file' ' + test_when_finished "git reset --hard && git clean -dfx" && + touch .git/modify-me && + + cat >patch <<-EOF && + diff --git a/symlink b/renamed-symlink + similarity index 100% + rename from symlink + rename to renamed-symlink + -- + diff --git a/renamed-symlink/modify-me b/renamed-symlink/modify-me + index 1111111..2222222 100644 + --- a/renamed-symlink/modify-me + +++ b/renamed-symlink/modify-me + @@ -0,0 +1,1 @@ + +busted + EOF + + test_must_fail git apply patch 2>stderr && + cat >expected_stderr <<-EOF && + error: renamed-symlink/modify-me: No such file or directory + EOF + test_cmp expected_stderr stderr && + test_must_be_empty .git/modify-me +' + +test_expect_success SYMLINKS 'symlink escape when deleting file' ' + test_when_finished "git reset --hard && git clean -dfx && rm .git/delete-me" && + touch .git/delete-me && + + cat >patch <<-EOF && + diff --git a/symlink b/renamed-symlink + similarity index 100% + rename from symlink + rename to renamed-symlink + -- + diff --git a/renamed-symlink/delete-me b/renamed-symlink/delete-me + deleted file mode 100644 + index 1111111..0000000 100644 + EOF + + test_must_fail git apply patch 2>stderr && + cat >expected_stderr <<-EOF && + error: renamed-symlink/delete-me: No such file or directory + EOF + test_cmp expected_stderr stderr && + test_path_is_file .git/delete-me +' + +test_expect_success SYMLINKS '--reject removes .rej symlink if it exists' ' + test_when_finished "git reset --hard && git clean -dfx" && + + test_commit file && + echo modified >file.t && + git diff -- file.t >patch && + echo modified-again >file.t && + + ln -s foo file.t.rej && + test_must_fail git apply patch --reject 2>err && + test_i18ngrep "Rejected hunk" err && + test_path_is_missing foo && + test_path_is_file file.t.rej +' + test_done diff --git a/t/t4205-log-pretty-formats.sh b/t/t4205-log-pretty-formats.sh index e448ef2928..3e7ad9d5de 100755 --- a/t/t4205-log-pretty-formats.sh +++ b/t/t4205-log-pretty-formats.sh @@ -156,7 +156,7 @@ test_expect_success 'NUL termination with --reflog --pretty=oneline' ' for r in $revs do git show -s --pretty=oneline "$r" >raw && - cat raw | lf_to_nul || exit 1 + cat raw | lf_to_nul || return 1 done >expect && # the trailing NUL is already produced so we do not need to # output another one @@ -1018,4 +1018,80 @@ test_expect_success '%(describe:abbrev=...) vs git describe --abbrev=...' ' test_cmp expect actual ' +test_expect_success 'log --pretty with space stealing' ' + printf mm0 >expect && + git log -1 --pretty="format:mm%>>|(1)%x30" >actual && + test_cmp expect actual +' + +test_expect_success 'log --pretty with invalid padding format' ' + printf "%s%%<(20" "$(git rev-parse HEAD)" >expect && + git log -1 --pretty="format:%H%<(20" >actual && + test_cmp expect actual +' + +test_expect_success 'log --pretty with magical wrapping directives' ' + commit_id=$(git commit-tree HEAD^{tree} -m "describe me") && + git tag describe-me $commit_id && + printf "\n(tag:\ndescribe-me)%%+w(2)" >expect && + git log -1 --pretty="format:%w(1)%+d%+w(2)" $commit_id >actual && + test_cmp expect actual +' + +test_expect_success SIZE_T_IS_64BIT 'log --pretty with overflowing wrapping directive' ' + printf "%%w(2147483649,1,1)0" >expect && + git log -1 --pretty="format:%w(2147483649,1,1)%x30" >actual && + test_cmp expect actual && + printf "%%w(1,2147483649,1)0" >expect && + git log -1 --pretty="format:%w(1,2147483649,1)%x30" >actual && + test_cmp expect actual && + printf "%%w(1,1,2147483649)0" >expect && + git log -1 --pretty="format:%w(1,1,2147483649)%x30" >actual && + test_cmp expect actual +' + +test_expect_success SIZE_T_IS_64BIT 'log --pretty with overflowing padding directive' ' + printf "%%<(2147483649)0" >expect && + git log -1 --pretty="format:%<(2147483649)%x30" >actual && + test_cmp expect actual +' + +test_expect_success 'log --pretty with padding and preceding control chars' ' + printf "\20\20 0" >expect && + git log -1 --pretty="format:%x10%x10%>|(4)%x30" >actual && + test_cmp expect actual +' + +test_expect_success 'log --pretty truncation with control chars' ' + test_commit "$(printf "\20\20\20\20xxxx")" file contents commit-with-control-chars && + printf "\20\20\20\20x.." >expect && + git log -1 --pretty="format:%<(3,trunc)%s" commit-with-control-chars >actual && + test_cmp expect actual +' + +test_expect_success EXPENSIVE,SIZE_T_IS_64BIT 'log --pretty with huge commit message' ' + # We only assert that this command does not crash. This needs to be + # executed with the address sanitizer to demonstrate failure. + git log -1 --pretty="format:%>(2147483646)%x41%41%>(2147483646)%x41" >/dev/null +' + +test_expect_success EXPENSIVE,SIZE_T_IS_64BIT 'set up huge commit' ' + test-tool genzeros 2147483649 | tr "\000" "1" >expect && + huge_commit=$(git commit-tree -F expect HEAD^{tree}) +' + +test_expect_success EXPENSIVE,SIZE_T_IS_64BIT 'log --pretty with huge commit message' ' + git log -1 --format="%B%<(1)%x30" $huge_commit >actual && + echo 0 >>expect && + test_cmp expect actual +' + +test_expect_success EXPENSIVE,SIZE_T_IS_64BIT 'log --pretty with huge commit message does not cause allocation failure' ' + test_must_fail git log -1 --format="%<(1)%B" $huge_commit 2>error && + cat >expect <<-EOF && + fatal: number too large to represent as int on this platform: 2147483649 + EOF + test_cmp expect error +' + test_done diff --git a/t/t4211-line-log.sh b/t/t4211-line-log.sh index ac9e4d0928..c6540e822f 100755 --- a/t/t4211-line-log.sh +++ b/t/t4211-line-log.sh @@ -315,4 +315,26 @@ test_expect_success 'line-log with --before' ' test_cmp expect actual ' +test_expect_success 'setup tests for zero-width regular expressions' ' + cat >expect <<-EOF + Modify func1() in file.c + Add func1() and func2() in file.c + EOF +' + +test_expect_success 'zero-width regex $ matches any function name' ' + git log --format="%s" --no-patch "-L:$:file.c" >actual && + test_cmp expect actual +' + +test_expect_success 'zero-width regex ^ matches any function name' ' + git log --format="%s" --no-patch "-L:^:file.c" >actual && + test_cmp expect actual +' + +test_expect_success 'zero-width regex .* matches any function name' ' + git log --format="%s" --no-patch "-L:.*:file.c" >actual && + test_cmp expect actual +' + test_done diff --git a/t/t5304-prune.sh b/t/t5304-prune.sh index 8ae314af58..d65a5f94b4 100755 --- a/t/t5304-prune.sh +++ b/t/t5304-prune.sh @@ -29,6 +29,14 @@ test_expect_success setup ' git gc ' +test_expect_success 'bare repo prune is quiet without $GIT_DIR/objects/pack' ' + git clone -q --shared --template= --bare . bare.git && + rmdir bare.git/objects/pack && + git --git-dir=bare.git prune --no-progress 2>prune.err && + test_must_be_empty prune.err && + rm -r bare.git prune.err +' + test_expect_success 'prune stale packs' ' orig_pack=$(echo .git/objects/pack/*.pack) && >.git/objects/tmp_1.pack && diff --git a/t/t5314-pack-cycle-detection.sh b/t/t5314-pack-cycle-detection.sh index 73a241743a..82734b9a3c 100755 --- a/t/t5314-pack-cycle-detection.sh +++ b/t/t5314-pack-cycle-detection.sh @@ -63,13 +63,16 @@ TEST_PASSES_SANITIZE_LEAK=true # Note that the two variants of "file" must be similar enough to convince git # to create the delta. make_pack () { - { - printf '%s\n' "-$(git rev-parse $2)" - printf '%s dummy\n' "$(git rev-parse $1:dummy)" - printf '%s file\n' "$(git rev-parse $1:file)" - } | - git pack-objects --stdout | - git index-pack --stdin --fix-thin + ln1=$(git rev-parse "$2") && + ln2=$(git rev-parse "$1:dummy") && + ln3=$(git rev-parse "$1:file") && + cat >list <<-EOF + -$ln1 + $ln2 dummy + $ln3 file + EOF + git pack-objects --stdout <list >pack && + git index-pack --stdin --fix-thin <pack } test_expect_success 'setup' ' diff --git a/t/t5516-fetch-push.sh b/t/t5516-fetch-push.sh index 4f2bfaf005..98a27a2948 100755 --- a/t/t5516-fetch-push.sh +++ b/t/t5516-fetch-push.sh @@ -1858,19 +1858,19 @@ test_expect_success 'push with config push.useBitmaps' ' git checkout main && test_unconfig push.useBitmaps && GIT_TRACE2_EVENT="$PWD/default" \ - git push testrepo main:test && + git push --quiet testrepo main:test && test_subcommand git pack-objects --all-progress-implied --revs --stdout \ --thin --delta-base-offset -q <default && test_config push.useBitmaps true && GIT_TRACE2_EVENT="$PWD/true" \ - git push testrepo main:test2 && + git push --quiet testrepo main:test2 && test_subcommand git pack-objects --all-progress-implied --revs --stdout \ --thin --delta-base-offset -q <true && test_config push.useBitmaps false && GIT_TRACE2_EVENT="$PWD/false" \ - git push testrepo main:test3 && + git push --quiet testrepo main:test3 && test_subcommand git pack-objects --all-progress-implied --revs --stdout \ --thin --delta-base-offset -q --no-use-bitmap-index <false ' diff --git a/t/t5526-fetch-submodules.sh b/t/t5526-fetch-submodules.sh index 75da8acf8f..b9546ef8e5 100755 --- a/t/t5526-fetch-submodules.sh +++ b/t/t5526-fetch-submodules.sh @@ -178,6 +178,7 @@ test_expect_success "submodule.recurse option triggers recursive fetch" ' ' test_expect_success "fetch --recurse-submodules -j2 has the same output behaviour" ' + test_when_finished "rm -f trace.out" && add_submodule_commits && ( cd downstream && @@ -705,15 +706,22 @@ test_expect_success "'fetch.recurseSubmodules=on-demand' works also without .git test_expect_success 'fetching submodules respects parallel settings' ' git config fetch.recurseSubmodules true && + test_when_finished "rm -f downstream/trace.out" && ( cd downstream && GIT_TRACE=$(pwd)/trace.out git fetch && grep "1 tasks" trace.out && + >trace.out && + GIT_TRACE=$(pwd)/trace.out git fetch --jobs 7 && grep "7 tasks" trace.out && + >trace.out && + git config submodule.fetchJobs 8 && GIT_TRACE=$(pwd)/trace.out git fetch && grep "8 tasks" trace.out && + >trace.out && + GIT_TRACE=$(pwd)/trace.out git fetch --jobs 9 && grep "9 tasks" trace.out && >trace.out && diff --git a/t/t5531-deep-submodule-push.sh b/t/t5531-deep-submodule-push.sh index 3f58b515ce..302e4cbdba 100755 --- a/t/t5531-deep-submodule-push.sh +++ b/t/t5531-deep-submodule-push.sh @@ -512,6 +512,56 @@ test_expect_success 'push only unpushed submodules recursively' ' test_cmp expected_pub actual_pub ' +setup_subsub () { + git init upstream && + git init upstream/sub && + git init upstream/sub/deepsub && + test_commit -C upstream/sub/deepsub innermost && + git -C upstream/sub submodule add ./deepsub deepsub && + git -C upstream/sub commit -m middle && + git -C upstream submodule add ./sub sub && + git -C upstream commit -m outermost && + + git -c protocol.file.allow=always clone --recurse-submodules upstream downstream && + git -C downstream/sub/deepsub checkout -b downstream-branch && + git -C downstream/sub checkout -b downstream-branch && + git -C downstream checkout -b downstream-branch +} + +new_downstream_commits () { + test_commit -C downstream/sub/deepsub new-innermost && + git -C downstream/sub add deepsub && + git -C downstream/sub commit -m new-middle && + git -C downstream add sub && + git -C downstream commit -m new-outermost +} + +test_expect_success 'push with push.recurseSubmodules=only on superproject' ' + test_when_finished rm -rf upstream downstream && + setup_subsub && + new_downstream_commits && + git -C downstream config push.recurseSubmodules only && + git -C downstream push origin downstream-branch && + + test_must_fail git -C upstream rev-parse refs/heads/downstream-branch && + git -C upstream/sub rev-parse refs/heads/downstream-branch && + test_must_fail git -C upstream/sub/deepsub rev-parse refs/heads/downstream-branch +' + +test_expect_success 'push with push.recurseSubmodules=only on superproject and top-level submodule' ' + test_when_finished rm -rf upstream downstream && + setup_subsub && + new_downstream_commits && + git -C downstream config push.recurseSubmodules only && + git -C downstream/sub config push.recurseSubmodules only && + git -C downstream push origin downstream-branch 2> err && + + test_must_fail git -C upstream rev-parse refs/heads/downstream-branch && + git -C upstream/sub rev-parse refs/heads/downstream-branch && + git -C upstream/sub/deepsub rev-parse refs/heads/downstream-branch && + grep "recursing into submodule with push.recurseSubmodules=only; using on-demand instead" err +' + test_expect_success 'push propagating the remotes name to a submodule' ' git -C work remote add origin ../pub.git && git -C work remote add pub ../pub.git && diff --git a/t/t5541-http-push-smart.sh b/t/t5541-http-push-smart.sh index fbad2d5ff5..d0211cd8be 100755 --- a/t/t5541-http-push-smart.sh +++ b/t/t5541-http-push-smart.sh @@ -36,28 +36,6 @@ test_expect_success 'setup remote repository' ' setup_askpass_helper -cat >exp <<EOF -GET /smart/test_repo.git/info/refs?service=git-upload-pack HTTP/1.1 200 -POST /smart/test_repo.git/git-upload-pack HTTP/1.1 200 -EOF -test_expect_success 'no empty path components' ' - # Clear the log, so that it does not affect the "used receive-pack - # service" test which reads the log too. - test_when_finished ">\"\$HTTPD_ROOT_PATH\"/access.log" && - - # In the URL, add a trailing slash, and see if git appends yet another - # slash. - cd "$ROOT_PATH" && - git clone $HTTPD_URL/smart/test_repo.git/ test_repo_clone && - - # NEEDSWORK: If the overspecification of the expected result is reduced, we - # might be able to run this test in all protocol versions. - if test "$GIT_TEST_PROTOCOL_VERSION" = 0 - then - check_access_log exp - fi -' - test_expect_success 'clone remote repository' ' rm -rf test_repo_clone && git clone $HTTPD_URL/smart/test_repo.git test_repo_clone && @@ -67,6 +45,10 @@ test_expect_success 'clone remote repository' ' ' test_expect_success 'push to remote repository (standard)' ' + # Clear the log, so that the "used receive-pack service" test below + # sees just what we did here. + >"$HTTPD_ROOT_PATH"/access.log && + cd "$ROOT_PATH"/test_repo_clone && : >path2 && git add path2 && @@ -80,6 +62,15 @@ test_expect_success 'push to remote repository (standard)' ' test $HEAD = $(git rev-parse --verify HEAD)) ' +test_expect_success 'used receive-pack service' ' + cat >exp <<-\EOF && + GET /smart/test_repo.git/info/refs?service=git-receive-pack HTTP/1.1 200 + POST /smart/test_repo.git/git-receive-pack HTTP/1.1 200 + EOF + + check_access_log exp +' + test_expect_success 'push to remote repository (standard) with sending Accept-Language' ' cat >exp <<-\EOF && => Send header: Accept-Language: ko-KR, *;q=0.9 @@ -141,28 +132,6 @@ test_expect_success 'rejected update prints status' ' ' rm -f "$HTTPD_DOCUMENT_ROOT_PATH/test_repo.git/hooks/update" -cat >exp <<EOF -GET /smart/test_repo.git/info/refs?service=git-upload-pack HTTP/1.1 200 -POST /smart/test_repo.git/git-upload-pack HTTP/1.1 200 -GET /smart/test_repo.git/info/refs?service=git-receive-pack HTTP/1.1 200 -POST /smart/test_repo.git/git-receive-pack HTTP/1.1 200 -GET /smart/test_repo.git/info/refs?service=git-receive-pack HTTP/1.1 200 -GET /smart/test_repo.git/info/refs?service=git-receive-pack HTTP/1.1 200 -POST /smart/test_repo.git/git-receive-pack HTTP/1.1 200 -GET /smart/test_repo.git/info/refs?service=git-receive-pack HTTP/1.1 200 -POST /smart/test_repo.git/git-receive-pack HTTP/1.1 200 -GET /smart/test_repo.git/info/refs?service=git-receive-pack HTTP/1.1 200 -POST /smart/test_repo.git/git-receive-pack HTTP/1.1 200 -EOF -test_expect_success 'used receive-pack service' ' - # NEEDSWORK: If the overspecification of the expected result is reduced, we - # might be able to run this test in all protocol versions. - if test "$GIT_TEST_PROTOCOL_VERSION" = 0 - then - check_access_log exp - fi -' - test_http_push_nonff "$HTTPD_DOCUMENT_ROOT_PATH"/test_repo.git \ "$ROOT_PATH"/test_repo_clone main success diff --git a/t/t5551-http-fetch-smart.sh b/t/t5551-http-fetch-smart.sh index bc0719a4fc..0908534f25 100755 --- a/t/t5551-http-fetch-smart.sh +++ b/t/t5551-http-fetch-smart.sh @@ -1,6 +1,6 @@ #!/bin/sh -: ${HTTP_PROTO:=HTTP} +: ${HTTP_PROTO:=HTTP/1.1} test_description="test smart fetching over http via http-backend ($HTTP_PROTO)" GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME @@ -33,35 +33,71 @@ test_expect_success 'create http-accessible bare repository' ' setup_askpass_helper test_expect_success 'clone http repository' ' - cat >exp <<-\EOF && - > GET /smart/repo.git/info/refs?service=git-upload-pack HTTP/1.1 - > Accept: */* - > Accept-Encoding: ENCODINGS - > Accept-Language: ko-KR, *;q=0.9 - > Pragma: no-cache - < HTTP/1.1 200 OK - < Pragma: no-cache - < Cache-Control: no-cache, max-age=0, must-revalidate - < Content-Type: application/x-git-upload-pack-advertisement - > POST /smart/repo.git/git-upload-pack HTTP/1.1 - > Accept-Encoding: ENCODINGS - > Content-Type: application/x-git-upload-pack-request - > Accept: application/x-git-upload-pack-result - > Accept-Language: ko-KR, *;q=0.9 - > Content-Length: xxx - < HTTP/1.1 200 OK - < Pragma: no-cache - < Cache-Control: no-cache, max-age=0, must-revalidate - < Content-Type: application/x-git-upload-pack-result + if test_have_prereq HTTP2 && test "$HTTPD_PROTO" = "https" + then + # ALPN lets us immediately use HTTP/2; likewise, POSTs with + # bodies can use it because they do not need to upgrade + INITIAL_PROTO=HTTP/2 + else + # either we are not using HTTP/2, or the initial + # request is sent via HTTP/1.1 and asks for upgrade + INITIAL_PROTO=HTTP/1.1 + fi && + + cat >exp.raw <<-EOF && + > GET /smart/repo.git/info/refs?service=git-upload-pack $INITIAL_PROTO + > accept: */* + > accept-encoding: ENCODINGS + > accept-language: ko-KR, *;q=0.9 + > pragma: no-cache + {V2} > git-protocol: version=2 + < $HTTP_PROTO 200 OK + < pragma: no-cache + < cache-control: no-cache, max-age=0, must-revalidate + < content-type: application/x-git-upload-pack-advertisement + > POST /smart/repo.git/git-upload-pack $INITIAL_PROTO + > accept-encoding: ENCODINGS + > content-type: application/x-git-upload-pack-request + > accept: application/x-git-upload-pack-result + > accept-language: ko-KR, *;q=0.9 + {V2} > git-protocol: version=2 + > content-length: xxx + < $INITIAL_PROTO 200 OK + < pragma: no-cache + < cache-control: no-cache, max-age=0, must-revalidate + < content-type: application/x-git-upload-pack-result + {V2} > POST /smart/repo.git/git-upload-pack $INITIAL_PROTO + {V2} > accept-encoding: ENCODINGS + {V2} > content-type: application/x-git-upload-pack-request + {V2} > accept: application/x-git-upload-pack-result + {V2} > accept-language: ko-KR, *;q=0.9 + {V2} > git-protocol: version=2 + {V2} > content-length: xxx + {V2} < $INITIAL_PROTO 200 OK + {V2} < pragma: no-cache + {V2} < cache-control: no-cache, max-age=0, must-revalidate + {V2} < content-type: application/x-git-upload-pack-result EOF - GIT_TRACE_CURL=true GIT_TEST_PROTOCOL_VERSION=0 LANGUAGE="ko_KR.UTF-8" \ + if test "$GIT_TEST_PROTOCOL_VERSION" = 0 + then + sed "/^{V2}/d" <exp.raw >exp + else + sed "s/^{V2} //" <exp.raw >exp + fi && + + GIT_TRACE_CURL=true LANGUAGE="ko_KR.UTF-8" \ git clone --quiet $HTTPD_URL/smart/repo.git clone 2>err && test_cmp file clone/file && tr '\''\015'\'' Q <err | + perl -pe '\'' + s/(Send|Recv) header: ([A-Za-z0-9-]+):/ + "$1 header: " . lc($2) . ":" + /e; + '\'' | sed -e " s/Q\$// - /^[*] /d + /^[^<=]/d /^== Info:/d /^=> Send header, /d /^=> Send header:$/d @@ -71,6 +107,8 @@ test_expect_success 'clone http repository' ' s/= Recv header:// /^<= Recv data/d /^=> Send data/d + /^<= Recv SSL data/d + /^=> Send SSL data/d /^$/d /^< $/d @@ -78,36 +116,35 @@ test_expect_success 'clone http repository' ' s/^/> / } - /^> User-Agent: /d - /^> Host: /d + /^< HTTP/ { + s/200$/200 OK/ + } + /^< HTTP\\/1.1 101/d + /^[><] connection: /d + /^[><] upgrade: /d + /^> http2-settings: /d + + /^> user-agent: /d + /^> host: /d /^> POST /,$ { /^> Accept: [*]\\/[*]/d } - s/^> Content-Length: .*/> Content-Length: xxx/ + s/^> content-length: .*/> content-length: xxx/ /^> 00..want /d /^> 00.*done/d - /^< Server: /d - /^< Expires: /d - /^< Date: /d - /^< Content-Length: /d - /^< Transfer-Encoding: /d + /^< server: /d + /^< expires: /d + /^< date: /d + /^< content-length: /d + /^< transfer-encoding: /d " >actual && - # NEEDSWORK: If the overspecification of the expected result is reduced, we - # might be able to run this test in all protocol versions. - if test "$GIT_TEST_PROTOCOL_VERSION" = 0 - then - sed -e "s/^> Accept-Encoding: .*/> Accept-Encoding: ENCODINGS/" \ - actual >actual.smudged && - test_cmp exp actual.smudged && - - grep "Accept-Encoding:.*gzip" actual >actual.gzip && - test_line_count = 2 actual.gzip && + sed -e "s/^> accept-encoding: .*/> accept-encoding: ENCODINGS/" \ + actual >actual.smudged && + test_cmp exp actual.smudged && - grep "Accept-Language: ko-KR, *" actual >actual.language && - test_line_count = 2 actual.language - fi + grep "accept-encoding:.*gzip" actual >actual.gzip ' test_expect_success 'fetch changes via http' ' @@ -119,19 +156,9 @@ test_expect_success 'fetch changes via http' ' ' test_expect_success 'used upload-pack service' ' - cat >exp <<-\EOF && - GET /smart/repo.git/info/refs?service=git-upload-pack HTTP/1.1 200 - POST /smart/repo.git/git-upload-pack HTTP/1.1 200 - GET /smart/repo.git/info/refs?service=git-upload-pack HTTP/1.1 200 - POST /smart/repo.git/git-upload-pack HTTP/1.1 200 - EOF - - # NEEDSWORK: If the overspecification of the expected result is reduced, we - # might be able to run this test in all protocol versions. - if test "$GIT_TEST_PROTOCOL_VERSION" = 0 - then - check_access_log exp - fi + strip_access_log >log && + grep "GET /smart/repo.git/info/refs?service=git-upload-pack HTTP/[0-9.]* 200" log && + grep "POST /smart/repo.git/git-upload-pack HTTP/[0-9.]* 200" log ' test_expect_success 'follow redirects (301)' ' @@ -280,21 +307,23 @@ test_expect_success 'cookies stored in http.cookiefile when http.savecookies set 127.0.0.1 FALSE /smart_cookies/ FALSE 0 othername othervalue EOF sort >expect_cookies.txt <<-\EOF && - 127.0.0.1 FALSE /smart_cookies/ FALSE 0 othername othervalue + 127.0.0.1 FALSE /smart_cookies/repo.git/ FALSE 0 name value 127.0.0.1 FALSE /smart_cookies/repo.git/info/ FALSE 0 name value EOF git config http.cookiefile cookies.txt && git config http.savecookies true && - git ls-remote $HTTPD_URL/smart_cookies/repo.git main && - # NEEDSWORK: If the overspecification of the expected result is reduced, we - # might be able to run this test in all protocol versions. - if test "$GIT_TEST_PROTOCOL_VERSION" = 0 - then - tail -3 cookies.txt | sort >cookies_tail.txt && - test_cmp expect_cookies.txt cookies_tail.txt - fi + test_when_finished " + git --git-dir=\"\$HTTPD_DOCUMENT_ROOT_PATH/repo.git\" \ + tag -d cookie-tag + " && + git --git-dir="$HTTPD_DOCUMENT_ROOT_PATH/repo.git" \ + tag -m "foo" cookie-tag && + git fetch $HTTPD_URL/smart_cookies/repo.git cookie-tag && + + grep "^[^#]" cookies.txt | sort >cookies_stripped.txt && + test_cmp expect_cookies.txt cookies_stripped.txt ' test_expect_success 'transfer.hiderefs works over smart-http' ' @@ -666,4 +695,13 @@ test_expect_success 'push warns or fails when using username:password' ' test_line_count -ge 1 warnings ' +test_expect_success 'no empty path components' ' + # In the URL, add a trailing slash, and see if git appends yet another + # slash. + git clone $HTTPD_URL/smart/repo.git/ clone-with-slash && + + strip_access_log >log && + ! grep "//" log +' + test_done diff --git a/t/t5559-http-fetch-smart-http2.sh b/t/t5559-http-fetch-smart-http2.sh index 9eece71c2c..54aa9d3bff 100755 --- a/t/t5559-http-fetch-smart-http2.sh +++ b/t/t5559-http-fetch-smart-http2.sh @@ -1,4 +1,5 @@ #!/bin/sh HTTP_PROTO=HTTP/2 +LIB_HTTPD_SSL=1 . ./t5551-http-fetch-smart.sh diff --git a/t/t5604-clone-reference.sh b/t/t5604-clone-reference.sh index 2734e37e88..7ccebb40c3 100755 --- a/t/t5604-clone-reference.sh +++ b/t/t5604-clone-reference.sh @@ -344,4 +344,20 @@ test_expect_success SYMLINKS 'clone repo with symlinked or unknown files at obje test_must_be_empty T--shared.objects-symlinks.raw ' +test_expect_success SYMLINKS 'clone repo with symlinked objects directory' ' + test_when_finished "rm -fr sensitive malicious" && + + mkdir -p sensitive && + echo "secret" >sensitive/file && + + git init malicious && + rm -fr malicious/.git/objects && + ln -s "$(pwd)/sensitive" ./malicious/.git/objects && + + test_must_fail git clone --local malicious clone 2>err && + + test_path_is_missing clone && + grep "failed to start iterator over" err +' + test_done diff --git a/t/t5619-clone-local-ambiguous-transport.sh b/t/t5619-clone-local-ambiguous-transport.sh new file mode 100755 index 0000000000..cce62bf78d --- /dev/null +++ b/t/t5619-clone-local-ambiguous-transport.sh @@ -0,0 +1,70 @@ +#!/bin/sh + +test_description='test local clone with ambiguous transport' + +. ./test-lib.sh +. "$TEST_DIRECTORY/lib-httpd.sh" + +if ! test_have_prereq SYMLINKS +then + skip_all='skipping test, symlink support unavailable' + test_done +fi + +start_httpd + +REPO="$HTTPD_DOCUMENT_ROOT_PATH/sub.git" +URI="$HTTPD_URL/dumb/sub.git" + +test_expect_success 'setup' ' + mkdir -p sensitive && + echo "secret" >sensitive/secret && + + git init --bare "$REPO" && + test_commit_bulk -C "$REPO" --ref=main 1 && + + git -C "$REPO" update-ref HEAD main && + git -C "$REPO" update-server-info && + + git init malicious && + ( + cd malicious && + + git submodule add "$URI" && + + mkdir -p repo/refs && + touch repo/refs/.gitkeep && + printf "ref: refs/heads/a" >repo/HEAD && + ln -s "$(cd .. && pwd)/sensitive" repo/objects && + + mkdir -p "$HTTPD_URL/dumb" && + ln -s "../../../.git/modules/sub/../../../repo/" "$URI" && + + git add . && + git commit -m "initial commit" + ) && + + # Delete all of the references in our malicious submodule to + # avoid the client attempting to checkout any objects (which + # will be missing, and thus will cause the clone to fail before + # we can trigger the exploit). + git -C "$REPO" for-each-ref --format="delete %(refname)" >in && + git -C "$REPO" update-ref --stdin <in && + git -C "$REPO" update-server-info +' + +test_expect_success 'ambiguous transport does not lead to arbitrary file-inclusion' ' + git clone malicious clone && + test_must_fail git -C clone submodule update --init 2>err && + + test_path_is_missing clone/.git/modules/sub/objects/secret && + # We would actually expect "transport .file. not allowed" here, + # but due to quirks of the URL detection in Git, we mis-parse + # the absolute path as a bogus URL and die before that step. + # + # This works for now, and if we ever fix the URL detection, it + # is OK to change this to detect the transport error. + grep "protocol .* is not supported" err +' + +test_done diff --git a/t/t6018-rev-list-glob.sh b/t/t6018-rev-list-glob.sh index e1abc5c2b3..aabf590dda 100755 --- a/t/t6018-rev-list-glob.sh +++ b/t/t6018-rev-list-glob.sh @@ -187,6 +187,46 @@ test_expect_success 'rev-parse --exclude=ref with --remotes=glob' ' compare rev-parse "--exclude=upstream/x --remotes=upstream/*" "upstream/one upstream/two" ' +for section in receive uploadpack +do + test_expect_success "rev-parse --exclude-hidden=$section with --all" ' + compare "-c transfer.hideRefs=refs/remotes/ rev-parse" "--branches --tags" "--exclude-hidden=$section --all" + ' + + test_expect_success "rev-parse --exclude-hidden=$section with --all" ' + compare "-c transfer.hideRefs=refs/heads/subspace/ rev-parse" "--exclude=refs/heads/subspace/* --all" "--exclude-hidden=$section --all" + ' + + test_expect_success "rev-parse --exclude-hidden=$section with --glob" ' + compare "-c transfer.hideRefs=refs/heads/subspace/ rev-parse" "--exclude=refs/heads/subspace/* --glob=refs/heads/*" "--exclude-hidden=$section --glob=refs/heads/*" + ' + + test_expect_success "rev-parse --exclude-hidden=$section can be passed once per pseudo-ref" ' + compare "-c transfer.hideRefs=refs/remotes/ rev-parse" "--branches --tags --branches --tags" "--exclude-hidden=$section --all --exclude-hidden=$section --all" + ' + + test_expect_success "rev-parse --exclude-hidden=$section can only be passed once per pseudo-ref" ' + echo "fatal: --exclude-hidden= passed more than once" >expected && + test_must_fail git rev-parse --exclude-hidden=$section --exclude-hidden=$section 2>err && + test_cmp expected err + ' + + for pseudoopt in branches tags remotes + do + test_expect_success "rev-parse --exclude-hidden=$section fails with --$pseudoopt" ' + echo "error: --exclude-hidden cannot be used together with --$pseudoopt" >expected && + test_must_fail git rev-parse --exclude-hidden=$section --$pseudoopt 2>err && + test_cmp expected err + ' + + test_expect_success "rev-parse --exclude-hidden=$section fails with --$pseudoopt=pattern" ' + echo "error: --exclude-hidden cannot be used together with --$pseudoopt" >expected && + test_must_fail git rev-parse --exclude-hidden=$section --$pseudoopt=pattern 2>err && + test_cmp expected err + ' + done +done + test_expect_success 'rev-list --exclude=glob with --branches=glob' ' compare rev-list "--exclude=subspace-* --branches=sub*" "subspace/one subspace/two" ' diff --git a/t/t6020-bundle-misc.sh b/t/t6020-bundle-misc.sh index 833205125a..3a1cf30b1d 100755 --- a/t/t6020-bundle-misc.sh +++ b/t/t6020-bundle-misc.sh @@ -11,6 +11,13 @@ export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME . ./test-lib.sh . "$TEST_DIRECTORY"/lib-bundle.sh +for cmd in create verify list-heads unbundle +do + test_expect_success "usage: git bundle $cmd needs an argument" ' + test_expect_code 129 git bundle $cmd + ' +done + # Create a commit or tag and set the variable with the object ID. test_commit_setvar () { notick= diff --git a/t/t6021-rev-list-exclude-hidden.sh b/t/t6021-rev-list-exclude-hidden.sh new file mode 100755 index 0000000000..32b2b09413 --- /dev/null +++ b/t/t6021-rev-list-exclude-hidden.sh @@ -0,0 +1,163 @@ +#!/bin/sh + +test_description='git rev-list --exclude-hidden test' + +. ./test-lib.sh + +test_expect_success 'setup' ' + test_commit_bulk --id=commit --ref=refs/heads/branch 1 && + COMMIT=$(git rev-parse refs/heads/branch) && + test_commit_bulk --id=tag --ref=refs/tags/lightweight 1 && + TAG=$(git rev-parse refs/tags/lightweight) && + test_commit_bulk --id=hidden --ref=refs/hidden/commit 1 && + HIDDEN=$(git rev-parse refs/hidden/commit) && + test_commit_bulk --id=namespace --ref=refs/namespaces/namespace/refs/namespaced/commit 1 && + NAMESPACE=$(git rev-parse refs/namespaces/namespace/refs/namespaced/commit) +' + +test_expect_success 'invalid section' ' + echo "fatal: unsupported section for hidden refs: unsupported" >expected && + test_must_fail git rev-list --exclude-hidden=unsupported 2>err && + test_cmp expected err +' + +for section in receive uploadpack +do + test_expect_success "$section: passed multiple times" ' + echo "fatal: --exclude-hidden= passed more than once" >expected && + test_must_fail git rev-list --exclude-hidden=$section --exclude-hidden=$section 2>err && + test_cmp expected err + ' + + test_expect_success "$section: without hiddenRefs" ' + git rev-list --exclude-hidden=$section --all >out && + cat >expected <<-EOF && + $NAMESPACE + $HIDDEN + $TAG + $COMMIT + EOF + test_cmp expected out + ' + + test_expect_success "$section: hidden via transfer.hideRefs" ' + git -c transfer.hideRefs=refs/hidden/ rev-list --exclude-hidden=$section --all >out && + cat >expected <<-EOF && + $NAMESPACE + $TAG + $COMMIT + EOF + test_cmp expected out + ' + + test_expect_success "$section: hidden via $section.hideRefs" ' + git -c $section.hideRefs=refs/hidden/ rev-list --exclude-hidden=$section --all >out && + cat >expected <<-EOF && + $NAMESPACE + $TAG + $COMMIT + EOF + test_cmp expected out + ' + + test_expect_success "$section: respects both transfer.hideRefs and $section.hideRefs" ' + git -c transfer.hideRefs=refs/tags/ -c $section.hideRefs=refs/hidden/ rev-list --exclude-hidden=$section --all >out && + cat >expected <<-EOF && + $NAMESPACE + $COMMIT + EOF + test_cmp expected out + ' + + test_expect_success "$section: negation without hidden refs marks everything as uninteresting" ' + git rev-list --all --exclude-hidden=$section --not --all >out && + test_must_be_empty out + ' + + test_expect_success "$section: negation with hidden refs marks them as interesting" ' + git -c transfer.hideRefs=refs/hidden/ rev-list --all --exclude-hidden=$section --not --all >out && + cat >expected <<-EOF && + $HIDDEN + EOF + test_cmp expected out + ' + + test_expect_success "$section: hidden refs and excludes work together" ' + git -c transfer.hideRefs=refs/hidden/ rev-list --exclude=refs/tags/* --exclude-hidden=$section --all >out && + cat >expected <<-EOF && + $NAMESPACE + $COMMIT + EOF + test_cmp expected out + ' + + test_expect_success "$section: excluded hidden refs get reset" ' + git -c transfer.hideRefs=refs/ rev-list --exclude-hidden=$section --all --all >out && + cat >expected <<-EOF && + $NAMESPACE + $HIDDEN + $TAG + $COMMIT + EOF + test_cmp expected out + ' + + test_expect_success "$section: excluded hidden refs can be used with multiple pseudo-refs" ' + git -c transfer.hideRefs=refs/ rev-list --exclude-hidden=$section --all --exclude-hidden=$section --all >out && + test_must_be_empty out + ' + + test_expect_success "$section: works with --glob" ' + git -c transfer.hideRefs=refs/hidden/ rev-list --exclude-hidden=$section --glob=refs/h* >out && + cat >expected <<-EOF && + $COMMIT + EOF + test_cmp expected out + ' + + test_expect_success "$section: operates on stripped refs by default" ' + GIT_NAMESPACE=namespace git -c transfer.hideRefs=refs/namespaced/ rev-list --exclude-hidden=$section --all >out && + cat >expected <<-EOF && + $HIDDEN + $TAG + $COMMIT + EOF + test_cmp expected out + ' + + test_expect_success "$section: does not hide namespace by default" ' + GIT_NAMESPACE=namespace git -c transfer.hideRefs=refs/namespaces/namespace/ rev-list --exclude-hidden=$section --all >out && + cat >expected <<-EOF && + $NAMESPACE + $HIDDEN + $TAG + $COMMIT + EOF + test_cmp expected out + ' + + test_expect_success "$section: can operate on unstripped refs" ' + GIT_NAMESPACE=namespace git -c transfer.hideRefs=^refs/namespaces/namespace/ rev-list --exclude-hidden=$section --all >out && + cat >expected <<-EOF && + $HIDDEN + $TAG + $COMMIT + EOF + test_cmp expected out + ' + + for pseudoopt in remotes branches tags + do + test_expect_success "$section: fails with --$pseudoopt" ' + test_must_fail git rev-list --exclude-hidden=$section --$pseudoopt 2>err && + test_i18ngrep "error: --exclude-hidden cannot be used together with --$pseudoopt" err + ' + + test_expect_success "$section: fails with --$pseudoopt=pattern" ' + test_must_fail git rev-list --exclude-hidden=$section --$pseudoopt=pattern 2>err && + test_i18ngrep "error: --exclude-hidden cannot be used together with --$pseudoopt" err + ' + done +done + +test_done diff --git a/t/t6030-bisect-porcelain.sh b/t/t6030-bisect-porcelain.sh index 83931d482f..6dbbe62eb2 100755 --- a/t/t6030-bisect-porcelain.sh +++ b/t/t6030-bisect-porcelain.sh @@ -266,6 +266,16 @@ test_expect_success '"git bisect run" simple case' ' git bisect reset ' +# We want to make sure no arguments has been eaten +test_expect_success '"git bisect run" simple case' ' + git bisect start && + git bisect good $HASH1 && + git bisect bad $HASH4 && + git bisect run printf "%s %s\n" reset --bisect-skip >my_bisect_log.txt && + grep -e "reset --bisect-skip" my_bisect_log.txt && + git bisect reset +' + # We want to automatically find the commit that # added "Ciao" into hello. test_expect_success '"git bisect run" with more complex "git bisect start"' ' diff --git a/t/t6102-rev-list-unexpected-objects.sh b/t/t6102-rev-list-unexpected-objects.sh index 4a9a4436e2..9350b5fd2c 100755 --- a/t/t6102-rev-list-unexpected-objects.sh +++ b/t/t6102-rev-list-unexpected-objects.sh @@ -121,8 +121,8 @@ test_expect_success 'setup unexpected non-blob tag' ' tag=$(git hash-object -w --literally -t tag broken-tag) ' -test_expect_success 'TODO (should fail!): traverse unexpected non-blob tag (lone)' ' - git rev-list --objects $tag +test_expect_success 'traverse unexpected non-blob tag (lone)' ' + test_must_fail git rev-list --objects $tag ' test_expect_success 'traverse unexpected non-blob tag (seen)' ' diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh index 8c37bceb33..d72cef8826 100755 --- a/t/t7001-mv.sh +++ b/t/t7001-mv.sh @@ -60,8 +60,8 @@ test_expect_success 'checking the commit' ' test_expect_success 'mv --dry-run does not move file' ' git mv -n path0/COPYING MOVED && - test -f path0/COPYING && - test ! -f MOVED + test_path_is_file path0/COPYING && + test_path_is_missing MOVED ' test_expect_success 'checking -k on non-existing file' ' @@ -71,25 +71,25 @@ test_expect_success 'checking -k on non-existing file' ' test_expect_success 'checking -k on untracked file' ' >untracked1 && git mv -k untracked1 path0 && - test -f untracked1 && - test ! -f path0/untracked1 + test_path_is_file untracked1 && + test_path_is_missing path0/untracked1 ' test_expect_success 'checking -k on multiple untracked files' ' >untracked2 && git mv -k untracked1 untracked2 path0 && - test -f untracked1 && - test -f untracked2 && - test ! -f path0/untracked1 && - test ! -f path0/untracked2 + test_path_is_file untracked1 && + test_path_is_file untracked2 && + test_path_is_missing path0/untracked1 && + test_path_is_missing path0/untracked2 ' test_expect_success 'checking -f on untracked file with existing target' ' >path0/untracked1 && test_must_fail git mv -f untracked1 path0 && - test ! -f .git/index.lock && - test -f untracked1 && - test -f path0/untracked1 + test_path_is_missing .git/index.lock && + test_path_is_file untracked1 && + test_path_is_file path0/untracked1 ' # clean up the mess in case bad things happen @@ -215,8 +215,8 @@ test_expect_success 'absolute pathname' ' git add sub/file && git mv sub "$(pwd)/in" && - ! test -d sub && - test -d in && + test_path_is_missing sub && + test_path_is_dir in && git ls-files --error-unmatch in/file ) ' @@ -234,8 +234,8 @@ test_expect_success 'absolute pathname outside should fail' ' git add sub/file && test_must_fail git mv sub "$out/out" && - test -d sub && - ! test -d ../in && + test_path_is_dir sub && + test_path_is_missing ../in && git ls-files --error-unmatch sub/file ) ' @@ -295,8 +295,8 @@ test_expect_success 'git mv should overwrite symlink to a file' ' git add moved && test_must_fail git mv moved symlink && git mv -f moved symlink && - ! test -e moved && - test -f symlink && + test_path_is_missing moved && + test_path_is_file symlink && test "$(cat symlink)" = 1 && git update-index --refresh && git diff-files --quiet @@ -312,13 +312,13 @@ test_expect_success 'git mv should overwrite file with a symlink' ' git add moved && test_must_fail git mv symlink moved && git mv -f symlink moved && - ! test -e symlink && + test_path_is_missing symlink && git update-index --refresh && git diff-files --quiet ' test_expect_success SYMLINKS 'check moved symlink' ' - test -h moved + test_path_is_symlink moved ' rm -f moved symlink @@ -352,7 +352,7 @@ test_expect_success 'git mv moves a submodule with a .git directory and no .gitm ) && mkdir mod && git mv sub mod/sub && - ! test -e sub && + test_path_is_missing sub && test "$entry" = "$(git ls-files --stage mod/sub | cut -f 1)" && git -C mod/sub status && git update-index --refresh && @@ -372,7 +372,7 @@ test_expect_success 'git mv moves a submodule with a .git directory and .gitmodu ) && mkdir mod && git mv sub mod/sub && - ! test -e sub && + test_path_is_missing sub && test "$entry" = "$(git ls-files --stage mod/sub | cut -f 1)" && git -C mod/sub status && echo mod/sub >expected && @@ -389,7 +389,7 @@ test_expect_success 'git mv moves a submodule with gitfile' ' entry="$(git ls-files --stage sub | cut -f 1)" && mkdir mod && git -C mod mv ../sub/ . && - ! test -e sub && + test_path_is_missing sub && test "$entry" = "$(git ls-files --stage mod/sub | cut -f 1)" && git -C mod/sub status && echo mod/sub >expected && @@ -408,7 +408,7 @@ test_expect_success 'mv does not complain when no .gitmodules file is found' ' mkdir mod && git mv sub mod/sub 2>actual.err && test_must_be_empty actual.err && - ! test -e sub && + test_path_is_missing sub && test "$entry" = "$(git ls-files --stage mod/sub | cut -f 1)" && git -C mod/sub status && git update-index --refresh && @@ -423,13 +423,13 @@ test_expect_success 'mv will error out on a modified .gitmodules file unless sta entry="$(git ls-files --stage sub | cut -f 1)" && mkdir mod && test_must_fail git mv sub mod/sub 2>actual.err && - test -s actual.err && - test -e sub && + test_file_not_empty actual.err && + test_path_exists sub && git diff-files --quiet -- sub && git add .gitmodules && git mv sub mod/sub 2>actual.err && test_must_be_empty actual.err && - ! test -e sub && + test_path_is_missing sub && test "$entry" = "$(git ls-files --stage mod/sub | cut -f 1)" && git -C mod/sub status && git update-index --refresh && @@ -447,7 +447,7 @@ test_expect_success 'mv issues a warning when section is not found in .gitmodule mkdir mod && git mv sub mod/sub 2>actual.err && test_cmp expect.err actual.err && - ! test -e sub && + test_path_is_missing sub && test "$entry" = "$(git ls-files --stage mod/sub | cut -f 1)" && git -C mod/sub status && git update-index --refresh && @@ -460,7 +460,7 @@ test_expect_success 'mv --dry-run does not touch the submodule or .gitmodules' ' git submodule update && mkdir mod && git mv -n sub mod/sub 2>actual.err && - test -f sub/.git && + test_path_is_file sub/.git && git diff-index --exit-code HEAD && git update-index --refresh && git diff-files --quiet -- sub .gitmodules @@ -474,10 +474,10 @@ test_expect_success 'checking out a commit before submodule moved needs manual u git status -s sub2 >actual && echo "?? sub2/" >expected && test_cmp expected actual && - ! test -f sub/.git && - test -f sub2/.git && + test_path_is_missing sub/.git && + test_path_is_file sub2/.git && git submodule update && - test -f sub/.git && + test_path_is_file sub/.git && rm -rf sub2 && git diff-index --exit-code HEAD && git update-index --refresh && diff --git a/t/t7400-submodule-basic.sh b/t/t7400-submodule-basic.sh index a989aafaf5..eae6a46ef3 100755 --- a/t/t7400-submodule-basic.sh +++ b/t/t7400-submodule-basic.sh @@ -579,6 +579,16 @@ test_expect_success 'status should be "modified" after submodule commit' ' grep "^+$rev2" list ' +test_expect_success '"submodule --cached" command forms should be identical' ' + git submodule status --cached >expect && + + git submodule --cached >actual && + test_cmp expect actual && + + git submodule --cached status >actual && + test_cmp expect actual +' + test_expect_success 'the --cached sha1 should be rev1' ' git submodule --cached status >list && grep "^+$rev1" list diff --git a/t/t7407-submodule-foreach.sh b/t/t7407-submodule-foreach.sh index 59bd150166..8d7b234beb 100755 --- a/t/t7407-submodule-foreach.sh +++ b/t/t7407-submodule-foreach.sh @@ -154,6 +154,11 @@ test_expect_success 'use "submodule foreach" to checkout 2nd level submodule' ' ) ' +test_expect_success 'usage: foreach -- --not-an-option' ' + test_expect_code 1 git submodule foreach -- --not-an-option && + test_expect_code 1 git -C clone2 submodule foreach -- --not-an-option +' + test_expect_success 'use "foreach --recursive" to checkout all submodules' ' ( cd clone2 && diff --git a/t/t7411-submodule-config.sh b/t/t7411-submodule-config.sh index c583c4e373..c0167944ab 100755 --- a/t/t7411-submodule-config.sh +++ b/t/t7411-submodule-config.sh @@ -137,44 +137,44 @@ test_expect_success 'error in history in fetchrecursesubmodule lets continue' ' ) ' -test_expect_success 'reading submodules config from the working tree with "submodule--helper config"' ' +test_expect_success 'reading submodules config from the working tree' ' (cd super && echo "../submodule" >expect && - git submodule--helper config submodule.submodule.url >actual && + test-tool submodule config-list submodule.submodule.url >actual && test_cmp expect actual ) ' -test_expect_success 'unsetting submodules config from the working tree with "submodule--helper config --unset"' ' +test_expect_success 'unsetting submodules config from the working tree' ' (cd super && - git submodule--helper config --unset submodule.submodule.url && - git submodule--helper config submodule.submodule.url >actual && + test-tool submodule config-unset submodule.submodule.url && + test-tool submodule config-list submodule.submodule.url >actual && test_must_be_empty actual ) ' -test_expect_success 'writing submodules config with "submodule--helper config"' ' +test_expect_success 'writing submodules config' ' (cd super && echo "new_url" >expect && - git submodule--helper config submodule.submodule.url "new_url" && - git submodule--helper config submodule.submodule.url >actual && + test-tool submodule config-set submodule.submodule.url "new_url" && + test-tool submodule config-list submodule.submodule.url >actual && test_cmp expect actual ) ' -test_expect_success 'overwriting unstaged submodules config with "submodule--helper config"' ' +test_expect_success 'overwriting unstaged submodules config' ' test_when_finished "git -C super checkout .gitmodules" && (cd super && echo "newer_url" >expect && - git submodule--helper config submodule.submodule.url "newer_url" && - git submodule--helper config submodule.submodule.url >actual && + test-tool submodule config-set submodule.submodule.url "newer_url" && + test-tool submodule config-list submodule.submodule.url >actual && test_cmp expect actual ) ' test_expect_success 'writeable .gitmodules when it is in the working tree' ' - git -C super submodule--helper config --check-writeable + test-tool -C super submodule config-writeable ' test_expect_success 'writeable .gitmodules when it is nowhere in the repository' ' @@ -183,7 +183,7 @@ test_expect_success 'writeable .gitmodules when it is nowhere in the repository' (cd super && git rm .gitmodules && git commit -m "remove .gitmodules from the current branch" && - git submodule--helper config --check-writeable + test-tool submodule config-writeable ) ' @@ -191,7 +191,7 @@ test_expect_success 'non-writeable .gitmodules when it is in the index but not i test_when_finished "git -C super checkout .gitmodules" && (cd super && rm -f .gitmodules && - test_must_fail git submodule--helper config --check-writeable + test_must_fail test-tool submodule config-writeable ) ' @@ -200,7 +200,7 @@ test_expect_success 'non-writeable .gitmodules when it is in the current branch test_when_finished "git -C super reset --hard $ORIG" && (cd super && git rm .gitmodules && - test_must_fail git submodule--helper config --check-writeable + test_must_fail test-tool submodule config-writeable ) ' @@ -208,11 +208,11 @@ test_expect_success 'reading submodules config from the index when .gitmodules i ORIG=$(git -C super rev-parse HEAD) && test_when_finished "git -C super reset --hard $ORIG" && (cd super && - git submodule--helper config submodule.submodule.url "staged_url" && + test-tool submodule config-set submodule.submodule.url "staged_url" && git add .gitmodules && rm -f .gitmodules && echo "staged_url" >expect && - git submodule--helper config submodule.submodule.url >actual && + test-tool submodule config-list submodule.submodule.url >actual && test_cmp expect actual ) ' @@ -223,7 +223,7 @@ test_expect_success 'reading submodules config from the current branch when .git (cd super && git rm .gitmodules && echo "../submodule" >expect && - git submodule--helper config submodule.submodule.url >actual && + test-tool submodule config-list submodule.submodule.url >actual && test_cmp expect actual ) ' diff --git a/t/t7418-submodule-sparse-gitmodules.sh b/t/t7418-submodule-sparse-gitmodules.sh index d5874200fd..dde11ecce8 100755 --- a/t/t7418-submodule-sparse-gitmodules.sh +++ b/t/t7418-submodule-sparse-gitmodules.sh @@ -50,12 +50,12 @@ test_expect_success 'sparse checkout setup which hides .gitmodules' ' test_expect_success 'reading gitmodules config file when it is not checked out' ' echo "../submodule" >expect && - git -C super submodule--helper config submodule.submodule.url >actual && + test-tool -C super submodule config-list submodule.submodule.url >actual && test_cmp expect actual ' test_expect_success 'not writing gitmodules config file when it is not checked out' ' - test_must_fail git -C super submodule--helper config submodule.submodule.url newurl && + test_must_fail test-tool -C super submodule config-set submodule.submodule.url newurl && test_path_is_missing super/.gitmodules ' diff --git a/t/t7422-submodule-output.sh b/t/t7422-submodule-output.sh new file mode 100755 index 0000000000..ab946ec940 --- /dev/null +++ b/t/t7422-submodule-output.sh @@ -0,0 +1,170 @@ +#!/bin/sh + +test_description='submodule --cached, --quiet etc. output' + +TEST_PASSES_SANITIZE_LEAK=true +. ./test-lib.sh +. "$TEST_DIRECTORY"/lib-t3100.sh + +setup_sub () { + local d="$1" && + shift && + git $@ clone . "$d" && + git $@ submodule add ./"$d" +} + +normalize_status () { + sed -e 's/-g[0-9a-f]*/-gHASH/' +} + +test_expect_success 'setup' ' + test_commit A && + test_commit B && + setup_sub S && + setup_sub S.D && + setup_sub S.C && + setup_sub S.C.D && + setup_sub X && + git add S* && + test_commit C && + + # recursive in X/ + git -C X pull && + GIT_ALLOW_PROTOCOL=file git -C X submodule update --init && + + # dirty + for d in S.D X/S.D + do + echo dirty >"$d"/A.t || return 1 + done && + + # commit (for --cached) + for d in S.C* X/S.C* + do + git -C "$d" reset --hard A || return 1 + done && + + # dirty + for d in S*.D X/S*.D + do + echo dirty >"$d/C2.t" || return 1 + done && + + for ref in A B C + do + # Not different with SHA-1 and SHA-256, just (ab)using + # test_oid_cache as a variable bag to avoid using + # $(git rev-parse ...). + oid=$(git rev-parse $ref) && + test_oid_cache <<-EOF || return 1 + $ref sha1:$oid + $ref sha256:$oid + EOF + done +' + +for opts in "" "status" +do + test_expect_success "git submodule $opts" ' + sed -e "s/^>//" >expect <<-EOF && + > $(test_oid B) S (B) + >+$(test_oid A) S.C (A) + >+$(test_oid A) S.C.D (A) + > $(test_oid B) S.D (B) + >+$(test_oid C) X (C) + EOF + git submodule $opts >actual.raw && + normalize_status <actual.raw >actual && + test_cmp expect actual + ' +done + +for opts in \ + "status --recursive" +do + test_expect_success "git submodule $opts" ' + sed -e "s/^>//" >expect <<-EOF && + > $(test_oid B) S (B) + >+$(test_oid A) S.C (A) + >+$(test_oid A) S.C.D (A) + > $(test_oid B) S.D (B) + >+$(test_oid C) X (C) + > $(test_oid B) X/S (B) + >+$(test_oid A) X/S.C (A) + >+$(test_oid A) X/S.C.D (A) + > $(test_oid B) X/S.D (B) + > $(test_oid B) X/X (B) + EOF + git submodule $opts >actual.raw && + normalize_status <actual.raw >actual && + test_cmp expect actual + ' +done + +for opts in \ + "--quiet" \ + "--quiet status" \ + "status --quiet" +do + test_expect_success "git submodule $opts" ' + git submodule $opts >out && + test_must_be_empty out + ' +done + +for opts in \ + "--cached" \ + "--cached status" \ + "status --cached" +do + test_expect_success "git submodule $opts" ' + sed -e "s/^>//" >expect <<-EOF && + > $(test_oid B) S (B) + >+$(test_oid B) S.C (B) + >+$(test_oid B) S.C.D (B) + > $(test_oid B) S.D (B) + >+$(test_oid B) X (B) + EOF + git submodule $opts >actual.raw && + normalize_status <actual.raw >actual && + test_cmp expect actual + ' +done + +for opts in \ + "--cached --quiet" \ + "--cached --quiet status" \ + "--cached status --quiet" \ + "--quiet status --cached" \ + "status --cached --quiet" +do + test_expect_success "git submodule $opts" ' + git submodule $opts >out && + test_must_be_empty out + ' +done + +for opts in \ + "status --cached --recursive" \ + "--cached status --recursive" +do + test_expect_success "git submodule $opts" ' + sed -e "s/^>//" >expect <<-EOF && + > $(test_oid B) S (B) + >+$(test_oid B) S.C (B) + >+$(test_oid B) S.C.D (B) + > $(test_oid B) S.D (B) + >+$(test_oid B) X (B) + > $(test_oid B) X/S (B) + >+$(test_oid B) X/S.C (B) + >+$(test_oid B) X/S.C.D (B) + > $(test_oid B) X/S.D (B) + > $(test_oid B) X/X (B) + EOF + git submodule $opts >actual.raw && + normalize_status <actual.raw >actual && + test_cmp expect actual + ' +done + +test_done diff --git a/t/t7600-merge.sh b/t/t7600-merge.sh index 7c3f6ed994..060e145957 100755 --- a/t/t7600-merge.sh +++ b/t/t7600-merge.sh @@ -105,7 +105,7 @@ verify_mergeheads () { test_write_lines "$@" >mergehead.expected && while read sha1 rest do - git rev-parse $sha1 + git rev-parse $sha1 || return 1 done <.git/MERGE_HEAD >mergehead.actual && test_cmp mergehead.expected mergehead.actual } diff --git a/t/t7610-mergetool.sh b/t/t7610-mergetool.sh index 8cc64729ad..7b957022f1 100755 --- a/t/t7610-mergetool.sh +++ b/t/t7610-mergetool.sh @@ -33,7 +33,7 @@ test_expect_success 'setup' ' git add foo && git commit -m "Add foo" ) && - git submodule add git://example.com/submod submod && + git submodule add file:///dev/null submod && git add file1 "spaced name" file1[1-4] subdir/file3 .gitmodules submod && git commit -m "add initial versions" && @@ -614,7 +614,7 @@ test_expect_success 'submodule in subdirectory' ' ) ) && test_when_finished "rm -rf subdir/subdir_module" && - git submodule add git://example.com/subsubmodule subdir/subdir_module && + git submodule add file:///dev/null subdir/subdir_module && git add subdir/subdir_module && git commit -m "add submodule in subdirectory" && diff --git a/t/t7700-repack.sh b/t/t7700-repack.sh index 5be483bf88..4aabe98139 100755 --- a/t/t7700-repack.sh +++ b/t/t7700-repack.sh @@ -90,6 +90,22 @@ test_expect_success 'loose objects in alternate ODB are not repacked' ' test_has_duplicate_object false ' +test_expect_success SYMLINKS '--local keeps packs when alternate is objectdir ' ' + test_when_finished "rm -rf repo" && + git init repo && + test_commit -C repo A && + ( + cd repo && + git repack -a && + ls .git/objects/pack/*.pack >../expect && + ln -s objects .git/alt_objects && + echo "$(pwd)/.git/alt_objects" >.git/objects/info/alternates && + git repack -a -d -l && + ls .git/objects/pack/*.pack >../actual + ) && + test_cmp expect actual +' + test_expect_success 'packed obs in alt ODB are repacked even when local repo is packless' ' mkdir alt_objects/pack && mv .git/objects/pack/* alt_objects/pack && @@ -543,4 +559,125 @@ test_expect_success '-n overrides repack.updateServerInfo=true' ' test_server_info_missing ' +test_expect_success '--expire-to stores pruned objects (now)' ' + git init expire-to-now && + ( + cd expire-to-now && + + git branch -M main && + + test_commit base && + + git checkout -b cruft && + test_commit --no-tag cruft && + + git rev-list --objects --no-object-names main..cruft >moved.raw && + sort moved.raw >moved.want && + + git rev-list --all --objects --no-object-names >expect.raw && + sort expect.raw >expect && + + git checkout main && + git branch -D cruft && + git reflog expire --all --expire=all && + + git init --bare expired.git && + git repack -d \ + --cruft --cruft-expiration="now" \ + --expire-to="expired.git/objects/pack/pack" && + + expired="$(ls expired.git/objects/pack/pack-*.idx)" && + test_path_is_file "${expired%.idx}.mtimes" && + + # Since the `--cruft-expiration` is "now", the effective + # behavior is to move _all_ unreachable objects out to + # the location in `--expire-to`. + git show-index <$expired >expired.raw && + cut -d" " -f2 expired.raw | sort >expired.objects && + git rev-list --all --objects --no-object-names \ + >remaining.objects && + + # ...in other words, the combined contents of this + # repository and expired.git should be the same as the + # set of objects we started with. + cat expired.objects remaining.objects | sort >actual && + test_cmp expect actual && + + # The "moved" objects (i.e., those in expired.git) + # should be the same as the cruft objects which were + # expired in the previous step. + test_cmp moved.want expired.objects + ) +' + +test_expect_success '--expire-to stores pruned objects (5.minutes.ago)' ' + git init expire-to-5.minutes.ago && + ( + cd expire-to-5.minutes.ago && + + git branch -M main && + + test_commit base && + + # Create two classes of unreachable objects, one which + # is older than 5 minutes (stale), and another which is + # newer (recent). + for kind in stale recent + do + git checkout -b $kind main && + test_commit --no-tag $kind || return 1 + done && + + git rev-list --objects --no-object-names main..stale >in && + stale="$(git pack-objects $objdir/pack/pack <in)" && + mtime="$(test-tool chmtime --get =-600 $objdir/pack/pack-$stale.pack)" && + + # expect holds the set of objects we expect to find in + # this repository after repacking + git rev-list --objects --no-object-names recent >expect.raw && + sort expect.raw >expect && + + # moved.want holds the set of objects we expect to find + # in expired.git + git rev-list --objects --no-object-names main..stale >out && + sort out >moved.want && + + git checkout main && + git branch -D stale recent && + git reflog expire --all --expire=all && + git prune-packed && + + git init --bare expired.git && + git repack -d \ + --cruft --cruft-expiration=5.minutes.ago \ + --expire-to="expired.git/objects/pack/pack" && + + # Some of the remaining objects in this repository are + # unreachable, so use `cat-file --batch-all-objects` + # instead of `rev-list` to get their names + git cat-file --batch-all-objects --batch-check="%(objectname)" \ + >remaining.objects && + sort remaining.objects >actual && + test_cmp expect actual && + + ( + cd expired.git && + + expired="$(ls objects/pack/pack-*.mtimes)" && + test-tool pack-mtimes $(basename $expired) >out && + cut -d" " -f1 out | sort >../moved.got && + + # Ensure that there are as many objects with the + # expected mtime as were moved to expired.git. + # + # In other words, ensure that the recorded + # mtimes of any moved objects was written + # correctly. + grep " $mtime$" out >matching && + test_line_count = $(wc -l <../moved.want) matching + ) && + test_cmp moved.want moved.got + ) +' + test_done diff --git a/t/t7900-maintenance.sh b/t/t7900-maintenance.sh index 96bdd42045..823331e44a 100755 --- a/t/t7900-maintenance.sh +++ b/t/t7900-maintenance.sh @@ -500,9 +500,28 @@ test_expect_success 'register and unregister' ' git config --global --get-all maintenance.repo >actual && test_cmp before actual && + git config --file ./other --add maintenance.repo /existing1 && + git config --file ./other --add maintenance.repo /existing2 && + git config --file ./other --get-all maintenance.repo >before && + + git maintenance register --config-file ./other && + test_cmp_config false maintenance.auto && + git config --file ./other --get-all maintenance.repo >between && + cp before expect && + pwd >>expect && + test_cmp expect between && + + git maintenance unregister --config-file ./other && + git config --file ./other --get-all maintenance.repo >actual && + test_cmp before actual && + test_must_fail git maintenance unregister 2>err && grep "is not registered" err && - git maintenance unregister --force + git maintenance unregister --force && + + test_must_fail git maintenance unregister --config-file ./other 2>err && + grep "is not registered" err && + git maintenance unregister --config-file ./other --force ' test_expect_success !MINGW 'register and unregister with regex metacharacters' ' diff --git a/t/t9210-scalar.sh b/t/t9210-scalar.sh index be51a8bb7a..25f500cf68 100755 --- a/t/t9210-scalar.sh +++ b/t/t9210-scalar.sh @@ -166,6 +166,20 @@ test_expect_success 'scalar reconfigure' ' test true = "$(git -C one/src config core.preloadIndex)" ' +test_expect_success '`reconfigure -a` removes stale config entries' ' + git init stale/src && + scalar register stale && + scalar list >scalar.repos && + grep stale scalar.repos && + + grep -v stale scalar.repos >expect && + + rm -rf stale && + scalar reconfigure -a && + scalar list >scalar.repos && + test_cmp expect scalar.repos +' + test_expect_success 'scalar delete without enlistment shows a usage' ' test_expect_code 129 scalar delete ' diff --git a/unpack-trees.c b/unpack-trees.c index bae812156c..d11bef96bf 100644 --- a/unpack-trees.c +++ b/unpack-trees.c @@ -19,7 +19,6 @@ #include "promisor-remote.h" #include "entry.h" #include "parallel-checkout.h" -#include "sparse-index.h" /* * Error messages expected by scripts out of plumbing commands such as @@ -2043,7 +2042,8 @@ int unpack_trees(unsigned len, struct tree_desc *t, struct unpack_trees_options if (!ret) { if (git_env_bool("GIT_TEST_CHECK_CACHE_TREE", 0)) cache_tree_verify(the_repository, &o->result); - if (!cache_tree_fully_valid(o->result.cache_tree)) + if (!o->skip_cache_tree_update && + !cache_tree_fully_valid(o->result.cache_tree)) cache_tree_update(&o->result, WRITE_TREE_SILENT | WRITE_TREE_REPAIR); diff --git a/unpack-trees.h b/unpack-trees.h index efb9edfbb2..6ab0d74c84 100644 --- a/unpack-trees.h +++ b/unpack-trees.h @@ -71,7 +71,8 @@ struct unpack_trees_options { quiet, exiting_early, show_all_errors, - dry_run; + dry_run, + skip_cache_tree_update; enum unpack_trees_reset_type reset; const char *prefix; int cache_bottom; diff --git a/upload-pack.c b/upload-pack.c index 0b8311bd68..551f22ffa5 100644 --- a/upload-pack.c +++ b/upload-pack.c @@ -62,6 +62,7 @@ struct upload_pack_data { struct object_array have_obj; struct oid_array haves; /* v2 only */ struct string_list wanted_refs; /* v2 only */ + struct string_list hidden_refs; struct object_array shallows; struct string_list deepen_not; @@ -118,6 +119,7 @@ static void upload_pack_data_init(struct upload_pack_data *data) { struct string_list symref = STRING_LIST_INIT_DUP; struct string_list wanted_refs = STRING_LIST_INIT_DUP; + struct string_list hidden_refs = STRING_LIST_INIT_DUP; struct object_array want_obj = OBJECT_ARRAY_INIT; struct object_array have_obj = OBJECT_ARRAY_INIT; struct oid_array haves = OID_ARRAY_INIT; @@ -130,6 +132,7 @@ static void upload_pack_data_init(struct upload_pack_data *data) memset(data, 0, sizeof(*data)); data->symref = symref; data->wanted_refs = wanted_refs; + data->hidden_refs = hidden_refs; data->want_obj = want_obj; data->have_obj = have_obj; data->haves = haves; @@ -151,6 +154,7 @@ static void upload_pack_data_clear(struct upload_pack_data *data) { string_list_clear(&data->symref, 1); string_list_clear(&data->wanted_refs, 1); + string_list_clear(&data->hidden_refs, 0); object_array_clear(&data->want_obj); object_array_clear(&data->have_obj); oid_array_clear(&data->haves); @@ -842,8 +846,8 @@ static void deepen(struct upload_pack_data *data, int depth) * Checking for reachable shallows requires that our refs be * marked with OUR_REF. */ - head_ref_namespaced(check_ref, NULL); - for_each_namespaced_ref(check_ref, NULL); + head_ref_namespaced(check_ref, data); + for_each_namespaced_ref(check_ref, data); get_reachable_list(data, &reachable_shallows); result = get_shallow_commits(&reachable_shallows, @@ -1158,11 +1162,11 @@ static void receive_needs(struct upload_pack_data *data, /* return non-zero if the ref is hidden, otherwise 0 */ static int mark_our_ref(const char *refname, const char *refname_full, - const struct object_id *oid) + const struct object_id *oid, const struct string_list *hidden_refs) { struct object *o = lookup_unknown_object(the_repository, oid); - if (ref_is_hidden(refname, refname_full)) { + if (ref_is_hidden(refname, refname_full, hidden_refs)) { o->flags |= HIDDEN_REF; return 1; } @@ -1171,11 +1175,12 @@ static int mark_our_ref(const char *refname, const char *refname_full, } static int check_ref(const char *refname_full, const struct object_id *oid, - int flag UNUSED, void *cb_data UNUSED) + int flag UNUSED, void *cb_data) { const char *refname = strip_namespace(refname_full); + struct upload_pack_data *data = cb_data; - mark_our_ref(refname, refname_full, oid); + mark_our_ref(refname, refname_full, oid, &data->hidden_refs); return 0; } @@ -1204,7 +1209,7 @@ static int send_ref(const char *refname, const struct object_id *oid, struct object_id peeled; struct upload_pack_data *data = cb_data; - if (mark_our_ref(refname_nons, refname, oid)) + if (mark_our_ref(refname_nons, refname, oid, &data->hidden_refs)) return 0; if (capabilities) { @@ -1327,7 +1332,7 @@ static int upload_pack_config(const char *var, const char *value, void *cb_data) if (parse_object_filter_config(var, value, data) < 0) return -1; - return parse_hide_refs_config(var, value, "uploadpack"); + return parse_hide_refs_config(var, value, "uploadpack", &data->hidden_refs); } static int upload_pack_protected_config(const char *var, const char *value, void *cb_data) @@ -1375,8 +1380,8 @@ void upload_pack(const int advertise_refs, const int stateless_rpc, advertise_shallow_grafts(1); packet_flush(1); } else { - head_ref_namespaced(check_ref, NULL); - for_each_namespaced_ref(check_ref, NULL); + head_ref_namespaced(check_ref, &data); + for_each_namespaced_ref(check_ref, &data); } if (!advertise_refs) { @@ -1441,6 +1446,7 @@ static int parse_want(struct packet_writer *writer, const char *line, static int parse_want_ref(struct packet_writer *writer, const char *line, struct string_list *wanted_refs, + struct string_list *hidden_refs, struct object_array *want_obj) { const char *refname_nons; @@ -1451,7 +1457,7 @@ static int parse_want_ref(struct packet_writer *writer, const char *line, struct strbuf refname = STRBUF_INIT; strbuf_addf(&refname, "%s%s", get_git_namespace(), refname_nons); - if (ref_is_hidden(refname_nons, refname.buf) || + if (ref_is_hidden(refname_nons, refname.buf, hidden_refs) || read_ref(refname.buf, &oid)) { packet_writer_error(writer, "unknown ref %s", refname_nons); die("unknown ref %s", refname_nons); @@ -1508,7 +1514,7 @@ static void process_args(struct packet_reader *request, continue; if (data->allow_ref_in_want && parse_want_ref(&data->writer, arg, &data->wanted_refs, - &data->want_obj)) + &data->hidden_refs, &data->want_obj)) continue; /* process have line */ if (parse_have(arg, &data->haves)) diff --git a/userdiff.c b/userdiff.c index 151d9a5278..e25356a061 100644 --- a/userdiff.c +++ b/userdiff.c @@ -315,7 +315,8 @@ struct find_by_namelen_data { }; static int userdiff_find_by_namelen_cb(struct userdiff_driver *driver, - enum userdiff_driver_type type, void *priv) + enum userdiff_driver_type type UNUSED, + void *priv) { struct find_by_namelen_data *cb_data = priv; @@ -206,26 +206,34 @@ int utf8_width(const char **start, size_t *remainder_p) * string, assuming that the string is utf8. Returns strlen() instead * if the string does not look like a valid utf8 string. */ -int utf8_strnwidth(const char *string, int len, int skip_ansi) +int utf8_strnwidth(const char *string, size_t len, int skip_ansi) { - int width = 0; const char *orig = string; + size_t width = 0; - if (len == -1) - len = strlen(string); while (string && string < orig + len) { - int skip; + int glyph_width; + size_t skip; + while (skip_ansi && (skip = display_mode_esc_sequence_len(string)) != 0) string += skip; - width += utf8_width(&string, NULL); + + glyph_width = utf8_width(&string, NULL); + if (glyph_width > 0) + width += glyph_width; } - return string ? width : len; + + /* + * TODO: fix the interface of this function and `utf8_strwidth()` to + * return `size_t` instead of `int`. + */ + return cast_size_t_to_int(string ? width : len); } int utf8_strwidth(const char *string) { - return utf8_strnwidth(string, -1, 0); + return utf8_strnwidth(string, strlen(string), 0); } int is_utf8(const char *text) @@ -357,51 +365,52 @@ void strbuf_add_wrapped_bytes(struct strbuf *buf, const char *data, int len, void strbuf_utf8_replace(struct strbuf *sb_src, int pos, int width, const char *subst) { - struct strbuf sb_dst = STRBUF_INIT; - char *src = sb_src->buf; - char *end = src + sb_src->len; - char *dst; - int w = 0, subst_len = 0; + const char *src = sb_src->buf, *end = sb_src->buf + sb_src->len; + struct strbuf dst; + int w = 0; - if (subst) - subst_len = strlen(subst); - strbuf_grow(&sb_dst, sb_src->len + subst_len); - dst = sb_dst.buf; + strbuf_init(&dst, sb_src->len); while (src < end) { - char *old; + const char *old; + int glyph_width; size_t n; while ((n = display_mode_esc_sequence_len(src))) { - memcpy(dst, src, n); + strbuf_add(&dst, src, n); src += n; - dst += n; } if (src >= end) break; old = src; - n = utf8_width((const char**)&src, NULL); - if (!src) /* broken utf-8, do nothing */ + glyph_width = utf8_width((const char**)&src, NULL); + if (!src) /* broken utf-8, do nothing */ goto out; - if (n && w >= pos && w < pos + width) { + + /* + * In case we see a control character we copy it into the + * buffer, but don't add it to the width. + */ + if (glyph_width < 0) + glyph_width = 0; + + if (glyph_width && w >= pos && w < pos + width) { if (subst) { - memcpy(dst, subst, subst_len); - dst += subst_len; + strbuf_addstr(&dst, subst); subst = NULL; } - w += n; - continue; + } else { + strbuf_add(&dst, old, src - old); } - memcpy(dst, old, src - old); - dst += src - old; - w += n; + + w += glyph_width; } - strbuf_setlen(&sb_dst, dst - sb_dst.buf); - strbuf_swap(sb_src, &sb_dst); + + strbuf_swap(sb_src, &dst); out: - strbuf_release(&sb_dst); + strbuf_release(&dst); } /* @@ -796,7 +805,7 @@ int skip_utf8_bom(char **text, size_t len) void strbuf_utf8_align(struct strbuf *buf, align_type position, unsigned int width, const char *s) { - int slen = strlen(s); + size_t slen = strlen(s); int display_len = utf8_strnwidth(s, slen, 0); int utf8_compensation = slen - display_len; @@ -7,7 +7,7 @@ typedef unsigned int ucs_char_t; /* assuming 32bit int */ size_t display_mode_esc_sequence_len(const char *s); int utf8_width(const char **start, size_t *remainder_p); -int utf8_strnwidth(const char *string, int len, int skip_ansi); +int utf8_strnwidth(const char *string, size_t len, int skip_ansi); int utf8_strwidth(const char *string); int is_utf8(const char *text); int is_encoding_utf8(const char *name); @@ -252,7 +252,7 @@ unsigned ws_check(const char *line, int len, unsigned ws_rule) return ws_check_emit_1(line, len, ws_rule, NULL, NULL, NULL, NULL); } -int ws_blank_line(const char *line, int len, unsigned ws_rule) +int ws_blank_line(const char *line, int len) { /* * We _might_ want to treat CR differently from other diff --git a/wt-status.c b/wt-status.c index 5813174896..76e37a8088 100644 --- a/wt-status.c +++ b/wt-status.c @@ -438,7 +438,7 @@ static char short_submodule_status(struct wt_status_change_data *d) } static void wt_status_collect_changed_cb(struct diff_queue_struct *q, - struct diff_options *options, + struct diff_options *options UNUSED, void *data) { struct wt_status *s = data; @@ -525,7 +525,7 @@ static int unmerged_mask(struct index_state *istate, const char *path) } static void wt_status_collect_updated_cb(struct diff_queue_struct *q, - struct diff_options *options, + struct diff_options *options UNUSED, void *data) { struct wt_status *s = data; diff --git a/xdiff/xdiffi.c b/xdiff/xdiffi.c index 32652ded2d..344c2dfc3e 100644 --- a/xdiff/xdiffi.c +++ b/xdiff/xdiffi.c @@ -973,7 +973,7 @@ void xdl_free_script(xdchange_t *xscr) { } } -static int xdl_call_hunk_func(xdfenv_t *xe, xdchange_t *xscr, xdemitcb_t *ecb, +static int xdl_call_hunk_func(xdfenv_t *xe UNUSED, xdchange_t *xscr, xdemitcb_t *ecb, xdemitconf_t const *xecfg) { xdchange_t *xch, *xche; diff --git a/xdiff/xemit.c b/xdiff/xemit.c index c4ccd68d47..75f0fe4986 100644 --- a/xdiff/xemit.c +++ b/xdiff/xemit.c @@ -95,7 +95,7 @@ xdchange_t *xdl_get_hunk(xdchange_t **xscr, xdemitconf_t const *xecfg) } -static long def_ff(const char *rec, long len, char *buf, long sz, void *priv) +static long def_ff(const char *rec, long len, char *buf, long sz) { if (len > 0 && (isalpha((unsigned char)*rec) || /* identifier? */ @@ -117,7 +117,7 @@ static long match_func_rec(xdfile_t *xdf, xdemitconf_t const *xecfg, long ri, const char *rec; long len = xdl_get_rec(xdf, ri, &rec); if (!xecfg->find_func) - return def_ff(rec, len, buf, sz, xecfg->find_func_priv); + return def_ff(rec, len, buf, sz); return xecfg->find_func(rec, len, buf, sz, xecfg->find_func_priv); } |
