]> git.ipfire.org Git - thirdparty/git.git/commitdiff
Merge branch 'ab/various-leak-fixes'
authorJunio C Hamano <gitster@pobox.com>
Wed, 14 Dec 2022 06:55:46 +0000 (15:55 +0900)
committerJunio C Hamano <gitster@pobox.com>
Wed, 14 Dec 2022 06:55:46 +0000 (15:55 +0900)
Various leak fixes.

* ab/various-leak-fixes:
  built-ins: use free() not UNLEAK() if trivial, rm dead code
  revert: fix parse_options_concat() leak
  cherry-pick: free "struct replay_opts" members
  rebase: don't leak on "--abort"
  connected.c: free the "struct packed_git"
  sequencer.c: fix "opts->strategy" leak in read_strategy_opts()
  ls-files: fix a --with-tree memory leak
  revision API: call graph_clear() in release_revisions()
  unpack-file: fix ancient leak in create_temp_file()
  built-ins & libs & helpers: add/move destructors, fix leaks
  dir.c: free "ident" and "exclude_per_dir" in "struct untracked_cache"
  read-cache.c: clear and free "sparse_checkout_patterns"
  commit: discard partial cache before (re-)reading it
  {reset,merge}: call discard_index() before returning
  tests: mark tests as passing with SANITIZE=leak

234 files changed:
.github/workflows/l10n.yml
.github/workflows/main.yml
.gitignore
.mailmap
Documentation/Makefile
Documentation/MyFirstContribution.txt
Documentation/RelNotes/2.38.2.txt
Documentation/RelNotes/2.39.0.txt
Documentation/config/core.txt
Documentation/config/feature.txt
Documentation/config/push.txt
Documentation/git-credential-cache.txt
Documentation/git-credential.txt
Documentation/git-ls-files.txt
Documentation/git-maintenance.txt
Documentation/git-merge-tree.txt
Documentation/git-pack-redundant.txt
Documentation/git-push.txt
Documentation/git-repack.txt
Documentation/git-rev-parse.txt
Documentation/git-revert.txt
Documentation/gitcredentials.txt
Documentation/gitformat-commit-graph.txt
Documentation/glossary-content.txt
Documentation/howto/maintain-git.txt
Documentation/rev-list-options.txt
Documentation/technical/commit-graph.txt
Documentation/technical/parallel-checkout.txt
Documentation/technical/repository-version.txt
Documentation/technical/sparse-checkout.txt [new file with mode: 0644]
GIT-VERSION-GEN
INSTALL
Makefile
add-interactive.c
add-patch.c
archive-tar.c
bisect.c
builtin.h
builtin/add.c
builtin/am.c
builtin/bisect.c [moved from builtin/bisect--helper.c with 83% similarity]
builtin/branch.c
builtin/cat-file.c
builtin/check-attr.c
builtin/check-ignore.c
builtin/checkout-index.c
builtin/checkout.c
builtin/clean.c
builtin/clone.c
builtin/commit.c
builtin/describe.c
builtin/diff-files.c
builtin/diff-index.c
builtin/diff-tree.c
builtin/diff.c
builtin/difftool.c
builtin/fetch.c
builtin/for-each-repo.c
builtin/fsck.c
builtin/gc.c
builtin/grep.c
builtin/log.c
builtin/merge-index.c
builtin/merge-ours.c
builtin/merge-tree.c
builtin/merge.c
builtin/mv.c
builtin/notes.c
builtin/prune.c
builtin/pull.c
builtin/push.c
builtin/read-tree.c
builtin/rebase.c
builtin/receive-pack.c
builtin/remote.c
builtin/repack.c
builtin/reset.c
builtin/rev-list.c
builtin/rev-parse.c
builtin/revert.c
builtin/rm.c
builtin/stash.c
builtin/submodule--helper.c
builtin/update-index.c
cache.h
ci/install-dependencies.sh
ci/lib.sh
compat/fsmonitor/fsm-listen-darwin.c
compat/mingw.c
config.c
connected.c
connected.h
contrib/buildsystems/CMakeLists.txt
contrib/coccinelle/.gitignore
contrib/coccinelle/README
contrib/coccinelle/hashmap.cocci
contrib/coccinelle/index-compatibility.cocci [new file with mode: 0644]
contrib/coccinelle/index-compatibility.pending.cocci [new file with mode: 0644]
contrib/coccinelle/preincr.cocci
contrib/coccinelle/spatchcache [new file with mode: 0755]
contrib/coccinelle/strbuf.cocci
contrib/coccinelle/swap.cocci
contrib/coccinelle/the_repository.pending.cocci
delta-islands.c
diff.c
diffcore.h
fsmonitor-ipc.c
git-bisect.sh [deleted file]
git-gui/Makefile
git-submodule.sh
git.c
http.c
line-log.c
list-objects-filter.c
ll-merge.c
ls-refs.c
merge-recursive.c
merge.c
object-file.c
object.c
path.c
po/bg.po
po/ca.po
po/de.po
po/fr.po
po/id.po
po/sv.po
po/tr.po
po/zh_CN.po
po/zh_TW.po
read-cache.c
ref-filter.c
refs.c
refs.h
repo-settings.c
repository.c
repository.h
reset.c
revision.c
revision.h
run-command.c
run-command.h
scalar.c
sequencer.c
sha1dc_git.h
shared.mak
shell.c
sparse-index.c
submodule.c
submodule.h
t/Makefile
t/chainlint.pl
t/chainlint/block-comment.expect
t/chainlint/case-comment.expect
t/chainlint/close-subshell.expect
t/chainlint/comment.expect
t/chainlint/double-here-doc.expect
t/chainlint/empty-here-doc.expect
t/chainlint/for-loop.expect
t/chainlint/here-doc-close-subshell.expect
t/chainlint/here-doc-indent-operator.expect
t/chainlint/here-doc-multi-line-command-subst.expect
t/chainlint/here-doc-multi-line-string.expect
t/chainlint/here-doc.expect
t/chainlint/if-then-else.expect
t/chainlint/incomplete-line.expect
t/chainlint/inline-comment.expect
t/chainlint/loop-detect-status.expect
t/chainlint/nested-here-doc.expect
t/chainlint/nested-subshell-comment.expect
t/chainlint/subshell-here-doc.expect
t/chainlint/t7900-subtree.expect
t/chainlint/while-loop.expect
t/helper/test-cache-tree.c [new file with mode: 0644]
t/helper/test-dump-cache-tree.c
t/helper/test-dump-split-index.c
t/helper/test-dump-untracked-cache.c
t/helper/test-fake-ssh.c
t/helper/test-fast-rebase.c
t/helper/test-lazy-init-name-hash.c
t/helper/test-read-cache.c
t/helper/test-scrap-cache-tree.c
t/helper/test-sha1.c
t/helper/test-submodule.c
t/helper/test-tool.c
t/helper/test-tool.h
t/helper/test-trace2.c
t/helper/test-write-cache.c
t/lib-httpd.sh
t/lib-httpd/apache.conf
t/perf/p0006-read-tree-checkout.sh
t/perf/p0090-cache-tree.sh [new file with mode: 0755]
t/perf/p7102-reset.sh [new file with mode: 0755]
t/t0013-sha1dc.sh
t/t0040-parse-options.sh
t/t0061-run-command.sh
t/t0068-for-each-repo.sh
t/t0211-trace2-perf.sh
t/t1022-read-tree-partial-clone.sh
t/t1050-large.sh
t/t1300-config.sh
t/t1800-hook.sh
t/t3200-branch.sh
t/t3404-rebase-interactive.sh
t/t3430-rebase-merges.sh
t/t4301-merge-tree-write-tree.sh
t/t5000-tar-tree.sh
t/t5304-prune.sh
t/t5516-fetch-push.sh
t/t5526-fetch-submodules.sh
t/t5531-deep-submodule-push.sh
t/t5551-http-fetch-smart.sh
t/t5559-http-fetch-smart-http2.sh [new file with mode: 0755]
t/t6018-rev-list-glob.sh
t/t6021-rev-list-exclude-hidden.sh [new file with mode: 0755]
t/t6030-bisect-porcelain.sh
t/t6102-rev-list-unexpected-objects.sh
t/t6300-for-each-ref.sh
t/t6500-gc.sh
t/t7001-mv.sh
t/t7400-submodule-basic.sh
t/t7407-submodule-foreach.sh
t/t7411-submodule-config.sh
t/t7418-submodule-sparse-gitmodules.sh
t/t7422-submodule-output.sh [new file with mode: 0755]
t/t7610-mergetool.sh
t/t7700-repack.sh
t/t7900-maintenance.sh
t/t9210-scalar.sh
t/test-lib-functions.sh
tmp-objdir.h
unpack-trees.c
unpack-trees.h
upload-pack.c

index 27f72f0ff34482912ee894570ff277e43d5d3ddf..f7ea0f00a449cfafd5dc006e59267e464f753387 100644 (file)
@@ -23,8 +23,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 .
index bd6f75b8e0fed74880a2608618b7480d4018797d..e67847a682cea6da2d85e94cf96ea7f34db28fe2 100644 (file)
@@ -34,17 +34,17 @@ jobs:
           then
             enabled=no
           fi
-          echo "::set-output name=enabled::$enabled"
+          echo "enabled=$enabled" >>$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 +54,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,
@@ -83,7 +83,7 @@ jobs:
     if: needs.ci-config.outputs.enabled == 'yes'
     runs-on: windows-latest
     steps:
-    - uses: actions/checkout@v2
+    - uses: actions/checkout@v3
     - uses: git-for-windows/setup-git-for-windows-sdk@v1
     - name: build
       shell: bash
@@ -94,7 +94,7 @@ 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
@@ -108,7 +108,7 @@ jobs:
         nr: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
     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,7 +125,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}}
@@ -138,10 +138,10 @@ jobs:
       GIT_CONFIG_PARAMETERS: "'user.name=CI' 'user.email=ci@git'"
     runs-on: windows-latest
     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,7 +177,7 @@ 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
@@ -192,7 +192,7 @@ jobs:
     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 +210,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}}
@@ -227,24 +227,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 +262,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}}
@@ -288,7 +284,6 @@ jobs:
         - jobname: linux-musl
           image: alpine
         - jobname: linux32
-          os: ubuntu32
           image: daald/ubuntu32:xenial
         - jobname: pedantic
           image: fedora
@@ -297,15 +292,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}}
@@ -317,7 +319,7 @@ jobs:
       jobname: StaticAnalysis
     runs-on: ubuntu-22.04
     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
@@ -337,7 +339,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
@@ -349,6 +351,6 @@ jobs:
       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
index cb0231fb4019fca79a142ababe534fd7fc0a38a1..e942a83b45b1bf79b25c60df571e06c75f8924c6 100644 (file)
@@ -8,6 +8,7 @@
 /GIT-PERL-HEADER
 /GIT-PYTHON-VARS
 /GIT-SCRIPT-DEFINES
+/GIT-SPATCH-DEFINES
 /GIT-USER-AGENT
 /GIT-VERSION-FILE
 /bin-wrappers/
@@ -20,7 +21,6 @@
 /git-archimport
 /git-archive
 /git-bisect
-/git-bisect--helper
 /git-blame
 /git-branch
 /git-bugreport
index 07db36a9bb949c4c911d07baeb1c4c10c13bec4c..95aaa1c83318e2f6174def3e9059b4029a1e31f8 100644 (file)
--- a/.mailmap
+++ b/.mailmap
@@ -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>
index 5e1a7f655c2058176ee2e22eedc44264b12d99cf..9c67c3a1c50d4b87853a1cb2fcbfd6f0619d118c 100644 (file)
@@ -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 $@ $<
index 1a4be8ee0adde5db48e5f53a8fe79dd17036b270..ccfd0cb5f3e2aadb04bed17b5082ae71fc5fa2e0 100644 (file)
@@ -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
index 086b900f6c67dc79f2bc7a62a6e35494cb821054..92acb62bbb705c9b32f8a9de06f1c3ebba77d5ff 100644 (file)
@@ -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.
index 7096f07689be18b66c4467d17fe381a10712f503..9bf00ece53e1cbcd4949ebb85a401007406a9d2b 100644 (file)
@@ -29,6 +29,35 @@ UI, Workflows & Features
    existing bugs in the internal patch-id logic that did not match
    what "git patch-id" produces have been corrected.
 
+ * 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.
 --------------------------------------------------------------
 
@@ -84,6 +113,54 @@ Performance, Internal Implementation, Development Support etc.
  * Make sure generated dependency file is stably sorted to help
    developers debugging their build issues.
 
+ * The glossary entries for "commit-graph file" and "reachability
+   bitmap" have been added.
+
+ * Various tests exercising the transfer.credentialsInUrl
+   configuration are taught to avoid making requests which require
+   resolving localhost to reduce CI-flakiness.
+
+ * A redundant diagnostic message is dropped from test_path_is_missing().
+
+ * 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
 -----------------
 
@@ -137,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
@@ -212,13 +289,58 @@ 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
    configuration are taught to avoid making requests which require
    resolving localhost to reduce CI-flakiness.
 
+ * The adjust_shared_perm() helper function learned to refrain from
+   setting the "g+s" bit on directories when it is not necessary.
+
+ * "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).
index 37afbaf5a419d17f22e6598607cc13d121a8020e..dfbdaf00b8bc2239e7e106c8b78a2dd90d44ac9b 100644 (file)
@@ -618,7 +618,7 @@ but risks losing recent work in the event of an unclean system shutdown.
 * `loose-object` hardens objects added to the repo in loose-object form.
 * `pack` hardens objects added to the repo in packfile form.
 * `pack-metadata` hardens packfile bitmaps and indexes.
-* `commit-graph` hardens the commit graph file.
+* `commit-graph` hardens the commit-graph file.
 * `index` hardens the index when it is modified.
 * `objects` is an aggregate option that is equivalent to
   `loose-object,pack`.
index cdecd04e5bb7ea05efee6124a669da72ad0c5384..95975e50912c6f423820a5440d6696ac5326dc51 100644 (file)
@@ -14,6 +14,9 @@ feature.experimental::
 +
 * `fetch.negotiationAlgorithm=skipping` may improve fetch negotiation times by
 skipping more commits at a time, reducing the number of round trips.
++
+* `gc.cruftPacks=true` reduces disk space used by unreachable objects during
+garbage collection, preventing loose object explosions.
 
 feature.manyFiles::
        Enable config options that optimize for repos with many files in the
index 7386fea225ae4d3215839eb42df28e414ccdf38b..43338b65e843dd93b6373cc2edfe3600f7bf200d 100644 (file)
@@ -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').
 
index 0216c18ef80c9a9d32095ec3969091aff1c20344..432e159d95246ccb9e716ad1554c8b6047db1870 100644 (file)
@@ -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
index f18673017f577f523b1190ce87ce2d448e4dbd70..ac2818b9f66778d02bce6f344bdc4ef88a2bd263 100644 (file)
@@ -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
index d7986419c2507a7032961ba5b37ce6c73e5822f9..440043cdb8e4da5908c4378b2d90e8da3b14c956 100644 (file)
@@ -10,8 +10,8 @@ SYNOPSIS
 --------
 [verse]
 'git ls-files' [-z] [-t] [-v] [-f]
-               [-c|--cached] [-d|--deleted] [-o|--others] [-i|--|ignored]
-               [-s|--stage] [-u|--unmerged] [-k|--|killed] [-m|--modified]
+               [-c|--cached] [-d|--deleted] [-o|--others] [-i|--ignored]
+               [-s|--stage] [-u|--unmerged] [-k|--killed] [-m|--modified]
                [--directory [--no-empty-directory]] [--eol]
                [--deduplicate]
                [-x <pattern>|--exclude=<pattern>]
index bb888690e4dbd2642fc46d3c8775fa1638741cf4..805e5a2e3a044b4e1f5a345ecafa2dccb87565ce 100644 (file)
@@ -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
index 04bcc416e6e2966b8b83d911cac61307e0f4feaf..88ee942101a7748ac2a7b5030b364ed7e27d5fdb 100644 (file)
@@ -64,6 +64,11 @@ OPTIONS
        share no common history.  This flag can be given to override that
        check and make the merge proceed anyway.
 
+--merge-base=<commit>::
+       Instead of finding the merge-bases for <branch1> and <branch2>,
+       specify a merge-base for the merge, and specifying multiple bases is
+       currently not supported. This option is incompatible with `--stdin`.
+
 [[OUTPUT]]
 OUTPUT
 ------
@@ -216,6 +221,17 @@ with linkgit:git-merge[1]:
   * any messages that would have been printed to stdout (the
     <<IM,Informational messages>>)
 
+INPUT FORMAT
+------------
+'git merge-tree --stdin' input format is fully text based. Each line
+has this format:
+
+       [<base-commit> -- ]<branch1> <branch2>
+
+If one line is separated by `--`, the string before the separator is
+used for specifying a merge-base for the merge and the string after
+the separator describes the branches to be merged.
+
 MISTAKES TO AVOID
 -----------------
 
index dda80a740c879d1a1300caad3478a56ce62cad2a..99ef13839d49cdaa93c1b5a4b523ace18ce454db 100644 (file)
@@ -34,7 +34,7 @@ OPTIONS
 
 --alt-odb::
        Don't require objects present in packs from alternate object
-       directories to be present in local packs.
+       database (odb) directories to be present in local packs.
 
 --verbose::
        Outputs some statistics to stderr. Has a small performance penalty.
index def7657ef9cb71b5da3eb36b2b8f439f172651a3..5bb1d5aae257fa0d6cf480efcb25cfa5cc2a4b10 100644 (file)
@@ -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
index 0bf13893d8147d872dbedeed9def497b2a5a0fea..4017157949e6d764a619f870c0eed538d3e99f64 100644 (file)
@@ -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].
index 6b8ca085aa6da56fa561ede46395e2be5a6d26be..bcd80692870ae002db0bc3c1684c9a0959673964 100644 (file)
@@ -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
index 5016755efb61ded8351884a978b3febfc35040e6..d2e10d3dceb60e0a6c8322a47f8017701338710e 100644 (file)
@@ -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
index 80517b4eb2cb259d7b99528902e3192db2f4166d..4522471c33758c534328c010c65f4a69dee39b4b 100644 (file)
@@ -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
index 7324665716d7db7f352354f80c61406629264e95..31cad585e233031d205e5338bed74fcaf125de1f 100644 (file)
@@ -3,7 +3,7 @@ gitformat-commit-graph(5)
 
 NAME
 ----
-gitformat-commit-graph - Git commit graph format
+gitformat-commit-graph - Git commit-graph format
 
 SYNOPSIS
 --------
@@ -14,7 +14,7 @@ $GIT_DIR/objects/info/commit-graphs/*
 DESCRIPTION
 -----------
 
-The Git commit graph stores a list of commit OIDs and some associated
+The Git commit-graph stores a list of commit OIDs and some associated
 metadata, including:
 
 - The generation number of the commit.
@@ -34,7 +34,7 @@ corresponding to the array position within the list of commit OIDs. Due
 to some special constants we use to track parents, we can store at most
 (1 << 30) + (1 << 29) + (1 << 28) - 1 (around 1.8 billion) commits.
 
-== Commit graph files have the following format:
+== Commit-graph files have the following format:
 
 In order to allow extensions that add extra data to the graph, we organize
 the body into "chunks" and provide a binary lookup table at the beginning
index aa2f41f5e700774ef49eb7079c5239448fc61276..5a537268e275e45142640820942004b5cd731dbb 100644 (file)
@@ -20,7 +20,7 @@
 [[def_branch]]branch::
        A "branch" is a line of development.  The most recent
        <<def_commit,commit>> on a branch is referred to as the tip of
-       that branch.  The tip of the branch is referenced by a branch
+       that branch.  The tip of the branch is <<def_ref,referenced>> by a branch
        <<def_head,head>>, which moves forward as additional development
        is done on the branch.  A single Git
        <<def_repository,repository>> can track an arbitrary number of
@@ -75,6 +75,21 @@ state in the Git history, by creating a new commit representing the current
 state of the <<def_index,index>> and advancing <<def_HEAD,HEAD>>
 to point at the new commit.
 
+[[def_commit_graph_general]]commit graph concept, representations and usage::
+       A synonym for the <<def_DAG,DAG>> structure formed by the commits
+       in the object database, <<def_ref,referenced>> by branch tips,
+       using their <<def_chain,chain>> of linked commits.
+       This structure is the definitive commit graph. The
+       graph can be represented in other ways, e.g. the
+       <<def_commit_graph_file,"commit-graph" file>>.
+
+[[def_commit_graph_file]]commit-graph file::
+       The "commit-graph" (normally hyphenated) file is a supplemental
+       representation of the <<def_commit_graph_general,commit graph>>
+       which accelerates commit graph walks. The "commit-graph" file is
+       stored either in the .git/objects/info directory or in the info
+       directory of an alternate object database.
+
 [[def_commit_object]]commit object::
        An <<def_object,object>> which contains the information about a
        particular <<def_revision,revision>>, such as <<def_parent,parents>>, committer,
@@ -262,7 +277,7 @@ This commit is referred to as a "merge commit", or sometimes just a
        identified by its <<def_object_name,object name>>. The objects usually
        live in `$GIT_DIR/objects/`.
 
-[[def_object_identifier]]object identifier::
+[[def_object_identifier]]object identifier (oid)::
        Synonym for <<def_object_name,object name>>.
 
 [[def_object_name]]object name::
@@ -493,6 +508,14 @@ exclude;;
        <<def_tree_object,trees>> to the trees or <<def_blob_object,blobs>>
        that they contain.
 
+[[def_reachability_bitmap]]reachability bitmaps::
+       Reachability bitmaps store information about the
+       <<def_reachable,reachability>> of a selected set of commits in
+       a packfile, or a multi-pack index (MIDX), to speed up object search.
+       The bitmaps are stored in a ".bitmap" file. A repository may have at
+       most one bitmap file in use. The bitmap file may belong to either one
+       pack, or the repository's multi-pack index (if it exists).
+
 [[def_rebase]]rebase::
        To reapply a series of changes from a <<def_branch,branch>> to a
        different base, and reset the <<def_head,head>> of that branch
index a67130debb63dc99cbd860fd7b31fb187b1f9571..d07c6d44e53c3bd0e7805efa036f2cf3eeaf79ac 100644 (file)
@@ -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
@@ -256,7 +256,7 @@ by doing the following:
    merged to 'next', add it at the end of the list.  Then:
 
      $ git checkout -B jch master
-     $ Meta/redo-jch.sh -c1
+     $ sh Meta/redo-jch.sh -c1
 
    to rebuild the 'jch' branch from scratch.  "-c1" tells the script
    to stop merging at the first line that begins with '###'
@@ -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
index 1837509566a79a36a5f607837bc13af082d81b86..ff68e484069a84854c97d141dbef376badbaec2c 100644 (file)
@@ -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>`.
index 90c9760c230555053db461a8cb3d1a3676729cd7..86fed0de0f77f97031621ffd4ca94c1cbd2b5ba1 100644 (file)
@@ -1,4 +1,4 @@
-Git Commit Graph Design Notes
+Git Commit-Graph Design Notes
 =============================
 
 Git walks the commit graph for many reasons, including:
@@ -17,7 +17,7 @@ There are two main costs here:
 
 The commit-graph file is a supplemental data structure that accelerates
 commit graph walks. If a user downgrades or disables the 'core.commitGraph'
-config setting, then the existing ODB is sufficient. The file is stored
+config setting, then the existing object database is sufficient. The file is stored
 as "commit-graph" either in the .git/objects/info directory or in the info
 directory of an alternate.
 
@@ -95,7 +95,7 @@ with default order), but is not used when the topological order is
 required (such as merge base calculations, "git log --graph").
 
 In practice, we expect some commits to be created recently and not stored
-in the commit graph. We can treat these commits as having "infinite"
+in the commit-graph. We can treat these commits as having "infinite"
 generation number and walk until reaching commits with known generation
 number.
 
@@ -149,7 +149,7 @@ Design Details
   helpful for these clones, anyway. The commit-graph will not be read or
   written when shallow commits are present.
 
-Commit Graphs Chains
+Commit-Graphs Chains
 --------------------
 
 Typically, repos grow with near-constant velocity (commits per day). Over time,
index e790258a1adcdb9d683074a63fd6c941743bb757..47c9b6183cfad0f3f8e60df2003cd60657a92b0d 100644 (file)
@@ -56,7 +56,7 @@ Rejected Multi-Threaded Solution
 
 The most "straightforward" implementation would be to spread the set of
 to-be-updated cache entries across multiple threads. But due to the
-thread-unsafe functions in the ODB code, we would have to use locks to
+thread-unsafe functions in the object database code, we would have to use locks to
 coordinate the parallel operation. An early prototype of this solution
 showed that the multi-threaded checkout would bring performance
 improvements over the sequential code, but there was still too much lock
index 7844ef30ffdefd9158ae49ddd5d03d6a5c4edd4c..8ef664b0b9537ad3c8fc554e68448a69a3b7f439 100644 (file)
@@ -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 (file)
index 0000000..fa0d01c
--- /dev/null
@@ -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/
index e3eaeb49264eea1619d10dc6b17b7dbfbd42ec4b..b2580ab8513f3cfca206502a06c9708eb9d9af11 100755 (executable)
@@ -1,7 +1,7 @@
 #!/bin/sh
 
 GVF=GIT-VERSION-FILE
-DEF_VER=v2.38.GIT
+DEF_VER=v2.39.0
 
 LF='
 '
diff --git a/INSTALL b/INSTALL
index 89b15d71df521b2b710b77481e9607c03b78fccc..334478839744b48ce273ca75f464fada3596ce98 100644 (file)
--- a/INSTALL
+++ b/INSTALL
@@ -133,10 +133,6 @@ 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
index 4927379184cf9edb7ebc883c5ef40accea130232..0f7d7ab1fd29f99010da56d982d026401cb78d59 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -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).
@@ -490,6 +409,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
@@ -627,7 +691,6 @@ THIRD_PARTY_SOURCES =
 # interactive shell sessions without exporting it.
 unexport CDPATH
 
-SCRIPT_SH += git-bisect.sh
 SCRIPT_SH += git-difftool--helper.sh
 SCRIPT_SH += git-filter-branch.sh
 SCRIPT_SH += git-merge-octopus.sh
@@ -723,6 +786,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
@@ -1137,7 +1201,7 @@ BUILTIN_OBJS += builtin/am.o
 BUILTIN_OBJS += builtin/annotate.o
 BUILTIN_OBJS += builtin/apply.o
 BUILTIN_OBJS += builtin/archive.o
-BUILTIN_OBJS += builtin/bisect--helper.o
+BUILTIN_OBJS += builtin/bisect.o
 BUILTIN_OBJS += builtin/blame.o
 BUILTIN_OBJS += builtin/branch.o
 BUILTIN_OBJS += builtin/bugreport.o
@@ -1302,11 +1366,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 +1932,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
@@ -2989,7 +3094,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 +3248,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 +3365,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 +3640,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
index f071b2a1b4f2ee8bf1959706d1778c3697d81ba7..ae1839c04a7fa27125e4a2308c971e63da18492a 100644 (file)
@@ -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);
@@ -997,18 +997,17 @@ static int run_diff(struct add_i_state *s, const struct pathspec *ps,
        count = list_and_choose(s, files, opts);
        opts->flags = 0;
        if (count > 0) {
-               struct strvec args = STRVEC_INIT;
+               struct child_process cmd = CHILD_PROCESS_INIT;
 
-               strvec_pushl(&args, "git", "diff", "-p", "--cached",
+               strvec_pushl(&cmd.args, "git", "diff", "-p", "--cached",
                             oid_to_hex(!is_initial ? &oid :
                                        s->r->hash_algo->empty_tree),
                             "--", NULL);
                for (i = 0; i < files->items.nr; i++)
                        if (files->selected[i])
-                               strvec_push(&args,
+                               strvec_push(&cmd.args,
                                            files->items.items[i].string);
-               res = run_command_v_opt(args.v, 0);
-               strvec_clear(&args);
+               res = run_command(&cmd);
        }
 
        putchar('\n');
@@ -1157,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"));
index 33ecd8398a12707836cd89975226179413fa9574..a86a92e16461384cbe8ac880fa6515e0f74e243c 100644 (file)
@@ -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) ||
index 3e4822b68409b85d36436bd42da862991274cd81..f8fad2946ef97324756b78363fb90d329f504209 100644 (file)
@@ -498,6 +498,7 @@ static int write_tar_filter_archive(const struct archiver *ar,
        strvec_push(&filter.args, cmd.buf);
        filter.use_shell = 1;
        filter.in = -1;
+       filter.silent_exec_failure = 1;
 
        if (start_command(&filter) < 0)
                die_errno(_("unable to start '%s' filter"), cmd.buf);
index fd581b85a72cc6d1f9b447893f9a3b345a8ce9da..ec7487e6836c7ec5819f0b22cc7b08bce0e59fa0 100644 (file)
--- a/bisect.c
+++ b/bisect.c
@@ -22,8 +22,6 @@ static struct oid_array skipped_revs;
 
 static struct object_id *current_bad_oid;
 
-static const char *argv_checkout[] = {"checkout", "-q", NULL, "--", NULL};
-
 static const char *term_bad;
 static const char *term_good;
 
@@ -729,20 +727,22 @@ static int is_expected_rev(const struct object_id *oid)
 enum bisect_error bisect_checkout(const struct object_id *bisect_rev,
                                  int no_checkout)
 {
-       char bisect_rev_hex[GIT_MAX_HEXSZ + 1];
        struct commit *commit;
        struct pretty_print_context pp = {0};
        struct strbuf commit_msg = STRBUF_INIT;
 
-       oid_to_hex_r(bisect_rev_hex, bisect_rev);
        update_ref(NULL, "BISECT_EXPECTED_REV", bisect_rev, NULL, 0, UPDATE_REFS_DIE_ON_ERR);
 
-       argv_checkout[2] = bisect_rev_hex;
        if (no_checkout) {
                update_ref(NULL, "BISECT_HEAD", bisect_rev, NULL, 0,
                           UPDATE_REFS_DIE_ON_ERR);
        } else {
-               if (run_command_v_opt(argv_checkout, RUN_GIT_CMD))
+               struct child_process cmd = CHILD_PROCESS_INIT;
+
+               cmd.git_cmd = 1;
+               strvec_pushl(&cmd.args, "checkout", "-q",
+                            oid_to_hex(bisect_rev), "--", NULL);
+               if (run_command(&cmd))
                        /*
                         * Errors in `run_command()` itself, signaled by res < 0,
                         * and errors in the child process, signaled by res > 0
index 8901a34d6bf424680b9d13a1bdf332bedb4d8e20..aa955466b4e6f780951cc0bc4dc0078725e46d42 100644 (file)
--- a/builtin.h
+++ b/builtin.h
@@ -116,7 +116,7 @@ int cmd_am(int argc, const char **argv, const char *prefix);
 int cmd_annotate(int argc, const char **argv, const char *prefix);
 int cmd_apply(int argc, const char **argv, const char *prefix);
 int cmd_archive(int argc, const char **argv, const char *prefix);
-int cmd_bisect__helper(int argc, const char **argv, const char *prefix);
+int cmd_bisect(int argc, const char **argv, const char *prefix);
 int cmd_blame(int argc, const char **argv, const char *prefix);
 int cmd_branch(int argc, const char **argv, const char *prefix);
 int cmd_bugreport(int argc, const char **argv, const char *prefix);
index c68ebafed5ed2c20a808b8bea294f171e5b7059c..2c154cc347965bbc82804ed30b87d7fea4db9c01 100644 (file)
@@ -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;
 
@@ -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;
@@ -240,8 +241,8 @@ static int refresh(int verbose, const struct pathspec *pathspec)
 int run_add_interactive(const char *revision, const char *patch_mode,
                        const struct pathspec *pathspec)
 {
-       int status, i;
-       struct strvec argv = STRVEC_INIT;
+       int i;
+       struct child_process cmd = CHILD_PROCESS_INIT;
        int use_builtin_add_i =
                git_env_bool("GIT_TEST_ADD_I_USE_BUILTIN", -1);
 
@@ -272,19 +273,18 @@ int run_add_interactive(const char *revision, const char *patch_mode,
                return !!run_add_p(the_repository, mode, revision, pathspec);
        }
 
-       strvec_push(&argv, "add--interactive");
+       strvec_push(&cmd.args, "add--interactive");
        if (patch_mode)
-               strvec_push(&argv, patch_mode);
+               strvec_push(&cmd.args, patch_mode);
        if (revision)
-               strvec_push(&argv, revision);
-       strvec_push(&argv, "--");
+               strvec_push(&cmd.args, revision);
+       strvec_push(&cmd.args, "--");
        for (i = 0; i < pathspec->nr; i++)
                /* pass original pathspec, to be re-parsed */
-               strvec_push(&argv, pathspec->items[i].original);
+               strvec_push(&cmd.args, pathspec->items[i].original);
 
-       status = run_command_v_opt(argv.v, RUN_GIT_CMD);
-       strvec_clear(&argv);
-       return status;
+       cmd.git_cmd = 1;
+       return run_command(&cmd);
 }
 
 int interactive_add(const char **argv, const char *prefix, int patch)
@@ -312,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);
@@ -544,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
@@ -587,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);
index 39fea24833078be76d76d974e5b601715ed51aea..30c9b3a9cd72588fc2fb4495faedcc7cf3eda258 100644 (file)
@@ -1519,8 +1519,8 @@ static int run_apply(const struct am_state *state, const char *index_file)
 
        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 +1562,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 +1596,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 +1781,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 +1931,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 +1968,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 +2008,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 +2046,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;
@@ -2187,14 +2188,12 @@ static int show_patch(struct am_state *state, enum show_patch_type sub_mode)
        int len;
 
        if (!is_null_oid(&state->orig_commit)) {
-               const char *av[4] = { "show", NULL, "--", NULL };
-               char *new_oid_str;
-               int ret;
+               struct child_process cmd = CHILD_PROCESS_INIT;
 
-               av[1] = new_oid_str = xstrdup(oid_to_hex(&state->orig_commit));
-               ret = run_command_v_opt(av, RUN_GIT_CMD);
-               free(new_oid_str);
-               return ret;
+               strvec_pushl(&cmd.args, "show", oid_to_hex(&state->orig_commit),
+                            "--", NULL);
+               cmd.git_cmd = 1;
+               return run_command(&cmd);
        }
 
        switch (sub_mode) {
similarity index 83%
rename from builtin/bisect--helper.c
rename to builtin/bisect.c
index 28ef7ec2a48856b1c13f1cdd31546985148752f0..cc9483e85155f7d4f46f3f2440be855dd403fa85 100644 (file)
@@ -20,18 +20,40 @@ static GIT_PATH_FUNC(git_path_bisect_names, "BISECT_NAMES")
 static GIT_PATH_FUNC(git_path_bisect_first_parent, "BISECT_FIRST_PARENT")
 static GIT_PATH_FUNC(git_path_bisect_run, "BISECT_RUN")
 
-static const char * const git_bisect_helper_usage[] = {
-       N_("git bisect--helper --bisect-reset [<commit>]"),
-       "git bisect--helper --bisect-terms [--term-good | --term-old | --term-bad | --term-new]",
-       N_("git bisect--helper --bisect-start [--term-{new,bad}=<term> --term-{old,good}=<term>]"
-                                           " [--no-checkout] [--first-parent] [<bad> [<good>...]] [--] [<paths>...]"),
-       "git bisect--helper --bisect-next",
-       N_("git bisect--helper --bisect-state (bad|new) [<rev>]"),
-       N_("git bisect--helper --bisect-state (good|old) [<rev>...]"),
-       N_("git bisect--helper --bisect-replay <filename>"),
-       N_("git bisect--helper --bisect-skip [(<rev>|<range>)...]"),
-       "git bisect--helper --bisect-visualize",
-       N_("git bisect--helper --bisect-run <cmd>..."),
+#define BUILTIN_GIT_BISECT_START_USAGE \
+       N_("git bisect start [--term-{new,bad}=<term> --term-{old,good}=<term>]" \
+          "    [--no-checkout] [--first-parent] [<bad> [<good>...]] [--]" \
+          "    [<pathspec>...]")
+#define BUILTIN_GIT_BISECT_STATE_USAGE \
+       N_("git bisect (good|bad) [<rev>...]")
+#define BUILTIN_GIT_BISECT_TERMS_USAGE \
+       "git bisect terms [--term-good | --term-bad]"
+#define BUILTIN_GIT_BISECT_SKIP_USAGE \
+       N_("git bisect skip [(<rev>|<range>)...]")
+#define BUILTIN_GIT_BISECT_NEXT_USAGE \
+       "git bisect next"
+#define BUILTIN_GIT_BISECT_RESET_USAGE \
+       N_("git bisect reset [<commit>]")
+#define BUILTIN_GIT_BISECT_VISUALIZE_USAGE \
+       "git bisect visualize"
+#define BUILTIN_GIT_BISECT_REPLAY_USAGE \
+       N_("git bisect replay <logfile>")
+#define BUILTIN_GIT_BISECT_LOG_USAGE \
+       "git bisect log"
+#define BUILTIN_GIT_BISECT_RUN_USAGE \
+       N_("git bisect run <cmd>...")
+
+static const char * const git_bisect_usage[] = {
+       BUILTIN_GIT_BISECT_START_USAGE,
+       BUILTIN_GIT_BISECT_STATE_USAGE,
+       BUILTIN_GIT_BISECT_TERMS_USAGE,
+       BUILTIN_GIT_BISECT_SKIP_USAGE,
+       BUILTIN_GIT_BISECT_NEXT_USAGE,
+       BUILTIN_GIT_BISECT_RESET_USAGE,
+       BUILTIN_GIT_BISECT_VISUALIZE_USAGE,
+       BUILTIN_GIT_BISECT_REPLAY_USAGE,
+       BUILTIN_GIT_BISECT_LOG_USAGE,
+       BUILTIN_GIT_BISECT_RUN_USAGE,
        NULL
 };
 
@@ -220,18 +242,17 @@ static int bisect_reset(const char *commit)
        }
 
        if (!ref_exists("BISECT_HEAD")) {
-               struct strvec argv = STRVEC_INIT;
+               struct child_process cmd = CHILD_PROCESS_INIT;
 
-               strvec_pushl(&argv, "checkout", branch.buf, "--", NULL);
-               if (run_command_v_opt(argv.v, RUN_GIT_CMD)) {
+               cmd.git_cmd = 1;
+               strvec_pushl(&cmd.args, "checkout", branch.buf, "--", NULL);
+               if (run_command(&cmd)) {
                        error(_("could not check out original"
                                " HEAD '%s'. Try 'git bisect"
                                " reset <commit>'."), branch.buf);
                        strbuf_release(&branch);
-                       strvec_clear(&argv);
                        return -1;
                }
-               strvec_clear(&argv);
        }
 
        strbuf_release(&branch);
@@ -765,10 +786,12 @@ static enum bisect_error bisect_start(struct bisect_terms *terms, const char **a
                strbuf_read_file(&start_head, git_path_bisect_start(), 0);
                strbuf_trim(&start_head);
                if (!no_checkout) {
-                       const char *argv[] = { "checkout", start_head.buf,
-                                              "--", NULL };
+                       struct child_process cmd = CHILD_PROCESS_INIT;
 
-                       if (run_command_v_opt(argv, RUN_GIT_CMD)) {
+                       cmd.git_cmd = 1;
+                       strvec_pushl(&cmd.args, "checkout", start_head.buf,
+                                    "--", NULL);
+                       if (run_command(&cmd)) {
                                res = error(_("checking out '%s' failed."
                                                 " Try 'git bisect start "
                                                 "<valid-branch>'."),
@@ -1098,40 +1121,38 @@ static enum bisect_error bisect_skip(struct bisect_terms *terms, const char **ar
 
 static int bisect_visualize(struct bisect_terms *terms, const char **argv, int argc)
 {
-       struct strvec args = STRVEC_INIT;
-       int flags = RUN_COMMAND_NO_STDIN, res = 0;
+       struct child_process cmd = CHILD_PROCESS_INIT;
        struct strbuf sb = STRBUF_INIT;
 
        if (bisect_next_check(terms, NULL) != 0)
                return BISECT_FAILED;
 
+       cmd.no_stdin = 1;
        if (!argc) {
                if ((getenv("DISPLAY") || getenv("SESSIONNAME") || getenv("MSYSTEM") ||
                     getenv("SECURITYSESSIONID")) && exists_in_PATH("gitk")) {
-                       strvec_push(&args, "gitk");
+                       strvec_push(&cmd.args, "gitk");
                } else {
-                       strvec_push(&args, "log");
-                       flags |= RUN_GIT_CMD;
+                       strvec_push(&cmd.args, "log");
+                       cmd.git_cmd = 1;
                }
        } else {
                if (argv[0][0] == '-') {
-                       strvec_push(&args, "log");
-                       flags |= RUN_GIT_CMD;
+                       strvec_push(&cmd.args, "log");
+                       cmd.git_cmd = 1;
                } else if (strcmp(argv[0], "tig") && !starts_with(argv[0], "git"))
-                       flags |= RUN_GIT_CMD;
+                       cmd.git_cmd = 1;
 
-               strvec_pushv(&args, argv);
+               strvec_pushv(&cmd.args, argv);
        }
 
-       strvec_pushl(&args, "--bisect", "--", NULL);
+       strvec_pushl(&cmd.args, "--bisect", "--", NULL);
 
        strbuf_read_file(&sb, git_path_bisect_names(), 0);
-       sq_dequote_to_strvec(sb.buf, &args);
+       sq_dequote_to_strvec(sb.buf, &cmd.args);
        strbuf_release(&sb);
 
-       res = run_command_v_opt(args.v, flags);
-       strvec_clear(&args);
-       return res;
+       return run_command(&cmd);
 }
 
 static int get_first_good(const char *refname UNUSED,
@@ -1142,8 +1163,17 @@ static int get_first_good(const char *refname UNUSED,
        return 1;
 }
 
-static int verify_good(const struct bisect_terms *terms,
-                      const char **quoted_argv)
+static int do_bisect_run(const char *command)
+{
+       struct child_process cmd = CHILD_PROCESS_INIT;
+
+       printf(_("running %s\n"), command);
+       cmd.use_shell = 1;
+       strvec_push(&cmd.args, command);
+       return run_command(&cmd);
+}
+
+static int verify_good(const struct bisect_terms *terms, const char *command)
 {
        int rc;
        enum bisect_error res;
@@ -1163,8 +1193,7 @@ static int verify_good(const struct bisect_terms *terms,
        if (res != BISECT_OK)
                return -1;
 
-       printf(_("running %s\n"), quoted_argv[0]);
-       rc = run_command_v_opt(quoted_argv, RUN_USING_SHELL);
+       rc = do_bisect_run(command);
 
        res = bisect_checkout(&current_rev, no_checkout);
        if (res != BISECT_OK)
@@ -1177,7 +1206,6 @@ static int bisect_run(struct bisect_terms *terms, const char **argv, int argc)
 {
        int res = BISECT_OK;
        struct strbuf command = STRBUF_INIT;
-       struct strvec run_args = STRVEC_INIT;
        const char *new_state;
        int temporary_stdout_fd, saved_stdout;
        int is_first_run = 1;
@@ -1185,18 +1213,15 @@ static int bisect_run(struct bisect_terms *terms, const char **argv, int argc)
        if (bisect_next_check(terms, NULL))
                return BISECT_FAILED;
 
-       if (argc)
-               sq_quote_argv(&command, argv);
-       else {
+       if (!argc) {
                error(_("bisect run failed: no command provided."));
                return BISECT_FAILED;
        }
 
-       strvec_push(&run_args, command.buf);
-
+       sq_quote_argv(&command, argv);
+       strbuf_ltrim(&command);
        while (1) {
-               printf(_("running %s\n"), command.buf);
-               res = run_command_v_opt(run_args.v, RUN_USING_SHELL);
+               res = do_bisect_run(command.buf);
 
                /*
                 * Exit code 126 and 127 can either come from the shell
@@ -1206,10 +1231,10 @@ static int bisect_run(struct bisect_terms *terms, const char **argv, int argc)
                 * missing or non-executable script.
                 */
                if (is_first_run && (res == 126 || res == 127)) {
-                       int rc = verify_good(terms, run_args.v);
+                       int rc = verify_good(terms, command.buf);
                        is_first_run = 0;
-                       if (rc < 0) {
-                               error(_("unable to verify '%s' on good"
+                       if (rc < 0 || 128 <= rc) {
+                               error(_("unable to verify %s on good"
                                        " revision"), command.buf);
                                res = BISECT_FAILED;
                                break;
@@ -1224,7 +1249,7 @@ static int bisect_run(struct bisect_terms *terms, const char **argv, int argc)
 
                if (res < 0 || 128 <= res) {
                        error(_("bisect run failed: exit code %d from"
-                               " '%s' is < 0 or >= 128"), res, command.buf);
+                               " %s is < 0 or >= 128"), res, command.buf);
                        break;
                }
 
@@ -1258,14 +1283,14 @@ static int bisect_run(struct bisect_terms *terms, const char **argv, int argc)
                if (res == BISECT_ONLY_SKIPPED_LEFT)
                        error(_("bisect run cannot continue any more"));
                else if (res == BISECT_INTERNAL_SUCCESS_MERGE_BASE) {
-                       printf(_("bisect run success"));
+                       puts(_("bisect run success"));
                        res = BISECT_OK;
                } else if (res == BISECT_INTERNAL_SUCCESS_1ST_BAD_FOUND) {
-                       printf(_("bisect found first bad commit"));
+                       puts(_("bisect found first bad commit"));
                        res = BISECT_OK;
                } else if (res) {
-                       error(_("bisect run failed: 'git bisect--helper --bisect-state"
-                       " %s' exited with error code %d"), new_state, res);
+                       error(_("bisect run failed: 'bisect-state %s'"
+                               " exited with error code %d"), new_state, res);
                } else {
                        continue;
                }
@@ -1273,119 +1298,147 @@ static int bisect_run(struct bisect_terms *terms, const char **argv, int argc)
        }
 
        strbuf_release(&command);
-       strvec_clear(&run_args);
        return res;
 }
 
-int cmd_bisect__helper(int argc, const char **argv, const char *prefix)
+static int cmd_bisect__reset(int argc, const char **argv, const char *prefix UNUSED)
+{
+       if (argc > 1)
+               return error(_("'%s' requires either no argument or a commit"),
+                            "git bisect reset");
+       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(_("'%s' requires 0 or 1 argument"),
+                            "git bisect terms");
+       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(_("'%s' requires 0 arguments"),
+                            "git bisect next");
+       get_terms(&terms);
+       res = bisect_next(&terms, prefix);
+       free_terms(&terms);
+       return res;
+}
+
+static int cmd_bisect__log(int argc UNUSED, const char **argv UNUSED, const char *prefix UNUSED)
+{
+       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)
 {
-       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;
+       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(_("'%s' failed: no command provided."), "git bisect run");
+       get_terms(&terms);
+       res = bisect_run(&terms, argv, argc);
+       free_terms(&terms);
+       return res;
+}
+
+int cmd_bisect(int argc, const char **argv, const char *prefix)
+{
+       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("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_usage,
+                            PARSE_OPT_SUBCOMMAND_OPTIONAL);
 
-       argc = parse_options(argc, argv, prefix, options,
-                            git_bisect_helper_usage,
-                            PARSE_OPT_KEEP_DASHDASH | PARSE_OPT_KEEP_UNKNOWN_OPT);
+       if (!fn) {
+               struct bisect_terms terms = { 0 };
 
-       if (!cmdmode)
-               usage_with_options(git_bisect_helper_usage, options);
+               if (!argc)
+                       usage_msg_opt(_("need a command"), git_bisect_usage, options);
 
-       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);
+               if (check_and_set_terms(&terms, argv[0]))
+                       usage_msg_optf(_("unknown command: '%s'"), git_bisect_usage,
+                                      options, argv[0]);
                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);
+       } else {
+               argc--;
+               argv++;
+               res = fn(argc, argv, prefix);
        }
-       free_terms(&terms);
 
        /*
         * Handle early success
index 15be0c03ef263f59cc24affa5e7693621f869e35..9470c980c15dca8a96c264772991b51813f1b355 100644 (file)
@@ -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;
index fa7bd89169205b4c3c1ff6d6813330278cc7539f..b3be58b1fb06678376568753f9fc221d8cfb3750 100644 (file)
@@ -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"
index dd833977864d79a3abde9fc66042d7bda56b8e82..0fef10eb6bc7dafb6e5e30ef8b988d1921f99f98 100644 (file)
@@ -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");
        }
 
index 21912569650d11c07297193a24e041bce035a284..ab776061c7c4f2e1f53c3408a323db3dac6bc440 100644 (file)
@@ -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);
index 97e06e8c52c012c918558cd73aa65d5750b8118b..cf6fba97ba784a201b8becff88cc82eac93cf7f7 100644 (file)
@@ -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);
index 659dd5c43096944a20c71d83bbd67b38eeabb07e..a0142c815fdfeb29a292b549755294bf5ab2633c 100644 (file)
@@ -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))
index 40ff2c578dea719ca5c91c654b644cfc7be36807..b2701a2815803e8c1231eb7516bc5936311e9f0a 100644 (file)
@@ -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))
index 547d6464b3c04b83cb1376d325eeefb79aca079c..f518bb2dc1fbad357e93511d8deee851ef56b812 100644 (file)
@@ -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"
@@ -653,9 +653,9 @@ static void update_head(const struct ref *our, const struct ref *remote,
 
 static int git_sparse_checkout_init(const char *repo)
 {
-       struct strvec argv = STRVEC_INIT;
+       struct child_process cmd = CHILD_PROCESS_INIT;
        int result = 0;
-       strvec_pushl(&argv, "-C", repo, "sparse-checkout", "set", NULL);
+       strvec_pushl(&cmd.args, "-C", repo, "sparse-checkout", "set", NULL);
 
        /*
         * We must apply the setting in the current process
@@ -663,12 +663,12 @@ static int git_sparse_checkout_init(const char *repo)
         */
        core_apply_sparse_checkout = 1;
 
-       if (run_command_v_opt(argv.v, RUN_GIT_CMD)) {
+       cmd.git_cmd = 1;
+       if (run_command(&cmd)) {
                error(_("failed to initialize sparse-checkout"));
                result = 1;
        }
 
-       strvec_clear(&argv);
        return result;
 }
 
@@ -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;
@@ -733,37 +733,38 @@ static int checkout(int submodule_progress, int filter_submodules)
                           oid_to_hex(&oid), "1", NULL);
 
        if (!err && (option_recurse_submodules.nr > 0)) {
-               struct strvec args = STRVEC_INIT;
-               strvec_pushl(&args, "submodule", "update", "--require-init", "--recursive", NULL);
+               struct child_process cmd = CHILD_PROCESS_INIT;
+               strvec_pushl(&cmd.args, "submodule", "update", "--require-init",
+                            "--recursive", NULL);
 
                if (option_shallow_submodules == 1)
-                       strvec_push(&args, "--depth=1");
+                       strvec_push(&cmd.args, "--depth=1");
 
                if (max_jobs != -1)
-                       strvec_pushf(&args, "--jobs=%d", max_jobs);
+                       strvec_pushf(&cmd.args, "--jobs=%d", max_jobs);
 
                if (submodule_progress)
-                       strvec_push(&args, "--progress");
+                       strvec_push(&cmd.args, "--progress");
 
                if (option_verbosity < 0)
-                       strvec_push(&args, "--quiet");
+                       strvec_push(&cmd.args, "--quiet");
 
                if (option_remote_submodules) {
-                       strvec_push(&args, "--remote");
-                       strvec_push(&args, "--no-fetch");
+                       strvec_push(&cmd.args, "--remote");
+                       strvec_push(&cmd.args, "--no-fetch");
                }
 
                if (filter_submodules && filter_options.choice)
-                       strvec_pushf(&args, "--filter=%s",
+                       strvec_pushf(&cmd.args, "--filter=%s",
                                     expand_list_objects_filter_spec(&filter_options));
 
                if (option_single_branch >= 0)
-                       strvec_push(&args, option_single_branch ?
+                       strvec_push(&cmd.args, option_single_branch ?
                                               "--single-branch" :
                                               "--no-single-branch");
 
-               err = run_command_v_opt(args.v, RUN_GIT_CMD);
-               strvec_clear(&args);
+               cmd.git_cmd = 1;
+               err = run_command(&cmd);
        }
 
        return err;
@@ -864,11 +865,15 @@ static void write_refspec_config(const char *src_ref_prefix,
 
 static void dissociate_from_references(void)
 {
-       static const char* argv[] = { "repack", "-a", "-d", NULL };
        char *alternates = git_pathdup("objects/info/alternates");
 
        if (!access(alternates, F_OK)) {
-               if (run_command_v_opt(argv, RUN_GIT_CMD|RUN_COMMAND_NO_STDIN))
+               struct child_process cmd = CHILD_PROCESS_INIT;
+
+               cmd.git_cmd = 1;
+               cmd.no_stdin = 1;
+               strvec_pushl(&cmd.args, "repack", "-a", "-d", NULL);
+               if (run_command(&cmd))
                        die(_("cannot repack to clean up"));
                if (unlink(alternates) && errno != ENOENT)
                        die_errno(_("cannot unlink temporary alternates file"));
index f88a29167f42d0458b9a6b7659de5f33b85efa8b..44b763d7cd025db45581d60902502ae2a2a9fe11 100644 (file)
@@ -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);
@@ -1001,10 +1005,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
@@ -1071,9 +1075,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"));
@@ -1559,7 +1563,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;
 
@@ -1826,7 +1830,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();
index 23e3f05fb106b495c0460e02456f19834eea6e5c..eea1e330c00c62a649b5a059bbfcf6e351f95269 100644 (file)
@@ -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);
 
index 096ea2fedbc497b51b3f6519f77cd698e83fe59a..dc991f753bb8f10b2414a9c3486f8374d388f82a 100644 (file)
@@ -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;
        }
index aea139b9d8f9ed2085cb91a4ea4dec853f9e8acc..35dc9b23eef32d81e1e0a1b42a810ca6d95f58a2 100644 (file)
@@ -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);
index 85e8c81e5947cfdb81421dc6426593c61b4fa0b6..25b853b85ca99d210d230d6783b824a270de9d6c 100644 (file)
@@ -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;
index cb63f157dd13e50cded7b2c96204e84595e5a7a1..26f1e532c66b173fb4b29d220564fcd90c03d0d2 100644 (file)
@@ -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);
index 4b10ad1a36908fe8067daa1e66a000c8c8e85718..d9b76226f6a8dd4f256a902c02cde05bd7399293 100644 (file)
@@ -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"
@@ -44,8 +44,11 @@ static int difftool_config(const char *var, const char *value, void *cb)
 
 static int print_tool_help(void)
 {
-       const char *argv[] = { "mergetool", "--tool-help=diff", NULL };
-       return run_command_v_opt(argv, RUN_GIT_CMD);
+       struct child_process cmd = CHILD_PROCESS_INIT;
+
+       cmd.git_cmd = 1;
+       strvec_pushl(&cmd.args, "mergetool", "--tool-help=diff", NULL);
+       return run_command(&cmd);
 }
 
 static int parse_index_info(char *p, int *mode1, int *mode2,
@@ -360,8 +363,8 @@ static int run_dir_diff(const char *extcmd, int symlinks, const char *prefix,
        struct pair_entry *entry;
        struct index_state wtindex;
        struct checkout lstate, rstate;
-       int flags = RUN_GIT_CMD, err = 0;
-       const char *helper_argv[] = { "difftool--helper", NULL, NULL, NULL };
+       int err = 0;
+       struct child_process cmd = CHILD_PROCESS_INIT;
        struct hashmap wt_modified, tmp_modified;
        int indices_loaded = 0;
 
@@ -563,16 +566,17 @@ static int run_dir_diff(const char *extcmd, int symlinks, const char *prefix,
        }
 
        strbuf_setlen(&ldir, ldir_len);
-       helper_argv[1] = ldir.buf;
        strbuf_setlen(&rdir, rdir_len);
-       helper_argv[2] = rdir.buf;
 
        if (extcmd) {
-               helper_argv[0] = extcmd;
-               flags = 0;
-       } else
+               strvec_push(&cmd.args, extcmd);
+       } else {
+               strvec_push(&cmd.args, "difftool--helper");
+               cmd.git_cmd = 1;
                setenv("GIT_DIFFTOOL_DIRDIFF", "true", 1);
-       ret = run_command_v_opt(helper_argv, flags);
+       }
+       strvec_pushl(&cmd.args, ldir.buf, rdir.buf, NULL);
+       ret = run_command(&cmd);
 
        /* TODO: audit for interaction with sparse-index. */
        ensure_full_index(&wtindex);
index b06e454cbddaf1fb3cf8211acab71e90a526448b..7378cafeec9fd6ea3edc521646ab7d8f66bcc02a 100644 (file)
@@ -1972,14 +1972,17 @@ static int fetch_multiple(struct string_list *list, int max_children)
        } else
                for (i = 0; i < list->nr; i++) {
                        const char *name = list->items[i].string;
-                       strvec_push(&argv, name);
+                       struct child_process cmd = CHILD_PROCESS_INIT;
+
+                       strvec_pushv(&cmd.args, argv.v);
+                       strvec_push(&cmd.args, name);
                        if (verbosity >= 0)
                                printf(_("Fetching %s\n"), name);
-                       if (run_command_v_opt(argv.v, RUN_GIT_CMD)) {
+                       cmd.git_cmd = 1;
+                       if (run_command(&cmd)) {
                                error(_("could not fetch %s"), name);
                                result = 1;
                        }
-                       strvec_pop(&argv);
                }
 
        strvec_clear(&argv);
index d45d873f5797c9d1aa836f5d53e7c5b7b80e9ef4..6aeac37148830d316f533e5399c79ed551fda2fe 100644 (file)
@@ -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);
 }
 
index 7436e1a68ef5d63d9f08527a5096d029abdb5b31..d207bd909b4b6da0671628c20bb29e98f427b550 100644 (file)
@@ -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);
        }
 
index 24ea85c7afdd706efcad37642d9023a7f20bd43f..02455fdcd73603ad640a7a54c697c7d7f58225cf 100644 (file)
@@ -42,7 +42,7 @@ static const char * const builtin_gc_usage[] = {
 
 static int pack_refs = 1;
 static int prune_reflogs = 1;
-static int cruft_packs = 0;
+static int cruft_packs = -1;
 static int aggressive_depth = 50;
 static int aggressive_window = 250;
 static int gc_auto_threshold = 6700;
@@ -167,9 +167,11 @@ static void gc_config(void)
 struct maintenance_run_opts;
 static int maintenance_task_pack_refs(MAYBE_UNUSED struct maintenance_run_opts *opts)
 {
-       const char *argv[] = { "pack-refs", "--all", "--prune", NULL };
+       struct child_process cmd = CHILD_PROCESS_INIT;
 
-       return run_command_v_opt(argv, RUN_GIT_CMD);
+       cmd.git_cmd = 1;
+       strvec_pushl(&cmd.args, "pack-refs", "--all", "--prune", NULL);
+       return run_command(&cmd);
 }
 
 static int too_many_loose_objects(void)
@@ -535,8 +537,14 @@ static void gc_before_repack(void)
        if (pack_refs && maintenance_task_pack_refs(NULL))
                die(FAILED_RUN, "pack-refs");
 
-       if (prune_reflogs && run_command_v_opt(reflog.v, RUN_GIT_CMD))
-               die(FAILED_RUN, reflog.v[0]);
+       if (prune_reflogs) {
+               struct child_process cmd = CHILD_PROCESS_INIT;
+
+               cmd.git_cmd = 1;
+               strvec_pushv(&cmd.args, reflog.v);
+               if (run_command(&cmd))
+                       die(FAILED_RUN, reflog.v[0]);
+       }
 }
 
 int cmd_gc(int argc, const char **argv, const char *prefix)
@@ -550,6 +558,7 @@ int cmd_gc(int argc, const char **argv, const char *prefix)
        int daemonized = 0;
        int keep_largest_pack = -1;
        timestamp_t dummy;
+       struct child_process rerere_cmd = CHILD_PROCESS_INIT;
 
        struct option builtin_gc_options[] = {
                OPT__QUIET(&quiet, N_("suppress progress reporting")),
@@ -593,6 +602,10 @@ int cmd_gc(int argc, const char **argv, const char *prefix)
        if (prune_expire && parse_expiry_date(prune_expire, &dummy))
                die(_("failed to parse prune expiry value %s"), prune_expire);
 
+       prepare_repo_settings(the_repository);
+       if (cruft_packs < 0)
+               cruft_packs = the_repository->settings.gc_cruft_packs;
+
        if (aggressive) {
                strvec_push(&repack, "-f");
                if (aggressive_depth > 0)
@@ -671,11 +684,17 @@ int cmd_gc(int argc, const char **argv, const char *prefix)
        gc_before_repack();
 
        if (!repository_format_precious_objects) {
-               if (run_command_v_opt(repack.v,
-                                     RUN_GIT_CMD | RUN_CLOSE_OBJECT_STORE))
+               struct child_process repack_cmd = CHILD_PROCESS_INIT;
+
+               repack_cmd.git_cmd = 1;
+               repack_cmd.close_object_store = 1;
+               strvec_pushv(&repack_cmd.args, repack.v);
+               if (run_command(&repack_cmd))
                        die(FAILED_RUN, repack.v[0]);
 
                if (prune_expire) {
+                       struct child_process prune_cmd = CHILD_PROCESS_INIT;
+
                        /* run `git prune` even if using cruft packs */
                        strvec_push(&prune, prune_expire);
                        if (quiet)
@@ -683,18 +702,26 @@ int cmd_gc(int argc, const char **argv, const char *prefix)
                        if (has_promisor_remote())
                                strvec_push(&prune,
                                            "--exclude-promisor-objects");
-                       if (run_command_v_opt(prune.v, RUN_GIT_CMD))
+                       prune_cmd.git_cmd = 1;
+                       strvec_pushv(&prune_cmd.args, prune.v);
+                       if (run_command(&prune_cmd))
                                die(FAILED_RUN, prune.v[0]);
                }
        }
 
        if (prune_worktrees_expire) {
+               struct child_process prune_worktrees_cmd = CHILD_PROCESS_INIT;
+
                strvec_push(&prune_worktrees, prune_worktrees_expire);
-               if (run_command_v_opt(prune_worktrees.v, RUN_GIT_CMD))
+               prune_worktrees_cmd.git_cmd = 1;
+               strvec_pushv(&prune_worktrees_cmd.args, prune_worktrees.v);
+               if (run_command(&prune_worktrees_cmd))
                        die(FAILED_RUN, prune_worktrees.v[0]);
        }
 
-       if (run_command_v_opt(rerere.v, RUN_GIT_CMD))
+       rerere_cmd.git_cmd = 1;
+       strvec_pushv(&rerere_cmd.args, rerere.v);
+       if (run_command(&rerere_cmd))
                die(FAILED_RUN, rerere.v[0]);
 
        report_garbage = report_pack_garbage;
@@ -704,7 +731,6 @@ int cmd_gc(int argc, const char **argv, const char *prefix)
                clean_pack_garbage();
        }
 
-       prepare_repo_settings(the_repository);
        if (the_repository->settings.gc_write_commit_graph == 1)
                write_commit_graph_reachable(the_repository->objects->odb,
                                             !quiet && !daemonized ? COMMIT_GRAPH_WRITE_PROGRESS : 0,
@@ -1454,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;
@@ -1497,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);
@@ -1517,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),
@@ -1535,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);
@@ -1542,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)) {
@@ -1554,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);
@@ -1572,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;
 }
@@ -1910,20 +1955,16 @@ static char *schtasks_task_name(const char *frequency)
 static int schtasks_remove_task(enum schedule_priority schedule)
 {
        const char *cmd = "schtasks";
-       int result;
-       struct strvec args = STRVEC_INIT;
+       struct child_process child = CHILD_PROCESS_INIT;
        const char *frequency = get_frequency(schedule);
        char *name = schtasks_task_name(frequency);
 
        get_schedule_cmd(&cmd, NULL);
-       strvec_split(&args, cmd);
-       strvec_pushl(&args, "/delete", "/tn", name, "/f", NULL);
-
-       result = run_command_v_opt(args.v, 0);
-
-       strvec_clear(&args);
+       strvec_split(&child.args, cmd);
+       strvec_pushl(&child.args, "/delete", "/tn", name, "/f", NULL);
        free(name);
-       return result;
+
+       return run_command(&child);
 }
 
 static int schtasks_remove_tasks(void)
index 5fa927d4e22bde2d2282230a98a1bfe744c628d1..f7821c5fbbaeda3888f3011ee5215393e1319952 100644 (file)
@@ -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"
index 5eafcf26b49bd92d1d24780107ca87d00a054e3a..89447a50838562795bb80172db8102ff7a42e91b 100644 (file)
@@ -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"
index c0383fe9df9a3eb2e34f8c5869f996ebc81fce2e..452f833ac4610121d5194a65087d733e4b66914f 100644 (file)
@@ -1,4 +1,4 @@
-#define USE_THE_INDEX_COMPATIBILITY_MACROS
+#define USE_THE_INDEX_VARIABLE
 #include "builtin.h"
 #include "run-command.h"
 
@@ -12,12 +12,13 @@ static int merge_entry(int pos, const char *path)
        const char *arguments[] = { pgm, "", "", "", path, "", "", "", NULL };
        char hexbuf[4][GIT_MAX_HEXSZ + 1];
        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))
@@ -27,11 +28,12 @@ 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);
 
-       if (run_command_v_opt(arguments, 0)) {
+       strvec_pushv(&cmd.args, arguments);
+       if (run_command(&cmd)) {
                if (one_shot)
                        err++;
                else {
@@ -45,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
@@ -60,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;
@@ -80,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);
index 3583cff71c7c7a6d1e78fc7e3a6f902015f0741f..284eb48609837e66d4511ecb7fb3cc89dfbf8b90 100644 (file)
@@ -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;
index fe853aa8f9147b540d5427af33cec824a54de3df..c8265e0aec7f902b173f75f4df3f072bddfbd6b3 100644 (file)
@@ -1,8 +1,9 @@
-#define USE_THE_INDEX_COMPATIBILITY_MACROS
+#define USE_THE_INDEX_VARIABLE
 #include "builtin.h"
 #include "tree-walk.h"
 #include "xdiff-interface.h"
 #include "help.h"
+#include "commit.h"
 #include "commit-reach.h"
 #include "merge-ort.h"
 #include "object-store.h"
@@ -406,6 +407,7 @@ struct merge_tree_options {
 };
 
 static int real_merge(struct merge_tree_options *o,
+                     const char *merge_base,
                      const char *branch1, const char *branch2,
                      const char *prefix)
 {
@@ -432,16 +434,31 @@ static int real_merge(struct merge_tree_options *o,
        opt.branch1 = branch1;
        opt.branch2 = branch2;
 
-       /*
-        * Get the merge bases, in reverse order; see comment above
-        * merge_incore_recursive in merge-ort.h
-        */
-       merge_bases = get_merge_bases(parent1, parent2);
-       if (!merge_bases && !o->allow_unrelated_histories)
-               die(_("refusing to merge unrelated histories"));
-       merge_bases = reverse_commit_list(merge_bases);
+       if (merge_base) {
+               struct commit *base_commit;
+               struct tree *base_tree, *parent1_tree, *parent2_tree;
+
+               base_commit = lookup_commit_reference_by_name(merge_base);
+               if (!base_commit)
+                       die(_("could not lookup commit %s"), merge_base);
+
+               opt.ancestor = merge_base;
+               base_tree = get_commit_tree(base_commit);
+               parent1_tree = get_commit_tree(parent1);
+               parent2_tree = get_commit_tree(parent2);
+               merge_incore_nonrecursive(&opt, base_tree, parent1_tree, parent2_tree, &result);
+       } else {
+               /*
+                * Get the merge bases, in reverse order; see comment above
+                * merge_incore_recursive in merge-ort.h
+                */
+               merge_bases = get_merge_bases(parent1, parent2);
+               if (!merge_bases && !o->allow_unrelated_histories)
+                       die(_("refusing to merge unrelated histories"));
+               merge_bases = reverse_commit_list(merge_bases);
+               merge_incore_recursive(&opt, merge_bases, parent1, parent2, &result);
+       }
 
-       merge_incore_recursive(&opt, merge_bases, parent1, parent2, &result);
        if (result.clean < 0)
                die(_("failure to merge"));
 
@@ -487,6 +504,7 @@ int cmd_merge_tree(int argc, const char **argv, const char *prefix)
        struct merge_tree_options o = { .show_messages = -1 };
        int expected_remaining_argc;
        int original_argc;
+       const char *merge_base = NULL;
 
        const char * const merge_tree_usage[] = {
                N_("git merge-tree [--write-tree] [<options>] <branch1> <branch2>"),
@@ -515,6 +533,10 @@ int cmd_merge_tree(int argc, const char **argv, const char *prefix)
                           &o.use_stdin,
                           N_("perform multiple merges, one per line of input"),
                           PARSE_OPT_NONEG),
+               OPT_STRING(0, "merge-base",
+                          &merge_base,
+                          N_("commit"),
+                          N_("specify a merge-base for the merge")),
                OPT_END()
        };
 
@@ -529,16 +551,35 @@ int cmd_merge_tree(int argc, const char **argv, const char *prefix)
 
                if (o.mode == MODE_TRIVIAL)
                        die(_("--trivial-merge is incompatible with all other options"));
+               if (merge_base)
+                       die(_("--merge-base is incompatible with --stdin"));
                line_termination = '\0';
                while (strbuf_getline_lf(&buf, stdin) != EOF) {
                        struct strbuf **split;
                        int result;
+                       const char *input_merge_base = NULL;
 
                        split = strbuf_split(&buf, ' ');
-                       if (!split[0] || !split[1] || split[2])
+                       if (!split[0] || !split[1])
                                die(_("malformed input line: '%s'."), buf.buf);
                        strbuf_rtrim(split[0]);
-                       result = real_merge(&o, split[0]->buf, split[1]->buf, prefix);
+                       strbuf_rtrim(split[1]);
+
+                       /* parse the merge-base */
+                       if (!strcmp(split[1]->buf, "--")) {
+                               input_merge_base = split[0]->buf;
+                       }
+
+                       if (input_merge_base && split[2] && split[3] && !split[4]) {
+                               strbuf_rtrim(split[2]);
+                               strbuf_rtrim(split[3]);
+                               result = real_merge(&o, input_merge_base, split[2]->buf, split[3]->buf, prefix);
+                       } else if (!input_merge_base && !split[2]) {
+                               result = real_merge(&o, NULL, split[0]->buf, split[1]->buf, prefix);
+                       } else {
+                               die(_("malformed input line: '%s'."), buf.buf);
+                       }
+
                        if (result < 0)
                                die(_("merging cannot continue; got unclean result of %d"), result);
                        strbuf_list_free(split);
@@ -581,7 +622,7 @@ int cmd_merge_tree(int argc, const char **argv, const char *prefix)
 
        /* Do the relevant type of merge */
        if (o.mode == MODE_REAL)
-               return real_merge(&o, argv[0], argv[1], prefix);
+               return real_merge(&o, merge_base, argv[0], argv[1], prefix);
        else
                return trivial_merge(argv[0], argv[1], argv[2]);
 }
index a6698adbfd3d201a94e7450735406710b1e5e144..ecccd5e91196abcc3211dc255e84fd74ad024b51 100644 (file)
@@ -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);
@@ -345,63 +345,53 @@ out:
        return rc;
 }
 
-static void read_empty(const struct object_id *oid, int verbose)
+static void read_empty(const struct object_id *oid)
 {
-       int i = 0;
-       const char *args[7];
-
-       args[i++] = "read-tree";
-       if (verbose)
-               args[i++] = "-v";
-       args[i++] = "-m";
-       args[i++] = "-u";
-       args[i++] = empty_tree_oid_hex();
-       args[i++] = oid_to_hex(oid);
-       args[i] = NULL;
+       struct child_process cmd = CHILD_PROCESS_INIT;
+
+       strvec_pushl(&cmd.args, "read-tree", "-m", "-u", empty_tree_oid_hex(),
+                    oid_to_hex(oid), NULL);
+       cmd.git_cmd = 1;
 
-       if (run_command_v_opt(args, RUN_GIT_CMD))
+       if (run_command(&cmd))
                die(_("read-tree failed"));
 }
 
-static void reset_hard(const struct object_id *oid, int verbose)
+static void reset_hard(const struct object_id *oid)
 {
-       int i = 0;
-       const char *args[6];
-
-       args[i++] = "read-tree";
-       if (verbose)
-               args[i++] = "-v";
-       args[i++] = "--reset";
-       args[i++] = "-u";
-       args[i++] = oid_to_hex(oid);
-       args[i] = NULL;
+       struct child_process cmd = CHILD_PROCESS_INIT;
+
+       strvec_pushl(&cmd.args, "read-tree", "-v", "--reset", "-u",
+                    oid_to_hex(oid), NULL);
+       cmd.git_cmd = 1;
 
-       if (run_command_v_opt(args, RUN_GIT_CMD))
+       if (run_command(&cmd))
                die(_("read-tree failed"));
 }
 
 static void restore_state(const struct object_id *head,
                          const struct object_id *stash)
 {
-       struct strvec args = STRVEC_INIT;
+       struct child_process cmd = CHILD_PROCESS_INIT;
 
-       reset_hard(head, 1);
+       reset_hard(head);
 
        if (is_null_oid(stash))
                goto refresh_cache;
 
-       strvec_pushl(&args, "stash", "apply", "--index", "--quiet", NULL);
-       strvec_push(&args, oid_to_hex(stash));
+       strvec_pushl(&cmd.args, "stash", "apply", "--index", "--quiet", NULL);
+       strvec_push(&cmd.args, oid_to_hex(stash));
 
        /*
         * It is OK to ignore error here, for example when there was
         * nothing to restore.
         */
-       run_command_v_opt(args.v, RUN_GIT_CMD);
-       strvec_clear(&args);
+       cmd.git_cmd = 1;
+       run_command(&cmd);
 
 refresh_cache:
-       if (discard_cache() < 0 || read_cache() < 0)
+       discard_cache();
+       if (read_cache() < 0)
                die(_("could not read index"));
 }
 
@@ -704,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);
@@ -726,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") ||
@@ -760,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);
@@ -794,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;
@@ -869,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");
@@ -920,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);
@@ -1386,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))) {
@@ -1407,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();
@@ -1470,7 +1465,7 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
                                               check_trust_level);
 
                remote_head_oid = &remoteheads->item->object.oid;
-               read_empty(remote_head_oid, 0);
+               read_empty(remote_head_oid);
                update_ref("initial pull", "HEAD", remote_head_oid, NULL, 0,
                           UPDATE_REFS_DIE_ON_ERR);
                goto done;
@@ -1612,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
index 3413ad1c9b14ca7f0ed8946682c293a371b70f17..19790ce38fa265d1b2b02f738ad6351492752e10 100644 (file)
@@ -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
index be51f692257f67e2765feb6ff63e8037f3a4f00d..80d9dfd25cad2afcb90c0219894529bcc1558cac 100644 (file)
@@ -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);
index df376b2ed1e0920e727e5e0a373fbb053ddf3d5a..27192201086877115157d6f5cedb2f8fc1e231a6 100644 (file)
@@ -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)
index 403a24d7ca670f9a5c56ebfb6d8429b5e5817b54..1ab4de0005da3f6d2aa4b6a93d61544818af8700 100644 (file)
@@ -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"
@@ -515,76 +515,75 @@ static void parse_repo_refspecs(int argc, const char **argv, const char **repo,
  */
 static int run_fetch(const char *repo, const char **refspecs)
 {
-       struct strvec args = STRVEC_INIT;
-       int ret;
+       struct child_process cmd = CHILD_PROCESS_INIT;
 
-       strvec_pushl(&args, "fetch", "--update-head-ok", NULL);
+       strvec_pushl(&cmd.args, "fetch", "--update-head-ok", NULL);
 
        /* Shared options */
-       argv_push_verbosity(&args);
+       argv_push_verbosity(&cmd.args);
        if (opt_progress)
-               strvec_push(&args, opt_progress);
+               strvec_push(&cmd.args, opt_progress);
 
        /* Options passed to git-fetch */
        if (opt_all)
-               strvec_push(&args, opt_all);
+               strvec_push(&cmd.args, opt_all);
        if (opt_append)
-               strvec_push(&args, opt_append);
+               strvec_push(&cmd.args, opt_append);
        if (opt_upload_pack)
-               strvec_push(&args, opt_upload_pack);
-       argv_push_force(&args);
+               strvec_push(&cmd.args, opt_upload_pack);
+       argv_push_force(&cmd.args);
        if (opt_tags)
-               strvec_push(&args, opt_tags);
+               strvec_push(&cmd.args, opt_tags);
        if (opt_prune)
-               strvec_push(&args, opt_prune);
+               strvec_push(&cmd.args, opt_prune);
        if (recurse_submodules_cli != RECURSE_SUBMODULES_DEFAULT)
                switch (recurse_submodules_cli) {
                case RECURSE_SUBMODULES_ON:
-                       strvec_push(&args, "--recurse-submodules=on");
+                       strvec_push(&cmd.args, "--recurse-submodules=on");
                        break;
                case RECURSE_SUBMODULES_OFF:
-                       strvec_push(&args, "--recurse-submodules=no");
+                       strvec_push(&cmd.args, "--recurse-submodules=no");
                        break;
                case RECURSE_SUBMODULES_ON_DEMAND:
-                       strvec_push(&args, "--recurse-submodules=on-demand");
+                       strvec_push(&cmd.args, "--recurse-submodules=on-demand");
                        break;
                default:
                        BUG("submodule recursion option not understood");
                }
        if (max_children)
-               strvec_push(&args, max_children);
+               strvec_push(&cmd.args, max_children);
        if (opt_dry_run)
-               strvec_push(&args, "--dry-run");
+               strvec_push(&cmd.args, "--dry-run");
        if (opt_keep)
-               strvec_push(&args, opt_keep);
+               strvec_push(&cmd.args, opt_keep);
        if (opt_depth)
-               strvec_push(&args, opt_depth);
+               strvec_push(&cmd.args, opt_depth);
        if (opt_unshallow)
-               strvec_push(&args, opt_unshallow);
+               strvec_push(&cmd.args, opt_unshallow);
        if (opt_update_shallow)
-               strvec_push(&args, opt_update_shallow);
+               strvec_push(&cmd.args, opt_update_shallow);
        if (opt_refmap)
-               strvec_push(&args, opt_refmap);
+               strvec_push(&cmd.args, opt_refmap);
        if (opt_ipv4)
-               strvec_push(&args, opt_ipv4);
+               strvec_push(&cmd.args, opt_ipv4);
        if (opt_ipv6)
-               strvec_push(&args, opt_ipv6);
+               strvec_push(&cmd.args, opt_ipv6);
        if (opt_show_forced_updates > 0)
-               strvec_push(&args, "--show-forced-updates");
+               strvec_push(&cmd.args, "--show-forced-updates");
        else if (opt_show_forced_updates == 0)
-               strvec_push(&args, "--no-show-forced-updates");
+               strvec_push(&cmd.args, "--no-show-forced-updates");
        if (set_upstream)
-               strvec_push(&args, set_upstream);
-       strvec_pushv(&args, opt_fetch.v);
+               strvec_push(&cmd.args, set_upstream);
+       strvec_pushv(&cmd.args, opt_fetch.v);
 
        if (repo) {
-               strvec_push(&args, repo);
-               strvec_pushv(&args, refspecs);
+               strvec_push(&cmd.args, repo);
+               strvec_pushv(&cmd.args, refspecs);
        } else if (*refspecs)
                BUG("refspecs without repo?");
-       ret = run_command_v_opt(args.v, RUN_GIT_CMD | RUN_CLOSE_OBJECT_STORE);
-       strvec_clear(&args);
-       return ret;
+       cmd.git_cmd = 1;
+       cmd.close_object_store = 1;
+       return run_command(&cmd);
 }
 
 /**
@@ -653,52 +652,50 @@ static int update_submodules(void)
  */
 static int run_merge(void)
 {
-       int ret;
-       struct strvec args = STRVEC_INIT;
+       struct child_process cmd = CHILD_PROCESS_INIT;
 
-       strvec_pushl(&args, "merge", NULL);
+       strvec_pushl(&cmd.args, "merge", NULL);
 
        /* Shared options */
-       argv_push_verbosity(&args);
+       argv_push_verbosity(&cmd.args);
        if (opt_progress)
-               strvec_push(&args, opt_progress);
+               strvec_push(&cmd.args, opt_progress);
 
        /* Options passed to git-merge */
        if (opt_diffstat)
-               strvec_push(&args, opt_diffstat);
+               strvec_push(&cmd.args, opt_diffstat);
        if (opt_log)
-               strvec_push(&args, opt_log);
+               strvec_push(&cmd.args, opt_log);
        if (opt_signoff)
-               strvec_push(&args, opt_signoff);
+               strvec_push(&cmd.args, opt_signoff);
        if (opt_squash)
-               strvec_push(&args, opt_squash);
+               strvec_push(&cmd.args, opt_squash);
        if (opt_commit)
-               strvec_push(&args, opt_commit);
+               strvec_push(&cmd.args, opt_commit);
        if (opt_edit)
-               strvec_push(&args, opt_edit);
+               strvec_push(&cmd.args, opt_edit);
        if (cleanup_arg)
-               strvec_pushf(&args, "--cleanup=%s", cleanup_arg);
+               strvec_pushf(&cmd.args, "--cleanup=%s", cleanup_arg);
        if (opt_ff)
-               strvec_push(&args, opt_ff);
+               strvec_push(&cmd.args, opt_ff);
        if (opt_verify)
-               strvec_push(&args, opt_verify);
+               strvec_push(&cmd.args, opt_verify);
        if (opt_verify_signatures)
-               strvec_push(&args, opt_verify_signatures);
-       strvec_pushv(&args, opt_strategies.v);
-       strvec_pushv(&args, opt_strategy_opts.v);
+               strvec_push(&cmd.args, opt_verify_signatures);
+       strvec_pushv(&cmd.args, opt_strategies.v);
+       strvec_pushv(&cmd.args, opt_strategy_opts.v);
        if (opt_gpg_sign)
-               strvec_push(&args, opt_gpg_sign);
+               strvec_push(&cmd.args, opt_gpg_sign);
        if (opt_autostash == 0)
-               strvec_push(&args, "--no-autostash");
+               strvec_push(&cmd.args, "--no-autostash");
        else if (opt_autostash == 1)
-               strvec_push(&args, "--autostash");
+               strvec_push(&cmd.args, "--autostash");
        if (opt_allow_unrelated_histories > 0)
-               strvec_push(&args, "--allow-unrelated-histories");
+               strvec_push(&cmd.args, "--allow-unrelated-histories");
 
-       strvec_push(&args, "FETCH_HEAD");
-       ret = run_command_v_opt(args.v, RUN_GIT_CMD);
-       strvec_clear(&args);
-       return ret;
+       strvec_push(&cmd.args, "FETCH_HEAD");
+       cmd.git_cmd = 1;
+       return run_command(&cmd);
 }
 
 /**
@@ -879,43 +876,41 @@ static int get_rebase_newbase_and_upstream(struct object_id *newbase,
 static int run_rebase(const struct object_id *newbase,
                const struct object_id *upstream)
 {
-       int ret;
-       struct strvec args = STRVEC_INIT;
+       struct child_process cmd = CHILD_PROCESS_INIT;
 
-       strvec_push(&args, "rebase");
+       strvec_push(&cmd.args, "rebase");
 
        /* Shared options */
-       argv_push_verbosity(&args);
+       argv_push_verbosity(&cmd.args);
 
        /* Options passed to git-rebase */
        if (opt_rebase == REBASE_MERGES)
-               strvec_push(&args, "--rebase-merges");
+               strvec_push(&cmd.args, "--rebase-merges");
        else if (opt_rebase == REBASE_INTERACTIVE)
-               strvec_push(&args, "--interactive");
+               strvec_push(&cmd.args, "--interactive");
        if (opt_diffstat)
-               strvec_push(&args, opt_diffstat);
-       strvec_pushv(&args, opt_strategies.v);
-       strvec_pushv(&args, opt_strategy_opts.v);
+               strvec_push(&cmd.args, opt_diffstat);
+       strvec_pushv(&cmd.args, opt_strategies.v);
+       strvec_pushv(&cmd.args, opt_strategy_opts.v);
        if (opt_gpg_sign)
-               strvec_push(&args, opt_gpg_sign);
+               strvec_push(&cmd.args, opt_gpg_sign);
        if (opt_signoff)
-               strvec_push(&args, opt_signoff);
+               strvec_push(&cmd.args, opt_signoff);
        if (opt_autostash == 0)
-               strvec_push(&args, "--no-autostash");
+               strvec_push(&cmd.args, "--no-autostash");
        else if (opt_autostash == 1)
-               strvec_push(&args, "--autostash");
+               strvec_push(&cmd.args, "--autostash");
        if (opt_verify_signatures &&
            !strcmp(opt_verify_signatures, "--verify-signatures"))
                warning(_("ignoring --verify-signatures for rebase"));
 
-       strvec_push(&args, "--onto");
-       strvec_push(&args, oid_to_hex(newbase));
+       strvec_push(&cmd.args, "--onto");
+       strvec_push(&cmd.args, oid_to_hex(newbase));
 
-       strvec_push(&args, oid_to_hex(upstream));
+       strvec_push(&cmd.args, oid_to_hex(upstream));
 
-       ret = run_command_v_opt(args.v, RUN_GIT_CMD);
-       strvec_clear(&args);
-       return ret;
+       cmd.git_cmd = 1;
+       return run_command(&cmd);
 }
 
 static int get_can_ff(struct object_id *orig_head,
@@ -1035,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)))
@@ -1048,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)
index f0329c62a2dc04d0422a8de7bd27f813a19115cf..60ac8017e521f0c7c9192df89c797e1898ec60fd 100644 (file)
@@ -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;
 }
index f4cbe460b978447ba10bbb3e71b4faee1015d56d..f702f9d47bbfae249497aeeb0e2411ea97fc9f48 100644 (file)
@@ -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);
index 3f360eb2f37f4ad90543f70b9f612ecb911764f4..1481c5b6a5b3d2e66cd02b84b22f6655c59d6f23 100644 (file)
@@ -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"
@@ -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");
@@ -1270,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,
index 44bcea3a5b3add614c72531d112b7b4a9777751a..a90af3036303f1c6d8261559c7309fe9934874c7 100644 (file)
@@ -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;
 }
index 93285fc06e6b462b215b4947206cbdc04fa082fb..729f6f3643add1819942facaae5175555f9c167b 100644 (file)
@@ -92,13 +92,15 @@ static int verbose;
 
 static int fetch_remote(const char *name)
 {
-       const char *argv[] = { "fetch", name, NULL, NULL };
-       if (verbose) {
-               argv[1] = "-v";
-               argv[2] = name;
-       }
+       struct child_process cmd = CHILD_PROCESS_INIT;
+
+       strvec_push(&cmd.args, "fetch");
+       if (verbose)
+               strvec_push(&cmd.args, "-v");
+       strvec_push(&cmd.args, name);
+       cmd.git_cmd = 1;
        printf_ln(_("Updating %s"), name);
-       if (run_command_v_opt(argv, RUN_GIT_CMD))
+       if (run_command(&cmd))
                return error(_("Could not fetch %s"), name);
        return 0;
 }
@@ -1508,37 +1510,35 @@ static int update(int argc, const char **argv, const char *prefix)
                         N_("prune remotes after fetching")),
                OPT_END()
        };
-       struct strvec fetch_argv = STRVEC_INIT;
+       struct child_process cmd = CHILD_PROCESS_INIT;
        int default_defined = 0;
-       int retval;
 
        argc = parse_options(argc, argv, prefix, options,
                             builtin_remote_update_usage,
                             PARSE_OPT_KEEP_ARGV0);
 
-       strvec_push(&fetch_argv, "fetch");
+       strvec_push(&cmd.args, "fetch");
 
        if (prune != -1)
-               strvec_push(&fetch_argv, prune ? "--prune" : "--no-prune");
+               strvec_push(&cmd.args, prune ? "--prune" : "--no-prune");
        if (verbose)
-               strvec_push(&fetch_argv, "-v");
-       strvec_push(&fetch_argv, "--multiple");
+               strvec_push(&cmd.args, "-v");
+       strvec_push(&cmd.args, "--multiple");
        if (argc < 2)
-               strvec_push(&fetch_argv, "default");
+               strvec_push(&cmd.args, "default");
        for (i = 1; i < argc; i++)
-               strvec_push(&fetch_argv, argv[i]);
+               strvec_push(&cmd.args, argv[i]);
 
-       if (strcmp(fetch_argv.v[fetch_argv.nr-1], "default") == 0) {
+       if (strcmp(cmd.args.v[cmd.args.nr-1], "default") == 0) {
                git_config(get_remote_default, &default_defined);
                if (!default_defined) {
-                       strvec_pop(&fetch_argv);
-                       strvec_push(&fetch_argv, "--all");
+                       strvec_pop(&cmd.args);
+                       strvec_push(&cmd.args, "--all");
                }
        }
 
-       retval = run_command_v_opt(fetch_argv.v, RUN_GIT_CMD);
-       strvec_clear(&fetch_argv);
-       return retval;
+       cmd.git_cmd = 1;
+       return run_command(&cmd);
 }
 
 static int remove_all_fetch_refspecs(const char *key)
index fb3ac197426bd74e574e41ca2caca37314dce942..c1402ad038f2d4e2a60441db11fb1209e7d63c62 100644 (file)
@@ -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);
 
@@ -985,11 +1002,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);
index 69f18a248ee44c0f2eef5d2dd0cc5de1082698e9..dbf6fdfaf0edd43f9e1d46718c1ebb5db55630f3 100644 (file)
@@ -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;
@@ -143,7 +145,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 +160,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 +172,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 +221,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 +423,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 +434,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))
index 3acd93f71e1cf71edb4e01d48708adf2554986ad..d42db0b0cc9fa22ad8674ceddef8d1c735791f37 100644 (file)
@@ -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"
index e0244d63de67ad5b9316b07617ec5ac6c3c129e9..e67999e5ebc5ef640fe5dcd45dfa1b4126a9c7a8 100644 (file)
@@ -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;
@@ -586,7 +586,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 {
@@ -864,7 +864,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)) {
@@ -877,10 +877,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;
                        }
@@ -889,6 +893,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;
                        }
@@ -896,6 +902,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)
@@ -998,7 +1008,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;
index 8bc87e4c7705556e925e78416881b1d614c495e8..f2d86d2a8f999bbad13f51319e1ba3c0e4561d53 100644 (file)
@@ -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
 };
index f0d025a4e23d3ab28f34e282e0e2ef43459b2688..d4989d4d8637f6054f763ba516366a7eca7f316e 100644 (file)
@@ -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);
        }
 
index 8a64d564a195dca1eea01d9e5b8e34d4173b9dc4..bb0fd861434aae2e9dcdd7b83ec9dfdada38a457 100644 (file)
@@ -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;
index a7683d35299921c3a00e74e19cdad47379bfd1bb..05f2c9bc9858d98ae855b566d6128030e002fa18 100644 (file)
@@ -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)) {
@@ -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);
 }
index 7b0c924d7d406ee2c22b0b7e2633cc1c6d2ed039..82d5902cc8b15bafaeb09813ae99a45c54800b20 100644 (file)
@@ -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);
diff --git a/cache.h b/cache.h
index 26ed03bd6de626e497af549fe4fecfe27acaf699..07d40b0964b12b9f4875c20f26540585ffdc792e 100644 (file)
--- a/cache.h
+++ b/cache.h
@@ -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 *);
 
index 107757a1fea4c2839de8ebe871b648e91c5b97a6..4f407530d3057552177883ad6b088f0a65b37b9a 100755 (executable)
@@ -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
index 1808e3b1ce1d1c12428511bac6cba5182991ce36..706e3ba7e938d83091d1557ed20f7356e557f61d 100755 (executable)
--- a/ci/lib.sh
+++ b/ci/lib.sh
@@ -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
index daeee4e465c1246df1ca254403b81d8c0d2220ac..cc9af1e3cb3b3afca7d519147c4ae252b9f5832a 100644 (file)
@@ -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;
 
index 901375d58415a3ae21f03a15e7b78da6f8b08efa..d614f156df1db31248e3a1de51273ffefdd671ff 100644 (file)
@@ -196,16 +196,19 @@ static int read_yes_no_answer(void)
 static int ask_yes_no_if_possible(const char *format, ...)
 {
        char question[4096];
-       const char *retry_hook[] = { NULL, NULL, NULL };
+       const char *retry_hook;
        va_list args;
 
        va_start(args, format);
        vsnprintf(question, sizeof(question), format, args);
        va_end(args);
 
-       if ((retry_hook[0] = mingw_getenv("GIT_ASK_YESNO"))) {
-               retry_hook[1] = question;
-               return !run_command_v_opt(retry_hook, 0);
+       retry_hook = mingw_getenv("GIT_ASK_YESNO");
+       if (retry_hook) {
+               struct child_process cmd = CHILD_PROCESS_INIT;
+
+               strvec_pushl(&cmd.args, retry_hook, question, NULL);
+               return !run_command(&cmd);
        }
 
        if (!isatty(_fileno(stdin)) || !isatty(_fileno(stderr)))
index c058b2c70c39c68e8c3967e90e9848dab56537ed..27f38283add34658df1d6956b0803717ec191f19 100644 (file)
--- a/config.c
+++ b/config.c
@@ -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;
index b7770825c7b7eaa429b1a36678b66c8562992404..b90fd61790cef00d4141bb2eb30f33522e6e8c47 100644 (file)
@@ -101,6 +101,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");
index 6e59c92aa33c0c10067c0ed1c095c5ea9fa4f731..16b2c84f2e35fc931507477e4bc1d31573c82524 100644 (file)
@@ -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 }
index 3957e4cf8cd5be6e2524b50a51032d6a0b811aaa..2f6e0197ffa489ccc14b0665cdf78dba43b39e3e 100644 (file)
@@ -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")
index d3f29646dc3afa52cb960f190fe2f62e9887a501..1d45c0a40c81ee6f8501cac7a204a0b9cdca376b 100644 (file)
@@ -1 +1 @@
-*.patch*
+*.patch
index f0e80bd7f037731530e7099dc2b27985dd880be3..d1daa1f62639a1bbd37e4aedf6f51c1d8d831b63 100644 (file)
@@ -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.
index d69e120ccffc04b29e7e6f83ac382f3492b82037..c5dbb4557b56b130d1ed518af1ccdff6c112d7a6 100644 (file)
@@ -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 (file)
index 0000000..8520f03
--- /dev/null
@@ -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 (file)
index 0000000..01f875d
--- /dev/null
@@ -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,
+  ...)
index 7fe1e8d2d9a0167bec1289da81bbe4b4cae6fe4f..ae42cb07302d5e4e480f85b1a1bac9e05474966f 100644 (file)
@@ -1,4 +1,4 @@
-@ preincrement @
+@@
 identifier i;
 @@
 - ++i > 1
diff --git a/contrib/coccinelle/spatchcache b/contrib/coccinelle/spatchcache
new file mode 100755 (executable)
index 0000000..29e9352
--- /dev/null
@@ -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"
index 0970d98ad72f82bab1fc2b6ea6238c48526fa112..5f06105df6db7b790a89d3af8633c511d68bc85b 100644 (file)
@@ -1,4 +1,4 @@
-@ strbuf_addf_with_format_only @
+@@
 expression E;
 constant fmt !~ "%";
 @@
index a0934d1fdaf07e9748fb2055e4a47b029bcf8948..522177afb66354110b6a63a044d183c512ed1662 100644 (file)
@@ -1,4 +1,4 @@
-@ swap_with_declaration @
+@@
 type T;
 identifier tmp;
 T a, b;
index 072ea0d92287a780f80a4d8e0ecb1cd46bdcd064..747d382ff5f1ba82a3c967483850cfd5a139cb2f 100644 (file)
@@ -20,7 +20,6 @@ expression E;
 
 @@
 expression E;
-expression F;
 @@
 - has_object_file_with_flags(
 + repo_has_object_file_with_flags(the_repository,
index 26f9e99e1a978921d9ec19725c09a88247548d95..90c0d6958f4003b6b883366788ff15943151204d 100644 (file)
@@ -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.c b/diff.c
index 35e46dd9684cd3462899f70ea57bd24946051723..1054a4b7329d0b70ed62311a728b5257df3a8143 100644 (file)
--- a/diff.c
+++ b/diff.c
@@ -4301,35 +4301,34 @@ static void run_external_diff(const char *pgm,
                              const char *xfrm_msg,
                              struct diff_options *o)
 {
-       struct strvec argv = STRVEC_INIT;
-       struct strvec env = STRVEC_INIT;
+       struct child_process cmd = CHILD_PROCESS_INIT;
        struct diff_queue_struct *q = &diff_queued_diff;
 
-       strvec_push(&argv, pgm);
-       strvec_push(&argv, name);
+       strvec_push(&cmd.args, pgm);
+       strvec_push(&cmd.args, name);
 
        if (one && two) {
-               add_external_diff_name(o->repo, &argv, name, one);
+               add_external_diff_name(o->repo, &cmd.args, name, one);
                if (!other)
-                       add_external_diff_name(o->repo, &argv, name, two);
+                       add_external_diff_name(o->repo, &cmd.args, name, two);
                else {
-                       add_external_diff_name(o->repo, &argv, other, two);
-                       strvec_push(&argv, other);
-                       strvec_push(&argv, xfrm_msg);
+                       add_external_diff_name(o->repo, &cmd.args, other, two);
+                       strvec_push(&cmd.args, other);
+                       strvec_push(&cmd.args, xfrm_msg);
                }
        }
 
-       strvec_pushf(&env, "GIT_DIFF_PATH_COUNTER=%d", ++o->diff_path_counter);
-       strvec_pushf(&env, "GIT_DIFF_PATH_TOTAL=%d", q->nr);
+       strvec_pushf(&cmd.env, "GIT_DIFF_PATH_COUNTER=%d",
+                    ++o->diff_path_counter);
+       strvec_pushf(&cmd.env, "GIT_DIFF_PATH_TOTAL=%d", q->nr);
 
        diff_free_filespec_data(one);
        diff_free_filespec_data(two);
-       if (run_command_v_opt_cd_env(argv.v, RUN_USING_SHELL, NULL, env.v))
+       cmd.use_shell = 1;
+       if (run_command(&cmd))
                die(_("external diff died, stopping at %s"), name);
 
        remove_tempfile();
-       strvec_clear(&argv);
-       strvec_clear(&env);
 }
 
 static int similarity_index(struct diff_filepair *p)
@@ -5773,6 +5772,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;
@@ -6330,13 +6336,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;
@@ -6605,10 +6607,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);
 
index badc2261c201831a620fcc7c29edcc1fd3bdbf1e..9b588a1ee15a3bc93eaf4464f7d1e74265b2f3a2 100644 (file)
@@ -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 {
index c0f42301c849c7d697816a0e56577283dba32949..19d772f0f3ae3737d70e69837ff0d9aa3021da62 100644 (file)
@@ -54,10 +54,14 @@ enum ipc_active_state fsmonitor_ipc__get_state(void)
 
 static int spawn_daemon(void)
 {
-       const char *args[] = { "fsmonitor--daemon", "start", NULL };
+       struct child_process cmd = CHILD_PROCESS_INIT;
 
-       return run_command_v_opt_tr2(args, RUN_COMMAND_NO_STDIN | RUN_GIT_CMD,
-                                   "fsmonitor");
+       cmd.git_cmd = 1;
+       cmd.no_stdin = 1;
+       cmd.trace2_child_class = "fsmonitor";
+       strvec_pushl(&cmd.args, "fsmonitor--daemon", "start", NULL);
+
+       return run_command(&cmd);
 }
 
 int fsmonitor_ipc__send_query(const char *since_token,
diff --git a/git-bisect.sh b/git-bisect.sh
deleted file mode 100755 (executable)
index 405cf76..0000000
+++ /dev/null
@@ -1,84 +0,0 @@
-#!/bin/sh
-
-USAGE='[help|start|bad|good|new|old|terms|skip|next|reset|visualize|view|replay|log|run]'
-LONG_USAGE='git bisect help
-       print this long help message.
-git bisect start [--term-{new,bad}=<term> --term-{old,good}=<term>]
-                [--no-checkout] [--first-parent] [<bad> [<good>...]] [--] [<pathspec>...]
-       reset bisect state and start bisection.
-git bisect (bad|new) [<rev>]
-       mark <rev> a known-bad revision/
-               a revision after change in a given property.
-git bisect (good|old) [<rev>...]
-       mark <rev>... known-good revisions/
-               revisions before change in a given property.
-git bisect terms [--term-good | --term-bad]
-       show the terms used for old and new commits (default: bad, good)
-git bisect skip [(<rev>|<range>)...]
-       mark <rev>... untestable revisions.
-git bisect next
-       find next bisection to test and check it out.
-git bisect reset [<commit>]
-       finish bisection search and go back to commit.
-git bisect (visualize|view)
-       show bisect status in gitk.
-git bisect replay <logfile>
-       replay bisection log.
-git bisect log
-       show bisect log.
-git bisect run <cmd>...
-       use <cmd>... to automatically bisect.
-
-Please use "git help bisect" to get the full man page.'
-
-OPTIONS_SPEC=
-. git-sh-setup
-
-TERM_BAD=bad
-TERM_GOOD=good
-
-get_terms () {
-       if test -s "$GIT_DIR/BISECT_TERMS"
-       then
-               {
-               read TERM_BAD
-               read TERM_GOOD
-               } <"$GIT_DIR/BISECT_TERMS"
-       fi
-}
-
-case "$#" in
-0)
-       usage ;;
-*)
-       cmd="$1"
-       get_terms
-       shift
-       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;;
-       log)
-               git bisect--helper --bisect-log || exit ;;
-       run)
-               git bisect--helper --bisect-run "$@" || exit;;
-       terms)
-               git bisect--helper --bisect-terms "$@" || exit;;
-       *)
-               usage ;;
-       esac
-esac
index 56c85a85c1e4930ae1cef3b51be4b4e5bf283773..a0d5a4b28e171542a0bfca2a3e833607aa47d409 100644 (file)
@@ -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
 
index 5e5d21c010f7d4337dbf95cd50eeaf8c97791ba8..9a50f2e9124492589aa3a298a8bec74dbded8e32 100755 (executable)
@@ -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
diff --git a/git.c b/git.c
index ee7758dcb0e40e660c41001cd3c05f64ffcfb54c..277a8cce84084bf585121d27bfecaf8639fc80ee 100644 (file)
--- a/git.c
+++ b/git.c
@@ -492,7 +492,7 @@ static struct cmd_struct commands[] = {
        { "annotate", cmd_annotate, RUN_SETUP },
        { "apply", cmd_apply, RUN_SETUP_GENTLY },
        { "archive", cmd_archive, RUN_SETUP_GENTLY },
-       { "bisect--helper", cmd_bisect__helper, RUN_SETUP },
+       { "bisect", cmd_bisect, RUN_SETUP },
        { "blame", cmd_blame, RUN_SETUP },
        { "branch", cmd_branch, RUN_SETUP | DELAY_PAGER_CONFIG },
        { "bugreport", cmd_bugreport, RUN_SETUP_GENTLY },
@@ -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 },
@@ -787,7 +787,7 @@ static int run_argv(int *argcp, const char ***argv)
                if (!done_alias)
                        handle_builtin(*argcp, *argv);
                else if (get_builtin(**argv)) {
-                       struct strvec args = STRVEC_INIT;
+                       struct child_process cmd = CHILD_PROCESS_INIT;
                        int i;
 
                        /*
@@ -804,18 +804,21 @@ static int run_argv(int *argcp, const char ***argv)
 
                        commit_pager_choice();
 
-                       strvec_push(&args, "git");
+                       strvec_push(&cmd.args, "git");
                        for (i = 0; i < *argcp; i++)
-                               strvec_push(&args, (*argv)[i]);
+                               strvec_push(&cmd.args, (*argv)[i]);
 
-                       trace_argv_printf(args.v, "trace: exec:");
+                       trace_argv_printf(cmd.args.v, "trace: exec:");
 
                        /*
                         * if we fail because the command is not found, it is
                         * OK to return. Otherwise, we just pass along the status code.
                         */
-                       i = run_command_v_opt_tr2(args.v, RUN_SILENT_EXEC_FAILURE |
-                                                 RUN_CLEAN_ON_EXIT | RUN_WAIT_AFTER_CLEAN, "git_alias");
+                       cmd.silent_exec_failure = 1;
+                       cmd.clean_on_exit = 1;
+                       cmd.wait_after_clean = 1;
+                       cmd.trace2_child_class = "git_alias";
+                       i = run_command(&cmd);
                        if (i >= 0 || errno != ENOENT)
                                exit(i);
                        die("could not execute builtin %s", **argv);
diff --git a/http.c b/http.c
index 5d0502f51fd85d49ab2fa03995b8afcc585b12cc..8a5ba3f47769424e8315658b1f14903cc4957ecf 100644 (file)
--- a/http.c
+++ b/http.c
@@ -560,13 +560,15 @@ static void set_curl_keepalive(CURL *c)
 }
 #endif
 
-static void redact_sensitive_header(struct strbuf *header)
+/* Return 1 if redactions have been made, 0 otherwise. */
+static int redact_sensitive_header(struct strbuf *header, size_t offset)
 {
+       int ret = 0;
        const char *sensitive_header;
 
        if (trace_curl_redact &&
-           (skip_iprefix(header->buf, "Authorization:", &sensitive_header) ||
-            skip_iprefix(header->buf, "Proxy-Authorization:", &sensitive_header))) {
+           (skip_iprefix(header->buf + offset, "Authorization:", &sensitive_header) ||
+            skip_iprefix(header->buf + offset, "Proxy-Authorization:", &sensitive_header))) {
                /* The first token is the type, which is OK to log */
                while (isspace(*sensitive_header))
                        sensitive_header++;
@@ -575,8 +577,9 @@ static void redact_sensitive_header(struct strbuf *header)
                /* Everything else is opaque and possibly sensitive */
                strbuf_setlen(header,  sensitive_header - header->buf);
                strbuf_addstr(header, " <redacted>");
+               ret = 1;
        } else if (trace_curl_redact &&
-                  skip_iprefix(header->buf, "Cookie:", &sensitive_header)) {
+                  skip_iprefix(header->buf + offset, "Cookie:", &sensitive_header)) {
                struct strbuf redacted_header = STRBUF_INIT;
                const char *cookie;
 
@@ -612,6 +615,26 @@ static void redact_sensitive_header(struct strbuf *header)
 
                strbuf_setlen(header, sensitive_header - header->buf);
                strbuf_addbuf(header, &redacted_header);
+               ret = 1;
+       }
+       return ret;
+}
+
+/* Redact headers in info */
+static void redact_sensitive_info_header(struct strbuf *header)
+{
+       const char *sensitive_header;
+
+       /*
+        * curl's h2h3 prints headers in info, e.g.:
+        *   h2h3 [<header-name>: <header-val>]
+        */
+       if (trace_curl_redact &&
+           skip_iprefix(header->buf, "h2h3 [", &sensitive_header)) {
+               if (redact_sensitive_header(header, sensitive_header - header->buf)) {
+                       /* redaction ate our closing bracket */
+                       strbuf_addch(header, ']');
+               }
        }
 }
 
@@ -629,7 +652,7 @@ static void curl_dump_header(const char *text, unsigned char *ptr, size_t size,
 
        for (header = headers; *header; header++) {
                if (hide_sensitive_header)
-                       redact_sensitive_header(*header);
+                       redact_sensitive_header(*header, 0);
                strbuf_insertstr((*header), 0, text);
                strbuf_insertstr((*header), strlen(text), ": ");
                strbuf_rtrim((*header));
@@ -668,6 +691,18 @@ static void curl_dump_data(const char *text, unsigned char *ptr, size_t size)
        strbuf_release(&out);
 }
 
+static void curl_dump_info(char *data, size_t size)
+{
+       struct strbuf buf = STRBUF_INIT;
+
+       strbuf_add(&buf, data, size);
+
+       redact_sensitive_info_header(&buf);
+       trace_printf_key(&trace_curl, "== Info: %s", buf.buf);
+
+       strbuf_release(&buf);
+}
+
 static int curl_trace(CURL *handle, curl_infotype type, char *data, size_t size, void *userp)
 {
        const char *text;
@@ -675,7 +710,7 @@ static int curl_trace(CURL *handle, curl_infotype type, char *data, size_t size,
 
        switch (type) {
        case CURLINFO_TEXT:
-               trace_printf_key(&trace_curl, "== Info: %s", data);
+               curl_dump_info(data, size);
                break;
        case CURLINFO_HEADER_OUT:
                text = "=> Send header";
index 51d93310a4dee18ccfb559803583500ec45b27b4..a7f3e7f6ce43e0ce4786e417608a1a43bac47105 100644 (file)
@@ -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;
 }
 
index 1c1ee3d1bb18d1737bd9aded0472b899b1864459..b9543545ca4af96e062ec69546c354e318e4ad0d 100644 (file)
@@ -709,6 +709,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) {
index a8e2db933612ce56646bce347e038fc498788b95..22a603e8af402d11fff97172d3f3ded3a9849cd4 100644 (file)
@@ -193,7 +193,7 @@ static enum ll_merge_result ll_ext_merge(const struct ll_merge_driver *fn,
        struct strbuf cmd = STRBUF_INIT;
        struct strbuf_expand_dict_entry dict[6];
        struct strbuf path_sq = STRBUF_INIT;
-       const char *args[] = { NULL, NULL };
+       struct child_process child = CHILD_PROCESS_INIT;
        int status, fd, i;
        struct stat st;
        enum ll_merge_result ret;
@@ -219,8 +219,9 @@ static enum ll_merge_result ll_ext_merge(const struct ll_merge_driver *fn,
 
        strbuf_expand(&cmd, fn->cmdline, strbuf_expand_dict_cb, &dict);
 
-       args[0] = cmd.buf;
-       status = run_command_v_opt(args, RUN_USING_SHELL);
+       child.use_shell = 1;
+       strvec_push(&child.args, cmd.buf);
+       status = run_command(&child);
        fd = open(temp[1], O_RDONLY);
        if (fd < 0)
                goto bad;
index fa0d01b47c1286767068df928e83dd74c5f7b49e..fb6769742cd85ebe3782b071634d45922305f5d0 100644 (file)
--- a/ls-refs.c
+++ b/ls-refs.c
@@ -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;
@@ -195,6 +199,7 @@ int ls_refs(struct repository *r, struct packet_reader *request)
        packet_fflush(stdout);
        strvec_clear(&data.prefixes);
        strbuf_release(&data.buf);
+       string_list_clear(&data.hidden_refs, 0);
        return 0;
 }
 
index 4ddd3adea003e32fb7f16fbfa56a886a5d4a0712..2fd0aa968751f7defa06a51148f75bb5838b44d4 100644 (file)
@@ -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/merge.c b/merge.c
index 2382ff66d351cce20848b6f2ff056258adb2d4d7..445b4f19aa8618b5641f3f007e8cb42d9d39b57c 100644 (file)
--- a/merge.c
+++ b/merge.c
@@ -19,22 +19,22 @@ int try_merge_command(struct repository *r,
                      const char **xopts, struct commit_list *common,
                      const char *head_arg, struct commit_list *remotes)
 {
-       struct strvec args = STRVEC_INIT;
+       struct child_process cmd = CHILD_PROCESS_INIT;
        int i, ret;
        struct commit_list *j;
 
-       strvec_pushf(&args, "merge-%s", strategy);
+       strvec_pushf(&cmd.args, "merge-%s", strategy);
        for (i = 0; i < xopts_nr; i++)
-               strvec_pushf(&args, "--%s", xopts[i]);
+               strvec_pushf(&cmd.args, "--%s", xopts[i]);
        for (j = common; j; j = j->next)
-               strvec_push(&args, merge_argument(j->item));
-       strvec_push(&args, "--");
-       strvec_push(&args, head_arg);
+               strvec_push(&cmd.args, merge_argument(j->item));
+       strvec_push(&cmd.args, "--");
+       strvec_push(&cmd.args, head_arg);
        for (j = remotes; j; j = j->next)
-               strvec_push(&args, merge_argument(j->item));
+               strvec_push(&cmd.args, merge_argument(j->item));
 
-       ret = run_command_v_opt(args.v, RUN_GIT_CMD);
-       strvec_clear(&args);
+       cmd.git_cmd = 1;
+       ret = run_command(&cmd);
 
        discard_index(r->index);
        if (repo_read_index(r) < 0)
index 957790098fab7e9344d34ebc5a2ef066c24147bc..26290554bb4c5f1d679194fe7d3f2b5c78a273e2 100644 (file)
@@ -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);
index 8a74eb85e94603458e0fe7eafbc58a40a3380b10..682b852a46c1aa89c85c24c66660a1948b5c2184 100644 (file)
--- a/object.c
+++ b/object.c
@@ -286,9 +286,8 @@ 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;
diff --git a/path.c b/path.c
index a3cfcd8a6e95b3d018c55529d0e532a9d48da0ef..492e17ad12106233ddde63b724992f388693be10 100644 (file)
--- a/path.c
+++ b/path.c
@@ -901,7 +901,13 @@ int adjust_shared_perm(const char *path)
        if (S_ISDIR(old_mode)) {
                /* Copy read bits to execute bits */
                new_mode |= (new_mode & 0444) >> 2;
-               new_mode |= FORCE_DIR_SET_GID;
+
+               /*
+                * g+s matters only if any extra access is granted
+                * based on group membership.
+                */
+               if (FORCE_DIR_SET_GID && (new_mode & 060))
+                       new_mode |= FORCE_DIR_SET_GID;
        }
 
        if (((old_mode ^ new_mode) & ~S_IFMT) &&
index 8b2a936ba0d082a86c80f6e6aee2b3ce917bc9c9..a2cd8a01b4cf09b72610f7658e76536535a54514 100644 (file)
--- a/po/bg.po
+++ b/po/bg.po
 # out of range извън диапазона
 # checksum сума за проверка
 # superproject обхващащ проект
+# scalar repo скаларно хранилище
+# unclean завършвам работа/задача с грешка
+# cache tree кеш за обекти-дървета
 # ------------------------
 # „$var“ - може да не сработва за shell има gettext и eval_gettext - проверка - намират се лесно по „$
 # ------------------------
 # 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"
@@ -4492,6 +4465,11 @@ msgstr "„%s“ съществува и не е директория"
 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 "Ð\94Ñ\8aÑ\80воÑ\82о Ð½Ð° Ð¾Ñ\81новниÑ\8f ÐºÐµÑ\88 Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¾Ð±Ð½Ð¾Ð²ÐµÐ½Ð¾"
+msgstr "Ð\9aеÑ\88Ñ\8aÑ\82 Ð·Ð° Ð¾Ð±ÐµÐºÑ\82иÑ\82е-дÑ\8aÑ\80веÑ\82а Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¾Ð±Ð½Ð¾Ð²ÐµÐ½"
 
 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 "Ð\9fÑ\80овеÑ\80ка Ð½Ð° Ð´Ñ\8aÑ\80воÑ\82о Ð½Ð° ÐºÐµÑ\88а"
+msgstr "Ð\9fÑ\80овеÑ\80ка Ð½Ð° ÐºÐµÑ\88а Ð½Ð° Ð¾Ð±ÐµÐºÑ\82иÑ\82е-дÑ\8aÑ\80веÑ\82а"
 
 #, c-format
 msgid "%s: invalid sha1 pointer in cache-tree"
-msgstr "â\80\9e%sâ\80\9c: Ð½ÐµÐ¿Ñ\80авилен Ñ\83казаÑ\82ел Ð·Ð° SHA1 Ð² Ð´Ñ\8aÑ\80воÑ\82о Ð½Ð° ÐºÐµÑ\88а"
+msgstr "â\80\9e%sâ\80\9c: Ð½ÐµÐ¿Ñ\80авилен Ñ\83казаÑ\82ел Ð·Ð° SHA1 Ð² ÐºÐµÑ\88а Ð½Ð° Ð¾Ð±ÐµÐºÑ\82иÑ\82е-дÑ\8aÑ\80веÑ\82а"
 
 msgid "non-tree in cache-tree"
-msgstr "в Ð´Ñ\8aÑ\80воÑ\82о Ð½Ð° ÐºÐµÑ\88а има нещо, което не е дърво"
+msgstr "в ÐºÐµÑ\88а Ð½Ð° Ð¾Ð±ÐµÐºÑ\82иÑ\82е-дÑ\8aÑ\80веÑ\82а има нещо, което не е дърво"
 
 #, 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 [ОПЦИЯ…] [ПОДАВАНЕ…]"
 
@@ -9104,10 +9152,6 @@ msgid "cannot read note data from non-blob object '%s'."
 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,23 +14012,41 @@ 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 "не може да се създаде временен файл"
 
 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 "Ñ\84айлÑ\8aÑ\82 Ð½Ð° Ð°Ð´Ñ\80еÑ\81 â\80\9e%sâ\80\9c Ð½Ðµ Ðµ Ð¿Ñ\80аÑ\82ка"
+msgid "file at URI '%s' is not a bundle or bundle list"
+msgstr "Ñ\84айлÑ\8aÑ\82 Ð½Ð° Ð°Ð´Ñ\80еÑ\81 â\80\9e%sâ\80\9c Ð½Ðµ Ðµ Ð½Ð¸Ñ\82о Ð¿Ñ\80аÑ\82ка, Ð½Ð¸Ñ\82о Ñ\81пиÑ\81Ñ\8aк Ñ\81 Ð¿Ñ\80аÑ\82ки"
 
-#, 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]"
@@ -14932,6 +15048,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 ""
@@ -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"
@@ -19837,6 +19971,13 @@ msgstr "не може да се определи към какво да сочи
 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 ""
@@ -19985,6 +20126,14 @@ msgstr "scalar reconfigure [--all | ЗАЧИСЛЕНА_ДИРЕКТОРИЯ]"
 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 "дÑ\8aÑ\80воÑ\82о Ð½Ð° ÐºÐµÑ\88а Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¾Ð±Ð½Ð¾Ð²ÐµÐ½Ð¾"
+msgstr "кеÑ\88Ñ\8aÑ\82 Ð½Ð° Ð¾Ð±ÐµÐºÑ\82иÑ\82е-дÑ\8aÑ\80веÑ\82а Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¾Ð±Ð½Ð¾Ð²ÐµÐ½"
 
 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 "празно име на файл в запис в дърво"
index 7a17ed5936046a55c612ad06f34ceba660a3b0f1..91411483422d5218b142ff35581ed94174bc47c5 100644 (file)
--- a/po/ca.po
+++ b/po/ca.po
@@ -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 <pat>?"
 
 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"
@@ -4249,6 +4221,10 @@ msgstr "%s existeix i no és directori"
 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)"
@@ -8771,10 +8814,6 @@ msgstr "s'ha produït un error en llegir l'objecte «%s»."
 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,23 +13596,40 @@ 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"
 
 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."
 
@@ -14515,6 +14624,22 @@ msgstr "Ha fallat GetOverlappedResult a «%s» [GLE %ld]"
 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'"
@@ -19354,6 +19480,13 @@ msgstr "no s'ha pogut determinar la revisió de HEAD"
 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'"
@@ -19498,6 +19631,14 @@ msgstr "scalar reconfigure [--all | <enlistment>]"
 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"
index f5c9c29e0b2af13eff5f02313cddc7c14dee4531..45c7a418d75bacf60080fcb60c5b81560a001063 100644 (file)
--- a/po/de.po
+++ b/po/de.po
@@ -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"
@@ -4269,6 +4241,11 @@ msgstr "%s existiert und ist kein Verzeichnis"
 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>...]"
 
@@ -8848,10 +8895,6 @@ msgstr "Fehler beim Lesen des Objektes '%s'."
 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,23 +13778,40 @@ 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"
 
 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."
 
@@ -14683,6 +14801,22 @@ msgstr "GetOverlappedResult fehlgeschlagen auf '%s' [GLE %ld]"
 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"
 
@@ -19539,6 +19675,13 @@ msgstr "Konnte HEAD-Commit nicht bestimmen."
 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"
@@ -19683,6 +19826,14 @@ msgstr "scalar reconfigure [--all | <Eintragung>]"
 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)"
index b29d34100204664e4716badf519f9ac320f831dd..67eab9f900e851de1d6752f568b7721f3e83d31e 100644 (file)
--- a/po/fr.po
+++ b/po/fr.po
@@ -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"
@@ -4300,6 +4273,10 @@ msgstr "%s existe et n'est pas un répertoire"
 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>...]"
 
@@ -8859,10 +8903,6 @@ msgstr "impossible de lire l'objet '%s'."
 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,23 +13743,40 @@ 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"
 
 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."
 
@@ -14664,6 +14773,22 @@ msgstr "GetOverlappedResult a échoué sur '%s' [GLE %ld]"
 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"
 
@@ -19518,6 +19645,13 @@ msgstr "impossible de déterminer la révision HEAD"
 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"
@@ -19663,6 +19797,14 @@ msgstr "scala reconfigure [--all|<enrôlement>]"
 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 ""
index 7ce5acb674ced672d168b21029d0cadf29000924..41465eed2063a8ab78e7bcf0990341a082b10051 100644 (file)
--- a/po/id.po
+++ b/po/id.po
@@ -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"
@@ -3115,54 +3120,6 @@ msgstr ""
 "bisect run gagal: 'git bisect--helper --bisect-state %s' keluar dengan kode "
 "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"
@@ -3187,6 +3144,10 @@ msgstr "tidak ada berkas log yang diberikan"
 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)"
@@ -3426,10 +3387,6 @@ msgstr "Pembaruan berkas konfigurasi gagal"
 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'"
@@ -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'"
@@ -5262,11 +5228,6 @@ msgstr "Terlalu banyak argumen."
 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-"
@@ -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"
 
@@ -5525,13 +5492,17 @@ msgstr ""
 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"
@@ -6740,6 +6738,10 @@ msgstr "--merge-base hanya bekerja dengan dua komit"
 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"
@@ -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"
@@ -7843,14 +7853,6 @@ msgstr "git fsmonitor--daemon start [<opsi>]"
 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"
@@ -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
@@ -9947,14 +9974,14 @@ msgstr "git merge-base [-a | --all] <komit> <komit>..."
 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>]"
@@ -10094,10 +10121,24 @@ msgstr "daftar nama berkas tanpa mode/oid/tahap"
 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'"
@@ -10884,11 +10925,6 @@ msgstr "gagal membaca objek '%s'."
 msgid "cannot read note data from non-blob object '%s'."
 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'"
@@ -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
@@ -13557,6 +13616,11 @@ msgstr "tidak dapat membuka berkas sementara '%s' untuk ditulis"
 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"
@@ -13655,6 +13719,10 @@ msgstr "temukan deret geometri dengan faktor <N>"
 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
@@ -15564,10 +15664,6 @@ msgstr "lintasi submodul secara rekursif"
 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)"
@@ -15613,34 +15709,10 @@ msgstr ""
 "shallow] [--reference <repositori>] [--recursive] [--[no-]single-branch] "
 "[--] [<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"
@@ -15736,6 +15808,10 @@ msgstr "Mengaktifkan ulang direktori git lokal untuk submodul '%s'\n"
 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'"
@@ -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
@@ -16712,6 +16803,11 @@ msgstr "hanya berguna untuk penirkutuan"
 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"
@@ -16720,6 +16816,16 @@ msgstr "tidak dapat membuat berkas sementara"
 msgid "insufficient capabilities"
 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'"
@@ -16727,13 +16833,20 @@ 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
@@ -21492,11 +21631,6 @@ msgstr "tidak dapat menormalisasikan jalur objek alternatif: %s"
 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"
@@ -23819,6 +23958,15 @@ msgstr "tidak dapat menentukan revisi HEAD"
 msgid "failed to find tree of %s"
 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"
@@ -24005,6 +24153,16 @@ msgstr "scalar reconfigure [--all | <pendaftaran>]"
 msgid "--all or <enlistment>, but not both"
 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'"
@@ -24762,6 +24920,11 @@ msgstr ""
 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"
@@ -24770,11 +24933,6 @@ msgstr "menulis komit akar palsu"
 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>"
index 825142fde7d07ba1efbd7786c3ef76d10b08d593..4b5fe17e36ee956514ece525726ac6addc312f41 100644 (file)
--- a/po/sv.po
+++ b/po/sv.po
@@ -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"
@@ -4150,6 +4120,10 @@ msgstr "%s finns och är ingen katalog"
 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>...]"
 
@@ -8599,10 +8644,6 @@ msgstr "kunde inte läsa objektet \"%s\"."
 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,23 +13327,40 @@ 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"
 
 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."
 
@@ -14205,6 +14318,22 @@ msgstr "GetOverlappedResult misslyckades på \"%s\" [GLE %ld]"
 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"
 
@@ -18936,6 +19066,13 @@ msgstr "kunde inte bestämma HEAD-revision"
 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"
@@ -19079,6 +19216,14 @@ msgstr "scalar reconfigure [--all | <enrollering>]"
 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"
 
index 484e0acf2d27435deb14cf29aa0fca78b43a7d6e..9afdc234b3ec7dbfcfd5226b2cd07076bb7ee5fe 100644 (file)
--- a/po/tr.po
+++ b/po/tr.po
@@ -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"
@@ -4222,6 +4194,10 @@ msgstr "%s var ve bir dizin değil"
 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>...]"
 
@@ -8682,10 +8726,6 @@ msgstr "'%s' nesnesi okunamadı."
 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,23 +13425,40 @@ 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ı"
 
 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ı."
 
@@ -14299,6 +14411,22 @@ msgstr "GetOverlappedResult, '%s' üzerinde başarısız oldu [GLE %ld]"
 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)"
@@ -19037,6 +19166,13 @@ msgstr "HEAD revizyonu saptanamadı"
 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ş"
@@ -19180,6 +19316,14 @@ msgstr "scalar reconfigure [--all | <gönüllükayıt>]"
 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"
index b0832be6952b61c33f15d176985cf13ccb4fc195..1a0026a7dc4f8250084620b64ef7b5357bf839ed 100644 (file)
 #   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 "文件"
@@ -3175,54 +3181,6 @@ msgid ""
 "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 "标记引用的状态"
-
-#: 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 无需参数或者需要一个提交"
@@ -3247,6 +3205,10 @@ msgstr "未提供日志文件"
 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) 中"
@@ -3486,10 +3448,6 @@ msgstr "更新配置文件失败"
 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'"
@@ -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 "æ\97 æ\95\88ç\9a\84å\88\86æ\94¯å\90\8dï¼\9a'%s'"
+msgid "No branch named '%s'."
+msgstr "没æ\9c\89å\88\86æ\94¯ '%s'ã\80\82"
 
 #: 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'"
@@ -5296,11 +5261,6 @@ msgstr "太多参数。"
 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-"
@@ -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 "目录"
 
@@ -5551,13 +5516,17 @@ msgstr "不能同时使用 --reachable、--stdin-commits 或 --stdin-packs"
 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"
@@ -6744,6 +6739,10 @@ msgstr "--merge-base 仅适用于两个提交"
 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"
@@ -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"
@@ -7824,14 +7831,6 @@ msgstr "git fsmonitor--daemon start [<选项>]"
 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"
@@ -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
@@ -9897,14 +9921,14 @@ msgstr "git merge-base [-a | --all] <提交> <提交>..."
 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 <引用> [<提交>]"
@@ -10044,10 +10068,24 @@ msgstr "列出没有模式/对象 ID/暂存的文件名"
 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' 失败"
@@ -10821,11 +10859,6 @@ msgstr "无法读取对象 '%s'。"
 msgid "cannot read note data from non-blob object '%s'."
 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'"
@@ -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 "æ\97 æ³\95è\8e·å\8f\96 'onto':'%s'"
+msgid "invalid onto: '%s'"
+msgstr "æ\97 æ\95\88æ\96°å\9fºçº¿:'%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 " ???"
@@ -13415,6 +13470,11 @@ msgstr "无法打开临时文件 %s 进行写入"
 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 "所有内容打包到一个包文件中"
@@ -13511,6 +13571,10 @@ msgstr "使用因子 <n> 查找几何级数"
 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
@@ -15378,10 +15470,6 @@ msgstr "递归遍历子模组"
 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' 更新策略(默认)"
@@ -15426,34 +15514,10 @@ msgstr ""
 "shallow] [--reference <仓库>] [--recursive] [--[no-]single-branch] [--] [<路"
 "径>...]"
 
-#: 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 的输出"
@@ -15547,6 +15611,10 @@ msgstr "为子模组 '%s' 重新激活本地 git 目录\n"
 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'"
@@ -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
@@ -16504,6 +16588,11 @@ msgstr "只对调试有用"
 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 "无法创建临时文件"
@@ -16512,6 +16601,16 @@ msgstr "无法创建临时文件"
 msgid "insufficient capabilities"
 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'"
@@ -16519,13 +16618,20 @@ 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
@@ -21180,11 +21312,6 @@ msgstr "无法规范化备用对象路径:%s"
 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"
@@ -23466,6 +23598,15 @@ msgstr "不能确定 HEAD 版本"
 msgid "failed to find tree of %s"
 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"
@@ -23651,6 +23792,16 @@ msgstr "scalar reconfigure [--all | <登记>]"
 msgid "--all or <enlistment>, but not both"
 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'"
@@ -24397,6 +24548,11 @@ msgstr ""
 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 "写伪根提交"
@@ -24405,11 +24561,6 @@ msgstr "写伪根提交"
 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 "未处理的选项"
index 29b80891417a91156ca25b2dffd3453d83de5883..aa59a8e93334a8c9060646569404af2191304d8f 100644 (file)
@@ -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>
 # - 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] "å¢\9eå\8a äº\86 %d 個路徑\n"
+msgstr[0] "å·²å\8a å\85¥ %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 "å\8a å\85¥å·¥ä½\9cå\8d\80ç\8b\80æ\85\8bè\87³æ\9a«å­\98å\88\97表"
+msgstr "å°\87å·¥ä½\9cå\8d\80ç\8b\80æ\85\8bå\8a å\85¥è\87³æ\9a«å­\98æ\9b´å\8b\95é\9b\86"
 
 #: 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 "å\8a å\85¥æ\9cªè¿½è¹¤æª\94æ¡\88ç\9a\84å\85§å®¹è\87³æ\9a«å­\98å\88\97表"
+msgstr "å°\87æ\9cªè¿½è¹¤æª\94æ¡\88ç\9a\84å\85§å®¹å\8a å\85¥è\87³æ\9b´å\8b\95æ\9a«å­\98é\9b\86"
 
 #: 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 "å¿«å\8f\96"
+msgstr "å·²æ\9a«å­\98"
 
 #: 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 "å¥\97ç\94¨æ\96°å¢\9eè®\8aæ\9b´至索引 [y,n,q,a,d%s,?]? "
+msgstr "å°\87å\8a å\85¥å\8b\95ä½\9cå¥\97ç\94¨至索引 [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 "å¥\97ç\94¨ç´¢å¼\95å\8f\8aå·¥ä½\9cç\9b®é\8c\84ç\9a\84æ\96°å¢\9eè®\8aæ\9b´ [y,n,q,a,d%s,?]? "
+msgstr "å°\87å\8a å\85¥å\8b\95ä½\9cå¥\97ç\94¨å\88°ç´¢å¼\95å\92\8cå·¥ä½\9cå\8d\80 [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 ""
-"å¦\82æ\9e\9cæ\9cªä¹¾æ·¨å¥\97ç\94¨ï¼\8cæ\82¨å°±æ\9c\89æ©\9fæ\9c\83é\87\8dæ\96°編輯。\n"
-"若刪掉此區塊的全部內容,則會中止\n"
-"本次編輯,區塊則不會被修改。\n"
+"å¦\82æ\9e\9cæ²\92æ\9c\89å®\8cå\85¨å¥\97ç\94¨ï¼\8cæ\82¨å\8f¯ä»¥å\86\8d次編輯。\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 "æ²\92æ\9c\89å\85¶å®\83å\8f¯ä¾\9b跳轉的區塊"
+msgstr "æ²\92æ\9c\89å\85¶å®\83å\8f¯ä»¥跳轉的區塊"
 
 #: 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 "æ²\92æ\9c\89å\85¶å®\83å\8f¯ä¾\9b尋找的區塊"
+msgstr "æ²\92æ\9c\89å\85¶å®\83å\8f¯ä»¥尋找的區塊"
 
 #: 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 "å\9b ç\82ºå­\98å\9c¨æ\9cªè§£æ±ºç\9a\84è¡\9dçª\81è\80\8cé\9b¢é\96\8bã\80\82"
+msgstr "å­\98å\9c¨æ\9cªè§£æ±ºç\9a\84è¡\9dçª\81ï¼\8cé\9b¢é\96\8bã\80\82"
 
 #: 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 "å\9b ç\82ºå­\98å\9c¨æ\9cªå®\8cæ\88\90ç\9a\84å\90\88ä½µè\80\8cé\9b¢é\96\8bã\80\82"
+msgstr "å­\98å\9c¨æ\9cªå®\8cæ\88\90ç\9a\84å\90\88ä½µï¼\8cé\9b¢é\96\8bã\80\82"
 
 #: 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 "ç\84¡æ³\95è­\98å\88¥ç\9a\84空ç\99½å­\97å\85\83é\81¸é \85 '%s'"
+msgstr "空ç\99½å­\97å\85\83é\81¸é \85 â\80\9c%sâ\80\9d ç\84¡æ³\95è­\98å\88¥"
 
 #: apply.c
 #, c-format
 msgid "unrecognized whitespace ignore option '%s'"
-msgstr "ç\84¡æ³\95è­\98å\88¥ç\9a\84空ç\99½å­\97å\85\83忽ç\95¥é\81¸é \85 '%s'"
+msgstr "空ç\99½å­\97å\85\83忽ç\95¥é\81¸é \85 â\80\9c%sâ\80\9d ç\84¡æ³\95è­\98å\88¥"
 
 #: 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] "ç\95¶ç§»é\99¤ %d å\80\8bå\89\8då°\8eè·¯å¾\91å¾\8c git diff é ­ç¼ºä¹\8fæª\94æ¡\88å\90\8dè¨\8aæ\81¯ï¼\88第 %d è¡\8c)"
+msgstr[0] "移é\99¤ %d å\80\8bå\89\8då°\8eè·¯å¾\91é\83¨å\88\86å¾\8cï¼\8cgit diff æ¨\99頭缺å°\91æª\94æ¡\88å\90\8d稱è³\87è¨\8aï¼\88第 %d å\88\97)"
 
 #: 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 "ç\84¡æ³\95è­\98å\88¥ç\9a\84äº\8cé\80²ä½\8dä¿®è£\9cæª\94ä½\8dæ\96¼ç¬¬ %d è¡\8c"
+msgstr "第 %d å\88\97ç\9a\84äº\8cé\80²ä½\8dä¿®è£\9cæª\94ç\84¡æ³\95è­\98å\88¥"
 
 #: 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ï¼\9aä¸\8då­\98å\9c¨æ\96¼索引中"
+msgstr "%sï¼\9aä¸\8då\9c¨索引中"
 
 #: 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 "æ­£å\9c¨é\80²è¡\8cä¸\89æ\96¹å\90\88ä½µâ\8b¯â\8b¯\n"
+msgstr "æ­£å\9c¨é\80²è¡\8cä¸\89æ\96¹å\90\88ä½µâ\80¦â\80¦\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 "ç\84¡æ³\95é\80²è¡\8cä¸\89æ\96¹å\90\88ä½µâ\8b¯â\8b¯\n"
+msgstr "ç\84¡æ³\95é\80²è¡\8cä¸\89æ\96¹å\90\88ä½µâ\80¦â\80¦\n"
 
 #: apply.c
 #, c-format
 msgid "Applied patch to '%s' with conflicts.\n"
-msgstr "å¥\97ç\94¨ä¿®è£\9cæª\94å\88° '%s' å­\98å\9c¨衝突。\n"
+msgstr "å·²å¥\97ç\94¨å°\8d â\80\9c%sâ\80\9d ç\9a\84ä¿®è£\9cæª\94ï¼\8cä½\86æ\9c\89衝突。\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 "æ\88ªç\9f­ .rej æª\94æ¡\88å\90\8d為 %.*s.rej"
+msgstr "æ­£å\9c¨å°\87 .rej æª\94æ¡\88å\90\8d稱æ\88ªç\9f­為 %.*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 "æ\88\90å\8a\9få®\8cå\85¨å¥\97ç\94¨ç¬¬ #%d å\80\8bå\8d\80å¡\8aã\80\82"
 
 #: 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 "è·¯å¾\91太é\95·ï¼\88%d å\80\8bå­\97å\85\83ï¼\8cSHA1ï¼\9a%sï¼\89ï¼\9a%s"
 
 #: archive-zip.c
 #, c-format
 msgid "timestamp too large for this system: %<PRIuMAX>"
-msgstr "å°\8dæ\96¼æ\9c¬ç³»çµ±時間戳太大:%<PRIuMAX>"
+msgstr "å°\8dæ\9c¬ç³»çµ±è\80\8cè¨\80時間戳太大:%<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 "å\8f\83æ\95¸ä¸\8dæ\94¯æ\8f´æ­¤æ ¼å¼\8f '%s':-%d"
+msgstr "å¼\95æ\95¸ä¸\8dæ\94¯æ\8f´ â\80\9c%sâ\80\9d æ ¼å¼\8f:-%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"
-"å\8f¯è\83½æ\98¯å\9f·è¡\8cå\82³å\85¥ç\9a\84è·¯å¾\91å¼\95æ\95¸æ\98¯é\8c¯èª¤ç\9a\84?\n"
+"å\8f¯è\83½æ\98¯å\82³å\85¥ç\9a\84è·¯å¾\91å¼\95æ\95¸æ\9c\89誤?\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 "è«\8bæ±\82é\87\8då®\9aå\9fºåº\95æ\99\82ï¼\8cç\84¡æ³\95ç¹¼æ\89¿å¤\9aå\80\8bå\8f\83ç\85§的上游追蹤設定"
+msgstr "è«\8bæ±\82é\87\8då®\9aå\9fºåº\95æ\99\82ï¼\8cç\84¡æ³\95ç¹¼æ\89¿å¤\9aå\80\8bå¼\95ç\94¨的上游追蹤設定"
 
 #: 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"
+"æ\8a\93å\8f\96å¼\95ç\94¨è¦\8fæ ¼ï¼\8cæ\98 å°\84å\88°ä¸\8då\90\8cç\9a\84追蹤å\91½å\90\8d空é\96\93ã\80\82"
 
 #: 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"
-"ä¸\94建ç«\8bå\85©å\80\8bå\88\86æ\94¯é\96\93ç\9a\84追蹤é\97\9cä¿\82ï¼\8c\n"
-"æ\82¨å\8f¯è\83½é\9c\80è¦\81使ç\94¨ã\80\8cgit push -uã\80\8dæ\8e¨é\80\81å\88\86æ\94¯ä¸¦è¨­å®\9aå\92\8cä¸\8a游ç\9a\84é\97\9cè\81¯ã\80\82"
+"如果您打算將新建立的本機分支推送至對應的遠端分支,\n"
+"並建ç«\8bå\85©å\80\8bå\88\86æ\94¯é\96\93ç\9a\84追蹤é\97\9cä¿\82ï¼\8cæ\82¨å\8f¯è\83½é\9c\80è¦\81使ç\94¨ `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 "äº\92å\8b\95å¼\8fæ\8f\80選"
+msgstr "äº\92å\8b\95å¼\8fæ\8c\91選"
 
 #: 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 "å°\8d已追蹤æª\94æ¡\88ï¼\88é\9a±å\90« -uï¼\89é\87\8dæ\96°æ­¸ä¸\80æ\8f\9bè¡\8c符è\99\9f"
+msgstr "å°\8d已追蹤æª\94æ¡\88ï¼\88é\9a±å\90« -uï¼\89é\87\8dæ\96°æ¨\99æº\96å\8c\96 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 "建ç«\8bä¸\80å\80\8båµ\8cå\85¥å¼\8fç\89\88æ\9c¬åº«æ\99\82給äº\88警告"
+msgstr "åµ\8cå\85¥ç\89\88æ\9c¬åº«æ\99\82ç\99¼å\87º警告"
 
 #: 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 "ä¿®è£\9cæª\94使ç\94¨ format=flowed æ ¼å¼\8få\82³é\80\81ï¼\8cè¡\8c尾的空格可能會遺失。"
+msgstr "ä¿®è£\9cæª\94使ç\94¨ format=flowed æ ¼å¼\8få\82³é\80\81ï¼\9aå\88\97尾的空格可能會遺失。"
 
 #: 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 "æ­£å¥\97ç\94¨å\88°ä¸\80å\80\8b空歷å\8f²上"
+msgstr "æ­£å\9c¨å¥\97ç\94¨è\87³ç©ºç\99½æ­·å\8f²è¨\98é\8c\84上"
 
 #: 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 "ä¿®è£\9cæª\94ç\82ºç©º。"
+msgstr "ä¿®è£\9cæª\94空ç\99½。"
 
 #: 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"
-"æ\82¨æ\87\89該å°\8då·²ç¶\93è¡\9dçª\81解決ç\9a\84æ¯\8fä¸\80å\80\8bæª\94æ¡\88å\9f·è¡\8c 'git add' ä¾\86æ¨\99è¨\98å·²ç¶\93å®\8cæ\88\90ã\80\82 \n"
-"你可以對 \"由他們刪除\" 的檔案執行 `git rm` 指令。"
+"索引中仍有未合併路徑。\n"
+"æ\82¨æ\87\89該å°\8då·²ç¶\93解決è¡\9dçª\81ç\9a\84æ¯\8fä¸\80å\80\8bæª\94æ¡\88å\9f·è¡\8c `git add`ï¼\8cæ¨\99è¨\98ç\82ºå·²ç¶\93å®\8cæ\88\90ã\80\82\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 "以äº\92å\8b\95å¼\8fæ\96¹式執行"
+msgstr "äº\92å\8b\95式執行"
 
 #: builtin/am.c
 msgid "historical option -- no-op"
-msgstr "老的參數 —— 無作用"
+msgstr "歷史遺留選項——無作用"
 
 #: builtin/am.c
 msgid "allow fall back on 3way merging if needed"
-msgstr "å¦\82æ\9e\9cå¿\85è¦\81ï¼\8cå\85\81許使ç\94¨三方合併"
+msgstr "å¿\85è¦\81æ\99\82å\85\81許å\9b\9e復è\87³三方合併"
 
 #: 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 "æ\8d¨æ£\84裁切線前的所有內容"
+msgstr "æ\88ªæ\8e\89裁切線前的所有內容"
 
 #: 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 archiveNACK %s"
+msgstr "git archiveNACK %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 "æ\82¨ç¢ºèª\8då\97\8e[Y/n]ï¼\9f "
+msgstr "æ\98¯å\90¦ç¢ºå®\9a [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 "æ\82¨æ\83³è®\93æ\88\91ç\82ºæ\82¨é\80\99樣å\81\9aå\97\8e[Y/n]ï¼\9f "
+msgstr "æ\98¯å\90¦è¦\81é\80\99麼å\81\9a [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 é\9c\80è¦\81 0 æ\88\96 1 å\80\8bå\8f\83數"
+msgstr "--bisect-terms é\9c\80è¦\81 0 æ\88\96 1 å\80\8bå¼\95數"
 
 #: builtin/bisect--helper.c
 msgid "--bisect-next requires 0 arguments"
@@ -3128,6 +3096,10 @@ msgstr "未提供日誌檔案"
 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) 中"
@@ -3366,10 +3338,6 @@ msgstr "更新設定檔案失敗"
 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'"
@@ -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 "é\81 ç«¯ HEAD æ\8c\87å\90\91ä¸\80å\80\8bä¸\8då­\98å\9c¨ç\9a\84å¼\95ç\94¨ï¼\8cç\84¡æ³\95ç°½å\87º"
 
 #: builtin/clone.c
 msgid "unable to checkout working tree"
@@ -5162,11 +5137,6 @@ msgstr "太多參數。"
 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-"
@@ -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 "目錄"
 
@@ -5417,13 +5392,17 @@ msgstr "不能同時使用 --reachable、--stdin-commits 或 --stdin-packs"
 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 "æ\9f¥è©¢æ\99\82å\8f\83ç\85§ include 指令遞迴尋找"
+msgstr "æ\9f¥è©¢æ\99\82å¼\95ç\94¨ 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"
@@ -6618,6 +6623,10 @@ msgstr "--merge-base 只對 2 個以上的提交有用"
 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"
@@ -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"
@@ -7701,14 +7718,6 @@ msgstr "git fsmonitor--daemon start [<options>]"
 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"
@@ -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 "ç\8d¨ç«\8bå°\81è£\9dç\84¡å\8f\83ç\85§物件"
+msgstr "ç\8d¨ç«\8bå°\81è£\9dç\84¡å¼\95ç\94¨物件"
 
 #: 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 "æ­£å\9c¨å¾\9eæ¨\99æº\96輸å\85¥æ\88\96 tty è®\80å\8f\96ä¿®è£\9cæª\94å\85§å®¹â\8b¯â\8b¯"
+msgstr "æ­£å\9c¨å¾\9eæ¨\99æº\96輸å\85¥æ\88\96 tty è®\80å\8f\96ä¿®è£\9cæª\94å\85§å®¹â\80¦â\80¦"
 
 #: builtin/mailsplit.c
 #, c-format
@@ -9767,14 +9801,14 @@ msgstr "git merge-base [-a | --all] <提交> <提交>..."
 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 <引用> [<提交>]"
@@ -9913,10 +9947,24 @@ msgstr "列出檔名,但不附加 modes/oids/stages"
 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' 失敗"
@@ -10691,11 +10739,6 @@ msgstr "讀取物件 '%s' 失敗。"
 msgid "cannot read note data from non-blob object '%s'."
 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'"
@@ -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 "ç\84¡æ³\95å\8f\96å¾\97 'onto'ï¼\9a'%s'"
+msgid "invalid onto: '%s'"
+msgstr "ç\84¡æ\95\88ç\9a\84 ontoï¼\9aã\80\8c%sã\80\8d"
 
 #: 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."
@@ -13287,6 +13353,11 @@ msgstr "無法開啟 '%s' 暫存檔進行寫入"
 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 "所有內容打包到一個包檔案中"
@@ -13383,6 +13454,10 @@ msgstr "尋找因數是 <N> 的等比數列"
 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 "缺å°\91å¿\85è¦\81æª\94æ¡\88ï¼\9a%s"
+msgid "renaming pack to '%s' failed"
+msgstr "ç\84¡æ³\95å°\87å\8c\85é\87\8dæ\96°å\91½å\90\8dç\82ºã\80\8c%sã\80\8d"
 
 #: 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"
@@ -15248,10 +15352,6 @@ msgstr "遞迴遍歷子模組"
 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” 更新策略(預設值)"
@@ -15296,34 +15396,10 @@ msgstr ""
 "shallow] [--reference <repository>] [--recursive] [--[no-]single-branch] "
 "[--] [<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 的輸出"
@@ -15417,6 +15493,10 @@ msgstr "正在重新啟用「%s」子模組的本機 Git 目錄\n"
 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'"
@@ -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
@@ -16372,6 +16468,11 @@ msgstr "只對除錯有用"
 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] "é\80\99å\80\8bå¥\97件å\8c\85ï¼\8cå\90«æ\9c\89é\80\99 %<PRIuMAX> å\80\8bå¼\95ç\94¨ï¼\9a"
 
 #: 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"
@@ -21032,11 +21176,6 @@ msgstr "無法規範化備用物件路徑:%s"
 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"
@@ -23318,6 +23462,15 @@ msgstr "不能確定 HEAD 版本"
 msgid "failed to find tree of %s"
 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"
@@ -23503,6 +23656,16 @@ msgstr "scalar reconfigure [--all | <enlistment>]"
 msgid "--all or <enlistment>, but not both"
 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'"
@@ -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"
@@ -24254,6 +24417,11 @@ msgstr ""
 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 "寫偽根提交"
@@ -24262,11 +24430,6 @@ msgstr "寫偽根提交"
 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 [<選項>] <路徑>"
index 7c6477487a72824739f8099760c29d06036f4ece..1ff518b2a7f8cd3b383d86e1917bed4debc432b4 100644 (file)
@@ -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
@@ -2567,8 +2567,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;
 }
 
 /*
index b40b76c380610130e6346015a5f71360e092f5aa..caf10ab23eb49520d674654c52e585fb2d96307a 100644 (file)
@@ -1376,12 +1376,12 @@ static void find_subpos(const char *buf,
        /* subject is first non-empty line */
        *sub = buf;
        /* subject goes to first empty line before signature begins */
-       if ((eol = strstr(*sub, "\n\n"))) {
+       if ((eol = strstr(*sub, "\n\n")) ||
+           (eol = strstr(*sub, "\r\n\r\n"))) {
                eol = eol < sigstart ? eol : sigstart;
-       /* check if message uses CRLF */
-       } else if (! (eol = strstr(*sub, "\r\n\r\n"))) {
+       } else {
                /* treat whole message as subject */
-               eol = strrchr(*sub, '\0');
+               eol = sigstart;
        }
        buf = eol;
        *sublen = buf - *sub;
diff --git a/refs.c b/refs.c
index 1491ae937eb8c4d5be5dbe9678911fe39be390cd..2c7e88b1902b8d35b63808d781f4076d5567560f 100644 (file)
--- a/refs.c
+++ b/refs.c
@@ -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;
diff --git a/refs.h b/refs.h
index 8958717a17dd161618a89034f95d72064000290f..3266fd8f57d39938c2c496c8f869b14697c34c69 100644 (file)
--- a/refs.h
+++ b/refs.h
@@ -808,7 +808,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 +819,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);
index e8b58151bc4a01d0a90ba49d89ddf52d3d780995..3021921c53d22a29ff4a677fc0f569f4818e8244 100644 (file)
@@ -43,6 +43,7 @@ void prepare_repo_settings(struct repository *r)
        /* Defaults modified by feature.* */
        if (experimental) {
                r->settings.fetch_negotiation_algorithm = FETCH_NEGOTIATION_SKIPPING;
+               r->settings.gc_cruft_packs = 1;
        }
        if (manyfiles) {
                r->settings.index_version = 4;
index 5d166b692c8aa8ec24bbbde90cab1279ed2bdf53..3427085fd6d2e44fa32c3e0ebc4ffba7a4c8286f 100644 (file)
@@ -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"
index 24316ac944edcd5827de279d14fef7dea9334c74..6c461c5b9def017947c90bd84140ae48556e252a 100644 (file)
@@ -34,6 +34,7 @@ struct repo_settings {
        int commit_graph_generation_version;
        int commit_graph_read_changed_paths;
        int gc_write_commit_graph;
+       int gc_cruft_packs;
        int fetch_write_commit_graph;
        int command_requires_full_index;
        int sparse_index;
diff --git a/reset.c b/reset.c
index e3383a93343e3df16ee9eda6ee7886a49e980a1a..5ded23611f3f7316e2327872a54474ce6e4f6200 100644 (file)
--- a/reset.c
+++ b/reset.c
@@ -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;
index 650dd17599a7058b916381247450cdc228035ab1..c86e76e47165eda61ef9778d4991aeaecab5b195 100644 (file)
@@ -1,4 +1,5 @@
 #include "cache.h"
+#include "config.h"
 #include "object-store.h"
 #include "tag.h"
 #include "blob.h"
@@ -1517,27 +1518,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 +1596,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 +1614,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 +1898,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 +1919,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 +2244,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 +2708,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 +2721,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")) {
index afe1b77985faf5caeea507dad6639441013587c2..30febad09a1e3493ed9b89cd57486134cc120f14 100644 (file)
@@ -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
index c772acd74319698c57db3a6f3399f2922840af13..48b9ba6d6f077e5729f3efc4c1a88ab2be508c36 100644 (file)
@@ -1004,41 +1004,6 @@ int run_command(struct child_process *cmd)
        return finish_command(cmd);
 }
 
-int run_command_v_opt(const char **argv, int opt)
-{
-       return run_command_v_opt_cd_env(argv, opt, NULL, NULL);
-}
-
-int run_command_v_opt_tr2(const char **argv, int opt, const char *tr2_class)
-{
-       return run_command_v_opt_cd_env_tr2(argv, opt, NULL, NULL, tr2_class);
-}
-
-int run_command_v_opt_cd_env(const char **argv, int opt, const char *dir, const char *const *env)
-{
-       return run_command_v_opt_cd_env_tr2(argv, opt, dir, env, NULL);
-}
-
-int run_command_v_opt_cd_env_tr2(const char **argv, int opt, const char *dir,
-                                const char *const *env, const char *tr2_class)
-{
-       struct child_process cmd = CHILD_PROCESS_INIT;
-       strvec_pushv(&cmd.args, argv);
-       cmd.no_stdin = opt & RUN_COMMAND_NO_STDIN ? 1 : 0;
-       cmd.git_cmd = opt & RUN_GIT_CMD ? 1 : 0;
-       cmd.stdout_to_stderr = opt & RUN_COMMAND_STDOUT_TO_STDERR ? 1 : 0;
-       cmd.silent_exec_failure = opt & RUN_SILENT_EXEC_FAILURE ? 1 : 0;
-       cmd.use_shell = opt & RUN_USING_SHELL ? 1 : 0;
-       cmd.clean_on_exit = opt & RUN_CLEAN_ON_EXIT ? 1 : 0;
-       cmd.wait_after_clean = opt & RUN_WAIT_AFTER_CLEAN ? 1 : 0;
-       cmd.close_object_store = opt & RUN_CLOSE_OBJECT_STORE ? 1 : 0;
-       cmd.dir = dir;
-       if (env)
-               strvec_pushv(&cmd.env, (const char **)env);
-       cmd.trace2_child_class = tr2_class;
-       return run_command(&cmd);
-}
-
 #ifndef NO_PTHREADS
 static pthread_t main_thread;
 static int main_thread_set;
index e3e1ea01ad9dde63eaa87d0f102955c36000d2f0..072db56a4dff15996889bded735dd02f2bc52e73 100644 (file)
@@ -150,9 +150,7 @@ struct child_process {
 }
 
 /**
- * The functions: child_process_init, start_command, finish_command,
- * run_command, run_command_v_opt, run_command_v_opt_cd_env, child_process_clear
- * do the following:
+ * The functions: start_command, finish_command, run_command do the following:
  *
  * - If a system call failed, errno is set and -1 is returned. A diagnostic
  *   is printed.
@@ -224,36 +222,6 @@ int run_command(struct child_process *);
  */
 int run_auto_maintenance(int quiet);
 
-#define RUN_COMMAND_NO_STDIN           (1<<0)
-#define RUN_GIT_CMD                    (1<<1)
-#define RUN_COMMAND_STDOUT_TO_STDERR   (1<<2)
-#define RUN_SILENT_EXEC_FAILURE                (1<<3)
-#define RUN_USING_SHELL                        (1<<4)
-#define RUN_CLEAN_ON_EXIT              (1<<5)
-#define RUN_WAIT_AFTER_CLEAN           (1<<6)
-#define RUN_CLOSE_OBJECT_STORE         (1<<7)
-
-/**
- * Convenience functions that encapsulate a sequence of
- * start_command() followed by finish_command(). The argument argv
- * specifies the program and its arguments. The argument opt is zero
- * or more of the flags `RUN_COMMAND_NO_STDIN`, `RUN_GIT_CMD`,
- * `RUN_COMMAND_STDOUT_TO_STDERR`, or `RUN_SILENT_EXEC_FAILURE`
- * that correspond to the members .no_stdin, .git_cmd,
- * .stdout_to_stderr, .silent_exec_failure of `struct child_process`.
- * The argument dir corresponds the member .dir. The argument env
- * corresponds to the member .env.
- */
-int run_command_v_opt(const char **argv, int opt);
-int run_command_v_opt_tr2(const char **argv, int opt, const char *tr2_class);
-/*
- * env (the environment) is to be formatted like environ: "VAR=VALUE".
- * To unset an environment variable use just "VAR".
- */
-int run_command_v_opt_cd_env(const char **argv, int opt, const char *dir, const char *const *env);
-int run_command_v_opt_cd_env_tr2(const char **argv, int opt, const char *dir,
-                                const char *const *env, const char *tr2_class);
-
 /**
  * Execute the given command, sending "in" to its stdin, and capturing its
  * stdout and stderr in the "out" and "err" strbufs. Any of the three may
index 6de9c0ee523abe56881d9d0158b8ff6a7e07c866..6c52243cdf1f68bb3716891bfabbdf85fe26fcd4 100644 (file)
--- a/scalar.c
+++ b/scalar.c
@@ -69,21 +69,18 @@ static void setup_enlistment_directory(int argc, const char **argv,
 
 static int run_git(const char *arg, ...)
 {
-       struct strvec argv = STRVEC_INIT;
+       struct child_process cmd = CHILD_PROCESS_INIT;
        va_list args;
        const char *p;
-       int res;
 
        va_start(args, arg);
-       strvec_push(&argv, arg);
+       strvec_push(&cmd.args, arg);
        while ((p = va_arg(args, const char *)))
-               strvec_push(&argv, p);
+               strvec_push(&cmd.args, p);
        va_end(args);
 
-       res = run_command_v_opt(argv.v, RUN_GIT_CMD);
-
-       strvec_clear(&argv);
-       return res;
+       cmd.git_cmd = 1;
+       return run_command(&cmd);
 }
 
 struct scalar_config {
@@ -599,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;
@@ -638,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;
@@ -725,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[] = {
index 433fec21562bba81ab3b675a74c21db41739c531..dbd56121e24f8a6adaad5d2634b64e320dfeeb78 100644 (file)
@@ -3187,18 +3187,15 @@ static int rollback_is_safe(void)
 
 static int reset_merge(const struct object_id *oid)
 {
-       int ret;
-       struct strvec argv = STRVEC_INIT;
+       struct child_process cmd = CHILD_PROCESS_INIT;
 
-       strvec_pushl(&argv, "reset", "--merge", NULL);
+       cmd.git_cmd = 1;
+       strvec_pushl(&cmd.args, "reset", "--merge", NULL);
 
        if (!is_null_oid(oid))
-               strvec_push(&argv, oid_to_hex(oid));
+               strvec_push(&cmd.args, oid_to_hex(oid));
 
-       ret = run_command_v_opt(argv.v, RUN_GIT_CMD);
-       strvec_clear(&argv);
-
-       return ret;
+       return run_command(&cmd);
 }
 
 static int rollback_single_pick(struct repository *r)
@@ -3562,15 +3559,17 @@ static int error_failed_squash(struct repository *r,
 
 static int do_exec(struct repository *r, const char *command_line)
 {
-       const char *child_argv[] = { NULL, NULL };
+       struct child_process cmd = CHILD_PROCESS_INIT;
        int dirty, status;
 
        fprintf(stderr, _("Executing: %s\n"), command_line);
-       child_argv[0] = command_line;
-       status = run_command_v_opt(child_argv, RUN_USING_SHELL);
+       cmd.use_shell = 1;
+       strvec_push(&cmd.args, 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);
@@ -3711,6 +3710,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)
@@ -3742,6 +3763,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++)
@@ -3749,12 +3771,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");
@@ -3765,6 +3787,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)) {
@@ -3801,26 +3824,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,
@@ -3868,7 +3871,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;
@@ -4045,9 +4048,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;
        }
 
@@ -4145,11 +4150,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);
@@ -4417,8 +4425,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);
@@ -4877,14 +4885,14 @@ cleanup_head_ref:
 
 static int continue_single_pick(struct repository *r, struct replay_opts *opts)
 {
-       struct strvec argv = STRVEC_INIT;
-       int ret;
+       struct child_process cmd = CHILD_PROCESS_INIT;
 
        if (!refs_ref_exists(get_main_ref_store(r), "CHERRY_PICK_HEAD") &&
            !refs_ref_exists(get_main_ref_store(r), "REVERT_HEAD"))
                return error(_("no cherry-pick or revert in progress"));
 
-       strvec_push(&argv, "commit");
+       cmd.git_cmd = 1;
+       strvec_push(&cmd.args, "commit");
 
        /*
         * continue_single_pick() handles the case of recovering from a
@@ -4897,11 +4905,9 @@ static int continue_single_pick(struct repository *r, struct replay_opts *opts)
                 * Include --cleanup=strip as well because we don't want the
                 * "# Conflicts:" messages.
                 */
-               strvec_pushl(&argv, "--no-edit", "--cleanup=strip", NULL);
+               strvec_pushl(&cmd.args, "--no-edit", "--cleanup=strip", NULL);
 
-       ret = run_command_v_opt(argv.v, RUN_GIT_CMD);
-       strvec_clear(&argv);
-       return ret;
+       return run_command(&cmd);
 }
 
 static int commit_staged_changes(struct repository *r,
index 41e1c3fd3f787e04d6e4fa9eb7c56b617f1c5fa5..60e3ce84395ceaa70648a828ea1610a7fe9705a6 100644 (file)
@@ -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
index 33f43edbf9a6b2e156f15628869c1d6c1755cd6f..aeb80fc4d5a33e1b5c6f2e1bbdf4cc3279802eef 100644 (file)
@@ -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/shell.c b/shell.c
index 7ff4109db7058b5677be2fa8775f699b54e4d4f1..af0d7c734f8347082ab094cf1fc8898cbf26b64d 100644 (file)
--- a/shell.c
+++ b/shell.c
@@ -52,21 +52,24 @@ static void cd_to_homedir(void)
 static void run_shell(void)
 {
        int done = 0;
-       static const char *help_argv[] = { HELP_COMMAND, NULL };
+       struct child_process help_cmd = CHILD_PROCESS_INIT;
 
        if (!access(NOLOGIN_COMMAND, F_OK)) {
                /* Interactive login disabled. */
-               const char *argv[] = { NOLOGIN_COMMAND, NULL };
+               struct child_process nologin_cmd = CHILD_PROCESS_INIT;
                int status;
 
-               status = run_command_v_opt(argv, 0);
+               strvec_push(&nologin_cmd.args, NOLOGIN_COMMAND);
+               status = run_command(&nologin_cmd);
                if (status < 0)
                        exit(127);
                exit(status);
        }
 
        /* Print help if enabled */
-       run_command_v_opt(help_argv, RUN_SILENT_EXEC_FAILURE);
+       help_cmd.silent_exec_failure = 1;
+       strvec_push(&help_cmd.args, HELP_COMMAND);
+       run_command(&help_cmd);
 
        do {
                const char *prog;
@@ -125,9 +128,13 @@ static void run_shell(void)
                           !strcmp(prog, "exit") || !strcmp(prog, "bye")) {
                        done = 1;
                } else if (is_valid_cmd_name(prog)) {
+                       struct child_process cmd = CHILD_PROCESS_INIT;
+
                        full_cmd = make_cmd(prog);
                        argv[0] = full_cmd;
-                       code = run_command_v_opt(argv, RUN_SILENT_EXEC_FAILURE);
+                       cmd.silent_exec_failure = 1;
+                       strvec_pushv(&cmd.args, argv);
+                       code = run_command(&cmd);
                        if (code == -1 && errno == ENOENT) {
                                fprintf(stderr, "unrecognized command '%s'\n", prog);
                        }
index e4a54ce19433dd0cdd553996762af642ace0d9b8..8c269dab803fa9a06a0e31ff42b6a20ec1983dbc 100644 (file)
@@ -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);
 }
 
 /*
index b958162d28631f5298cb2739b15feade8440342a..8ac2fca855d6c3615be2e5b8a7f16a4746441e1a 100644 (file)
@@ -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)
index 6a9fec6de1159f0389df2391c2d18e8d5fd7d297..b52a4ff1e73e3b137b7cd1a01e420c7f302497e6 100644 (file)
@@ -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
index 882782a519c97b65d2a6d487ac6849a540015fe4..2c2b2522402d087bee89ae8c08be99449c893057 100644 (file)
@@ -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 && \
index 976db4b8a01b804e7e697c308f769233083a576c..e966412999ac9e4d7279505275ed1480e04f5b2a 100755 (executable)
@@ -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;
index d10b2eeaf2754f5d6609f438c523ee26c92e0b05..df2beea8887f3504e5fbab25aef96eb3763ded84 100644 (file)
@@ -1,6 +1,8 @@
 (
        {
+               # show a
                echo a &&
+               # show b
                echo b
        }
 )
index 1e4b054bda0faa803ecf12c8f4622ed0b1b29023..641c157b98c0af678b15fb2cc25645eac8650602 100644 (file)
@@ -1,7 +1,10 @@
 (
        case "$x" in
+       # found foo
        x) foo ;;
+       # found other
        *)
+               # treat it as bar
                bar
                ;;
        esac
index 0f87db9ae6891f8536c6eec73b71e5f049ca9667..2192a2870a1ae3d098c78126eb06608f74a32437 100644 (file)
@@ -15,7 +15,8 @@
 ) | wuzzle &&
 (
        bop
-) | fazz       fozz &&
+) | fazz \
+       fozz &&
 (
        bup
 ) |
index f76fde1ffba91d7becf17c0990c39ac25a7083f0..a68f1f9d7c26745169ab4c45b3e6f5f7c5b3c6b3 100644 (file)
@@ -1,4 +1,8 @@
 (
+       # comment 1
        nothing &&
+       # comment 2
        something
+       # comment 3
+       # comment 4
 )
index 75477bb1add492288504244af4bd57ec45dd601c..cd584a435730045608f1ce9162274fb6fa53a2c8 100644 (file)
@@ -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
index f42f2d41ba8c68398631c256e2abb9705d32c6ba..e8733c97c645afce31a1253e90a69cfb017e4d7d 100644 (file)
@@ -1,3 +1,4 @@
 git ls-tree $tree path > current &&
-cat > expected <<EOF &&
+cat > expected <<\EOF &&
+EOF
 test_output
index a5810c9bddd8352c74f3213be1fd54d1986a72f4..d65c82129a68b7c3e2088ba9a95971e03a6952ee 100644 (file)
@@ -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 &&
index 2af9ced71cc331414ce22e5d4ef3fc1320b3c15d..7d9c2b560701f66eb854b1b31c8b3820347f7eb1 100644 (file)
@@ -1,2 +1,4 @@
 (
-       cat <<-INPUT)
+       cat <<-\INPUT)
+       fizz
+       INPUT
index fb6cf7285d02649a8df406db3e11ca4d59b9eeae..f92a7ce9992420e2e5483ddcd83d3118d5dfd516 100644 (file)
@@ -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
index f8b3aa73c4f180be48afff988c0f7cece67e45d4..b7364c82c89feba3baf9a149937f1e43bf91ff23 100644 (file)
@@ -1,5 +1,8 @@
 (
-       x=$(bobble <<-END &&
+       x=$(bobble <<-\END &&
+               fossil
+               vegetable
+               END
                wiffle) ?!AMP?!
        echo $x
 )
index be64b26869ada1f4d7d9715cb754c2aa826c6978..6c13bdcbfb5d12500ffc01915b853d0169abf13e 100644 (file)
@@ -1,5 +1,7 @@
 (
-       cat <<-TXT && echo "multi-line
+       cat <<-\TXT && echo "multi-line
        string" ?!AMP?!
+       fizzle
+       TXT
        bap
 )
index 110059ba58420e5924de64edb0ec44346b43cb34..1df3f782821b6a7221767fbdd76ad2c26b5d67c9 100644 (file)
@@ -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
index 44d86c35976ce1957aa0b4fb90f6b7e31f230d3c..cbaaf857d47a0bf23813933e768b6a9128670737 100644 (file)
@@ -8,7 +8,9 @@
                echo foo
        else
                echo foo &&
-               cat <<-EOF
+               cat <<-\EOF
+               bar
+               EOF
        fi ?!AMP?!
        echo poodle
 ) &&
index ffac8f901857eef401cdcfa6d60734c92a96b416..134d3a14f5c0c1efc51e21fe1fa29b52b5f9a0ab 100644 (file)
@@ -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
 )
index dd0dace077f0e093ccda9dc33b3296830e13c8d2..6bad21853006d38834bf1b4ebc2da46e3c6faebc 100644 (file)
@@ -1,6 +1,6 @@
 (
-       foobar &&
-       barfoo ?!AMP?!
+       foobar && # comment 1
+       barfoo ?!AMP?! # wrong position for &&
        flibble "not a # comment"
 ) &&
 
index 0ad23bb35e4fb173eb808f777fef2f2a453c8c1a..24da9e86d596b5d068b149242e213ba0224051d3 100644 (file)
@@ -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)) ||
index e3bef63f7548cb0c187ae938280029dd470922bb..29b3832a986af30d7026eef513cf01dc769316a2 100644 (file)
@@ -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
 )
index be4b27a305bec54678ae4669a1666405ec06f966..9138cf386d359267143945d13c1882b0feb5c6f4 100644 (file)
@@ -2,6 +2,8 @@
        foo &&
        (
                bar &&
+               # bottles wobble while fiddles gobble
+               # minor numbers of cows (or do they?)
                baz &&
                snaff
        ) ?!AMP?!
index 029d129299a0a5c68d45661071ba3ae144cd5377..52789278d13b7605a63c0c92c09c518990ab316f 100644 (file)
@@ -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
 )
index 69167da2f27a3098297191c6cbfc737eacb91e8a..71b3b3bc20ed1d6718f8d0ee6efe35b147557b8c 100644 (file)
@@ -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
index f272aa21fee1950a97a9eeddee9436a11c4e1f3f..1f5eaea0fd59757ea78b7dc0b24ec0971c2faa36 100644 (file)
@@ -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 (file)
index 0000000..9159a17
--- /dev/null
@@ -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;
+}
index 0d6d7f1ecbf198af006b4d80b8027a196d5caab3..454f17b1a0c1cceadffd6293db43790dcf42972a 100644 (file)
@@ -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;
index a209880eb37a2ce4de4b9f916ec3dbf52b987957..0ea97b8407296a3615ab786e9458ff9bbf638000 100644 (file)
@@ -1,3 +1,4 @@
+#define USE_THE_INDEX_VARIABLE
 #include "test-tool.h"
 #include "cache.h"
 #include "split-index.h"
index 99010614f6da9435e259e7e9a012e0154cbd9478..6d53683f13b04c2c89680408f3e348cf97043ffd 100644 (file)
@@ -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) {
index d5e511633ab9a7fbb1b06fc38b2e2127da8f40bd..27323cb3672c35152e83e8741585a6c9520159f0 100644 (file)
@@ -8,7 +8,7 @@ int cmd_main(int argc, const char **argv)
        struct strbuf buf = STRBUF_INIT;
        FILE *f;
        int i;
-       const char *child_argv[] = { NULL, NULL };
+       struct child_process cmd = CHILD_PROCESS_INIT;
 
        /* First, print all parameters into $TRASH_DIRECTORY/ssh-output */
        if (!trash_directory)
@@ -26,6 +26,7 @@ int cmd_main(int argc, const char **argv)
        /* Now, evaluate the *last* parameter */
        if (argc < 2)
                return 0;
-       child_argv[0] = argv[argc - 1];
-       return run_command_v_opt(child_argv, RUN_USING_SHELL);
+       cmd.use_shell = 1;
+       strvec_push(&cmd.args, argv[argc - 1]);
+       return run_command(&cmd);
 }
index 45665ec19a5d6d4e2cf37c1a2a9f87d69ff3be02..efc82dd80c5b5711ecb4947b3c082433845e1e50 100644 (file)
@@ -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");
 
index cd1b4c9736ef2c658dd3467506cbe5c1612cd4d2..ab86c14c8ba56b513ea302842ad9fbf638507404 100644 (file)
@@ -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",
index b736ef16421ba14e81f8e8c1654d936051efecbb..23e9e27109faa2acac0bd2804e1143efc7c8971b 100644 (file)
@@ -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;
 }
index 026c802479d012b30bc625c820f5d0fcc25e997c..a26107ed70ac023da79a573bf0d87cdad95016d0 100644 (file)
@@ -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;
index d860c387c3846d69b7bd63a144ede2f93da60886..71fe5c61455a89eddd6363a87e3c4eb7968f09b6 100644 (file)
@@ -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;
+}
index b7d117cd557a84eabcdc25df9ae874e0192e3dd7..e060cc6226895d750ced2cab19cedb46f97843b9 100644 (file)
@@ -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)
index 01cda9358df01f50de95a93c8aee795696da377d..7eb1a26a305b89c3d45954a2d41c2f3ad5f82196 100644 (file)
@@ -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 },
index ca2948066fd64ec4743e498fffd06829c2cfce2b..2e20a16eb82a115c09071b6a08887a4d11ab0761 100644 (file)
@@ -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);
index 1b092c60714f977f52f23ed62414c560630cd848..f374c21ec32ecc049bace6821d5630e103b8937c 100644 (file)
@@ -132,6 +132,7 @@ static int ut_003error(int argc, const char **argv)
  */
 static int ut_004child(int argc, const char **argv)
 {
+       struct child_process cmd = CHILD_PROCESS_INIT;
        int result;
 
        /*
@@ -141,7 +142,8 @@ static int ut_004child(int argc, const char **argv)
        if (!argc)
                return 0;
 
-       result = run_command_v_opt(argv, 0);
+       strvec_pushv(&cmd.args, argv);
+       result = run_command(&cmd);
        exit(result);
 }
 
index 8837717d36a77c04346279b570e1a0a4506fe838..7d45cd61e820305615f4c53157e39074adcb0a50 100644 (file)
@@ -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");
        }
index 1f6b9b08d1de626397396f9878812a7a6e6f0ef8..608949ea80b9a90cd00fcde239e7a39e21184f29 100644 (file)
@@ -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
@@ -174,6 +175,11 @@ prepare_httpd() {
        fi
 }
 
+enable_http2 () {
+       HTTPD_PARA="$HTTPD_PARA -DHTTP2"
+       test_set_prereq HTTP2
+}
+
 start_httpd() {
        prepare_httpd >&3 2>&4
 
index 706799391bd4047a1c15f8a32f77875cb8dcb44d..0294739a77a24f9c005250cffb0cab86f0b113ff 100644 (file)
@@ -29,6 +29,11 @@ ErrorLog error.log
        LoadModule setenvif_module modules/mod_setenvif.so
 </IfModule>
 
+<IfDefine HTTP2>
+LoadModule http2_module modules/mod_http2.so
+Protocols h2c
+</IfDefine>
+
 <IfVersion < 2.4>
 LockFile accept.lock
 </IfVersion>
@@ -64,12 +69,20 @@ LockFile accept.lock
 <IfModule !mod_access_compat.c>
        LoadModule access_compat_module modules/mod_access_compat.so
 </IfModule>
-<IfModule !mod_mpm_prefork.c>
-       LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
-</IfModule>
 <IfModule !mod_unixd.c>
        LoadModule unixd_module modules/mod_unixd.so
 </IfModule>
+
+<IfDefine HTTP2>
+<IfModule !mod_mpm_event.c>
+       LoadModule mpm_event_module modules/mod_mpm_event.so
+</IfModule>
+</IfDefine>
+<IfDefine !HTTP2>
+<IfModule !mod_mpm_prefork.c>
+       LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
+</IfModule>
+</IfDefine>
 </IfVersion>
 
 PassEnv GIT_VALGRIND
index c481c012d2fc17a7944f308c2d6ef68acb284dee..325566e18ebc7fa7359d079935d6d7f81cd4dc54 100755 (executable)
@@ -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 (executable)
index 0000000..a8eabca
--- /dev/null
@@ -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 (executable)
index 0000000..9b039e8
--- /dev/null
@@ -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
index 9ad76080aa49d46d03e2bb805d039e6a88d87e5c..53240476896d8e80a969f1b9b448fd01b45fa711 100755 (executable)
@@ -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
 
index 5cc62306e39c4f7ab2f6fec35d3cafc7bd65be86..7d7ecfd57162cf9cde2e74007a6323c635a3b2a9 100755 (executable)
@@ -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
index 7b5423eebdafa4f35b90ebe6194683e59e8bb46c..e2411f6a9bd93bad152360b6997bb9785d55ef18 100755 (executable)
@@ -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
 '
 
index 9f63f612425b3fbff9f38deca8dd0c2121a7df70..3648d439a87eabb37b581cf5e731f9048085703b 100755 (executable)
@@ -9,9 +9,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 &&
@@ -19,12 +21,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
 '
 
index 0b3436e8cac5a07759aa72dd1b8b5b8f62488248..b4e91351181bcbe767f9681a689e570025dd4f53 100755 (executable)
@@ -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" &&
index d08563de5c9d01818e286abd82f3957a0b00f843..cca4380e4319a024416c4bbe2e097f63e409af48 100755 (executable)
@@ -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.
index 4f3aa17c994240173fdb4de70da62611700e11fd..c71932b02423734908428a9b2be776fec229ce9e 100755 (executable)
@@ -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
index c6661e61af55219b73a20262aad5106bf203c3e2..2575279ab84e8a32239a7ea30f72022d3ff6b9f8 100755 (executable)
@@ -2228,6 +2228,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
index 43fcb7c0bfc85e3d29455ec37cfbf437e00238a9..2ef3579fa7c23db5055c41e68438d39871bcf6e9 100755 (executable)
@@ -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 &&
index 7f605f865b334dee36a49b47400fd8d876e699a4..5a169b68d6af4d3db62e88dcdc4fb765ee5232a6 100755 (executable)
@@ -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 &&
index 4f5abb5ad25e9d39fc85d4d20a4ab1d4905b61e2..462cefd25df3efd51b06023523530b3d97d3d3a9 100755 (executable)
@@ -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 &&
index f351701fec281aa6a88e9ee7185101639c8bbcd6..fa2a06c19f0ff9890733817d066778c7634ab523 100755 (executable)
@@ -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 &&
index cac85591b52b3b3d7d0a7aa7f5dbc0c32d8ebdda..a8983a0edcb99b6dd1166567ee658e41918df428 100755 (executable)
@@ -860,4 +860,66 @@ test_expect_success '--stdin with both a successful and a conflicted merge' '
        test_cmp expect actual
 '
 
+
+test_expect_success '--merge-base is incompatible with --stdin' '
+       test_must_fail git merge-tree --merge-base=side1 --stdin 2>expect &&
+
+       grep "^fatal: --merge-base is incompatible with --stdin" expect
+'
+
+# specify merge-base as parent of branch2
+# git merge-tree --write-tree --merge-base=c2 c1 c3
+#   Commit c1: add file1
+#   Commit c2: add file2 after c1
+#   Commit c3: add file3 after c2
+#   Expected: add file3, and file2 does NOT appear
+
+test_expect_success 'specify merge-base as parent of branch2' '
+       # Setup
+       test_when_finished "rm -rf base-b2-p" &&
+       git init base-b2-p &&
+       test_commit -C base-b2-p c1 file1 &&
+       test_commit -C base-b2-p c2 file2 &&
+       test_commit -C base-b2-p c3 file3 &&
+
+       # Testing
+       TREE_OID=$(git -C base-b2-p merge-tree --write-tree --merge-base=c2 c1 c3) &&
+
+       q_to_tab <<-EOF >expect &&
+       100644 blob $(git -C base-b2-p rev-parse c1:file1)Qfile1
+       100644 blob $(git -C base-b2-p rev-parse c3:file3)Qfile3
+       EOF
+
+       git -C base-b2-p ls-tree $TREE_OID >actual &&
+       test_cmp expect actual
+'
+
+# Since the earlier tests have verified that individual merge-tree calls
+# are doing the right thing, this test case is only used to verify that
+# we can also trigger merges via --stdin, and that when we do we get
+# the same answer as running a bunch of separate merges.
+
+test_expect_success 'check the input format when --stdin is passed' '
+       test_when_finished "rm -rf repo" &&
+       git init repo &&
+       test_commit -C repo c1 &&
+       test_commit -C repo c2 &&
+       test_commit -C repo c3 &&
+       printf "c1 c3\nc2 -- c1 c3\nc2 c3" | git -C repo merge-tree --stdin >actual &&
+
+       printf "1\0" >expect &&
+       git -C repo merge-tree --write-tree -z c1 c3 >>expect &&
+       printf "\0" >>expect &&
+
+       printf "1\0" >>expect &&
+       git -C repo merge-tree --write-tree -z --merge-base=c2 c1 c3 >>expect &&
+       printf "\0" >>expect &&
+
+       printf "1\0" >>expect &&
+       git -C repo merge-tree --write-tree -z c2 c3 >>expect &&
+       printf "\0" >>expect &&
+
+       test_cmp expect actual
+'
+
 test_done
index eaa0b22ece4ff3ce7d79faed2edf8ab829c97051..d473048138466322e505f4b3b249e89f19101b0b 100755 (executable)
@@ -342,6 +342,13 @@ test_expect_success 'only enabled filters are available remotely' '
        test_cmp_bin remote.bar config.bar
 '
 
+test_expect_success 'invalid filter is reported only once' '
+       test_must_fail git -c tar.invalid.command= archive --format=invalid \
+               HEAD >out 2>err &&
+       test_must_be_empty out &&
+       test_line_count = 1 err
+'
+
 test_expect_success 'git archive --format=tgz' '
        git archive --format=tgz HEAD >j.tgz
 '
index 8ae314af585482ec240fed353613faf6b23ebb67..d65a5f94b4b557ef9cce4434594729086cb51fad 100755 (executable)
@@ -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 &&
index 4f2bfaf0051b2337d881769c2377777fc72ebc9f..98a27a2948b5f6c1b1c318b43c5fab3505f1426e 100755 (executable)
@@ -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
 '
index 75da8acf8f436f5a50908f8b3a9e3fe194d1d440..b9546ef8e5e5cd3a734228c4d65ffdb59f568684 100755 (executable)
@@ -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 &&
index 3f58b515cee5d8f8ec72d22e363512b5a5a40c1f..302e4cbdba6037e4bfdb165b4033849f1a228846 100755 (executable)
@@ -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 &&
index 64c6c9f59ef690c4acd681000835040ca410df7e..bc0719a4fc929540570c2d3d0e98bdd5febadea2 100755 (executable)
@@ -1,13 +1,19 @@
 #!/bin/sh
 
-test_description='test smart fetching over http via http-backend'
+: ${HTTP_PROTO:=HTTP}
+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
 
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-httpd.sh
+test "$HTTP_PROTO" = "HTTP/2" && enable_http2
 start_httpd
 
+test_expect_success HTTP2 'enable client-side http/2' '
+       git config --global http.version HTTP/2
+'
+
 test_expect_success 'setup repository' '
        git config push.default matching &&
        echo content >file &&
@@ -347,7 +353,10 @@ test_expect_success CMDLINE_LIMIT \
 test_expect_success 'large fetch-pack requests can be sent using chunked encoding' '
        GIT_TRACE_CURL=true git -c http.postbuffer=65536 \
                clone --bare "$HTTPD_URL/smart/repo.git" split.git 2>err &&
-       grep "^=> Send header: Transfer-Encoding: chunked" err
+       {
+               test_have_prereq HTTP2 ||
+               grep "^=> Send header: Transfer-Encoding: chunked" err
+       }
 '
 
 test_expect_success 'test allowreachablesha1inwant' '
diff --git a/t/t5559-http-fetch-smart-http2.sh b/t/t5559-http-fetch-smart-http2.sh
new file mode 100755 (executable)
index 0000000..9eece71
--- /dev/null
@@ -0,0 +1,4 @@
+#!/bin/sh
+
+HTTP_PROTO=HTTP/2
+. ./t5551-http-fetch-smart.sh
index e1abc5c2b32f57526c277e6ac62fa1b45f2f46bd..aabf590dda61d1ea1b7c70e79bbfa00819ea235e 100755 (executable)
@@ -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/t6021-rev-list-exclude-hidden.sh b/t/t6021-rev-list-exclude-hidden.sh
new file mode 100755 (executable)
index 0000000..32b2b09
--- /dev/null
@@ -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
index 83931d482fb23b0b774310a49e8dcd6ad7eac4b9..98a72ff78a78905df62869a9a1177af5324db01c 100755 (executable)
@@ -34,6 +34,36 @@ HASH2=
 HASH3=
 HASH4=
 
+test_bisect_usage () {
+       local code="$1" &&
+       shift &&
+       cat >expect &&
+       test_expect_code $code "$@" >out 2>actual &&
+       test_must_be_empty out &&
+       test_cmp expect actual
+}
+
+test_expect_success 'bisect usage' "
+       test_bisect_usage 1 git bisect reset extra1 extra2 <<-\EOF &&
+       error: 'git bisect reset' requires either no argument or a commit
+       EOF
+       test_bisect_usage 1 git bisect terms extra1 extra2 <<-\EOF &&
+       error: 'git bisect terms' requires 0 or 1 argument
+       EOF
+       test_bisect_usage 1 git bisect next extra1 <<-\EOF &&
+       error: 'git bisect next' requires 0 arguments
+       EOF
+       test_bisect_usage 1 git bisect log extra1 <<-\EOF &&
+       error: We are not bisecting.
+       EOF
+       test_bisect_usage 1 git bisect replay <<-\EOF &&
+       error: no logfile given
+       EOF
+       test_bisect_usage 1 git bisect run <<-\EOF
+       error: 'git bisect run' failed: no command provided.
+       EOF
+"
+
 test_expect_success 'set up basic repo with 1 file (hello) and 4 commits' '
      add_line_into_file "1: Hello World" hello &&
      HASH1=$(git rev-parse --verify HEAD) &&
@@ -252,6 +282,124 @@ test_expect_success 'bisect skip: with commit both bad and skipped' '
        grep $HASH4 my_bisect_log.txt
 '
 
+test_bisect_run_args () {
+       test_when_finished "rm -f run.sh actual" &&
+       >actual &&
+       cat >expect.args &&
+       cat <&6 >expect.out &&
+       cat <&7 >expect.err &&
+       write_script run.sh <<-\EOF &&
+       while test $# != 0
+       do
+               echo "<$1>" &&
+               shift
+       done >actual.args
+       EOF
+
+       test_when_finished "git bisect reset" &&
+       git bisect start &&
+       git bisect good $HASH1 &&
+       git bisect bad $HASH4 &&
+       git bisect run ./run.sh $@ >actual.out.raw 2>actual.err &&
+       # Prune just the log output
+       sed -n \
+               -e '/^Author:/d' \
+               -e '/^Date:/d' \
+               -e '/^$/d' \
+               -e '/^commit /d' \
+               -e '/^ /d' \
+               -e 'p' \
+               <actual.out.raw >actual.out &&
+       test_cmp expect.out actual.out &&
+       test_cmp expect.err actual.err &&
+       test_cmp expect.args actual.args
+}
+
+test_expect_success 'git bisect run: args, stdout and stderr with no arguments' "
+       test_bisect_run_args <<-'EOF_ARGS' 6<<-EOF_OUT 7<<-'EOF_ERR'
+       EOF_ARGS
+       running './run.sh'
+       $HASH4 is the first bad commit
+       bisect found first bad commit
+       EOF_OUT
+       EOF_ERR
+"
+
+test_expect_success 'git bisect run: args, stdout and stderr: "--" argument' "
+       test_bisect_run_args -- <<-'EOF_ARGS' 6<<-EOF_OUT 7<<-'EOF_ERR'
+       <-->
+       EOF_ARGS
+       running './run.sh' '--'
+       $HASH4 is the first bad commit
+       bisect found first bad commit
+       EOF_OUT
+       EOF_ERR
+"
+
+test_expect_success 'git bisect run: args, stdout and stderr: "--log foo --no-log bar" arguments' "
+       test_bisect_run_args --log foo --no-log bar <<-'EOF_ARGS' 6<<-EOF_OUT 7<<-'EOF_ERR'
+       <--log>
+       <foo>
+       <--no-log>
+       <bar>
+       EOF_ARGS
+       running './run.sh' '--log' 'foo' '--no-log' 'bar'
+       $HASH4 is the first bad commit
+       bisect found first bad commit
+       EOF_OUT
+       EOF_ERR
+"
+
+test_expect_success 'git bisect run: args, stdout and stderr: "--bisect-start" argument' "
+       test_bisect_run_args --bisect-start <<-'EOF_ARGS' 6<<-EOF_OUT 7<<-'EOF_ERR'
+       <--bisect-start>
+       EOF_ARGS
+       running './run.sh' '--bisect-start'
+       $HASH4 is the first bad commit
+       bisect found first bad commit
+       EOF_OUT
+       EOF_ERR
+"
+
+test_expect_success 'git bisect run: negative exit code' "
+       write_script fail.sh <<-'EOF' &&
+       exit 255
+       EOF
+       cat <<-'EOF' >expect &&
+       bisect run failed: exit code -1 from './fail.sh' is < 0 or >= 128
+       EOF
+       test_when_finished 'git bisect reset' &&
+       git bisect start &&
+       git bisect good $HASH1 &&
+       git bisect bad $HASH4 &&
+       ! git bisect run ./fail.sh 2>err &&
+       sed -En 's/.*(bisect.*code) (-?[0-9]+) (from.*)/\1 -1 \3/p' err >actual &&
+       test_cmp expect actual
+"
+
+test_expect_success 'git bisect run: unable to verify on good' "
+       write_script fail.sh <<-'EOF' &&
+       head=\$(git rev-parse --verify HEAD)
+       good=\$(git rev-parse --verify $HASH1)
+       if test "\$head" = "\$good"
+       then
+               exit 255
+       else
+               exit 127
+       fi
+       EOF
+       cat <<-'EOF' >expect &&
+       unable to verify './fail.sh' on good revision
+       EOF
+       test_when_finished 'git bisect reset' &&
+       git bisect start &&
+       git bisect good $HASH1 &&
+       git bisect bad $HASH4 &&
+       ! git bisect run ./fail.sh 2>err &&
+       sed -n 's/.*\(unable to verify.*\)/\1/p' err >actual &&
+       test_cmp expect actual
+"
+
 # We want to automatically find the commit that
 # added "Another" into hello.
 test_expect_success '"git bisect run" simple case' '
@@ -266,6 +414,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"' '
index 4a9a4436e219c856095784324e4b097b3402ba29..9350b5fd2c235604560782e0412ed8f9fee069e3 100755 (executable)
@@ -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)' '
index dcaab7265f5c75a8be444db3e2d1766732192f8d..fa38b874416220d3d3c39ee48a99ad53b94dc2df 100755 (executable)
@@ -1406,4 +1406,44 @@ test_expect_success 'for-each-ref reports broken tags' '
                refs/tags/broken-tag-*
 '
 
+test_expect_success 'set up tag with signature and no blank lines' '
+       git tag -F - fake-sig-no-blanks <<-\EOF
+       this is the subject
+       -----BEGIN PGP SIGNATURE-----
+       not a real signature, but we just care about the
+       subject/body parsing. It is important here that
+       there are no blank lines in the signature.
+       -----END PGP SIGNATURE-----
+       EOF
+'
+
+test_atom refs/tags/fake-sig-no-blanks contents:subject 'this is the subject'
+test_atom refs/tags/fake-sig-no-blanks contents:body ''
+test_atom refs/tags/fake-sig-no-blanks contents:signature "$sig"
+
+test_expect_success 'set up tag with CRLF signature' '
+       append_cr <<-\EOF |
+       this is the subject
+       -----BEGIN PGP SIGNATURE-----
+
+       not a real signature, but we just care about
+       the subject/body parsing. It is important here
+       that there is a blank line separating this
+       from the signature header.
+       -----END PGP SIGNATURE-----
+       EOF
+       git tag -F - --cleanup=verbatim fake-sig-crlf
+'
+
+test_atom refs/tags/fake-sig-crlf contents:subject 'this is the subject'
+test_atom refs/tags/fake-sig-crlf contents:body ''
+
+# CRLF is retained in the signature, so we have to pass our expected value
+# through append_cr. But test_atom requires a shell string, which means command
+# substitution, and the shell will strip trailing newlines from the output of
+# the substitution. Hack around it by adding and then removing a dummy line.
+sig_crlf="$(printf "%s" "$sig" | append_cr; echo dummy)"
+sig_crlf=${sig_crlf%dummy}
+test_atom refs/tags/fake-sig-crlf contents:signature "$sig_crlf"
+
 test_done
index cd6c53360d206bef95cac3af0188c5eb3052e76c..d9acb639512ae6bdf30c8bdd4a0b4d498541dd84 100755 (executable)
@@ -202,6 +202,102 @@ test_expect_success 'one of gc.reflogExpire{Unreachable,}=never does not skip "e
        grep -E "^trace: (built-in|exec|run_command): git reflog expire --" trace.out
 '
 
+prepare_cruft_history () {
+       test_commit base &&
+
+       test_commit --no-tag foo &&
+       test_commit --no-tag bar &&
+       git reset HEAD^^
+}
+
+assert_cruft_packs () {
+       find .git/objects/pack -name "*.mtimes" >mtimes &&
+       sed -e 's/\.mtimes$/\.pack/g' mtimes >packs &&
+
+       test_file_not_empty packs &&
+       while read pack
+       do
+               test_path_is_file "$pack" || return 1
+       done <packs
+}
+
+assert_no_cruft_packs () {
+       find .git/objects/pack -name "*.mtimes" >mtimes &&
+       test_must_be_empty mtimes
+}
+
+test_expect_success 'gc --cruft generates a cruft pack' '
+       test_when_finished "rm -fr crufts" &&
+       git init crufts &&
+       (
+               cd crufts &&
+
+               prepare_cruft_history &&
+               git gc --cruft &&
+               assert_cruft_packs
+       )
+'
+
+test_expect_success 'gc.cruftPacks=true generates a cruft pack' '
+       test_when_finished "rm -fr crufts" &&
+       git init crufts &&
+       (
+               cd crufts &&
+
+               prepare_cruft_history &&
+               git -c gc.cruftPacks=true gc &&
+               assert_cruft_packs
+       )
+'
+
+test_expect_success 'feature.experimental=true generates a cruft pack' '
+       git init crufts &&
+       test_when_finished "rm -fr crufts" &&
+       (
+               cd crufts &&
+
+               prepare_cruft_history &&
+               git -c feature.experimental=true gc &&
+               assert_cruft_packs
+       )
+'
+
+test_expect_success 'feature.experimental=false allows explicit cruft packs' '
+       git init crufts &&
+       test_when_finished "rm -fr crufts" &&
+       (
+               cd crufts &&
+
+               prepare_cruft_history &&
+               git -c gc.cruftPacks=true -c feature.experimental=false gc &&
+               assert_cruft_packs
+       )
+'
+
+test_expect_success 'feature.experimental=true can be overridden' '
+       git init crufts &&
+       test_when_finished "rm -fr crufts" &&
+       (
+               cd crufts &&
+
+               prepare_cruft_history &&
+               git -c feature.expiremental=true -c gc.cruftPacks=false gc &&
+               assert_no_cruft_packs
+       )
+'
+
+test_expect_success 'feature.experimental=false avoids cruft packs by default' '
+       git init crufts &&
+       test_when_finished "rm -fr crufts" &&
+       (
+               cd crufts &&
+
+               prepare_cruft_history &&
+               git -c feature.experimental=false gc &&
+               assert_no_cruft_packs
+       )
+'
+
 run_and_wait_for_auto_gc () {
        # We read stdout from gc for the side effect of waiting until the
        # background gc process exits, closing its fd 9.  Furthermore, the
index 8c37bceb336344f9b10878faf9cabf933dcb8ea2..d72cef88264ec3dff713b12253df7a6dd5a4724e 100755 (executable)
@@ -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 &&
index a989aafaf57aa8710ff7889318abb8d3c9cadd51..eae6a46ef3d89f2563d5ec69f83dfd2ad6e7829f 100755 (executable)
@@ -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
index 59bd150166793000ed60e70fc9e570519f53f055..8d7b234beb8b09b2f6dbe459aad56315612925b8 100755 (executable)
@@ -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 &&
index c583c4e373ad0de2a0b51080010da995646dff3a..c0167944abdad3f3bd34c4c5fe29f9e7ec1afcf2 100755 (executable)
@@ -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
        )
 '
index d5874200fdcc44c3812f0b702fe4f8c3c2a6dbdc..dde11ecce806c43272bdc59c6eb73a7c6ce241ad 100755 (executable)
@@ -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 (executable)
index 0000000..ab946ec
--- /dev/null
@@ -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
index 8cc64729adb20640f17de4aa9ba891a9ead7edde..7b957022f1abbd0b01cf043b52ebfd8a76042929 100755 (executable)
@@ -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" &&
 
index 5be483bf887cc60a1c967196ccfa7584f363bc6e..4aabe98139a37eb8bc1d2f3e824048dbdd7f9915 100755 (executable)
@@ -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
index 96bdd4204560c58ec2fe97f9898e698a2379549f..823331e44a03b2f62e9f1577a84f08863150388d 100755 (executable)
@@ -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' '
index be51a8bb7a4e38e2c53c675850265c6433e905ed..25f500cf682a33787e0809bf5e7b513fd9282e4c 100755 (executable)
@@ -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
 '
index 29d914a12ba170c30ba64c627a508a04dac239d4..796093a7b32f983a558d8ef6ea2f406c8edd70da 100644 (file)
@@ -921,10 +921,6 @@ test_path_is_missing () {
        then
                echo "Path exists:"
                ls -ld "$1"
-               if test $# -ge 1
-               then
-                       echo "$*"
-               fi
                false
        fi
 }
index 76efc7edee5be4a9197a242f526c74b05f49802a..237d96b66050c82340af3c18b531bd5c877c15ab 100644 (file)
  *
  * Example:
  *
+ *     struct child_process child = CHILD_PROCESS_INIT;
  *     struct tmp_objdir *t = tmp_objdir_create("incoming");
- *     if (!run_command_v_opt_cd_env(cmd, 0, NULL, tmp_objdir_env(t)) &&
- *         !tmp_objdir_migrate(t))
+ *     strvec_push(&child.args, cmd);
+ *     strvec_pushv(&child.env, tmp_objdir_env(t));
+ *     if (!run_command(&child)) && !tmp_objdir_migrate(t))
  *             printf("success!\n");
  *     else
  *             die("failed...tmp_objdir will clean up for us");
index bae812156c4fedb8e296e422d4cb6a8af1a2dada..8a762aa0772eb4f7e107da6807092fe0a2be1a61 100644 (file)
@@ -2043,7 +2043,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);
index efb9edfbb2717b4739247ecdd58a104e1d44cfd2..6ab0d74c84dc5ca3004e8b3b160dde98d1805e5d 100644 (file)
@@ -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;
index 0b8311bd685f002ffb38672c670372b7e698de95..551f22ffa5d63ceabbf5909ee1926b8471722920 100644 (file)
@@ -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))